diff --git a/Common/onelab.h b/Common/onelab.h index 77d6a02bdcba463f63ac2073e4c2d69379819631..9d6b0444ae0f20d048597ca232c5d1c4ce92a6cc 100644 --- a/Common/onelab.h +++ b/Common/onelab.h @@ -183,6 +183,15 @@ namespace onelab{ sstream << *it << charSep(); return sstream.str(); } + void fromChar(const std::string &msg) + { + std::string::size_type pos = 0; + if(getNextToken(msg, pos) != getType()) return; + setName(getNextToken(msg, pos)); + setShortHelp(getNextToken(msg, pos)); + setHelp(getNextToken(msg, pos)); + setValue(getNextToken(msg, pos)); + } }; // The region class. A region can be any kind of geometrical entity. diff --git a/Fltk/FlGui.cpp b/Fltk/FlGui.cpp index e9502850d96d43d3bc951af2e05219696f375636..10df7cd6b8143e79b0d64cc6784df8ab3b423486 100644 --- a/Fltk/FlGui.cpp +++ b/Fltk/FlGui.cpp @@ -654,7 +654,7 @@ int FlGui::testGlobalShortcuts(int event) } #if defined(HAVE_FL_TREE) else if(Fl::test_shortcut('@')) { - onelab_cb(0, (void*)"laucnhed_from_shortcut"); + onelab_cb(0, (void*)"check"); status = 1; } #endif diff --git a/Fltk/onelabWindow.cpp b/Fltk/onelabWindow.cpp index 4165d18bb198a05af1bba5857cf69636cca426db..db28e8200f7cf90a8377940bebef640aedcd51a1 100644 --- a/Fltk/onelabWindow.cpp +++ b/Fltk/onelabWindow.cpp @@ -6,6 +6,8 @@ #include "onelab.h" #if defined(HAVE_FL_TREE) +#include <FL/Fl_Value_Input.H> +#include <FL/Fl_Box.H> #include "GmshMessage.h" #include "Context.h" #include "OS.h" @@ -15,10 +17,9 @@ #include "FlGui.h" #include "paletteWindow.h" #include "menuWindow.h" +#include "fileDialogs.h" #include "onelabWindow.h" -#include <FL/Fl_Value_Input.H> - // This file contains the Gmsh/FLTK specific parts of the ONELAB // interface. You'll need to reimplement this if you plan to build // a different ONELAB server. @@ -122,10 +123,16 @@ bool onelab::localNetworkClient::run(const std::string &what) std::string type, name; onelab::parameter::getTypeAndNameFromChar(message, type, name); if(type == "number"){ - onelab::number par; - par.fromChar(message); - set(par, false); - printf("gmsh got '%s' from %s\n", par.toChar().c_str(), _name.c_str()); + onelab::number p; + p.fromChar(message); + set(p, false); + printf("gmsh got '%s' from %s\n", p.toChar().c_str(), _name.c_str()); + } + else if(type == "string"){ + onelab::string p; + p.fromChar(message); + set(p, false); + printf("gmsh got '%s' from %s\n", p.toChar().c_str(), _name.c_str()); } } break; @@ -145,6 +152,9 @@ bool onelab::localNetworkClient::run(const std::string &what) server->SendMessage(GmshSocket::GMSH_INFO, reply.size(), &reply[0]); } } + else if(type == "string"){ + Msg::Error("FIXME do strings"); + } } break; case GmshSocket::GMSH_PROGRESS: @@ -202,10 +212,31 @@ bool onelab::localNetworkClient::kill() void onelab_cb(Fl_Widget *w, void *data) { + if(!data) return; + std::string action((const char*)data); + + if(action == "choose model"){ + if(fileChooser(FILE_CHOOSER_SINGLE, "Choose", "*.pro")) + FlGui::instance()->onelab->setModelName(fileChooserGetName(1)); + action = "check"; + } + for(onelab::server::citer it = onelab::server::instance()->firstClient(); it != onelab::server::instance()->lastClient(); it++){ onelab::client *c = it->second; - c->run("/Users/geuzaine/src/getdp/demos/test.pro"); + std::string what = FlGui::instance()->onelab->getModelName(); + if(action == "check") + c->run(what); + else if(action == "compute"){ + if(c->getName() == "getdp"){ + std::vector<onelab::string> str; + onelab::server::instance()->get(str, "GetDP/Resolution"); + if(str.size()) what += " -solve " + str[0].getValue(); + onelab::server::instance()->get(str, "GetDP/Post-processing"); + if(str.size()) what += " -pos " + str[0].getValue(); + c->run(what); + } + } } printf("**** GMSH ONELAB DB DUMP:\n"); onelab::server::instance()->print(); @@ -214,16 +245,27 @@ void onelab_cb(Fl_Widget *w, void *data) FlGui::instance()->onelab->show(); } -void onelab_compute_cb(Fl_Widget *w, void *data) +static void onelab_number_cb(Fl_Widget *w, void *data) { - printf("**** ONELAB DB DUMP:\n"); - onelab::server::instance()->print(); - printf("**** \n"); + if(!data) return; + std::string name = FlGui::instance()->onelab->getPath((Fl_Tree_Item*)data); + std::vector<onelab::number> numbers; + onelab::server::instance()->get(numbers, name); + if(numbers.size()){ + numbers[0].setValue(((Fl_Value_Input*)w)->value()); + onelab::server::instance()->set(numbers[0]); + } +} - for(onelab::server::citer it = onelab::server::instance()->firstClient(); - it != onelab::server::instance()->lastClient(); it++){ - onelab::client *c = it->second; - c->run("/Users/geuzaine/src/getdp/demos/test.pro -solve MagSta_phi -pos phi"); +static void onelab_string_cb(Fl_Widget *w, void *data) +{ + if(!data) return; + std::string name = FlGui::instance()->onelab->getPath((Fl_Tree_Item*)data); + std::vector<onelab::string> strings; + onelab::server::instance()->get(strings, name); + if(strings.size()){ + strings[0].setValue(((Fl_Input*)w)->value()); + onelab::server::instance()->set(strings[0]); } } @@ -231,18 +273,33 @@ onelabWindow::onelabWindow(int deltaFontSize) { FL_NORMAL_SIZE -= deltaFontSize; - int width = 32 * FL_NORMAL_SIZE; + int width = 25 * FL_NORMAL_SIZE; int height = 10 * BH + 3 * WB; _win = new paletteWindow (width, height, CTX::instance()->nonModalWindows ? true : false, "ONELAB"); _win->box(GMSH_WINDOW_BOX); - _tree = new Fl_Tree(WB, WB, width - 2 * WB, height - 3 * WB - BH); + _model = new Fl_Input(WB, WB, width - 2*WB - (2*BB)/3, BH); + _model->align(FL_ALIGN_RIGHT); + _model->value("/Users/geuzaine/src/getdp/demos/test.pro"); + _model->callback(onelab_cb, (void*)"check"); + _model->when(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY); + + Fl_Button *choose = new Fl_Button(width - WB - (2*BB)/3, WB, (2*BB)/3, BH, "Choose"); + choose->callback(onelab_cb, (void*)"choose model"); + + _tree = new Fl_Tree(WB, WB+BH, width - 2 * WB, height - 3 * WB - 2 * BH); _tree->connectorstyle(FL_TREE_CONNECTOR_SOLID); + _tree->showroot(0); - _run = new Fl_Button(width - WB - BB, height - WB - BH, BB, BH, "Compute"); - _run->callback(onelab_compute_cb); + _butt[0] = new Fl_Button(width - WB - BB, height - WB - BH, BB, BH, "Compute"); + _butt[0]->callback(onelab_cb, (void*)"compute"); + _butt[1] = new Fl_Button(width - 2*WB - 2*BB, height - WB - BH, BB, BH, "Check"); + _butt[1]->callback(onelab_cb, (void*)"check"); + + Fl_Box *resbox = new Fl_Box(WB, height - BH - 3 * WB, WB, WB); + _win->resizable(resbox); _win->position (CTX::instance()->solverPosition[0], CTX::instance()->solverPosition[1]); @@ -254,44 +311,59 @@ onelabWindow::onelabWindow(int deltaFontSize) (new onelab::localNetworkClient("getdp", "/Users/geuzaine/src/getdp/bin/getdp")); } -void number_cb(Fl_Widget *w, void *data) +static std::string getShortName(const std::string &name) { - Fl_Value_Input *v = (Fl_Value_Input*)w; - std::vector<onelab::number> numbers; - onelab::server::instance()->get(numbers, v->label()); - if(numbers.size()){ - numbers[0].setValue(v->value()); - onelab::server::instance()->set(numbers[0]); - } + std::string::size_type last = name.find_last_of('/'); + if(last != std::string::npos) + return name.substr(last + 1); + return name; } void onelabWindow::rebuildTree() { printf("rebulding tree\n"); + _tree->deactivate(); _tree->clear(); for(unsigned int i = 0; i < _treeWidgets.size(); i++) - delete _treeWidgets[i]; + Fl::delete_widget(_treeWidgets[i]); _treeWidgets.clear(); std::vector<onelab::number> numbers; onelab::server::instance()->get(numbers); - for(unsigned int i = 0; i < numbers.size(); i++){ Fl_Tree_Item *n = _tree->add(numbers[i].getName().c_str()); _tree->begin(); Fl_Value_Input *but = new Fl_Value_Input(1,1,IW,1); _treeWidgets.push_back(but); - but->copy_label(numbers[i].getName().c_str()); + but->copy_label(getShortName(numbers[i].getName()).c_str()); but->value(numbers[i].getValue()); but->minimum(0.); but->maximum(10.); but->step(0.1); but->align(FL_ALIGN_RIGHT); - but->callback(number_cb); + but->callback(onelab_number_cb, (void*)n); + but->when(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY); + n->widget(but); + _tree->end(); + } + + std::vector<onelab::string> strings; + onelab::server::instance()->get(strings); + for(unsigned int i = 0; i < strings.size(); i++){ + Fl_Tree_Item *n = _tree->add(strings[i].getName().c_str()); + _tree->begin(); + Fl_Input *but = new Fl_Input(1,1,IW,1); + _treeWidgets.push_back(but); + but->copy_label(getShortName(strings[i].getName()).c_str()); + but->value(strings[i].getValue().c_str()); + but->align(FL_ALIGN_RIGHT); + but->callback(onelab_string_cb, (void*)n); + but->when(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY); n->widget(but); _tree->end(); } + _tree->activate(); _tree->redraw(); //n->user_data((void*)gv); //n->close(); diff --git a/Fltk/onelabWindow.h b/Fltk/onelabWindow.h index 2d35d82b76e8c7e6df5275bf8bb311b94a404bdf..a0b94818c8e813218ff541c98bc7f0bb5ad03d2d 100644 --- a/Fltk/onelabWindow.h +++ b/Fltk/onelabWindow.h @@ -12,19 +12,29 @@ #include <FL/Fl_Window.H> #include <FL/Fl_Tree.H> #include <FL/Fl_Button.H> +#include <FL/Fl_Input.H> #include "onelab.h" class onelabWindow{ private: Fl_Window *_win; Fl_Tree *_tree; - Fl_Button *_run; + Fl_Button *_butt[2]; + Fl_Input *_model; std::vector<Fl_Widget*> _treeWidgets; public: onelabWindow(int deltaFontSize=0); void rebuildTree(); void redrawTree(); void show(){ _win->show(); } + std::string getModelName(){ return _model->value(); } + void setModelName(const std::string &name){ _model->value(name.c_str()); } + std::string getPath(Fl_Tree_Item *item) + { + char path[1024]; + _tree->item_pathname(path, 1024, item); + return std::string(path); + } }; void onelab_cb(Fl_Widget *w, void *data);