Added default and cancel button to the Dialog
authorIngo Ruhnke <grumbel@gmail.com>
Wed, 27 Aug 2014 07:37:56 +0000 (09:37 +0200)
committerIngo Ruhnke <grumbel@gmail.com>
Wed, 27 Aug 2014 07:37:56 +0000 (09:37 +0200)
src/gui/dialog.cpp
src/gui/dialog.hpp
src/supertux/menu/download_dialog.cpp
src/supertux/menu/main_menu.cpp

index b10f299..d489911 100644 (file)
@@ -30,6 +30,7 @@ Dialog::Dialog() :
   m_text(),
   m_buttons(),
   m_selected_button(),
+  m_cancel_button(-1),
   m_text_size()
 {
 }
@@ -53,17 +54,27 @@ Dialog::clear_buttons()
 {
   m_buttons.clear();
   m_selected_button = 0;
+  m_cancel_button = -1;
 }
 
 void
-Dialog::add_button(const std::string& text, const std::function<void ()>& callback, bool focus)
+Dialog::add_default_button(const std::string& text, const std::function<void ()>& callback)
 {
-  m_buttons.push_back({text, callback});
+  add_button(text, callback);
+  m_selected_button = m_buttons.size() - 1;
+}
 
-  if (focus)
-  {
-    m_selected_button = m_buttons.size() - 1;
-  }
+void
+Dialog::add_cancel_button(const std::string& text, const std::function<void ()>& callback)
+{
+  add_button(text, callback);
+  m_cancel_button = m_buttons.size() - 1;
+}
+
+void
+Dialog::add_button(const std::string& text, const std::function<void ()>& callback)
+{
+  m_buttons.push_back({text, callback});
 }
 
 int
@@ -104,9 +115,6 @@ Dialog::event(const SDL_Event& ev)
       {
         m_selected_button = new_button;
         on_button_click(m_selected_button);
-
-        // warning: this will "delete this"
-        MenuManager::instance().set_dialog({});
       }
     }
     break;
@@ -153,9 +161,12 @@ Dialog::process_input(const Controller& controller)
       controller.pressed(Controller::MENU_SELECT))
   {
     on_button_click(m_selected_button);
+  }
 
-    // warning: this will "delete this"
-    MenuManager::instance().set_dialog({});
+  if (m_cancel_button != -1 &&
+      controller.pressed(Controller::MENU_BACK))
+  {
+    on_button_click(m_cancel_button);
   }
 }
 
@@ -230,6 +241,7 @@ Dialog::on_button_click(int button) const
   {
     m_buttons[button].callback();
   }
+  MenuManager::instance().set_dialog({});
 }
 
 /* EOF */
index 86c499a..2f8b735 100644 (file)
@@ -39,6 +39,7 @@ private:
   std::string m_text;
   std::vector<Button> m_buttons;
   int m_selected_button;
+  int m_cancel_button;
 
   Sizef m_text_size;
 
@@ -47,9 +48,17 @@ public:
   virtual ~Dialog();
 
   void set_text(const std::string& text);
+
+  void add_button(const std::string& text, const std::function<void ()>& callback = {});
+
+  /** The default gets focused when the dialog is first shown */
+  void add_default_button(const std::string& text, const std::function<void ()>& callback = {});
+
+  /** The cancel button can not only be activated by selecting it, but
+      via the MENU_BACK button */
+  void add_cancel_button(const std::string& text, const std::function<void ()>& callback = {});
+
   void clear_buttons();
-  void add_button(const std::string& text, const std::function<void ()>& callback = {},
-                  bool focus = false);
 
   void event(const SDL_Event& event);
   void process_input(const Controller& controller);
index 17864e0..937ec32 100644 (file)
@@ -25,7 +25,7 @@ DownloadDialog::DownloadDialog(TransferStatusPtr status) :
   m_status(status),
   m_title()
 {
-  add_button(_("Abort Download"), [this]{
+  add_default_button(_("Abort Download"), [this]{
       on_abort();
     });
 
index 615c0aa..c6a1001 100644 (file)
@@ -83,12 +83,12 @@ MainMenu::menu_action(MenuItem* item)
     case MNID_QUITMAINMENU:
       std::unique_ptr<Dialog> dialog(new Dialog);
       dialog->set_text(_("Do you really want to quit SuperTux?"));
-      dialog->add_button(_("Cancel"));
-      dialog->add_button(_("Quit SuperTux"), [] {
+      dialog->add_cancel_button(_("Cancel"));
+      dialog->add_default_button(_("Quit SuperTux"), [] {
           MenuManager::instance().clear_menu_stack();
           ScreenManager::current()->quit(std::unique_ptr<ScreenFade>(new FadeOut(0.25)));
           SoundManager::current()->stop_music(0.25);
-        }, true);
+        });
       MenuManager::instance().set_dialog(std::move(dialog));
       break;
   }