Skip to content
Snippets Groups Projects
Commit c3b65ced authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

add/remove clients from gui

parent c72e8b1e
No related branches found
No related tags found
No related merge requests found
...@@ -607,18 +607,16 @@ namespace onelab{ ...@@ -607,18 +607,16 @@ namespace onelab{
{ {
return _parameterSpace.get(ps, name, client); return _parameterSpace.get(ps, name, client);
} }
bool registerClient(client *c)
{
_clients[c->getName()] = c;
c->setId(_clients.size());
return true;
}
typedef std::map<std::string, client*>::iterator citer; typedef std::map<std::string, client*>::iterator citer;
citer firstClient(){ return _clients.begin(); } citer firstClient(){ return _clients.begin(); }
citer lastClient(){ return _clients.end(); } citer lastClient(){ return _clients.end(); }
citer findClient(const std::string &name){ return _clients.find(name); } citer findClient(const std::string &name){ return _clients.find(name); }
citer removeClient(const std::string &name){ _clients.erase(name); } void registerClient(client *c)
int getNumClients(){ return _clients.size(); } {
_clients[c->getName()] = c;
c->setId(_clients.size());
}
void unregisterClient(client *c){ _clients.erase(c->getName()); }
void setChanged(bool changed, const std::string &client="") void setChanged(bool changed, const std::string &client="")
{ {
_parameterSpace.setChanged(changed, client); _parameterSpace.setChanged(changed, client);
...@@ -635,24 +633,21 @@ namespace onelab{ ...@@ -635,24 +633,21 @@ namespace onelab{
class localClient : public client{ class localClient : public client{
private: private:
// the pointer to the server
server *_server;
template <class T> bool _set(const T &p) template <class T> bool _set(const T &p)
{ {
_server->set(p, _name); server::instance()->set(p, _name);
return true; return true;
} }
template <class T> bool _get(std::vector<T> &ps, template <class T> bool _get(std::vector<T> &ps,
const std::string &name="") const std::string &name="")
{ {
_server->get(ps, name, _name); server::instance()->get(ps, name, _name);
return true; return true;
} }
public: public:
localClient(const std::string &name) : client(name) localClient(const std::string &name) : client(name)
{ {
_server = server::instance(); server::instance()->registerClient(this);
_server->registerClient(this);
} }
virtual ~localClient(){} virtual ~localClient(){}
virtual bool set(const number &p){ return _set(p); } virtual bool set(const number &p){ return _set(p); }
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
// bugs and problems to <gmsh@geuz.org>. // bugs and problems to <gmsh@geuz.org>.
#include <FL/Fl.H> #include <FL/Fl.H>
#include <FL/fl_ask.H>
#include "GmshMessage.h" #include "GmshMessage.h"
#include "onelab.h" #include "onelab.h"
...@@ -220,8 +221,13 @@ bool onelab::localNetworkClient::run(const std::string &what) ...@@ -220,8 +221,13 @@ bool onelab::localNetworkClient::run(const std::string &what)
case GmshSocket::GMSH_MERGE_FILE: case GmshSocket::GMSH_MERGE_FILE:
{ {
int n = PView::list.size(); int n = PView::list.size();
for(int i = 0; i < n; i++) PView::list[i]->getOptions()->visible = 0; for(int i = 0; i < n; i++)
PView::list[i]->getOptions()->visible = 0;
MergeFile(message); MergeFile(message);
if(FlGui::instance()->onelab->hideNewViews()){
for(int i = n; i < PView::list.size(); i++)
PView::list[i]->getOptions()->visible = 0;
}
drawContext::global()->draw(); drawContext::global()->draw();
if(n != (int)PView::list.size()) if(n != (int)PView::list.size())
FlGui::instance()->menu->setContext(menu_post, 0); FlGui::instance()->menu->setContext(menu_post, 0);
...@@ -495,6 +501,28 @@ void onelab_cb(Fl_Widget *w, void *data) ...@@ -495,6 +501,28 @@ void onelab_cb(Fl_Widget *w, void *data)
if(!data) return; if(!data) return;
std::string action((const char*)data); std::string action((const char*)data);
if(action == "stop"){
FlGui::instance()->onelab->stop(true);
FlGui::instance()->onelab->setButtonMode("kill");
return;
}
if(action == "kill"){
FlGui::instance()->onelab->stop(true);
for(onelab::server::citer it = onelab::server::instance()->firstClient();
it != onelab::server::instance()->lastClient(); it++)
it->second->kill();
return;
}
if(action == "dump"){
std::string db = onelab::server::instance()->toChar();
for(unsigned int i = 0; i < db.size(); i++)
if(db[i] == onelab::parameter::charSep()) db[i] = '|';
printf("OneLab dump:\n%s\n", db.c_str());
return;
}
if(action == "reset"){ if(action == "reset"){
// clear everything except model names // clear everything except model names
std::vector<onelab::string> modelNames; std::vector<onelab::string> modelNames;
...@@ -514,7 +542,7 @@ void onelab_cb(Fl_Widget *w, void *data) ...@@ -514,7 +542,7 @@ void onelab_cb(Fl_Widget *w, void *data)
action = "check"; action = "check";
} }
FlGui::instance()->onelab->deactivate("stop"); FlGui::instance()->onelab->setButtonMode("stop");
if(action == "compute") initializeLoop(); if(action == "compute") initializeLoop();
...@@ -604,27 +632,10 @@ void onelab_cb(Fl_Widget *w, void *data) ...@@ -604,27 +632,10 @@ void onelab_cb(Fl_Widget *w, void *data)
incrementLoop()); incrementLoop());
FlGui::instance()->onelab->stop(false); FlGui::instance()->onelab->stop(false);
FlGui::instance()->onelab->activate(); FlGui::instance()->onelab->setButtonMode("compute");
FlGui::instance()->onelab->show(); FlGui::instance()->onelab->show();
} }
void onelab_stop_cb(Fl_Widget *w, void *data)
{
if(!data) return;
std::string action((const char*)data);
FlGui::instance()->onelab->stop(true);
if(action == "stop"){
FlGui::instance()->onelab->deactivate("kill");
}
else{
for(onelab::server::citer it = onelab::server::instance()->firstClient();
it != onelab::server::instance()->lastClient(); it++)
it->second->kill();
}
}
static void onelab_check_button_cb(Fl_Widget *w, void *data) static void onelab_check_button_cb(Fl_Widget *w, void *data)
{ {
if(!data) return; if(!data) return;
...@@ -709,12 +720,17 @@ static void onelab_remove_solver_cb(Fl_Widget *w, void *data) ...@@ -709,12 +720,17 @@ static void onelab_remove_solver_cb(Fl_Widget *w, void *data)
FlGui::instance()->onelab->removeSolver(c->getName()); FlGui::instance()->onelab->removeSolver(c->getName());
} }
static void onelab_dump_cb(Fl_Widget *w, void *data) static void onelab_add_solver_cb(Fl_Widget *w, void *data)
{ {
std::string db = onelab::server::instance()->toChar(); for(int i = 0; i < 5; i++){
for(unsigned int i = 0; i < db.size(); i++) if(opt_solver_name(i, GMSH_GET, "").empty()){
if(db[i] == onelab::parameter::charSep()) db[i] = '|'; const char *name = fl_input("Solver name:", "");
printf("OneLab dump:\n%s\n", db.c_str()); if(name){
FlGui::instance()->onelab->addSolver(name, "", i);
}
return;
}
}
} }
onelabWindow::onelabWindow(int deltaFontSize) onelabWindow::onelabWindow(int deltaFontSize)
...@@ -742,9 +758,11 @@ onelabWindow::onelabWindow(int deltaFontSize) ...@@ -742,9 +758,11 @@ onelabWindow::onelabWindow(int deltaFontSize)
(_butt[1]->x() - WB - BB/2, _butt[1]->y(), BB/2, BH, "@-1gmsh_gear"); (_butt[1]->x() - WB - BB/2, _butt[1]->y(), BB/2, BH, "@-1gmsh_gear");
_gear->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); _gear->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
_gear->add("Reset database", 0, onelab_cb, (void*)"reset"); _gear->add("Reset database", 0, onelab_cb, (void*)"reset");
_gear->add("Print database", 0, onelab_dump_cb); _gear->add("_Print database", 0, onelab_cb, (void*)"dump");
_gear->add("_Remesh automatically", 0, 0, 0, FL_MENU_TOGGLE); _gear->add("Remesh automatically", 0, 0, 0, FL_MENU_TOGGLE);
_gear->add("_Hide new views", 0, 0, 0, FL_MENU_TOGGLE);
((Fl_Menu_Item*)_gear->menu())[2].set(); ((Fl_Menu_Item*)_gear->menu())[2].set();
((Fl_Menu_Item*)_gear->menu())[3].clear();
_gearFrozenMenuSize = _gear->menu()->size(); _gearFrozenMenuSize = _gear->menu()->size();
Fl_Box *resbox = new Fl_Box(WB, WB, Fl_Box *resbox = new Fl_Box(WB, WB,
...@@ -861,27 +879,6 @@ void onelabWindow::rebuildTree() ...@@ -861,27 +879,6 @@ void onelabWindow::rebuildTree()
FL_NORMAL_SIZE += _deltaFontSize; FL_NORMAL_SIZE += _deltaFontSize;
} }
void onelabWindow::rebuildSolverList()
{
for(int i = _gear->menu()->size(); i >= _gearFrozenMenuSize - 1; i--)
_gear->remove(i);
_title = "OneLab -";
for(onelab::server::citer it = onelab::server::instance()->firstClient();
it != onelab::server::instance()->lastClient(); it++){
onelab::client *c = it->second;
char tmp[256];
if(c->isNetworkClient()){
sprintf(tmp, "%s/Choose executable", c->getName().c_str());
_gear->add(tmp, 0, onelab_choose_executable_cb, (void*)c);
}
sprintf(tmp, "%s/Remove", c->getName().c_str());
_gear->add(tmp, 0, onelab_remove_solver_cb, (void*)c);
_title += " " + c->getName();
}
_win->label(_title.c_str());
}
void onelabWindow::checkForErrors(const std::string &client) void onelabWindow::checkForErrors(const std::string &client)
{ {
if(Msg::GetErrorCount() > 0 && !CTX::instance()->expertMode){ if(Msg::GetErrorCount() > 0 && !CTX::instance()->expertMode){
...@@ -895,25 +892,64 @@ void onelabWindow::checkForErrors(const std::string &client) ...@@ -895,25 +892,64 @@ void onelabWindow::checkForErrors(const std::string &client)
} }
} }
void onelabWindow::activate() void onelabWindow::setButtonMode(const std::string &mode)
{ {
if(mode == "compute"){
_butt[0]->label("Compute"); _butt[0]->label("Compute");
_butt[0]->callback(onelab_cb, (void*)"compute"); _butt[0]->callback(onelab_cb, (void*)"compute");
_butt[1]->activate(); _butt[1]->activate();
} }
else if(mode == "stop"){
void onelabWindow::deactivate(const std::string &how)
{
if(how == "stop"){
_butt[0]->label("Stop"); _butt[0]->label("Stop");
_butt[0]->callback(onelab_stop_cb, (void*)"stop"); _butt[0]->callback(onelab_cb, (void*)"stop");
_butt[1]->deactivate();
} }
else{ else{
_butt[0]->label("Kill"); _butt[0]->label("Kill");
_butt[0]->callback(onelab_stop_cb, (void*)"kill"); _butt[0]->callback(onelab_cb, (void*)"kill");
}
_butt[1]->deactivate(); _butt[1]->deactivate();
} }
}
void onelabWindow::rebuildSolverList()
{
// update OneLab window title and gear menu
_title = "OneLab";
for(int i = _gear->menu()->size(); i >= _gearFrozenMenuSize - 1; i--)
_gear->remove(i);
for(onelab::server::citer it = onelab::server::instance()->firstClient();
it != onelab::server::instance()->lastClient(); it++){
if(it == onelab::server::instance()->firstClient()) _title += " -";
if(it->second->isNetworkClient()){
onelab::localNetworkClient *c = (onelab::localNetworkClient*)it->second;
char tmp[256];
sprintf(tmp, "%s/Choose executable", c->getName().c_str());
_gear->add(tmp, 0, onelab_choose_executable_cb, (void*)c);
sprintf(tmp, "%s/Remove", c->getName().c_str());
_gear->add(tmp, 0, onelab_remove_solver_cb, (void*)c);
}
_title += " " + it->second->getName();
}
_gear->add("Add new client...", 0, onelab_add_solver_cb);
_win->label(_title.c_str());
// update Gmsh solver menu
std::vector<std::string> names, exes;
for(int i = 0; i < 5; i++){
if(opt_solver_name(i, GMSH_GET, "").size()){
names.push_back(opt_solver_name(i, GMSH_GET, ""));
exes.push_back(opt_solver_executable(i, GMSH_GET, ""));
}
}
for(unsigned int i = 0; i < names.size(); i++){
onelab::server::citer it = onelab::server::instance()->findClient(names[i]);
if(it != onelab::server::instance()->lastClient())
it->second->setIndex(i);
opt_solver_name(i, GMSH_SET, names[i]);
opt_solver_executable(i, GMSH_SET, exes[i]);
}
FlGui::instance()->menu->setContext(menu_solver, 0);
}
void onelabWindow::addSolver(const std::string &name, const std::string &commandLine, void onelabWindow::addSolver(const std::string &name, const std::string &commandLine,
int index) int index)
...@@ -922,11 +958,11 @@ void onelabWindow::addSolver(const std::string &name, const std::string &command ...@@ -922,11 +958,11 @@ void onelabWindow::addSolver(const std::string &name, const std::string &command
if(it == onelab::server::instance()->lastClient()){ if(it == onelab::server::instance()->lastClient()){
onelab::localNetworkClient *c = new onelab::localNetworkClient(name, commandLine); onelab::localNetworkClient *c = new onelab::localNetworkClient(name, commandLine);
c->setIndex(index); c->setIndex(index);
if(commandLine.empty()) onelab_choose_executable_cb(0, (void *)c); opt_solver_name(index, GMSH_SET, name);
if(commandLine.empty())
onelab_choose_executable_cb(0, (void *)c);
if(name == "GetDP") if(name == "GetDP")
setModelExtension(".pro"); setModelExtension(".pro");
else
setModelExtension(".py");
} }
FlGui::instance()->onelab->rebuildSolverList(); FlGui::instance()->onelab->rebuildSolverList();
} }
...@@ -936,9 +972,14 @@ void onelabWindow::removeSolver(const std::string &name) ...@@ -936,9 +972,14 @@ void onelabWindow::removeSolver(const std::string &name)
onelab::server::citer it = onelab::server::instance()->findClient(name); onelab::server::citer it = onelab::server::instance()->findClient(name);
if(it != onelab::server::instance()->lastClient()){ if(it != onelab::server::instance()->lastClient()){
onelab::client *c = it->second; onelab::client *c = it->second;
onelab::server::instance()->removeClient(name); if(c->isNetworkClient()){
if(c->isNetworkClient()) // cannot delete local gmsh client (allocated in Msg) onelab::server::instance()->unregisterClient(c);
delete it->second; if(c->getIndex() >= 0 && c->getIndex() < 5){
opt_solver_name(c->getIndex(), GMSH_SET, "");
opt_solver_executable(c->getIndex(), GMSH_SET, "");
}
delete c;
}
} }
FlGui::instance()->onelab->rebuildSolverList(); FlGui::instance()->onelab->rebuildSolverList();
} }
......
...@@ -35,13 +35,13 @@ class onelabWindow{ ...@@ -35,13 +35,13 @@ class onelabWindow{
void rebuildSolverList(); void rebuildSolverList();
void rebuildTree(); void rebuildTree();
void redrawTree(){ _tree->redraw(); } void redrawTree(){ _tree->redraw(); }
void activate(); void setButtonMode(const std::string &mode);
void deactivate(const std::string &how);
void show(){ _win->show(); } void show(){ _win->show(); }
int shown(){ return _win->shown(); } int shown(){ return _win->shown(); }
std::string getModelExtension(){ return _modelExtension; } std::string getModelExtension(){ return _modelExtension; }
void setModelExtension(const std::string &ext){ _modelExtension = ext; } void setModelExtension(const std::string &ext){ _modelExtension = ext; }
int meshAuto(){ return _gear->menu()[2].value(); } int meshAuto(){ return _gear->menu()[2].value(); }
int hideNewViews(){ return _gear->menu()[3].value(); }
std::string getPath(Fl_Tree_Item *item) std::string getPath(Fl_Tree_Item *item)
{ {
char path[1024]; char path[1024];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment