From 45da7939ebbbfdf88f30358f96bf914057ee227f Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Sun, 9 Nov 2025 12:55:35 +0300 Subject: [PATCH] Improved scrollbar in scroll areas --- src/GUIStuff/Elements/FontPicker.cpp | 2 +- src/GUIStuff/GUIManager.cpp | 32 ++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/GUIStuff/Elements/FontPicker.cpp b/src/GUIStuff/Elements/FontPicker.cpp index 90760ee..9fe6803 100644 --- a/src/GUIStuff/Elements/FontPicker.cpp +++ b/src/GUIStuff/Elements/FontPicker.cpp @@ -51,7 +51,7 @@ bool GUIStuff::FontPicker::update(UpdateInputData& io, std::string* fontName, GU std::string lowerFamilyName = *fontName; std::transform(lowerFamilyName.begin(), lowerFamilyName.end(), lowerFamilyName.begin(), ::tolower); auto itLower = std::lower_bound(sortedFontListLowercase.begin(), sortedFontListLowercase.end(), lowerFamilyName); - val = (itLower != sortedFontListLowercase.end() && *itLower == *fontName) ? (itLower - sortedFontListLowercase.begin()): std::numeric_limits::max(); + val = (itLower != sortedFontListLowercase.end() && *itLower == lowerFamilyName) ? (itLower - sortedFontListLowercase.begin()): std::numeric_limits::max(); if(val != std::numeric_limits::max()) *fontName = sortedFontList[val]; } diff --git a/src/GUIStuff/GUIManager.cpp b/src/GUIStuff/GUIManager.cpp index 6b6991a..ee599e8 100644 --- a/src/GUIStuff/GUIManager.cpp +++ b/src/GUIStuff/GUIManager.cpp @@ -668,6 +668,11 @@ void GUIManager::scroll_bar_area(const std::string& id, const std::function(io->theme->backColor1) + .backgroundColor = convert_vec4(io->theme->backColor2) }) { SkColor4f scrollerColor; if(sD.isMoving) scrollerColor = io->theme->fillColor1; else if(Clay_Hovered()) - scrollerColor = io->theme->fillColor2; + scrollerColor = io->theme->fillColor1; else - scrollerColor = io->theme->backColor2; + scrollerColor = io->theme->fillColor2; + bool isHoveringOverScroller = false; CLAY({ .layout = { .sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_FIXED(areaAboveScrollerSize)} @@ -737,14 +743,28 @@ void GUIManager::scroll_bar_area(const std::string& id, const std::function(scrollerColor), .cornerRadius = CLAY_CORNER_RADIUS(3), }) { + if(Clay_Hovered()) + isHoveringOverScroller = true; } CLAY({ .layout = {.sizing = {.width = CLAY_SIZING_GROW(0), .height = CLAY_SIZING_GROW(0)}}}) {} - if(Clay_Hovered() && io->mouse.leftClick) + if(Clay_Hovered() && io->mouse.leftClick) { sD.isMoving = true; + sD.clickedOnScroller = isHoveringOverScroller; + if(isHoveringOverScroller) { + sD.scrollerStartPos = scrollAreaBB.y + areaAboveScrollerSize + scrollerSize * 0.5f; + sD.mouseStartPos = io->mouse.pos.y(); + } + } if(!io->mouse.leftHeld) sD.isMoving = false; - if(sD.isMoving) - sD.currentScrollPos = ((io->mouse.pos.y() - scrollAreaBB.y) / scrollAreaBB.height) * (-scrollPosMax); + if(sD.isMoving) { + float newScrollPosFrac; + if(sD.clickedOnScroller) + newScrollPosFrac = std::clamp((sD.scrollerStartPos - (sD.mouseStartPos - io->mouse.pos.y()) - scrollAreaBB.y - scrollerSize * 0.5f) / (scrollAreaBB.height - scrollerSize), 0.0f, 1.0f); + else + newScrollPosFrac = std::clamp((io->mouse.pos.y() - scrollAreaBB.y - scrollerSize * 0.5f) / (scrollAreaBB.height - scrollerSize), 0.0f, 1.0f); + sD.currentScrollPos = newScrollPosFrac * (-scrollPosMax); + } sD.currentScrollPos = std::clamp(sD.currentScrollPos, -scrollPosMax, 0.0f); scrollData.scrollPosition->y = sD.currentScrollPos; }