GUI: prepare for wavetable and sample list/edit

This commit is contained in:
tildearrow 2021-12-16 03:09:18 -05:00
parent 07ab05798b
commit ce32f921bd
2 changed files with 89 additions and 3 deletions

View File

@ -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; i<wave->len; 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),

View File

@ -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);