From aa179dbfd9d3a63ec596e38aecd3526a299b14ba Mon Sep 17 00:00:00 2001 From: Jinhao Date: Wed, 25 Feb 2015 17:18:13 +0800 Subject: [PATCH] fix slider knob precision issue --- source/gui/widgets/slider.cpp | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/source/gui/widgets/slider.cpp b/source/gui/widgets/slider.cpp index e0ca0442..23af12a4 100644 --- a/source/gui/widgets/slider.cpp +++ b/source/gui/widgets/slider.cpp @@ -198,12 +198,12 @@ namespace nana unsigned vcur() const { - return attr_.vcur; + return static_cast(attr_.vcur); } void resize() { - this->_m_mk_slider_pos_by_value(); + _m_mk_slider_pos_by_value(); attr_.adorn_pos = attr_.pos; } @@ -338,16 +338,18 @@ namespace nana unsigned move_step(bool forward) { - unsigned cmpvalue = attr_.vcur; + unsigned cmpvalue = static_cast(attr_.vcur); + auto value = cmpvalue; if(forward) { - if(attr_.vcur) - --attr_.vcur; + if (value) + --value; } - else if(attr_.vcur < attr_.vmax) - ++attr_.vcur; + else if (value < attr_.vmax) + ++value; - if(cmpvalue != attr_.vcur) + attr_.vcur = value; + if (cmpvalue != value) { _m_mk_slider_pos_by_value(); draw(); @@ -436,32 +438,29 @@ namespace nana return static_cast(_m_scale() * attr_.vcur / attr_.vmax); } - unsigned _m_mk_slider_value_by_pos() + void _m_mk_slider_value_by_pos() { if(_m_scale()) { - auto cmpvalue = attr_.vcur; - attr_.vcur = static_cast(attr_.pos * attr_.vmax / _m_scale()); - if (cmpvalue != attr_.vcur) + auto cmpvalue = static_cast(attr_.vcur); + attr_.vcur = (attr_.pos * attr_.vmax / _m_scale()); + if (cmpvalue != static_cast(attr_.vcur)) _m_emit_value_changed(); } - return attr_.vcur; } - int _m_mk_slider_pos_by_value() + void _m_mk_slider_pos_by_value() { attr_.pos = double(_m_scale()) * attr_.vcur / attr_.vmax; if(slider_state_.trace == slider_state_.TraceNone) attr_.adorn_pos = attr_.pos; - - return static_cast(attr_.pos); } unsigned _m_value_by_pos(double pos) const { if(_m_scale()) - return static_cast(pos * attr_.vmax / _m_scale()); + return static_cast(pos * attr_.vmax / _m_scale()); return 0; } @@ -548,7 +547,7 @@ namespace nana style dir; unsigned border; unsigned vmax; - unsigned vcur; + double vcur; double pos; bool is_draw_adorn; double adorn_pos;