diff --git a/src/blackgui/components/settingsnetworkserverscomponent.cpp b/src/blackgui/components/settingsnetworkserverscomponent.cpp index 7a4957e56..1ad1232d2 100644 --- a/src/blackgui/components/settingsnetworkserverscomponent.cpp +++ b/src/blackgui/components/settingsnetworkserverscomponent.cpp @@ -11,6 +11,7 @@ #include "ui_settingsnetworkserverscomponent.h" #include "blackcore/contextnetwork.h" #include "blackcore/setupreader.h" +#include "blackcore/contextapplication.h" #include "blackmisc/logmessage.h" #include "blackmisc/project.h" #include @@ -35,10 +36,10 @@ namespace BlackGui ui->setupUi(this); // Settings server - this->connect(this->ui->pb_SettingsTnServersRemoveServer, &QPushButton::pressed, this, &CSettingsNetworkServersComponent::ps_alterTrafficServer); - this->connect(this->ui->pb_SettingsTnServersSaveServer, &QPushButton::pressed, this, &CSettingsNetworkServersComponent::ps_alterTrafficServer); - this->connect(this->ui->tvp_SettingsTnServers, &QTableView::clicked, this, &CSettingsNetworkServersComponent::ps_networkServerSelected); - + this->connect(this->ui->pb_RemoveServer, &QPushButton::pressed, this, &CSettingsNetworkServersComponent::ps_alterTrafficServer); + this->connect(this->ui->pb_SaveServer, &QPushButton::pressed, this, &CSettingsNetworkServersComponent::ps_alterTrafficServer); + this->connect(this->ui->pb_AddServer, &QPushButton::pressed, this, &CSettingsNetworkServersComponent::ps_alterTrafficServer); + this->connect(this->ui->tvp_Servers, &QTableView::clicked, this, &CSettingsNetworkServersComponent::ps_serverSelected); this->ps_reloadSettings(); } @@ -55,44 +56,67 @@ namespace BlackGui { serverList.push_back(m_setup.get().fsdTestServersPlusHardcodedServers()); } - this->ui->tvp_SettingsTnServers->updateContainer(serverList); + this->ui->tvp_Servers->updateContainer(serverList); } - void CSettingsNetworkServersComponent::ps_networkServerSelected(const QModelIndex &index) + void CSettingsNetworkServersComponent::ps_serverSelected(const QModelIndex &index) { - const CServer clickedServer = this->ui->tvp_SettingsTnServers->at(index); + const CServer clickedServer = this->ui->tvp_Servers->at(index); this->ui->frp_ServerForm->setServer(clickedServer); } void CSettingsNetworkServersComponent::ps_alterTrafficServer() { - CServer server = this->ui->frp_ServerForm->getServer(); + CServer server(this->ui->frp_ServerForm->getServer()); CStatusMessageList msgs = server.validate(); - if (!msgs.isEmpty()) - { - msgs.addCategories(this); - CLogMessage::preformatted(msgs); - return; - } + if (!msgs.isEmpty()) { msgs.addCategories(this); } CServerList serverList(m_trafficNetworkServers.get()); QObject *sender = QObject::sender(); - if (sender == this->ui->pb_SettingsTnServersRemoveServer) + CStatusMessage msg; + bool changed = false; + if (sender == this->ui->pb_RemoveServer) { - serverList.removeIf(&CServer::getName, server.getName()); + // lenient name removal + serverList.removeByName(server.getName()); + changed = true; } - else if (sender == this->ui->pb_SettingsTnServersSaveServer) + else if (sender == this->ui->pb_AddServer) { + if (!msgs.isEmpty()) + { + CLogMessage::preformatted(msgs); + return; + } serverList.replaceOrAdd(&CServer::getName, server.getName(), server); + changed = true; + } + else if (sender == this->ui->pb_SaveServer) + { + if (msgs.isEmpty() && server.hasAddressAndPort()) + { + // update in any case to list before saving if we have a valid form + serverList.replaceOrAdd(&CServer::getName, server.getName(), server); + changed = true; + } } - CStatusMessage msg = m_trafficNetworkServers.set(serverList); - if (msg.isWarningOrAbove()) + if (changed) + { + msg = m_trafficNetworkServers.set(serverList); + this->ps_reloadSettings(); // call manually as local object + } + + if (msgs.isEmpty() && sender == this->ui->pb_SaveServer) + { + msg = this->getIContextApplication()->saveSettings(m_trafficNetworkServers.getKey()); + } + + if (!msg.isEmpty()) { msg.addCategories(this); CLogMessage::preformatted(msg); } } - } // namespace } // namespace diff --git a/src/blackgui/components/settingsnetworkserverscomponent.h b/src/blackgui/components/settingsnetworkserverscomponent.h index b752224f0..ade01ed5c 100644 --- a/src/blackgui/components/settingsnetworkserverscomponent.h +++ b/src/blackgui/components/settingsnetworkserverscomponent.h @@ -44,7 +44,7 @@ namespace BlackGui void ps_reloadSettings(); //! Network server selected - void ps_networkServerSelected(const QModelIndex &index); + void ps_serverSelected(const QModelIndex &index); //! Alter traffic server void ps_alterTrafficServer(); diff --git a/src/blackgui/components/settingsnetworkserverscomponent.ui b/src/blackgui/components/settingsnetworkserverscomponent.ui index 4d789274f..dc2368e3c 100644 --- a/src/blackgui/components/settingsnetworkserverscomponent.ui +++ b/src/blackgui/components/settingsnetworkserverscomponent.ui @@ -6,7 +6,7 @@ 0 0 - 260 + 282 334 @@ -36,7 +36,7 @@ 1 - + QAbstractItemView::AnyKeyPressed|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed @@ -102,7 +102,7 @@ - + 0 @@ -110,12 +110,19 @@ - Save + save - + + + add + + + + + 0 @@ -123,7 +130,7 @@ - Remove + remove diff --git a/src/blackgui/serverlistselector.cpp b/src/blackgui/serverlistselector.cpp index cebde285e..e5aaf4107 100644 --- a/src/blackgui/serverlistselector.cpp +++ b/src/blackgui/serverlistselector.cpp @@ -34,15 +34,32 @@ namespace BlackGui void CServerListSelector::setItemStrings(const CServerList &servers) { + QString currentlySelected(this->currentText()); + int index = -1; this->m_servers = servers; this->m_items.clear(); - foreach(CServer server, servers) + for (const CServer &server : servers) { QString d(server.getName() + ": " + server.getDescription()); m_items.append(d); + if (!currentlySelected.isEmpty() && index < 0 && d == currentlySelected) + { + index = m_items.size() - 1; + } } this->clear(); // ui this->addItems(m_items); + + // reselect + if (this->m_items.isEmpty()) { return; } + if (this->m_items.size() == 1) + { + this->setCurrentIndex(0); + } + else if (index >= 0) + { + this->setCurrentIndex(index); + } } } // namespace diff --git a/src/blackgui/serverlistselector.h b/src/blackgui/serverlistselector.h index cb3ad775d..6f834db0c 100644 --- a/src/blackgui/serverlistselector.h +++ b/src/blackgui/serverlistselector.h @@ -36,15 +36,12 @@ namespace BlackGui BlackMisc::Network::CServer currentServer() const; private: - //! Build the item string descriptions void setItemStrings(const BlackMisc::Network::CServerList &servers); BlackMisc::Network::CServerList m_servers; //!< corresponding servers - QStringList m_items; //!< items strings - + QStringList m_items; //!< items strings }; - } // namespace #endif // guard diff --git a/src/blackmisc/network/serverlist.cpp b/src/blackmisc/network/serverlist.cpp index 456a37b9c..d85c07d75 100644 --- a/src/blackmisc/network/serverlist.cpp +++ b/src/blackmisc/network/serverlist.cpp @@ -28,6 +28,20 @@ namespace BlackMisc return false; } + bool CServerList::removeByName(const QString &name) + { + if (name.isEmpty()) { return false; } + const CServerList copy(*this); + bool removed = false; + for (const CServer &server : copy) + { + if (!server.matchesName(name)) { continue; } + this->remove(server); + removed = true; + } + return removed; + } + bool CServerList::containsAddressPort(const CServer &server) { for (const CServer &s : *this) diff --git a/src/blackmisc/network/serverlist.h b/src/blackmisc/network/serverlist.h index ca8002d1a..2601d01d5 100644 --- a/src/blackmisc/network/serverlist.h +++ b/src/blackmisc/network/serverlist.h @@ -38,6 +38,9 @@ namespace BlackMisc //! Contains name bool containsName(const QString &name) const; + //! Remove by name + bool removeByName(const QString &name); + //! Contains server with same address/port bool containsAddressPort(const CServer &server); diff --git a/src/swiftguistandard/swiftguistdinit.cpp b/src/swiftguistandard/swiftguistdinit.cpp index 9d6341e1d..4db4a15d9 100644 --- a/src/swiftguistandard/swiftguistdinit.cpp +++ b/src/swiftguistandard/swiftguistdinit.cpp @@ -42,6 +42,7 @@ void SwiftGuiStd::init(const CRuntimeConfig &runtimeConfig) this->setObjectName("SwiftGuiStd"); this->initStyleSheet(); + // with frameless window, we shift menu and statusbar into central widget // http://stackoverflow.com/questions/18316710/frameless-and-transparent-window-qt5 if (this->isFrameless()) @@ -72,6 +73,7 @@ void SwiftGuiStd::init(const CRuntimeConfig &runtimeConfig) // context this->createRuntime(runtimeConfig, this); CEnableForRuntime::setRuntimeForComponents(this->getRuntime(), this); + this->getIContextApplication()->loadSettings(); // info bar and status bar this->m_statusBar.initStatusBar(this->ui->sb_MainStatusBar);