]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/panel.cpp
Move all child widget handling into Container
[libs/gltk.git] / source / panel.cpp
index 11d90e40349b04d1c49534119be5f36f100998b4..c7b1574979d7883d8f03c44816dc6152eb1daf4a 100644 (file)
@@ -20,10 +20,7 @@ namespace Msp {
 namespace GLtk {
 
 Panel::Panel():
-       layout(0),
-       pointer_focus(0),
-       pointer_grabbed(false),
-       input_focus(0)
+       layout(0)
 { }
 
 Panel::~Panel()
@@ -45,34 +42,6 @@ void Panel::autosize()
                layout->autosize();
 }
 
-Panel::Child *Panel::create_child(Widget *wdg)
-{
-       return new Child(*this, wdg);
-}
-
-void Panel::raise(Widget &wdg)
-{
-       for(list<Container::Child *>::iterator i=children.begin(); i!=children.end(); ++i)
-               if((*i)->widget==&wdg)
-               {
-                       children.splice(children.end(), children, i);
-                       return;
-               }
-
-       throw hierarchy_error("widget not in panel");
-}
-
-Widget *Panel::get_final_input_focus() const
-{
-       if(Panel *panel = dynamic_cast<Panel *>(input_focus))
-       {
-               Widget *focus = panel->get_final_input_focus();
-               if(focus)
-                       return focus;
-       }
-       return input_focus;
-}
-
 void Panel::render_special(const Part &part, GL::Renderer &renderer) const
 {
        if(part.get_name()=="children")
@@ -83,80 +52,6 @@ void Panel::render_special(const Part &part, GL::Renderer &renderer) const
        }
 }
 
-void Panel::button_press(int x, int y, unsigned btn)
-{
-       if(pointer_grabbed)
-       {
-               const Geometry &cgeom = pointer_focus->get_geometry();
-               pointer_focus->button_press(x-cgeom.x, y-cgeom.y, btn);
-       }
-       else
-       {
-               if(Widget *wdg = get_child_at(x, y))
-               {
-                       set_pointer_focus(wdg);
-                       if(wdg->is_focusable())
-                               set_input_focus(wdg);
-               }
-               Container::button_press(x, y, btn);
-       }
-}
-
-void Panel::button_release(int x, int y, unsigned btn)
-{
-       if(pointer_grabbed)
-       {
-               const Geometry &cgeom = pointer_focus->get_geometry();
-               pointer_focus->button_release(x-cgeom.x, y-cgeom.y, btn);
-       }
-       else
-               Container::button_release(x, y, btn);
-}
-
-void Panel::pointer_motion(int x, int y)
-{
-       if(pointer_grabbed)
-       {
-               const Geometry &cgeom = pointer_focus->get_geometry();
-               pointer_focus->pointer_motion(x-cgeom.x, y-cgeom.y);
-       }
-       else
-       {
-               set_pointer_focus(get_child_at(x, y));
-               Container::pointer_motion(x, y);
-       }
-}
-
-void Panel::pointer_leave()
-{
-       Container::pointer_leave();
-       set_pointer_focus(0);
-}
-
-void Panel::key_press(unsigned key, unsigned mod)
-{
-       if(input_focus)
-               input_focus->key_press(key, mod);
-}
-
-void Panel::key_release(unsigned key, unsigned mod)
-{
-       if(input_focus)
-               input_focus->key_release(key, mod);
-}
-
-void Panel::character(wchar_t ch)
-{
-       if(input_focus)
-               input_focus->character(ch);
-}
-
-void Panel::focus_out()
-{
-       set_input_focus(0);
-       Widget::focus_out();
-}
-
 void Panel::on_geometry_change()
 {
        if(layout)
@@ -181,37 +76,6 @@ void Panel::on_child_removed(Widget &wdg)
        }
 }
 
-void Panel::set_pointer_focus(Widget *wdg)
-{
-       if(wdg!=pointer_focus)
-       {
-               if(pointer_focus)
-                       pointer_focus->pointer_leave();
-
-               pointer_focus = wdg;
-
-               if(pointer_focus)
-                       pointer_focus->pointer_enter();
-       }
-}
-
-void Panel::set_input_focus(Widget *wdg)
-{
-       if(wdg!=input_focus)
-       {
-               if(input_focus)
-                       input_focus->focus_out();
-
-               input_focus = wdg;
-
-               if(input_focus)
-               {
-                       raise(*wdg);
-                       input_focus->focus_in();
-               }
-       }
-}
-
 
 Panel::Loader::Loader(Panel &p, map<string, Widget *> &m):
        Widget::Loader(p),
@@ -248,63 +112,5 @@ void Panel::Loader::panel(const string &n)
        wdg_map[n] = p.release();
 }
 
-
-Panel::Child::Child(Panel &p, Widget *w):
-       Container::Child(p, w)
-{
-       widget->signal_visibility_changed.connect(sigc::mem_fun(this, &Child::visibility_changed));
-       widget->signal_request_focus.connect(sigc::mem_fun(this, &Child::request_focus));
-       widget->signal_grab_pointer.connect(sigc::mem_fun(this, &Child::grab_pointer));
-       widget->signal_ungrab_pointer.connect(sigc::mem_fun(this, &Child::ungrab_pointer));
-}
-
-Panel::Child::~Child()
-{
-       visibility_changed(false);
-}
-
-void Panel::Child::visibility_changed(bool v)
-{
-       if(!v)
-       {
-               Panel &panel = static_cast<Panel &>(container);
-               if(widget==panel.pointer_focus)
-                       panel.set_pointer_focus(0);
-               if(widget==panel.input_focus)
-                       panel.set_input_focus(0);
-       }
-}
-
-void Panel::Child::request_focus()
-{
-       Panel &panel = static_cast<Panel &>(container);
-       panel.set_input_focus(widget);
-       if(panel.parent && panel.visible)
-               panel.set_focus();
-}
-
-void Panel::Child::grab_pointer()
-{
-       Panel &panel = static_cast<Panel &>(container);
-       if(!panel.pointer_grabbed)
-       {
-               panel.set_pointer_focus(widget);
-               panel.pointer_grabbed = true;
-               panel.signal_grab_pointer.emit();
-       }
-}
-
-void Panel::Child::ungrab_pointer()
-{
-       Panel &panel = static_cast<Panel &>(container);
-       if(panel.pointer_grabbed && panel.pointer_focus==widget)
-       {
-               // XXX Should set to the widget under pointer
-               panel.set_pointer_focus(0);
-               panel.pointer_grabbed = false;
-               panel.signal_ungrab_pointer.emit();
-       }
-}
-
 } // namespace GLtk
 } // namespace Msp