Skip to content

Commit

Permalink
#5098: Make the pfbx file format the default when exporting prefabs.
Browse files Browse the repository at this point in the history
Plus some refactoring in the FileChooser class - it is still an unpleasant if-else construct.
  • Loading branch information
codereader committed Apr 24, 2020
1 parent 44ffe93 commit a9311bf
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 56 deletions.
122 changes: 68 additions & 54 deletions libs/wxutil/FileChooser.cpp
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down
8 changes: 8 additions & 0 deletions libs/wxutil/FileChooser.h
Expand Up @@ -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<FileFilter> _fileFilters;
Expand Down Expand Up @@ -111,6 +116,9 @@ class FileChooser :
void selectFilterIndexFromFilename(const std::string& filename);

void construct(); // shared constructor stuff

void assembleMapExportFileTypes();
void assembleFileTypes();
};

} // namespace wxutil
4 changes: 2 additions & 2 deletions radiant/map/MapFileManager.cpp
Expand Up @@ -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"));
Expand All @@ -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
Expand Down

0 comments on commit a9311bf

Please sign in to comment.