diff --git a/uppsrc/CtrlLib/FileSel.cpp b/uppsrc/CtrlLib/FileSel.cpp index 42eb7be1c..58e5d94b1 100644 --- a/uppsrc/CtrlLib/FileSel.cpp +++ b/uppsrc/CtrlLib/FileSel.cpp @@ -1037,7 +1037,12 @@ void FileSel::AddName(Vector& fn, String& f) { if(f[0] == '\"' && f.GetCount() > 2) f = f.Mid(1, f.GetCount() - 2); int q = f.ReverseFind('.'); - if(q < 0 || Filter(f.Mid(q + 1), // "(file.xxx)" should add extension too, allow just some + String typed_ext; // typed by user + if(q >= 0) + typed_ext = f.Mid(q + 1); + if(q < 0 || // no extension + force_ext && allowed_ext.Find(typed_ext) < 0 || + Filter(f.Mid(q + 1), // "(file.xxx)" should add extension too, allow just some [](int c) { return IsAlNum(c) || findarg(c, '_', '-') >= 0 ? 0 : c; } ).GetCount()) { String t = GetMask(); @@ -1991,6 +1996,31 @@ bool FileSel::Execute(int _mode) { } if(default_name.GetCount() && mode == SAVEAS) file <<= default_name; + + force_ext = true; + allowed_ext.Clear(); + for(String mm : mask) { + if(!force_ext) + break; + for(String m : Split(mm, ' ')) { + if(!force_ext) + break; + int q = m.Find('.'); + if(q < 0) + force_ext = false; + else { + m = m.Mid(q + 1); + if(m.Find('*') >= 0 || m.Find('?') >= 0) + force_ext = false; + else + allowed_ext.FindAdd(m); + } + } + } + + DDUMP(force_ext); + DDUMP(allowed_ext); + FileUpdate(); Update(); int c = TopWindow::Run(appmodal); diff --git a/uppsrc/CtrlLib/FileSel.h b/uppsrc/CtrlLib/FileSel.h index d3bedd293..58ebb45c1 100644 --- a/uppsrc/CtrlLib/FileSel.h +++ b/uppsrc/CtrlLib/FileSel.h @@ -229,6 +229,9 @@ protected: Ctrl *file_ctrl = NULL; int file_ctrl_cx; + bool force_ext = true; // -> false if there is wildcard mask allowing set of exts + Index allowed_ext; // allowed extensions typed by user if force_ext + static StaticMutex li_mutex; static void (*li_current)(const String& path, Image& result); static String li_path; diff --git a/upptst/FileSelSaveExt/FileSelSaveExt.upp b/upptst/FileSelSaveExt/FileSelSaveExt.upp new file mode 100644 index 000000000..5872304d3 --- /dev/null +++ b/upptst/FileSelSaveExt/FileSelSaveExt.upp @@ -0,0 +1,9 @@ +uses + CtrlLib; + +file + main.cpp; + +mainconfig + "" = "GUI"; + diff --git a/upptst/FileSelSaveExt/main.cpp b/upptst/FileSelSaveExt/main.cpp new file mode 100644 index 000000000..e2b3e2a54 --- /dev/null +++ b/upptst/FileSelSaveExt/main.cpp @@ -0,0 +1,16 @@ +#include + +using namespace Upp; + +GUI_APP_MAIN +{ + FileSel sel; + sel.ActiveDir(GetExeFolder()); + sel.Type("files", "*.txt *.cpp"); + sel.Type("files", "*.c"); + sel.ExecuteSaveAs(); + DDUMP(~sel); + sel.Type("all", "*.*"); + sel.ExecuteSaveAs(); + DDUMP(~sel); +}