diff --git a/Fltk/extraDialogs.cpp b/Fltk/extraDialogs.cpp index fba6c27584b56d2c1877b7e0c711ec830709f96b..ce076746eae4912d97766fe3a00cd8a931078d67 100644 --- a/Fltk/extraDialogs.cpp +++ b/Fltk/extraDialogs.cpp @@ -201,9 +201,9 @@ int modelChooser() return 0; } -// Connection chooser +// Connection and pattern choosers -class ConnectionBrowser : public Fl_Hold_Browser { +class historyBrowser : public Fl_Hold_Browser { int handle(int event) { switch (event) { @@ -223,122 +223,151 @@ class ConnectionBrowser : public Fl_Hold_Browser { return Fl_Hold_Browser::handle(event); }; public: - ConnectionBrowser(int x, int y, int w, int h, const char *l=0) + historyBrowser(int x, int y, int w, int h, const char *l=0) : Fl_Hold_Browser(x, y, w, h, l) {} }; -struct _connectionChooser{ +class historyChooser{ + private: + std::string _prefix, _label, _commandLabel, _defaultCommand, _okLabel; + public: Fl_Double_Window *window; Fl_Input *input; - ConnectionBrowser *browser; + historyBrowser *browser; Fl_Return_Button *ok; Fl_Button *cancel; + public: + historyChooser(const std::string &prefix, const std::string &label, + const std::string &commandLabel, const std::string &defaultCommand, + const std::string &okLabel) + : _prefix(prefix), _label(label), _commandLabel(commandLabel), + _defaultCommand(defaultCommand), _okLabel(okLabel) + { + int x = 100, y = 100, h = 4 * WB + 10 * BH, w = 3 * BB + 2 * WB; + window = new Fl_Double_Window(w, h); + window->set_modal(); + window->label(_label.c_str()); + Fl_Box *b1 = new Fl_Box(WB, WB, w, BH, _commandLabel.c_str()); + b1->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT); + input = new Fl_Input(WB, WB + BH, w - 2 * WB, BH); + Fl_Box *b2 = new Fl_Box(WB, 2 * WB + 2 * BH, w, BH, "History:"); + b2->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT); + browser = new historyBrowser + (WB, 2 * WB + 3 * BH, w - 2 * WB, h - 4 * BH - 4 * WB); + cancel = new Fl_Button + (w - 2 * WB - 2 * BB, h - WB - BH, BB, BH, "Cancel"); + ok = new Fl_Return_Button + (w - WB - BB, h - WB - BH, BB, BH, _okLabel.c_str()); + Fl_Box *b3 = new Fl_Box(WB, h - WB - BB, WB, WB); + b3->hide(); + window->resizable(b3); + } void save(Fl_Preferences &prefs) { for(int i = 0; i < 100; i++){ char name[256]; - sprintf(name, "connection%02d", i); + sprintf(name, "%s%02d", _prefix.c_str(), i); if(i < browser->size()) prefs.set(name, browser->text(i + 1)); else if(prefs.entryExists(name)) prefs.deleteEntry(name); } - prefs.set("connectionPositionX", window->x()); - prefs.set("connectionPositionY", window->y()); - prefs.set("connectionWidth", window->w()); - prefs.set("connectionHeight", window->h()); + prefs.set((_prefix + "PositionX").c_str(), window->x()); + prefs.set((_prefix + "PositionY").c_str(), window->y()); + prefs.set((_prefix + "Width").c_str(), window->w()); + prefs.set((_prefix + "Height").c_str(), window->h()); + } + std::string run() + { + Fl_Preferences prefs(Fl_Preferences::USER, "fltk.org", "gmsh"); + int x = 100, y = 100, h = 4 * WB + 10 * BH, w = 3 * BB + 2 * WB; + prefs.get((_prefix + "PositionX").c_str(), x, x); + prefs.get((_prefix + "PositionY").c_str(), y, y); + prefs.get((_prefix + "Width").c_str(), w, w); + prefs.get((_prefix + "Height").c_str(), h, h); + window->resize(x, y, w, h); + int old = browser->value(); + browser->clear(); + for (int i = 0; i < 100; i++) { + char name[256], value[1024]; + sprintf(name, "%s%02d", _prefix.c_str(), i); + if(prefs.entryExists(name)){ + prefs.get(name, value, "", sizeof(value)); + browser->add(value); + } + } + int n = browser->size(); + if(n){ + if(old > 0 && old <= n) + input->value(browser->text(old)); + else + input->value(browser->text(1)); + } + else + input->value(_defaultCommand.c_str()); + window->show(); + while(window->shown()){ + Fl::wait(); + for (;;) { + Fl_Widget* o = Fl::readqueue(); + if (!o) break; + if (o == ok) { + if(strlen(input->value())){ + // insert choosen value at the top of the history + for(int i = 0; i < browser->size(); i++){ + if(!strcmp(input->value(), browser->text(i + 1))){ + browser->remove(i + 1); + break; + } + } + browser->insert(1, input->value()); + } + save(prefs); + window->hide(); + return input->value(); + } + if (o == window || o == cancel){ + save(prefs); + window->hide(); + return ""; + } + } + } + return ""; } }; -static _connectionChooser *chooser = 0; - -static void select_cb(Fl_Widget* w, void *data) +static historyChooser *_connectionChooser = 0; +static void connection_select_cb(Fl_Widget* w, void *data) { - int i = chooser->browser->value(); - if(i) chooser->input->value(chooser->browser->text(i)); + int i = _connectionChooser->browser->value(); + if(i) _connectionChooser->input->value(_connectionChooser->browser->text(i)); } std::string connectionChooser() { - int x = 100, y = 100, h = 4 * WB + 10 * BH, w = 3 * BB + 2 * WB; - - if(!chooser){ - chooser = new _connectionChooser; - chooser->window = new Fl_Double_Window(w, h); - chooser->window->set_modal(); - chooser->window->label("Remote Start"); - Fl_Box *b1 = new Fl_Box(WB, WB, w, BH, "Command:"); - b1->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT); - chooser->input = new Fl_Input(WB, WB + BH, w - 2 * WB, BH); - Fl_Box *b2 = new Fl_Box(WB, 2 * WB + 2 * BH, w, BH, "History:"); - b2->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT); - chooser->browser = new ConnectionBrowser - (WB, 2 * WB + 3 * BH, w - 2 * WB, h - 4 * BH - 4 * WB); - chooser->browser->callback(select_cb); - chooser->cancel = new Fl_Button - (w - 2 * WB - 2 * BB, h - WB - BH, BB, BH, "Cancel"); - chooser->ok = new Fl_Return_Button - (w - WB - BB, h - WB - BH, BB, BH, "Run"); - Fl_Box *b3 = new Fl_Box(WB, h - WB - BB, WB, WB); - b3->hide(); - chooser->window->resizable(b3); + if(!_connectionChooser){ + _connectionChooser = new historyChooser + ("connection", "Remote Start", "Command:", "./gmsh ../tutorial/view3.pos", + "Run"); + _connectionChooser->browser->callback(connection_select_cb); } + return _connectionChooser->run(); +} - Fl_Preferences prefs(Fl_Preferences::USER, "fltk.org", "gmsh"); - prefs.get("connectionPositionX", x, x); - prefs.get("connectionPositionY", y, y); - prefs.get("connectionWidth", w, w); - prefs.get("connectionHeight", h, h); - chooser->window->resize(x, y, w, h); - - int old = chooser->browser->value(); - chooser->browser->clear(); - for (int i = 0; i < 100; i++) { - char name[256], value[1024]; - sprintf(name, "connection%02d", i); - if(prefs.entryExists(name)){ - prefs.get(name, value, "", sizeof(value)); - chooser->browser->add(value); - } - } - int n = chooser->browser->size(); - if(n){ - if(old > 0 && old <= n) - chooser->input->value(chooser->browser->text(old)); - else - chooser->input->value(chooser->browser->text(1)); - } - else - chooser->input->value("./gmsh ../tutorial/view3.pos"); - - chooser->window->show(); +static historyChooser *_patternChooser = 0; +static void pattern_select_cb(Fl_Widget* w, void *data) +{ + int i = _patternChooser->browser->value(); + if(i) _patternChooser->input->value(_patternChooser->browser->text(i)); +} - while(chooser->window->shown()){ - Fl::wait(); - for (;;) { - Fl_Widget* o = Fl::readqueue(); - if (!o) break; - if (o == chooser->ok) { - if(strlen(chooser->input->value())){ - // insert choosen value at the top of the history - for(int i = 0; i < chooser->browser->size(); i++){ - if(!strcmp(chooser->input->value(), chooser->browser->text(i + 1))){ - chooser->browser->remove(i + 1); - break; - } - } - chooser->browser->insert(1, chooser->input->value()); - } - chooser->save(prefs); - chooser->window->hide(); - return chooser->input->value(); - } - if (o == chooser->window || o == chooser->cancel){ - chooser->save(prefs); - chooser->window->hide(); - return ""; - } - } +std::string patternChooser() +{ + if(!_patternChooser){ + _patternChooser = new historyChooser + ("pattern", "Watch Patern", "Pattern:", "output/*.msh", "Watch"); + _patternChooser->browser->callback(pattern_select_cb); } - return ""; + return _patternChooser->run(); } diff --git a/Fltk/extraDialogs.h b/Fltk/extraDialogs.h index eb862c16116c0d549aee5fd8b2a1738fc846b187..5f36976a6759983b8468a5c2a6ae06b99dc3308e 100644 --- a/Fltk/extraDialogs.h +++ b/Fltk/extraDialogs.h @@ -12,5 +12,6 @@ int arrowEditor(const char *title, double &a, double &b, double &c); int perspectiveEditor(); int modelChooser(); std::string connectionChooser(); +std::string patternChooser(); #endif diff --git a/Fltk/menuWindow.cpp b/Fltk/menuWindow.cpp index cdb68cc71a5201d712a2f5eb05d4d7dff542ff5f..35437540ff330b5e486afaba156edee75b91b5c9 100644 --- a/Fltk/menuWindow.cpp +++ b/Fltk/menuWindow.cpp @@ -418,11 +418,7 @@ void file_quit_cb(Fl_Widget *w, void *data) void file_watch_cb(Fl_Widget *w, void *data) { - if(w){ - if(fileChooser(FILE_CHOOSER_CREATE, "Watch Pattern", "*")) { - CTX::instance()->watchFilePattern = fileChooserGetName(1); - } - } + if(w) CTX::instance()->watchFilePattern = patternChooser(); if(CTX::instance()->watchFilePattern.empty()) return;