GUI: add paste with instrument

like paste mix but changes the instrument
This commit is contained in:
tildearrow 2022-09-21 22:59:53 -05:00
parent e22d7484cb
commit ad097e0526
4 changed files with 38 additions and 10 deletions

View File

@ -1,6 +1,5 @@
# to-do for 0.6pre1.5 # to-do for 0.6pre1.5
- stereo separation control for AY - stereo separation control for AY
- "paste with instrument" - KVS
- auto-detect system
- bug fixes - bug fixes

View File

@ -405,7 +405,7 @@ void FurnaceGUI::doCopy(bool cut) {
} }
} }
void FurnaceGUI::doPaste(PasteMode mode) { void FurnaceGUI::doPaste(PasteMode mode, int arg) {
finishSelection(); finishSelection();
prepareUndo(GUI_UNDO_PATTERN_PASTE); prepareUndo(GUI_UNDO_PATTERN_PASTE);
char* clipText=SDL_GetClipboardText(); char* clipText=SDL_GetClipboardText();
@ -481,14 +481,16 @@ void FurnaceGUI::doPaste(PasteMode mode) {
continue; continue;
} }
if ((mode==GUI_PASTE_MODE_MIX_BG || mode==GUI_PASTE_MODE_MIX_FG) && strcmp(note,"...")==0) { if ((mode==GUI_PASTE_MODE_MIX_BG || mode==GUI_PASTE_MODE_MIX_FG ||
mode==GUI_PASTE_MODE_INS_BG || mode==GUI_PASTE_MODE_INS_FG) && strcmp(note,"...")==0) {
// do nothing. // do nothing.
} else { } else {
if (mode!=GUI_PASTE_MODE_MIX_BG || (pat->data[j][0]==0 && pat->data[j][1]==0)) { if (!(mode==GUI_PASTE_MODE_MIX_BG || mode==GUI_PASTE_MODE_INS_BG) || (pat->data[j][0]==0 && pat->data[j][1]==0)) {
if (!decodeNote(note,pat->data[j][0],pat->data[j][1])) { if (!decodeNote(note,pat->data[j][0],pat->data[j][1])) {
invalidData=true; invalidData=true;
break; break;
} }
if (mode==GUI_PASTE_MODE_INS_BG || mode==GUI_PASTE_MODE_INS_FG) pat->data[j][2]=arg;
} }
} }
} else { } else {
@ -505,7 +507,7 @@ void FurnaceGUI::doPaste(PasteMode mode) {
note[2]=0; note[2]=0;
if (iFine==1) { if (iFine==1) {
if (!opMaskPaste.ins) { if (!opMaskPaste.ins || mode==GUI_PASTE_MODE_INS_BG || mode==GUI_PASTE_MODE_INS_FG) {
iFine++; iFine++;
continue; continue;
} }
@ -527,7 +529,8 @@ void FurnaceGUI::doPaste(PasteMode mode) {
} }
if (strcmp(note,"..")==0) { if (strcmp(note,"..")==0) {
if (!(mode==GUI_PASTE_MODE_MIX_BG || mode==GUI_PASTE_MODE_MIX_FG)) { if (!(mode==GUI_PASTE_MODE_MIX_BG || mode==GUI_PASTE_MODE_MIX_FG ||
mode==GUI_PASTE_MODE_INS_BG || mode==GUI_PASTE_MODE_INS_FG)) {
pat->data[j][iFine+1]=-1; pat->data[j][iFine+1]=-1;
} }
} else { } else {
@ -536,7 +539,7 @@ void FurnaceGUI::doPaste(PasteMode mode) {
invalidData=true; invalidData=true;
break; break;
} }
if (mode!=GUI_PASTE_MODE_MIX_BG || pat->data[j][iFine+1]==-1) { if (!(mode==GUI_PASTE_MODE_MIX_BG || mode==GUI_PASTE_MODE_INS_BG) || pat->data[j][iFine+1]==-1) {
if (iFine<(3+e->curPat[iCoarse].effectCols*2)) pat->data[j][iFine+1]=val; if (iFine<(3+e->curPat[iCoarse].effectCols*2)) pat->data[j][iFine+1]=val;
} }
} }

View File

@ -2180,6 +2180,30 @@ void FurnaceGUI::editOptions(bool topMenu) {
if (ImGui::BeginMenu("paste special...")) { if (ImGui::BeginMenu("paste special...")) {
if (ImGui::MenuItem("paste mix",BIND_FOR(GUI_ACTION_PAT_PASTE_MIX))) doPaste(GUI_PASTE_MODE_MIX_FG); if (ImGui::MenuItem("paste mix",BIND_FOR(GUI_ACTION_PAT_PASTE_MIX))) doPaste(GUI_PASTE_MODE_MIX_FG);
if (ImGui::MenuItem("paste mix (background)",BIND_FOR(GUI_ACTION_PAT_PASTE_MIX_BG))) doPaste(GUI_PASTE_MODE_MIX_BG); if (ImGui::MenuItem("paste mix (background)",BIND_FOR(GUI_ACTION_PAT_PASTE_MIX_BG))) doPaste(GUI_PASTE_MODE_MIX_BG);
if (ImGui::BeginMenu("paste with ins (foreground)")) {
if (e->song.ins.empty()) {
ImGui::Text("no instruments available");
}
for (size_t i=0; i<e->song.ins.size(); i++) {
snprintf(id,4095,"%.2X: %s",(int)i,e->song.ins[i]->name.c_str());
if (ImGui::MenuItem(id)) {
doPaste(GUI_PASTE_MODE_INS_FG,i);
}
}
ImGui::EndMenu();
}
if (ImGui::BeginMenu("paste with ins (background)")) {
if (e->song.ins.empty()) {
ImGui::Text("no instruments available");
}
for (size_t i=0; i<e->song.ins.size(); i++) {
snprintf(id,4095,"%.2X: %s",(int)i,e->song.ins[i]->name.c_str());
if (ImGui::MenuItem(id)) {
doPaste(GUI_PASTE_MODE_INS_BG,i);
}
}
ImGui::EndMenu();
}
if (ImGui::MenuItem("paste flood",BIND_FOR(GUI_ACTION_PAT_PASTE_FLOOD))) doPaste(GUI_PASTE_MODE_FLOOD); if (ImGui::MenuItem("paste flood",BIND_FOR(GUI_ACTION_PAT_PASTE_FLOOD))) doPaste(GUI_PASTE_MODE_FLOOD);
if (ImGui::MenuItem("paste overflow",BIND_FOR(GUI_ACTION_PAT_PASTE_OVERFLOW))) doPaste(GUI_PASTE_MODE_OVERFLOW); if (ImGui::MenuItem("paste overflow",BIND_FOR(GUI_ACTION_PAT_PASTE_OVERFLOW))) doPaste(GUI_PASTE_MODE_OVERFLOW);
ImGui::EndMenu(); ImGui::EndMenu();

View File

@ -596,7 +596,9 @@ enum PasteMode {
GUI_PASTE_MODE_MIX_FG, GUI_PASTE_MODE_MIX_FG,
GUI_PASTE_MODE_MIX_BG, GUI_PASTE_MODE_MIX_BG,
GUI_PASTE_MODE_FLOOD, GUI_PASTE_MODE_FLOOD,
GUI_PASTE_MODE_OVERFLOW GUI_PASTE_MODE_OVERFLOW,
GUI_PASTE_MODE_INS_FG,
GUI_PASTE_MODE_INS_BG
}; };
#define FURKMOD_CTRL (1U<<31) #define FURKMOD_CTRL (1U<<31)
@ -1708,7 +1710,7 @@ class FurnaceGUI {
void doInsert(); void doInsert();
void doTranspose(int amount, OperationMask& mask); void doTranspose(int amount, OperationMask& mask);
void doCopy(bool cut); void doCopy(bool cut);
void doPaste(PasteMode mode=GUI_PASTE_MODE_NORMAL); void doPaste(PasteMode mode=GUI_PASTE_MODE_NORMAL, int arg=0);
void doChangeIns(int ins); void doChangeIns(int ins);
void doInterpolate(); void doInterpolate();
void doFade(int p0, int p1, bool mode); void doFade(int p0, int p1, bool mode);