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
- stereo separation control for AY
- "paste with instrument"
- auto-detect system
- KVS
- 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();
prepareUndo(GUI_UNDO_PATTERN_PASTE);
char* clipText=SDL_GetClipboardText();
@ -481,14 +481,16 @@ void FurnaceGUI::doPaste(PasteMode mode) {
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.
} 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])) {
invalidData=true;
break;
}
if (mode==GUI_PASTE_MODE_INS_BG || mode==GUI_PASTE_MODE_INS_FG) pat->data[j][2]=arg;
}
}
} else {
@ -505,7 +507,7 @@ void FurnaceGUI::doPaste(PasteMode mode) {
note[2]=0;
if (iFine==1) {
if (!opMaskPaste.ins) {
if (!opMaskPaste.ins || mode==GUI_PASTE_MODE_INS_BG || mode==GUI_PASTE_MODE_INS_FG) {
iFine++;
continue;
}
@ -527,7 +529,8 @@ void FurnaceGUI::doPaste(PasteMode mode) {
}
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;
}
} else {
@ -536,7 +539,7 @@ void FurnaceGUI::doPaste(PasteMode mode) {
invalidData=true;
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;
}
}

View File

@ -2180,6 +2180,30 @@ void FurnaceGUI::editOptions(bool topMenu) {
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 (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 overflow",BIND_FOR(GUI_ACTION_PAT_PASTE_OVERFLOW))) doPaste(GUI_PASTE_MODE_OVERFLOW);
ImGui::EndMenu();

View File

@ -596,7 +596,9 @@ enum PasteMode {
GUI_PASTE_MODE_MIX_FG,
GUI_PASTE_MODE_MIX_BG,
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)
@ -1708,7 +1710,7 @@ class FurnaceGUI {
void doInsert();
void doTranspose(int amount, OperationMask& mask);
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 doInterpolate();
void doFade(int p0, int p1, bool mode);