gui/widgets/toggle_button.cpp

Go to the documentation of this file.
00001 /* $Id: toggle_button.cpp 52533 2012-01-07 02:35:17Z shadowmaster $ */
00002 /*
00003    Copyright (C) 2008 - 2012 by Mark de Wever <koraq@xs4all.nl>
00004    Part of the Battle for Wesnoth Project http://www.wesnoth.org/
00005 
00006    This program is free software; you can redistribute it and/or modify
00007    it under the terms of the GNU General Public License as published by
00008    the Free Software Foundation; either version 2 of the License, or
00009    (at your option) any later version.
00010    This program is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY.
00012 
00013    See the COPYING file for more details.
00014 */
00015 
00016 #define GETTEXT_DOMAIN "wesnoth-lib"
00017 
00018 #include "gui/widgets/toggle_button.hpp"
00019 
00020 #include "foreach.hpp"
00021 #include "gui/auxiliary/log.hpp"
00022 #include "gui/auxiliary/widget_definition/toggle_button.hpp"
00023 #include "gui/auxiliary/window_builder/toggle_button.hpp"
00024 #include "gui/widgets/settings.hpp"
00025 #include "gui/widgets/window.hpp"
00026 #include "sound.hpp"
00027 
00028 #include <boost/bind.hpp>
00029 
00030 #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__
00031 #define LOG_HEADER LOG_SCOPE_HEADER + ':'
00032 
00033 namespace gui2 {
00034 
00035 REGISTER_WIDGET(toggle_button)
00036 
00037 ttoggle_button::ttoggle_button()
00038     : tcontrol(COUNT)
00039     , state_(ENABLED)
00040     , retval_(0)
00041     , callback_state_change_()
00042     , icon_name_()
00043 {
00044     connect_signal<event::MOUSE_ENTER>(boost::bind(
00045                 &ttoggle_button::signal_handler_mouse_enter, this, _2, _3));
00046     connect_signal<event::MOUSE_LEAVE>(boost::bind(
00047                 &ttoggle_button::signal_handler_mouse_leave, this, _2, _3));
00048 
00049     connect_signal<event::LEFT_BUTTON_CLICK>(boost::bind(
00050                 &ttoggle_button::signal_handler_left_button_click
00051                     , this, _2, _3));
00052     connect_signal<event::LEFT_BUTTON_DOUBLE_CLICK>(boost::bind(
00053                 &ttoggle_button::signal_handler_left_button_double_click
00054                     , this, _2, _3));
00055 }
00056 
00057 void ttoggle_button::set_members(const string_map& data)
00058 {
00059     // Inherit
00060     tcontrol::set_members(data);
00061 
00062     string_map::const_iterator itor = data.find("icon");
00063     if(itor != data.end()) {
00064         set_icon_name(itor->second);
00065     }
00066 }
00067 
00068 void ttoggle_button::set_active(const bool active)
00069 {
00070     if(active) {
00071         if(get_value()) {
00072             set_state(ENABLED_SELECTED);
00073         } else {
00074             set_state(ENABLED);
00075         }
00076     } else {
00077         if(get_value()) {
00078             set_state(DISABLED_SELECTED);
00079         } else {
00080             set_state(DISABLED);
00081         }
00082     }
00083 }
00084 
00085 void ttoggle_button::update_canvas()
00086 {
00087     // Inherit.
00088     tcontrol::update_canvas();
00089 
00090     // set icon in canvases
00091     std::vector<tcanvas>& canvases = tcontrol::canvas();
00092     foreach(tcanvas& canvas, canvases) {
00093         canvas.set_variable("icon", variant(icon_name_));
00094     }
00095 
00096     set_dirty();
00097 }
00098 
00099 void ttoggle_button::set_value(const bool selected)
00100 {
00101     if(selected == get_value()) {
00102         return;
00103     }
00104 
00105     if(selected) {
00106         set_state(static_cast<tstate>(state_ + ENABLED_SELECTED));
00107     } else {
00108         set_state(static_cast<tstate>(state_ - ENABLED_SELECTED));
00109     }
00110 }
00111 
00112 void ttoggle_button::set_retval(const int retval)
00113 {
00114     if(retval == retval_) {
00115         return;
00116     }
00117 
00118     retval_ = retval;
00119     set_wants_mouse_left_double_click(retval_ != 0);
00120 }
00121 
00122 void ttoggle_button::set_state(const tstate state)
00123 {
00124     if(state != state_) {
00125         state_ = state;
00126         set_dirty(true);
00127     }
00128 }
00129 
00130 const std::string& ttoggle_button::get_control_type() const
00131 {
00132     static const std::string type = "toggle_button";
00133     return type;
00134 }
00135 
00136 void ttoggle_button::signal_handler_mouse_enter(
00137         const event::tevent event, bool& handled)
00138 {
00139     DBG_GUI_E << LOG_HEADER << ' ' << event << ".\n";
00140 
00141     if(get_value()) {
00142         set_state(FOCUSSED_SELECTED);
00143     } else {
00144         set_state(FOCUSSED);
00145     }
00146     handled = true;
00147 }
00148 
00149 void ttoggle_button::signal_handler_mouse_leave(
00150         const event::tevent event, bool& handled)
00151 {
00152     DBG_GUI_E << LOG_HEADER << ' ' << event << ".\n";
00153 
00154     if(get_value()) {
00155         set_state(ENABLED_SELECTED);
00156     } else {
00157         set_state(ENABLED);
00158     }
00159     handled = true;
00160 }
00161 
00162 void ttoggle_button::signal_handler_left_button_click(
00163         const event::tevent event, bool& handled)
00164 {
00165     DBG_GUI_E << LOG_HEADER << ' ' << event << ".\n";
00166 
00167     sound::play_UI_sound(settings::sound_toggle_button_click);
00168 
00169     if(get_value()) {
00170         set_state(ENABLED);
00171     } else {
00172         set_state(ENABLED_SELECTED);
00173     }
00174 
00175     if(callback_state_change_) {
00176         callback_state_change_(this);
00177     }
00178     handled = true;
00179 }
00180 
00181 void ttoggle_button::signal_handler_left_button_double_click(
00182         const event::tevent event, bool& handled)
00183 {
00184     DBG_GUI_E << LOG_HEADER << ' ' << event << ".\n";
00185 
00186     if(retval_ == 0) {
00187         return;
00188     }
00189 
00190     twindow* window = get_window();
00191     assert(window);
00192 
00193     window->set_retval(retval_);
00194 
00195     handled = true;
00196 }
00197 } // namespace gui2
00198 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated by doxygen 1.7.1 on Fri May 25 2012 01:02:56 for The Battle for Wesnoth
Gna! | Forum | Wiki | CIA | devdocs