From 9ae092ed7016cba0d40a30dd0975192b3dfcffc8 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 2 Jan 2026 20:14:49 -0500 Subject: [PATCH] GUI: new pattern renderer, part 13 paste channel header code guaranteed not to work --- src/gui/newPattern.cpp | 704 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 700 insertions(+), 4 deletions(-) diff --git a/src/gui/newPattern.cpp b/src/gui/newPattern.cpp index 8ae3d649a..7a67980f2 100644 --- a/src/gui/newPattern.cpp +++ b/src/gui/newPattern.cpp @@ -54,6 +54,8 @@ void FurnaceGUI::drawPatternNew() { } if (!patternOpen) return; + bool inhibitMenu=false; + if (e->isPlaying() && followPattern) { if (oldRowChanged || !e->isStepping()) { if (e->isStepping()) pendingStepUpdate=1; @@ -93,7 +95,7 @@ void FurnaceGUI::drawPatternNew() { sel2.xFine^=sel1.xFine; } - //ImVec2 origWinPadding=ImGui::GetStyle().WindowPadding; + ImVec2 origWinPadding=ImGui::GetStyle().WindowPadding; ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding,ImVec2(0.0f,0.0f)); if (mobileUI) { patWindowPos=(portrait?ImVec2(0.0f,(mobileMenuPos*-0.65*canvasH)+(0.12*canvasW)):ImVec2((0.16*canvasH)+0.5*canvasW*mobileMenuPos,0.0f)); @@ -172,10 +174,9 @@ void FurnaceGUI::drawPatternNew() { } patFineOffsets[DIV_PAT_FX(DIV_MAX_EFFECTS)]=cellSizeAccum; - ImGui::Dummy(ImVec2(1.0f,ImGui::GetFrameHeight())); - ImVec2 top=ImGui::GetCursorScreenPos(); ImVec2 topRows=top+ImVec2(ImGui::GetScrollX(),0); + ImVec2 topHeaders=top+ImVec2(0,ImGui::GetScrollY()); ImVec2 pos=top; ImVec2 size=ImVec2(0.0f,lineHeight*totalRows); @@ -241,7 +242,17 @@ void FurnaceGUI::drawPatternNew() { ); ImRect rectRows=ImRect(minAreaRows,maxAreaRows); + ImVec2 sizeHeaders=ImVec2(size.x+sizeRows.x,ImGui::GetFrameHeight()); + ImVec2 minAreaHeaders=topHeaders; + ImVec2 maxAreaHeaders=ImVec2( + minAreaHeaders.x+sizeHeaders.x, + minAreaHeaders.y+sizeHeaders.y + ); + ImRect rectHeaders=ImRect(minAreaHeaders,maxAreaHeaders); + top.x+=sizeRows.x; + top.y+=sizeHeaders.y; + topRows.y+=sizeHeaders.y; ImVec2 minArea=top; ImVec2 maxArea=ImVec2( @@ -258,7 +269,7 @@ void FurnaceGUI::drawPatternNew() { float disabledAlpha=ImGui::GetStyle().Alpha*ImGui::GetStyle().DisabledAlpha; // create the view - dl->PushClipRect(topRows+ImVec2(sizeRows.x,0),winRect.Max,true); + dl->PushClipRect(ImVec2(topRows.x+sizeRows.x,topHeaders.y+sizeHeaders.y),winRect.Max,true); ImGui::SetCursorScreenPos(top); ImGui::ItemSize(size,ImGui::GetStyle().FramePadding.y); if (ImGui::ItemAdd(rect,ImGui::GetID("PatternView1"),NULL,ImGuiItemFlags_AllowOverlap)) { @@ -634,6 +645,7 @@ void FurnaceGUI::drawPatternNew() { // pattern rows (frozen in place) ImGui::SetCursorScreenPos(topRows); + dl->PushClipRect(ImVec2(topRows.x+sizeRows.x,topHeaders.y+sizeHeaders.y),winRect.Max,true); ImGui::ItemSize(sizeRows,ImGui::GetStyle().FramePadding.y); if (ImGui::ItemAdd(rectRows,ImGui::GetID("PatternRows"),NULL,ImGuiItemFlags_AllowOverlap)) { // pattern rows @@ -663,12 +675,696 @@ void FurnaceGUI::drawPatternNew() { PAT_BORDER_SIZE ); } + dl->PopClipRect(); // channel headers (frozen in place) + ImGui::SetCursorScreenPos(topHeaders); + ImGui::ItemSize(sizeHeaders,ImGui::GetStyle().FramePadding.y); + if (ImGui::ItemAdd(rectHeaders,ImGui::GetID("PatternHeaders"),NULL,ImGuiItemFlags_AllowOverlap)) { + //// THE PREVIOUS MESS. + char chanID[2048]; + // draw channel headers + for (int i=0; i