diff options
Diffstat (limited to 'src/gui/windows/quitdialog.cpp')
-rw-r--r-- | src/gui/windows/quitdialog.cpp | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/src/gui/windows/quitdialog.cpp b/src/gui/windows/quitdialog.cpp new file mode 100644 index 000000000..0eeece318 --- /dev/null +++ b/src/gui/windows/quitdialog.cpp @@ -0,0 +1,256 @@ +/* + * 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/quitdialog.h" + +#include "client.h" +#include "configuration.h" +#include "game.h" +#include "soundconsts.h" +#include "soundmanager.h" + +#include "input/keydata.h" +#include "input/keyevent.h" + +#include "gui/viewport.h" + +#include "gui/widgets/layout.h" +#include "gui/widgets/button.h" +#include "gui/widgets/radiobutton.h" + +#include "net/charserverhandler.h" +#include "net/gamehandler.h" +#include "net/net.h" + +#include "utils/gettext.h" +#include "utils/process.h" + +#include "debug.h" + +QuitDialog::QuitDialog(QuitDialog **const pointerToMe): + // TRANSLATORS: quit dialog name + Window(_("Quit"), true, nullptr, "quit.xml"), + gcn::ActionListener(), + gcn::KeyListener(), + mOptions(), + // TRANSLATORS: quit dialog button + mLogoutQuit(new RadioButton(this, _("Quit"), "quitdialog")), + // TRANSLATORS: quit dialog button + mForceQuit(new RadioButton(this, _("Quit"), "quitdialog")), + mSwitchAccountServer(new RadioButton(this, + // TRANSLATORS: quit dialog button + _("Switch server"), "quitdialog")), + mSwitchCharacter(new RadioButton(this, + // TRANSLATORS: quit dialog button + _("Switch character"), "quitdialog")), + mRate(nullptr), + // TRANSLATORS: quit dialog button + mOkButton(new Button(this, _("OK"), "ok", this)), + // TRANSLATORS: quit dialog button + mCancelButton(new Button(this, _("Cancel"), "cancel", this)), + mMyPointer(pointerToMe), + mNeedForceQuit(false) +{ + addKeyListener(this); + + ContainerPlacer placer = getPlacer(0, 0); + const State state = client->getState(); + mNeedForceQuit = (state == STATE_CHOOSE_SERVER + || state == STATE_CONNECT_SERVER || state == STATE_LOGIN + || state == STATE_PRE_LOGIN || state == STATE_LOGIN_ATTEMPT + || state == STATE_UPDATE || state == STATE_LOAD_DATA); + + // All states, when we're not logged in to someone. + if (mNeedForceQuit) + { + placeOption(placer, mForceQuit); + } + else + { + // Only added if we are connected to an accountserver or gameserver + placeOption(placer, mLogoutQuit); + placeOption(placer, mSwitchAccountServer); + + // Only added if we are connected to a gameserver + if (state == STATE_GAME) + placeOption(placer, mSwitchCharacter); + } + +/* +#ifdef ANDROID + if (config.getBoolValue("rated") == false + && config.getIntValue("gamecount") > 3) + { + mRate = new RadioButton(this, _("Rate in google play"), "quitdialog"); + placeOption(placer, mRate); + mOptions[mOptions.size() - 1]->setSelected(true); + } + else +#endif +*/ + { + mOptions[0]->setSelected(true); + } + + placer = getPlacer(0, 1); + placer(1, 0, mOkButton, 1); + placer(2, 0, mCancelButton, 1); + + reflowLayout(200, 0); + setLocationRelativeTo(getParent()); + setVisible(true); + soundManager.playGuiSound(SOUND_SHOW_WINDOW); + requestModalFocus(); + mOkButton->requestFocus(); +} + +QuitDialog::~QuitDialog() +{ + if (mMyPointer) + *mMyPointer = nullptr; + delete mForceQuit; + mForceQuit = nullptr; + delete mLogoutQuit; + mLogoutQuit = nullptr; + delete mSwitchAccountServer; + mSwitchAccountServer = nullptr; + delete mSwitchCharacter; + mSwitchCharacter = nullptr; +} + +void QuitDialog::placeOption(ContainerPlacer &placer, + RadioButton *const option) +{ + placer(0, static_cast<int>(mOptions.size()), option, 3); + mOptions.push_back(option); +} + +void QuitDialog::action(const gcn::ActionEvent &event) +{ + soundManager.playGuiSound(SOUND_HIDE_WINDOW); + if (event.getId() == "ok") + { + if (viewport) + { + const Map *const map = viewport->getMap(); + if (map) + map->saveExtraLayer(); + } + + if (mForceQuit->isSelected()) + { + client->setState(STATE_FORCE_QUIT); + } + else if (mLogoutQuit->isSelected()) + { + Game::closeDialogs(); + client->setState(STATE_EXIT); + } + else if (mRate && mRate->isSelected()) + { + openBrowser("https://play.google.com/store/apps/details?" + "id=org.evolonline.beta.manaplus"); + config.setValue("rated", true); + if (mNeedForceQuit) + { + client->setState(STATE_FORCE_QUIT); + } + else + { + Game::closeDialogs(); + client->setState(STATE_EXIT); + } + } + else if (Net::getGameHandler()->isConnected() + && mSwitchAccountServer->isSelected()) + { + Game::closeDialogs(); + client->setState(STATE_SWITCH_SERVER); + } + else if (mSwitchCharacter->isSelected()) + { + if (client->getState() == STATE_GAME) + { + Net::getCharServerHandler()->switchCharacter(); + Game::closeDialogs(); + } + } + } + scheduleDelete(); +} + +void QuitDialog::keyPressed(gcn::KeyEvent &keyEvent) +{ + const int actionId = static_cast<KeyEvent*>(&keyEvent)->getActionId(); + int dir = 0; + + switch (actionId) + { + case Input::KEY_GUI_SELECT: + case Input::KEY_GUI_SELECT2: + action(gcn::ActionEvent(nullptr, mOkButton->getActionEventId())); + break; + case Input::KEY_GUI_CANCEL: + action(gcn::ActionEvent(nullptr, + mCancelButton->getActionEventId())); + break; + case Input::KEY_GUI_UP: + dir = -1; + break; + case Input::KEY_GUI_DOWN: + dir = 1; + break; + default: + break; + } + + if (dir != 0) + { + std::vector<RadioButton*>::const_iterator it = mOptions.begin(); + const std::vector<RadioButton*>::const_iterator + it_end = mOptions.end(); + + for (; it < it_end; ++it) + { + if ((*it)->isSelected()) + break; + } + + if (it == mOptions.end()) + { + if (mOptions[0]) + mOptions[0]->setSelected(true); + return; + } + else if (it == mOptions.begin() && dir < 0) + { + it = mOptions.end(); + } + + it += dir; + + if (it == mOptions.end()) + it = mOptions.begin(); + + (*it)->setSelected(true); + } +} |