summaryrefslogtreecommitdiff
path: root/src/gui/windows/logindialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/windows/logindialog.cpp')
-rw-r--r--src/gui/windows/logindialog.cpp413
1 files changed, 413 insertions, 0 deletions
diff --git a/src/gui/windows/logindialog.cpp b/src/gui/windows/logindialog.cpp
new file mode 100644
index 000000000..883c4606d
--- /dev/null
+++ b/src/gui/windows/logindialog.cpp
@@ -0,0 +1,413 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2013 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "gui/windows/logindialog.h"
+
+#include "client.h"
+#include "configuration.h"
+
+#include "input/keydata.h"
+#include "input/keyevent.h"
+
+#include "gui/windows/confirmdialog.h"
+
+#include "gui/widgets/button.h"
+#include "gui/widgets/checkbox.h"
+#include "gui/widgets/dropdown.h"
+#include "gui/widgets/label.h"
+#include "gui/widgets/layout.h"
+#include "gui/widgets/passwordfield.h"
+
+#include "net/charserverhandler.h"
+#include "net/logindata.h"
+#include "net/loginhandler.h"
+#include "net/net.h"
+
+#include "utils/gettext.h"
+#include "utils/paths.h"
+#include "utils/process.h"
+
+#include "debug.h"
+
+std::string LoginDialog::savedPassword("");
+std::string LoginDialog::savedPasswordKey("");
+
+struct OpenUrlListener : public gcn::ActionListener
+{
+ OpenUrlListener() :
+ gcn::ActionListener(),
+ url()
+ {
+ }
+
+ A_DELETE_COPY(OpenUrlListener)
+
+ void action(const gcn::ActionEvent &event) override
+ {
+ if (event.getId() == "yes")
+ openBrowser(url);
+ }
+
+ std::string url;
+} urlListener;
+
+const char *UPDATE_TYPE_TEXT[3] =
+{
+ // TRANSLATORS: update type
+ N_("Normal"),
+ // TRANSLATORS: update type
+ N_("Auto Close"),
+ // TRANSLATORS: update type
+ N_("Skip"),
+};
+
+class UpdateTypeModel final : public gcn::ListModel
+{
+ public:
+ UpdateTypeModel()
+ { }
+
+ A_DELETE_COPY(UpdateTypeModel)
+
+ ~UpdateTypeModel()
+ { }
+
+ int getNumberOfElements() override
+ {
+ return 3;
+ }
+
+ std::string getElementAt(int i) override
+ {
+ if (i >= getNumberOfElements() || i < 0)
+ return "???";
+ return gettext(UPDATE_TYPE_TEXT[i]);
+ }
+};
+
+class UpdateListModel final : public gcn::ListModel
+{
+ public:
+ explicit UpdateListModel(LoginData *const data) :
+ gcn::ListModel(),
+ mLoginData(data)
+ {
+ }
+
+ A_DELETE_COPY(UpdateListModel)
+
+ ~UpdateListModel()
+ { }
+
+ int getNumberOfElements() override
+ {
+ if (!mLoginData)
+ return 0;
+ return static_cast<int>(mLoginData->updateHosts.size());
+ }
+
+ std::string getElementAt(int i) override
+ {
+ if (!mLoginData || i >= getNumberOfElements() || i < 0)
+ return "???";
+ return mLoginData->updateHosts[i];
+ }
+
+ protected:
+ LoginData *mLoginData;
+};
+
+LoginDialog::LoginDialog(LoginData *const data, std::string serverName,
+ std::string *const updateHost):
+ // TRANSLATORS: login dialog name
+ Window(_("Login"), false, nullptr, "login.xml"),
+ gcn::ActionListener(),
+ gcn::KeyListener(),
+ mLoginData(data),
+ mUserField(new TextField(this, mLoginData->username)),
+ mPassField(new PasswordField(this, mLoginData->password)),
+ // TRANSLATORS: login dialog label
+ mKeepCheck(new CheckBox(this, _("Remember username"),
+ mLoginData->remember)),
+ // TRANSLATORS: login dialog label
+ mUpdateTypeLabel(new Label(this, _("Update:"))),
+ mUpdateHostLabel(nullptr),
+ mUpdateTypeModel(new UpdateTypeModel),
+ mUpdateTypeDropDown(new DropDown(this, mUpdateTypeModel)),
+ // TRANSLATORS: login dialog button
+ mServerButton(new Button(this, _("Change Server"), "server", this)),
+ // TRANSLATORS: login dialog button
+ mLoginButton(new Button(this, _("Login"), "login", this)),
+ // TRANSLATORS: login dialog button
+ mRegisterButton(new Button(this, _("Register"), "register", this)),
+ // TRANSLATORS: login dialog checkbox
+ mCustomUpdateHost(new CheckBox(this, _("Custom update host"),
+ mLoginData->updateType & LoginData::Upd_Custom, this, "customhost")),
+ mUpdateHostText(new TextField(this, serverConfig.getValue(
+ "customUpdateHost", ""))),
+ mUpdateListModel(nullptr),
+ mUpdateHostDropDown(nullptr),
+ mUpdateHost(updateHost),
+ mServerName(serverName)
+{
+ setCloseButton(true);
+
+ Net::getCharServerHandler()->clear();
+
+ // TRANSLATORS: login dialog label
+ Label *const serverLabel1 = new Label(this, _("Server:"));
+ Label *const serverLabel2 = new Label(this, serverName);
+ serverLabel2->adjustSize();
+ // TRANSLATORS: login dialog label
+ Label *const userLabel = new Label(this, _("Name:"));
+ // TRANSLATORS: login dialog label
+ Label *const passLabel = new Label(this, _("Password:"));
+ if (mLoginData && mLoginData->updateHosts.size() > 1)
+ {
+ // TRANSLATORS: login dialog label
+ mUpdateHostLabel = new Label(this, strprintf(_("Update host: %s"),
+ mLoginData->updateHost.c_str()));
+ mUpdateListModel = new UpdateListModel(mLoginData);
+ mUpdateHostDropDown = new DropDown(this, mUpdateListModel,
+ false, false, this, "updateselect");
+ const std::string str = serverConfig.getValue("updateHost2", "");
+ if (!str.empty())
+ mUpdateHostDropDown->setSelectedString(str);
+ }
+ else
+ {
+ mUpdateHostLabel = nullptr;
+ mUpdateListModel = nullptr;
+ mUpdateHostDropDown = nullptr;
+ }
+ mUpdateHostText->adjustSize();
+
+ if (mPassField->getText().empty() && LoginDialog::savedPassword != "")
+ mPassField->setText(LoginDialog::savedPassword);
+
+ mUpdateTypeDropDown->setActionEventId("updatetype");
+ mUpdateTypeDropDown->setSelected((mLoginData->updateType
+ | LoginData::Upd_Custom) ^ LoginData::Upd_Custom);
+
+ if (!mCustomUpdateHost->isSelected())
+ mUpdateHostText->setVisible(false);
+
+ mUserField->setActionEventId("login");
+ mPassField->setActionEventId("login");
+
+ mUserField->addKeyListener(this);
+ mPassField->addKeyListener(this);
+ mUserField->addActionListener(this);
+ mPassField->addActionListener(this);
+
+ place(0, 0, serverLabel1);
+ place(1, 0, serverLabel2, 8);
+ place(0, 1, userLabel);
+ place(1, 1, mUserField, 8);
+ place(0, 2, passLabel);
+ place(1, 2, mPassField, 8);
+ place(0, 6, mUpdateTypeLabel, 1);
+ place(1, 6, mUpdateTypeDropDown, 8);
+ int n = 7;
+ if (mUpdateHostLabel)
+ {
+ place(0, 7, mUpdateHostLabel, 9);
+ place(0, 8, mUpdateHostDropDown, 9);
+ n += 2;
+ }
+ place(0, n, mCustomUpdateHost, 9);
+ place(0, n + 1, mUpdateHostText, 9);
+ place(0, n + 2, mKeepCheck, 9);
+ place(0, n + 3, mRegisterButton).setHAlign(LayoutCell::LEFT);
+ place(2, n + 3, mServerButton);
+ place(3, n + 3, mLoginButton);
+
+ addKeyListener(this);
+ if (mUpdateHostLabel)
+ setContentSize(310, 250);
+ else
+ setContentSize(310, 200);
+
+ reflowLayout();
+ center();
+ setVisible(true);
+
+ if (mUserField->getText().empty())
+ mUserField->requestFocus();
+ else
+ mPassField->requestFocus();
+
+ mLoginButton->setEnabled(canSubmit());
+ mRegisterButton->setEnabled(Net::getLoginHandler()->isRegistrationEnabled()
+ || !mLoginData->registerUrl.empty());
+}
+
+LoginDialog::~LoginDialog()
+{
+ delete mUpdateTypeModel;
+ mUpdateTypeModel = nullptr;
+ delete mUpdateListModel;
+ mUpdateListModel = nullptr;
+}
+
+void LoginDialog::action(const gcn::ActionEvent &event)
+{
+ const std::string &eventId = event.getId();
+ if (eventId == "login" && canSubmit())
+ {
+ prepareUpdate();
+ mLoginData->registerLogin = false;
+ client->setState(STATE_LOGIN_ATTEMPT);
+ }
+ else if (eventId == "server")
+ {
+ close();
+ }
+ else if (eventId == "register")
+ {
+ if (Net::getLoginHandler()->isRegistrationEnabled())
+ {
+ prepareUpdate();
+ client->setState(STATE_REGISTER_PREP);
+ }
+ else if (!mLoginData->registerUrl.empty())
+ {
+ const std::string &url = mLoginData->registerUrl;
+ urlListener.url = url;
+ // TRANSLATORS: question dialog
+ ConfirmDialog *const confirmDlg = new ConfirmDialog(
+ _("Open register url"), url, SOUND_REQUEST, false, true);
+ confirmDlg->addActionListener(&urlListener);
+ }
+ }
+ else if (eventId == "customhost")
+ {
+ mUpdateHostText->setVisible(mCustomUpdateHost->isSelected());
+ }
+ else if (eventId == "updateselect")
+ {
+ mCustomUpdateHost->setSelected(false);
+ mUpdateHostText->setVisible(false);
+ }
+}
+
+void LoginDialog::keyPressed(gcn::KeyEvent &keyEvent)
+{
+ if (keyEvent.isConsumed())
+ {
+ mLoginButton->setEnabled(canSubmit());
+ return;
+ }
+
+ const int actionId = static_cast<KeyEvent*>(
+ &keyEvent)->getActionId();
+ if (actionId == static_cast<int>(Input::KEY_GUI_CANCEL))
+ {
+ action(gcn::ActionEvent(nullptr, mServerButton->getActionEventId()));
+ }
+ else if (actionId == static_cast<int>(Input::KEY_GUI_SELECT)
+ || actionId == static_cast<int>(Input::KEY_GUI_SELECT2))
+ {
+ action(gcn::ActionEvent(nullptr, mLoginButton->getActionEventId()));
+ }
+ else
+ {
+ mLoginButton->setEnabled(canSubmit());
+ }
+}
+
+bool LoginDialog::canSubmit() const
+{
+ return !mUserField->getText().empty() &&
+ !mPassField->getText().empty() &&
+ client->getState() == STATE_LOGIN;
+}
+
+void LoginDialog::prepareUpdate()
+{
+ mLoginData->username = mUserField->getText();
+ mLoginData->password = mPassField->getText();
+ mLoginData->remember = mKeepCheck->isSelected();
+ int updateType = mUpdateTypeDropDown->getSelected();
+
+ if (mCustomUpdateHost->isSelected()
+ && !mUpdateHostText->getText().empty())
+ {
+ updateType |= LoginData::Upd_Custom;
+ serverConfig.setValue("customUpdateHost",
+ mUpdateHostText->getText());
+
+ if (checkPath(mUpdateHostText->getText()))
+ {
+ mLoginData->updateHost = mUpdateHostText->getText();
+ *mUpdateHost = mUpdateHostText->getText();
+ }
+ else
+ {
+ mLoginData->updateHost.clear();
+ (*mUpdateHost).clear();
+ }
+ }
+ else
+ {
+ std::string str;
+ if (mUpdateHostDropDown)
+ {
+ str = mUpdateHostDropDown->getSelectedString();
+ }
+ else if (mLoginData->updateHost.empty()
+ && !mLoginData->updateHosts.empty())
+ {
+ str = mLoginData->updateHosts[0];
+ }
+ serverConfig.setValue("updateHost2", str);
+ if (!str.empty() && checkPath(str))
+ {
+ mLoginData->updateHost = str;
+ *mUpdateHost = str;
+ }
+ else
+ {
+ mLoginData->updateHost.clear();
+ (*mUpdateHost).clear();
+ }
+ }
+
+ mLoginData->updateType = updateType;
+ serverConfig.setValue("updateType", updateType);
+
+ mRegisterButton->setEnabled(false);
+ mServerButton->setEnabled(false);
+ mLoginButton->setEnabled(false);
+
+ LoginDialog::savedPassword = mPassField->getText();
+ if (mLoginData->remember)
+ LoginDialog::savedPasswordKey = mServerName;
+ else
+ LoginDialog::savedPasswordKey = "-";
+}
+
+void LoginDialog::close()
+{
+ client->setState(STATE_SWITCH_SERVER);
+ Window::close();
+}