summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarc Jeanmougin <marcjeanmougin@free.fr>2018-01-07 12:23:59 +0000
committerMarc Jeanmougin <marcjeanmougin@free.fr>2018-01-07 12:23:59 +0000
commit62417f1a061918e9cff30dfd90b9e565bd7821b7 (patch)
tree65ffa62d885ed270dcf9e43a5032492d6f6962c3 /src
parentFix for bug 1741625. Visio stencil (.vss) don't load in 0.92+devel ('No resul... (diff)
downloadinkscape-62417f1a061918e9cff30dfd90b9e565bd7821b7.tar.gz
inkscape-62417f1a061918e9cff30dfd90b9e565bd7821b7.zip
Improve FileSave dialog
Diffstat (limited to 'src')
-rw-r--r--src/ui/dialog/filedialog.h2
-rw-r--r--src/ui/dialog/filedialogimpl-gtkmm.cpp22
-rw-r--r--src/ui/dialog/filedialogimpl-gtkmm.h2
-rw-r--r--src/ui/dialog/filedialogimpl-win32.cpp4
4 files changed, 26 insertions, 4 deletions
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<Glib::ustring> knownExtensions;
+ std::map<Glib::ustring, Inkscape::Extension::Output*> 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<Gtk::Expander *> 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<Inkscape::Extension::Output *>(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<Glib::ustring, Inkscape::Extension::Output*>(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, Inkscape::Extension::Output*>(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, Inkscape::Extension::Output*>(Glib::ustring(all_exe_files_filter).casefold(), NULL));
int extension_index = 0;
_extension_map = new Inkscape::Extension::Extension*[filter_count];