fix slider knob precision issue

This commit is contained in:
Jinhao 2015-02-25 17:18:13 +08:00
parent ced13132a4
commit aa179dbfd9

View File

@ -198,12 +198,12 @@ namespace nana
unsigned vcur() const unsigned vcur() const
{ {
return attr_.vcur; return static_cast<unsigned>(attr_.vcur);
} }
void resize() void resize()
{ {
this->_m_mk_slider_pos_by_value(); _m_mk_slider_pos_by_value();
attr_.adorn_pos = attr_.pos; attr_.adorn_pos = attr_.pos;
} }
@ -338,16 +338,18 @@ namespace nana
unsigned move_step(bool forward) unsigned move_step(bool forward)
{ {
unsigned cmpvalue = attr_.vcur; unsigned cmpvalue = static_cast<unsigned>(attr_.vcur);
auto value = cmpvalue;
if(forward) if(forward)
{ {
if(attr_.vcur) if (value)
--attr_.vcur; --value;
} }
else if(attr_.vcur < attr_.vmax) else if (value < attr_.vmax)
++attr_.vcur; ++value;
if(cmpvalue != attr_.vcur) attr_.vcur = value;
if (cmpvalue != value)
{ {
_m_mk_slider_pos_by_value(); _m_mk_slider_pos_by_value();
draw(); draw();
@ -436,32 +438,29 @@ namespace nana
return static_cast<int>(_m_scale() * attr_.vcur / attr_.vmax); return static_cast<int>(_m_scale() * attr_.vcur / attr_.vmax);
} }
unsigned _m_mk_slider_value_by_pos() void _m_mk_slider_value_by_pos()
{ {
if(_m_scale()) if(_m_scale())
{ {
auto cmpvalue = attr_.vcur; auto cmpvalue = static_cast<int>(attr_.vcur);
attr_.vcur = static_cast<unsigned>(attr_.pos * attr_.vmax / _m_scale()); attr_.vcur = (attr_.pos * attr_.vmax / _m_scale());
if (cmpvalue != attr_.vcur) if (cmpvalue != static_cast<int>(attr_.vcur))
_m_emit_value_changed(); _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; attr_.pos = double(_m_scale()) * attr_.vcur / attr_.vmax;
if(slider_state_.trace == slider_state_.TraceNone) if(slider_state_.trace == slider_state_.TraceNone)
attr_.adorn_pos = attr_.pos; attr_.adorn_pos = attr_.pos;
return static_cast<int>(attr_.pos);
} }
unsigned _m_value_by_pos(double pos) const unsigned _m_value_by_pos(double pos) const
{ {
if(_m_scale()) if(_m_scale())
return static_cast<int>(pos * attr_.vmax / _m_scale()); return static_cast<unsigned>(pos * attr_.vmax / _m_scale());
return 0; return 0;
} }
@ -548,7 +547,7 @@ namespace nana
style dir; style dir;
unsigned border; unsigned border;
unsigned vmax; unsigned vmax;
unsigned vcur; double vcur;
double pos; double pos;
bool is_draw_adorn; bool is_draw_adorn;
double adorn_pos; double adorn_pos;