From 72ef39db6067bb9d4b4ac9445c1d20e38daba821 Mon Sep 17 00:00:00 2001 From: YohananDiamond Date: Mon, 3 Apr 2023 00:05:25 -0300 Subject: [PATCH 1/7] New song dialog: auto focus on pop up + reset search box --- src/gui/gui.cpp | 1 + src/gui/newSong.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 6213bdfde..2f96b8977 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4840,6 +4840,7 @@ bool FurnaceGUI::loop() { } if (displayNew) { + newSongQuery = ""; displayNew=false; ImGui::OpenPopup("New Song"); } diff --git a/src/gui/newSong.cpp b/src/gui/newSong.cpp index 8fdafeb9b..081554121 100644 --- a/src/gui/newSong.cpp +++ b/src/gui/newSong.cpp @@ -23,6 +23,9 @@ #include void FurnaceGUI::drawNewSong() { + // Be sure to reset this to true when the popup is closed + static bool firstFrame = true; + bool accepted=false; ImGui::PushFont(bigFont); @@ -34,6 +37,10 @@ void FurnaceGUI::drawNewSong() { avail.y-=ImGui::GetFrameHeightWithSpacing(); if (ImGui::BeginChild("sysPickerC",avail,false,ImGuiWindowFlags_NoScrollWithMouse|ImGuiWindowFlags_NoScrollbar)) { + if (firstFrame) { + ImGui::SetKeyboardFocusHere(); + firstFrame = false; + } ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); if (ImGui::InputTextWithHint("##SysSearch","Search...",&newSongQuery)) { String lowerCase=newSongQuery; @@ -122,10 +129,12 @@ void FurnaceGUI::drawNewSong() { if (ImGui::Button("I'm feeling lucky")) { if (sysCategories.size()==0) { + firstFrame = true; ImGui::CloseCurrentPopup(); } else { FurnaceGUISysCategory* newSystemCat=&sysCategories[rand()%sysCategories.size()]; if (newSystemCat->systems.size()==0) { + firstFrame = true; ImGui::CloseCurrentPopup(); } else { unsigned int selection=rand()%newSystemCat->systems.size(); @@ -139,6 +148,7 @@ void FurnaceGUI::drawNewSong() { ImGui::SameLine(); if (ImGui::Button("Cancel")) { + firstFrame = true; ImGui::CloseCurrentPopup(); } @@ -157,6 +167,7 @@ void FurnaceGUI::drawNewSong() { selEnd=SelectionPoint(); cursor=SelectionPoint(); updateWindowTitle(); + firstFrame = true; ImGui::CloseCurrentPopup(); } } From c3654a4d525ad40bfa1c158a7fab25a853c002b6 Mon Sep 17 00:00:00 2001 From: YohananDiamond Date: Mon, 3 Apr 2023 11:11:26 -0300 Subject: [PATCH 2/7] Applying corrections --- src/gui/gui.cpp | 3 ++- src/gui/gui.h | 1 + src/gui/newSong.cpp | 13 +++---------- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 2f96b8977..66e57df08 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4840,7 +4840,8 @@ bool FurnaceGUI::loop() { } if (displayNew) { - newSongQuery = ""; + newSongQuery=""; + newSongFirstFrame=true; displayNew=false; ImGui::OpenPopup("New Song"); } diff --git a/src/gui/gui.h b/src/gui/gui.h index cf18f7e8a..e75ee91bd 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1564,6 +1564,7 @@ class FurnaceGUI { double exportFadeOut; + bool newSongFirstFrame; bool editControlsOpen, ordersOpen, insListOpen, songInfoOpen, patternOpen, insEditOpen; bool waveListOpen, waveEditOpen, sampleListOpen, sampleEditOpen, aboutOpen, settingsOpen; bool mixerOpen, debugOpen, inspectorOpen, oscOpen, volMeterOpen, statsOpen, compatFlagsOpen; diff --git a/src/gui/newSong.cpp b/src/gui/newSong.cpp index 081554121..735f8bfb0 100644 --- a/src/gui/newSong.cpp +++ b/src/gui/newSong.cpp @@ -23,9 +23,6 @@ #include void FurnaceGUI::drawNewSong() { - // Be sure to reset this to true when the popup is closed - static bool firstFrame = true; - bool accepted=false; ImGui::PushFont(bigFont); @@ -37,10 +34,8 @@ void FurnaceGUI::drawNewSong() { avail.y-=ImGui::GetFrameHeightWithSpacing(); if (ImGui::BeginChild("sysPickerC",avail,false,ImGuiWindowFlags_NoScrollWithMouse|ImGuiWindowFlags_NoScrollbar)) { - if (firstFrame) { + if (newSongFirstFrame) ImGui::SetKeyboardFocusHere(); - firstFrame = false; - } ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); if (ImGui::InputTextWithHint("##SysSearch","Search...",&newSongQuery)) { String lowerCase=newSongQuery; @@ -129,12 +124,10 @@ void FurnaceGUI::drawNewSong() { if (ImGui::Button("I'm feeling lucky")) { if (sysCategories.size()==0) { - firstFrame = true; ImGui::CloseCurrentPopup(); } else { FurnaceGUISysCategory* newSystemCat=&sysCategories[rand()%sysCategories.size()]; if (newSystemCat->systems.size()==0) { - firstFrame = true; ImGui::CloseCurrentPopup(); } else { unsigned int selection=rand()%newSystemCat->systems.size(); @@ -148,7 +141,6 @@ void FurnaceGUI::drawNewSong() { ImGui::SameLine(); if (ImGui::Button("Cancel")) { - firstFrame = true; ImGui::CloseCurrentPopup(); } @@ -167,7 +159,8 @@ void FurnaceGUI::drawNewSong() { selEnd=SelectionPoint(); cursor=SelectionPoint(); updateWindowTitle(); - firstFrame = true; ImGui::CloseCurrentPopup(); } + + newSongFirstFrame=false; } From 8d4fa6e0cc97c568562590af6a1db13e13b31aed Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 10 Apr 2023 19:49:14 -0500 Subject: [PATCH 3/7] prepare for new sample map UI --- src/gui/gui.cpp | 7 +++++-- src/gui/gui.h | 7 +++++-- src/gui/insEdit.cpp | 1 + 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 058be1d14..23d96cd1f 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -6472,8 +6472,11 @@ FurnaceGUI::FurnaceGUI(): samplePreviewOn(false), samplePreviewKey((SDL_Scancode)0), samplePreviewNote(0), - arpMacroScroll(-12), - pitchMacroScroll(-80), + sampleMapSelStart(-1), + sampleMapSelEnd(-1), + sampleMapDigit(0), + sampleMapColumn(0), + sampleMapFocused(false), macroDragStart(0,0), macroDragAreaSize(0,0), macroDragCTarget(NULL), diff --git a/src/gui/gui.h b/src/gui/gui.h index 87fb79702..4dcb78ee1 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1679,8 +1679,11 @@ class FurnaceGUI { std::vector pressedPoints; std::vector releasedPoints; - int arpMacroScroll; - int pitchMacroScroll; + int sampleMapSelStart; + int sampleMapSelEnd; + int sampleMapDigit; + int sampleMapColumn; + bool sampleMapFocused; ImVec2 macroDragStart; ImVec2 macroDragAreaSize; diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index f2d97ac04..b6fcd7bc9 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -4425,6 +4425,7 @@ void FurnaceGUI::drawInsEdit() { ImGui::TableNextColumn(); ImGui::Text("%s",noteNames[60+i]); ImGui::TableNextColumn(); + // TODO: new style sample map if (sampleMap.map<0 || sampleMap.map>=e->song.sampleLen) { sName="-- empty --"; sampleMap.map=-1; From f90ca2410fad998c4e5f9fd91d99f0d8c85bfb01 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 11 Apr 2023 18:17:30 -0500 Subject: [PATCH 4/7] GUI: new sample map UI, part 1 keyboard/MIDI missing --- src/gui/insEdit.cpp | 93 ++++++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 35 deletions(-) diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index b6fcd7bc9..349376c26 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -4405,66 +4405,89 @@ void FurnaceGUI::drawInsEdit() { ImGui::BeginDisabled(ins->amiga.useWave); P(ImGui::Checkbox("Use sample map",&ins->amiga.useNoteMap)); if (ins->amiga.useNoteMap) { - if (ImGui::BeginTable("NoteMap",3,ImGuiTableFlags_ScrollY|ImGuiTableFlags_Borders|ImGuiTableFlags_SizingStretchSame)) { + if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) { + sampleMapFocused=false; + } + if (ImGui::BeginTable("NoteMap",4,ImGuiTableFlags_ScrollY|ImGuiTableFlags_Borders|ImGuiTableFlags_SizingStretchSame)) { ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed); - ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch); - ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("c3",ImGuiTableColumnFlags_WidthStretch); ImGui::TableSetupScrollFreeze(0,1); ImGui::TableNextRow(ImGuiTableRowFlags_Headers); ImGui::TableNextColumn(); ImGui::TableNextColumn(); - ImGui::Text("Sample"); + ImGui::Text("#"); ImGui::TableNextColumn(); - ImGui::Text("Note"); + ImGui::Text("note"); + ImGui::TableNextColumn(); + if (sampleMapFocused) { + ImGui::Text("FOCUSED"); + } else { + ImGui::Text("sample name"); + } + int sampleMapMin=sampleMapSelStart; + int sampleMapMax=sampleMapSelEnd; + if (sampleMapMin>sampleMapMax) { + sampleMapMin^=sampleMapMax; + sampleMapMax^=sampleMapMin; + sampleMapMin^=sampleMapMax; + } + for (int i=0; i<120; i++) { DivInstrumentAmiga::SampleMap& sampleMap=ins->amiga.noteMap[i]; ImGui::TableNextRow(); - ImGui::PushID(fmt::sprintf("NM_%d",i).c_str()); ImGui::TableNextColumn(); ImGui::Text("%s",noteNames[60+i]); ImGui::TableNextColumn(); - // TODO: new style sample map if (sampleMap.map<0 || sampleMap.map>=e->song.sampleLen) { - sName="-- empty --"; + sName=fmt::sprintf("---##SM%d",i); sampleMap.map=-1; } else { - sName=e->song.sample[sampleMap.map]->name; + sName=fmt::sprintf("%3d##SM%d",sampleMap.map,i); } - ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); - if (ImGui::BeginCombo("##SM",sName.c_str())) { - String id; - if (ImGui::Selectable("-- empty --",sampleMap.map==-1)) { PARAMETER - sampleMap.map=-1; - } - for (int j=0; jsong.sampleLen; j++) { - id=fmt::sprintf("%d: %s",j,e->song.sample[j]->name); - if (ImGui::Selectable(id.c_str(),sampleMap.map==j)) { PARAMETER - sampleMap.map=j; - } - } - ImGui::EndCombo(); + ImGui::PushFont(patFont); + ImGui::SetNextItemWidth(ImGui::CalcTextSize("00000").x); + ImGui::Selectable(sName.c_str(),(sampleMapFocused && sampleMapColumn==0 && i>=sampleMapMin && i<=sampleMapMax)); + if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) { + sampleMapFocused=true; + sampleMapColumn=0; + sampleMapSelStart=i; + sampleMapSelEnd=i; + ImGui::InhibitInertialScroll(); } + if (sampleMapFocused && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) && ImGui::IsMouseDown(ImGuiMouseButton_Left)) { + sampleMapSelEnd=i; + } + ImGui::PopFont(); ImGui::TableNextColumn(); - ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); - const char* nName="???"; + sName="???"; if ((sampleMap.freq+60)>0 && (sampleMap.freq+60)<180) { - nName=noteNames[sampleMap.freq+60]; + sName=noteNames[sampleMap.freq+60]; } - if (ImGui::BeginCombo("##SN",nName)) { - for (int j=0; j<180; j++) { - const char* nName2="???"; - nName2=noteNames[j]; - if (ImGui::Selectable(nName2,(sampleMap.freq+60)==j)) { - sampleMap.freq=j-60; - } - } - ImGui::EndCombo(); + sName+=fmt::sprintf("##SN%d",i); + ImGui::PushFont(patFont); + ImGui::SetNextItemWidth(ImGui::CalcTextSize("00000").x); + ImGui::Selectable(sName.c_str(),(sampleMapFocused && sampleMapColumn==1 && i>=sampleMapMin && i<=sampleMapMax)); + if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) { + sampleMapFocused=true; + sampleMapColumn=1; + sampleMapSelStart=i; + sampleMapSelEnd=i; + ImGui::InhibitInertialScroll(); } + if (sampleMapFocused && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) && ImGui::IsMouseDown(ImGuiMouseButton_Left)) { + sampleMapSelEnd=i; + } + ImGui::PopFont(); - ImGui::PopID(); + ImGui::TableNextColumn(); + if (sampleMap.map>=0 && sampleMap.mapsong.sampleLen) { + ImGui::TextUnformatted(e->song.sample[sampleMap.map]->name.c_str()); + } } ImGui::EndTable(); } From 7af514a658ba975b656d81dd81472a0a013d08b5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 11 Apr 2023 19:41:20 -0500 Subject: [PATCH 5/7] GUI: new sample map UI, part 2 next commit will introduce keyboard input --- src/gui/gui.cpp | 4 ++- src/gui/gui.h | 3 ++- src/gui/insEdit.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++--- src/gui/piano.cpp | 12 ++++++--- 4 files changed, 69 insertions(+), 9 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 23d96cd1f..13a380b41 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -2905,7 +2905,7 @@ int FurnaceGUI::processEvent(SDL_Event* ev) { } #endif if (ev->type==SDL_KEYDOWN) { - if (!ev->key.repeat && latchTarget==0 && !wantCaptureKeyboard && (ev->key.keysym.mod&(~(KMOD_NUM|KMOD_CAPS|KMOD_SCROLL)))==0) { + if (!ev->key.repeat && latchTarget==0 && !wantCaptureKeyboard && !sampleMapWaitingInput && (ev->key.keysym.mod&(~(KMOD_NUM|KMOD_CAPS|KMOD_SCROLL)))==0) { if (settings.notePreviewBehavior==0) return 1; switch (curWindow) { case GUI_WINDOW_SAMPLE_EDIT: @@ -5561,6 +5561,8 @@ bool FurnaceGUI::loop() { } } } + + sampleMapWaitingInput=(curWindow==GUI_WINDOW_INS_EDIT && sampleMapFocused); curWindowThreadSafe=curWindow; diff --git a/src/gui/gui.h b/src/gui/gui.h index 4dcb78ee1..fb193c20a 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1683,7 +1683,7 @@ class FurnaceGUI { int sampleMapSelEnd; int sampleMapDigit; int sampleMapColumn; - bool sampleMapFocused; + bool sampleMapFocused, sampleMapWaitingInput; ImVec2 macroDragStart; ImVec2 macroDragAreaSize; @@ -1938,6 +1938,7 @@ class FurnaceGUI { void drawMacroEdit(FurnaceGUIMacroDesc& i, int totalFit, float availableWidth, int index); void drawMacros(std::vector& macros, FurnaceGUIMacroEditState& state); + void alterSampleMap(bool isNote, int val); void drawOrderButtons(); diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 349376c26..9ec9da044 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -2023,6 +2023,57 @@ void FurnaceGUI::drawMacros(std::vector& macros, FurnaceGUI } } +void FurnaceGUI::alterSampleMap(bool isNote, int val) { + if (curIns<0 || curIns>=(int)e->song.ins.size()) return; + DivInstrument* ins=e->song.ins[curIns]; + int sampleMapMin=sampleMapSelStart; + int sampleMapMax=sampleMapSelEnd; + if (sampleMapMin>sampleMapMax) { + sampleMapMin^=sampleMapMax; + sampleMapMax^=sampleMapMin; + sampleMapMin^=sampleMapMax; + } + + for (int i=sampleMapMin; i<=sampleMapMax; i++) { + if (i<0 || i>=120) continue; + + if (sampleMapColumn==1 && isNote) { + ins->amiga.noteMap[i].freq=val; + } else if (sampleMapColumn==0 && !isNote) { + if (val<0) { + ins->amiga.noteMap[i].map=-1; + } else if (sampleMapDigit>0) { + ins->amiga.noteMap[i].map*=10; + ins->amiga.noteMap[i].map+=val; + } else { + ins->amiga.noteMap[i].map=val; + } + if (ins->amiga.noteMap[i].map>=(int)e->song.sample.size()) { + ins->amiga.noteMap[i].map=((int)e->song.sample.size())-1; + } + } + } + + bool advance=false; + if (sampleMapColumn==1 && isNote) { + advance=true; + } else if (sampleMapColumn==0 && !isNote) { + int digits=1; + if (e->song.sample.size()>=10) digits=2; + if (e->song.sample.size()>=100) digits=3; + if (++sampleMapDigit>=digits) { + sampleMapDigit=0; + advance=true; + } + } + + if (advance && sampleMapMin==sampleMapMax) { + sampleMapSelStart++; + if (sampleMapSelStart>119) sampleMapSelStart=119; + sampleMapSelEnd=sampleMapSelStart; + } +} + #define DRUM_FREQ(name,db,df,prop) \ ImGui::TableNextRow(); \ ImGui::TableNextColumn(); \ @@ -4405,9 +4456,9 @@ void FurnaceGUI::drawInsEdit() { ImGui::BeginDisabled(ins->amiga.useWave); P(ImGui::Checkbox("Use sample map",&ins->amiga.useNoteMap)); if (ins->amiga.useNoteMap) { - if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) { - sampleMapFocused=false; - } + if (ImGui::IsMouseClicked(ImGuiMouseButton_Left) && ImGui::IsWindowHovered()) sampleMapFocused=false; + if (curWindowLast!=GUI_WINDOW_INS_EDIT) sampleMapFocused=false; + if (!sampleMapFocused) sampleMapDigit=0; if (ImGui::BeginTable("NoteMap",4,ImGuiTableFlags_ScrollY|ImGuiTableFlags_Borders|ImGuiTableFlags_SizingStretchSame)) { ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed); ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthFixed); @@ -4454,6 +4505,7 @@ void FurnaceGUI::drawInsEdit() { if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) { sampleMapFocused=true; sampleMapColumn=0; + sampleMapDigit=0; sampleMapSelStart=i; sampleMapSelEnd=i; ImGui::InhibitInertialScroll(); @@ -4475,6 +4527,7 @@ void FurnaceGUI::drawInsEdit() { if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) { sampleMapFocused=true; sampleMapColumn=1; + sampleMapDigit=0; sampleMapSelStart=i; sampleMapSelEnd=i; ImGui::InhibitInertialScroll(); diff --git a/src/gui/piano.cpp b/src/gui/piano.cpp index fe451c3f7..baae316d1 100644 --- a/src/gui/piano.cpp +++ b/src/gui/piano.cpp @@ -415,10 +415,14 @@ void FurnaceGUI::drawPiano() { e->previewSample(curSample,note); break; default: - e->synchronized([this,note]() { - e->autoNoteOn(-1,curIns,note); - }); - if (edit && curWindow!=GUI_WINDOW_INS_LIST && curWindow!=GUI_WINDOW_INS_EDIT) noteInput(note,0); + if (sampleMapWaitingInput) { + alterSampleMap(true,note); + } else { + e->synchronized([this,note]() { + e->autoNoteOn(-1,curIns,note); + }); + if (edit && curWindow!=GUI_WINDOW_INS_LIST && curWindow!=GUI_WINDOW_INS_EDIT) noteInput(note,0); + } break; } } From e4bfcd985094fdd5978b69fe93e836f271529fe3 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 12 Apr 2023 00:50:31 -0500 Subject: [PATCH 6/7] GUI: new sample map UI, part 3 keyboard input --- src/gui/gui.cpp | 35 +++++++++++++++++++++++++++++++++++ src/gui/insEdit.cpp | 32 +++++++++++++++++++++++++++++--- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 13a380b41..aa23ef07c 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1327,6 +1327,41 @@ void FurnaceGUI::keyDown(SDL_Event& ev) { return; } + if (sampleMapWaitingInput) { + if (sampleMapColumn==1) { + // TODO: map? + if (ev.key.keysym.scancode==SDL_SCANCODE_DELETE) { + alterSampleMap(true,-1); + return; + } + try { + int key=noteKeys.at(ev.key.keysym.scancode); + int num=12*curOctave+key; + + if (num<-60) num=-60; // C-(-5) + if (num>119) num=119; // B-9 + + alterSampleMap(true,num); + return; + } catch (std::out_of_range& e) { + } + } else { + // TODO: map? + if (ev.key.keysym.scancode==SDL_SCANCODE_DELETE) { + alterSampleMap(false,-1); + return; + } + try { + int num=valueKeys.at(ev.key.keysym.sym); + if (num<10) { + alterSampleMap(false,num); + return; + } + } catch (std::out_of_range& e) { + } + } + } + // PER-WINDOW KEYS switch (curWindow) { case GUI_WINDOW_PATTERN: diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 9ec9da044..2b73c7ae1 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -2072,6 +2072,8 @@ void FurnaceGUI::alterSampleMap(bool isNote, int val) { if (sampleMapSelStart>119) sampleMapSelStart=119; sampleMapSelEnd=sampleMapSelStart; } + + MARK_MODIFIED; } #define DRUM_FREQ(name,db,df,prop) \ @@ -4456,7 +4458,7 @@ void FurnaceGUI::drawInsEdit() { ImGui::BeginDisabled(ins->amiga.useWave); P(ImGui::Checkbox("Use sample map",&ins->amiga.useNoteMap)); if (ins->amiga.useNoteMap) { - if (ImGui::IsMouseClicked(ImGuiMouseButton_Left) && ImGui::IsWindowHovered()) sampleMapFocused=false; + if (ImGui::IsMouseClicked(ImGuiMouseButton_Left) && ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows)) sampleMapFocused=false; if (curWindowLast!=GUI_WINDOW_INS_EDIT) sampleMapFocused=false; if (!sampleMapFocused) sampleMapDigit=0; if (ImGui::BeginTable("NoteMap",4,ImGuiTableFlags_ScrollY|ImGuiTableFlags_Borders|ImGuiTableFlags_SizingStretchSame)) { @@ -4487,10 +4489,13 @@ void FurnaceGUI::drawInsEdit() { sampleMapMin^=sampleMapMax; } + ImGui::PushStyleColor(ImGuiCol_Header,ImGui::GetColorU32(ImGuiCol_HeaderHovered)); + ImGui::PushStyleColor(ImGuiCol_HeaderActive,ImGui::GetColorU32(ImGuiCol_HeaderHovered)); for (int i=0; i<120; i++) { DivInstrumentAmiga::SampleMap& sampleMap=ins->amiga.noteMap[i]; ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg,ImGui::GetColorU32(ImGuiCol_TableHeaderBg)); ImGui::Text("%s",noteNames[60+i]); ImGui::TableNextColumn(); if (sampleMap.map<0 || sampleMap.map>=e->song.sampleLen) { @@ -4501,13 +4506,21 @@ void FurnaceGUI::drawInsEdit() { } ImGui::PushFont(patFont); ImGui::SetNextItemWidth(ImGui::CalcTextSize("00000").x); - ImGui::Selectable(sName.c_str(),(sampleMapFocused && sampleMapColumn==0 && i>=sampleMapMin && i<=sampleMapMax)); + ImGui::Selectable(sName.c_str(),(sampleMapWaitingInput && sampleMapColumn==0 && i>=sampleMapMin && i<=sampleMapMax)); if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) { sampleMapFocused=true; sampleMapColumn=0; sampleMapDigit=0; sampleMapSelStart=i; sampleMapSelEnd=i; + + sampleMapMin=sampleMapSelStart; + sampleMapMax=sampleMapSelEnd; + if (sampleMapMin>sampleMapMax) { + sampleMapMin^=sampleMapMax; + sampleMapMax^=sampleMapMin; + sampleMapMin^=sampleMapMax; + } ImGui::InhibitInertialScroll(); } if (sampleMapFocused && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) && ImGui::IsMouseDown(ImGuiMouseButton_Left)) { @@ -4523,13 +4536,21 @@ void FurnaceGUI::drawInsEdit() { sName+=fmt::sprintf("##SN%d",i); ImGui::PushFont(patFont); ImGui::SetNextItemWidth(ImGui::CalcTextSize("00000").x); - ImGui::Selectable(sName.c_str(),(sampleMapFocused && sampleMapColumn==1 && i>=sampleMapMin && i<=sampleMapMax)); + ImGui::Selectable(sName.c_str(),(sampleMapWaitingInput && sampleMapColumn==1 && i>=sampleMapMin && i<=sampleMapMax)); if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) { sampleMapFocused=true; sampleMapColumn=1; sampleMapDigit=0; sampleMapSelStart=i; sampleMapSelEnd=i; + + sampleMapMin=sampleMapSelStart; + sampleMapMax=sampleMapSelEnd; + if (sampleMapMin>sampleMapMax) { + sampleMapMin^=sampleMapMax; + sampleMapMax^=sampleMapMin; + sampleMapMin^=sampleMapMax; + } ImGui::InhibitInertialScroll(); } if (sampleMapFocused && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) && ImGui::IsMouseDown(ImGuiMouseButton_Left)) { @@ -4542,11 +4563,16 @@ void FurnaceGUI::drawInsEdit() { ImGui::TextUnformatted(e->song.sample[sampleMap.map]->name.c_str()); } } + ImGui::PopStyleColor(2); ImGui::EndTable(); } + } else { + sampleMapFocused=false; } ImGui::EndDisabled(); ImGui::EndTabItem(); + } else { + sampleMapFocused=false; } } if (ins->type==DIV_INS_N163) if (ImGui::BeginTabItem(settings.c163Name.c_str())) { From b9b121efdfd3fec823f76f05b83af65a18ffe550 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 12 Apr 2023 01:38:44 -0500 Subject: [PATCH 7/7] GUI: new sample map UI, part 4 right click menu --- src/gui/gui.cpp | 1 + src/gui/insEdit.cpp | 81 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 77 insertions(+), 5 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index aa23ef07c..8fdbaf755 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -6514,6 +6514,7 @@ FurnaceGUI::FurnaceGUI(): sampleMapDigit(0), sampleMapColumn(0), sampleMapFocused(false), + sampleMapWaitingInput(false), macroDragStart(0,0), macroDragAreaSize(0,0), macroDragCTarget(NULL), diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 2b73c7ae1..6ab5b23cb 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -4394,6 +4394,7 @@ void FurnaceGUI::drawInsEdit() { ins->type==DIV_INS_GA20) { if (ImGui::BeginTabItem((ins->type==DIV_INS_SU)?"Sound Unit":"Sample")) { String sName; + bool wannaOpenSMPopup=false; if (ins->amiga.initSample<0 || ins->amiga.initSample>=e->song.sampleLen) { sName="none selected"; } else { @@ -4476,11 +4477,7 @@ void FurnaceGUI::drawInsEdit() { ImGui::TableNextColumn(); ImGui::Text("note"); ImGui::TableNextColumn(); - if (sampleMapFocused) { - ImGui::Text("FOCUSED"); - } else { - ImGui::Text("sample name"); - } + ImGui::Text("sample name"); int sampleMapMin=sampleMapSelStart; int sampleMapMax=sampleMapSelEnd; if (sampleMapMin>sampleMapMax) { @@ -4526,6 +4523,26 @@ void FurnaceGUI::drawInsEdit() { if (sampleMapFocused && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) && ImGui::IsMouseDown(ImGuiMouseButton_Left)) { sampleMapSelEnd=i; } + if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) { + if (sampleMapSelStart==sampleMapSelEnd) { + sampleMapFocused=true; + sampleMapColumn=0; + sampleMapDigit=0; + sampleMapSelStart=i; + sampleMapSelEnd=i; + + sampleMapMin=sampleMapSelStart; + sampleMapMax=sampleMapSelEnd; + if (sampleMapMin>sampleMapMax) { + sampleMapMin^=sampleMapMax; + sampleMapMax^=sampleMapMin; + sampleMapMin^=sampleMapMax; + } + } + if (sampleMapFocused) { + wannaOpenSMPopup=true; + } + } ImGui::PopFont(); ImGui::TableNextColumn(); @@ -4556,6 +4573,26 @@ void FurnaceGUI::drawInsEdit() { if (sampleMapFocused && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) && ImGui::IsMouseDown(ImGuiMouseButton_Left)) { sampleMapSelEnd=i; } + if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) { + if (sampleMapSelStart==sampleMapSelEnd) { + sampleMapFocused=true; + sampleMapColumn=1; + sampleMapDigit=0; + sampleMapSelStart=i; + sampleMapSelEnd=i; + + sampleMapMin=sampleMapSelStart; + sampleMapMax=sampleMapSelEnd; + if (sampleMapMin>sampleMapMax) { + sampleMapMin^=sampleMapMax; + sampleMapMax^=sampleMapMin; + sampleMapMin^=sampleMapMax; + } + } + if (sampleMapFocused) { + wannaOpenSMPopup=true; + } + } ImGui::PopFont(); ImGui::TableNextColumn(); @@ -4570,6 +4607,40 @@ void FurnaceGUI::drawInsEdit() { sampleMapFocused=false; } ImGui::EndDisabled(); + if (wannaOpenSMPopup) { + ImGui::OpenPopup("SampleMapUtils"); + } + if (ImGui::BeginPopup("SampleMapUtils",ImGuiWindowFlags_NoMove|ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings)) { + if (sampleMapSelStart==sampleMapSelEnd && sampleMapSelStart>=0 && sampleMapSelStart<120) { + if (ImGui::MenuItem("set entire map to this note")) { + if (sampleMapSelStart>=0 && sampleMapSelStart<120) { + for (int i=0; i<120; i++) { + if (i==sampleMapSelStart) continue; + ins->amiga.noteMap[i].freq=ins->amiga.noteMap[sampleMapSelStart].freq; + } + } + } + if (ImGui::MenuItem("set entire map to this sample")) { + if (sampleMapSelStart>=0 && sampleMapSelStart<120) { + for (int i=0; i<120; i++) { + if (i==sampleMapSelStart) continue; + ins->amiga.noteMap[i].map=ins->amiga.noteMap[sampleMapSelStart].map; + } + } + } + } + if (ImGui::MenuItem("reset notes")) { + for (int i=0; i<120; i++) { + ins->amiga.noteMap[i].freq=i; + } + } + if (ImGui::MenuItem("clear map samples")) { + for (int i=0; i<120; i++) { + ins->amiga.noteMap[i].map=-1; + } + } + ImGui::EndPopup(); + } ImGui::EndTabItem(); } else { sampleMapFocused=false;