]> git.tdb.fi Git - libs/gltk.git/blob - source/hslider.cpp
dda8b43168643a74825480c72e3017891adce8fd
[libs/gltk.git] / source / hslider.cpp
1 #include <msp/gl/matrix.h>
2 #include <msp/gl/transform.h>
3 #include "graphic.h"
4 #include "hslider.h"
5 #include "part.h"
6 #include "style.h"
7
8 namespace Msp {
9 namespace GLtk {
10
11 HSlider::HSlider(const Resources &r):
12         Slider(r),
13         dragging(false)
14 {
15         update_style();
16 }
17
18 void HSlider::button_press(int x, int y, unsigned btn)
19 {
20         if(geom.is_inside(x, y))
21         {
22                 int sw=get_slider_width();
23                 int sx=static_cast<int>((geom.w-sw)*(value-min)/(max-min));
24                 if(btn==1 && x>=sx && x<sx+sw)
25                 {
26                         dragging=true;
27                         state=ACTIVE;
28                         drag_start_x=x;
29                         drag_start_value=value;
30                 }
31         }
32 }
33
34 void HSlider::button_release(int, int, unsigned btn)
35 {
36         if(btn==1)
37         {
38                 dragging=false;
39                 state=NORMAL;
40         }
41 }
42
43 void HSlider::pointer_motion(int x, int)
44 {
45         if(dragging)
46         {
47                 set_value(drag_start_value+(x-drag_start_x)*(max-min)/(geom.w-get_slider_width()));
48         }
49 }
50
51 void HSlider::render_part(const Part &part) const
52 {
53         if(part.get_name()=="slider")
54         {
55                 unsigned gw=part.get_width();
56                 unsigned gh=(part.get_fill_y() ? geom.h : part.get_height());
57                 GL::push_matrix();
58                 GL::translate((geom.w-gw)*(value-min)/(max-min), (geom.h-gh)*(part.get_alignment().y+1)/2, 0);
59                 const Graphic *graphic=part.get_graphic(state);
60                 graphic->render(gw, gh);
61                 GL::pop_matrix();
62         }
63         else
64                 Widget::render_part(part);
65 }
66
67 unsigned HSlider::get_slider_width() const
68 {
69         for(PartSeq::const_iterator i=style->get_parts().begin(); i!=style->get_parts().end(); ++i)
70                 if(i->get_name()=="slider")
71                         return i->get_width();
72
73         return 0;
74 }
75
76 } // namespace GLtk
77 } // namespace Msp