From b86abf240f049a9f288c37fbfb8d6ee241542d26 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 5 Jan 2026 17:05:53 -0500 Subject: [PATCH] GUI: new pattern renderer, part 22 hover? --- src/gui/gui.cpp | 7 ++--- src/gui/newPattern.cpp | 65 +++++++++++++++++++++++++----------------- 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index d8c837799..d40ccd3b7 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -7661,6 +7661,9 @@ bool FurnaceGUI::loop() { bool FurnaceGUI::init() { logI("initializing GUI."); + // new pattern renderer "field" trial. + newPatternRenderer=(rand()&1); + newFilePicker=new FurnaceFilePicker; newFilePicker->setConfigPrefix("fp_"); @@ -9436,8 +9439,4 @@ FurnaceGUI::FurnaceGUI(): strncpy(macroRelLabel,"REL",32); strncpy(emptyLabel,"...",32); strncpy(emptyLabel2,"..",32); - - // new pattern renderer "field" trial. - //newPatternRenderer=(rand()&1); - newPatternRenderer=true; } diff --git a/src/gui/newPattern.cpp b/src/gui/newPattern.cpp index fd0dbdbf9..08cbe6172 100644 --- a/src/gui/newPattern.cpp +++ b/src/gui/newPattern.cpp @@ -1079,11 +1079,11 @@ void FurnaceGUI::drawPatternNew() { String debugText=fmt::sprintf( "NPR DEBUG (xC:xF, o/y)\n" - "pointer: %d:%d, %d/%d\n" + "pointer: %d:%d, %d/%d %s\n" "cursor: %d:%d, %d/%d\n" "selStart: %d:%d, %d/%d\n" "selEnd: %d:%d, %d/%d\n", - pointer.xCoarse,pointer.xFine,pointer.order,pointer.y, + pointer.xCoarse,pointer.xFine,pointer.order,pointer.y,hovered?"(hovered)":"", cursor.xCoarse,cursor.xFine,cursor.order,cursor.y, selStart.xCoarse,selStart.xFine,selStart.order,selStart.y, selEnd.xCoarse,selEnd.xFine,selEnd.order,selEnd.y @@ -1195,32 +1195,45 @@ void FurnaceGUI::drawPatternNew() { } } - // cursor background - if (cursor.xCoarse>=0 && cursor.xCoarsecurSubSong->chanShow[cursor.xCoarse]) { - int ord=firstOrd; - int row=firstRow; - pos=top; - SETUP_ORDER_ALPHA; - for (int j=0; jAddRectFilled( - ImVec2(top.x+patChanX[cursor.xCoarse]+patFineOffsets[calcMaxFine(cursor.xCoarse,cursor.xFine)],pos.y), - ImVec2(top.x+patChanX[cursor.xCoarse]+patFineOffsets[calcMaxFine(cursor.xCoarse,1+cursor.xFine)],pos.y+lineHeight), - (hovered && pointer.xCoarse==cursor.xCoarse && pointer.xFine==cursor.xFine && pointer.y==cursor.y && pointer.order==cursor.order)? - ImGui::ColorConvertFloat4ToU32(uiColors[GUI_COLOR_PATTERN_CURSOR_HOVER]): - ImGui::ColorConvertFloat4ToU32(uiColors[GUI_COLOR_PATTERN_CURSOR]) - ); - break; + // cursor/hover background + { + int ord=firstOrd; + int row=firstRow; + pos=top; + SETUP_ORDER_ALPHA; + for (int j=0; j=0 && cursor.xCoarsecurSubSong->chanShow[cursor.xCoarse]) { + hoverOverCursor=(hovered && pointer.xCoarse==cursor.xCoarse && pointer.xFine==cursor.xFine && pointer.y==cursor.y && pointer.order==cursor.order); + dl->AddRectFilled( + ImVec2(top.x+patChanX[cursor.xCoarse]+patFineOffsets[calcMaxFine(cursor.xCoarse,cursor.xFine)],pos.y), + ImVec2(top.x+patChanX[cursor.xCoarse]+patFineOffsets[calcMaxFine(cursor.xCoarse,1+cursor.xFine)],pos.y+lineHeight), + hoverOverCursor? + ImGui::ColorConvertFloat4ToU32(uiColors[GUI_COLOR_PATTERN_CURSOR_HOVER]): + ImGui::ColorConvertFloat4ToU32(uiColors[GUI_COLOR_PATTERN_CURSOR]) + ); + } } - - if (++row>=e->curSubSong->patLen) { - row=0; - ord++; - SETUP_ORDER_ALPHA; - } - pos.y+=lineHeight; } + + if (!hoverOverCursor && hovered && pointer.order==ord && pointer.y==row) { + if (e->curSubSong->chanShow[pointer.xCoarse]) { + dl->AddRectFilled( + ImVec2(top.x+patChanX[pointer.xCoarse]+patFineOffsets[calcMaxFine(pointer.xCoarse,pointer.xFine)],pos.y), + ImVec2(top.x+patChanX[pointer.xCoarse]+patFineOffsets[calcMaxFine(pointer.xCoarse,1+pointer.xFine)],pos.y+lineHeight), + ImGui::ColorConvertFloat4ToU32(uiColors[GUI_COLOR_PATTERN_SELECTION_HOVER]) + ); + } + } + + if (++row>=e->curSubSong->patLen) { + row=0; + ord++; + SETUP_ORDER_ALPHA; + } + pos.y+=lineHeight; } }