system file picker anyone? DO NOT COMPILE!
This commit is contained in:
parent
3be56d50ab
commit
5e77b47467
|
@ -22,3 +22,6 @@
|
||||||
[submodule "extern/Nuked-OPL3"]
|
[submodule "extern/Nuked-OPL3"]
|
||||||
path = extern/Nuked-OPL3
|
path = extern/Nuked-OPL3
|
||||||
url = https://github.com/nukeykt/Nuked-OPL3.git
|
url = https://github.com/nukeykt/Nuked-OPL3.git
|
||||||
|
[submodule "extern/pfd"]
|
||||||
|
path = extern/pfd
|
||||||
|
url = https://github.com/samhocevar/portable-file-dialogs.git
|
||||||
|
|
|
@ -347,6 +347,7 @@ src/gui/font_unifont.cpp
|
||||||
src/gui/font_icon.cpp
|
src/gui/font_icon.cpp
|
||||||
src/gui/fonts.cpp
|
src/gui/fonts.cpp
|
||||||
src/gui/debug.cpp
|
src/gui/debug.cpp
|
||||||
|
src/gui/fileDialog.cpp
|
||||||
|
|
||||||
src/gui/intConst.cpp
|
src/gui/intConst.cpp
|
||||||
src/gui/guiConst.cpp
|
src/gui/guiConst.cpp
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit dea8520de18af09eefdbc18aaf7c24409d18491b
|
|
@ -0,0 +1,109 @@
|
||||||
|
#include "fileDialog.h"
|
||||||
|
#include "ImGuiFileDialog.h"
|
||||||
|
#include "../../extern/pfd/portable-file-dialogs.h"
|
||||||
|
|
||||||
|
bool FurnaceGUIFileDialog::openLoad(String header, std::vector<String> filter, String path, double dpiScale) {
|
||||||
|
if (opened) return false;
|
||||||
|
saving=false;
|
||||||
|
curPath=path;
|
||||||
|
if (sysDialog) {
|
||||||
|
dialogO=new pfd::open_file(header,path,filter);
|
||||||
|
} else {
|
||||||
|
String parsedFilter;
|
||||||
|
if (filter.size()&1) return false;
|
||||||
|
|
||||||
|
for (size_t i=0; i<filter.size(); i+=2) {
|
||||||
|
if (i!=0) parsedFilter+=",";
|
||||||
|
parsedFilter+=filter[i]+"{"+filter[i+1]+"}";
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGuiFileDialog::Instance()->DpiScale=dpiScale;
|
||||||
|
ImGuiFileDialog::Instance()->OpenModal("FileDialog",header,parsedFilter.c_str(),path);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FurnaceGUIFileDialog::openSave(String header, std::vector<String> filter, String path, double dpiScale) {
|
||||||
|
curPath=path;
|
||||||
|
if (sysDialog) {
|
||||||
|
// TODO
|
||||||
|
} else {
|
||||||
|
String parsedFilter;
|
||||||
|
ImGuiFileDialog::Instance()->DpiScale=dpiScale;
|
||||||
|
ImGuiFileDialog::Instance()->OpenModal("FileDialog",header,parsedFilter.c_str(),path,1,nullptr,ImGuiFileDialogFlags_ConfirmOverwrite);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FurnaceGUIFileDialog::accepted() {
|
||||||
|
if (sysDialog) {
|
||||||
|
return (fileName!="");
|
||||||
|
} else {
|
||||||
|
return ImGuiFileDialog::Instance()->IsOk();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FurnaceGUIFileDialog::close() {
|
||||||
|
if (sysDialog) {
|
||||||
|
if (saving) {
|
||||||
|
if (dialogS!=NULL) {
|
||||||
|
delete dialogS;
|
||||||
|
dialogS=NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (dialogO!=NULL) {
|
||||||
|
delete dialogO;
|
||||||
|
dialogO=NULL;
|
||||||
|
printf("deleting\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ImGuiFileDialog::Instance()->Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FurnaceGUIFileDialog::render(const ImVec2& min, const ImVec2& max) {
|
||||||
|
if (sysDialog) {
|
||||||
|
if (saving) {
|
||||||
|
if (dialogS!=NULL) {
|
||||||
|
if (dialogS->ready(1)) {
|
||||||
|
fileName=dialogS->result();
|
||||||
|
printf("returning %s\n",fileName.c_str());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (dialogO!=NULL) {
|
||||||
|
if (dialogO->ready(1)) {
|
||||||
|
if (dialogO->result().empty()) {
|
||||||
|
fileName="";
|
||||||
|
printf("returning nothing\n");
|
||||||
|
} else {
|
||||||
|
fileName=dialogO->result()[0];
|
||||||
|
printf("returning %s\n",fileName.c_str());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return ImGuiFileDialog::Instance()->Display("FileDialog",ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove,min,max);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String FurnaceGUIFileDialog::getPath() {
|
||||||
|
if (sysDialog) {
|
||||||
|
return curPath;
|
||||||
|
} else {
|
||||||
|
return ImGuiFileDialog::Instance()->GetCurrentPath();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String FurnaceGUIFileDialog::getFileName() {
|
||||||
|
if (sysDialog) {
|
||||||
|
return fileName;
|
||||||
|
} else {
|
||||||
|
return ImGuiFileDialog::Instance()->GetFilePathName();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
#include "../ta-utils.h"
|
||||||
|
#include "imgui.h"
|
||||||
|
|
||||||
|
namespace pfd {
|
||||||
|
class open_file;
|
||||||
|
class save_file;
|
||||||
|
}
|
||||||
|
|
||||||
|
class FurnaceGUIFileDialog {
|
||||||
|
bool sysDialog;
|
||||||
|
bool opened;
|
||||||
|
bool saving;
|
||||||
|
String curPath;
|
||||||
|
String fileName;
|
||||||
|
pfd::open_file* dialogO;
|
||||||
|
pfd::save_file* dialogS;
|
||||||
|
public:
|
||||||
|
bool openLoad(String header, std::vector<String> filter, String path, double dpiScale);
|
||||||
|
bool openSave(String header, std::vector<String> filter, String path, double dpiScale);
|
||||||
|
bool accepted();
|
||||||
|
void close();
|
||||||
|
bool render(const ImVec2& min, const ImVec2& max);
|
||||||
|
String getPath();
|
||||||
|
String getFileName();
|
||||||
|
FurnaceGUIFileDialog(bool system):
|
||||||
|
sysDialog(system),
|
||||||
|
opened(false),
|
||||||
|
saving(false),
|
||||||
|
dialogO(NULL),
|
||||||
|
dialogS(NULL) {}
|
||||||
|
};
|
|
@ -4585,11 +4585,11 @@ bool dirExists(String what) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
|
void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
|
||||||
ImGuiFileDialog::Instance()->DpiScale=dpiScale;
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case GUI_FILE_OPEN:
|
case GUI_FILE_OPEN:
|
||||||
if (!dirExists(workingDirSong)) workingDirSong=getHomeDir();
|
if (!dirExists(workingDirSong)) workingDirSong=getHomeDir();
|
||||||
ImGuiFileDialog::Instance()->OpenModal("FileDialog","Open File","compatible files{.fur,.dmf},.*",workingDirSong);
|
fileDialog->openLoad("Open File",{"compatible files", ".fur,.dmf", "all files", ".*"},workingDirSong,dpiScale);
|
||||||
|
//ImGuiFileDialog::Instance()->OpenModal("FileDialog","Open File","compatible files{.fur,.dmf},.*",workingDirSong);
|
||||||
break;
|
break;
|
||||||
case GUI_FILE_SAVE:
|
case GUI_FILE_SAVE:
|
||||||
if (!dirExists(workingDirSong)) workingDirSong=getHomeDir();
|
if (!dirExists(workingDirSong)) workingDirSong=getHomeDir();
|
||||||
|
@ -5942,42 +5942,42 @@ bool FurnaceGUI::loop() {
|
||||||
if (patternOpen) nextWindow=GUI_WINDOW_PATTERN;
|
if (patternOpen) nextWindow=GUI_WINDOW_PATTERN;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGuiFileDialog::Instance()->Display("FileDialog",ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove,ImVec2(600.0f*dpiScale,400.0f*dpiScale),ImVec2(scrW*dpiScale,scrH*dpiScale))) {
|
if (fileDialog->render(ImVec2(600.0f*dpiScale,400.0f*dpiScale),ImVec2(scrW*dpiScale,scrH*dpiScale))) {
|
||||||
//ImGui::GetIO().ConfigFlags&=~ImGuiConfigFlags_NavEnableKeyboard;
|
//ImGui::GetIO().ConfigFlags&=~ImGuiConfigFlags_NavEnableKeyboard;
|
||||||
switch (curFileDialog) {
|
switch (curFileDialog) {
|
||||||
case GUI_FILE_OPEN:
|
case GUI_FILE_OPEN:
|
||||||
case GUI_FILE_SAVE:
|
case GUI_FILE_SAVE:
|
||||||
case GUI_FILE_SAVE_DMF_LEGACY:
|
case GUI_FILE_SAVE_DMF_LEGACY:
|
||||||
workingDirSong=ImGuiFileDialog::Instance()->GetCurrentPath()+DIR_SEPARATOR_STR;
|
workingDirSong=fileDialog->getPath()+DIR_SEPARATOR_STR;
|
||||||
break;
|
break;
|
||||||
case GUI_FILE_INS_OPEN:
|
case GUI_FILE_INS_OPEN:
|
||||||
case GUI_FILE_INS_SAVE:
|
case GUI_FILE_INS_SAVE:
|
||||||
workingDirIns=ImGuiFileDialog::Instance()->GetCurrentPath()+DIR_SEPARATOR_STR;
|
workingDirIns=fileDialog->getPath()+DIR_SEPARATOR_STR;
|
||||||
break;
|
break;
|
||||||
case GUI_FILE_WAVE_OPEN:
|
case GUI_FILE_WAVE_OPEN:
|
||||||
case GUI_FILE_WAVE_SAVE:
|
case GUI_FILE_WAVE_SAVE:
|
||||||
workingDirWave=ImGuiFileDialog::Instance()->GetCurrentPath()+DIR_SEPARATOR_STR;
|
workingDirWave=fileDialog->getPath()+DIR_SEPARATOR_STR;
|
||||||
break;
|
break;
|
||||||
case GUI_FILE_SAMPLE_OPEN:
|
case GUI_FILE_SAMPLE_OPEN:
|
||||||
case GUI_FILE_SAMPLE_SAVE:
|
case GUI_FILE_SAMPLE_SAVE:
|
||||||
workingDirSample=ImGuiFileDialog::Instance()->GetCurrentPath()+DIR_SEPARATOR_STR;
|
workingDirSample=fileDialog->getPath()+DIR_SEPARATOR_STR;
|
||||||
break;
|
break;
|
||||||
case GUI_FILE_EXPORT_AUDIO_ONE:
|
case GUI_FILE_EXPORT_AUDIO_ONE:
|
||||||
case GUI_FILE_EXPORT_AUDIO_PER_SYS:
|
case GUI_FILE_EXPORT_AUDIO_PER_SYS:
|
||||||
case GUI_FILE_EXPORT_AUDIO_PER_CHANNEL:
|
case GUI_FILE_EXPORT_AUDIO_PER_CHANNEL:
|
||||||
workingDirAudioExport=ImGuiFileDialog::Instance()->GetCurrentPath()+DIR_SEPARATOR_STR;
|
workingDirAudioExport=fileDialog->getPath()+DIR_SEPARATOR_STR;
|
||||||
break;
|
break;
|
||||||
case GUI_FILE_EXPORT_VGM:
|
case GUI_FILE_EXPORT_VGM:
|
||||||
case GUI_FILE_EXPORT_ROM:
|
case GUI_FILE_EXPORT_ROM:
|
||||||
workingDirVGMExport=ImGuiFileDialog::Instance()->GetCurrentPath()+DIR_SEPARATOR_STR;
|
workingDirVGMExport=fileDialog->getPath()+DIR_SEPARATOR_STR;
|
||||||
break;
|
break;
|
||||||
case GUI_FILE_LOAD_MAIN_FONT:
|
case GUI_FILE_LOAD_MAIN_FONT:
|
||||||
case GUI_FILE_LOAD_PAT_FONT:
|
case GUI_FILE_LOAD_PAT_FONT:
|
||||||
workingDirFont=ImGuiFileDialog::Instance()->GetCurrentPath()+DIR_SEPARATOR_STR;
|
workingDirFont=fileDialog->getPath()+DIR_SEPARATOR_STR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (ImGuiFileDialog::Instance()->IsOk()) {
|
if (fileDialog->accepted()) {
|
||||||
fileName=ImGuiFileDialog::Instance()->GetFilePathName();
|
fileName=fileDialog->getFileName();
|
||||||
if (fileName!="") {
|
if (fileName!="") {
|
||||||
if (curFileDialog==GUI_FILE_SAVE) {
|
if (curFileDialog==GUI_FILE_SAVE) {
|
||||||
if (ImGuiFileDialog::Instance()->GetCurrentFilter()=="Furnace song") {
|
if (ImGuiFileDialog::Instance()->GetCurrentFilter()=="Furnace song") {
|
||||||
|
@ -6103,7 +6103,7 @@ bool FurnaceGUI::loop() {
|
||||||
curFileDialog=GUI_FILE_OPEN;
|
curFileDialog=GUI_FILE_OPEN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGuiFileDialog::Instance()->Close();
|
fileDialog->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (warnQuit) {
|
if (warnQuit) {
|
||||||
|
@ -6805,6 +6805,7 @@ FurnaceGUI::FurnaceGUI():
|
||||||
displayNew(false),
|
displayNew(false),
|
||||||
curFileDialog(GUI_FILE_OPEN),
|
curFileDialog(GUI_FILE_OPEN),
|
||||||
warnAction(GUI_WARN_OPEN),
|
warnAction(GUI_WARN_OPEN),
|
||||||
|
fileDialog(NULL),
|
||||||
scrW(1280),
|
scrW(1280),
|
||||||
scrH(800),
|
scrH(800),
|
||||||
dpiScale(1),
|
dpiScale(1),
|
||||||
|
|
|
@ -27,6 +27,8 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "fileDialog.h"
|
||||||
|
|
||||||
#define rightClickable if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) ImGui::SetKeyboardFocusHere(-1);
|
#define rightClickable if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) ImGui::SetKeyboardFocusHere(-1);
|
||||||
|
|
||||||
#define handleUnimportant if (settings.insFocusesPattern && patternOpen) {nextWindow=GUI_WINDOW_PATTERN;}
|
#define handleUnimportant if (settings.insFocusesPattern && patternOpen) {nextWindow=GUI_WINDOW_PATTERN;}
|
||||||
|
@ -476,6 +478,8 @@ class FurnaceGUI {
|
||||||
FurnaceGUIFileDialogs curFileDialog;
|
FurnaceGUIFileDialogs curFileDialog;
|
||||||
FurnaceGUIWarnings warnAction;
|
FurnaceGUIWarnings warnAction;
|
||||||
|
|
||||||
|
FurnaceGUIFileDialog* fileDialog;
|
||||||
|
|
||||||
int scrW, scrH;
|
int scrW, scrH;
|
||||||
|
|
||||||
double dpiScale;
|
double dpiScale;
|
||||||
|
@ -536,6 +540,7 @@ class FurnaceGUI {
|
||||||
int stepOnInsert;
|
int stepOnInsert;
|
||||||
// TODO flags
|
// TODO flags
|
||||||
int unifiedDataView;
|
int unifiedDataView;
|
||||||
|
int sysFileDialog;
|
||||||
// end
|
// end
|
||||||
unsigned int maxUndoSteps;
|
unsigned int maxUndoSteps;
|
||||||
String mainFontPath;
|
String mainFontPath;
|
||||||
|
@ -581,6 +586,8 @@ class FurnaceGUI {
|
||||||
avoidRaisingPattern(0),
|
avoidRaisingPattern(0),
|
||||||
insFocusesPattern(1),
|
insFocusesPattern(1),
|
||||||
stepOnInsert(0),
|
stepOnInsert(0),
|
||||||
|
unifiedDataView(0),
|
||||||
|
sysFileDialog(0),
|
||||||
maxUndoSteps(100),
|
maxUndoSteps(100),
|
||||||
mainFontPath(""),
|
mainFontPath(""),
|
||||||
patFontPath(""),
|
patFontPath(""),
|
||||||
|
|
|
@ -182,6 +182,11 @@ void FurnaceGUI::drawSettings() {
|
||||||
settings.restartOnFlagChange=restartOnFlagChangeB;
|
settings.restartOnFlagChange=restartOnFlagChangeB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool sysFileDialogB=settings.sysFileDialog;
|
||||||
|
if (ImGui::Checkbox("Use system file picker",&sysFileDialogB)) {
|
||||||
|
settings.sysFileDialog=sysFileDialogB;
|
||||||
|
}
|
||||||
|
|
||||||
ImGui::Text("Wrap pattern cursor horizontally:");
|
ImGui::Text("Wrap pattern cursor horizontally:");
|
||||||
if (ImGui::RadioButton("No##wrapH0",settings.wrapHorizontal==0)) {
|
if (ImGui::RadioButton("No##wrapH0",settings.wrapHorizontal==0)) {
|
||||||
settings.wrapHorizontal=0;
|
settings.wrapHorizontal=0;
|
||||||
|
@ -892,6 +897,8 @@ void FurnaceGUI::syncSettings() {
|
||||||
settings.avoidRaisingPattern=e->getConfInt("avoidRaisingPattern",0);
|
settings.avoidRaisingPattern=e->getConfInt("avoidRaisingPattern",0);
|
||||||
settings.insFocusesPattern=e->getConfInt("insFocusesPattern",1);
|
settings.insFocusesPattern=e->getConfInt("insFocusesPattern",1);
|
||||||
settings.stepOnInsert=e->getConfInt("stepOnInsert",0);
|
settings.stepOnInsert=e->getConfInt("stepOnInsert",0);
|
||||||
|
settings.unifiedDataView=e->getConfInt("unifiedDataView",0);
|
||||||
|
settings.sysFileDialog=e->getConfInt("sysFileDialog",0);
|
||||||
|
|
||||||
clampSetting(settings.mainFontSize,2,96);
|
clampSetting(settings.mainFontSize,2,96);
|
||||||
clampSetting(settings.patFontSize,2,96);
|
clampSetting(settings.patFontSize,2,96);
|
||||||
|
@ -930,6 +937,8 @@ void FurnaceGUI::syncSettings() {
|
||||||
clampSetting(settings.avoidRaisingPattern,0,1);
|
clampSetting(settings.avoidRaisingPattern,0,1);
|
||||||
clampSetting(settings.insFocusesPattern,0,1);
|
clampSetting(settings.insFocusesPattern,0,1);
|
||||||
clampSetting(settings.stepOnInsert,0,1);
|
clampSetting(settings.stepOnInsert,0,1);
|
||||||
|
clampSetting(settings.unifiedDataView,0,1);
|
||||||
|
clampSetting(settings.sysFileDialog,0,1);
|
||||||
|
|
||||||
// keybinds
|
// keybinds
|
||||||
LOAD_KEYBIND(GUI_ACTION_OPEN,FURKMOD_CMD|SDLK_o);
|
LOAD_KEYBIND(GUI_ACTION_OPEN,FURKMOD_CMD|SDLK_o);
|
||||||
|
@ -1082,6 +1091,9 @@ void FurnaceGUI::syncSettings() {
|
||||||
decodeKeyMap(noteKeys,e->getConfString("noteKeys",DEFAULT_NOTE_KEYS));
|
decodeKeyMap(noteKeys,e->getConfString("noteKeys",DEFAULT_NOTE_KEYS));
|
||||||
|
|
||||||
parseKeybinds();
|
parseKeybinds();
|
||||||
|
|
||||||
|
if (fileDialog!=NULL) delete fileDialog;
|
||||||
|
fileDialog=new FurnaceGUIFileDialog(settings.sysFileDialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PUT_UI_COLOR(source) e->setConf(#source,(int)ImGui::GetColorU32(uiColors[source]));
|
#define PUT_UI_COLOR(source) e->setConf(#source,(int)ImGui::GetColorU32(uiColors[source]));
|
||||||
|
@ -1129,6 +1141,8 @@ void FurnaceGUI::commitSettings() {
|
||||||
e->setConf("avoidRaisingPattern",settings.avoidRaisingPattern);
|
e->setConf("avoidRaisingPattern",settings.avoidRaisingPattern);
|
||||||
e->setConf("insFocusesPattern",settings.insFocusesPattern);
|
e->setConf("insFocusesPattern",settings.insFocusesPattern);
|
||||||
e->setConf("stepOnInsert",settings.stepOnInsert);
|
e->setConf("stepOnInsert",settings.stepOnInsert);
|
||||||
|
e->setConf("unifiedDataView",settings.unifiedDataView);
|
||||||
|
e->setConf("sysFileDialog",settings.sysFileDialog);
|
||||||
|
|
||||||
PUT_UI_COLOR(GUI_COLOR_BACKGROUND);
|
PUT_UI_COLOR(GUI_COLOR_BACKGROUND);
|
||||||
PUT_UI_COLOR(GUI_COLOR_FRAME_BACKGROUND);
|
PUT_UI_COLOR(GUI_COLOR_FRAME_BACKGROUND);
|
||||||
|
|
Loading…
Reference in New Issue