diff options
author | Degranon <boba09@list.ru> | 2025-02-03 02:24:00 +0100 |
---|---|---|
committer | Degranon <boba09@list.ru> | 2025-02-03 02:24:00 +0100 |
commit | 182937d1506cb7536056a633fed328d209850b7d (patch) | |
tree | bf8e14607cd0b4957b5e293cf071b9d7cc5f42a1 | |
parent | 11caad6a6e07581c94a28e6711d4672501068d38 (diff) |
Create the server selection list pane
-rw-r--r-- | assets/opensb/interface/title/serverselect.png | bin | 0 -> 224 bytes | |||
-rw-r--r-- | assets/opensb/interface/title/serverselectionbackground.png | bin | 0 -> 1663 bytes | |||
-rw-r--r-- | assets/opensb/interface/title/serverselectselected.png | bin | 0 -> 221 bytes | |||
-rw-r--r-- | assets/opensb/interface/windowconfig/serverselect.config | 72 | ||||
-rw-r--r-- | source/frontend/StarTitleScreen.cpp | 88 | ||||
-rw-r--r-- | source/frontend/StarTitleScreen.hpp | 6 |
6 files changed, 157 insertions, 9 deletions
diff --git a/assets/opensb/interface/title/serverselect.png b/assets/opensb/interface/title/serverselect.png Binary files differnew file mode 100644 index 0000000..c43d5e2 --- /dev/null +++ b/assets/opensb/interface/title/serverselect.png diff --git a/assets/opensb/interface/title/serverselectionbackground.png b/assets/opensb/interface/title/serverselectionbackground.png Binary files differnew file mode 100644 index 0000000..2522e3d --- /dev/null +++ b/assets/opensb/interface/title/serverselectionbackground.png diff --git a/assets/opensb/interface/title/serverselectselected.png b/assets/opensb/interface/title/serverselectselected.png Binary files differnew file mode 100644 index 0000000..fc7cdf9 --- /dev/null +++ b/assets/opensb/interface/title/serverselectselected.png diff --git a/assets/opensb/interface/windowconfig/serverselect.config b/assets/opensb/interface/windowconfig/serverselect.config new file mode 100644 index 0000000..70bd1fc --- /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/serverselectionbackground.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/serverselectselected.png", + "unselectedBG": "/interface/title/serverselect.png", + "spacing": [ 0, 2 ], + "memberSize": [ 181, 28 ], + "listTemplate": { + "background": { + "type": "image", + "file": "/interface/title/serverselect.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..a2d2c53 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,102 @@ 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"); + 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()) { + 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 +465,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; |