diff --git a/Fltk/inputRange.h b/Fltk/inputRange.h index 038a4b3ba563e57863faa99f8866f00bad359ed6..541e83ec982f6533d17c03438f4dad0887a85f6c 100644 --- a/Fltk/inputRange.h +++ b/Fltk/inputRange.h @@ -7,15 +7,24 @@ #include <sstream> #include <stdio.h> #include <stdlib.h> +#include <math.h> #include <FL/Fl.H> #include <FL/Fl_Window.H> #include <FL/Fl_Value_Input.H> #include <FL/Fl_Toggle_Button.H> #include <FL/Fl_Menu_Button.H> +class inputValue : public Fl_Value_Input +{ + public: + inputValue(int x, int y, int w, int h, const char *l=0) : + Fl_Value_Input(x, y, w, h, l) {} + virtual int format(char *buffer){ return sprintf(buffer, "%g", value()); } +}; + class inputRange : public Fl_Group { private: - Fl_Value_Input *_input; + inputValue *_input; Fl_Input *_range; Fl_Toggle_Button *_range_butt, *_loop_butt; Fl_Button *_graph_butt; @@ -24,6 +33,14 @@ class inputRange : public Fl_Group { double _min, _max, _step, _max_number; std::vector<double> _choices; bool _do_callback_on_values; + double _fixStep(double step) + { + // workaround annoying behaviour of Fl_Value_Input: if step is a nonzero + // integer, one can only enter integer values in the widget; se we force + // nonzero steps to be noninteger + if(step && step - floor(step) <= 0) step *= (1. - 1e-16); + return step; + } void _values2string() { std::ostringstream tmp; @@ -36,7 +53,7 @@ class inputRange : public Fl_Group { if(_choices.size() > 1){ _input->minimum(_choices[0]); _input->maximum(_choices[_choices.size() - 1]); - _input->step(_choices[1] - _choices[0]); + _input->step(_fixStep(_choices[1] - _choices[0])); } _step = 0.; } @@ -53,7 +70,7 @@ class inputRange : public Fl_Group { } if(_step == 0.) _step = 1.; if(_step != 1.) tmp << ":" << _step; - _input->step(_step); + _input->step(_fixStep(_step)); _choices.clear(); } _range->value(tmp.str().c_str()); @@ -77,7 +94,7 @@ class inputRange : public Fl_Group { if(_choices.size() > 1){ _input->minimum(_choices[0]); _input->maximum(_choices[_choices.size() - 1]); - _input->step(_choices[1] - _choices[0]); + _input->step(_fixStep(_choices[1] - _choices[0])); } _step = 0.; } @@ -110,7 +127,7 @@ class inputRange : public Fl_Group { _step = atof(step.c_str()); else _step = 1.; - _input->step(_step); + _input->step(_fixStep(_step)); _choices.clear(); } } @@ -240,7 +257,7 @@ class inputRange : public Fl_Group { int input_w = w - dot_w - loop_w - graph_w; int range_w = input_w / 2; - _input = new Fl_Value_Input(x, y, input_w, h); + _input = new inputValue(x, y, input_w, h); _input->callback(_input_cb, this); _input->when(FL_WHEN_ENTER_KEY|FL_WHEN_RELEASE); @@ -262,7 +279,7 @@ class inputRange : public Fl_Group { _graph_butt = new Fl_Button(x + input_w + dot_w + loop_w, y, graph_w, h); _graph_butt->label("@-1gmsh_graph"); _graph_butt->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); - _graph_butt->tooltip("Draw range on X-Y graph"); + _graph_butt->tooltip("Draw range on X-Y graph(s)"); _graph_menu = new Fl_Menu_Button(x + input_w + dot_w + loop_w, y, graph_w, h); _graph_menu->type(Fl_Menu_Button::POPUP123); @@ -274,7 +291,7 @@ class inputRange : public Fl_Group { _graph_menu->add("Graph 3/Y ", 0, _graph_menu_cb, this, FL_MENU_TOGGLE); _graph_menu->add("Graph 4/X ", 0, _graph_menu_cb, this, FL_MENU_TOGGLE); _graph_menu->add("Graph 4/Y ", 0, _graph_menu_cb, this, FL_MENU_TOGGLE); - _graph_menu->add("Reset", 0, _graph_menu_reset_cb, this); + _graph_menu->add("None", 0, _graph_menu_reset_cb, this); end(); // close the group resizable(_input);