diff --git a/Common/onelab.h b/Common/onelab.h index dc56f025cc9750e18f1fd2722e0411b97598c354..bd85fb1e12cb091c3a817c786465db83ada3e071 100644 --- a/Common/onelab.h +++ b/Common/onelab.h @@ -21,6 +21,8 @@ // WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS // ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE // OF THIS SOFTWARE. +// +// Please report all bugs and problems to <gmsh@geuz.org>. #ifndef _ONELAB_H_ #define _ONELAB_H_ diff --git a/Fltk/inputRange.h b/Fltk/inputRange.h index 3296b3ccd912e47227515f60a04fd22aa8179a00..383686ee8176a3d5373a3651ef75b47006dc84a3 100644 --- a/Fltk/inputRange.h +++ b/Fltk/inputRange.h @@ -121,6 +121,29 @@ class inputRange : public Fl_Group { _range->hide(); } } + void _set_loop_value(const std::string &val) + { + if(val == "1"){ + _loop_butt->label("1"); + _loop_butt->selection_color(FL_GREEN); + _loop_butt->value(1); + } + else if(val == "2"){ + _loop_butt->label("2"); + _loop_butt->selection_color(FL_BLUE); + _loop_butt->value(1); + } + else if(val == "3"){ + _loop_butt->label("3"); + _loop_butt->selection_color(FL_RED); + _loop_butt->value(1); + } + else{ + _loop_butt->label("@-1gmsh_rotate"); + _loop_butt->selection_color(_loop_butt->color()); + _loop_butt->value(0); + } + } static void _input_cb(Fl_Widget *w, void *data) { ((inputRange*)data)->do_callback(); @@ -136,6 +159,15 @@ class inputRange : public Fl_Group { } static void _loop_butt_cb(Fl_Widget *w, void *data) { + Fl_Toggle_Button *b = (Fl_Toggle_Button*)w; + if(std::string(b->label()) == "1") + ((inputRange*)data)->_set_loop_value("2"); + else if(std::string(b->label()) == "2") + ((inputRange*)data)->_set_loop_value("3"); + else if(std::string(b->label()) == "3") + ((inputRange*)data)->_set_loop_value("0"); + else + ((inputRange*)data)->_set_loop_value("1"); ((inputRange*)data)->do_callback(); } public: @@ -162,7 +194,6 @@ class inputRange : public Fl_Group { _loop_butt = new Fl_Toggle_Button(x + input_w + dot_w, y, loop_w, h); _loop_butt->label("@-1gmsh_rotate"); - _loop_butt->selection_color(FL_GREEN); _loop_butt->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); _loop_butt->callback(_loop_butt_cb, this); _loop_butt->tooltip("Loop over range when computing"); @@ -180,6 +211,13 @@ class inputRange : public Fl_Group { double maximum() { return _max; } void step(double val) { _step = val; _values2string(); } double step() { return _step; } - void loop(int val) { _loop_butt->value(val); } - int loop() { return _loop_butt->value(); } + void loop(const std::string &val) + { + _set_loop_value(val); + } + std::string loop() + { + if(!_loop_butt->value()) return "0"; + else return _loop_butt->label(); + } }; diff --git a/Fltk/onelabWindow.cpp b/Fltk/onelabWindow.cpp index d5d49ac1028ce1028165e9133eb9a0a16144e6d6..0a55449fe16cb773ef7f0f0b127552c2f354650b 100644 --- a/Fltk/onelabWindow.cpp +++ b/Fltk/onelabWindow.cpp @@ -320,13 +320,13 @@ static std::string getModelName(onelab::client *c) } } -static void initCompute() +static void initializeLoop(std::string level) { bool changed = false; std::vector<onelab::number> numbers; onelab::server::instance()->get(numbers); for(unsigned int i = 0; i < numbers.size(); i++){ - if(numbers[i].getAttribute("loop") == "true"){ + if(numbers[i].getAttribute("loop") == level){ if(numbers[i].getChoices().size() > 1){ numbers[i].setValue(numbers[i].getChoices()[0]); onelab::server::instance()->set(numbers[i]); @@ -344,13 +344,14 @@ static void initCompute() FlGui::instance()->onelab->rebuildTree(); } -static bool shouldRecompute() +static bool incrementLoop(std::string level) { - bool recompute = false; + bool recompute = false, loop = false; std::vector<onelab::number> numbers; onelab::server::instance()->get(numbers); for(unsigned int i = 0; i < numbers.size(); i++){ - if(numbers[i].getAttribute("loop") == "true"){ + if(numbers[i].getAttribute("loop") == level){ + loop = true; if(numbers[i].getChoices().size() > 1){ std::vector<double> choices(numbers[i].getChoices()); for(unsigned int j = 0; j < choices.size() - 1; j++){ @@ -376,12 +377,30 @@ static bool shouldRecompute() } } - if(recompute) + if(loop && !recompute) // end of this loop level + initializeLoop(level); + + if(loop) FlGui::instance()->onelab->rebuildTree(); return recompute; } +static void initializeLoop() +{ + initializeLoop("1"); + initializeLoop("2"); + initializeLoop("3"); +} + +static bool incrementLoop() +{ + if(incrementLoop("3")) return true; + else if(incrementLoop("2")) return true; + else if(incrementLoop("1")) return true; + return false; +} + void onelab_cb(Fl_Widget *w, void *data) { if(!data) return; @@ -408,7 +427,7 @@ void onelab_cb(Fl_Widget *w, void *data) FlGui::instance()->onelab->deactivate(); - if(action == "compute") initCompute(); + if(action == "compute") initializeLoop(); do{ // enter computation loop @@ -479,7 +498,7 @@ void onelab_cb(Fl_Widget *w, void *data) printf("Gmsh ONELAB db:\n%s\n", onelab::server::instance()->toChar().c_str()); - } while(action == "compute" && shouldRecompute()); + } while(action == "compute" && incrementLoop()); FlGui::instance()->onelab->activate(); FlGui::instance()->onelab->rebuildTree(); @@ -512,7 +531,7 @@ static void onelab_input_range_cb(Fl_Widget *w, void *data) numbers[0].setMax(o->maximum()); numbers[0].setStep(o->step()); numbers[0].setChoices(o->choices()); - numbers[0].setAttribute("loop", o->loop() ? "true" : "false"); + numbers[0].setAttribute("loop", o->loop()); onelab::server::instance()->set(numbers[0]); } } @@ -655,7 +674,7 @@ void onelabWindow::rebuildTree() but->maximum(numbers[i].getMax()); but->step(numbers[i].getStep()); but->choices(numbers[i].getChoices()); - but->loop(numbers[i].getAttribute("loop") == "true"); + but->loop(numbers[i].getAttribute("loop")); but->align(FL_ALIGN_RIGHT); but->callback(onelab_input_range_cb, (void*)n); but->when(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY);