diff --git a/Fltk/inputRange.h b/Fltk/inputRange.h index 2abbc3164420c07208fbd878570b92c982dde9c4..038a4b3ba563e57863faa99f8866f00bad359ed6 100644 --- a/Fltk/inputRange.h +++ b/Fltk/inputRange.h @@ -23,6 +23,7 @@ class inputRange : public Fl_Group { std::string _loop_val, _graph_val; double _min, _max, _step, _max_number; std::vector<double> _choices; + bool _do_callback_on_values; void _values2string() { std::ostringstream tmp; @@ -68,7 +69,7 @@ class inputRange : public Fl_Group { std::string::size_type last = str.find_first_of(',', first); std::string val = str.substr(first, last - first); _choices.push_back(atof(val.c_str())); - if(last == std::string::npos) + if(last == std::string::npos) break; else first = last + 1; @@ -157,7 +158,7 @@ class inputRange : public Fl_Group { _graph_val.resize(8, '0'); if(update_menu){ int index[8] = {1, 2, 5, 6, 9, 10, 13, 14}; - for(int i = 0; i < 8; i++){ + for(int i = 0; i < 8; i++){ if(_graph_val[i] == '1') ((Fl_Menu_Item*)_graph_menu->menu())[index[i]].set(); else @@ -179,18 +180,20 @@ class inputRange : public Fl_Group { static void _input_cb(Fl_Widget *w, void *data) { inputRange *b = (inputRange*)data; + b->doCallbackOnValues(true); b->do_callback(); } static void _range_cb(Fl_Widget *w, void *data) { inputRange *b = (inputRange*)data; b->_string2values(); + b->doCallbackOnValues(true); b->do_callback(); } static void _range_butt_cb(Fl_Widget *w, void *data) { inputRange *b = (inputRange*)data; - b->_show_range(); + b->_show_range(); } static void _loop_butt_cb(Fl_Widget *w, void *data) { @@ -199,7 +202,8 @@ class inputRange : public Fl_Group { else if(b->_loop_val == "2") b->_set_loop_value("3"); else if(b->_loop_val == "3") b->_set_loop_value("0"); else b->_set_loop_value("1"); - b->do_callback(); + b->doCallbackOnValues(false); + b->do_callback(); } static void _graph_menu_cb(Fl_Widget *w, void *data) { @@ -215,18 +219,20 @@ class inputRange : public Fl_Group { v[6] = b->_graph_menu->menu()[13].value() ? '1' : '0'; v[7] = b->_graph_menu->menu()[14].value() ? '1' : '0'; b->_set_graph_value(v, false); + b->doCallbackOnValues(false); b->do_callback(); } static void _graph_menu_reset_cb(Fl_Widget *w, void *data) { inputRange *b = (inputRange*)data; b->_set_graph_value("00000000"); + b->doCallbackOnValues(false); b->do_callback(); } public: - inputRange(int x, int y, int w, int h, double max_number, const char *l=0) + inputRange(int x, int y, int w, int h, double max_number, const char *l=0) : Fl_Group(x,y,w,h,l), _min(-max_number), _max(max_number), _step(1.), - _max_number(max_number) + _max_number(max_number), _do_callback_on_values(true) { _graph_val.resize(8, '0'); @@ -237,7 +243,7 @@ class inputRange : public Fl_Group { _input = new Fl_Value_Input(x, y, input_w, h); _input->callback(_input_cb, this); _input->when(FL_WHEN_ENTER_KEY|FL_WHEN_RELEASE); - + _range = new Fl_Input(x + input_w - range_w, y, range_w, h); _range->callback(_range_cb, this); _range->when(FL_WHEN_ENTER_KEY|FL_WHEN_RELEASE); @@ -273,6 +279,8 @@ class inputRange : public Fl_Group { end(); // close the group resizable(_input); } + bool doCallbackOnValues(){ return _do_callback_on_values; } + void doCallbackOnValues(bool val){ _do_callback_on_values = val; } double value() { return _input->value(); } void value(double val) { _input->value(val); } void choices(const std::vector<double> &val) { _choices = val; _values2string(); } diff --git a/Fltk/onelabWindow.cpp b/Fltk/onelabWindow.cpp index d7fbe762289395efa5f2a0eb20c9b4e2b5e0d96d..e33404f3b23ab6c313637ef64f99497ed1b4d5db 100644 --- a/Fltk/onelabWindow.cpp +++ b/Fltk/onelabWindow.cpp @@ -157,7 +157,7 @@ bool onelab::localNetworkClient::run() if(_pid < 0 || (command.empty() && !CTX::instance()->solver.listen)) break; - int stop = server->NonBlockingWait(sock, 0.001, 0.); + int stop = server->NonBlockingWait(sock, 0., 0.); if(stop || _pid < 0 || (command.empty() && !CTX::instance()->solver.listen)) break; @@ -739,11 +739,14 @@ static void onelab_input_range_cb(Fl_Widget *w, void *data) onelab::server::instance()->get(numbers, name); if(numbers.size()){ inputRange *o = (inputRange*)w; - numbers[0].setValue(o->value()); - numbers[0].setMin(o->minimum()); - numbers[0].setMax(o->maximum()); - numbers[0].setStep(o->step()); - numbers[0].setChoices(o->choices()); + if(o->doCallbackOnValues()){ + numbers[0].setValue(o->value()); + numbers[0].setMin(o->minimum()); + numbers[0].setMax(o->maximum()); + numbers[0].setStep(o->step()); + numbers[0].setChoices(o->choices()); + } + o->doCallbackOnValues(true); numbers[0].setAttribute("Loop", o->loop()); numbers[0].setAttribute("Graph", o->graph()); onelab::server::instance()->set(numbers[0]);