From 62417f1a061918e9cff30dfd90b9e565bd7821b7 Mon Sep 17 00:00:00 2001 From: Marc Jeanmougin Date: Sun, 7 Jan 2018 12:23:59 +0000 Subject: Improve FileSave dialog --- src/ui/dialog/filedialog.h | 2 +- src/ui/dialog/filedialogimpl-gtkmm.cpp | 22 +++++++++++++++++++++- src/ui/dialog/filedialogimpl-gtkmm.h | 2 ++ src/ui/dialog/filedialogimpl-win32.cpp | 4 ++-- 4 files changed, 26 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/ui/dialog/filedialog.h b/src/ui/dialog/filedialog.h index 8ee63e654..071824ab9 100644 --- a/src/ui/dialog/filedialog.h +++ b/src/ui/dialog/filedialog.h @@ -227,7 +227,7 @@ protected: /** * List of known file extensions. */ - std::set knownExtensions; + std::map knownExtensions; void appendExtension(Glib::ustring& path, Inkscape::Extension::Output* outputExtension); diff --git a/src/ui/dialog/filedialogimpl-gtkmm.cpp b/src/ui/dialog/filedialogimpl-gtkmm.cpp index 86ad8649d..c8c508ee3 100644 --- a/src/ui/dialog/filedialogimpl-gtkmm.cpp +++ b/src/ui/dialog/filedialogimpl-gtkmm.cpp @@ -948,6 +948,7 @@ FileSaveDialogImplGtk::FileSaveDialogImplGtk(Gtk::Window &parentWindow, const Gl (save_method == Inkscape::Extension::FILE_SAVE_METHOD_SAVE_COPY) ? "/dialogs/save_copy" : "/dialogs/save_as") , save_method(save_method) + , fromCB(false) { FileSaveDialog::myDocTitle = docTitle; @@ -1014,6 +1015,8 @@ FileSaveDialogImplGtk::FileSaveDialogImplGtk(Gtk::Window &parentWindow, const Gl fileNameEntry->signal_activate().connect( sigc::mem_fun(*this, &FileSaveDialogImplGtk::fileNameEntryChangedCallback)); } + signal_selection_changed().connect( + sigc::mem_fun(*this, &FileSaveDialogImplGtk::fileNameChanged)); // Let's do more customization std::vector expanders; @@ -1102,10 +1105,27 @@ void FileSaveDialogImplGtk::fileTypeChangedCallback() auto filter = Gtk::FileFilter::create(); filter->add_pattern(type.pattern); set_filter(filter); + + if (fromCB) { + //do not update if called from a name change + fromCB = false; + return; + } updateNameAndExtension(); } +void FileSaveDialogImplGtk::fileNameChanged() { + Glib::ustring name = get_filename(); + Glib::ustring::size_type pos = name.rfind('.'); + if ( pos == Glib::ustring::npos ) return; + Glib::ustring ext = name.substr( pos ).casefold(); + if (extension && Glib::ustring(dynamic_cast(extension)->get_extension()).casefold() == ext ) return; + if (knownExtensions.find(ext) == knownExtensions.end()) return; + fromCB = true; + fileTypeComboBox.set_active_text(_(knownExtensions[ext]->get_filetypename())); +} + void FileSaveDialogImplGtk::addFileType(Glib::ustring name, Glib::ustring pattern) { //#Let user choose @@ -1139,7 +1159,7 @@ void FileSaveDialogImplGtk::createFileTypeMenu() type.name = (_(omod->get_filetypename())); type.pattern = "*"; Glib::ustring extension = omod->get_extension(); - knownExtensions.insert(extension.casefold()); + knownExtensions.insert(std::pair(extension.casefold(), omod)); fileDialogExtensionToPattern(type.pattern, extension); type.extension = omod; fileTypeComboBox.append(type.name); diff --git a/src/ui/dialog/filedialogimpl-gtkmm.h b/src/ui/dialog/filedialogimpl-gtkmm.h index 82ca75065..6b1f92d15 100644 --- a/src/ui/dialog/filedialogimpl-gtkmm.h +++ b/src/ui/dialog/filedialogimpl-gtkmm.h @@ -347,6 +347,8 @@ private: * Callback for user input into fileNameEntry */ void fileNameEntryChangedCallback(); + void fileNameChanged(); + bool fromCB; }; diff --git a/src/ui/dialog/filedialogimpl-win32.cpp b/src/ui/dialog/filedialogimpl-win32.cpp index 7aca8e242..8cdf31db6 100644 --- a/src/ui/dialog/filedialogimpl-win32.cpp +++ b/src/ui/dialog/filedialogimpl-win32.cpp @@ -1636,7 +1636,7 @@ void FileSaveDialogImplWin32::createFilterMenu() const gchar *filter_extension = omod->get_extension(); filter.filter = g_utf8_to_utf16( filter_extension, -1, NULL, &filter.filter_length, NULL); - knownExtensions.insert( Glib::ustring(filter_extension).casefold() ); + knownExtensions.insert(std::pair(Glib::ustring(filter_extension).icasefold(), omod)); // Type filter.name = g_utf8_to_utf16( @@ -1709,7 +1709,7 @@ void FileSaveDialogImplWin32::addFileType(Glib::ustring name, Glib::ustring patt filter_length = all_exe_files.name_length + all_exe_files.filter_length + 3; // Add 3 for two \0s and a * - knownExtensions.insert( Glib::ustring(all_exe_files_filter).casefold() ); + knownExtensions.insert(std::pair(Glib::ustring(all_exe_files_filter).casefold(), NULL)); int extension_index = 0; _extension_map = new Inkscape::Extension::Extension*[filter_count]; -- cgit v1.2.3