From 182937d1506cb7536056a633fed328d209850b7d Mon Sep 17 00:00:00 2001 From: Degranon Date: Mon, 3 Feb 2025 02:24:00 +0100 Subject: Create the server selection list pane --- source/frontend/StarTitleScreen.cpp | 88 +++++++++++++++++++++++++++++++++---- 1 file changed, 79 insertions(+), 9 deletions(-) (limited to 'source/frontend/StarTitleScreen.cpp') 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("address")->setText(server.getString("address")); + listItem->fetchChild("account")->setText(server.get("account", "").toString()); + listItem->setData(server); + } + } +}; + void TitleScreen::initMultiPlayerMenu() { m_multiPlayerMenu = make_shared(); + m_serverSelectPane = make_shared(); - 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("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("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(obj)->getText().trim(); + m_serverSelectPane->fetchChild("save")->setVisibility(multiPlayerAddress().length() > 0); }); - reader.registerCallback("port", [=](Widget* obj) { + readerConnect.registerCallback("port", [=](Widget* obj) { m_connectionPort = convert(obj)->getText().trim(); }); - reader.registerCallback("account", [=](Widget* obj) { + readerConnect.registerCallback("account", [=](Widget* obj) { m_account = convert(obj)->getText().trim(); }); - reader.registerCallback("password", [=](Widget* obj) { + readerConnect.registerCallback("password", [=](Widget* obj) { m_password = convert(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(); } -- cgit v1.2.3 From fa6d3d10c49762a0073ac1e159057633692de670 Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Mon, 3 Feb 2025 12:43:44 +1100 Subject: fix two bugs and optimize images [skip ci] --- assets/opensb/interface/title/serverentry.png | Bin 0 -> 150 bytes assets/opensb/interface/title/serverselect.png | Bin 224 -> 617 bytes .../interface/title/serverselectionbackground.png | Bin 1663 -> 0 bytes assets/opensb/interface/title/serverselectselected.png | Bin 221 -> 0 bytes .../opensb/interface/windowconfig/serverselect.config | 8 ++++---- source/frontend/StarTitleScreen.cpp | 9 +++++++-- 6 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 assets/opensb/interface/title/serverentry.png delete mode 100644 assets/opensb/interface/title/serverselectionbackground.png delete mode 100644 assets/opensb/interface/title/serverselectselected.png (limited to 'source/frontend/StarTitleScreen.cpp') diff --git a/assets/opensb/interface/title/serverentry.png b/assets/opensb/interface/title/serverentry.png new file mode 100644 index 0000000..efbb538 Binary files /dev/null and b/assets/opensb/interface/title/serverentry.png differ diff --git a/assets/opensb/interface/title/serverselect.png b/assets/opensb/interface/title/serverselect.png index c43d5e2..3821cd8 100644 Binary files a/assets/opensb/interface/title/serverselect.png and b/assets/opensb/interface/title/serverselect.png differ diff --git a/assets/opensb/interface/title/serverselectionbackground.png b/assets/opensb/interface/title/serverselectionbackground.png deleted file mode 100644 index 2522e3d..0000000 Binary files a/assets/opensb/interface/title/serverselectionbackground.png and /dev/null differ diff --git a/assets/opensb/interface/title/serverselectselected.png b/assets/opensb/interface/title/serverselectselected.png deleted file mode 100644 index fc7cdf9..0000000 Binary files a/assets/opensb/interface/title/serverselectselected.png and /dev/null differ diff --git a/assets/opensb/interface/windowconfig/serverselect.config b/assets/opensb/interface/windowconfig/serverselect.config index 70bd1fc..78ea6d5 100644 --- a/assets/opensb/interface/windowconfig/serverselect.config +++ b/assets/opensb/interface/windowconfig/serverselect.config @@ -8,7 +8,7 @@ "background": { "type": "background", "fileHeader": "", - "fileBody": "/interface/title/serverselectionbackground.png", + "fileBody": "/interface/title/serverselect.png", "fileFooter": "" }, @@ -28,14 +28,14 @@ "serverList": { "type": "list", "schema": { - "selectedBG": "/interface/title/serverselectselected.png", - "unselectedBG": "/interface/title/serverselect.png", + "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/serverselect.png", + "file": "/interface/title/serverentry.png", "position": [ 0, 0 ], "zlevel": -1 }, diff --git a/source/frontend/StarTitleScreen.cpp b/source/frontend/StarTitleScreen.cpp index a2d2c53..747744c 100644 --- a/source/frontend/StarTitleScreen.cpp +++ b/source/frontend/StarTitleScreen.cpp @@ -337,6 +337,9 @@ void TitleScreen::initMultiPlayerMenu() { 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*) { @@ -348,9 +351,9 @@ void TitleScreen::initMultiPlayerMenu() { }; auto serverList = m_serverSelectPane->fetchChild("serverSelectArea.serverList"); - if (auto const pos = serverList->selectedItem(); pos != NPos) {// Edit existing + if (auto const pos = serverList->selectedItem(); pos != NPos) { // Edit existing m_serverList = m_serverList.set(pos, serverData); - } else {// Save new + } else { // Save new m_serverList = m_serverList.insert(0, serverData); } @@ -374,6 +377,8 @@ void TitleScreen::initMultiPlayerMenu() { serverList->setCallback([=](Widget* widget) { if (auto selectedItem = serverList->selectedWidget()) { + if (selectedItem->findChild("delete")->isHovered()) + return; auto& data = selectedItem->data(); setMultiPlayerAddress(data.getString("address", "")); setMultiPlayerPort(data.getString("port", "")); -- cgit v1.2.3