Slider value handles -ve values by clipping to zero

see http://nanapro.org/en-us/forum/index.php?u=/topic/1092/ggslider-value-range
This commit is contained in:
James Bremner 2019-01-16 16:43:05 -05:00
parent 02d082959f
commit 26c28ae4be
2 changed files with 21 additions and 11 deletions

View File

@ -151,7 +151,13 @@ namespace nana
bool vertical() const; bool vertical() const;
void maximum(unsigned); void maximum(unsigned);
unsigned maximum() const; unsigned maximum() const;
void value(unsigned);
/** Set slider value
@param[in] v new value for slider.
v will be clipped to the range 0 to maximum
*/
void value(int );
unsigned value() const; unsigned value() const;
unsigned move_step(bool forward); ///< Increase or decrease the value of slider. unsigned move_step(bool forward); ///< Increase or decrease the value of slider.
unsigned adorn() const; unsigned adorn() const;

View File

@ -245,7 +245,7 @@ namespace nana
}; };
public: public:
enum class parts{none, bar, slider}; enum class parts{none, bar, slider};
using graph_reference = drawer_trigger::graph_reference; using graph_reference = drawer_trigger::graph_reference;
model() model()
@ -256,7 +256,7 @@ namespace nana
proto_.renderer = pat::cloneable<renderer_interface>{interior_renderer{}}; proto_.renderer = pat::cloneable<renderer_interface>{interior_renderer{}};
attr_.seek_dir = seekdir::bilateral; attr_.seek_dir = seekdir::bilateral;
attr_.is_draw_adorn = false; attr_.is_draw_adorn = false;
attr_.vcur = 0; attr_.vcur = 0;
attr_.vmax = 10; attr_.vmax = 10;
@ -361,7 +361,7 @@ namespace nana
parts seek_where(::nana::point pos) const parts seek_where(::nana::point pos) const
{ {
nana::rectangle r = _m_bar_area(); nana::rectangle r = _m_bar_area();
if (attr_.slider.vert) if (attr_.slider.vert)
{ {
std::swap(pos.x, pos.y); std::swap(pos.x, pos.y);
@ -373,7 +373,7 @@ namespace nana
return parts::slider; return parts::slider;
sdpos = static_cast<int>(attr_.slider.weight) / 2; sdpos = static_cast<int>(attr_.slider.weight) / 2;
if (sdpos <= pos.x && pos.x < sdpos + static_cast<int>(r.width)) if (sdpos <= pos.x && pos.x < sdpos + static_cast<int>(r.width))
{ {
if(pos.y < r.bottom()) if(pos.y < r.bottom())
@ -446,7 +446,7 @@ namespace nana
bool move_slider(const ::nana::point& pos) bool move_slider(const ::nana::point& pos)
{ {
int adorn_pos = slider_state_.snap_pos + (attr_.slider.vert ? pos.y : pos.x) - slider_state_.refpos.x; int adorn_pos = slider_state_.snap_pos + (attr_.slider.vert ? pos.y : pos.x) - slider_state_.refpos.x;
if (adorn_pos > 0) if (adorn_pos > 0)
{ {
int range = static_cast<int>(_m_range()); int range = static_cast<int>(_m_range());
@ -691,7 +691,7 @@ namespace nana
window wd; window wd;
nana::slider * widget; nana::slider * widget;
}other_; }other_;
struct prototype_tag struct prototype_tag
{ {
pat::cloneable<slider::renderer_interface> renderer; pat::cloneable<slider::renderer_interface> renderer;
@ -759,9 +759,9 @@ namespace nana
void trigger::mouse_move(graph_reference graph, const arg_mouse& arg) void trigger::mouse_move(graph_reference graph, const arg_mouse& arg)
{ {
// check if slider is disabled // check if slider is disabled
if(!API::get_widget(arg.window_handle)->enabled()) if(!API::get_widget(arg.window_handle)->enabled())
return; // do nothing return; // do nothing
bool updated = false; bool updated = false;
if (model_ptr_->if_trace_slider()) if (model_ptr_->if_trace_slider())
{ {
@ -804,7 +804,7 @@ namespace nana
//class slider //class slider
slider::slider(){} slider::slider(){}
slider::slider(window wd, bool visible) slider::slider(window wd, bool visible)
{ {
create(wd, rectangle(), visible); create(wd, rectangle(), visible);
@ -844,10 +844,14 @@ namespace nana
return get_drawer_trigger().get_model()->attribute().vmax; return get_drawer_trigger().get_model()->attribute().vmax;
} }
void slider::value(unsigned v) void slider::value(int v)
{ {
if(handle()) if(handle())
{ {
// limit to positive values, vcur expects unsigned
if( v < 0 )
v = 0;
if(get_drawer_trigger().get_model()->vcur(v)) if(get_drawer_trigger().get_model()->vcur(v))
API::refresh_window(handle()); API::refresh_window(handle());
} }