Author: mordante
Date: Wed May 13 19:57:34 2009
New Revision: 35622

URL: http://svn.gna.org/viewcvs/wesnoth?rev=35622&view=rev
Log:
The tmessage dialog can now show up to 4 buttons.

Modified:
    trunk/changelog
    trunk/data/gui/default/window/message.cfg
    trunk/src/gui/dialogs/message.cpp
    trunk/src/gui/dialogs/message.hpp

Modified: trunk/changelog
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/changelog?rev=35622&r1=35621&r2=35622&view=diff
==============================================================================
--- trunk/changelog (original)
+++ trunk/changelog Wed May 13 19:57:34 2009
@@ -103,6 +103,7 @@
      now causes a capture of that village.
    * Rewrote the layout algoritm (still a work in progress)
    * Fixed an multi-character UTF-8 handling bug in the password textbox
+   * Changed the tmessage dialog to be able to show four buttons
  * WML Engine:
    * Added [show_objectives] tag and allowed [show_if] tag in [objective]
      tags. (bug #13042)

Modified: trunk/data/gui/default/window/message.cfg
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/data/gui/default/window/message.cfg?rev=35622&r1=35621&r2=35622&view=diff
==============================================================================
--- trunk/data/gui/default/window/message.cfg (original)
+++ trunk/data/gui/default/window/message.cfg Wed May 13 19:57:34 2009
@@ -88,19 +88,73 @@
                        [row]
 
                                [column]
-                                       border = "all"
-                                       border_size = 5
-                                       horizontal_alignment = "center"
 
-                                       [button]
-                                               # This button will be shown or 
hidden depending on the
-                                               # whether or not a scrollbar is 
needed to show the
-                                               # text.
-                                               id = "ok"
-                                               definition = "default"
+                                       [grid]  
 
-                                               label = "close"
-                                       [/button]
+                                               [row]
+
+                                                       # This button will be 
shown or hidden depending on the
+                                                       # whether or not a 
scrollbar is needed to show the
+                                                       # text.
+                                                       [column]
+                                                               border = "all"
+                                                               border_size = 5
+                                                               
horizontal_alignment = "center"
+
+                                                               [button]
+                                                                       id = 
"left_side"
+                                                                       
definition = "default"
+
+                                                                       label = 
""
+                                                               [/button]
+
+                                                       [/column]
+
+                                                       [column]
+                                                               border = "all"
+                                                               border_size = 5
+                                                               
horizontal_alignment = "center"
+
+                                                               [button]
+                                                                       id = 
"cancel"
+                                                                       
definition = "default"
+
+                                                                       label = 
_ "Cancel"
+                                                               [/button]
+
+                                                       [/column]
+
+                                                       [column]
+                                                               border = "all"
+                                                               border_size = 5
+                                                               
horizontal_alignment = "center"
+
+                                                               [button]
+                                                                       id = 
"ok"
+                                                                       
definition = "default"
+
+                                                                       label = 
_ "Close"
+                                                               [/button]
+
+                                                       [/column]
+
+                                                       [column]
+                                                               border = "all"
+                                                               border_size = 5
+                                                               
horizontal_alignment = "center"
+
+                                                               [button]
+                                                                       id = 
"right_side"
+                                                                       
definition = "default"
+
+                                                                       label = 
""
+                                                               [/button]
+
+                                                       [/column]
+
+                                               [/row]
+
+                                       [/grid]
 
                                [/column]
 
@@ -111,3 +165,4 @@
        [/resolution]
 
 [/window]
+

Modified: trunk/src/gui/dialogs/message.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/dialogs/message.cpp?rev=35622&r1=35621&r2=35622&view=diff
==============================================================================
--- trunk/src/gui/dialogs/message.cpp (original)
+++ trunk/src/gui/dialogs/message.cpp Wed May 13 19:57:34 2009
@@ -16,6 +16,7 @@
 
 #include "gui/dialogs/message.hpp"
 
+#include "foreach.hpp"
 #include "gui/widgets/button.hpp"
 #include "gui/widgets/image.hpp"
 #include "gui/widgets/label.hpp"
@@ -23,8 +24,53 @@
 
 namespace gui2 {
 
+/**
+ * Helper to implement private functions without modifing the header.
+ *
+ * The class is a helper to avoid recompilation and only has static
+ * functions.
+ */
+struct tmessage_implementation
+{
+       /**
+        * Initialiazes a button.
+        * 
+        * @param window              The window that contains the button.
+        * @param button_status       The button status to modify.
+        * @param id                  The id of the button.
+        */
+       static void
+       init_button(twindow& window, tmessage::tbutton_status& button_status,
+                       const std::string& id)
+       {
+               button_status.button =
+                       dynamic_cast<tbutton*>(window.find_widget(id, false));
+               VALIDATE(button_status.button, missing_widget(id));
+               button_status.button->set_visible(button_status.visible);
+
+               if(!button_status.caption.empty()) {
+                       button_status.button->set_label(button_status.caption);
+               }
+
+               if(button_status.retval != twindow::NONE) {
+                       button_status.button->set_retval(button_status.retval);
+               }
+       }
+};
+
 void tmessage::pre_show(CVideo& /*video*/, twindow& window)
 {
+       // ***** Validate the required buttons ***** ***** ***** *****
+       tmessage_implementation::
+                       init_button(window, buttons_[left_1], "left_side");
+       tmessage_implementation::
+                       init_button(window, buttons_[cancel], "cancel");
+       tmessage_implementation::
+                       init_button(window, buttons_[ok] ,"ok");
+       tmessage_implementation::
+                       init_button(window, buttons_[right_1], "right_side");
+
+       // ***** ***** ***** ***** Set up the widgets ***** ***** ***** *****
        if(!title_.empty()) {
                tlabel* title =
                        dynamic_cast<tlabel*>(window.find_widget("title", 
false));
@@ -58,16 +104,54 @@
                 * and thus not need a scrollbar. Also when the button is 
visible
                 * easy_close will always return false.
                 */
-               tbutton* button =
-                       dynamic_cast<tbutton*>(window.find_widget("ok", false));
-               VALIDATE(button, missing_widget("ok"));
-               button->set_visible(twidget::INVISIBLE);
                window.layout();
 
                if(! window.does_easy_close()) {
-                       button->set_visible(twidget::VISIBLE);
+                       set_button_visible(ok, twidget::VISIBLE);
                }
        }
+}
+
+void tmessage::post_show(twindow& /*window*/)
+{
+       foreach(tbutton_status& button_status, buttons_) {
+               button_status.button = NULL;
+       }
+}
+
+void tmessage::set_button_caption(const tbutton_id button,
+               const std::string& caption)
+{
+       buttons_[button].caption = caption;
+       if(buttons_[button].button) {
+               buttons_[button].button->set_label(caption);
+       }
+}
+
+void tmessage::set_button_visible(const tbutton_id button,
+               const twidget::tvisible visible)
+{
+       buttons_[button].visible = visible;
+       if(buttons_[button].button) {
+               buttons_[button].button->set_visible(visible);
+       }
+}
+
+void tmessage::set_button_retval(const tbutton_id button,
+               const int retval)
+{
+       buttons_[button].retval = retval;
+       if(buttons_[button].button) {
+               buttons_[button].button->set_retval(retval);
+       }
+}
+
+tmessage::tbutton_status::tbutton_status()
+       : button(NULL)
+       , caption()
+       , visible(twidget::INVISIBLE)
+       , retval(twindow::NONE)
+{
 }
 
 twindow* tmessage::build_window(CVideo& video)

Modified: trunk/src/gui/dialogs/message.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/dialogs/message.hpp?rev=35622&r1=35621&r2=35622&view=diff
==============================================================================
--- trunk/src/gui/dialogs/message.hpp (original)
+++ trunk/src/gui/dialogs/message.hpp Wed May 13 19:57:34 2009
@@ -15,18 +15,22 @@
 #ifndef GUI_DIALOGS_MESSAGE_HPP_INCLUDED
 #define GUI_DIALOGS_MESSAGE_HPP_INCLUDED
 
+#include "gui/widgets/widget.hpp"
 #include "gui/dialogs/dialog.hpp"
 
 namespace gui2 {
 
+class tbutton;
+
 /**
  * Main class to show messages to the user.
  *
- * It can be used to show a message or ask a result from the user. For the most
- * common usage cases there are helper functions defined.
+ * It can be used to show a message or ask a result from the user. For the
+ * most common usage cases there are helper functions defined.
  */
 class tmessage : public tdialog
 {
+       friend struct tmessage_implementation;
 public:
        tmessage(const std::string& title, const std::string& message,
                        const bool auto_close)
@@ -34,7 +38,25 @@
                , image_()
                , message_(message)
                , auto_close_(auto_close)
+               , buttons_(count)
        {}
+
+       enum tbutton_id {
+                 left_1 = 0
+               , cancel
+               , ok
+               , right_1
+               , count
+       };
+
+       void set_button_caption(const tbutton_id button,
+                       const std::string& caption);
+
+       void set_button_visible(const tbutton_id button,
+                       const twidget::tvisible visible);
+
+       void set_button_retval(const tbutton_id button,
+                       const int retval);
 
        /***** ***** ***** setters / getters for members ***** ****** *****/
 
@@ -49,6 +71,9 @@
 protected:
        /** Inherited from tdialog. */
        void pre_show(CVideo& video, twindow& window);
+
+       /** Inherited from tdialog. */
+       void post_show(twindow& window);
 
 private:
        /** The title for the dialog. */
@@ -69,6 +94,19 @@
         * scrollbar.
         */
        bool auto_close_;
+
+       struct tbutton_status
+       {
+               tbutton_status();
+
+               tbutton* button;
+               std::string caption;
+               twidget::tvisible visible;
+               int retval;
+       };
+
+       /** Holds a pointer to the buttons. */
+       std::vector<tbutton_status> buttons_;
 
        /** Inherited from tdialog. */
        twindow* build_window(CVideo& video);


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to