GUI: prepare to add "save all assets" options
This commit is contained in:
parent
8e50c8d618
commit
9d77522efb
|
@ -441,10 +441,26 @@ void FurnaceGUI::drawInsList(bool asChild) {
|
||||||
if (ImGui::MenuItem(_("save raw sample..."))) {
|
if (ImGui::MenuItem(_("save raw sample..."))) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_SAVE_RAW);
|
doAction(GUI_ACTION_SAMPLE_LIST_SAVE_RAW);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ImGui::Separator();
|
||||||
|
|
||||||
|
if (ImGui::MenuItem(_("save all instruments..."))) {
|
||||||
|
doAction(GUI_ACTION_INS_LIST_SAVE_ALL);
|
||||||
|
}
|
||||||
|
if (ImGui::MenuItem(_("save all wavetables..."))) {
|
||||||
|
doAction(GUI_ACTION_WAVE_LIST_SAVE_ALL);
|
||||||
|
}
|
||||||
|
if (ImGui::MenuItem(_("save all samples..."))) {
|
||||||
|
doAction(GUI_ACTION_SAMPLE_LIST_SAVE_ALL);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (ImGui::MenuItem(_("save as .dmp..."))) {
|
if (ImGui::MenuItem(_("save as .dmp..."))) {
|
||||||
doAction(GUI_ACTION_INS_LIST_SAVE_DMP);
|
doAction(GUI_ACTION_INS_LIST_SAVE_DMP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ImGui::MenuItem(_("save all..."))) {
|
||||||
|
doAction(GUI_ACTION_INS_LIST_SAVE_ALL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
}
|
}
|
||||||
|
@ -750,6 +766,9 @@ void FurnaceGUI::drawWaveList(bool asChild) {
|
||||||
if (ImGui::MenuItem(_("save raw..."))) {
|
if (ImGui::MenuItem(_("save raw..."))) {
|
||||||
doAction(GUI_ACTION_WAVE_LIST_SAVE_RAW);
|
doAction(GUI_ACTION_WAVE_LIST_SAVE_RAW);
|
||||||
}
|
}
|
||||||
|
if (ImGui::MenuItem(_("save all..."))) {
|
||||||
|
doAction(GUI_ACTION_WAVE_LIST_SAVE_ALL);
|
||||||
|
}
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -893,6 +912,9 @@ void FurnaceGUI::drawSampleList(bool asChild) {
|
||||||
if (ImGui::MenuItem(_("save raw..."))) {
|
if (ImGui::MenuItem(_("save raw..."))) {
|
||||||
doAction(GUI_ACTION_SAMPLE_LIST_SAVE_RAW);
|
doAction(GUI_ACTION_SAMPLE_LIST_SAVE_RAW);
|
||||||
}
|
}
|
||||||
|
if (ImGui::MenuItem(_("save all..."))) {
|
||||||
|
doAction(GUI_ACTION_SAMPLE_LIST_SAVE_ALL);
|
||||||
|
}
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
|
@ -781,8 +781,14 @@ void FurnaceGUI::doAction(int what) {
|
||||||
case GUI_ACTION_INS_LIST_DIR_VIEW:
|
case GUI_ACTION_INS_LIST_DIR_VIEW:
|
||||||
insListDir=!insListDir;
|
insListDir=!insListDir;
|
||||||
break;
|
break;
|
||||||
|
case GUI_ACTION_INS_LIST_SAVE_ALL:
|
||||||
|
if (e->song.ins.empty()) {
|
||||||
|
showError(_("this song doesn't have any instruments."));
|
||||||
|
} else {
|
||||||
|
openFileDialog(GUI_FILE_INS_SAVE_ALL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
case GUI_ACTION_WAVE_LIST_ADD: {
|
case GUI_ACTION_WAVE_LIST_ADD: {
|
||||||
std::vector<DivSystem> alreadyDone;
|
std::vector<DivSystem> alreadyDone;
|
||||||
waveSizeList.clear();
|
waveSizeList.clear();
|
||||||
|
@ -902,6 +908,13 @@ void FurnaceGUI::doAction(int what) {
|
||||||
case GUI_ACTION_WAVE_LIST_DIR_VIEW:
|
case GUI_ACTION_WAVE_LIST_DIR_VIEW:
|
||||||
waveListDir=!waveListDir;
|
waveListDir=!waveListDir;
|
||||||
break;
|
break;
|
||||||
|
case GUI_ACTION_WAVE_LIST_SAVE_ALL:
|
||||||
|
if (e->song.wave.empty()) {
|
||||||
|
showError(_("this song doesn't have any wavetables."));
|
||||||
|
} else {
|
||||||
|
openFileDialog(GUI_FILE_WAVE_SAVE_ALL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case GUI_ACTION_SAMPLE_LIST_ADD:
|
case GUI_ACTION_SAMPLE_LIST_ADD:
|
||||||
curSample=e->addSample();
|
curSample=e->addSample();
|
||||||
|
@ -1056,6 +1069,13 @@ void FurnaceGUI::doAction(int what) {
|
||||||
displayInsTypeListMakeInsSample=-2;
|
displayInsTypeListMakeInsSample=-2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case GUI_ACTION_SAMPLE_LIST_SAVE_ALL:
|
||||||
|
if (e->song.sample.empty()) {
|
||||||
|
showError(_("this song doesn't have any samples."));
|
||||||
|
} else {
|
||||||
|
openFileDialog(GUI_FILE_SAMPLE_SAVE_ALL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case GUI_ACTION_SAMPLE_SELECT:
|
case GUI_ACTION_SAMPLE_SELECT:
|
||||||
if (curSample<0 || curSample>=(int)e->song.sample.size()) break;
|
if (curSample<0 || curSample>=(int)e->song.sample.size()) break;
|
||||||
|
|
|
@ -13,12 +13,13 @@
|
||||||
|
|
||||||
#ifdef USE_NFD
|
#ifdef USE_NFD
|
||||||
struct NFDState {
|
struct NFDState {
|
||||||
bool isSave, allowMultiple;
|
unsigned char isSave;
|
||||||
|
bool allowMultiple;
|
||||||
String header;
|
String header;
|
||||||
std::vector<String> filter;
|
std::vector<String> filter;
|
||||||
String path;
|
String path;
|
||||||
FileDialogSelectCallback clickCallback;
|
FileDialogSelectCallback clickCallback;
|
||||||
NFDState(bool save, String h, std::vector<String> filt, String pa, FileDialogSelectCallback cc, bool multi):
|
NFDState(unsigned char save, String h, std::vector<String> filt, String pa, FileDialogSelectCallback cc, bool multi):
|
||||||
isSave(save),
|
isSave(save),
|
||||||
allowMultiple(multi),
|
allowMultiple(multi),
|
||||||
header(h),
|
header(h),
|
||||||
|
@ -36,7 +37,9 @@ void _nfdThread(const NFDState state, std::atomic<bool>* ok, std::vector<String>
|
||||||
|
|
||||||
result->clear();
|
result->clear();
|
||||||
|
|
||||||
if (state.isSave) {
|
if (state.isSave==2) {
|
||||||
|
ret=NFD_PickFolder(state.path.c_str(),&out);
|
||||||
|
} else if (state.isSave==1) {
|
||||||
ret=NFD_SaveDialog(state.filter,state.path.c_str(),&out,state.clickCallback);
|
ret=NFD_SaveDialog(state.filter,state.path.c_str(),&out,state.clickCallback);
|
||||||
} else {
|
} else {
|
||||||
if (state.allowMultiple) {
|
if (state.allowMultiple) {
|
||||||
|
@ -112,7 +115,7 @@ void FurnaceGUIFileDialog::convertFilterList(std::vector<String>& filter) {
|
||||||
|
|
||||||
bool FurnaceGUIFileDialog::openLoad(String header, std::vector<String> filter, String path, double dpiScale, FileDialogSelectCallback clickCallback, bool allowMultiple, String hint) {
|
bool FurnaceGUIFileDialog::openLoad(String header, std::vector<String> filter, String path, double dpiScale, FileDialogSelectCallback clickCallback, bool allowMultiple, String hint) {
|
||||||
if (opened) return false;
|
if (opened) return false;
|
||||||
saving=false;
|
dialogType=0;
|
||||||
curPath=path;
|
curPath=path;
|
||||||
|
|
||||||
// strip excess directory separators
|
// strip excess directory separators
|
||||||
|
@ -128,9 +131,9 @@ bool FurnaceGUIFileDialog::openLoad(String header, std::vector<String> filter, S
|
||||||
#ifdef USE_NFD
|
#ifdef USE_NFD
|
||||||
dialogOK=false;
|
dialogOK=false;
|
||||||
#ifdef NFD_NON_THREADED
|
#ifdef NFD_NON_THREADED
|
||||||
_nfdThread(NFDState(false,header,filter,path,clickCallback,allowMultiple),&dialogOK,&nfdResult,&hasError);
|
_nfdThread(NFDState(0,header,filter,path,clickCallback,allowMultiple),&dialogOK,&nfdResult,&hasError);
|
||||||
#else
|
#else
|
||||||
dialogO=new std::thread(_nfdThread,NFDState(false,header,filter,path,clickCallback,allowMultiple),&dialogOK,&nfdResult,&hasError);
|
dialogO=new std::thread(_nfdThread,NFDState(0,header,filter,path,clickCallback,allowMultiple),&dialogOK,&nfdResult,&hasError);
|
||||||
#endif
|
#endif
|
||||||
#elif defined(ANDROID)
|
#elif defined(ANDROID)
|
||||||
hasError=false;
|
hasError=false;
|
||||||
|
@ -190,7 +193,7 @@ bool FurnaceGUIFileDialog::openLoad(String header, std::vector<String> filter, S
|
||||||
ImGuiFileDialog::Instance()->DpiScale=dpiScale;
|
ImGuiFileDialog::Instance()->DpiScale=dpiScale;
|
||||||
ImGuiFileDialog::Instance()->mobileMode=mobileUI;
|
ImGuiFileDialog::Instance()->mobileMode=mobileUI;
|
||||||
ImGuiFileDialog::Instance()->homePath=getHomeDir();
|
ImGuiFileDialog::Instance()->homePath=getHomeDir();
|
||||||
ImGuiFileDialog::Instance()->OpenModal("FileDialog",header,noSysFilter,path,hint,allowMultiple?999:1,nullptr,0,clickCallback);
|
ImGuiFileDialog::Instance()->OpenModal("FileDialog",header,filter.empty()?NULL:noSysFilter,path,hint,allowMultiple?999:1,nullptr,0,clickCallback);
|
||||||
}
|
}
|
||||||
opened=true;
|
opened=true;
|
||||||
return true;
|
return true;
|
||||||
|
@ -205,7 +208,7 @@ bool FurnaceGUIFileDialog::openSave(String header, std::vector<String> filter, S
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
saving=true;
|
dialogType=1;
|
||||||
curPath=path;
|
curPath=path;
|
||||||
|
|
||||||
// strip excess directory separators
|
// strip excess directory separators
|
||||||
|
@ -220,9 +223,9 @@ bool FurnaceGUIFileDialog::openSave(String header, std::vector<String> filter, S
|
||||||
#ifdef USE_NFD
|
#ifdef USE_NFD
|
||||||
dialogOK=false;
|
dialogOK=false;
|
||||||
#ifdef NFD_NON_THREADED
|
#ifdef NFD_NON_THREADED
|
||||||
_nfdThread(NFDState(true,header,filter,path,NULL,false),&dialogOK,&nfdResult,&hasError);
|
_nfdThread(NFDState(1,header,filter,path,NULL,false),&dialogOK,&nfdResult,&hasError);
|
||||||
#else
|
#else
|
||||||
dialogS=new std::thread(_nfdThread,NFDState(true,header,filter,path,NULL,false),&dialogOK,&nfdResult,&hasError);
|
dialogS=new std::thread(_nfdThread,NFDState(1,header,filter,path,NULL,false),&dialogOK,&nfdResult,&hasError);
|
||||||
#endif
|
#endif
|
||||||
#elif defined(ANDROID)
|
#elif defined(ANDROID)
|
||||||
hasError=false;
|
hasError=false;
|
||||||
|
@ -282,6 +285,54 @@ bool FurnaceGUIFileDialog::openSave(String header, std::vector<String> filter, S
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FurnaceGUIFileDialog::openSelectDir(String header, String path, double dpiScale, String hint) {
|
||||||
|
if (opened) return false;
|
||||||
|
dialogType=2;
|
||||||
|
curPath=path;
|
||||||
|
|
||||||
|
// strip excess directory separators
|
||||||
|
while (!curPath.empty()) {
|
||||||
|
if (curPath[curPath.size()-1]!=DIR_SEPARATOR) break;
|
||||||
|
curPath.erase(curPath.size()-1);
|
||||||
|
}
|
||||||
|
curPath+=DIR_SEPARATOR;
|
||||||
|
|
||||||
|
logD("opening select dir dialog with curPath %s",curPath.c_str());
|
||||||
|
if (sysDialog) {
|
||||||
|
curPath+=hint;
|
||||||
|
#ifdef USE_NFD
|
||||||
|
dialogOK=false;
|
||||||
|
#ifdef NFD_NON_THREADED
|
||||||
|
_nfdThread(NFDState(2,header,filter,path,NULL,false),&dialogOK,&nfdResult,&hasError);
|
||||||
|
#else
|
||||||
|
dialogF=new std::thread(_nfdThread,NFDState(2,header,filter,path,NULL,false),&dialogOK,&nfdResult,&hasError);
|
||||||
|
#endif
|
||||||
|
#elif defined(ANDROID)
|
||||||
|
hasError=true;
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
|
dialogF=new pfd::select_folder(header,path);
|
||||||
|
hasError=!pfd::settings::available();
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
hasError=false;
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
if (!SDL_AndroidRequestPermission("android.permission.READ_EXTERNAL_STORAGE")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ImGuiFileDialog::Instance()->singleClickSel=mobileUI;
|
||||||
|
ImGuiFileDialog::Instance()->DpiScale=dpiScale;
|
||||||
|
ImGuiFileDialog::Instance()->mobileMode=mobileUI;
|
||||||
|
ImGuiFileDialog::Instance()->homePath=getHomeDir();
|
||||||
|
ImGuiFileDialog::Instance()->OpenModal("FileDialog",header,NULL,path,hint,1,nullptr,0);
|
||||||
|
}
|
||||||
|
opened=true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool FurnaceGUIFileDialog::accepted() {
|
bool FurnaceGUIFileDialog::accepted() {
|
||||||
if (sysDialog) {
|
if (sysDialog) {
|
||||||
return (!fileName.empty());
|
return (!fileName.empty());
|
||||||
|
@ -292,7 +343,17 @@ bool FurnaceGUIFileDialog::accepted() {
|
||||||
|
|
||||||
void FurnaceGUIFileDialog::close() {
|
void FurnaceGUIFileDialog::close() {
|
||||||
if (sysDialog) {
|
if (sysDialog) {
|
||||||
if (saving) {
|
if (dialogType==2) {
|
||||||
|
if (dialogF!=NULL) {
|
||||||
|
#ifdef USE_NFD
|
||||||
|
dialogF->join();
|
||||||
|
#endif
|
||||||
|
#ifndef ANDROID
|
||||||
|
delete dialogF;
|
||||||
|
#endif
|
||||||
|
dialogF=NULL;
|
||||||
|
}
|
||||||
|
} else if (dialogType==1) {
|
||||||
if (dialogS!=NULL) {
|
if (dialogS!=NULL) {
|
||||||
#ifdef USE_NFD
|
#ifdef USE_NFD
|
||||||
dialogS->join();
|
dialogS->join();
|
||||||
|
@ -302,7 +363,7 @@ void FurnaceGUIFileDialog::close() {
|
||||||
#endif
|
#endif
|
||||||
dialogS=NULL;
|
dialogS=NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else if (dialogType==0) {
|
||||||
if (dialogO!=NULL) {
|
if (dialogO!=NULL) {
|
||||||
#ifdef USE_NFD
|
#ifdef USE_NFD
|
||||||
dialogO->join();
|
dialogO->join();
|
||||||
|
@ -312,6 +373,8 @@ void FurnaceGUIFileDialog::close() {
|
||||||
#endif
|
#endif
|
||||||
dialogO=NULL;
|
dialogO=NULL;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
logE("what...");
|
||||||
}
|
}
|
||||||
#ifdef USE_NFD
|
#ifdef USE_NFD
|
||||||
dialogOK=false;
|
dialogOK=false;
|
||||||
|
@ -343,7 +406,18 @@ bool FurnaceGUIFileDialog::render(const ImVec2& min, const ImVec2& max) {
|
||||||
// TODO: detect when file picker is closed
|
// TODO: detect when file picker is closed
|
||||||
return false;
|
return false;
|
||||||
#else
|
#else
|
||||||
if (saving) {
|
if (dialogType==2) {
|
||||||
|
if (dialogF!=NULL) {
|
||||||
|
if (dialogF->ready(0)) {
|
||||||
|
fileName.clear();
|
||||||
|
fileName.push_back(dialogF->result());
|
||||||
|
size_t dsPos=fileName[0].rfind(DIR_SEPARATOR);
|
||||||
|
if (dsPos!=String::npos) curPath=fileName[0].substr(0,dsPos);
|
||||||
|
logD("returning %s",fileName[0]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (dialogType==1) {
|
||||||
if (dialogS!=NULL) {
|
if (dialogS!=NULL) {
|
||||||
if (dialogS->ready(0)) {
|
if (dialogS->ready(0)) {
|
||||||
fileName.clear();
|
fileName.clear();
|
||||||
|
@ -354,7 +428,7 @@ bool FurnaceGUIFileDialog::render(const ImVec2& min, const ImVec2& max) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else if (dialogType==0) {
|
||||||
if (dialogO!=NULL) {
|
if (dialogO!=NULL) {
|
||||||
if (dialogO->ready(0)) {
|
if (dialogO->ready(0)) {
|
||||||
if (dialogO->result().empty()) {
|
if (dialogO->result().empty()) {
|
||||||
|
@ -375,6 +449,8 @@ bool FurnaceGUIFileDialog::render(const ImVec2& min, const ImVec2& max) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
logE("what!");
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
@ -410,7 +486,7 @@ std::vector<String>& FurnaceGUIFileDialog::getFileName() {
|
||||||
return fileName;
|
return fileName;
|
||||||
} else {
|
} else {
|
||||||
fileName.clear();
|
fileName.clear();
|
||||||
if (saving) {
|
if (dialogType==1) {
|
||||||
fileName.push_back(ImGuiFileDialog::Instance()->GetFilePathName());
|
fileName.push_back(ImGuiFileDialog::Instance()->GetFilePathName());
|
||||||
} else {
|
} else {
|
||||||
for (auto& i: ImGuiFileDialog::Instance()->GetSelection()) {
|
for (auto& i: ImGuiFileDialog::Instance()->GetSelection()) {
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
namespace pfd {
|
namespace pfd {
|
||||||
class open_file;
|
class open_file;
|
||||||
class save_file;
|
class save_file;
|
||||||
|
class select_folder;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -29,7 +30,7 @@ typedef std::function<void(const char*)> FileDialogSelectCallback;
|
||||||
class FurnaceGUIFileDialog {
|
class FurnaceGUIFileDialog {
|
||||||
bool sysDialog;
|
bool sysDialog;
|
||||||
bool opened;
|
bool opened;
|
||||||
bool saving;
|
unsigned char dialogType;
|
||||||
bool hasError;
|
bool hasError;
|
||||||
char noSysFilter[4096];
|
char noSysFilter[4096];
|
||||||
String curPath;
|
String curPath;
|
||||||
|
@ -37,15 +38,18 @@ class FurnaceGUIFileDialog {
|
||||||
#ifdef USE_NFD
|
#ifdef USE_NFD
|
||||||
std::thread* dialogO;
|
std::thread* dialogO;
|
||||||
std::thread* dialogS;
|
std::thread* dialogS;
|
||||||
|
std::thread* dialogF;
|
||||||
std::atomic<bool> dialogOK;
|
std::atomic<bool> dialogOK;
|
||||||
std::vector<String> nfdResult;
|
std::vector<String> nfdResult;
|
||||||
#elif defined(ANDROID)
|
#elif defined(ANDROID)
|
||||||
JNIEnv* jniEnv;
|
JNIEnv* jniEnv;
|
||||||
void* dialogO;
|
void* dialogO;
|
||||||
void* dialogS;
|
void* dialogS;
|
||||||
|
void* dialogF;
|
||||||
#else
|
#else
|
||||||
pfd::open_file* dialogO;
|
pfd::open_file* dialogO;
|
||||||
pfd::save_file* dialogS;
|
pfd::save_file* dialogS;
|
||||||
|
pfd::select_folder* dialogF;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void convertFilterList(std::vector<String>& filter);
|
void convertFilterList(std::vector<String>& filter);
|
||||||
|
@ -53,6 +57,7 @@ class FurnaceGUIFileDialog {
|
||||||
bool mobileUI;
|
bool mobileUI;
|
||||||
bool openLoad(String header, std::vector<String> filter, String path, double dpiScale, FileDialogSelectCallback clickCallback=NULL, bool allowMultiple=false, String hint="");
|
bool openLoad(String header, std::vector<String> filter, String path, double dpiScale, FileDialogSelectCallback clickCallback=NULL, bool allowMultiple=false, String hint="");
|
||||||
bool openSave(String header, std::vector<String> filter, String path, double dpiScale, String hint="");
|
bool openSave(String header, std::vector<String> filter, String path, double dpiScale, String hint="");
|
||||||
|
bool openSelectDir(String header, String path, double dpiScale, String hint="");
|
||||||
bool accepted();
|
bool accepted();
|
||||||
void close();
|
void close();
|
||||||
bool render(const ImVec2& min, const ImVec2& max);
|
bool render(const ImVec2& min, const ImVec2& max);
|
||||||
|
@ -63,7 +68,7 @@ class FurnaceGUIFileDialog {
|
||||||
explicit FurnaceGUIFileDialog(bool system):
|
explicit FurnaceGUIFileDialog(bool system):
|
||||||
sysDialog(system),
|
sysDialog(system),
|
||||||
opened(false),
|
opened(false),
|
||||||
saving(false),
|
dialogType(0),
|
||||||
hasError(false),
|
hasError(false),
|
||||||
#ifdef ANDROID
|
#ifdef ANDROID
|
||||||
jniEnv(NULL),
|
jniEnv(NULL),
|
||||||
|
|
|
@ -1794,6 +1794,14 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
|
||||||
(settings.autoFillSave)?e->getIns(curIns)->name:""
|
(settings.autoFillSave)?e->getIns(curIns)->name:""
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
case GUI_FILE_INS_SAVE_ALL:
|
||||||
|
if (!dirExists(workingDirIns)) workingDirIns=getHomeDir();
|
||||||
|
hasOpened=fileDialog->openSelectDir(
|
||||||
|
_("Save All Instruments"),
|
||||||
|
workingDirIns,
|
||||||
|
dpiScale
|
||||||
|
);
|
||||||
|
break;
|
||||||
case GUI_FILE_WAVE_OPEN:
|
case GUI_FILE_WAVE_OPEN:
|
||||||
case GUI_FILE_WAVE_OPEN_REPLACE:
|
case GUI_FILE_WAVE_OPEN_REPLACE:
|
||||||
if (!dirExists(workingDirWave)) workingDirWave=getHomeDir();
|
if (!dirExists(workingDirWave)) workingDirWave=getHomeDir();
|
||||||
|
@ -1834,6 +1842,14 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
|
||||||
dpiScale
|
dpiScale
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
case GUI_FILE_WAVE_SAVE_ALL:
|
||||||
|
if (!dirExists(workingDirWave)) workingDirWave=getHomeDir();
|
||||||
|
hasOpened=fileDialog->openSelectDir(
|
||||||
|
_("Save All Wavetables"),
|
||||||
|
workingDirWave,
|
||||||
|
dpiScale
|
||||||
|
);
|
||||||
|
break;
|
||||||
case GUI_FILE_SAMPLE_OPEN:
|
case GUI_FILE_SAMPLE_OPEN:
|
||||||
case GUI_FILE_SAMPLE_OPEN_REPLACE:
|
case GUI_FILE_SAMPLE_OPEN_REPLACE:
|
||||||
if (!dirExists(workingDirSample)) workingDirSample=getHomeDir();
|
if (!dirExists(workingDirSample)) workingDirSample=getHomeDir();
|
||||||
|
@ -1876,6 +1892,14 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) {
|
||||||
(settings.autoFillSave)?e->getSample(curSample)->name:""
|
(settings.autoFillSave)?e->getSample(curSample)->name:""
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
case GUI_FILE_SAMPLE_SAVE_ALL:
|
||||||
|
if (!dirExists(workingDirSample)) workingDirSample=getHomeDir();
|
||||||
|
hasOpened=fileDialog->openSelectDir(
|
||||||
|
_("Save All Samples"),
|
||||||
|
workingDirSample,
|
||||||
|
dpiScale
|
||||||
|
);
|
||||||
|
break;
|
||||||
case GUI_FILE_EXPORT_AUDIO_ONE:
|
case GUI_FILE_EXPORT_AUDIO_ONE:
|
||||||
if (!dirExists(workingDirAudioExport)) workingDirAudioExport=getHomeDir();
|
if (!dirExists(workingDirAudioExport)) workingDirAudioExport=getHomeDir();
|
||||||
hasOpened=fileDialog->openSave(
|
hasOpened=fileDialog->openSave(
|
||||||
|
@ -4909,6 +4933,7 @@ bool FurnaceGUI::loop() {
|
||||||
case GUI_FILE_INS_OPEN_REPLACE:
|
case GUI_FILE_INS_OPEN_REPLACE:
|
||||||
case GUI_FILE_INS_SAVE:
|
case GUI_FILE_INS_SAVE:
|
||||||
case GUI_FILE_INS_SAVE_DMP:
|
case GUI_FILE_INS_SAVE_DMP:
|
||||||
|
case GUI_FILE_INS_SAVE_ALL:
|
||||||
workingDirIns=fileDialog->getPath()+DIR_SEPARATOR_STR;
|
workingDirIns=fileDialog->getPath()+DIR_SEPARATOR_STR;
|
||||||
break;
|
break;
|
||||||
case GUI_FILE_WAVE_OPEN:
|
case GUI_FILE_WAVE_OPEN:
|
||||||
|
@ -4916,6 +4941,7 @@ bool FurnaceGUI::loop() {
|
||||||
case GUI_FILE_WAVE_SAVE:
|
case GUI_FILE_WAVE_SAVE:
|
||||||
case GUI_FILE_WAVE_SAVE_DMW:
|
case GUI_FILE_WAVE_SAVE_DMW:
|
||||||
case GUI_FILE_WAVE_SAVE_RAW:
|
case GUI_FILE_WAVE_SAVE_RAW:
|
||||||
|
case GUI_FILE_WAVE_SAVE_ALL:
|
||||||
workingDirWave=fileDialog->getPath()+DIR_SEPARATOR_STR;
|
workingDirWave=fileDialog->getPath()+DIR_SEPARATOR_STR;
|
||||||
break;
|
break;
|
||||||
case GUI_FILE_SAMPLE_OPEN:
|
case GUI_FILE_SAMPLE_OPEN:
|
||||||
|
@ -4924,6 +4950,7 @@ bool FurnaceGUI::loop() {
|
||||||
case GUI_FILE_SAMPLE_OPEN_REPLACE_RAW:
|
case GUI_FILE_SAMPLE_OPEN_REPLACE_RAW:
|
||||||
case GUI_FILE_SAMPLE_SAVE:
|
case GUI_FILE_SAMPLE_SAVE:
|
||||||
case GUI_FILE_SAMPLE_SAVE_RAW:
|
case GUI_FILE_SAMPLE_SAVE_RAW:
|
||||||
|
case GUI_FILE_SAMPLE_SAVE_ALL:
|
||||||
workingDirSample=fileDialog->getPath()+DIR_SEPARATOR_STR;
|
workingDirSample=fileDialog->getPath()+DIR_SEPARATOR_STR;
|
||||||
break;
|
break;
|
||||||
case GUI_FILE_EXPORT_AUDIO_ONE:
|
case GUI_FILE_EXPORT_AUDIO_ONE:
|
||||||
|
@ -5132,6 +5159,11 @@ bool FurnaceGUI::loop() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case GUI_FILE_INS_SAVE_ALL:
|
||||||
|
case GUI_FILE_WAVE_SAVE_ALL:
|
||||||
|
case GUI_FILE_SAMPLE_SAVE_ALL:
|
||||||
|
showError("Placeholder.");
|
||||||
|
break;
|
||||||
case GUI_FILE_WAVE_SAVE:
|
case GUI_FILE_WAVE_SAVE:
|
||||||
if (curWave>=0 && curWave<(int)e->song.wave.size()) {
|
if (curWave>=0 && curWave<(int)e->song.wave.size()) {
|
||||||
if (e->song.wave[curWave]->save(copyOfName.c_str())) {
|
if (e->song.wave[curWave]->save(copyOfName.c_str())) {
|
||||||
|
@ -5162,7 +5194,7 @@ bool FurnaceGUI::loop() {
|
||||||
if (fileDialog->getFileName().size()>1) {
|
if (fileDialog->getFileName().size()>1) {
|
||||||
warn=true;
|
warn=true;
|
||||||
errs+=fmt::sprintf("- %s: %s\n",i,e->getLastError());
|
errs+=fmt::sprintf("- %s: %s\n",i,e->getLastError());
|
||||||
} else {
|
} else {;
|
||||||
showError(e->getLastError());
|
showError(e->getLastError());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -580,17 +580,20 @@ enum FurnaceGUIFileDialogs {
|
||||||
GUI_FILE_INS_OPEN_REPLACE,
|
GUI_FILE_INS_OPEN_REPLACE,
|
||||||
GUI_FILE_INS_SAVE,
|
GUI_FILE_INS_SAVE,
|
||||||
GUI_FILE_INS_SAVE_DMP,
|
GUI_FILE_INS_SAVE_DMP,
|
||||||
|
GUI_FILE_INS_SAVE_ALL,
|
||||||
GUI_FILE_WAVE_OPEN,
|
GUI_FILE_WAVE_OPEN,
|
||||||
GUI_FILE_WAVE_OPEN_REPLACE,
|
GUI_FILE_WAVE_OPEN_REPLACE,
|
||||||
GUI_FILE_WAVE_SAVE,
|
GUI_FILE_WAVE_SAVE,
|
||||||
GUI_FILE_WAVE_SAVE_DMW,
|
GUI_FILE_WAVE_SAVE_DMW,
|
||||||
GUI_FILE_WAVE_SAVE_RAW,
|
GUI_FILE_WAVE_SAVE_RAW,
|
||||||
|
GUI_FILE_WAVE_SAVE_ALL,
|
||||||
GUI_FILE_SAMPLE_OPEN,
|
GUI_FILE_SAMPLE_OPEN,
|
||||||
GUI_FILE_SAMPLE_OPEN_RAW,
|
GUI_FILE_SAMPLE_OPEN_RAW,
|
||||||
GUI_FILE_SAMPLE_OPEN_REPLACE,
|
GUI_FILE_SAMPLE_OPEN_REPLACE,
|
||||||
GUI_FILE_SAMPLE_OPEN_REPLACE_RAW,
|
GUI_FILE_SAMPLE_OPEN_REPLACE_RAW,
|
||||||
GUI_FILE_SAMPLE_SAVE,
|
GUI_FILE_SAMPLE_SAVE,
|
||||||
GUI_FILE_SAMPLE_SAVE_RAW,
|
GUI_FILE_SAMPLE_SAVE_RAW,
|
||||||
|
GUI_FILE_SAMPLE_SAVE_ALL,
|
||||||
GUI_FILE_EXPORT_AUDIO_ONE,
|
GUI_FILE_EXPORT_AUDIO_ONE,
|
||||||
GUI_FILE_EXPORT_AUDIO_PER_SYS,
|
GUI_FILE_EXPORT_AUDIO_PER_SYS,
|
||||||
GUI_FILE_EXPORT_AUDIO_PER_CHANNEL,
|
GUI_FILE_EXPORT_AUDIO_PER_CHANNEL,
|
||||||
|
@ -831,6 +834,7 @@ enum FurnaceGUIActions {
|
||||||
GUI_ACTION_INS_LIST_UP,
|
GUI_ACTION_INS_LIST_UP,
|
||||||
GUI_ACTION_INS_LIST_DOWN,
|
GUI_ACTION_INS_LIST_DOWN,
|
||||||
GUI_ACTION_INS_LIST_DIR_VIEW,
|
GUI_ACTION_INS_LIST_DIR_VIEW,
|
||||||
|
GUI_ACTION_INS_LIST_SAVE_ALL,
|
||||||
GUI_ACTION_INS_LIST_MAX,
|
GUI_ACTION_INS_LIST_MAX,
|
||||||
|
|
||||||
GUI_ACTION_WAVE_LIST_MIN,
|
GUI_ACTION_WAVE_LIST_MIN,
|
||||||
|
@ -848,6 +852,7 @@ enum FurnaceGUIActions {
|
||||||
GUI_ACTION_WAVE_LIST_UP,
|
GUI_ACTION_WAVE_LIST_UP,
|
||||||
GUI_ACTION_WAVE_LIST_DOWN,
|
GUI_ACTION_WAVE_LIST_DOWN,
|
||||||
GUI_ACTION_WAVE_LIST_DIR_VIEW,
|
GUI_ACTION_WAVE_LIST_DIR_VIEW,
|
||||||
|
GUI_ACTION_WAVE_LIST_SAVE_ALL,
|
||||||
GUI_ACTION_WAVE_LIST_MAX,
|
GUI_ACTION_WAVE_LIST_MAX,
|
||||||
|
|
||||||
GUI_ACTION_SAMPLE_LIST_MIN,
|
GUI_ACTION_SAMPLE_LIST_MIN,
|
||||||
|
@ -869,6 +874,7 @@ enum FurnaceGUIActions {
|
||||||
GUI_ACTION_SAMPLE_LIST_STOP_PREVIEW,
|
GUI_ACTION_SAMPLE_LIST_STOP_PREVIEW,
|
||||||
GUI_ACTION_SAMPLE_LIST_DIR_VIEW,
|
GUI_ACTION_SAMPLE_LIST_DIR_VIEW,
|
||||||
GUI_ACTION_SAMPLE_LIST_MAKE_MAP,
|
GUI_ACTION_SAMPLE_LIST_MAKE_MAP,
|
||||||
|
GUI_ACTION_SAMPLE_LIST_SAVE_ALL,
|
||||||
GUI_ACTION_SAMPLE_LIST_MAX,
|
GUI_ACTION_SAMPLE_LIST_MAX,
|
||||||
|
|
||||||
GUI_ACTION_SAMPLE_MIN,
|
GUI_ACTION_SAMPLE_MIN,
|
||||||
|
|
|
@ -703,6 +703,7 @@ const FurnaceGUIActionDef guiActions[GUI_ACTION_MAX]={
|
||||||
D("INS_LIST_UP", _N("Instrument cursor up"), SDLK_UP),
|
D("INS_LIST_UP", _N("Instrument cursor up"), SDLK_UP),
|
||||||
D("INS_LIST_DOWN", _N("Instrument cursor down"), SDLK_DOWN),
|
D("INS_LIST_DOWN", _N("Instrument cursor down"), SDLK_DOWN),
|
||||||
D("INS_LIST_DIR_VIEW", _N("Instruments: toggle folders/standard view"), FURKMOD_CMD|SDLK_v),
|
D("INS_LIST_DIR_VIEW", _N("Instruments: toggle folders/standard view"), FURKMOD_CMD|SDLK_v),
|
||||||
|
D("INS_LIST_SAVE_ALL", _N("Save all instruments"), 0),
|
||||||
D("INS_LIST_MAX", "", NOT_AN_ACTION),
|
D("INS_LIST_MAX", "", NOT_AN_ACTION),
|
||||||
|
|
||||||
D("WAVE_LIST_MIN", _N("---Wavetable list"), NOT_AN_ACTION),
|
D("WAVE_LIST_MIN", _N("---Wavetable list"), NOT_AN_ACTION),
|
||||||
|
@ -720,6 +721,7 @@ const FurnaceGUIActionDef guiActions[GUI_ACTION_MAX]={
|
||||||
D("WAVE_LIST_UP", _N("Wavetable cursor up"), SDLK_UP),
|
D("WAVE_LIST_UP", _N("Wavetable cursor up"), SDLK_UP),
|
||||||
D("WAVE_LIST_DOWN", _N("Wavetable cursor down"), SDLK_DOWN),
|
D("WAVE_LIST_DOWN", _N("Wavetable cursor down"), SDLK_DOWN),
|
||||||
D("WAVE_LIST_DIR_VIEW", _N("Wavetables: toggle folders/standard view"), FURKMOD_CMD|SDLK_v),
|
D("WAVE_LIST_DIR_VIEW", _N("Wavetables: toggle folders/standard view"), FURKMOD_CMD|SDLK_v),
|
||||||
|
D("WAVE_LIST_SAVE_ALL", _N("Save all wavetables"), 0),
|
||||||
D("WAVE_LIST_MAX", "", NOT_AN_ACTION),
|
D("WAVE_LIST_MAX", "", NOT_AN_ACTION),
|
||||||
|
|
||||||
D("SAMPLE_LIST_MIN", _N("---Sample list"), NOT_AN_ACTION),
|
D("SAMPLE_LIST_MIN", _N("---Sample list"), NOT_AN_ACTION),
|
||||||
|
@ -741,6 +743,7 @@ const FurnaceGUIActionDef guiActions[GUI_ACTION_MAX]={
|
||||||
D("SAMPLE_LIST_STOP_PREVIEW", _N("Stop sample preview"), 0),
|
D("SAMPLE_LIST_STOP_PREVIEW", _N("Stop sample preview"), 0),
|
||||||
D("SAMPLE_LIST_DIR_VIEW", _N("Samples: Toggle folders/standard view"), FURKMOD_CMD|SDLK_v),
|
D("SAMPLE_LIST_DIR_VIEW", _N("Samples: Toggle folders/standard view"), FURKMOD_CMD|SDLK_v),
|
||||||
D("SAMPLE_LIST_MAKE_MAP", _N("Samples: Make me a drum kit"), 0),
|
D("SAMPLE_LIST_MAKE_MAP", _N("Samples: Make me a drum kit"), 0),
|
||||||
|
D("SAMPLE_LIST_SAVE_ALL", _N("Save all samples"), 0),
|
||||||
D("SAMPLE_LIST_MAX", "", NOT_AN_ACTION),
|
D("SAMPLE_LIST_MAX", "", NOT_AN_ACTION),
|
||||||
|
|
||||||
D("SAMPLE_MIN", _N("---Sample editor"), NOT_AN_ACTION),
|
D("SAMPLE_MIN", _N("---Sample editor"), NOT_AN_ACTION),
|
||||||
|
|
Loading…
Reference in a new issue