diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp index 6a4b34f68fc578444e0f899e5d9277eb08f57569..55bcbb453f782cc841bc21c991daee267ab29948 100644 --- a/Fltk/Callbacks.cpp +++ b/Fltk/Callbacks.cpp @@ -1,4 +1,4 @@ -// $Id: Callbacks.cpp,v 1.332 2005-02-02 18:47:55 geuzaine Exp $ +// $Id: Callbacks.cpp,v 1.333 2005-02-05 21:49:00 geuzaine Exp $ // // Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle // @@ -265,7 +265,7 @@ void status_cancel_cb(CALLBACK_ARGS) void file_new_cb(CALLBACK_ARGS) { test: - if(file_chooser(0, 1, "New", "*", 0)) { + if(file_chooser(0, 1, "New", "*")) { char *name = file_chooser_get_name(1); struct stat buf; if(!stat(name, &buf)){ @@ -300,7 +300,7 @@ static char *file_types = void file_open_cb(CALLBACK_ARGS) { int n = List_Nbr(CTX.post.list); - if(file_chooser(0, 0, "Open", file_types, 0)) { + if(file_chooser(0, 0, "Open", file_types)) { OpenProblem(file_chooser_get_name(1)); Draw(); } @@ -311,7 +311,7 @@ void file_open_cb(CALLBACK_ARGS) void file_merge_cb(CALLBACK_ARGS) { int n = List_Nbr(CTX.post.list); - int f = file_chooser(1, 0, "Merge", file_types, 0); + int f = file_chooser(1, 0, "Merge", file_types); if(f) { for(int i = 1; i <= f; i++) MergeProblem(file_chooser_get_name(i)); @@ -450,7 +450,6 @@ typedef struct{ void file_save_as_cb(CALLBACK_ARGS) { int i, nbformats; - static int patindex = 0; static char *pat = NULL; static patXfunc formats[] = { {"By extension (*)", _save_auto}, @@ -497,7 +496,7 @@ void file_save_as_cb(CALLBACK_ARGS) } test: - if(file_chooser(0, 1, "Save As", pat, patindex)) { + if(file_chooser(0, 1, "Save As", pat)) { char *name = file_chooser_get_name(1); if(CTX.confirm_overwrite) { struct stat buf; @@ -513,14 +512,12 @@ void file_save_as_cb(CALLBACK_ARGS) else // handle any additional automatic fltk filter _save_auto(name); } - - patindex = file_chooser_get_filter(); } void file_rename_cb(CALLBACK_ARGS) { test: - if(file_chooser(0, 1, "Rename", "*", 0, CTX.filename)) { + if(file_chooser(0, 1, "Rename", "*", CTX.filename)) { char *name = file_chooser_get_name(1); if(CTX.confirm_overwrite) { struct stat buf; @@ -946,7 +943,7 @@ void message_clear_cb(CALLBACK_ARGS) void message_save_cb(CALLBACK_ARGS) { test: - if(file_chooser(0, 1, "Save", "*", 0)) { + if(file_chooser(0, 1, "Save", "*")) { char *name = file_chooser_get_name(1); if(CTX.confirm_overwrite) { struct stat buf; @@ -2691,7 +2688,7 @@ void solver_file_open_cb(CALLBACK_ARGS) // We allow to create the .pro file... Or should we add a "New file" // button? - if(file_chooser(0, 1, "Choose", tmp, 0)) { + if(file_chooser(0, 1, "Choose", tmp)) { WID->solver[num].input[0]->value(file_chooser_get_name(1)); if(SINFO[num].nboptions) { char file[1024]; @@ -2717,7 +2714,7 @@ void solver_file_edit_cb(CALLBACK_ARGS) void solver_choose_mesh_cb(CALLBACK_ARGS) { int num = (int)(long)data; - if(file_chooser(0, 0, "Choose", "*.msh", 0)) + if(file_chooser(0, 0, "Choose", "*.msh")) WID->solver[num].input[1]->value(file_chooser_get_name(1)); } @@ -2792,7 +2789,7 @@ void solver_choose_executable_cb(CALLBACK_ARGS) #else "*" #endif - , 0)) + )) WID->solver[num].input[2]->value(file_chooser_get_name(1)); } @@ -2932,7 +2929,7 @@ static void _view_save_as(int view_num, char *title, int type) Post_View *v = *(Post_View **) List_Pointer(CTX.post.list, view_num); test: - if(file_chooser(0, 1, title, "*", 0, v->FileName)) { + if(file_chooser(0, 1, title, "*", v->FileName)) { char *name = file_chooser_get_name(1); if(CTX.confirm_overwrite) { struct stat buf; diff --git a/Fltk/File_Picker.h b/Fltk/File_Picker.h index ca2d3b628bdb2b15b77980bfc0e6c54ef32765a8..25634b9cba9bd62fe46dc2e2bfa9180ed17fb6f4 100644 --- a/Fltk/File_Picker.h +++ b/Fltk/File_Picker.h @@ -46,7 +46,7 @@ public: if(_in) _in->take_focus(); else - _win->take_focus(); + _win->take_focus(); } else Fl_File_Chooser::show(); diff --git a/Fltk/GUI_Extras.cpp b/Fltk/GUI_Extras.cpp index 7ef0e090b3ecb216c57fb9d2c4adcfe7823d6bc6..fb7c29364053757bec0b28fe8ff2628f3c845f38 100644 --- a/Fltk/GUI_Extras.cpp +++ b/Fltk/GUI_Extras.cpp @@ -1,4 +1,4 @@ -// $Id: GUI_Extras.cpp,v 1.7 2005-01-18 19:03:07 geuzaine Exp $ +// $Id: GUI_Extras.cpp,v 1.8 2005-02-05 21:49:00 geuzaine Exp $ // // Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle // @@ -40,18 +40,24 @@ extern Context_T CTX; static File_Picker *fc = NULL; int file_chooser(int multi, int create, const char *message, - const char *pat, int patindex, char *fname) + const char *filter, char *fname) { - static char oldfilter[1024]; + static char thefilter[1024] = ""; + static int thefilterindex = 0; Fl_File_Chooser::show_label = "Format:"; Fl_File_Chooser::all_files_label = "All files (*)"; + if(strncmp(thefilter, filter, 1024)) { + // reset the filter and the selection if the filter has changed + strncpy(thefilter, filter, 1024); + thefilterindex = 0; + } + if(!fc) { - fc = new File_Picker(getenv("PWD") ? "." : CTX.home_dir, pat, - Fl_File_Chooser::SINGLE, message); + fc = new File_Picker(getenv("PWD") ? "." : CTX.home_dir, thefilter, + Fl_File_Chooser::SINGLE, message); fc->position(CTX.file_chooser_position[0], CTX.file_chooser_position[1]); - strncpy(oldfilter, pat, 1024); } fc->label(message); @@ -59,11 +65,8 @@ int file_chooser(int multi, int create, const char *message, if(fname) fc->value(fname); - if(strncmp(oldfilter, pat, 1024)) { - strncpy(oldfilter, pat, 1024); - fc->filter(pat); - fc->filter_value(patindex); - } + fc->filter(thefilter); + fc->filter_value(thefilterindex); if(multi) fc->type(Fl_File_Chooser::MULTI); @@ -77,6 +80,8 @@ int file_chooser(int multi, int create, const char *message, while(fc->shown()) Fl::wait(); + thefilterindex = fc->filter_value(); + if(fc->value()) return fc->count(); else diff --git a/Fltk/GUI_Extras.h b/Fltk/GUI_Extras.h index 5cbae0312faa41b3b9e7ff44160cbeb10f312f70..18a2e30bf0134d9a7c9c7d1955d9e62028d7b115 100644 --- a/Fltk/GUI_Extras.h +++ b/Fltk/GUI_Extras.h @@ -21,7 +21,7 @@ // Please report all bugs and problems to <gmsh@geuz.org>. int file_chooser(int multi, int create, const char *message, - const char *pat, int patindex, char *fname=NULL); + const char *pat, char *fname=NULL); char *file_chooser_get_name(int num); int file_chooser_get_filter(); void file_chooser_get_position(int *x, int *y);