GUI: de-duplicate file dialog filters

untested. may not work...
This commit is contained in:
tildearrow 2023-09-01 18:33:32 -05:00
parent c21f880e3e
commit 1c171ed7bd
3 changed files with 43 additions and 44 deletions

View File

@ -76,7 +76,38 @@ void _nfdThread(const NFDState state, std::atomic<bool>* ok, std::vector<String>
} }
#endif #endif
bool FurnaceGUIFileDialog::openLoad(String header, std::vector<String> filter, const char* noSysFilter, String path, double dpiScale, FileDialogSelectCallback clickCallback, bool allowMultiple) { void FurnaceGUIFileDialog::convertFilterList(std::vector<String>& filter) {
memset(noSysFilter,0,4096);
String result;
for (size_t i=0; (i+1)<filter.size(); i+=2) {
String label=filter[i];
String ext;
if (filter[i+1]=="*") {
ext=".*";
} else for (char i: filter[i+1]) {
switch (i) {
case '*':
break;
case ' ':
ext+=',';
break;
default:
ext+=i;
break;
}
}
if (!result.empty()) result+=',';
result+=fmt::sprintf("%s{%s}",label,ext);
}
strncpy(noSysFilter,result.c_str(),4095);
}
bool FurnaceGUIFileDialog::openLoad(String header, std::vector<String> filter, String path, double dpiScale, FileDialogSelectCallback clickCallback, bool allowMultiple) {
if (opened) return false; if (opened) return false;
saving=false; saving=false;
curPath=path; curPath=path;
@ -149,6 +180,8 @@ bool FurnaceGUIFileDialog::openLoad(String header, std::vector<String> filter, c
} }
#endif #endif
convertFilterList(filter);
ImGuiFileDialog::Instance()->singleClickSel=mobileUI; ImGuiFileDialog::Instance()->singleClickSel=mobileUI;
ImGuiFileDialog::Instance()->DpiScale=dpiScale; ImGuiFileDialog::Instance()->DpiScale=dpiScale;
ImGuiFileDialog::Instance()->mobileMode=mobileUI; ImGuiFileDialog::Instance()->mobileMode=mobileUI;
@ -159,7 +192,7 @@ bool FurnaceGUIFileDialog::openLoad(String header, std::vector<String> filter, c
return true; return true;
} }
bool FurnaceGUIFileDialog::openSave(String header, std::vector<String> filter, const char* noSysFilter, String path, double dpiScale) { bool FurnaceGUIFileDialog::openSave(String header, std::vector<String> filter, String path, double dpiScale) {
if (opened) return false; if (opened) return false;
#ifdef ANDROID #ifdef ANDROID
@ -233,6 +266,8 @@ bool FurnaceGUIFileDialog::openSave(String header, std::vector<String> filter, c
} else { } else {
hasError=false; hasError=false;
convertFilterList(filter);
ImGuiFileDialog::Instance()->singleClickSel=false; ImGuiFileDialog::Instance()->singleClickSel=false;
ImGuiFileDialog::Instance()->DpiScale=dpiScale; ImGuiFileDialog::Instance()->DpiScale=dpiScale;
ImGuiFileDialog::Instance()->mobileMode=mobileUI; ImGuiFileDialog::Instance()->mobileMode=mobileUI;

View File

@ -31,6 +31,7 @@ class FurnaceGUIFileDialog {
bool opened; bool opened;
bool saving; bool saving;
bool hasError; bool hasError;
char noSysFilter[4096];
String curPath; String curPath;
std::vector<String> fileName; std::vector<String> fileName;
#ifdef USE_NFD #ifdef USE_NFD
@ -46,10 +47,12 @@ class FurnaceGUIFileDialog {
pfd::open_file* dialogO; pfd::open_file* dialogO;
pfd::save_file* dialogS; pfd::save_file* dialogS;
#endif #endif
void convertFilterList(std::vector<String>& filter);
public: public:
bool mobileUI; bool mobileUI;
bool openLoad(String header, std::vector<String> filter, const char* noSysFilter, String path, double dpiScale, FileDialogSelectCallback clickCallback=NULL, bool allowMultiple=false); bool openLoad(String header, std::vector<String> filter, String path, double dpiScale, FileDialogSelectCallback clickCallback=NULL, bool allowMultiple=false);
bool openSave(String header, std::vector<String> filter, const char* noSysFilter, String path, double dpiScale); bool openSave(String header, std::vector<String> filter, String path, double dpiScale);
bool accepted(); bool accepted();
void close(); void close();
bool render(const ImVec2& min, const ImVec2& max); bool render(const ImVec2& min, const ImVec2& max);

View File

@ -1567,7 +1567,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
"Open File", "Open File",
{"compatible files", "*.fur *.dmf *.mod *.fc13 *.fc14 *.smod *.fc", {"compatible files", "*.fur *.dmf *.mod *.fc13 *.fc14 *.smod *.fc",
"all files", "*"}, "all files", "*"},
"compatible files{.fur,.dmf,.mod,.fc13,.fc14,.smod,.fc},.*",
workingDirSong, workingDirSong,
dpiScale dpiScale
); );
@ -1580,7 +1579,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openLoad( hasOpened=fileDialog->openLoad(
"Restore Backup", "Restore Backup",
{"Furnace song", "*.fur"}, {"Furnace song", "*.fur"},
"Furnace song{.fur}",
backupPath+String(DIR_SEPARATOR_STR), backupPath+String(DIR_SEPARATOR_STR),
dpiScale dpiScale
); );
@ -1590,7 +1588,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Save File", "Save File",
{"Furnace song", "*.fur"}, {"Furnace song", "*.fur"},
"Furnace song{.fur}",
workingDirSong, workingDirSong,
dpiScale dpiScale
); );
@ -1600,7 +1597,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Save File", "Save File",
{"DefleMask 1.1.3 module", "*.dmf"}, {"DefleMask 1.1.3 module", "*.dmf"},
"DefleMask 1.1.3 module{.dmf}",
workingDirSong, workingDirSong,
dpiScale dpiScale
); );
@ -1610,7 +1606,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Save File", "Save File",
{"DefleMask 1.0/legacy module", "*.dmf"}, {"DefleMask 1.0/legacy module", "*.dmf"},
"DefleMask 1.0/legacy module{.dmf}",
workingDirSong, workingDirSong,
dpiScale dpiScale
); );
@ -1627,8 +1622,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
if (!dirExists(workingDirIns)) workingDirIns=getHomeDir(); if (!dirExists(workingDirIns)) workingDirIns=getHomeDir();
hasOpened=fileDialog->openLoad( hasOpened=fileDialog->openLoad(
"Load Instrument", "Load Instrument",
// TODO supply loadable formats in a dynamic, scalable, "DRY" way.
// thank the author of IGFD for making things impossible
{"all compatible files", "*.fui *.dmp *.tfi *.vgi *.s3i *.sbi *.opli *.opni *.y12 *.bnk *.ff *.gyb *.opm *.wopl *.wopn", {"all compatible files", "*.fui *.dmp *.tfi *.vgi *.s3i *.sbi *.opli *.opni *.y12 *.bnk *.ff *.gyb *.opm *.wopl *.wopn",
"Furnace instrument", "*.fui", "Furnace instrument", "*.fui",
"DefleMask preset", "*.dmp", "DefleMask preset", "*.dmp",
@ -1646,7 +1639,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
"Wohlstand WOPL bank", "*.wopl", "Wohlstand WOPL bank", "*.wopl",
"Wohlstand WOPN bank", "*.wopn", "Wohlstand WOPN bank", "*.wopn",
"all files", "*"}, "all files", "*"},
"all compatible files{.fui,.dmp,.tfi,.vgi,.s3i,.sbi,.opli,.opni,.y12,.bnk,.ff,.gyb,.opm,.wopl,.wopn},.*",
workingDirIns, workingDirIns,
dpiScale, dpiScale,
[this](const char* path) { [this](const char* path) {
@ -1681,7 +1673,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Save Instrument", "Save Instrument",
{"Furnace instrument", "*.fui"}, {"Furnace instrument", "*.fui"},
"Furnace instrument{.fui}",
workingDirIns, workingDirIns,
dpiScale dpiScale
); );
@ -1691,7 +1682,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Save Instrument", "Save Instrument",
{"DefleMask preset", "*.dmp"}, {"DefleMask preset", "*.dmp"},
"DefleMask preset{.dmp}",
workingDirIns, workingDirIns,
dpiScale dpiScale
); );
@ -1703,7 +1693,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
"Load Wavetable", "Load Wavetable",
{"compatible files", "*.fuw *.dmw", {"compatible files", "*.fuw *.dmw",
"all files", "*"}, "all files", "*"},
"compatible files{.fuw,.dmw},.*",
workingDirWave, workingDirWave,
dpiScale, dpiScale,
NULL, // TODO NULL, // TODO
@ -1715,7 +1704,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Save Wavetable", "Save Wavetable",
{"Furnace wavetable", ".fuw"}, {"Furnace wavetable", ".fuw"},
"Furnace wavetable{.fuw}",
workingDirWave, workingDirWave,
dpiScale dpiScale
); );
@ -1725,7 +1713,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Save Wavetable", "Save Wavetable",
{"DefleMask wavetable", ".dmw"}, {"DefleMask wavetable", ".dmw"},
"DefleMask wavetable{.dmw}",
workingDirWave, workingDirWave,
dpiScale dpiScale
); );
@ -1735,7 +1722,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Save Wavetable", "Save Wavetable",
{"raw data", ".raw"}, {"raw data", ".raw"},
"raw data{.raw}",
workingDirWave, workingDirWave,
dpiScale dpiScale
); );
@ -1747,7 +1733,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
"Load Sample", "Load Sample",
{"compatible files", "*.wav *.dmc *.brr", {"compatible files", "*.wav *.dmc *.brr",
"all files", "*"}, "all files", "*"},
"compatible files{.wav,.dmc,.brr},.*",
workingDirSample, workingDirSample,
dpiScale, dpiScale,
NULL, // TODO NULL, // TODO
@ -1760,7 +1745,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openLoad( hasOpened=fileDialog->openLoad(
"Load Raw Sample", "Load Raw Sample",
{"all files", "*"}, {"all files", "*"},
".*",
workingDirSample, workingDirSample,
dpiScale dpiScale
); );
@ -1770,7 +1754,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Save Sample", "Save Sample",
{"Wave file", "*.wav"}, {"Wave file", "*.wav"},
"Wave file{.wav}",
workingDirSample, workingDirSample,
dpiScale dpiScale
); );
@ -1778,9 +1761,8 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
case GUI_FILE_SAMPLE_SAVE_RAW: case GUI_FILE_SAMPLE_SAVE_RAW:
if (!dirExists(workingDirSample)) workingDirSample=getHomeDir(); if (!dirExists(workingDirSample)) workingDirSample=getHomeDir();
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Load Raw Sample", "Save Raw Sample",
{"all files", "*"}, {"all files", "*"},
".*",
workingDirSample, workingDirSample,
dpiScale dpiScale
); );
@ -1790,7 +1772,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Export Audio", "Export Audio",
{"Wave file", "*.wav"}, {"Wave file", "*.wav"},
"Wave file{.wav}",
workingDirAudioExport, workingDirAudioExport,
dpiScale dpiScale
); );
@ -1800,7 +1781,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Export Audio", "Export Audio",
{"Wave file", "*.wav"}, {"Wave file", "*.wav"},
"Wave file{.wav}",
workingDirAudioExport, workingDirAudioExport,
dpiScale dpiScale
); );
@ -1810,7 +1790,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Export Audio", "Export Audio",
{"Wave file", "*.wav"}, {"Wave file", "*.wav"},
"Wave file{.wav}",
workingDirAudioExport, workingDirAudioExport,
dpiScale dpiScale
); );
@ -1820,7 +1799,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Export VGM", "Export VGM",
{"VGM file", "*.vgm"}, {"VGM file", "*.vgm"},
"VGM file{.vgm}",
workingDirVGMExport, workingDirVGMExport,
dpiScale dpiScale
); );
@ -1830,7 +1808,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Export ZSM", "Export ZSM",
{"ZSM file", "*.zsm"}, {"ZSM file", "*.zsm"},
"ZSM file{.zsm}",
workingDirZSMExport, workingDirZSMExport,
dpiScale dpiScale
); );
@ -1840,7 +1817,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Export Command Stream", "Export Command Stream",
{"text file", "*.txt"}, {"text file", "*.txt"},
"text file{.txt}",
workingDirROMExport, workingDirROMExport,
dpiScale dpiScale
); );
@ -1850,7 +1826,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Export Command Stream", "Export Command Stream",
{"binary file", "*.bin"}, {"binary file", "*.bin"},
"binary file{.bin}",
workingDirROMExport, workingDirROMExport,
dpiScale dpiScale
); );
@ -1863,7 +1838,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openLoad( hasOpened=fileDialog->openLoad(
"Select Font", "Select Font",
{"compatible files", "*.ttf *.otf *.ttc"}, {"compatible files", "*.ttf *.otf *.ttc"},
"compatible files{.ttf,.otf,.ttc}",
workingDirFont, workingDirFont,
dpiScale dpiScale
); );
@ -1873,7 +1847,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openLoad( hasOpened=fileDialog->openLoad(
"Select Font", "Select Font",
{"compatible files", "*.ttf *.otf *.ttc"}, {"compatible files", "*.ttf *.otf *.ttc"},
"compatible files{.ttf,.otf,.ttc}",
workingDirFont, workingDirFont,
dpiScale dpiScale
); );
@ -1883,7 +1856,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openLoad( hasOpened=fileDialog->openLoad(
"Select Font", "Select Font",
{"compatible files", "*.ttf *.otf *.ttc"}, {"compatible files", "*.ttf *.otf *.ttc"},
"compatible files{.ttf,.otf,.ttc}",
workingDirFont, workingDirFont,
dpiScale dpiScale
); );
@ -1893,7 +1865,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openLoad( hasOpened=fileDialog->openLoad(
"Select Color File", "Select Color File",
{"configuration files", "*.cfgc"}, {"configuration files", "*.cfgc"},
"configuration files{.cfgc}",
workingDirColors, workingDirColors,
dpiScale dpiScale
); );
@ -1903,7 +1874,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openLoad( hasOpened=fileDialog->openLoad(
"Select Keybind File", "Select Keybind File",
{"configuration files", "*.cfgk"}, {"configuration files", "*.cfgk"},
"configuration files{.cfgk}",
workingDirKeybinds, workingDirKeybinds,
dpiScale dpiScale
); );
@ -1913,7 +1883,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openLoad( hasOpened=fileDialog->openLoad(
"Select Layout File", "Select Layout File",
{".ini files", "*.ini"}, {".ini files", "*.ini"},
".ini files{.ini}",
workingDirKeybinds, workingDirKeybinds,
dpiScale dpiScale
); );
@ -1923,7 +1892,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Export Colors", "Export Colors",
{"configuration files", "*.cfgc"}, {"configuration files", "*.cfgc"},
"configuration files{.cfgc}",
workingDirColors, workingDirColors,
dpiScale dpiScale
); );
@ -1933,7 +1901,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Export Keybinds", "Export Keybinds",
{"configuration files", "*.cfgk"}, {"configuration files", "*.cfgk"},
"configuration files{.cfgk}",
workingDirKeybinds, workingDirKeybinds,
dpiScale dpiScale
); );
@ -1943,7 +1910,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
hasOpened=fileDialog->openSave( hasOpened=fileDialog->openSave(
"Export Layout", "Export Layout",
{".ini files", "*.ini"}, {".ini files", "*.ini"},
".ini files{.ini}",
workingDirKeybinds, workingDirKeybinds,
dpiScale dpiScale
); );
@ -1956,7 +1922,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
"Load ROM", "Load ROM",
{"compatible files", "*.rom *.bin", {"compatible files", "*.rom *.bin",
"all files", "*"}, "all files", "*"},
"compatible files{.rom,.bin},.*",
workingDirROM, workingDirROM,
dpiScale dpiScale
); );
@ -1967,7 +1932,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
"Play Command Stream", "Play Command Stream",
{"command stream", "*.bin", {"command stream", "*.bin",
"all files", "*"}, "all files", "*"},
"command stream{.bin},.*",
workingDirROM, workingDirROM,
dpiScale dpiScale
); );
@ -1979,7 +1943,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
{"compatible files", "*.fur *.dmf *.mod", {"compatible files", "*.fur *.dmf *.mod",
"another option", "*.wav *.ttf", "another option", "*.wav *.ttf",
"all files", "*"}, "all files", "*"},
"compatible files{.fur,.dmf,.mod},another option{.wav,.ttf},.*",
workingDirTest, workingDirTest,
dpiScale, dpiScale,
[](const char* path) { [](const char* path) {
@ -1998,7 +1961,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
{"compatible files", "*.fur *.dmf *.mod", {"compatible files", "*.fur *.dmf *.mod",
"another option", "*.wav *.ttf", "another option", "*.wav *.ttf",
"all files", "*"}, "all files", "*"},
"compatible files{.fur,.dmf,.mod},another option{.wav,.ttf},.*",
workingDirTest, workingDirTest,
dpiScale, dpiScale,
[](const char* path) { [](const char* path) {
@ -2017,7 +1979,6 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
"Save Test", "Save Test",
{"Furnace song", "*.fur", {"Furnace song", "*.fur",
"DefleMask module", "*.dmf"}, "DefleMask module", "*.dmf"},
"Furnace song{.fur},DefleMask module{.dmf}",
workingDirTest, workingDirTest,
dpiScale dpiScale
); );