]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/toggle.cpp
Make autosize_special const and add a const autosize overload
[libs/gltk.git] / source / toggle.cpp
index 2e3488ac24a465fe890820d2dff877cfdb2bfc7d..b597eb99d32ad73eb02123e2fa83429d7836977f 100644 (file)
-/* $Id$
-
-This file is part of libmspgltk
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
+#include "panel.h"
 #include "part.h"
+#include "style.h"
 #include "toggle.h"
 
+using namespace std;
+
 namespace Msp {
 namespace GLtk {
 
-Toggle::Toggle(const Resources &r):
-       Widget(r),
-       value(false)
+Toggle::Toggle(const string &t):
+       text(),
+       pressed(false),
+       value(false),
+       exclusive(false)
 {
-       update_style();
+       set_text(t);
 }
 
-void Toggle::button_release(int x, int y, unsigned btn)
+void Toggle::autosize_special(const Part &part, Geometry &ageom) const
 {
-       if(btn==1)
+       if(part.get_name()=="text")
+               text.autosize(part, ageom);
+}
+
+void Toggle::set_text(const string &t)
+{
+       text = t;
+       signal_autosize_changed.emit();
+       rebuild();
+}
+
+void Toggle::set_exclusive(bool e)
+{
+       exclusive = e;
+       if(exclusive && value)
+               exclude_siblings();
+}
+
+void Toggle::exclude_siblings()
+{
+       const list<Widget *> &siblings = parent->get_children();
+       for(list<Widget *>::const_iterator i=siblings.begin(); i!=siblings.end(); ++i)
+               if(Toggle *tgl = dynamic_cast<Toggle *>(*i))
+                       if(tgl!=this && tgl->get_exclusive() && tgl->get_value())
+                               tgl->set_value(false);
+}
+
+void Toggle::set_value(bool v)
+{
+       bool old_value = value;
+
+       value = v;
+       if(value)
        {
-               if(geom.is_inside_relative(x, y))
-               {
-                       value=!value;
-                       state=(value ? ACTIVE : HOVER);
-                       signal_toggled.emit(value);
-               }
-               else
-                       state=NORMAL;
+               set_state(ACTIVE);
+               if(exclusive && parent)
+                       exclude_siblings();
        }
+       else
+               clear_state(ACTIVE);
+
+       if(value!=old_value)
+               signal_toggled.emit(value);
 }
 
-void Toggle::pointer_enter()
+void Toggle::rebuild_special(const Part &part)
 {
-       if(!value)
-               state=HOVER;
+       if(part.get_name()=="text")
+               text.build(part, state, geom, part_cache);
 }
 
-void Toggle::pointer_leave()
+void Toggle::button_press(int, int, unsigned btn)
 {
-       if(!value)
-               state=NORMAL;
+       if(btn==1)
+               pressed = true;
 }
 
-void Toggle::render_special(const Part &part) const
+void Toggle::button_release(int x, int y, unsigned btn)
 {
-       if(part.get_name()=="text")
-               render_text(part, text);
+       if(pressed && btn==1)
+       {
+               if(geom.is_inside_relative(x, y) && (!value || !exclusive))
+                       set_value(!value);
+
+               pressed = false;
+       }
+}
+
+void Toggle::on_style_change()
+{
+       text.set_style(style);
 }
 
 
 Toggle::Loader::Loader(Toggle &t):
-       Widget::Loader(t)
+       DataFile::DerivedObjectLoader<Toggle, Widget::Loader>(t)
+{
+       add("exclusive", &Toggle::exclusive);
+       add("text",      &Loader::text);
+       add("value",     &Toggle::value);
+}
+
+void Toggle::Loader::finish()
 {
-       add("text",  &Toggle::text);
-       add("value", &Toggle::value);
+       obj.set_state(ACTIVE, (obj.value ? ACTIVE : NORMAL));
 }
 
-Toggle &Toggle::Loader::get_object() const
+void Toggle::Loader::text(const string &t)
 {
-       return static_cast<Toggle &>(wdg);
+       obj.text = t;
 }
 
 } // namespace GLtk