X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fslider.cpp;h=5034b2475d8c46f20e4e09f2fe626c69c196d19a;hb=878faa0c9283ee1e6e5e67b6ea1324cc52385742;hp=11e4c24dc6461c0c49910b030ee18a7a6240a00d;hpb=bcdbb414c5f1abe860cad6bb67fd5da7c0122cfd;p=libs%2Fgltk.git diff --git a/source/slider.cpp b/source/slider.cpp index 11e4c24..5034b24 100644 --- a/source/slider.cpp +++ b/source/slider.cpp @@ -3,43 +3,93 @@ namespace Msp { namespace GLtk { -Slider::Slider(const Resources &r): - Widget(r), +Slider::Slider(): min(0), max(1), value(0), - step(0.1) + step(0.1), + dragging(false), + drag_area_size(0), + drag_area_offset(0), + slider_size(1) { } +void Slider::set_value(double v) +{ + double old_value = value; + + if(vmax) + value = max; + else + { + unsigned steps = static_cast((v-min)/step+0.5); + value = min+steps*step; + } + + if(value!=old_value) + { + signal_value_changed.emit(value); + mark_rebuild(); + } +} + void Slider::set_range(double a, double b) { - min=a; - max=b; + min = a; + max = b; set_value(value); } void Slider::set_step(double s) { - step=s; + step = s; set_value(value); } -void Slider::set_value(double v) +void Slider::click(int p) { - double old_value=value; + p -= drag_area_offset; + if(p<0 || p>=static_cast(drag_area_size)) + return; - if(vmax) - value=max; + int sp = static_cast((drag_area_size-slider_size)*(value-min)/(max-min)); + if(p=static_cast(sp+slider_size)) + set_value(value+step*10); else - { - unsigned steps=static_cast((v-min)/step+0.5); - value=min+steps*step; - } + start_drag(drag_area_offset+p); +} - if(value!=old_value) - signal_value_changed.emit(value); +void Slider::start_drag(int p) +{ + dragging = true; + drag_start_pos = p; + drag_start_value = value; + set_state(ACTIVE); +} + +void Slider::drag(int p) +{ + if(max>min) + set_value(drag_start_value+(p-drag_start_pos)*(max-min)/(drag_area_size-slider_size)); +} + +void Slider::end_drag() +{ + dragging = false; + clear_state(ACTIVE); +} + + +Slider::Loader::Loader(Slider &s): + DataFile::DerivedObjectLoader(s) +{ + add("range", &Slider::min, &Slider::max); + add("step", &Slider::step); + add("value", &Slider::value); } } // namespace GLtk