Allow toggling the display of only private server

This commit is contained in:
Benau 2018-03-14 00:50:19 +08:00
parent 901c5eabec
commit 5699a86586
5 changed files with 64 additions and 30 deletions

View File

@ -11,5 +11,13 @@
<box proportion="1" width="98%" align="center" layout="vertical-row" padding="6">
<list id="server_list" x="0" y="0" width="100%" height="100%"/>
</box>
<div width="99%" align="center" layout="vertical-row" height="fit">
<div width="100%" height="fit" layout="horizontal-row" >
<checkbox width="fit" id="private_server" text_align="left"/>
<spacer width="10"/>
<label proportion="1" height="100%" text_align="left"
I18N="In the server selection screen" text="Show only private server"/>
</div>
</div>
</div>
</stkgui>

View File

@ -33,6 +33,8 @@
#include "utils/time.hpp"
#include "utils/log.hpp"
#include <algorithm>
// ----------------------------------------------------------------------------
/** Specify server to connect to.
* \param server Server to connect to (if nullptr than we use quick play).
@ -78,8 +80,7 @@ void ConnectToServer::asynchronousUpdate()
StkTime::sleep(1);
while (!ServersManager::get()->listUpdated())
StkTime::sleep(1);
auto servers = ServersManager::get()->getServers();
ServersManager::get()->cleanUpServers();
auto servers = std::move(ServersManager::get()->getServers());
// Remove password protected servers
servers.erase(std::remove_if(servers.begin(), servers.end(), []

View File

@ -20,9 +20,6 @@
#define HEADER_SERVERS_MANAGER_HPP
#include <atomic>
#include <algorithm>
#include <cassert>
#include <functional>
#include <memory>
#include <string>
#include <vector>
@ -70,17 +67,9 @@ public:
// ------------------------------------------------------------------------
void cleanUpServers() { m_servers.clear(); }
// ------------------------------------------------------------------------
void sortServers(std::function<bool(const std::shared_ptr<Server> a,
const std::shared_ptr<Server> b)> sorting_function)
{
assert(m_list_updated);
std::sort(m_servers.begin(), m_servers.end(), sorting_function);
}
// ------------------------------------------------------------------------
bool refresh();
// ------------------------------------------------------------------------
const std::vector<std::shared_ptr<Server> >& getServers() const
{ return m_servers; }
std::vector<std::shared_ptr<Server> >& getServers() { return m_servers; }
// ------------------------------------------------------------------------
bool listUpdated() const { return m_list_updated; }

View File

@ -18,6 +18,9 @@
#include "states_screens/server_selection.hpp"
#include "audio/sfx_manager.hpp"
#include "guiengine/widgets/check_box_widget.hpp"
#include "guiengine/widgets/icon_button_widget.hpp"
#include "guiengine/widgets/label_widget.hpp"
#include "guiengine/modaldialog.hpp"
#include "network/network_config.hpp"
#include "network/server.hpp"
@ -28,8 +31,8 @@
#include "utils/translation.hpp"
#include "utils/string_utils.hpp"
#include <iostream>
#include <assert.h>
#include <algorithm>
#include <cassert>
using namespace Online;
@ -55,6 +58,7 @@ ServerSelection::~ServerSelection()
*/
void ServerSelection::tearDown()
{
m_servers.clear();
ServersManager::get()->cleanUpServers();
m_server_list_widget->clear();
} // tearDown
@ -85,6 +89,9 @@ void ServerSelection::loadedFromFile()
m_server_list_widget = getWidget<GUIEngine::ListWidget>("server_list");
assert(m_server_list_widget != NULL);
m_server_list_widget->setColumnListener(this);
m_private_server = getWidget<GUIEngine::CheckBoxWidget>("private_server");
assert(m_private_server != NULL);
m_private_server->setState(false);
} // loadedFromFile
// ----------------------------------------------------------------------------
@ -118,7 +125,7 @@ void ServerSelection::init()
void ServerSelection::loadList(unsigned sort_case)
{
m_server_list_widget->clear();
ServersManager::get()->sortServers([sort_case, this]
std::sort(m_servers.begin(), m_servers.end(), [sort_case, this]
(const std::shared_ptr<Server> a,
const std::shared_ptr<Server> b)->bool
{
@ -142,7 +149,7 @@ void ServerSelection::loadList(unsigned sort_case)
assert(false);
return false;
});
for (auto server : ServersManager::get()->getServers())
for (auto server : m_servers)
{
core::stringw num_players;
num_players.append(StringUtils::toWString(server->getCurrentPlayers()));
@ -182,24 +189,25 @@ void ServerSelection::eventCallback(GUIEngine::Widget* widget,
{
StateManager::get()->escapePressed();
}
else if (name == "reload")
{
refresh();
}
else if (name == "private_server")
{
copyFromServersManager();
}
else if (name == m_server_list_widget->m_properties[GUIEngine::PROP_ID])
{
int selected_index = m_server_list_widget->getSelectionID();
// This can happen e.g. when the list is empty and the user
// clicks somewhere.
if (selected_index < 0 || m_refreshing_server ||
selected_index >= (int)ServersManager::get()->getServers().size())
selected_index >= (int)m_servers.size())
{
return;
}
new ServerInfoDialog(
ServersManager::get()->getServers()[selected_index]);
new ServerInfoDialog(m_servers[selected_index]);
} // click on server
} // eventCallback
@ -209,14 +217,13 @@ void ServerSelection::eventCallback(GUIEngine::Widget* widget,
* if so, update the list of servers.
*/
void ServerSelection::onUpdate(float dt)
{
// In case of auto-connect command line parameter, select the first server asap
if (NetworkConfig::get()->isAutoConnect() &&
m_refreshing_server == false &&
!ServersManager::get()->getServers().empty())
!m_servers.empty())
{
ServerInfoDialog *sid = new ServerInfoDialog(ServersManager::get()->getServers()[0]);
ServerInfoDialog *sid = new ServerInfoDialog(m_servers[0]);
sid->requestJoin();
}
@ -228,8 +235,9 @@ void ServerSelection::onUpdate(float dt)
if (!ServersManager::get()->getServers().empty())
{
int selection = m_server_list_widget->getSelectionID();
std::string selection_str = m_server_list_widget->getSelectionInternalName();
loadList(0);
std::string selection_str = m_server_list_widget
->getSelectionInternalName();
copyFromServersManager();
// restore previous selection
if (selection != -1 && selection_str != "loading")
m_server_list_widget->setSelectionID(selection);
@ -250,3 +258,17 @@ void ServerSelection::onUpdate(float dt)
}
} // onUpdate
// ----------------------------------------------------------------------------
void ServerSelection::copyFromServersManager()
{
m_servers = ServersManager::get()->getServers();
if (m_servers.empty())
return;
m_servers.erase(std::remove_if(m_servers.begin(), m_servers.end(),
[this](const std::shared_ptr<Server> a)->bool
{
return a->isPasswordProtected() != m_private_server->getState();
}), m_servers.end());
loadList(0);
} // copyFromServersManager

View File

@ -19,11 +19,20 @@
#define HEADER_SERVER_SELECTION_HPP
#include "guiengine/screen.hpp"
#include "guiengine/widgets.hpp"
#include "guiengine/widgets/list_widget.hpp"
#include <memory>
namespace Online { class XMLRequest; }
namespace GUIEngine { class Widget; }
namespace GUIEngine
{
class CheckBoxWidget;
class IconButtonWidget;
class LabelWidget;
class ListWidget;
}
class Server;
/**
* \brief ServerSelection
@ -39,6 +48,9 @@ private:
ServerSelection();
~ServerSelection();
std::vector<std::shared_ptr<Server> > m_servers;
GUIEngine::CheckBoxWidget* m_private_server;
GUIEngine::IconButtonWidget* m_reload_widget;
GUIEngine::LabelWidget* m_update_status;
GUIEngine::ListWidget* m_server_list_widget;
@ -51,6 +63,8 @@ private:
/** Load the servers into the main list.*/
void loadList(unsigned sort_case);
void copyFromServersManager();
void refresh();
public: