Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
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
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
00088 tcontrol::update_canvas();
00089
00090
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 }
00198