diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2025-02-03 12:43:55 +1100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-03 12:43:55 +1100 |
commit | 27ffdb020534e3d815038c86d9ac6d1dddaf6598 (patch) | |
tree | a01988e005b5ee1c7d490aef5bbde92144b63460 | |
parent | b53b8ecca0e7690d8ddffbcad21d229851d5205d (diff) | |
parent | fa6d3d10c49762a0073ac1e159057633692de670 (diff) |
Merge pull request #174 from KrashV/main
Create the server selection list pane
-rw-r--r-- | assets/opensb/interface/title/serverentry.png | bin | 0 -> 150 bytes | |||
-rw-r--r-- | assets/opensb/interface/title/serverselect.png | bin | 0 -> 617 bytes | |||
-rw-r--r-- | assets/opensb/interface/windowconfig/serverselect.config | 72 | ||||
-rw-r--r-- | source/frontend/StarTitleScreen.cpp | 93 | ||||
-rw-r--r-- | source/frontend/StarTitleScreen.hpp | 6 |
5 files changed, 162 insertions, 9 deletions
diff --git a/assets/opensb/interface/title/serverentry.png b/assets/opensb/interface/title/serverentry.png Binary files differnew file mode 100644 index 0000000..efbb538 --- /dev/null +++ b/assets/opensb/interface/title/serverentry.png diff --git a/assets/opensb/interface/title/serverselect.png b/assets/opensb/interface/title/serverselect.png Binary files differnew file mode 100644 index 0000000..3821cd8 --- /dev/null +++ b/assets/opensb/interface/title/serverselect.png 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; |