diff --git a/Fltk/onelabWindow.cpp b/Fltk/onelabWindow.cpp index f96925bc13e49f546e590ad65d9ec43144617167..3196977e93d100d4a99eecb7577620de72aa7df3 100644 --- a/Fltk/onelabWindow.cpp +++ b/Fltk/onelabWindow.cpp @@ -206,9 +206,9 @@ bool onelab::localNetworkClient::run() std::string computeCommand = (ps.empty() ? "" : ps[0].getValue()); if(modelName.size()) command.append(" \"" + modelName + "\""); if(action == "check") - command.append(" "+checkCommand) ; + command.append(" "+ checkCommand) ; else if(action == "compute") - command.append(" "+computeCommand); + command.append(" "+ computeCommand); } command.append(" " + getSocketSwitch() + " \"" + getName() + "\" %s"); } @@ -1062,30 +1062,39 @@ static bool getFlColor(const std::string &str, Fl_Color &c) return false; } -void onelabWindow::_addParameter(onelab::number &p) +template<class T> +void onelabWindow::_addParameter(T &p) { - std::string label = p.getShortName(); - std::vector<double> choices = p.getChoices(); bool highlight = false; Fl_Color c; if(getFlColor(p.getAttribute("Highlight"), c)) highlight = true; - Fl_Tree_Item *n = _tree->add(p.getName().c_str()); n->labelsize(FL_NORMAL_SIZE + 5); _tree->begin(); - Fl_Widget *widget; + Fl_Widget *widget = _addParameterWidget(p, n, highlight, c); + _treeWidgets.push_back(widget); + widget->copy_label(p.getShortName().c_str()); + n->widget(widget); + _tree->end(); +} +Fl_Widget *onelabWindow::_addParameterWidget(onelab::number &p, Fl_Tree_Item *n, + bool highlight, Fl_Color c) +{ + // non-editable value if(p.getReadOnly()){ - // non-editable value Fl_Output *but = new Fl_Output(1, 1, _itemWidth, 1); char tmp[128]; sprintf(tmp, "%g", p.getValue()); but->value(tmp); + but->align(FL_ALIGN_RIGHT); if(highlight) but->color(c); - widget = but; + return but; } - else if(choices.size() && choices.size() == p.getValueLabels().size()){ - // enumeration (display choices as value labels, not numbers) + + // enumeration (display choices as value labels, not numbers) + if(p.getChoices().size() && + p.getChoices().size() == p.getValueLabels().size()){ Fl_Choice *but = new Fl_Choice(1, 1, _itemWidth, 1); std::vector<Fl_Menu_Item> menu; std::map<double, std::string> labels(p.getValueLabels()); @@ -1099,167 +1108,113 @@ void onelabWindow::_addParameter(onelab::number &p) Fl_Menu_Item it = {0}; menu.push_back(it); but->copy(&menu[0]); - for(unsigned int i = 0; i < choices.size(); i++){ - if(p.getValue() == choices[i]){ + for(unsigned int i = 0; i < p.getChoices().size(); i++){ + if(p.getValue() == p.getChoices()[i]){ but->value(i); break; } } but->callback(onelab_choice_cb, (void*)n); + but->align(FL_ALIGN_RIGHT); if(highlight) n->labelbgcolor(c); - widget = but; + return but; } - else if(choices.size() == 2 && choices[0] == 0 && choices[1] == 1){ - // check box (boolean choice) + + // check box (boolean choice) + if(p.getChoices().size() == 2 && + p.getChoices()[0] == 0 && p.getChoices()[1] == 1){ Fl_Check_Button *but = new Fl_Check_Button(1, 1, _itemWidth, 1); but->value(p.getValue()); but->callback(onelab_check_button_cb, (void*)n); if(highlight) n->labelbgcolor(c); - widget = but; - } - else{ - // general number input - inputRange *but = new inputRange - (1, 1, _itemWidth, 1, onelab::parameter::maxNumber()); - but->value(p.getValue()); - but->minimum(p.getMin()); - but->maximum(p.getMax()); - but->step(p.getStep()); - but->choices(p.getChoices()); - but->loop(p.getAttribute("Loop")); - but->graph(p.getAttribute("Graph")); - but->callback(onelab_input_range_cb, (void*)n); - but->when(FL_WHEN_RELEASE | FL_WHEN_ENTER_KEY); - if(highlight) but->color(c); - widget = but; - } - - _treeWidgets.push_back(widget); - widget->copy_label(label.c_str()); - widget->align(FL_ALIGN_RIGHT); - n->widget(widget); - _tree->end(); + return but; + } + + // general number input + inputRange *but = new inputRange + (1, 1, _itemWidth, 1, onelab::parameter::maxNumber()); + but->value(p.getValue()); + but->minimum(p.getMin()); + but->maximum(p.getMax()); + but->step(p.getStep()); + but->choices(p.getChoices()); + but->loop(p.getAttribute("Loop")); + but->graph(p.getAttribute("Graph")); + but->callback(onelab_input_range_cb, (void*)n); + but->when(FL_WHEN_RELEASE | FL_WHEN_ENTER_KEY); + but->align(FL_ALIGN_RIGHT); + if(highlight) but->color(c); + return but; } -void onelabWindow::_addParameter(onelab::string &p) +Fl_Widget *onelabWindow::_addParameterWidget(onelab::string &p, Fl_Tree_Item *n, + bool highlight, Fl_Color c) { - std::string label = p.getShortName(); - std::vector<std::string> choices = p.getChoices(); - bool highlight = false; - Fl_Color c; - if(getFlColor(p.getAttribute("Highlight"), c)) highlight = true; - - Fl_Tree_Item *n = _tree->add(p.getName().c_str()); - n->labelsize(FL_NORMAL_SIZE + 5); - _tree->begin(); - Fl_Widget *widget; - + // non-editable value if(p.getReadOnly()){ - // non-editable value Fl_Output *but = new Fl_Output(1, 1, _itemWidth, 1); but->value(p.getValue().c_str()); + but->align(FL_ALIGN_RIGHT); if(highlight) but->color(c); - widget = but; + return but; + } + + // general string input + Fl_Input_Choice *but = new Fl_Input_Choice(1, 1, _itemWidth, 1); + std::vector<Fl_Menu_Item> menu; + for(unsigned int j = 0; j < p.getChoices().size(); j++){ + char *str = strdup(p.getChoices()[j].c_str()); + _treeStrings.push_back(str); + bool divider = (p.getKind() == "file" && + j == p.getChoices().size() - 1); + Fl_Menu_Item it = {str, 0, 0, 0, divider ? FL_MENU_DIVIDER : 0}; + menu.push_back(it); } - else{ - // general string input - Fl_Input_Choice *but = new Fl_Input_Choice(1, 1, _itemWidth, 1); - std::vector<Fl_Menu_Item> menu; - for(unsigned int j = 0; j < choices.size(); j++){ - char *str = strdup(choices[j].c_str()); - _treeStrings.push_back(str); - bool divider = (p.getKind() == "file" && - j == choices.size() - 1); - Fl_Menu_Item it = {str, 0, 0, 0, divider ? FL_MENU_DIVIDER : 0}; - menu.push_back(it); - } - if(p.getKind() == "file"){ - Fl_Menu_Item it = {"Choose...", 0, onelab_input_choice_file_chooser_cb, (void*)n}; - menu.push_back(it); - Fl_Menu_Item it2 = {"Edit...", 0, onelab_input_choice_file_edit_cb, (void*)n}; - menu.push_back(it2); - if(GuessFileFormatFromFileName(p.getValue()) >= 0){ - Fl_Menu_Item it3 = {"Merge...", 0, onelab_input_choice_file_merge_cb, (void*)n}; - menu.push_back(it3); - } - } - Fl_Menu_Item it = {0}; + if(p.getKind() == "file"){ + Fl_Menu_Item it = {"Choose...", 0, onelab_input_choice_file_chooser_cb, (void*)n}; menu.push_back(it); - but->menubutton()->copy(&menu[0]); - but->value(p.getValue().c_str()); - but->callback(onelab_input_choice_cb, (void*)n); - but->when(FL_WHEN_RELEASE | FL_WHEN_ENTER_KEY); - if(highlight) but->input()->color(c); - widget = but; + Fl_Menu_Item it2 = {"Edit...", 0, onelab_input_choice_file_edit_cb, (void*)n}; + menu.push_back(it2); + if(GuessFileFormatFromFileName(p.getValue()) >= 0){ + Fl_Menu_Item it3 = {"Merge...", 0, onelab_input_choice_file_merge_cb, (void*)n}; + menu.push_back(it3); + } } - - _treeWidgets.push_back(widget); - widget->copy_label(label.c_str()); - widget->align(FL_ALIGN_RIGHT); - n->widget(widget); - _tree->end(); + Fl_Menu_Item it = {0}; + menu.push_back(it); + but->menubutton()->copy(&menu[0]); + but->value(p.getValue().c_str()); + but->callback(onelab_input_choice_cb, (void*)n); + but->when(FL_WHEN_RELEASE | FL_WHEN_ENTER_KEY); + but->align(FL_ALIGN_RIGHT); + if(highlight) but->input()->color(c); + return but; } -void onelabWindow::_addParameter(onelab::region &p) +Fl_Widget *onelabWindow::_addParameterWidget(onelab::region &p, Fl_Tree_Item *n, + bool highlight, Fl_Color c) { - std::string label = p.getShortName(); - std::vector<std::set<std::string> > choices = p.getChoices(); - bool highlight = false; - Fl_Color c; - if(getFlColor(p.getAttribute("Highlight"), c)) highlight = true; - - Fl_Tree_Item *n = _tree->add(p.getName().c_str()); - n->labelsize(FL_NORMAL_SIZE + 5); - _tree->begin(); - Fl_Widget *widget; - - if(1){//p.getReadOnly()){ - // non-editable value + // non-editable value + //if(p.getReadOnly()){ Fl_Output *but = new Fl_Output(1, 1, _itemWidth, 1); but->value("TODO groups"); + but->align(FL_ALIGN_RIGHT); if(highlight) but->color(c); - widget = but; - } - else{ - // general group input - } - - _treeWidgets.push_back(widget); - widget->copy_label(label.c_str()); - widget->align(FL_ALIGN_RIGHT); - n->widget(widget); - _tree->end(); + return but; + //} } -void onelabWindow::_addParameter(onelab::function &p) +Fl_Widget *onelabWindow::_addParameterWidget(onelab::function &p, Fl_Tree_Item *n, + bool highlight, Fl_Color c) { - std::string label = p.getShortName(); - std::vector<std::map<std::string, std::string> > choices = p.getChoices(); - bool highlight = false; - Fl_Color c; - if(getFlColor(p.getAttribute("Highlight"), c)) highlight = true; - - Fl_Tree_Item *n = _tree->add(p.getName().c_str()); - n->labelsize(FL_NORMAL_SIZE + 5); - _tree->begin(); - Fl_Widget *widget; - - if(1){//p.getReadOnly()){ - // non-editable value + // non-editable value + //if(p.getReadOnly()){ Fl_Output *but = new Fl_Output(1, 1, _itemWidth, 1); but->value("TODO function"); + but->align(FL_ALIGN_RIGHT); if(highlight) but->color(c); - widget = but; - } - else{ - // general function input - } - - _treeWidgets.push_back(widget); - widget->copy_label(label.c_str()); - widget->align(FL_ALIGN_RIGHT); - n->widget(widget); - _tree->end(); + return but; + //} } void onelabWindow::rebuildTree() diff --git a/Fltk/onelabWindow.h b/Fltk/onelabWindow.h index 3fb98aa285a4f76cf64c04daf12abc8692eb28d7..e19576f20b8090c95da21bf8878628d1b597cd86 100644 --- a/Fltk/onelabWindow.h +++ b/Fltk/onelabWindow.h @@ -30,10 +30,15 @@ class onelabWindow{ int _deltaFontSize; bool _stop; int _itemWidth; - void _addParameter(onelab::number &p); - void _addParameter(onelab::string &p); - void _addParameter(onelab::region &p); - void _addParameter(onelab::function &p); + template <class T> void _addParameter(T &p); + Fl_Widget *_addParameterWidget(onelab::number &p, Fl_Tree_Item *n, + bool highlight, Fl_Color c); + Fl_Widget *_addParameterWidget(onelab::string &p, Fl_Tree_Item *n, + bool highlight, Fl_Color c); + Fl_Widget *_addParameterWidget(onelab::region &p, Fl_Tree_Item *n, + bool highlight, Fl_Color c); + Fl_Widget *_addParameterWidget(onelab::function &p, Fl_Tree_Item *n, + bool highlight, Fl_Color c); public: onelabWindow(int deltaFontSize=0); int x(){ return _win->x(); }