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

refactored connectionChooser into historyChooser + used it for new patternChooser

parent 8ece60ca
No related branches found
No related tags found
No related merge requests found
......@@ -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());
}
};
static _connectionChooser *chooser = 0;
static void select_cb(Fl_Widget* w, void *data)
{
int i = chooser->browser->value();
if(i) chooser->input->value(chooser->browser->text(i));
}
std::string connectionChooser()
std::string run()
{
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);
}
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();
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, "connection%02d", i);
sprintf(name, "%s%02d", _prefix.c_str(), i);
if(prefs.entryExists(name)){
prefs.get(name, value, "", sizeof(value));
chooser->browser->add(value);
browser->add(value);
}
}
int n = chooser->browser->size();
int n = browser->size();
if(n){
if(old > 0 && old <= n)
chooser->input->value(chooser->browser->text(old));
input->value(browser->text(old));
else
chooser->input->value(chooser->browser->text(1));
input->value(browser->text(1));
}
else
chooser->input->value("./gmsh ../tutorial/view3.pos");
chooser->window->show();
while(chooser->window->shown()){
input->value(_defaultCommand.c_str());
window->show();
while(window->shown()){
Fl::wait();
for (;;) {
Fl_Widget* o = Fl::readqueue();
if (!o) break;
if (o == chooser->ok) {
if(strlen(chooser->input->value())){
if (o == ok) {
if(strlen(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);
for(int i = 0; i < browser->size(); i++){
if(!strcmp(input->value(), browser->text(i + 1))){
browser->remove(i + 1);
break;
}
}
chooser->browser->insert(1, chooser->input->value());
browser->insert(1, input->value());
}
chooser->save(prefs);
chooser->window->hide();
return chooser->input->value();
save(prefs);
window->hide();
return input->value();
}
if (o == chooser->window || o == chooser->cancel){
chooser->save(prefs);
chooser->window->hide();
if (o == window || o == cancel){
save(prefs);
window->hide();
return "";
}
}
}
return "";
}
};
static historyChooser *_connectionChooser = 0;
static void connection_select_cb(Fl_Widget* w, void *data)
{
int i = _connectionChooser->browser->value();
if(i) _connectionChooser->input->value(_connectionChooser->browser->text(i));
}
std::string connectionChooser()
{
if(!_connectionChooser){
_connectionChooser = new historyChooser
("connection", "Remote Start", "Command:", "./gmsh ../tutorial/view3.pos",
"Run");
_connectionChooser->browser->callback(connection_select_cb);
}
return _connectionChooser->run();
}
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));
}
std::string patternChooser()
{
if(!_patternChooser){
_patternChooser = new historyChooser
("pattern", "Watch Patern", "Pattern:", "output/*.msh", "Watch");
_patternChooser->browser->callback(pattern_select_cb);
}
return _patternChooser->run();
}
......@@ -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
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment