diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h index c4d4e653e7ea8d99a72198c4a28c3dc5fbce0543..9ebe7dd8b3f5679b330dbb2a7f9bbd175f0348bd 100644 --- a/Common/DefaultOptions.h +++ b/Common/DefaultOptions.h @@ -99,7 +99,7 @@ StringXString GeneralOptions_String[] = { #endif "System command to launch a web browser" }, - { F|0, "WatchFilePattern", opt_general_watch_file_pattern , "" , + { F, "WatchFilePattern", opt_general_watch_file_pattern , "" , "Pattern of files to merge as they become available"}, { 0, 0 , 0 , "" , 0 } diff --git a/Fltk/fieldWindow.cpp b/Fltk/fieldWindow.cpp index 65225863faae182289687ec877e848bce26aab78..56a37a9ff35c073572bd55ec11bedb5660028b3f 100644 --- a/Fltk/fieldWindow.cpp +++ b/Fltk/fieldWindow.cpp @@ -83,7 +83,7 @@ static void field_put_on_view_cb(Fl_Widget *w, void *data) static void field_select_file_cb(Fl_Widget *w, void *data) { Fl_Input *input = (Fl_Input*)data; - int ret = fileChooser(0, 0, "File selection", "", input->value()); + int ret = fileChooser(FILE_CHOOSER_SINGLE, "Choose", "", input->value()); if(ret){ input->value(fileChooserGetName(0).c_str()); input->set_changed(); diff --git a/Fltk/fileDialogs.cpp b/Fltk/fileDialogs.cpp index d1d62cd1ae31c2832d3125bd7ef007cea6b0f1ff..f29d1b282304284fc4a2327ef2a63186a050c6d5 100644 --- a/Fltk/fileDialogs.cpp +++ b/Fltk/fileDialogs.cpp @@ -22,6 +22,7 @@ #include "GmshMessage.h" #include "GmshDefines.h" #include "FlGui.h" +#include "fileDialogs.h" #include "CreateFile.h" #include "Options.h" #include "GModel.h" @@ -75,7 +76,7 @@ static flFileChooser *fc = 0; #endif -int fileChooser(int multi, int create, const char *message, +int fileChooser(FILE_CHOOSER_TYPE type, const char *message, const char *filter, const char *fname) { static char thefilter[1024] = ""; @@ -89,12 +90,16 @@ int fileChooser(int multi, int create, const char *message, #if defined(HAVE_NATIVE_FILE_CHOOSER) if(!fc) fc = new Fl_Native_File_Chooser(); - if(multi) - fc->type(Fl_Native_File_Chooser::BROWSE_MULTI_FILE); - else if(create) - fc->type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE); - else - fc->type(Fl_Native_File_Chooser::BROWSE_FILE); + switch(type){ + case FILE_CHOOSER_MULTI: + fc->type(Fl_Native_File_Chooser::BROWSE_MULTI_FILE); break; + case FILE_CHOOSER_CREATE: + fc->type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE); break; + case FILE_CHOOSER_DIRECTORY: + fc->type(Fl_Native_File_Chooser::BROWSE_DIRECTORY); break; + default: + fc->type(Fl_Native_File_Chooser::BROWSE_FILE); break; + } fc->title(message); fc->filter(filter); fc->filter_value(thefilterindex); @@ -119,12 +124,16 @@ int fileChooser(int multi, int create, const char *message, fc->position(CTX::instance()->fileChooserPosition[0], CTX::instance()->fileChooserPosition[1]); } - if(multi) - fc->type(Fl_File_Chooser::MULTI); - else if(create) - fc->type(Fl_File_Chooser::CREATE); - else - fc->type(Fl_File_Chooser::SINGLE); + switch(type){ + case FILE_CHOOSER_MULTI: + fc->type(Fl_File_Chooser::MULTI); break; + case FILE_CHOOSER_CREATE: + fc->type(Fl_File_Chooser::CREATE); break; + case FILE_CHOOSER_DIRECTORY: + fc->type(Fl_File_Chooser::DIRECTORY); break; + default: + fc->type(Fl_File_Chooser::SINGLE); break; + } fc->label(message); fc->filter(thefilter); fc->filter_value(thefilterindex); diff --git a/Fltk/fileDialogs.h b/Fltk/fileDialogs.h index e1dab6f5e80720ae1b1952834ea9139d8cf6a26e..5c1b92eda9078e37efd6234e6639b5315248af11 100644 --- a/Fltk/fileDialogs.h +++ b/Fltk/fileDialogs.h @@ -8,7 +8,14 @@ #include <string> -int fileChooser(int multi, int create, const char *message, +typedef enum { + FILE_CHOOSER_SINGLE, + FILE_CHOOSER_MULTI, + FILE_CHOOSER_CREATE, + FILE_CHOOSER_DIRECTORY +} FILE_CHOOSER_TYPE; + +int fileChooser(FILE_CHOOSER_TYPE type, const char *message, const char *pat, const char *fname=NULL); std::string fileChooserGetName(int num); int fileChooserGetFilter(); diff --git a/Fltk/menuWindow.cpp b/Fltk/menuWindow.cpp index 71873fc7a357e76f71240738dbe6211beb9dff00..cdb68cc71a5201d712a2f5eb05d4d7dff542ff5f 100644 --- a/Fltk/menuWindow.cpp +++ b/Fltk/menuWindow.cpp @@ -55,7 +55,7 @@ static void file_new_cb(Fl_Widget *w, void *data) { test: - if(fileChooser(0, 1, "New", "*")) { + if(fileChooser(FILE_CHOOSER_CREATE, "New", "*")) { std::string name = fileChooserGetName(1); if(!StatFile(name)){ if(fl_choice("File '%s' already exists.\n\nDo you want to erase it?", @@ -122,7 +122,7 @@ static const char *input_formats = static void file_open_cb(Fl_Widget *w, void *data) { int n = PView::list.size(); - if(fileChooser(0, 0, "Open", input_formats)) { + if(fileChooser(FILE_CHOOSER_SINGLE, "Open", input_formats)) { OpenProject(fileChooserGetName(1)); drawContext::global()->draw(); } @@ -133,7 +133,7 @@ static void file_open_cb(Fl_Widget *w, void *data) static void file_merge_cb(Fl_Widget *w, void *data) { int n = PView::list.size(); - int f = fileChooser(1, 0, "Merge", input_formats); + int f = fileChooser(FILE_CHOOSER_MULTI, "Merge", input_formats); if(f) { for(int i = 1; i <= f; i++) MergeFile(fileChooserGetName(i)); @@ -355,7 +355,7 @@ static void file_save_as_cb(Fl_Widget *w, void *data) } test: - if(fileChooser(0, 1, "Save As", pat)) { + if(fileChooser(FILE_CHOOSER_CREATE, "Save As", pat)) { std::string name = fileChooserGetName(1); if(CTX::instance()->confirmOverwrite) { if(!StatFile(name)) @@ -394,7 +394,8 @@ static void file_options_save_cb(Fl_Widget *w, void *data) static void file_rename_cb(Fl_Widget *w, void *data) { test: - if(fileChooser(0, 1, "Rename", "*", GModel::current()->getFileName().c_str())) { + if(fileChooser(FILE_CHOOSER_CREATE, "Rename", "*", + GModel::current()->getFileName().c_str())) { std::string name = fileChooserGetName(1); if(CTX::instance()->confirmOverwrite) { if(!StatFile(name)) @@ -417,6 +418,12 @@ 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(CTX::instance()->watchFilePattern.empty()) return; std::string pattern = FixRelativePath @@ -2154,7 +2161,8 @@ static void view_save_as(int index, const char *title, int format) PView *view = PView::list[index]; test: - if(fileChooser(0, 1, title, "*", view->getData()->getFileName().c_str())){ + if(fileChooser(FILE_CHOOSER_CREATE, title, "*", + view->getData()->getFileName().c_str())){ std::string name = fileChooserGetName(1); if(CTX::instance()->confirmOverwrite) { if(!StatFile(name)) @@ -2280,7 +2288,7 @@ static Fl_Menu_Item bar_table[] = { {"&File", 0, 0, 0, FL_SUBMENU}, {"&New...", FL_CTRL+'n', (Fl_Callback *)file_new_cb, 0}, {"&Open...", FL_CTRL+'o', (Fl_Callback *)file_open_cb, 0}, - {"Open recent", 0, 0, 0, FL_SUBMENU}, + {"Open Recent", 0, 0, 0, FL_SUBMENU}, {"History1", 0, 0, 0, FL_MENU_INVISIBLE}, {"History2", 0, 0, 0, FL_MENU_INVISIBLE}, {"History3", 0, 0, 0, FL_MENU_INVISIBLE}, @@ -2288,6 +2296,7 @@ static Fl_Menu_Item bar_table[] = { {"History5", 0, 0, 0, FL_MENU_INVISIBLE}, {0}, {"M&erge...", FL_CTRL+FL_SHIFT+'o', (Fl_Callback *)file_merge_cb, 0}, + {"Watch Pattern...", 0, (Fl_Callback *)file_watch_cb, 0}, {"&Clear", 0, (Fl_Callback *)file_clear_cb, 0, FL_MENU_DIVIDER}, {"Remote", 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU}, {"Start...", 0, (Fl_Callback *)file_remote_cb, (void*)"start"}, @@ -2340,7 +2349,7 @@ static Fl_Menu_Item sysbar_table[] = { {"New...", FL_META+'n', (Fl_Callback *)file_new_cb, 0}, {"Open...", FL_META+'o', (Fl_Callback *)file_open_cb, 0}, /* system menu bar is not dynamic in fltk 1.1; it will be in fltk 1.3 - {"Open recent", 0, 0, 0, FL_SUBMENU}, + {"Open Recent", 0, 0, 0, FL_SUBMENU}, {"History1", 0, 0, 0, FL_MENU_INVISIBLE}, {"History2", 0, 0, 0, FL_MENU_INVISIBLE}, {"History3", 0, 0, 0, FL_MENU_INVISIBLE}, @@ -2349,6 +2358,7 @@ static Fl_Menu_Item sysbar_table[] = { {0}, */ {"Merge...", FL_META+FL_SHIFT+'o', (Fl_Callback *)file_merge_cb, 0}, + {"Watch Pattern...", 0, (Fl_Callback *)file_watch_cb, 0}, {"Clear", 0, (Fl_Callback *)file_clear_cb, 0, FL_MENU_DIVIDER}, {"Remote", 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU}, {"Start...", 0, (Fl_Callback *)file_remote_cb, (void*)"start"}, diff --git a/Fltk/messageWindow.cpp b/Fltk/messageWindow.cpp index 33d040f75195d20f679c7c45a7acda8baf7f378a..e752817a02baf6164c7c6dddc02ff4d0ce9a46ed 100644 --- a/Fltk/messageWindow.cpp +++ b/Fltk/messageWindow.cpp @@ -52,7 +52,7 @@ static void message_clear_cb(Fl_Widget *w, void *data) static void message_save_cb(Fl_Widget *w, void *data) { test: - if(fileChooser(0, 1, "Save", "*")) { + if(fileChooser(FILE_CHOOSER_CREATE, "Save", "*")) { std::string name = fileChooserGetName(1); if(CTX::instance()->confirmOverwrite) { if(!StatFile(name)) diff --git a/Fltk/projectionEditor.cpp b/Fltk/projectionEditor.cpp index 5cd4c4a8a59e7f5e2098320bfd77121b56b074ca..13550fe04aad5a7e5b4f755f42b0378d9a9392d7 100644 --- a/Fltk/projectionEditor.cpp +++ b/Fltk/projectionEditor.cpp @@ -418,7 +418,7 @@ static void proj_hide_cb(Fl_Widget *w, void *data) static void save_selection_cb(Fl_Widget *w, void *data) { projectionEditor *e = (projectionEditor*)data; - if(fileChooser(0, 1, "Save Selection", "*.{geo,msh}")){ + if(fileChooser(FILE_CHOOSER_CREATE, "Save Selection", "*.{geo,msh}")){ FILE *fp = fopen(fileChooserGetName(1).c_str(), "w"); if(!fp){ Msg::Error("Unable to open file `%s'", fileChooserGetName(1).c_str()); @@ -458,7 +458,7 @@ static void save_selection_cb(Fl_Widget *w, void *data) static void load_projection_cb(Fl_Widget *w, void *data) { projectionEditor *e = (projectionEditor*)data; - if(fileChooser(0, 0, "Load Projection", "*.pro")){ + if(fileChooser(FILE_CHOOSER_SINGLE, "Load Projection", "*.pro")){ FILE *fp = fopen(fileChooserGetName(1).c_str(), "r"); if(!fp){ Msg::Error("Unable to open file `%s'", fileChooserGetName(1).c_str()); @@ -502,7 +502,7 @@ static void save_projection_cb(Fl_Widget *w, void *data) projection *p = e->getCurrentProjection(); if(p){ FM::ProjectionSurface *ps = (FM::ProjectionSurface*)p->face->getNativePtr(); - if(fileChooser(0, 1, "Save Projection", "*.pro")){ + if(fileChooser(FILE_CHOOSER_CREATE, "Save Projection", "*.pro")){ std::string name = fileChooserGetName(1); FILE *fp = fopen(name.c_str(), "w"); if(!fp){ @@ -688,7 +688,7 @@ static void action_cb(Fl_Widget *w, void *data) delete_fourier(faces[i]); } else{ - if(fileChooser(0, 1, "Save Fourier Model", "*.fm")){ + if(fileChooser(FILE_CHOOSER_CREATE, "Save Fourier Model", "*.fm")){ FILE *fp = fopen(fileChooserGetName(1).c_str(), "w"); if(!fp){ Msg::Error("Unable to open file `%s'", fileChooserGetName(1).c_str()); diff --git a/Fltk/solverWindow.cpp b/Fltk/solverWindow.cpp index 43301490468304dea988bf82d74a84505f5ef859..33410478003af001d7c2ed8f8368e07725340b37 100644 --- a/Fltk/solverWindow.cpp +++ b/Fltk/solverWindow.cpp @@ -339,7 +339,7 @@ static void solver_choose_executable_cb(Fl_Widget *w, void *data) pattern += ".exe"; #endif - if(fileChooser(0, 0, "Choose", pattern.c_str())){ + if(fileChooser(FILE_CHOOSER_SINGLE, "Choose", pattern.c_str())){ FlGui::instance()->solver[num]->input[2]->value(fileChooserGetName(1).c_str()); solver_ok_cb(w, data); } @@ -350,7 +350,7 @@ static void solver_file_open_cb(Fl_Widget *w, void *data) int num = (int)(long)data; std::string pattern = "*" + ConnectionManager::get(num)->inputFileExtension; - if(fileChooser(0, 0, "Choose", pattern.c_str())) { + if(fileChooser(FILE_CHOOSER_SINGLE, "Choose", pattern.c_str())) { FlGui::instance()->solver[num]->input[0]->value(fileChooserGetName(1).c_str()); solver_ok_cb(w, data); } @@ -367,7 +367,7 @@ static void solver_file_edit_cb(Fl_Widget *w, void *data) static void solver_choose_mesh_cb(Fl_Widget *w, void *data) { int num = (int)(long)data; - if(fileChooser(0, 0, "Choose", "*.msh")){ + if(fileChooser(FILE_CHOOSER_SINGLE, "Choose", "*.msh")){ FlGui::instance()->solver[num]->input[1]->value(fileChooserGetName(1).c_str()); solver_ok_cb(w, data); }