X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fslider.cpp;h=425f721f0ccf052bd0eb74a78b44eaca80570498;hb=0af3c2393bd00f39db3bfaf5b78a7a44f0fd5ff1;hp=e7f67c111016cd87b3eb348883e4788292b1bb97;hpb=c1f038acb91eb3bfaa34dfd4729d19ed3f871a42;p=libs%2Fgltk.git diff --git a/source/slider.cpp b/source/slider.cpp index e7f67c1..425f721 100644 --- a/source/slider.cpp +++ b/source/slider.cpp @@ -1,3 +1,10 @@ +/* $Id$ + +This file is part of libmspgltk +Copyright © 2007 Mikko Rasa, Mikkosoft Productions +Distributed under the LGPL +*/ + #include "slider.h" namespace Msp { @@ -8,21 +15,74 @@ Slider::Slider(const Resources &r): min(0), max(1), value(0), - step(0.1) -{ -} + step(0.1), + dragging(false), + drag_area_size(0) +{ } void Slider::set_value(double v) { + double old_value = value; + if(vmax) - value=max; + value = max; else { - unsigned steps=static_cast((v-min)/step+0.5); - value=min+steps*step; + unsigned steps = static_cast((v-min)/step+0.5); + value = min+steps*step; } + + if(value!=old_value) + signal_value_changed.emit(value); +} + +void Slider::set_range(double a, double b) +{ + min = a; + max = b; + set_value(value); +} + +void Slider::set_step(double s) +{ + step = s; + set_value(value); +} + +void Slider::start_drag(int p) +{ + dragging = true; + drag_start_pos = p; + drag_start_value = value; + state |= ACTIVE; +} + +void Slider::drag(int p) +{ + if(max>min) + set_value(drag_start_value+(p-drag_start_pos)*(max-min)/drag_area_size); +} + +void Slider::end_drag() +{ + dragging = false; + state &= ~ACTIVE; +} + + +Slider::Loader::Loader(Slider &s): + Widget::Loader(s) +{ + add("range", &Slider::min, &Slider::max); + add("step", &Slider::step); + add("value", &Slider::value); +} + +Slider &Slider::Loader::get_object() const +{ + return static_cast(wdg); } } // namespace GLtk