diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/serverdialog.cpp | 170 | ||||
-rw-r--r-- | src/gui/serverdialog.h | 12 | ||||
-rw-r--r-- | src/gui/theme.cpp | 3 | ||||
-rw-r--r-- | src/gui/theme.h | 1 | ||||
-rw-r--r-- | src/net/serverinfo.h | 9 |
5 files changed, 165 insertions, 30 deletions
diff --git a/src/gui/serverdialog.cpp b/src/gui/serverdialog.cpp index 6a6c7a91..6cd364cc 100644 --- a/src/gui/serverdialog.cpp +++ b/src/gui/serverdialog.cpp @@ -23,10 +23,12 @@ #include "client.h" #include "configuration.h" +#include "gui.h" #include "log.h" #include "gui/okdialog.h" #include "gui/sdlinput.h" +#include "gui/theme.h" #include "gui/widgets/button.h" #include "gui/widgets/dropdown.h" @@ -43,6 +45,8 @@ #include "utils/xml.h" #include "widgets/dropdown.h" +#include <guichan/font.hpp> + #include <cstdlib> #include <iostream> #include <string> @@ -76,6 +80,7 @@ static unsigned short defaultPortForServerType(ServerInfo::Type type) ServersListModel::ServersListModel(ServerInfos *servers, ServerDialog *parent): mServers(servers), + mVersionStrings(servers->size(), VersionString(0, "")), mParent(parent) { } @@ -91,22 +96,35 @@ std::string ServersListModel::getElementAt(int elementIndex) MutexLocker lock = mParent->lock(); const ServerInfo &server = mServers->at(elementIndex); std::string myServer; - if (server.name.empty()) + myServer += server.hostname; + myServer += ":"; + myServer += toString(server.port); + return myServer; +} + +void ServersListModel::setVersionString(int index, const std::string &version) +{ + if (version.empty()) + mVersionStrings[index] = VersionString(0, ""); + else { - myServer += server.hostname; - myServer += ":"; - myServer += toString(server.port); + int width = gui->getFont()->getWidth(version); + mVersionStrings[index] = VersionString(width, version); } +} + +void ServersListModel::addServer(const ServerInfo &info, + const std::string &version) +{ + mServers->push_back(info); + + if (version.empty()) + mVersionStrings.push_back(VersionString(0, "")); else { - myServer += server.name; - myServer += " ("; - myServer += server.hostname; - myServer += ":"; - myServer += toString(server.port); - myServer += ")"; + int width = gui->getFont()->getWidth(version); + mVersionStrings.push_back(VersionString(width, version)); } - return myServer; } std::string TypeListModel::getElementAt(int elementIndex) @@ -119,6 +137,74 @@ std::string TypeListModel::getElementAt(int elementIndex) return "Unknown"; } +class ServersListBox : public ListBox +{ +public: + ServersListBox(ServersListModel *model): + ListBox(model) + { + } + + void draw(gcn::Graphics *graphics) + { + if (!mListModel) + return; + + ServersListModel *model = static_cast<ServersListModel*>(mListModel); + + updateAlpha(); + + graphics->setColor(Theme::getThemeColor(Theme::HIGHLIGHT, + (int) (mAlpha * 255.0f))); + graphics->setFont(getFont()); + + const int height = getRowHeight(); + const gcn::Color unsupported = + Theme::getThemeColor(Theme::SERVER_VERSION_NOT_SUPPORTED, + (int) (mAlpha * 255.0f)); + + // Draw filled rectangle around the selected list element + if (mSelected >= 0) + graphics->fillRectangle(gcn::Rectangle(0, height * mSelected, + getWidth(), height)); + + // Draw the list elements + for (int i = 0, y = 0; i < model->getNumberOfElements(); + ++i, y += height) + { + ServerInfo info = model->getServer(i); + + graphics->setColor(Theme::getThemeColor(Theme::TEXT)); + + if (!info.name.empty()) + { + graphics->setFont(boldFont); + graphics->drawText(info.name, 2, y); + } + + graphics->setFont(getFont()); + + int top = y + height / 2; + + graphics->drawText(model->getElementAt(i), 2, top); + + const ServersListModel::VersionString versionInfo = model->getVersionString(i); + if (versionInfo.first > 0) + { + graphics->setColor(unsupported); + + graphics->drawText(versionInfo.second, + getWidth() - versionInfo.first - 2, top); + } + } + } + + unsigned int getRowHeight() const + { + return 2 * getFont()->getHeight(); + } +}; + ServerDialog::ServerDialog(ServerInfo *serverInfo, const std::string &dir): Window(_("Choose Your Server")), @@ -128,6 +214,8 @@ ServerDialog::ServerDialog(ServerInfo *serverInfo, const std::string &dir): mServers(ServerInfos()), mServerInfo(serverInfo) { + setWindowName("ServerDialog"); + Label *serverLabel = new Label(_("Server:")); Label *portLabel = new Label(_("Port:")); Label *typeLabel = new Label(_("Server type:")); @@ -138,7 +226,7 @@ ServerDialog::ServerDialog(ServerInfo *serverInfo, const std::string &dir): mServersListModel = new ServersListModel(&mServers, this); - mServersList = new ListBox(mServersListModel); + mServersList = new ServersListBox(mServersListModel); mServersList->addMouseListener(this); ScrollArea *usedScroll = new ScrollArea(mServersList); @@ -183,17 +271,23 @@ ServerDialog::ServerDialog(ServerInfo *serverInfo, const std::string &dir): // minimum width. int width = 0, height = 0; getLayout().reflow(width, height); - if (width < 300) + if (width < 400) { - width = 300; + width = 400; getLayout().reflow(width, height); } setContentSize(width, height); + setMinWidth(getWidth()); + setMinHeight(getHeight()); + setDefaultSize(getWidth(), getHeight(), ImageRect::CENTER); + + setResizable(true); addKeyListener(this); - center(); + loadWindowState(); + setFieldsReadOnly(true); mServersList->setSelected(0); // Do this after for the Delete button setVisible(true); @@ -314,7 +408,7 @@ void ServerDialog::valueChanged(const gcn::SelectionEvent &) // Update the server and post fields according to the new selection const ServerInfo &myServer = mServersListModel->getServer(index); - mDescription->setCaption(myServer.name); + mDescription->setCaption(myServer.description); mServerNameField->setText(myServer.hostname); mPortField->setText(toString(myServer.port)); switch (myServer.type) @@ -441,6 +535,18 @@ void ServerDialog::loadServers() server.type = ServerInfo::parseType(type); server.name = XML::getProperty(serverNode, "name", std::string()); + std::string version = XML::getProperty(serverNode, "minimumVersion", + std::string()); + + server.meetsMinimumVersion = (compareStrI(version, PACKAGE_VERSION) + <= 0); + + // For display in the list + if (server.meetsMinimumVersion) + version.clear(); + else + version = strprintf(_("requires v%s"), version.c_str()); + if (server.type == ServerInfo::UNKNOWN) { logger->log("Unknown server type: %s", type.c_str()); @@ -449,36 +555,41 @@ void ServerDialog::loadServers() for_each_xml_child_node(subNode, serverNode) { - if (!xmlStrEqual(subNode->name, BAD_CAST "connection")) - continue; - - server.hostname = XML::getProperty(subNode, "hostname", ""); - server.port = XML::getProperty(subNode, "port", 0); - if (server.port == 0) + if (xmlStrEqual(subNode->name, BAD_CAST "connection")) + { + server.hostname = XML::getProperty(subNode, "hostname", ""); + server.port = XML::getProperty(subNode, "port", 0); + if (server.port == 0) + { + // If no port is given, use the default for the given type + server.port = defaultPortForServerType(server.type); + } + } + else if (xmlStrEqual(subNode->name, BAD_CAST "description")) { - // If no port is given, use the default for the given type - server.port = defaultPortForServerType(server.type); + server.description = (const char*) subNode->xmlChildrenNode->content; } } MutexLocker lock(&mMutex); // Add the server to the local list if it's not already present - ServerInfos::iterator it; bool found = false; - for (it = mServers.begin(); it != mServers.end(); it++) + for (unsigned int i = 0; i < mServers.size(); i++) { - if ((*it) == server) + if (mServers[i] == server) { // Use the name listed in the server list - (*it).name = server.name; + mServers[i].name = server.name; + mServers[i].meetsMinimumVersion = server.meetsMinimumVersion; + mServersListModel->setVersionString(i, version); found = true; break; } } if (!found) - mServers.push_back(server); + mServersListModel->addServer(server, version); } } @@ -503,6 +614,7 @@ void ServerDialog::loadCustomServers() break; server.save = true; + server.meetsMinimumVersion = true; mServers.push_back(server); } } diff --git a/src/gui/serverdialog.h b/src/gui/serverdialog.h index 673ee97c..5b9d53fd 100644 --- a/src/gui/serverdialog.h +++ b/src/gui/serverdialog.h @@ -51,6 +51,8 @@ class DropDown; class ServersListModel : public gcn::ListModel { public: + typedef std::pair<int, std::string> VersionString; + ServersListModel(ServerInfos *servers, ServerDialog *parent); /** @@ -69,8 +71,18 @@ class ServersListModel : public gcn::ListModel const ServerInfo &getServer(int elementIndex) const { return mServers->at(elementIndex); } + const VersionString &getVersionString(int index) const + { return mVersionStrings[index]; } + + void setVersionString(int index, const std::string &version); + + void addServer(const ServerInfo &info, const std::string &version); + private: + typedef std::vector<VersionString> VersionStrings; + ServerInfos *mServers; + VersionStrings mVersionStrings; ServerDialog *mParent; }; diff --git a/src/gui/theme.cpp b/src/gui/theme.cpp index f42b0fc2..33e9f301 100644 --- a/src/gui/theme.cpp +++ b/src/gui/theme.cpp @@ -408,7 +408,8 @@ static int readColorType(const std::string &type) "RING", "NECKLACE", "ARMS", - "AMMO" + "AMMO", + "SERVER_VERSION_NOT_SUPPORTED" }; if (type.empty()) diff --git a/src/gui/theme.h b/src/gui/theme.h index 4dd63660..6798bed5 100644 --- a/src/gui/theme.h +++ b/src/gui/theme.h @@ -156,6 +156,7 @@ class Theme : public Palette, public ConfigListener NECKLACE, ARMS, AMMO, + SERVER_VERSION_NOT_SUPPORTED, THEME_COLORS_END }; diff --git a/src/net/serverinfo.h b/src/net/serverinfo.h index 803bcc71..adfdee7e 100644 --- a/src/net/serverinfo.h +++ b/src/net/serverinfo.h @@ -41,13 +41,17 @@ public: std::string hostname; unsigned short port; + std::string description; + bool save; + bool meetsMinimumVersion; ServerInfo() { type = UNKNOWN; port = 0; save = false; + meetsMinimumVersion = true; } ServerInfo(const ServerInfo &info) @@ -56,7 +60,9 @@ public: name = info.name; hostname = info.hostname; port = info.port; + description = info.description; save = info.save; + meetsMinimumVersion = info.meetsMinimumVersion; } bool isValid() const @@ -70,6 +76,9 @@ public: name.clear(); hostname.clear(); port = 0; + description.clear(); + save = false; + meetsMinimumVersion = true; } bool operator==(const ServerInfo &other) const |