diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index b11b1e2fc..300a8e2a1 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -581,6 +581,69 @@ void FurnaceGUI::drawInsEdit() { ImGui::End(); } +void FurnaceGUI::drawWaveList() { + if (!waveListOpen) return; + float wavePreview[256]; + if (ImGui::Begin("Wavetables",&waveListOpen)) { + 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<<2]=wave->data[i]; + wavePreview[1+(i<<2)]=wave->data[i]; + wavePreview[2+(i<<2)]=wave->data[i]; + wavePreview[3+(i<<2)]=wave->data[i]; + } + if (ImGui::Selectable(fmt::sprintf("%.2x##_WAVE%d\n",i,i).c_str(),curWave==i)) { + curWave=i; + } + if (ImGui::IsItemHovered()) { + if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) { + waveEditOpen=true; + } + } + ImGui::SameLine(); + ImGui::PlotLines(fmt::sprintf("##_WAVEP%d",i).c_str(),wavePreview,wave->len*4,0,NULL,0,32); + } + } + if (ImGui::IsWindowFocused()) curWindow=GUI_WINDOW_WAVE_LIST; + ImGui::End(); +} + +void FurnaceGUI::drawWaveEdit() { + if (!waveEditOpen) return; + if (ImGui::Begin("Wavetable Editor",&waveEditOpen)) { + } + if (ImGui::IsWindowFocused()) curWindow=GUI_WINDOW_WAVE_EDIT; + ImGui::End(); +} + +void FurnaceGUI::drawSampleList() { + if (!sampleListOpen) return; + if (ImGui::Begin("Samples",&sampleListOpen)) { + for (int i=0; i<(int)e->song.sample.size(); i++) { + DivSample* sample=e->song.sample[i]; + if (ImGui::Selectable(fmt::sprintf("%d: %s##_SAM%d\n",i,sample->name,i).c_str(),curSample==i)) { + curSample=i; + } + if (ImGui::IsItemHovered()) { + if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) { + sampleEditOpen=true; + } + } + } + } + if (ImGui::IsWindowFocused()) curWindow=GUI_WINDOW_SAMPLE_LIST; + ImGui::End(); +} + +void FurnaceGUI::drawSampleEdit() { + if (!sampleEditOpen) return; + if (ImGui::Begin("Sample Editor",&sampleEditOpen)) { + } + if (ImGui::IsWindowFocused()) curWindow=GUI_WINDOW_SAMPLE_EDIT; + ImGui::End(); +} + void FurnaceGUI::drawPattern() { if (!patternOpen) return; SelectionPoint sel1=selStart; @@ -1211,6 +1274,10 @@ bool FurnaceGUI::loop() { if (ImGui::MenuItem("song information")) songInfoOpen=!songInfoOpen; if (ImGui::MenuItem("instruments")) insListOpen=!insListOpen; if (ImGui::MenuItem("instrument editor")) insEditOpen=!insEditOpen; + if (ImGui::MenuItem("wavetables")) waveListOpen=!waveListOpen; + if (ImGui::MenuItem("wavetable editor")) waveEditOpen=!waveEditOpen; + if (ImGui::MenuItem("samples")) sampleListOpen=!sampleListOpen; + if (ImGui::MenuItem("sample editor")) sampleEditOpen=!sampleEditOpen; if (ImGui::MenuItem("orders")) ordersOpen=!ordersOpen; if (ImGui::MenuItem("pattern")) patternOpen=!patternOpen; ImGui::EndMenu(); @@ -1228,6 +1295,10 @@ bool FurnaceGUI::loop() { drawOrders(); drawInsList(); drawInsEdit(); + drawWaveList(); + drawWaveEdit(); + drawSampleList(); + drawSampleEdit(); drawPattern(); if (ImGuiFileDialog::Instance()->Display("FileDialog")) { @@ -1337,6 +1408,8 @@ FurnaceGUI::FurnaceGUI(): scrH(800), dpiScale(1), curIns(0), + curWave(0), + curSample(0), curOctave(3), oldRow(0), editStep(1), @@ -1346,6 +1419,10 @@ FurnaceGUI::FurnaceGUI(): songInfoOpen(true), patternOpen(true), insEditOpen(false), + waveListOpen(true), + waveEditOpen(false), + sampleListOpen(true), + sampleEditOpen(false), selecting(false), curNibble(false), curWindow(GUI_WINDOW_NOTHING), diff --git a/src/gui/gui.h b/src/gui/gui.h index 5320ad71d..237fc3483 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -40,7 +40,11 @@ enum FurnaceGUIWindows { GUI_WINDOW_ORDERS, GUI_WINDOW_INS_LIST, GUI_WINDOW_PATTERN, - GUI_WINDOW_INS_EDIT + GUI_WINDOW_INS_EDIT, + GUI_WINDOW_WAVE_LIST, + GUI_WINDOW_WAVE_EDIT, + GUI_WINDOW_SAMPLE_LIST, + GUI_WINDOW_SAMPLE_EDIT }; struct SelectionPoint { @@ -69,8 +73,9 @@ class FurnaceGUI { ImVec4 uiColors[GUI_COLOR_MAX]; ImVec4 volColors[128]; - int curIns, curOctave, oldRow, editStep; + int curIns, curWave, curSample, curOctave, oldRow, editStep; bool editControlsOpen, ordersOpen, insListOpen, songInfoOpen, patternOpen, insEditOpen; + bool waveListOpen, waveEditOpen, sampleListOpen, sampleEditOpen; SelectionPoint selStart, selEnd; bool selecting, curNibble; FurnaceGUIWindows curWindow; @@ -100,9 +105,13 @@ class FurnaceGUI { void drawEditControls(); void drawSongInfo(); void drawOrders(); - void drawInsList(); void drawPattern(); + void drawInsList(); void drawInsEdit(); + void drawWaveList(); + void drawWaveEdit(); + void drawSampleList(); + void drawSampleEdit(); void startSelection(int xCoarse, int xFine, int y); void updateSelection(int xCoarse, int xFine, int y);