]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/list.cpp
Add Container class
[libs/gltk.git] / source / list.cpp
index 5bef36732e601ebd4a30023d04e51a9f14f2db78..cc9f707efa1d9dadf008e585101f0a6365c15782 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id$
 
 This file is part of libmspgltk
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Copyright © 2007-2009  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
@@ -21,25 +21,21 @@ namespace GLtk {
 
 List::List(const Resources &r):
        Widget(r),
+       Container(r),
        sel_index(-1),
        first(0),
        n_visible(1),
        row_height(1),
        items_part(0),
-       slider(new VSlider(res)),
-       slider_active(false)
+       slider(res)
 {
-       slider->set_step(1);
-       slider->signal_value_changed.connect(sigc::mem_fun(this, &List::slider_value_changed));
+       add(slider);
+       slider.set_step(1);
+       slider.signal_value_changed.connect(sigc::mem_fun(this, &List::slider_value_changed));
 
        update_style();
 }
 
-List::~List()
-{
-       delete slider;
-}
-
 void List::append(const string &v)
 {
        items.push_back(v);
@@ -100,13 +96,8 @@ const string &List::get_selected() const
 
 void List::button_press(int x, int y, unsigned btn)
 {
-       if(slider->get_geometry().is_inside(x, y))
-       {
-               const Geometry &sgeom=slider->get_geometry();
-               slider->button_press(x-sgeom.x, y-sgeom.y, btn);
-               slider_active=true;
-       }
-       else if(btn==1)
+       Container::button_press(x, y, btn);
+       if(!click_focus && btn==1)
        {
                if(items_part)
                        y+=items_part->get_margin().top;
@@ -121,25 +112,6 @@ void List::button_press(int x, int y, unsigned btn)
        }
 }
 
-void List::button_release(int x, int y, unsigned btn)
-{
-       if(slider_active)
-       {
-               const Geometry &sgeom=slider->get_geometry();
-               slider->button_release(x-sgeom.x, y-sgeom.y, btn);
-               slider_active=false;
-       }
-}
-
-void List::pointer_motion(int x, int y)
-{
-       if(slider_active)
-       {
-               const Geometry &sgeom=slider->get_geometry();
-               slider->pointer_motion(x-sgeom.x, y-sgeom.y);
-       }
-}
-
 void List::render_special(const Part &part) const
 {
        if(part.get_name()=="items")
@@ -193,7 +165,7 @@ void List::render_special(const Part &part) const
                }
        }
        else if(part.get_name()=="slider")
-               slider->render();
+               slider.render();
 }
 
 void List::on_geometry_change()
@@ -225,7 +197,7 @@ void List::reposition_slider()
                {
                        Geometry sgeom=i->get_geometry();
                        i->get_alignment().apply(sgeom, geom, i->get_margin());
-                       slider->set_geometry(sgeom);
+                       slider.set_geometry(sgeom);
                }
 }
 
@@ -250,13 +222,13 @@ void List::recalculate_parameters()
 
        if(items.size()>n_visible)
        {
-               slider->set_range(0, items.size()-n_visible);
-               slider->set_value(items.size()-n_visible-first);
+               slider.set_range(0, items.size()-n_visible);
+               slider.set_value(items.size()-n_visible-first);
        }
        else
        {
-               slider->set_range(0, 0);
-               slider->set_value(0);
+               slider.set_range(0, 0);
+               slider.set_value(0);
        }
 }
 
@@ -275,7 +247,7 @@ List::Loader::Loader(List &l):
 
 void List::Loader::item(const string &v)
 {
-       static_cast<List &>(wdg).append(v);
+       dynamic_cast<List &>(wdg).append(v);
 }
 
 } // namespace GLtk