diff --git a/libs/wxutil/FileChooser.cpp b/libs/wxutil/FileChooser.cpp index d9a7e20f16..8b0c6ee91b 100644 --- a/libs/wxutil/FileChooser.cpp +++ b/libs/wxutil/FileChooser.cpp @@ -66,81 +66,96 @@ void FileChooser::construct() // Make default extension lowercase string::to_lower(_defaultExt); - int defaultFormatIdx = 0; - int curFormatIdx = 0; + if (!_open && _fileType == filetype::TYPE_MAP_EXPORT) + { + assembleMapExportFileTypes(); + } + else + { + assembleFileTypes(); + } - // Add the filetype - FileTypePatterns patterns = GlobalFiletypes().getPatternsForType(_fileType); + // Add a final mask for All Files (*.*) + FileFilter wildCardFilter; - for (const auto& pattern : patterns) + wildCardFilter.caption = _("All Files (*.*)"); + wildCardFilter.filter = "*.*"; + wildCardFilter.extension = WILDCARD_EXTENSION; + + _fileFilters.push_back(wildCardFilter); + + std::string wildcard = ""; + + for (const FileFilter& filter : _fileFilters) { - if (!_open && _fileType == filetype::TYPE_MAP_EXPORT) - { - auto formats = GlobalMapFormatManager().getMapFormatList(pattern.extension); + wildcard += wildcard.empty() ? "" : "|"; + wildcard += filter.caption + "|" + filter.filter; + } - // Pre-select take the default map format for this game type - map::MapFormatPtr defaultFormat = GlobalMapFormatManager().getMapFormatForGameType( - GlobalGameManager().currentGame()->getKeyValue("type"), pattern.extension - ); + _dialog->SetWildcard(wildcard); - for (const map::MapFormatPtr& format : formats) - { - FileFilter filter; + for (int i = 0; i < _fileFilters.size(); ++i) + { + if (_fileFilters[i].isDefaultFilter) + { + _dialog->SetFilterIndex(i); + break; + } + } +} - filter.caption = format->getMapFormatName() + " " + pattern.name + " (" + pattern.pattern + ")"; - filter.filter = pattern.pattern; - filter.extension = pattern.extension; - filter.mapFormatName = format->getMapFormatName(); +void FileChooser::assembleMapExportFileTypes() +{ + FileTypePatterns patterns = GlobalFiletypes().getPatternsForType(_fileType); - _fileFilters.push_back(filter); + for (const auto& pattern : patterns) + { + auto formats = GlobalMapFormatManager().getMapFormatList(pattern.extension); - if (format == defaultFormat) - { - defaultFormatIdx = curFormatIdx; - } + // Pre-select take the default map format for this game type + auto defaultFormat = GlobalMapFormatManager().getMapFormatForGameType( + GlobalGameManager().currentGame()->getKeyValue("type"), pattern.extension + ); - ++curFormatIdx; - } - } - else + for (const map::MapFormatPtr& format : formats) { FileFilter filter; - filter.caption = pattern.name + " (" + pattern.pattern + ")"; + filter.caption = format->getMapFormatName() + " " + pattern.name + " (" + pattern.pattern + ")"; filter.filter = pattern.pattern; filter.extension = pattern.extension; - - // Pre-select the filter matching the default extension - if (pattern.extension == _defaultExt) - { - defaultFormatIdx = curFormatIdx; - } + filter.mapFormatName = format->getMapFormatName(); _fileFilters.push_back(filter); - ++curFormatIdx; + if (format == defaultFormat) + { + filter.isDefaultFilter = true; + } } } +} - // Add a final mask for All Files (*.*) - FileFilter filter; +void FileChooser::assembleFileTypes() +{ + FileTypePatterns patterns = GlobalFiletypes().getPatternsForType(_fileType); - filter.caption = _("All Files (*.*)"); - filter.filter = "*.*"; - filter.extension = WILDCARD_EXTENSION; + for (const auto& pattern : patterns) + { + FileFilter filter; - _fileFilters.push_back(filter); - - std::string wildcard = ""; + filter.caption = pattern.name + " (" + pattern.pattern + ")"; + filter.filter = pattern.pattern; + filter.extension = pattern.extension; - std::for_each(_fileFilters.begin(), _fileFilters.end(), [&] (const FileFilter& filter) - { - wildcard += wildcard.empty() ? "" : "|"; - wildcard += filter.caption + "|" + filter.filter; - }); + _fileFilters.push_back(filter); - _dialog->SetWildcard(wildcard); - _dialog->SetFilterIndex(defaultFormatIdx); + // Pre-select the filter matching the default extension + if (pattern.extension == _defaultExt) + { + filter.isDefaultFilter = true; + } + } } long FileChooser::getStyle(bool open) @@ -221,10 +236,9 @@ std::string FileChooser::getSelectedFileName() if (!_open // save operation && !fileName.empty() // valid filename && !_defaultExt.empty() // non-empty default extension - && os::getExtension(fileName).empty() // no extension selected by the user - && !string::iends_with(fileName, _defaultExt)) // no default extension + && os::getExtension(fileName).empty()) // no extension selected by the user { - fileName.append(_defaultExt); + fileName.append("." + _defaultExt); } return fileName; diff --git a/libs/wxutil/FileChooser.h b/libs/wxutil/FileChooser.h index 4d09a6ceb2..f218cb3b0f 100644 --- a/libs/wxutil/FileChooser.h +++ b/libs/wxutil/FileChooser.h @@ -34,6 +34,11 @@ class FileChooser : std::string filter; // "*.map" std::string extension; // "map" std::string mapFormatName; + bool isDefaultFilter; // should be selected when dialog is shown + + FileFilter() : + isDefaultFilter(false) + {} }; std::vector _fileFilters; @@ -111,6 +116,9 @@ class FileChooser : void selectFilterIndexFromFilename(const std::string& filename); void construct(); // shared constructor stuff + + void assembleMapExportFileTypes(); + void assembleFileTypes(); }; } // namespace wxutil diff --git a/radiant/map/MapFileManager.cpp b/radiant/map/MapFileManager.cpp index 644d262f8e..2a174eb2b5 100644 --- a/radiant/map/MapFileManager.cpp +++ b/radiant/map/MapFileManager.cpp @@ -32,8 +32,8 @@ void MapFileManager::registerFileTypes() GlobalFiletypes().registerPattern(filetype::TYPE_MAP, FileTypePattern(_("Map"), "map", "*.map")); GlobalFiletypes().registerPattern(filetype::TYPE_MAP, FileTypePattern(_("Portable Map"), "mapx", "*.mapx")); GlobalFiletypes().registerPattern(filetype::TYPE_REGION, FileTypePattern(_("Region"), "reg", "*.reg")); - GlobalFiletypes().registerPattern(filetype::TYPE_PREFAB, FileTypePattern(_("Prefab"), "pfb", "*.pfb")); GlobalFiletypes().registerPattern(filetype::TYPE_PREFAB, FileTypePattern(_("Portable Prefab"), "pfbx", "*.pfbx")); + GlobalFiletypes().registerPattern(filetype::TYPE_PREFAB, FileTypePattern(_("Prefab"), "pfb", "*.pfb")); GlobalFiletypes().registerPattern(filetype::TYPE_MAP_EXPORT, FileTypePattern(_("Map"), "map", "*.map")); GlobalFiletypes().registerPattern(filetype::TYPE_MAP_EXPORT, FileTypePattern(_("Map"), "mapx", "*.mapx")); @@ -60,7 +60,7 @@ MapFileSelection MapFileManager::selectFile(bool open, if (!patterns.empty()) { - defaultExt = "." + patterns.begin()->extension; // ".map" + defaultExt = patterns.begin()->extension; // "map" } // Display a file chooser dialog to get a new path