diff --git a/src/gui/dataList.cpp b/src/gui/dataList.cpp index 79a3a821c..cac8314c2 100644 --- a/src/gui/dataList.cpp +++ b/src/gui/dataList.cpp @@ -354,6 +354,71 @@ void FurnaceGUI::insListItem(int i, int dir, int asset) { ImGui::PopStyleColor(); } +void FurnaceGUI::waveListItem(int i, float* wavePreview, int dir, int asset) { + DivWavetable* wave=e->song.wave[i]; + for (int i=0; ilen; i++) { + wavePreview[i]=wave->data[i]; + } + if (wave->len>0) wavePreview[wave->len]=wave->data[wave->len-1]; + if (ImGui::Selectable(fmt::sprintf("%d##_WAVE%d\n",i,i).c_str(),curWave==i)) { + curWave=i; + } + if (wantScrollList && curWave==i) ImGui::SetScrollHereY(); + if (ImGui::IsItemHovered()) { + if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) { + waveEditOpen=true; + nextWindow=GUI_WINDOW_WAVE_EDIT; + } + } + ImGui::SameLine(); + PlotNoLerp(fmt::sprintf("##_WAVEP%d",i).c_str(),wavePreview,wave->len+1,0,NULL,0,wave->max); +} + +void FurnaceGUI::sampleListItem(int i, int dir, int asset) { + bool memWarning=false; + + DivSample* sample=e->song.sample[i]; + for (int j=0; jsong.systemLen; j++) { + DivDispatch* dispatch=e->getDispatch(j); + if (dispatch==NULL) continue; + + for (int k=0; kgetSampleMemCapacity(k)==0) continue; + if (!dispatch->isSampleLoaded(k,i) && sample->renderOn[k][j]) { + memWarning=true; + break; + } + } + if (memWarning) break; + } + if (memWarning) ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_SAMPLE_CHIP_WARNING]); + if (ImGui::Selectable(fmt::sprintf("%d: %s##_SAM%d",i,sample->name,i).c_str(),curSample==i)) { + curSample=i; + samplePos=0; + updateSampleTex=true; + } + if (ImGui::IsItemHovered() && !mobileUI) { + ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_TEXT]); + ImGui::SetTooltip("Bank %d: %s",i/12,sampleNote[i%12]); + if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) { + sampleEditOpen=true; + nextWindow=GUI_WINDOW_SAMPLE_EDIT; + } + ImGui::PopStyleColor(); + } + if (memWarning) { + ImGui::SameLine(); + ImGui::Text(ICON_FA_EXCLAMATION_TRIANGLE); + if (ImGui::IsItemHovered() && !mobileUI) { + ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_TEXT]); + ImGui::SetTooltip("out of memory for this sample!"); + ImGui::PopStyleColor(); + } + ImGui::PopStyleColor(); + } + if (wantScrollList && curSample==i) ImGui::SetScrollHereY(); +} + void FurnaceGUI::drawInsList(bool asChild) { if (nextWindow==GUI_WINDOW_INS_LIST) { insListOpen=true; @@ -600,7 +665,7 @@ void FurnaceGUI::drawInsList(bool asChild) { DRAG_TARGET(dirIndex,-1,e->song.insDir); if (ImGui::BeginPopupContextItem(popupID.c_str())) { if (ImGui::MenuItem("rename...")) { - ImGui::OpenPopup("NewInsFolder"); + editStr(&i.name); } if (ImGui::MenuItem("delete")) { dirToDelete=dirIndex; @@ -910,73 +975,16 @@ void FurnaceGUI::drawSampleList(bool asChild) { void FurnaceGUI::actualWaveList() { float wavePreview[257]; for (int i=0; i<(int)e->song.wave.size(); i++) { - DivWavetable* wave=e->song.wave[i]; - for (int i=0; ilen; i++) { - wavePreview[i]=wave->data[i]; - } - if (wave->len>0) wavePreview[wave->len]=wave->data[wave->len-1]; ImGui::TableNextRow(); ImGui::TableNextColumn(); - if (ImGui::Selectable(fmt::sprintf("%d##_WAVE%d\n",i,i).c_str(),curWave==i)) { - curWave=i; - } - if (wantScrollList && curWave==i) ImGui::SetScrollHereY(); - if (ImGui::IsItemHovered()) { - if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) { - waveEditOpen=true; - nextWindow=GUI_WINDOW_WAVE_EDIT; - } - } - ImGui::SameLine(); - PlotNoLerp(fmt::sprintf("##_WAVEP%d",i).c_str(),wavePreview,wave->len+1,0,NULL,0,wave->max); + waveListItem(i,wavePreview,-1,-1); } } void FurnaceGUI::actualSampleList() { for (int i=0; i<(int)e->song.sample.size(); i++) { - bool memWarning=false; - - DivSample* sample=e->song.sample[i]; ImGui::TableNextRow(); ImGui::TableNextColumn(); - for (int j=0; jsong.systemLen; j++) { - DivDispatch* dispatch=e->getDispatch(j); - if (dispatch==NULL) continue; - - for (int k=0; kgetSampleMemCapacity(k)==0) continue; - if (!dispatch->isSampleLoaded(k,i) && sample->renderOn[k][j]) { - memWarning=true; - break; - } - } - if (memWarning) break; - } - if (memWarning) ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_SAMPLE_CHIP_WARNING]); - if (ImGui::Selectable(fmt::sprintf("%d: %s##_SAM%d",i,sample->name,i).c_str(),curSample==i)) { - curSample=i; - samplePos=0; - updateSampleTex=true; - } - if (ImGui::IsItemHovered() && !mobileUI) { - ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_TEXT]); - ImGui::SetTooltip("Bank %d: %s",i/12,sampleNote[i%12]); - if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) { - sampleEditOpen=true; - nextWindow=GUI_WINDOW_SAMPLE_EDIT; - } - ImGui::PopStyleColor(); - } - if (memWarning) { - ImGui::SameLine(); - ImGui::Text(ICON_FA_EXCLAMATION_TRIANGLE); - if (ImGui::IsItemHovered() && !mobileUI) { - ImGui::PushStyleColor(ImGuiCol_Text,uiColors[GUI_COLOR_TEXT]); - ImGui::SetTooltip("out of memory for this sample!"); - ImGui::PopStyleColor(); - } - ImGui::PopStyleColor(); - } - if (wantScrollList && curSample==i) ImGui::SetScrollHereY(); + sampleListItem(i,-1,-1); } } diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 7b0a26e67..75cc02584 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -2272,6 +2272,11 @@ void FurnaceGUI::exportAudio(String path, DivAudioExportModes mode) { displayExporting=true; } +void FurnaceGUI::editStr(String* which) { + editString=which; + displayEditString=true; +} + void FurnaceGUI::showWarning(String what, FurnaceGUIWarnings type) { warnString=what; warnAction=type; @@ -5053,6 +5058,10 @@ bool FurnaceGUI::loop() { ImGui::OpenPopup("New Song"); } + if (displayEditString) { + ImGui::OpenPopup("EditString"); + } + if (nextWindow==GUI_WINDOW_ABOUT) { aboutOpen=true; nextWindow=GUI_WINDOW_NOTHING; @@ -5592,6 +5601,27 @@ bool FurnaceGUI::loop() { ImGui::EndPopup(); } + if (ImGui::BeginPopup("EditString",ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings)) { + if (editString==NULL) { + ImGui::Text("Error! No string provided!"); + } else { + if (displayEditString) { + ImGui::SetItemDefaultFocus(); + ImGui::SetKeyboardFocusHere(); + } + ImGui::InputText("##StringVal",editString); + } + displayEditString=false; + ImGui::SameLine(); + if (ImGui::Button("OK") || ImGui::IsKeyPressed(ImGuiKey_Enter,false)) { + editString=NULL; + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } else { + editString=NULL; + } + MEASURE_END(popup); if (!tutorial.introPlayed || settings.alwaysPlayIntro!=0) { @@ -6452,6 +6482,7 @@ FurnaceGUI::FurnaceGUI(): displayPendingRawSample(false), snesFilterHex(false), modTableHex(false), + displayEditString(false), mobileEdit(false), vgmExportVersion(0x171), vgmExportTrailingTicks(-1), @@ -6471,6 +6502,7 @@ FurnaceGUI::FurnaceGUI(): fmPreviewOn(false), fmPreviewPaused(false), fmPreviewOPN(NULL), + editString(NULL), pendingRawSampleDepth(8), pendingRawSampleChannels(1), pendingRawSampleUnsigned(false), @@ -6525,7 +6557,6 @@ FurnaceGUI::FurnaceGUI(): loopEnd(-1), isClipping(0), extraChannelButtons(0), - patNameTarget(-1), newSongCategory(0), latchTarget(0), wheelX(0), @@ -6596,7 +6627,6 @@ FurnaceGUI::FurnaceGUI(): collapseWindow(false), demandScrollX(false), fancyPattern(false), - wantPatName(false), firstFrame(true), tempoView(true), waveHex(false), diff --git a/src/gui/gui.h b/src/gui/gui.h index 7efc8c927..739e280db 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1223,7 +1223,7 @@ class FurnaceGUI { bool portrait, injectBackUp, mobileMenuOpen; bool wantCaptureKeyboard, oldWantCaptureKeyboard, displayMacroMenu; bool displayNew, fullScreen, preserveChanPos, wantScrollList, noteInputPoly; - bool displayPendingIns, pendingInsSingle, displayPendingRawSample, snesFilterHex, modTableHex; + bool displayPendingIns, pendingInsSingle, displayPendingRawSample, snesFilterHex, modTableHex, displayEditString; bool mobileEdit; bool willExport[DIV_MAX_CHIPS]; int vgmExportVersion; @@ -1241,6 +1241,7 @@ class FurnaceGUI { short fmPreview[FM_PREVIEW_SIZE]; bool updateFMPreview, fmPreviewOn, fmPreviewPaused; void* fmPreviewOPN; + String* editString; String pendingRawSample; int pendingRawSampleDepth, pendingRawSampleChannels; @@ -1602,7 +1603,7 @@ class FurnaceGUI { DivInstrument* prevInsData; int curIns, curWave, curSample, curOctave, curOrder, prevIns, oldRow, oldOrder, oldOrder1, editStep, exportLoops, soloChan,orderEditMode, orderCursor; - int loopOrder, loopRow, loopEnd, isClipping, extraChannelButtons, patNameTarget, newSongCategory, latchTarget; + int loopOrder, loopRow, loopEnd, isClipping, extraChannelButtons, newSongCategory, latchTarget; int wheelX, wheelY, dragSourceX, dragSourceXFine, dragSourceY, dragDestinationX, dragDestinationXFine, dragDestinationY, oldBeat, oldBar; int curGroove; float soloTimeout; @@ -1625,7 +1626,7 @@ class FurnaceGUI { SelectionPoint selStart, selEnd, cursor, cursorDrag, dragStart, dragEnd; bool selecting, selectingFull, dragging, curNibble, orderNibble, followOrders, followPattern, changeAllOrders, mobileUI; - bool collapseWindow, demandScrollX, fancyPattern, wantPatName, firstFrame, tempoView, waveHex, waveSigned, waveGenVisible, lockLayout, editOptsVisible, latchNibble, nonLatchNibble; + bool collapseWindow, demandScrollX, fancyPattern, firstFrame, tempoView, waveHex, waveSigned, waveGenVisible, lockLayout, editOptsVisible, latchNibble, nonLatchNibble; bool keepLoopAlive, keepGrooveAlive, orderScrollLocked, orderScrollTolerance, dragMobileMenu, dragMobileEditButton, wantGrooveListFocus; FurnaceGUIWindows curWindow, nextWindow, curWindowLast; std::atomic curWindowThreadSafe; @@ -2002,7 +2003,7 @@ class FurnaceGUI { void actualSampleList(); void insListItem(int index, int dir, int asset); - void waveListItem(int index, int dir, int asset); + void waveListItem(int index, float* wavePreview, int dir, int asset); void sampleListItem(int index, int dir, int asset); void toggleMobileUI(bool enable, bool force=false); @@ -2165,6 +2166,7 @@ class FurnaceGUI { const char* getSystemName(DivSystem which); public: + void editStr(String* which); void showWarning(String what, FurnaceGUIWarnings type); void showError(String what); String getLastError(); diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index 33de4d4d3..554984043 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -834,28 +834,9 @@ void FurnaceGUI::drawPattern() { if (extraChannelButtons==2) { DivPattern* pat=e->curPat[i].getPattern(e->curOrders->ord[i][ord],true); ImGui::PushFont(mainFont); - if (patNameTarget==i) { - snprintf(chanID,2048,"##PatNameI%d_%d",i,ord); - ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-(8.0f*dpiScale)); - ImGui::SetCursorPosX(ImGui::GetCursorPosX()+4.0f*dpiScale); - ImGui::InputText(chanID,&pat->name); - if (wantPatName) { - wantPatName=false; - ImGui::SetItemDefaultFocus(); - ImGui::SetKeyboardFocusHere(-1); - } else { - if (!ImGui::IsItemActive()) { - patNameTarget=-1; - } - } - } else { - snprintf(chanID,2048," %s##PatName%d",pat->name.c_str(),i); - if (ImGui::Selectable(chanID,true,ImGuiSelectableFlags_NoPadWithHalfSpacing,ImVec2(0.0f,lineHeight+1.0f*dpiScale))) { - patNameTarget=i; - wantPatName=true; - snprintf(chanID,2048,"##PatNameI%d_%d",i,ord); - ImGui::SetActiveID(ImGui::GetID(chanID),ImGui::GetCurrentWindow()); - } + snprintf(chanID,2048," %s##PatName%d",pat->name.c_str(),i); + if (ImGui::Selectable(chanID,true,ImGuiSelectableFlags_NoPadWithHalfSpacing,ImVec2(0.0f,lineHeight+1.0f*dpiScale))) { + editStr(&pat->name); } ImGui::PopFont(); } else if (extraChannelButtons==1) {