Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2025-02-03 12:43:55 +1100
committerGitHub <noreply@github.com>2025-02-03 12:43:55 +1100
commit27ffdb020534e3d815038c86d9ac6d1dddaf6598 (patch)
treea01988e005b5ee1c7d490aef5bbde92144b63460
parentb53b8ecca0e7690d8ddffbcad21d229851d5205d (diff)
parentfa6d3d10c49762a0073ac1e159057633692de670 (diff)
Merge pull request #174 from KrashV/main
Create the server selection list pane
-rw-r--r--assets/opensb/interface/title/serverentry.pngbin0 -> 150 bytes
-rw-r--r--assets/opensb/interface/title/serverselect.pngbin0 -> 617 bytes
-rw-r--r--assets/opensb/interface/windowconfig/serverselect.config72
-rw-r--r--source/frontend/StarTitleScreen.cpp93
-rw-r--r--source/frontend/StarTitleScreen.hpp6
5 files changed, 162 insertions, 9 deletions
diff --git a/assets/opensb/interface/title/serverentry.png b/assets/opensb/interface/title/serverentry.png
new file mode 100644
index 0000000..efbb538
--- /dev/null
+++ b/assets/opensb/interface/title/serverentry.png
Binary files differ
diff --git a/assets/opensb/interface/title/serverselect.png b/assets/opensb/interface/title/serverselect.png
new file mode 100644
index 0000000..3821cd8
--- /dev/null
+++ b/assets/opensb/interface/title/serverselect.png
Binary files differ
diff --git a/assets/opensb/interface/windowconfig/serverselect.config b/assets/opensb/interface/windowconfig/serverselect.config
new file mode 100644
index 0000000..78ea6d5
--- /dev/null
+++ b/assets/opensb/interface/windowconfig/serverselect.config
@@ -0,0 +1,72 @@
+{
+ "panefeature": {
+ "type": "panefeature",
+ "anchor": "centerLeft",
+ "positionLocked": true
+ },
+
+ "background": {
+ "type": "background",
+ "fileHeader": "",
+ "fileBody": "/interface/title/serverselect.png",
+ "fileFooter": ""
+ },
+
+ "save": {
+ "type": "button",
+ "caption": "Save",
+ "callback": "saveServer",
+ "base": "/interface/title/joinserverUp.png",
+ "hover": "/interface/title/joinserverOver.png",
+ "position": [ 80, 35 ]
+ },
+
+ "serverSelectArea": {
+ "type": "scrollArea",
+ "rect": [ 23, 54, 214, 254 ],
+ "children": {
+ "serverList": {
+ "type": "list",
+ "schema": {
+ "selectedBG": "/interface/title/serverentry.png?replace;393939=858585",
+ "unselectedBG": "/interface/title/serverentry.png",
+ "spacing": [ 0, 2 ],
+ "memberSize": [ 181, 28 ],
+ "listTemplate": {
+ "background": {
+ "type": "image",
+ "file": "/interface/title/serverentry.png",
+ "position": [ 0, 0 ],
+ "zlevel": -1
+ },
+ "address": {
+ "type": "label",
+ "position": [ 90, 10 ],
+ "hAnchor": "mid",
+ "value": "Server Address",
+ "fontSize": 12,
+ "color": [ 255, 255, 255 ],
+ "mouseTransparent": true
+ },
+ "account": {
+ "type": "label",
+ "position": [ 90, 2 ],
+ "hAnchor": "mid",
+ "value": "Account Name",
+ "fontSize": 8,
+ "color": [ 255, 255, 255 ],
+ "mouseTransparent": true
+ },
+ "delete": {
+ "type": "button",
+ "base": "/interface/title/delete/garbage2.png",
+ "hover": "/interface/title/delete/garbage2hover.png",
+ "pressed": "/interface/title/delete/garbage2pressed.png",
+ "position": [ 155, 3 ]
+ }
+ }
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/source/frontend/StarTitleScreen.cpp b/source/frontend/StarTitleScreen.cpp
index b48ac13..747744c 100644
--- a/source/frontend/StarTitleScreen.cpp
+++ b/source/frontend/StarTitleScreen.cpp
@@ -7,6 +7,8 @@
#include "StarGuiContext.hpp"
#include "StarPaneManager.hpp"
#include "StarButtonWidget.hpp"
+#include "StarListWidget.hpp"
+#include "StarLabelWidget.hpp"
#include "StarCharSelection.hpp"
#include "StarCharCreation.hpp"
#include "StarTextBoxWidget.hpp"
@@ -314,35 +316,107 @@ void TitleScreen::initCharCreationMenu() {
m_paneManager.registerPane("charCreationMenu", PaneLayer::Hud, charCreationMenu);
}
+
+void TitleScreen::populateServerList(ListWidgetPtr list){
+ if (!m_serverList.isNull()) {
+ list->clear();
+ for (auto const& server : m_serverList.iterateArray()) {
+ auto listItem = list->addItem();
+ listItem->fetchChild<LabelWidget>("address")->setText(server.getString("address"));
+ listItem->fetchChild<LabelWidget>("account")->setText(server.get("account", "").toString());
+ listItem->setData(server);
+ }
+ }
+};
+
void TitleScreen::initMultiPlayerMenu() {
m_multiPlayerMenu = make_shared<Pane>();
+ m_serverSelectPane = make_shared<Pane>();
- GuiReader reader;
+ GuiReader readerConnect;
+ GuiReader readerServer;
+
+ m_serverList = Root::singleton().configuration()->get("serverList");
+ if (!m_serverList.isType(Json::Type::Array))
+ m_serverList = JsonArray();
+
+ auto assets = Root::singleton().assets();
+
+ readerServer.registerCallback("saveServer", [=](Widget*) {
+ Json serverData = JsonObject{
+ {"address", multiPlayerAddress()},
+ {"account", multiPlayerAccount()},
+ {"port", multiPlayerPort()},
+ //{"password", multiPlayerPassword()}
+ };
+
+ auto serverList = m_serverSelectPane->fetchChild<ListWidget>("serverSelectArea.serverList");
+ if (auto const pos = serverList->selectedItem(); pos != NPos) { // Edit existing
+ m_serverList = m_serverList.set(pos, serverData);
+ } else { // Save new
+ m_serverList = m_serverList.insert(0, serverData);
+ }
+
+ populateServerList(serverList);
+ Root::singleton().configuration()->set("serverList", m_serverList);
+ });
+
+ readerServer.construct(assets->json("/interface/windowconfig/serverselect.config"), m_serverSelectPane.get());
- reader.registerCallback("address", [=](Widget* obj) {
+
+
+ auto serverList = m_serverSelectPane->fetchChild<ListWidget>("serverSelectArea.serverList");
+
+ serverList->registerMemberCallback("delete", [=](Widget* widget) {
+ if (auto const pos = serverList->selectedItem(); pos != NPos) {
+ m_serverList = m_serverList.eraseIndex(pos);
+ }
+ populateServerList(serverList);
+ Root::singleton().configuration()->set("serverList", m_serverList);
+ });
+
+ serverList->setCallback([=](Widget* widget) {
+ if (auto selectedItem = serverList->selectedWidget()) {
+ if (selectedItem->findChild<ButtonWidget>("delete")->isHovered())
+ return;
+ auto& data = selectedItem->data();
+ setMultiPlayerAddress(data.getString("address", ""));
+ setMultiPlayerPort(data.getString("port", ""));
+ setMultiPlayerAccount(data.getString("account", ""));
+ setMultiPlayerPassword(data.getString("password", ""));
+ }
+ });
+
+ readerConnect.registerCallback("address", [=](Widget* obj) {
m_connectionAddress = convert<TextBoxWidget>(obj)->getText().trim();
+ m_serverSelectPane->fetchChild<ButtonWidget>("save")->setVisibility(multiPlayerAddress().length() > 0);
});
- reader.registerCallback("port", [=](Widget* obj) {
+ readerConnect.registerCallback("port", [=](Widget* obj) {
m_connectionPort = convert<TextBoxWidget>(obj)->getText().trim();
});
- reader.registerCallback("account", [=](Widget* obj) {
+ readerConnect.registerCallback("account", [=](Widget* obj) {
m_account = convert<TextBoxWidget>(obj)->getText().trim();
});
- reader.registerCallback("password", [=](Widget* obj) {
+ readerConnect.registerCallback("password", [=](Widget* obj) {
m_password = convert<TextBoxWidget>(obj)->getText().trim();
});
- reader.registerCallback("connect", [=](Widget*) {
- switchState(TitleState::StartMultiPlayer);
+ readerConnect.registerCallback("connect", [=](Widget*) {
+ switchState(TitleState::StartMultiPlayer);
});
- auto assets = Root::singleton().assets();
- reader.construct(assets->json("/interface/windowconfig/multiplayer.config"), m_multiPlayerMenu.get());
+
+ readerConnect.construct(assets->json("/interface/windowconfig/multiplayer.config"), m_multiPlayerMenu.get());
+
+ populateServerList(serverList);
m_paneManager.registerPane("multiplayerMenu", PaneLayer::Hud, m_multiPlayerMenu);
+ m_paneManager.registerPane("serverSelect", PaneLayer::Hud, m_serverSelectPane, [=](PanePtr const&) {
+ serverList->clearSelected();
+ });
}
void TitleScreen::initOptionsMenu(UniverseClientPtr client) {
@@ -396,6 +470,7 @@ void TitleScreen::switchState(TitleState titleState) {
m_paneManager.displayRegisteredPane("charCreationMenu");
} else if (titleState == TitleState::MultiPlayerConnect) {
m_paneManager.displayRegisteredPane("multiplayerMenu");
+ m_paneManager.displayRegisteredPane("serverSelect");
if (auto addressWidget = m_multiPlayerMenu->fetchChild("address"))
addressWidget->focus();
}
diff --git a/source/frontend/StarTitleScreen.hpp b/source/frontend/StarTitleScreen.hpp
index 9aaac96..3199247 100644
--- a/source/frontend/StarTitleScreen.hpp
+++ b/source/frontend/StarTitleScreen.hpp
@@ -5,6 +5,7 @@
#include "StarRegisteredPaneManager.hpp"
#include "StarInterfaceCursor.hpp"
#include "StarUniverseClient.hpp"
+#include "StarListWidget.hpp"
namespace Star {
@@ -89,6 +90,8 @@ private:
void switchState(TitleState titleState);
void back();
+ void populateServerList(ListWidgetPtr list);
+
float interfaceScale() const;
unsigned windowHeight() const;
unsigned windowWidth() const;
@@ -97,7 +100,10 @@ private:
RendererPtr m_renderer;
EnvironmentPainterPtr m_environmentPainter;
+
PanePtr m_multiPlayerMenu;
+ PanePtr m_serverSelectPane;
+ Json m_serverList;
RegisteredPaneManager<String> m_paneManager;