diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index 92ce732f..fc95c7ec 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -518,6 +518,9 @@ void FurnaceGUI::doAction(int what) { case GUI_ACTION_INS_LIST_OPEN: openFileDialog(GUI_FILE_INS_OPEN); break; + case GUI_ACTION_INS_LIST_OPEN_REPLACE: + openFileDialog(GUI_FILE_INS_OPEN_REPLACE); + break; case GUI_ACTION_INS_LIST_SAVE: if (curIns>=0 && curIns<(int)e->song.ins.size()) openFileDialog(GUI_FILE_INS_SAVE); break; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index b922feab..01ef0b27 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1288,7 +1288,14 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) { ); break; case GUI_FILE_INS_OPEN: + case GUI_FILE_INS_OPEN_REPLACE: prevIns=-3; + if (prevInsData!=NULL) { + delete prevInsData; + prevInsData=NULL; + } + prevInsData=new DivInstrument; + *prevInsData=*e->getIns(curIns); if (!dirExists(workingDirIns)) workingDirIns=getHomeDir(); hasOpened=fileDialog->openLoad( "Load Instrument", @@ -1300,11 +1307,20 @@ void FurnaceGUI::openFileDialog(FurnaceGUIFileDialogs type) { [this](const char* path) { std::vector instruments=e->instrumentFromFile(path); if (!instruments.empty()) { - e->loadTempIns(instruments[0]); - if (curIns!=-2) { - prevIns=curIns; + if (curFileDialog==GUI_FILE_INS_OPEN_REPLACE) { + if (prevIns==-3) { + prevIns=curIns; + } + if (prevIns>=0 && prevIns<=(int)e->song.ins.size()) { + *e->song.ins[prevIns]=*instruments[0]; + } + } else { + e->loadTempIns(instruments[0]); + if (curIns!=-2) { + prevIns=curIns; + } + curIns=-2; } - curIns=-2; } for (DivInstrument* i: instruments) delete i; } @@ -2911,8 +2927,18 @@ bool FurnaceGUI::loop() { if (fileDialog->render(ImVec2(600.0f*dpiScale,400.0f*dpiScale),ImVec2(scrW*dpiScale,scrH*dpiScale))) { bool openOpen=false; //ImGui::GetIO().ConfigFlags&=~ImGuiConfigFlags_NavEnableKeyboard; - if (curFileDialog==GUI_FILE_INS_OPEN && prevIns!=-3) { - curIns=prevIns; + if ((curFileDialog==GUI_FILE_INS_OPEN || curFileDialog==GUI_FILE_INS_OPEN_REPLACE) && prevIns!=-3) { + if (curFileDialog==GUI_FILE_INS_OPEN_REPLACE) { + if (prevInsData!=NULL) { + logI("try"); + if (prevIns>=0 && prevIns<(int)e->song.ins.size()) { + logI("replace"); + *e->song.ins[prevIns]=*prevInsData; + } + } + } else { + curIns=prevIns; + } prevIns=-3; } switch (curFileDialog) { @@ -2922,6 +2948,7 @@ bool FurnaceGUI::loop() { workingDirSong=fileDialog->getPath()+DIR_SEPARATOR_STR; break; case GUI_FILE_INS_OPEN: + case GUI_FILE_INS_OPEN_REPLACE: case GUI_FILE_INS_SAVE: workingDirIns=fileDialog->getPath()+DIR_SEPARATOR_STR; break; @@ -3101,6 +3128,25 @@ bool FurnaceGUI::loop() { } break; } + case GUI_FILE_INS_OPEN_REPLACE: { + std::vector instruments=e->instrumentFromFile(copyOfName.c_str()); + if (!instruments.empty()) { + if (!e->getWarnings().empty()) { + showWarning(e->getWarnings(),GUI_WARN_GENERIC); + } + if (curIns>=0 && curIns<(int)e->song.ins.size()) { + *e->song.ins[0]=*instruments[0]; + } else { + showError("...but you haven't selected an instrument!"); + } + for (DivInstrument* i: instruments) { + delete i; + } + } else { + showError("cannot load instrument! ("+e->getLastError()+")"); + } + break; + } case GUI_FILE_WAVE_OPEN: e->addWaveFromFile(copyOfName.c_str()); MARK_MODIFIED; @@ -3816,6 +3862,7 @@ FurnaceGUI::FurnaceGUI(): patFont(NULL), bigFont(NULL), fontRange(NULL), + prevInsData(NULL), curIns(0), curWave(0), curSample(0), diff --git a/src/gui/gui.h b/src/gui/gui.h index deabc889..99ca008b 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -239,6 +239,7 @@ enum FurnaceGUIFileDialogs { GUI_FILE_SAVE, GUI_FILE_SAVE_DMF_LEGACY, GUI_FILE_INS_OPEN, + GUI_FILE_INS_OPEN_REPLACE, GUI_FILE_INS_SAVE, GUI_FILE_WAVE_OPEN, GUI_FILE_WAVE_SAVE, @@ -406,6 +407,7 @@ enum FurnaceGUIActions { GUI_ACTION_INS_LIST_ADD, GUI_ACTION_INS_LIST_DUPLICATE, GUI_ACTION_INS_LIST_OPEN, + GUI_ACTION_INS_LIST_OPEN_REPLACE, GUI_ACTION_INS_LIST_SAVE, GUI_ACTION_INS_LIST_MOVE_UP, GUI_ACTION_INS_LIST_MOVE_DOWN, @@ -947,6 +949,8 @@ class FurnaceGUI { char finalLayoutPath[4096]; + DivInstrument* prevInsData; + int curIns, curWave, curSample, curOctave, curOrder, prevIns, oldRow, oldOrder, oldOrder1, editStep, exportLoops, soloChan, soloTimeout, orderEditMode, orderCursor; int loopOrder, loopRow, loopEnd, isClipping, extraChannelButtons, patNameTarget, newSongCategory, latchTarget; int wheelX, wheelY; diff --git a/src/gui/guiConst.cpp b/src/gui/guiConst.cpp index ca064739..3cbd8204 100644 --- a/src/gui/guiConst.cpp +++ b/src/gui/guiConst.cpp @@ -560,6 +560,7 @@ const FurnaceGUIActionDef guiActions[GUI_ACTION_MAX]={ D("INS_LIST_ADD", "Add", SDLK_INSERT), D("INS_LIST_DUPLICATE", "Duplicate", FURKMOD_CMD|SDLK_d), D("INS_LIST_OPEN", "Open", 0), + D("INS_LIST_OPEN_REPLACE", "Open (replace current)", 0), D("INS_LIST_SAVE", "Save", 0), D("INS_LIST_MOVE_UP", "Move up", FURKMOD_SHIFT|SDLK_UP), D("INS_LIST_MOVE_DOWN", "Move down", FURKMOD_SHIFT|SDLK_DOWN), diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 8d3ea74a..ed776524 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -1378,7 +1378,7 @@ void FurnaceGUI::drawInsEdit() { ImGui::TableNextColumn(); // TODO: load replace if (ImGui::Button(ICON_FA_FOLDER_OPEN "##IELoad")) { - doAction(GUI_ACTION_INS_LIST_OPEN); + doAction(GUI_ACTION_INS_LIST_OPEN_REPLACE); } ImGui::SameLine(); if (ImGui::Button(ICON_FA_FLOPPY_O "##IESave")) { diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 1d171dd0..5d79ebce 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -1616,6 +1616,7 @@ void FurnaceGUI::drawSettings() { UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_ADD); UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_DUPLICATE); UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_OPEN); + UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_OPEN_REPLACE); UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_SAVE); UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_MOVE_UP); UI_KEYBIND_CONFIG(GUI_ACTION_INS_LIST_MOVE_DOWN);