GunChleoc has proposed merging lp:~widelands-dev/widelands/bug-1480937 into lp:widelands.
Requested reviews: Widelands Developers (widelands-dev) Related bugs: Bug #1480937 in widelands: "Escape key doesn't work in all dialogues" https://bugs.launchpad.net/widelands/+bug/1480937 For more details, see: https://code.launchpad.net/~widelands-dev/widelands/bug-1480937/+merge/267230 Added missing key bindings to ui_fsmenu. Return and Esc should now work everywhere where it it appropriate. Used templates for run() and end_modal() in UI::Panel to improve type safety for return codes. All Return codes are now enums in UI::Panel or FullscreenMenuBase. Uniform naming for clicked_ok()/clicked_back(). Yes/No messgae box is now OK/Cancel. -- Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/bug-1480937 into lp:widelands.
=== modified file 'src/editor/editorinteractive.cc' --- src/editor/editorinteractive.cc 2015-07-26 09:25:51 +0000 +++ src/editor/editorinteractive.cc 2015-08-06 17:33:02 +0000 @@ -250,18 +250,18 @@ void EditorInteractive::exit() { if (m_need_save) { if (get_key_state(SDL_SCANCODE_LCTRL) || get_key_state(SDL_SCANCODE_RCTRL)) { - end_modal(0); + end_modal<UI::Panel::Returncodes>(UI::Panel::Returncodes::kBack); } else { UI::WLMessageBox mmb (this, _("Unsaved Map"), _("The map has not been saved, do you really want to quit?"), - UI::WLMessageBox::YESNO); - if (mmb.run() == 0) + UI::WLMessageBox::MBoxType::kOkCancel); + if (mmb.run<UI::Panel::Returncodes>() == UI::Panel::Returncodes::kBack) return; } } - end_modal(0); + end_modal<UI::Panel::Returncodes>(UI::Panel::Returncodes::kBack); } void EditorInteractive::toggle_mainmenu() { @@ -621,7 +621,7 @@ eia.egbase().lua().run_script(script_to_run); } } - eia.run(); + eia.run<UI::Panel::Returncodes>(); editor.cleanup_objects(); } === modified file 'src/editor/ui_menus/editor_main_menu_save_map.cc' --- src/editor/ui_menus/editor_main_menu_save_map.cc 2015-07-30 07:16:09 +0000 +++ src/editor/ui_menus/editor_main_menu_save_map.cc 2015-08-06 17:33:02 +0000 @@ -208,7 +208,7 @@ */ void MainMenuSaveMap::clicked_make_directory() { MainMenuSaveMapMakeDirectory md(this, _("unnamed")); - if (md.run()) { + if (md.run<UI::Panel::Returncodes>() == UI::Panel::Returncodes::kOk) { g_fs->ensure_directory_exists(m_basedir); // create directory std::string fullname = m_curdir; @@ -380,8 +380,8 @@ (boost::format(_("A file with the name ‘%s’ already exists. Overwrite?")) % FileSystem::fs_filename(filename.c_str())).str(); UI::WLMessageBox mbox - (&eia(), _("Error Saving Map!"), s, UI::WLMessageBox::YESNO); - if (!mbox.run()) + (&eia(), _("Error Saving Map!"), s, UI::WLMessageBox::MBoxType::kOkCancel); + if (mbox.run<UI::Panel::Returncodes>() == UI::Panel::Returncodes::kBack) return false; g_fs->fs_unlink(complete_filename); @@ -400,8 +400,8 @@ "given:\n"); s += e.what(); UI::WLMessageBox mbox - (&eia(), _("Error Saving Map!"), s, UI::WLMessageBox::OK); - mbox.run(); + (&eia(), _("Error Saving Map!"), s, UI::WLMessageBox::MBoxType::kOk); + mbox.run<UI::Panel::Returncodes>(); } die(); === modified file 'src/editor/ui_menus/editor_main_menu_save_map.h' --- src/editor/ui_menus/editor_main_menu_save_map.h 2014-09-25 08:58:07 +0000 +++ src/editor/ui_menus/editor_main_menu_save_map.h 2015-08-06 17:33:02 +0000 @@ -40,7 +40,7 @@ private: EditorInteractive & eia(); - void clicked_ok (); + void clicked_ok(); void clicked_make_directory(); void clicked_item(uint32_t); void double_clicked_item(uint32_t); === modified file 'src/editor/ui_menus/editor_main_menu_save_map_make_directory.cc' --- src/editor/ui_menus/editor_main_menu_save_map_make_directory.cc 2015-07-30 07:16:09 +0000 +++ src/editor/ui_menus/editor_main_menu_save_map_make_directory.cc 2015-08-06 17:33:02 +0000 @@ -57,7 +57,9 @@ std::string(), m_dirname.size()); m_ok_button->sigclicked.connect - (boost::bind(&MainMenuSaveMapMakeDirectory::end_modal, boost::ref(*this), 1)); + (boost::bind(&MainMenuSaveMapMakeDirectory::end_modal<UI::Panel::Returncodes>, + boost::ref(*this), + UI::Panel::Returncodes::kOk)); UI::Button * cancelbtn = new UI::Button (this, "cancel", @@ -65,7 +67,9 @@ g_gr->images().get("pics/but1.png"), _("Cancel")); cancelbtn->sigclicked.connect - (boost::bind(&MainMenuSaveMapMakeDirectory::end_modal, boost::ref(*this), 0)); + (boost::bind(&MainMenuSaveMapMakeDirectory::end_modal<UI::Panel::Returncodes>, + boost::ref(*this), + UI::Panel::Returncodes::kBack)); center_to_parent(); } === modified file 'src/editor/ui_menus/editor_player_menu.cc' --- src/editor/ui_menus/editor_player_menu.cc 2015-07-29 07:26:48 +0000 +++ src/editor/ui_menus/editor_player_menu.cc 2015-08-06 17:33:02 +0000 @@ -295,7 +295,7 @@ // // ("Cannot remove player. It is referenced in some place. Remove all" // // " buildings and bobs that depend on this player and try again."), // // UI::WLMessageBox::OK); -// // mmb.run(); +// // mmb.run<UI::Panel::Returncodes>(); // } // } @@ -324,8 +324,8 @@ _ ("Cannot remove player. It is referenced someplace. Remove all" " buildings and animals that depend on this player and try again."), - UI::WLMessageBox::OK); - mmb.run(); + UI::WLMessageBox::MBoxType::kOk); + mmb.run<UI::Panel::Returncodes>(); } update(); } === modified file 'src/logic/game.cc' --- src/logic/game.cc 2015-08-06 07:18:24 +0000 +++ src/logic/game.cc 2015-08-06 17:33:02 +0000 @@ -346,7 +346,7 @@ * Initialize the savegame based on the given settings. * At return the game is at the same state like a map loaded with Game::init() * Only difference is, that players are already initialized. - * run() takes care about this difference. + * run<Returncode>() takes care about this difference. * * \note loaderUI can be nullptr, if this is run as dedicated server. */ @@ -564,7 +564,7 @@ m_state = gs_running; - get_ibase()->run(); + get_ibase()->run<UI::Panel::Returncodes>(); m_state = gs_ending; === modified file 'src/logic/replay_game_controller.cc' --- src/logic/replay_game_controller.cc 2015-03-01 09:21:20 +0000 +++ src/logic/replay_game_controller.cc 2015-08-06 17:33:02 +0000 @@ -109,8 +109,8 @@ _("The end of the replay has been reached and the game has " "been paused. You may unpause the game and continue watching " "if you want to."), - UI::WLMessageBox::OK); - mmb.run(); + UI::WLMessageBox::MBoxType::kOk); + mmb.run<UI::Panel::Returncodes>(); } uint8_t ReplayGameController::CmdReplayEnd::id() const { === modified file 'src/network/netclient.cc' --- src/network/netclient.cc 2015-07-30 07:16:09 +0000 +++ src/network/netclient.cc 2015-08-06 17:33:02 +0000 @@ -155,19 +155,20 @@ FullscreenMenuLaunchMPG lgm(this, this); lgm.set_chat_provider(*this); d->modal = &lgm; - int32_t code = lgm.run(); + FullscreenMenuBase::MenuTarget code = lgm.run<FullscreenMenuBase::MenuTarget>(); d->modal = nullptr; - if (code == 1) { // Only possible if server is dedicated - client pressed "start game" button + // Only possible if server is dedicated - client pressed "start game" button + if (code == FullscreenMenuBase::MenuTarget::kNormalGame) { SendPacket subs; subs.unsigned_8(NETCMD_LAUNCH); subs.send(d->sock); // Reopen the menu - perhaps the start is denied or other problems occur d->modal = &lgm; - code = lgm.run(); + code = lgm.run<FullscreenMenuBase::MenuTarget>(); d->modal = nullptr; } - if (code <= 0) { + if (code == FullscreenMenuBase::MenuTarget::kBack) { // if this is an internet game, tell the metaserver that client is back in the lobby. if (m_internet) InternetGaming::ref().set_game_done(); @@ -945,9 +946,10 @@ } case NETCMD_LAUNCH: { - if (!d->modal || d->game) + if (!d->modal || d->game) { throw DisconnectException("UNEXPECTED_LAUNCH"); - d->modal->end_modal(2); + } + d->modal->end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kOk); break; } case NETCMD_SETSPEED: @@ -1100,15 +1102,15 @@ (d->modal, _("Disconnected from Host"), msg, - UI::WLMessageBox::OK); - mmb.run(); + UI::WLMessageBox::MBoxType::kOk); + mmb.run<UI::Panel::Returncodes>(); } if (trysave) WLApplication::emergency_save(*d->game); if (d->modal) { - d->modal->end_modal(0); + d->modal->end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kBack); d->modal = nullptr; } } === modified file 'src/network/nethost.cc' --- src/network/nethost.cc 2015-03-17 21:29:04 +0000 +++ src/network/nethost.cc 2015-08-06 17:33:02 +0000 @@ -780,8 +780,8 @@ } else { FullscreenMenuLaunchMPG lm(&d->hp, this); lm.set_chat_provider(d->chat); - const int32_t code = lm.run(); - if (code <= 0) { + const FullscreenMenuBase::MenuTarget code = lm.run<FullscreenMenuBase::MenuTarget>(); + if (code == FullscreenMenuBase::MenuTarget::kBack) { // if this is an internet game, tell the metaserver that client is back in the lobby. if (m_internet) InternetGaming::ref().set_game_done(); === modified file 'src/scripting/lua_game.cc' --- src/scripting/lua_game.cc 2015-04-18 11:29:15 +0000 +++ src/scripting/lua_game.cc 2015-08-06 17:33:02 +0000 @@ -419,7 +419,7 @@ (game.get_ipl(), luaL_checkstring(L, 2), luaL_checkstring(L, 3), button_text, posx, posy, w, h); - mb->run(); + mb->run<UI::Panel::Returncodes>(); delete mb; // Manually force the game to reevaluate it's current state, === modified file 'src/scripting/lua_ui.cc' --- src/scripting/lua_ui.cc 2015-01-31 16:03:59 +0000 +++ src/scripting/lua_ui.cc 2015-08-06 17:33:02 +0000 @@ -703,7 +703,7 @@ example used in the widelands Lua test suite. */ int LuaMapView::close(lua_State * /* l */) { - get()->end_modal(0); + get()->end_modal<UI::Panel::Returncodes>(UI::Panel::Returncodes::kBack); return 0; } === modified file 'src/ui_basic/helpwindow.cc' --- src/ui_basic/helpwindow.cc 2015-01-31 16:03:59 +0000 +++ src/ui_basic/helpwindow.cc 2015-08-06 17:33:02 +0000 @@ -84,11 +84,12 @@ in_width / 3, but_height, g_gr->images().get("pics/but0.png"), _("OK"), std::string(), true, false); - btn->sigclicked.connect(boost::bind(&HelpWindow::pressed_ok, boost::ref(*this))); + btn->sigclicked.connect(boost::bind(&HelpWindow::clicked_ok, boost::ref(*this))); btn->set_font(Font::get((UI::g_fh1->fontset()).serif(), (fontsize < 12 ? 12 : fontsize))); textarea->set_size(in_width - 10, in_height - 10 - (2 * but_height)); + focus(); } @@ -157,7 +158,7 @@ { if (btn == SDL_BUTTON_RIGHT) { play_click(); - pressed_ok(); + clicked_ok(); } return true; } @@ -167,10 +168,26 @@ return true; } -void HelpWindow::pressed_ok() +bool HelpWindow::handle_key(bool down, SDL_Keysym code) +{ + if (down) { + switch (code.sym) { + case SDLK_KP_ENTER: + case SDLK_RETURN: + clicked_ok(); + return true; + default: + return true; // handled + } + } + return true; +} + + +void HelpWindow::clicked_ok() { if (is_modal()) - end_modal(0); + end_modal<UI::Panel::Returncodes>(UI::Panel::Returncodes::kBack); else { // do not call die() here - could lead to broken pointers. // the window should get deleted with the parent anyways. === modified file 'src/ui_basic/helpwindow.h' --- src/ui_basic/helpwindow.h 2014-09-19 09:07:14 +0000 +++ src/ui_basic/helpwindow.h 2015-08-06 17:33:02 +0000 @@ -61,13 +61,16 @@ bool handle_mousepress (uint8_t btn, int32_t mx, int32_t my) override; bool handle_mouserelease(uint8_t btn, int32_t mx, int32_t my) override; + /// Handle keypresses + bool handle_key(bool down, SDL_Keysym code) override; + void add_heading (std::string text); void add_paragraph (std::string text); void add_block (std::string text); void add_picture_li(std::string text, std::string picpath); protected: - virtual void pressed_ok(); + void clicked_ok(); private: enum State { === modified file 'src/ui_basic/messagebox.cc' --- src/ui_basic/messagebox.cc 2014-11-22 10:18:20 +0000 +++ src/ui_basic/messagebox.cc 2015-08-06 17:33:02 +0000 @@ -20,6 +20,7 @@ #include "ui_basic/messagebox.h" #include "base/i18n.h" +#include "base/log.h" // NOCOM #include "graphic/font_handler.h" #include "graphic/graphic.h" #include "ui_basic/button.h" @@ -82,28 +83,29 @@ d->textarea->set_size(width - 10, height - 50); - if (type == OK) { + if (type == MBoxType::kOk) { UI::Button * okbtn = new Button (this, "ok", (get_inner_w() - 120) / 2, get_inner_h() - 30, 120, 20, g_gr->images().get("pics/but0.png"), _("OK")); - okbtn->sigclicked.connect(boost::bind(&WLMessageBox::pressed_ok, boost::ref(*this))); - } else if (type == YESNO) { - UI::Button * yesbtn = new Button - (this, "yes", + okbtn->sigclicked.connect(boost::bind(&WLMessageBox::clicked_ok, boost::ref(*this))); + } else if (type == MBoxType::kOkCancel) { + UI::Button * okbtn = new Button + (this, "ok", (get_inner_w() / 2 - 120) / 2, get_inner_h() - 30, 120, 20, g_gr->images().get("pics/but0.png"), - _("Yes")); - yesbtn->sigclicked.connect(boost::bind(&WLMessageBox::pressed_yes, boost::ref(*this))); - UI::Button * nobtn = new Button + _("OK")); + okbtn->sigclicked.connect(boost::bind(&WLMessageBox::clicked_ok, boost::ref(*this))); + UI::Button * cancelbtn = new Button (this, "no", (get_inner_w() / 2 - 120) / 2 + get_inner_w() / 2, get_inner_h() - 30, 120, 20, g_gr->images().get("pics/but1.png"), - _("No")); - nobtn->sigclicked.connect(boost::bind(&WLMessageBox::pressed_no, boost::ref(*this))); + _("Cancel")); + cancelbtn->sigclicked.connect(boost::bind(&WLMessageBox::clicked_back, boost::ref(*this))); } + focus(); } WLMessageBox::~WLMessageBox() @@ -120,10 +122,11 @@ { if (btn == SDL_BUTTON_RIGHT) { play_click(); - if (d->type == OK) - pressed_ok(); - else - pressed_no(); + if (d->type == MBoxType::kOk) { + clicked_ok(); + } else { + clicked_back(); + } } return true; } @@ -135,45 +138,35 @@ bool WLMessageBox::handle_key(bool down, SDL_Keysym code) { - if (!down) { - return false; - } - - switch (code.sym) { - case SDLK_KP_ENTER: - case SDLK_RETURN: - pressed_yes(); - pressed_ok(); - return true; - case SDLK_ESCAPE: - pressed_no(); - pressed_ok(); - return true; - default: - return false; - } - + if (down) { + switch (code.sym) { + case SDLK_KP_ENTER: + case SDLK_RETURN: + clicked_ok(); + return true; + case SDLK_ESCAPE: + clicked_back(); + return true; + default: + break; // not handled + } + } + return UI::Panel::handle_key(down, code); } -void WLMessageBox::pressed_ok() + +void WLMessageBox::clicked_ok() { ok(); if (is_modal()) - end_modal(0); -} - -void WLMessageBox::pressed_yes() -{ - yes(); - if (is_modal()) - end_modal(1); -} - -void WLMessageBox::pressed_no() -{ - no(); - if (is_modal()) - end_modal(0); + end_modal<UI::Panel::Returncodes>(UI::Panel::Returncodes::kOk); +} + +void WLMessageBox::clicked_back() +{ + cancel(); + if (is_modal()) + end_modal<UI::Panel::Returncodes>(UI::Panel::Returncodes::kBack); } === modified file 'src/ui_basic/messagebox.h' --- src/ui_basic/messagebox.h 2014-10-14 06:30:20 +0000 +++ src/ui_basic/messagebox.h 2015-08-06 17:33:02 +0000 @@ -37,23 +37,23 @@ * * Using it as a modal dialog box is very straightforward: * WLMessageBox mb(parent, "Caption", "Text", OK); - * int32_t code = mb.run(); - * The return code is 1 if the "Yes" button has been pressed in a \ref YESNO - * dialog box. Otherwise, it is 0 (or negative, if the modal messagebox has + * UI::Panel::Returncodes code = mb.run<UI::Panel::Returncodes>(); + * The return code is ok_code if the "OK" button has been pressed in a \ref YESNO + * dialog box. Otherwise, it is dying_code (or negative, if the modal messagebox has * been interrupted in an unusual way). * * Using it as a non-modal dialog box is slightly more complicated. You have * to add this dialog box as a child to the current fullscreen panel, and - * connect the signals \ref yes and \ref no or \ref ok, depending on the + * connect the signals \ref ok and \ref no or \ref ok, depending on the * messagebox type, to a function that deletes the message box. * \note this function is named "WLMessageBox" instead of simply "MessageBox" * because else linking on Windows (even with #undef MessageBox) will * not work. */ struct WLMessageBox : public Window { - enum MBoxType { - OK, - YESNO + enum class MBoxType { + kOk, + kOkCancel }; WLMessageBox (Panel * parent, @@ -64,17 +64,17 @@ ~WLMessageBox(); boost::signals2::signal<void ()> ok; - boost::signals2::signal<void ()> yes; - boost::signals2::signal<void ()> no; + boost::signals2::signal<void ()> cancel; bool handle_mousepress (uint8_t btn, int32_t mx, int32_t my) override; bool handle_mouserelease(uint8_t btn, int32_t mx, int32_t my) override; + + /// Handle keypresses bool handle_key(bool down, SDL_Keysym code) override; protected: - virtual void pressed_ok(); - virtual void pressed_yes(); - virtual void pressed_no(); + virtual void clicked_ok(); + virtual void clicked_back(); private: std::unique_ptr<WLMessageBoxImpl> d; === modified file 'src/ui_basic/panel.cc' --- src/ui_basic/panel.cc 2014-12-06 12:22:35 +0000 +++ src/ui_basic/panel.cc 2015-08-06 17:33:02 +0000 @@ -129,7 +129,7 @@ * negative when the event loop was quit in an abnormal way (e.g. the user * clicked the window's close button or similar). */ -int32_t Panel::run() +int Panel::do_run() { // TODO(sirver): the main loop should not be in UI, but in WLApplication. WLApplication * const app = WLApplication::get(); @@ -174,7 +174,7 @@ app->handle_input(&icb); if (app->should_die()) - end_modal(dying_code); + end_modal<Returncodes>(Returncodes::kBack); do_think(); @@ -186,7 +186,7 @@ rt.blit (app->get_mouse_position() - Point(3, 7), WLApplication::get()->is_mouse_pressed() ? - s_default_cursor_click : + s_default_cursor_click : s_default_cursor); forefather->do_tooltip(); @@ -213,16 +213,6 @@ } /** - * Cause run() to return as soon as possible, with the given return code - */ -void Panel::end_modal(int32_t const code) -{ - _running = false; - _retcode = code; -} - - -/** * \return \c true if this is the currently modal panel */ bool Panel::is_modal() @@ -679,7 +669,7 @@ * Default is enabled. Note that when mouse handling is disabled, child panels * don't receive mouse events either. * - * \param yes rue if the panel should receive mouse events + * \param yes true if the panel should receive mouse events */ void Panel::set_handle_mouse(bool const yes) { === modified file 'src/ui_basic/panel.h' --- src/ui_basic/panel.h 2014-11-29 20:37:34 +0000 +++ src/ui_basic/panel.h 2015-08-06 17:33:02 +0000 @@ -88,9 +88,26 @@ void free_children(); // Modal - static const int32_t dying_code = -1; - int32_t run(); - void end_modal(int32_t code); + enum class Returncodes { + kBack, + kOk + }; + + template<typename Returncode> + Returncode run() { + return static_cast<Returncode>(do_run()); + } + int do_run(); + + /** + * Cause run() to return as soon as possible, with the given return code + */ + template<typename Returncode> + void end_modal(const Returncode& code) { + _running = false; + _retcode = static_cast<int>(code); + } + bool is_modal(); virtual void start(); @@ -310,7 +327,7 @@ uint32_t _desired_w, _desired_h; bool _running; - int32_t _retcode; + int _retcode; std::string _tooltip; static Panel * _modal; === modified file 'src/ui_basic/window.cc' --- src/ui_basic/window.cc 2014-11-27 19:13:30 +0000 +++ src/ui_basic/window.cc 2015-08-06 17:33:02 +0000 @@ -477,7 +477,7 @@ void Window::die() { if (is_modal()) { - end_modal(0); + end_modal<UI::Panel::Returncodes>(UI::Panel::Returncodes::kBack); } else { Panel::die(); } === modified file 'src/ui_fsmenu/base.cc' --- src/ui_fsmenu/base.cc 2014-12-11 10:27:30 +0000 +++ src/ui_fsmenu/base.cc 2015-08-06 17:33:02 +0000 @@ -77,3 +77,29 @@ uint32_t FullscreenMenuBase::fs_big() { return UI_FONT_SIZE_BIG * get_h() / 600; } + +bool FullscreenMenuBase::handle_key(bool down, SDL_Keysym code) +{ + if (down) { + switch (code.sym) { + case SDLK_KP_ENTER: + case SDLK_RETURN: + clicked_ok(); + return true; + case SDLK_ESCAPE: + clicked_back(); + return true; + default: + break; // not handled + } + } + return UI::Panel::handle_key(down, code); +} + + +void FullscreenMenuBase::clicked_back() { + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kBack); +} +void FullscreenMenuBase::clicked_ok() { + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kOk); +} === modified file 'src/ui_fsmenu/base.h' --- src/ui_fsmenu/base.h 2014-12-06 12:22:35 +0000 +++ src/ui_fsmenu/base.h 2015-08-06 17:33:02 +0000 @@ -40,16 +40,58 @@ */ class FullscreenMenuBase : public UI::Panel { public: + enum class MenuTarget { + kBack = UI::Panel::Returncodes::kBack, + kOk = UI::Panel::Returncodes::kOk, + + // Options + kRestart, + + // Main menu + kTutorial, + kSinglePlayer, + kMultiplayer, + kReplay, + kEditor, + kOptions, + kReadme, + kLicense, + kAuthors, + kExit, + + // Single player + kNewGame, + kCampaign, + kLoadGame, + + // Multiplayer + kMetaserver, + kLan, + + // Launch game + kNormalGame, + kScenarioGame, + kMultiPlayerSavegame, + kHostgame, + kJoingame + }; + FullscreenMenuBase(char const * bgpic); virtual ~FullscreenMenuBase(); void draw(RenderTarget &) override; -public: ///\return the size for texts fitting to current resolution uint32_t fs_small(); uint32_t fs_big(); + /// Handle keypresses + bool handle_key(bool down, SDL_Keysym code) override; + +protected: + virtual void clicked_back(); + virtual void clicked_ok(); + private: std::string background_image_; }; === modified file 'src/ui_fsmenu/campaign_select.cc' --- src/ui_fsmenu/campaign_select.cc 2015-05-02 09:47:26 +0000 +++ src/ui_fsmenu/campaign_select.cc 2015-08-06 17:33:02 +0000 @@ -93,16 +93,10 @@ m_ta_difficulty.set_tooltip(_("The difficulty of this campaign")); m_ta_description.set_tooltip(_("Story and hints")); - m_ok.sigclicked.connect - (boost::bind - (&FullscreenMenuCampaignSelect::clicked_ok, boost::ref(*this))); - m_back.sigclicked.connect - (boost::bind - (&FullscreenMenuCampaignSelect::clicked_back, boost::ref(*this))); - m_table.selected.connect - (boost::bind(&FullscreenMenuCampaignSelect::entry_selected, this)); - m_table.double_clicked.connect - (boost::bind(&FullscreenMenuCampaignSelect::clicked_ok, boost::ref(*this))); + m_ok.sigclicked.connect(boost::bind(&FullscreenMenuCampaignSelect::clicked_ok, boost::ref(*this))); + m_back.sigclicked.connect(boost::bind(&FullscreenMenuCampaignSelect::clicked_back, boost::ref(*this))); + m_table.selected.connect(boost::bind(&FullscreenMenuCampaignSelect::entry_selected, this)); + m_table.double_clicked.connect(boost::bind(&FullscreenMenuCampaignSelect::clicked_ok, boost::ref(*this))); /** TRANSLATORS: Campaign difficulty table header */ m_table.add_column(45, _("Diff."), _("Difficulty"), UI::Align_Left); @@ -123,7 +117,7 @@ void FullscreenMenuCampaignSelect::clicked_ok() { get_campaign(); - end_modal(1); + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kOk); } int32_t FullscreenMenuCampaignSelect::get_campaign() === modified file 'src/ui_fsmenu/fileview.cc' --- src/ui_fsmenu/fileview.cc 2015-05-07 09:05:58 +0000 +++ src/ui_fsmenu/fileview.cc 2015-08-06 17:33:02 +0000 @@ -69,7 +69,10 @@ g_gr->images().get("pics/but0.png"), _("Close"), std::string(), true, false) { - close_button.sigclicked.connect(boost::bind(&FullscreenMenuTextView::end_modal, boost::ref(*this), 0)); + close_button.sigclicked.connect( + boost::bind(&FullscreenMenuTextView::end_modal<FullscreenMenuBase::MenuTarget>, + boost::ref(*this), + FullscreenMenuBase::MenuTarget::kBack)); title.set_font(ui_fn(), fs_big(), UI_FONT_CLR_FG); title.set_pos === modified file 'src/ui_fsmenu/internet_lobby.cc' --- src/ui_fsmenu/internet_lobby.cc 2015-01-21 20:57:11 +0000 +++ src/ui_fsmenu/internet_lobby.cc 2015-08-06 17:33:02 +0000 @@ -110,18 +110,11 @@ password(pwd), reg(registered) { - joingame.sigclicked.connect - (boost::bind - (&FullscreenMenuInternetLobby::clicked_joingame, - boost::ref(*this))); - hostgame.sigclicked.connect - (boost::bind - (&FullscreenMenuInternetLobby::clicked_hostgame, - boost::ref(*this))); - back.sigclicked.connect - (boost::bind - (&FullscreenMenuInternetLobby::clicked_back, - boost::ref(*this))); + joingame.sigclicked.connect( + boost::bind(&FullscreenMenuInternetLobby::clicked_joingame, boost::ref(*this))); + hostgame.sigclicked.connect( + boost::bind(&FullscreenMenuInternetLobby::clicked_hostgame, boost::ref(*this))); + back.sigclicked.connect(boost::bind(&FullscreenMenuInternetLobby::clicked_back, boost::ref(*this))); // Set the texts and style of UI elements Section & s = g_options.pull_section("global"); // for playername @@ -159,9 +152,9 @@ (boost::bind(&FullscreenMenuInternetLobby::client_doubleclicked, this, _1)); opengames .set_font(m_fn, m_fs); opengames .selected.connect - (boost::bind(&FullscreenMenuInternetLobby::server_selected, this, _1)); + (boost::bind(&FullscreenMenuInternetLobby::server_selected, this)); opengames .double_clicked.connect - (boost::bind(&FullscreenMenuInternetLobby::server_doubleclicked, this, _1)); + (boost::bind(&FullscreenMenuInternetLobby::server_doubleclicked, this)); // try to connect to the metaserver if (!InternetGaming::ref().error() && !InternetGaming::ref().logged_in()) @@ -192,6 +185,16 @@ fill_games_list(InternetGaming::ref().games()); } +void FullscreenMenuInternetLobby::clicked_ok() +{ + if (joingame.enabled()) { + server_doubleclicked(); + } else { + clicked_hostgame(); + } +} + + /// connects Widelands with the metaserver void FullscreenMenuInternetLobby::connect_to_metaserver() @@ -326,7 +329,7 @@ /// called when an entry of the server list was selected -void FullscreenMenuInternetLobby::server_selected (uint32_t) +void FullscreenMenuInternetLobby::server_selected() { if (opengames.has_selection()) { const InternetGame * game = &opengames.get_selected(); @@ -339,7 +342,7 @@ /// called when an entry of the server list was doubleclicked -void FullscreenMenuInternetLobby::server_doubleclicked (uint32_t) +void FullscreenMenuInternetLobby::server_doubleclicked() { // if the game is open try to connect it, if not do nothing. if (opengames.has_selection()) { @@ -378,14 +381,17 @@ // give some time for the answer + for a relogin, if a problem occurs. if ((INTERNET_GAMING_TIMEOUT * 5 / 3) < time(nullptr) - secs) { // Show a popup warning message - std::string warningheader(_("Connection timed out")); - std::string warning + const std::string warning (_ ("Widelands was unable to get the IP address of the server in time.\n" "There seems to be a network problem, either on your side or on the side\n" "of the server.\n")); - UI::WLMessageBox mmb(this, warningheader, warning, UI::WLMessageBox::OK, UI::Align_Left); - mmb.run(); + UI::WLMessageBox mmb(this, + _("Connection timed out"), + warning, + UI::WLMessageBox::MBoxType::kOk, + UI::Align_Left); + mmb.run<UI::Panel::Returncodes>(); return InternetGaming::ref().set_error(); } } @@ -410,8 +416,8 @@ // Show a popup warning message std::string warningheader(_("Connection problem")); std::string warning(_("Widelands was unable to connect to the host.")); - UI::WLMessageBox mmb(this, warningheader, warning, UI::WLMessageBox::OK, UI::Align_Left); - mmb.run(); + UI::WLMessageBox mmb(this, warningheader, warning, UI::WLMessageBox::MBoxType::kOk, UI::Align_Left); + mmb.run<UI::Panel::Returncodes>(); } SDLNet_ResolveHost (&peer, ip.c_str(), WIDELANDS_PORT); @@ -435,11 +441,3 @@ NetHost netgame(InternetGaming::ref().get_local_clientname(), true); netgame.run(); } - - -/// called when the 'back' button was clicked -void FullscreenMenuInternetLobby::clicked_back() -{ - // Close the lobby UI - end_modal(0); -} === modified file 'src/ui_fsmenu/internet_lobby.h' --- src/ui_fsmenu/internet_lobby.h 2015-01-21 20:57:11 +0000 +++ src/ui_fsmenu/internet_lobby.h 2015-08-06 17:33:02 +0000 @@ -41,6 +41,9 @@ void think() override; +protected: + void clicked_ok() override; + private: uint32_t m_butx; uint32_t m_butw; @@ -68,13 +71,12 @@ void connect_to_metaserver(); void client_doubleclicked (uint32_t); - void server_selected (uint32_t); - void server_doubleclicked (uint32_t); + void server_selected(); + void server_doubleclicked(); void change_servername(); void clicked_joingame(); void clicked_hostgame(); - void clicked_back(); uint8_t convert_clienttype(const std::string &); bool compare_clienttype(unsigned int rowa, unsigned int rowb); === modified file 'src/ui_fsmenu/intro.cc' --- src/ui_fsmenu/intro.cc 2014-11-29 20:37:34 +0000 +++ src/ui_fsmenu/intro.cc 2015-08-06 17:33:02 +0000 @@ -29,14 +29,14 @@ m_message (this, get_w() / 2, get_h() * 19 / 20, - _("Press ESC or click to continue ..."), UI::Align_HCenter) + _("Press any key or click to continue ..."), UI::Align_HCenter) { m_message.set_font(ui_fn(), fs_small() * 6 / 5, RGBColor(192, 192, 128)); } bool FullscreenMenuIntro::handle_mousepress (uint8_t, int32_t, int32_t) { - end_modal(0); + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kOk); return true; } @@ -45,10 +45,11 @@ return true; } -bool FullscreenMenuIntro::handle_key(bool const down, SDL_Keysym const code) +bool FullscreenMenuIntro::handle_key(const bool down, const SDL_Keysym) { - if (down && code.sym == SDLK_ESCAPE) - end_modal(0); + if (down) { + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kOk); + } return false; } === modified file 'src/ui_fsmenu/launch_mpg.cc' --- src/ui_fsmenu/launch_mpg.cc 2015-08-06 07:18:24 +0000 +++ src/ui_fsmenu/launch_mpg.cc 2015-08-06 17:33:02 +0000 @@ -67,7 +67,8 @@ _("Map"), _("Select a map"), true, false); btn->sigclicked.connect (boost::bind - (&MapOrSaveSelectionWindow::pressedButton, boost::ref(*this), 1)); + (&MapOrSaveSelectionWindow::pressedButton, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kNormalGame)); btn = new UI::Button (this, "saved_game", @@ -77,7 +78,8 @@ _("Saved Game"), _("Select a saved game"), true, false); btn->sigclicked.connect (boost::bind - (&MapOrSaveSelectionWindow::pressedButton, boost::ref(*this), 2)); + (&MapOrSaveSelectionWindow::pressedButton, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kScenarioGame)); btn = new UI::Button (this, "cancel", @@ -86,7 +88,8 @@ _("Cancel"), _("Cancel selection"), true, false); btn->sigclicked.connect (boost::bind - (&MapOrSaveSelectionWindow::pressedButton, boost::ref(*this), 0)); + (&MapOrSaveSelectionWindow::pressedButton, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kBack)); } @@ -95,8 +98,8 @@ m_ctrl->think(); } - void pressedButton(uint8_t i) { - end_modal(i); + void pressedButton(FullscreenMenuBase::MenuTarget i) { + end_modal<FullscreenMenuBase::MenuTarget>(i); } private: GameController * m_ctrl; @@ -187,10 +190,8 @@ m_change_map_or_save.sigclicked.connect (boost::bind (&FullscreenMenuLaunchMPG::change_map_or_save, boost::ref(*this))); - m_ok.sigclicked.connect - (boost::bind - (&FullscreenMenuLaunchMPG::start_clicked, boost::ref(*this))); - m_back.sigclicked.connect(boost::bind(&FullscreenMenuLaunchMPG::back_clicked, boost::ref(*this))); + m_ok.sigclicked.connect(boost::bind(&FullscreenMenuLaunchMPG::clicked_ok, boost::ref(*this))); + m_back.sigclicked.connect(boost::bind(&FullscreenMenuLaunchMPG::clicked_back, boost::ref(*this))); m_wincondition.sigclicked.connect (boost::bind (&FullscreenMenuLaunchMPG::win_condition_clicked, @@ -272,9 +273,9 @@ /** * back-button has been pressed */ -void FullscreenMenuLaunchMPG::back_clicked() +void FullscreenMenuLaunchMPG::clicked_back() { - end_modal(0); + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kBack); } /** @@ -323,11 +324,11 @@ void FullscreenMenuLaunchMPG::change_map_or_save() { MapOrSaveSelectionWindow selection_window (this, m_ctrl, get_w() / 3, get_h() / 4); - switch (selection_window.run()) { - case 1: + switch (selection_window.run<FullscreenMenuBase::MenuTarget>()) { + case FullscreenMenuBase::MenuTarget::kNormalGame: select_map(); break; - case 2: + case FullscreenMenuBase::MenuTarget::kScenarioGame: select_saved_game(); break; default: @@ -343,15 +344,15 @@ return; FullscreenMenuMapSelect msm(m_settings, m_ctrl); - int code = msm.run(); + FullscreenMenuBase::MenuTarget code = msm.run<FullscreenMenuBase::MenuTarget>(); - if (code <= 0) { + if (code == FullscreenMenuBase::MenuTarget::kBack) { // Set scenario = false, else the menu might crash when back is pressed. m_settings->set_scenario(false); - return; // back was pressed + return; } - m_settings->set_scenario(code == 2); + m_settings->set_scenario(code == FullscreenMenuBase::MenuTarget::kScenarioGame); const MapData & mapdata = *msm.get_map(); m_nr_players = mapdata.nrplayers; @@ -375,10 +376,11 @@ Widelands::Game game; // The place all data is saved to. FullscreenMenuLoadGame lsgm(game, m_settings, m_ctrl); - int code = lsgm.run(); + FullscreenMenuBase::MenuTarget code = lsgm.run<FullscreenMenuBase::MenuTarget>(); - if (code <= 0) + if (code == FullscreenMenuBase::MenuTarget::kBack) { return; // back was pressed + } // Saved game was selected - therefore not a scenario m_settings->set_scenario(false); @@ -409,8 +411,8 @@ "true or manually unzipped the saved game.\n" "Widelands is not able to transfer directory structures to the clients," " please select another saved game or zip the directories’ content."), - UI::WLMessageBox::OK); - warning.run(); + UI::WLMessageBox::MBoxType::kOk); + warning.run<UI::Panel::Returncodes>(); } } else { if (!m_settings || m_settings->settings().saved_games.empty()) @@ -428,7 +430,7 @@ /** * start-button has been pressed */ -void FullscreenMenuLaunchMPG::start_clicked() +void FullscreenMenuLaunchMPG::clicked_ok() { if (!g_fs->file_exists(m_settings->settings().mapfilename)) throw WLWarning @@ -443,7 +445,7 @@ "finished!?!"), m_settings->settings().mapfilename.c_str()); if (m_settings->can_launch()) - end_modal(1); + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kNormalGame); } @@ -509,7 +511,6 @@ m_mpsg->refresh(); } - /** * if map was selected to be loaded as scenario, set all values like * player names and player tribes and take care about visibility === modified file 'src/ui_fsmenu/launch_mpg.h' --- src/ui_fsmenu/launch_mpg.h 2014-11-13 08:39:14 +0000 +++ src/ui_fsmenu/launch_mpg.h 2015-08-06 17:33:02 +0000 @@ -41,12 +41,6 @@ * Fullscreen menu for setting map and mapsettings for single and multi player * games. * - * The return values of run() are: - * 0 - back was pressed - * 1 - normal game - * 2 - scenario game - * 3 - multi player savegame - * 4 - multi player scenario savegame <- not yet implemented */ class FullscreenMenuLaunchMPG : public FullscreenMenuBase { public: @@ -59,14 +53,16 @@ void refresh(); +protected: + void clicked_ok() override; + void clicked_back() override; + private: LuaInterface * m_lua; void change_map_or_save(); void select_map(); void select_saved_game(); - void back_clicked(); - void start_clicked(); void win_condition_clicked(); void win_condition_update(); void set_scenario_values(); === modified file 'src/ui_fsmenu/launch_spg.cc' --- src/ui_fsmenu/launch_spg.cc 2015-07-29 06:01:48 +0000 +++ src/ui_fsmenu/launch_spg.cc 2015-08-06 17:33:02 +0000 @@ -122,10 +122,10 @@ (boost::bind (&FullscreenMenuLaunchSPG::win_condition_clicked, boost::ref(*this))); - m_back.sigclicked.connect(boost::bind(&FullscreenMenuLaunchSPG::back_clicked, boost::ref(*this))); + m_back.sigclicked.connect(boost::bind(&FullscreenMenuLaunchSPG::clicked_back, boost::ref(*this))); m_ok.sigclicked.connect (boost::bind - (&FullscreenMenuLaunchSPG::start_clicked, boost::ref(*this))); + (&FullscreenMenuLaunchSPG::clicked_ok, boost::ref(*this))); m_lua = new LuaInterface(); m_win_condition_scripts = m_settings->settings().win_condition_scripts; @@ -178,8 +178,9 @@ void FullscreenMenuLaunchSPG::start() { select_map(); - if (m_settings->settings().mapname.empty()) - end_modal(0); // back was pressed + if (m_settings->settings().mapname.empty()) { + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kBack); + } } @@ -195,7 +196,7 @@ /** * back-button has been pressed */ -void FullscreenMenuLaunchSPG::back_clicked() +void FullscreenMenuLaunchSPG::clicked_back() { // The following behaviour might look strange at first view, but for the // user it seems as if the launchgame-menu is a child of mapselect and @@ -204,7 +205,7 @@ m_settings->set_map(std::string(), std::string(), 0); select_map(); if (m_settings->settings().mapname.empty()) - return end_modal(0); + return end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kBack); refresh(); } @@ -252,7 +253,7 @@ /** * start-button has been pressed */ -void FullscreenMenuLaunchSPG::start_clicked() +void FullscreenMenuLaunchSPG::clicked_ok() { if (!g_fs->file_exists(m_filename)) throw WLWarning @@ -267,7 +268,11 @@ "finished!?!"), m_filename.c_str()); if (m_settings->can_launch()) { - end_modal(1 + m_is_scenario); + if (m_is_scenario) { + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kScenarioGame); + } else { + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kNormalGame); + } } } @@ -330,15 +335,15 @@ return; FullscreenMenuMapSelect msm(m_settings, nullptr); - int code = msm.run(); + FullscreenMenuBase::MenuTarget code = msm.run<FullscreenMenuBase::MenuTarget>(); - if (code <= 0) { + if (code == FullscreenMenuBase::MenuTarget::kBack) { // Set scenario = false, else the menu might crash when back is pressed. m_settings->set_scenario(false); return; // back was pressed } - m_is_scenario = code == 2; + m_is_scenario = code == FullscreenMenuBase::MenuTarget::kScenarioGame; m_settings->set_scenario(m_is_scenario); const MapData & mapdata = *msm.get_map(); === modified file 'src/ui_fsmenu/launch_spg.h' --- src/ui_fsmenu/launch_spg.h 2014-11-13 08:39:14 +0000 +++ src/ui_fsmenu/launch_spg.h 2015-08-06 17:33:02 +0000 @@ -44,10 +44,6 @@ * UI::Button m_select_map - only shown if the player has the right to * change the map. * - * The return values of run() are: - * 0 - back was pressed - * 1 - normal game (either single or multi player) - * 2 - scenario game (at the moment only single player) */ class FullscreenMenuLaunchSPG : public FullscreenMenuBase { public: @@ -60,12 +56,14 @@ void refresh(); +protected: + void clicked_ok() override; + void clicked_back() override; + private: LuaInterface * m_lua; void select_map(); - void back_clicked(); - void start_clicked(); void win_condition_clicked(); void win_condition_update(); void set_scenario_values(); === modified file 'src/ui_fsmenu/load_map_or_game.cc' --- src/ui_fsmenu/load_map_or_game.cc 2014-11-23 11:38:50 +0000 +++ src/ui_fsmenu/load_map_or_game.cc 2015-08-06 17:33:02 +0000 @@ -67,26 +67,6 @@ m_table(this, m_tablex, m_tabley, m_tablew, m_tableh, sort_descending) {} -bool FullscreenMenuLoadMapOrGame::handle_key(bool down, SDL_Keysym code) { - - if (!down) - return false; - - switch (code.sym) - { - case SDLK_KP_ENTER: - case SDLK_RETURN: - clicked_ok(); - return true; - case SDLK_ESCAPE: - clicked_back(); - return true; - default: - break; // not handled - } - return FullscreenMenuBase::handle_key(down, code); -} - int32_t FullscreenMenuLoadMapOrGame::get_y_from_preceding(UI::Panel& preceding_panel) { return preceding_panel.get_y() + preceding_panel.get_h(); } === modified file 'src/ui_fsmenu/load_map_or_game.h' --- src/ui_fsmenu/load_map_or_game.h 2015-01-30 23:10:35 +0000 +++ src/ui_fsmenu/load_map_or_game.h 2015-08-06 17:33:02 +0000 @@ -76,12 +76,7 @@ public: FullscreenMenuLoadMapOrGame(bool sortdesc = false); - bool handle_key(bool down, SDL_Keysym code) override; - protected: - virtual void clicked_ok() {end_modal(1);} - void clicked_back() {end_modal(0);} - // Updates the information display on the right-hand side. // Call this function when a different entry in the table gets selected. virtual void entry_selected() {} === modified file 'src/ui_fsmenu/loadgame.cc' --- src/ui_fsmenu/loadgame.cc 2015-07-29 06:01:48 +0000 +++ src/ui_fsmenu/loadgame.cc 2015-08-06 17:33:02 +0000 @@ -244,7 +244,7 @@ const SavegameData & gamedata = m_games_data[m_table.get_selected()]; if (gamedata.errormessage.empty()) { m_filename = gamedata.filename; - end_modal(1); + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kOk); } } @@ -282,8 +282,8 @@ } UI::WLMessageBox confirmationBox - (this, _("Confirm deleting file"), message, UI::WLMessageBox::YESNO); - if (confirmationBox.run()) { + (this, _("Confirm deleting file"), message, UI::WLMessageBox::MBoxType::kOkCancel); + if (confirmationBox.run<UI::Panel::Returncodes>() == UI::Panel::Returncodes::kOk) { g_fs->fs_unlink(gamedata.filename); if (m_is_replay) { g_fs->fs_unlink(gamedata.filename + WLGF_SUFFIX); === modified file 'src/ui_fsmenu/main.cc' --- src/ui_fsmenu/main.cc 2015-04-18 11:20:53 +0000 +++ src/ui_fsmenu/main.cc 2015-08-06 17:33:02 +0000 @@ -82,44 +82,44 @@ { playtutorial.sigclicked.connect (boost::bind - (&FullscreenMenuMain::end_modal, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kTutorial))); + (&FullscreenMenuMain::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kTutorial)); singleplayer.sigclicked.connect (boost::bind - (&FullscreenMenuMain::end_modal, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kSinglePlayer))); + (&FullscreenMenuMain::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kSinglePlayer)); multiplayer.sigclicked.connect (boost::bind - (&FullscreenMenuMain::end_modal, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kMultiplayer))); + (&FullscreenMenuMain::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kMultiplayer)); replay.sigclicked.connect (boost::bind - (&FullscreenMenuMain::end_modal, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kReplay))); + (&FullscreenMenuMain::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kReplay)); editor.sigclicked.connect (boost::bind - (&FullscreenMenuMain::end_modal, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kEditor))); + (&FullscreenMenuMain::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kEditor)); options.sigclicked.connect (boost::bind - (&FullscreenMenuMain::end_modal, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kOptions))); + (&FullscreenMenuMain::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kOptions)); readme.sigclicked.connect (boost::bind - (&FullscreenMenuMain::end_modal, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kReadme))); + (&FullscreenMenuMain::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kReadme)); license.sigclicked.connect (boost::bind - (&FullscreenMenuMain::end_modal, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kLicense))); + (&FullscreenMenuMain::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kLicense)); authors.sigclicked.connect (boost::bind - (&FullscreenMenuMain::end_modal, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kAuthors))); + (&FullscreenMenuMain::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kAuthors)); exit.sigclicked.connect (boost::bind - (&FullscreenMenuMain::end_modal, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kExit))); + (&FullscreenMenuMain::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kExit)); vbox.add(&playtutorial, UI::Box::AlignCenter); @@ -149,3 +149,8 @@ vbox.set_size(m_butw, get_h() - vbox.get_y()); } + +void FullscreenMenuMain::clicked_ok() { + ; // do nothing +} + === modified file 'src/ui_fsmenu/main.h' --- src/ui_fsmenu/main.h 2014-11-13 11:29:20 +0000 +++ src/ui_fsmenu/main.h 2015-08-06 17:33:02 +0000 @@ -31,21 +31,11 @@ */ class FullscreenMenuMain : public FullscreenMenuMainMenu { public: - enum class MenuTarget: int32_t { - kTutorial, - kSinglePlayer, - kMultiplayer, - kReplay, - kEditor, - kOptions, - kReadme, - kLicense, - kAuthors, - kExit - }; - FullscreenMenuMain(); +protected: + void clicked_ok() override; + private: UI::Box vbox; UI::Button playtutorial; === modified file 'src/ui_fsmenu/mapselect.cc' --- src/ui_fsmenu/mapselect.cc 2015-05-02 09:47:26 +0000 +++ src/ui_fsmenu/mapselect.cc 2015-08-06 17:33:02 +0000 @@ -256,7 +256,11 @@ m_curdir = mapdata.filename; fill_table(); } else { - end_modal(1 + is_scenario()); + if (is_scenario()) { + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kScenarioGame); + } else { + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kNormalGame); + } } } === modified file 'src/ui_fsmenu/multiplayer.cc' --- src/ui_fsmenu/multiplayer.cc 2015-04-18 11:20:53 +0000 +++ src/ui_fsmenu/multiplayer.cc 2015-08-06 17:33:02 +0000 @@ -50,13 +50,13 @@ lan.sigclicked.connect (boost::bind - (&FullscreenMenuMultiPlayer::end_modal, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kLan))); + (&FullscreenMenuMultiPlayer::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kLan)); back.sigclicked.connect (boost::bind - (&FullscreenMenuMultiPlayer::end_modal, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kBack))); + (&FullscreenMenuMultiPlayer::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), + FullscreenMenuBase::MenuTarget::kBack)); title.set_font(ui_fn(), fs_big(), UI_FONT_CLR_FG); @@ -114,12 +114,12 @@ m_nickname = s.get_string("nickname", _("nobody")); m_password = s.get_string("password", "nobody"); m_register = s.get_bool("registered", false); - end_modal(static_cast<int32_t>(MenuTarget::kMetaserver)); + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kMetaserver); return; } LoginBox lb(*this); - if (lb.run()) { + if (lb.run<UI::Panel::Returncodes>() == UI::Panel::Returncodes::kOk) { m_nickname = lb.get_nickname(); m_password = lb.get_password(); m_register = lb.registered(); @@ -127,6 +127,10 @@ s.set_bool("registered", lb.registered()); s.set_bool("auto_log", lb.set_automaticlog()); - end_modal(static_cast<int32_t>(MenuTarget::kMetaserver)); + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kMetaserver); } } + +void FullscreenMenuMultiPlayer::clicked_ok() { + internet_login(); +} === modified file 'src/ui_fsmenu/multiplayer.h' --- src/ui_fsmenu/multiplayer.h 2014-11-13 11:29:20 +0000 +++ src/ui_fsmenu/multiplayer.h 2015-08-06 17:33:02 +0000 @@ -34,18 +34,15 @@ public: FullscreenMenuMultiPlayer(); - enum class MenuTarget: int32_t { - kBack = UI::Panel::dying_code, - kMetaserver, - kLan - }; - void show_internet_login(); void internet_login(); std::string get_nickname() {return m_nickname;} std::string get_password() {return m_password;} bool registered() {return m_register;} +protected: + void clicked_ok() override; + private: UI::Textarea title; UI::Box vbox; === modified file 'src/ui_fsmenu/netsetup_lan.cc' --- src/ui_fsmenu/netsetup_lan.cc 2014-12-06 12:22:35 +0000 +++ src/ui_fsmenu/netsetup_lan.cc 2015-08-06 17:33:02 +0000 @@ -98,8 +98,7 @@ (&FullscreenMenuNetSetupLAN::clicked_hostgame, boost::ref(*this))); back.sigclicked.connect (boost::bind - (&FullscreenMenuNetSetupLAN::end_modal, boost::ref(*this), - static_cast<int32_t>(CANCEL))); + (&FullscreenMenuNetSetupLAN::clicked_back, boost::ref(*this))); loadlasthost.sigclicked.connect (boost::bind (&FullscreenMenuNetSetupLAN::clicked_lasthost, boost::ref(*this))); @@ -164,6 +163,13 @@ return playername.text(); } +void FullscreenMenuNetSetupLAN::clicked_ok() { + if (hostname.text().empty()) { + clicked_hostgame(); + } else { + clicked_joingame(); + } +} void FullscreenMenuNetSetupLAN::game_selected (uint32_t) { if (opengames.has_selection()) { @@ -243,11 +249,11 @@ // Save selected host so users can reload it for reconnection. g_options.pull_section("global").set_string("lasthost", hostname.text()); - end_modal(JOINGAME); + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kJoingame); } void FullscreenMenuNetSetupLAN::clicked_hostgame() { - end_modal(HOSTGAME); + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kHostgame); } void FullscreenMenuNetSetupLAN::clicked_lasthost() { === modified file 'src/ui_fsmenu/netsetup_lan.h' --- src/ui_fsmenu/netsetup_lan.h 2014-11-13 08:39:14 +0000 +++ src/ui_fsmenu/netsetup_lan.h 2015-08-06 17:33:02 +0000 @@ -36,12 +36,6 @@ class FullscreenMenuNetSetupLAN : public FullscreenMenuBase { public: - enum { - CANCEL = 0, - HOSTGAME, - JOINGAME, - }; - FullscreenMenuNetSetupLAN (); void think() override; @@ -59,6 +53,9 @@ */ const std::string & get_playername(); +protected: + void clicked_ok() override; + private: uint32_t m_butx; uint32_t m_butw; === modified file 'src/ui_fsmenu/options.cc' --- src/ui_fsmenu/options.cc 2015-08-02 10:12:49 +0000 +++ src/ui_fsmenu/options.cc 2015-08-06 17:33:02 +0000 @@ -305,10 +305,8 @@ { m_advanced_options.sigclicked.connect (boost::bind(&FullscreenMenuOptions::advanced_options, boost::ref(*this))); - m_cancel.sigclicked.connect - (boost::bind(&FullscreenMenuOptions::end_modal, this, static_cast<int32_t>(om_cancel))); - m_apply.sigclicked.connect - (boost::bind(&FullscreenMenuOptions::end_modal, this, static_cast<int32_t>(om_ok))); + m_cancel.sigclicked.connect(boost::bind(&FullscreenMenuOptions::clicked_back, this)); + m_apply.sigclicked.connect(boost::bind(&FullscreenMenuOptions::clicked_ok, this)); /** TRANSLATORS Options: Save game automatically every: */ m_sb_autosave .add_replacement(0, _("Off")); @@ -396,9 +394,9 @@ void FullscreenMenuOptions::advanced_options() { FullscreenMenuAdvancedOptions aom(os); - if (aom.run() == FullscreenMenuAdvancedOptions::om_ok) { + if (aom.run<FullscreenMenuBase::MenuTarget>() == FullscreenMenuBase::MenuTarget::kOk) { os = aom.get_values(); - end_modal(om_restart); + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kRestart); } } @@ -464,25 +462,6 @@ } -bool FullscreenMenuOptions::handle_key(bool down, SDL_Keysym code) -{ - if (down) { - switch (code.sym) { - case SDLK_KP_ENTER: - case SDLK_RETURN: - end_modal(static_cast<int32_t>(om_ok)); - return true; - case SDLK_ESCAPE: - end_modal(static_cast<int32_t>(om_cancel)); - return true; - default: - break; // not handled - } - } - - return FullscreenMenuBase::handle_key(down, code); -} - OptionsCtrl::OptionsStruct FullscreenMenuOptions::get_values() { const uint32_t res_index = m_reslist.selection_index(); @@ -622,16 +601,8 @@ boost::ref(*this))); } - m_cancel.sigclicked.connect - (boost::bind - (&FullscreenMenuAdvancedOptions::end_modal, - boost::ref(*this), - static_cast<int32_t>(om_cancel))); - m_apply.sigclicked.connect - (boost::bind - (&FullscreenMenuAdvancedOptions::end_modal, - boost::ref(*this), - static_cast<int32_t>(om_ok))); + m_cancel.sigclicked.connect(boost::bind(&FullscreenMenuAdvancedOptions::clicked_back, boost::ref(*this))); + m_apply.sigclicked.connect(boost::bind(&FullscreenMenuAdvancedOptions::clicked_ok, boost::ref(*this))); m_title .set_textstyle(UI::TextStyle::ui_big()); m_message_sound .set_state(opt.message_sound); @@ -640,25 +611,6 @@ m_transparent_chat .set_state(opt.transparent_chat); } -bool FullscreenMenuAdvancedOptions::handle_key(bool down, SDL_Keysym code) -{ - if (down) { - switch (code.sym) { - case SDLK_KP_ENTER: - case SDLK_RETURN: - end_modal(static_cast<int32_t>(om_ok)); - return true; - case SDLK_ESCAPE: - end_modal(static_cast<int32_t>(om_cancel)); - return true; - default: - break; // not handled - } - } - - return FullscreenMenuBase::handle_key(down, code); -} - void FullscreenMenuAdvancedOptions::update_sb_dis_panel_unit() { m_sb_dis_panel.set_unit(ngettext("pixel", "pixels", m_sb_dis_panel.get_value())); } @@ -694,10 +646,10 @@ void OptionsCtrl::handle_menu() { - int32_t i = m_opt_dialog->run(); - if (i != FullscreenMenuOptions::om_cancel) + FullscreenMenuBase::MenuTarget i = m_opt_dialog->run<FullscreenMenuBase::MenuTarget>(); + if (i != FullscreenMenuBase::MenuTarget::kBack) save_options(); - if (i == FullscreenMenuOptions::om_restart) { + if (i == FullscreenMenuBase::MenuTarget::kRestart) { delete m_opt_dialog; m_opt_dialog = new FullscreenMenuOptions(options_struct()); handle_menu(); // Restart general options menu === modified file 'src/ui_fsmenu/options.h' --- src/ui_fsmenu/options.h 2015-01-12 09:19:59 +0000 +++ src/ui_fsmenu/options.h 2015-08-06 17:33:02 +0000 @@ -84,14 +84,6 @@ public: FullscreenMenuOptions(OptionsCtrl::OptionsStruct opt); OptionsCtrl::OptionsStruct get_values(); - enum { - om_cancel = 0, - om_ok = 1, - om_restart = 2 - }; - - /// Handle keypresses - bool handle_key(bool down, SDL_Keysym code) override; private: uint32_t const m_vbutw; @@ -166,13 +158,6 @@ public: FullscreenMenuAdvancedOptions(OptionsCtrl::OptionsStruct opt); OptionsCtrl::OptionsStruct get_values(); - enum { - om_cancel = 0, - om_ok = 1 - }; - - /// Handle keypresses - bool handle_key(bool down, SDL_Keysym code) override; private: void update_sb_dis_panel_unit(); === modified file 'src/ui_fsmenu/singleplayer.cc' --- src/ui_fsmenu/singleplayer.cc 2015-04-18 11:20:53 +0000 +++ src/ui_fsmenu/singleplayer.cc 2015-08-06 17:33:02 +0000 @@ -50,24 +50,24 @@ { new_game.sigclicked.connect (boost::bind - (&FullscreenMenuSinglePlayer::end_modal, + (&FullscreenMenuSinglePlayer::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kNewGame))); + FullscreenMenuBase::MenuTarget::kNewGame)); campaign.sigclicked.connect (boost::bind - (&FullscreenMenuSinglePlayer::end_modal, + (&FullscreenMenuSinglePlayer::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kCampaign))); + FullscreenMenuBase::MenuTarget::kCampaign)); load_game.sigclicked.connect (boost::bind - (&FullscreenMenuSinglePlayer::end_modal, + (&FullscreenMenuSinglePlayer::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kLoadGame))); + FullscreenMenuBase::MenuTarget::kLoadGame)); back.sigclicked.connect (boost::bind - (&FullscreenMenuSinglePlayer::end_modal, + (&FullscreenMenuSinglePlayer::end_modal<FullscreenMenuBase::MenuTarget>, boost::ref(*this), - static_cast<int32_t>(MenuTarget::kBack))); + FullscreenMenuBase::MenuTarget::kBack)); title.set_font(ui_fn(), fs_big(), UI_FONT_CLR_FG); @@ -84,3 +84,7 @@ vbox.set_size(m_butw, get_h() - vbox.get_y()); } + +void FullscreenMenuSinglePlayer::clicked_ok() { + end_modal<FullscreenMenuBase::MenuTarget>(FullscreenMenuBase::MenuTarget::kNewGame); +} === modified file 'src/ui_fsmenu/singleplayer.h' --- src/ui_fsmenu/singleplayer.h 2014-11-13 11:29:20 +0000 +++ src/ui_fsmenu/singleplayer.h 2015-08-06 17:33:02 +0000 @@ -33,12 +33,8 @@ public: FullscreenMenuSinglePlayer(); - enum class MenuTarget: int32_t { - kBack = UI::Panel::dying_code, - kNewGame, - kCampaign, - kLoadGame - }; +protected: + void clicked_ok() override; private: UI::Textarea title; === modified file 'src/wlapplication.cc' --- src/wlapplication.cc 2015-06-09 09:22:36 +0000 +++ src/wlapplication.cc 2015-08-06 17:33:02 +0000 @@ -449,7 +449,7 @@ { FullscreenMenuIntro intro; - intro.run(); + intro.run<FullscreenMenuBase::MenuTarget>(); } g_sound_handler.change_music("menu", 1000); @@ -1049,53 +1049,53 @@ (&mm, messagetitle, message, - UI::WLMessageBox::OK, + UI::WLMessageBox::MBoxType::kOk, UI::Align_Left); - mmb.run(); + mmb.run<UI::Panel::Returncodes>(); message.clear(); messagetitle.clear(); } try { - switch (static_cast<FullscreenMenuMain::MenuTarget>(mm.run())) { - case FullscreenMenuMain::MenuTarget::kTutorial: + switch (mm.run<FullscreenMenuBase::MenuTarget>()) { + case FullscreenMenuBase::MenuTarget::kTutorial: mainmenu_tutorial(); break; - case FullscreenMenuMain::MenuTarget::kSinglePlayer: + case FullscreenMenuBase::MenuTarget::kSinglePlayer: mainmenu_singleplayer(); break; - case FullscreenMenuMain::MenuTarget::kMultiplayer: + case FullscreenMenuBase::MenuTarget::kMultiplayer: mainmenu_multiplayer(); break; - case FullscreenMenuMain::MenuTarget::kReplay: + case FullscreenMenuBase::MenuTarget::kReplay: replay(); break; - case FullscreenMenuMain::MenuTarget::kOptions: { + case FullscreenMenuBase::MenuTarget::kOptions: { Section & s = g_options.pull_section("global"); OptionsCtrl om(s); break; } - case FullscreenMenuMain::MenuTarget::kReadme: { + case FullscreenMenuBase::MenuTarget::kReadme: { FullscreenMenuFileView ff("txts/README.lua"); - ff.run(); + ff.run<FullscreenMenuBase::MenuTarget>(); break; } - case FullscreenMenuMain::MenuTarget::kLicense: { + case FullscreenMenuBase::MenuTarget::kLicense: { FullscreenMenuFileView ff("txts/LICENSE.lua"); - ff.run(); + ff.run<FullscreenMenuBase::MenuTarget>(); break; } - case FullscreenMenuMain::MenuTarget::kAuthors: { + case FullscreenMenuBase::MenuTarget::kAuthors: { FullscreenMenuFileView ff("txts/AUTHORS.lua"); - ff.run(); + ff.run<FullscreenMenuBase::MenuTarget>(); break; } - case FullscreenMenuMain::MenuTarget::kEditor: + case FullscreenMenuBase::MenuTarget::kEditor: EditorInteractive::run_editor(m_filename, m_script_to_run); break; default: - case FullscreenMenuMain::MenuTarget::kExit: + case FullscreenMenuBase::MenuTarget::kExit: return; } } catch (const WLWarning & e) { @@ -1140,7 +1140,7 @@ // Start UI for the tutorials. FullscreenMenuCampaignMapSelect select_campaignmap(true); select_campaignmap.set_campaign(0); - if (select_campaignmap.run() > 0) { + if (select_campaignmap.run<FullscreenMenuBase::MenuTarget>() == FullscreenMenuBase::MenuTarget::kOk) { filename = select_campaignmap.get_map(); } try { @@ -1161,26 +1161,27 @@ */ void WLApplication::mainmenu_singleplayer() { - // This is the code returned by UI::Panel::run() when the panel is dying. + // This is the code returned by UI::Panel::run<Returncode>() when the panel is dying. // Make sure that the program exits when the window manager says so. static_assert - (static_cast<int32_t>(FullscreenMenuSinglePlayer::MenuTarget::kBack) == UI::Panel::dying_code, + (static_cast<int>(FullscreenMenuBase::MenuTarget::kBack) + == static_cast<int>(UI::Panel::Returncodes::kBack), "Panel should be dying."); for (;;) { FullscreenMenuSinglePlayer single_player_menu; - switch (static_cast<FullscreenMenuSinglePlayer::MenuTarget>(single_player_menu.run())) { - case FullscreenMenuSinglePlayer::MenuTarget::kBack: + switch (single_player_menu.run<FullscreenMenuBase::MenuTarget>()) { + case FullscreenMenuBase::MenuTarget::kBack: return; - case FullscreenMenuSinglePlayer::MenuTarget::kNewGame: + case FullscreenMenuBase::MenuTarget::kNewGame: if (new_game()) return; break; - case FullscreenMenuSinglePlayer::MenuTarget::kLoadGame: + case FullscreenMenuBase::MenuTarget::kLoadGame: if (load_game()) return; break; - case FullscreenMenuSinglePlayer::MenuTarget::kCampaign: + case FullscreenMenuBase::MenuTarget::kCampaign: if (campaign_game()) return; break; @@ -1197,17 +1198,17 @@ */ void WLApplication::mainmenu_multiplayer() { - int32_t menu_result = FullscreenMenuNetSetupLAN::JOINGAME; // dummy init; + FullscreenMenuBase::MenuTarget menu_result = FullscreenMenuBase::MenuTarget::kJoingame; // dummy init; for (;;) { // stay in menu until player clicks "back" button bool internet = false; FullscreenMenuMultiPlayer mp; - switch (static_cast<FullscreenMenuMultiPlayer::MenuTarget>(mp.run())) { - case FullscreenMenuMultiPlayer::MenuTarget::kBack: + switch (mp.run<FullscreenMenuBase::MenuTarget>()) { + case FullscreenMenuBase::MenuTarget::kBack: return; - case FullscreenMenuMultiPlayer::MenuTarget::kMetaserver: + case FullscreenMenuBase::MenuTarget::kMetaserver: internet = true; break; - case FullscreenMenuMultiPlayer::MenuTarget::kLan: + case FullscreenMenuBase::MenuTarget::kLan: break; default: assert(false); @@ -1227,7 +1228,7 @@ // reinitalise in every run, else graphics look strange FullscreenMenuInternetLobby ns(playername.c_str(), password.c_str(), registered); - ns.run(); + ns.run<FullscreenMenuBase::MenuTarget>(); if (InternetGaming::ref().logged_in()) // logout of the metaserver @@ -1238,19 +1239,19 @@ } else { // reinitalise in every run, else graphics look strange FullscreenMenuNetSetupLAN ns; - menu_result = ns.run(); + menu_result = ns.run<FullscreenMenuBase::MenuTarget>(); std::string playername = ns.get_playername(); uint32_t addr; uint16_t port; bool const host_address = ns.get_host_address(addr, port); switch (menu_result) { - case FullscreenMenuNetSetupLAN::HOSTGAME: { + case FullscreenMenuBase::MenuTarget::kHostgame: { NetHost netgame(playername); netgame.run(); break; } - case FullscreenMenuNetSetupLAN::JOINGAME: { + case FullscreenMenuBase::MenuTarget::kJoingame: { IPaddress peer; if (!host_address) @@ -1283,12 +1284,13 @@ { SinglePlayerGameSettingsProvider sp; FullscreenMenuLaunchSPG lgm(&sp); - const int32_t code = lgm.run(); + const FullscreenMenuBase::MenuTarget code = lgm.run<FullscreenMenuBase::MenuTarget>(); Widelands::Game game; - if (code <= 0) + if (code == FullscreenMenuBase::MenuTarget::kBack) { return false; - if (code == 2) { // scenario + } + if (code == FullscreenMenuBase::MenuTarget::kScenarioGame) { // scenario try { game.run_splayer_scenario_direct(sp.get_map().c_str(), ""); } catch (const std::exception & e) { @@ -1346,7 +1348,7 @@ SinglePlayerGameSettingsProvider sp; FullscreenMenuLoadGame ssg(game, &sp, nullptr); - if (ssg.run() > 0) + if (ssg.run<FullscreenMenuBase::MenuTarget>() == FullscreenMenuBase::MenuTarget::kOk) filename = ssg.filename(); else return false; @@ -1378,7 +1380,7 @@ int32_t campaign; { // First start UI for selecting the campaign. FullscreenMenuCampaignSelect select_campaign; - if (select_campaign.run() > 0) + if (select_campaign.run<FullscreenMenuBase::MenuTarget>() == FullscreenMenuBase::MenuTarget::kOk) campaign = select_campaign.get_campaign(); else { // back was pressed filename = ""; @@ -1388,7 +1390,7 @@ // Then start UI for the selected campaign. FullscreenMenuCampaignMapSelect select_campaignmap; select_campaignmap.set_campaign(campaign); - if (select_campaignmap.run() > 0) { + if (select_campaignmap.run<FullscreenMenuBase::MenuTarget>() == FullscreenMenuBase::MenuTarget::kOk) { filename = select_campaignmap.get_map(); break; } @@ -1414,7 +1416,7 @@ if (m_filename.empty()) { SinglePlayerGameSettingsProvider sp; FullscreenMenuLoadGame rm(game, &sp, nullptr, true); - if (rm.run() <= 0) + if (rm.run<FullscreenMenuBase::MenuTarget>() == FullscreenMenuBase::MenuTarget::kBack) return; m_filename = rm.filename(); === modified file 'src/wui/game_main_menu_save_game.cc' --- src/wui/game_main_menu_save_game.cc 2015-07-29 06:01:48 +0000 +++ src/wui/game_main_menu_save_game.cc 2015-08-06 17:33:02 +0000 @@ -245,8 +245,8 @@ "Reason given:\n"); s += error; UI::WLMessageBox mbox - (&igbase, _("Save Game Error!"), s, UI::WLMessageBox::OK); - mbox.run(); + (&igbase, _("Save Game Error!"), s, UI::WLMessageBox::MBoxType::kOk); + mbox.run<UI::Panel::Returncodes>(); } game.save_handler().set_current_filename(complete_filename); } @@ -260,7 +260,7 @@ _("Save Game Error!"), (boost::format(_("A file with the name ‘%s’ already exists. Overwrite?")) % FileSystem::fs_filename(filename.c_str())).str(), - YESNO), + MBoxType::kOkCancel), m_filename(filename) {} @@ -269,14 +269,14 @@ } - void pressed_yes() override + void clicked_ok() override { g_fs->fs_unlink(m_filename); dosave(menu_save_game().igbase(), m_filename); menu_save_game().die(); } - void pressed_no() override + void clicked_back() override { die(); } @@ -324,18 +324,18 @@ str (boost::format(_("Do you really want to delete the file %s?")) % FileSystem::fs_filename(filename.c_str())), - YESNO), + MBoxType::kOkCancel), m_filename(filename) {} - void pressed_yes() override + void clicked_ok() override { g_fs->fs_unlink(m_filename); dynamic_cast<GameMainMenuSaveGame&>(*get_parent()).fill_list(); die(); } - void pressed_no() override + void clicked_back() override { die(); } === modified file 'src/wui/game_options_menu.cc' --- src/wui/game_options_menu.cc 2015-05-07 09:05:58 +0000 +++ src/wui/game_options_menu.cc 2015-08-06 17:33:02 +0000 @@ -39,15 +39,15 @@ /** TRANSLATORS: Window label when "Exit game" has been pressed */ _("Exit Game Confirmation"), _("Are you sure you wish to exit this game?"), - YESNO), + MBoxType::kOkCancel), m_gb(gb) { } - void pressed_yes() override { - m_gb.end_modal(0); + void clicked_ok() override { + m_gb.end_modal<UI::Panel::Returncodes>(UI::Panel::Returncodes::kBack); } - void pressed_no() override { + void clicked_back() override { die(); } @@ -183,7 +183,7 @@ void GameOptionsMenu::clicked_exit_game() { if (get_key_state(SDL_SCANCODE_LCTRL) || get_key_state(SDL_SCANCODE_RCTRL)) { - m_gb.end_modal(0); + m_gb.end_modal<UI::Panel::Returncodes>(UI::Panel::Returncodes::kBack); } else { new GameOptionsMenuExitConfirmBox(*get_parent(), m_gb); === modified file 'src/wui/game_summary.cc' --- src/wui/game_summary.cc 2015-08-04 07:49:23 +0000 +++ src/wui/game_summary.cc 2015-08-06 17:33:02 +0000 @@ -220,7 +220,7 @@ void GameSummaryScreen::stop_clicked() { - m_game.get_ibase()->end_modal(0); + m_game.get_ibase()->end_modal<UI::Panel::Returncodes>(UI::Panel::Returncodes::kBack); } void GameSummaryScreen::player_selected(uint32_t entry_index) === modified file 'src/wui/interactive_spectator.cc' --- src/wui/interactive_spectator.cc 2015-02-16 12:42:35 +0000 +++ src/wui/interactive_spectator.cc 2015-08-06 17:33:02 +0000 @@ -171,7 +171,7 @@ if (is_multiplayer()) { return; } - end_modal(0); + end_modal<UI::Panel::Returncodes>(UI::Panel::Returncodes::kBack); } === modified file 'src/wui/login_box.cc' --- src/wui/login_box.cc 2014-09-29 19:25:24 +0000 +++ src/wui/login_box.cc 2015-08-06 17:33:02 +0000 @@ -65,13 +65,13 @@ 200, 20, g_gr->images().get("pics/but0.png"), _("Login")); - loginbtn->sigclicked.connect(boost::bind(&LoginBox::pressed_login, boost::ref(*this))); + loginbtn->sigclicked.connect(boost::bind(&LoginBox::clicked_ok, boost::ref(*this))); UI::Button * cancelbtn = new UI::Button (this, "cancel", (get_inner_w() / 2 - 200) / 2 + get_inner_w() / 2, loginbtn->get_y(), 200, 20, g_gr->images().get("pics/but1.png"), _("Cancel")); - cancelbtn->sigclicked.connect(boost::bind(&LoginBox::pressed_cancel, boost::ref(*this))); + cancelbtn->sigclicked.connect(boost::bind(&LoginBox::clicked_back, boost::ref(*this))); Section & s = g_options.pull_section("global"); eb_nickname->set_text(s.get_string("nickname", _("nobody"))); @@ -81,37 +81,54 @@ /// called, if "login" is pressed -void LoginBox::pressed_login() +void LoginBox::clicked_ok() { // Check if all needed input fields are valid if (eb_nickname->text().empty()) { UI::WLMessageBox mb (this, _("Empty Nickname"), _("Please enter a nickname!"), - UI::WLMessageBox::OK); - mb.run(); + UI::WLMessageBox::MBoxType::kOk); + mb.run<UI::Panel::Returncodes>(); return; } if (eb_nickname->text().find(' ') <= eb_nickname->text().size()) { UI::WLMessageBox mb (this, _("Space in Nickname"), _("Sorry, but spaces are not allowed in nicknames!"), - UI::WLMessageBox::OK); - mb.run(); + UI::WLMessageBox::MBoxType::kOk); + mb.run<UI::Panel::Returncodes>(); return; } if (eb_password->text().empty() && cb_register->get_state()) { UI::WLMessageBox mb (this, _("Empty Password"), _("Please enter your password!"), - UI::WLMessageBox::OK); - mb.run(); + UI::WLMessageBox::MBoxType::kOk); + mb.run<UI::Panel::Returncodes>(); return; } - end_modal(1); + end_modal<UI::Panel::Returncodes>(UI::Panel::Returncodes::kOk); } /// Called if "cancel" was pressed -void LoginBox::pressed_cancel() +void LoginBox::clicked_back() { + end_modal<UI::Panel::Returncodes>(UI::Panel::Returncodes::kBack); +} + +bool LoginBox::handle_key(bool down, SDL_Keysym code) { - end_modal(0); + if (down) { + switch (code.sym) { + case SDLK_KP_ENTER: + case SDLK_RETURN: + clicked_ok(); + return true; + case SDLK_ESCAPE: + clicked_back(); + return true; + default: + break; // not handled + } + } + return UI::Panel::handle_key(down, code); } === modified file 'src/wui/login_box.h' --- src/wui/login_box.h 2014-09-29 19:25:24 +0000 +++ src/wui/login_box.h 2015-08-06 17:33:02 +0000 @@ -34,11 +34,13 @@ bool registered() {return cb_register->get_state();} bool set_automaticlog() {return cb_auto_log->get_state();} -private: - void pressed_login(); - void pressed_cancel(); - -private: + /// Handle keypresses + bool handle_key(bool down, SDL_Keysym code) override; + +private: + void clicked_back(); + void clicked_ok(); + UI::EditBox * eb_nickname; UI::EditBox * eb_password; UI::Checkbox * cb_register; === modified file 'src/wui/story_message_box.cc' --- src/wui/story_message_box.cc 2014-09-10 14:48:40 +0000 +++ src/wui/story_message_box.cc 2015-08-06 17:33:02 +0000 @@ -82,8 +82,7 @@ * Clicked */ void StoryMessageBox::clicked_ok() { - end_modal(0); - return; + end_modal<UI::Panel::Returncodes>(UI::Panel::Returncodes::kOk); } /* @@ -97,3 +96,18 @@ return UI::Window::handle_mousepress(btn, mx, my); } + +bool StoryMessageBox::handle_key(bool down, SDL_Keysym code) +{ + if (down) { + switch (code.sym) { + case SDLK_KP_ENTER: + case SDLK_RETURN: + clicked_ok(); + return true; + default: + break; // not handled + } + } + return UI::Panel::handle_key(down, code); +} === modified file 'src/wui/story_message_box.h' --- src/wui/story_message_box.h 2014-09-10 13:03:40 +0000 +++ src/wui/story_message_box.h 2015-08-06 17:33:02 +0000 @@ -32,6 +32,9 @@ bool handle_mousepress(uint8_t btn, int32_t mx, int32_t my) override; + /// Handle keypresses + bool handle_key(bool down, SDL_Keysym code) override; + private: void clicked_ok(); };
_______________________________________________ Mailing list: https://launchpad.net/~widelands-dev Post to : widelands-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~widelands-dev More help : https://help.launchpad.net/ListHelp