diff --git a/doc/2-interface/settings.md b/doc/2-interface/settings.md index 066d34e49..12e0fd579 100644 --- a/doc/2-interface/settings.md +++ b/doc/2-interface/settings.md @@ -488,7 +488,7 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Unified instrument/wavetable/sample list**: combines all three types of assets into one list. - the buttons act as appropriate to the currently selected asset or header. -- **Horizontal instrument list**: when there are more instruments than there is room to display them... +- **Horizontal instrument/wavetable list**: when there are more instruments/wavetables than there is room to display them... - if on, scroll horizontally through multiple columns. - if off, scroll vertically in one long column. - only appears if "Unified instrument/wavetable/sample list" is off. diff --git a/src/gui/dataList.cpp b/src/gui/dataList.cpp index b4a475e77..b0abc8393 100644 --- a/src/gui/dataList.cpp +++ b/src/gui/dataList.cpp @@ -997,6 +997,37 @@ void FurnaceGUI::drawSampleList(bool asChild) { } } +// HACK: template. any way to remove it? +template void FurnaceGUI::waveListHorizontalGroup(float* wavePreview, int dir, int count, const func_waveItemData& waveItemData) { + if (count==0) return; + + float idealWidthMin=225.0f*dpiScale; + float idealWidthMax=350.0f*dpiScale; + float availX=ImGui::GetContentRegionAvail().x; + int columnCount=CLAMP((int)(availX/idealWidthMin),1,count); + int rowCount=(int)ceilf(count/(float)columnCount); + columnCount=(int)ceilf(count/(float)rowCount); + float columnWidth=MIN(CLAMP(availX/columnCount,idealWidthMin,idealWidthMax),availX); + if (ImGui::BeginTable("##waveListGroupTable",columnCount,ImGuiTableFlags_SizingFixedSame)) { + for (int col=0; col=count) continue; + + int waveIdx, asset; + waveItemData(row+col*rowCount,&waveIdx,&asset); + waveListItem(waveIdx,wavePreview,dir,asset); + } + } + ImGui::EndTable(); + } +} + void FurnaceGUI::actualWaveList() { float wavePreview[257]; @@ -1021,10 +1052,17 @@ void FurnaceGUI::actualWaveList() { ImGui::EndPopup(); } if (treeNode) { - int assetIndex=0; - for (int j: i.entries) { - waveListItem(j,wavePreview,dirIndex,assetIndex); - assetIndex++; + if (settings.horizontalDataView) { + waveListHorizontalGroup(wavePreview,dirIndex,i.entries.size(),[&](int i_, int* waveIdx, int* asset) { + *waveIdx=i.entries[i_]; + *asset=i_; + }); + } else { + int assetIndex=0; + for (int j: i.entries) { + waveListItem(j,wavePreview,dirIndex,assetIndex); + assetIndex++; + } } ImGui::TreePop(); } @@ -1037,10 +1075,19 @@ void FurnaceGUI::actualWaveList() { }); } } else { - for (int i=0; i<(int)e->song.wave.size(); i++) { + if (settings.horizontalDataView) { ImGui::TableNextRow(); ImGui::TableNextColumn(); - waveListItem(i,wavePreview,-1,-1); + waveListHorizontalGroup(wavePreview,-1,(int)e->song.wave.size(),[&](int i, int* waveIdx, int* asset) { + *waveIdx=i; + *asset=-1; + }); + } else { + for (int i=0; i<(int)e->song.wave.size(); i++) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + waveListItem(i,wavePreview,-1,-1); + } } } } diff --git a/src/gui/gui.h b/src/gui/gui.h index 3e17e8196..21fa0d342 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2832,6 +2832,8 @@ class FurnaceGUI { void actualWaveList(); void actualSampleList(); + // HACK: template. any way to remove it? + template void waveListHorizontalGroup(float* wavePreview, int dir, int count, const func_waveItemData& waveItemData); void insListItem(int index, int dir, int asset); void waveListItem(int index, float* wavePreview, int dir, int asset); void sampleListItem(int index, int dir, int asset); diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index aa5ed6a72..5dda867fc 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -3588,7 +3588,7 @@ void FurnaceGUI::drawSettings() { ImGui::BeginDisabled(settings.unifiedDataView); bool horizontalDataViewB=settings.horizontalDataView; - if (ImGui::Checkbox(_("Horizontal instrument list"),&horizontalDataViewB)) { + if (ImGui::Checkbox(_("Horizontal instrument/wavetable list"),&horizontalDataViewB)) { settings.horizontalDataView=horizontalDataViewB; settingsChanged=true; }