[Scummvm-git-logs] scummvm master -> 57fc045bc312b1c0a65e9b2968e23f2c6cae27c3

sev- noreply at scummvm.org
Sun May 24 23:49:05 UTC 2026


This automated email contains information about 8 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
cb044cf763 GUI: Set list scrollbar to pixel units to fix page jumping
f7fb85e040 GUI: Tickle the parent with a visible scrollbar in Dialog
87818dfae6 GUI: Prevent scrolling and dragging when no scrollbar is present
1271c91d2b GUI: Reset drag state on focus loss in some widgets
4485898cf3 GUI: Fix GridWidget scroll redraw by explicitly marking it as dirty
6b10fdce3a GUI: Fix GridWidget highlight clearing during scroll
f4c36ea754 GUI: Fix group fold indicators drawing outside widget boundaries
57fc045bc3 GUI: Allow mouse wheel fluid scrolling to build upon previous velocity


Commit: cb044cf763788fe6ad3916908c48a0f4c5647880
    https://github.com/scummvm/scummvm/commit/cb044cf763788fe6ad3916908c48a0f4c5647880
Author: Mohit Bankar (mohitbankar1212 at gmail.com)
Date: 2026-05-25T01:48:58+02:00

Commit Message:
GUI: Set list scrollbar to pixel units to fix page jumping

Fixes #16762
Update ListWidget and GroupedListWidget to use pixel-based scrollbar units. This resolves a mismatch where scrollbar arrows were jumping by a "pixels-worth" of items instead of pixels.

Changed paths:
    gui/widgets/groupedlist.cpp
    gui/widgets/list.cpp


diff --git a/gui/widgets/groupedlist.cpp b/gui/widgets/groupedlist.cpp
index b86c96c2890..935854758af 100644
--- a/gui/widgets/groupedlist.cpp
+++ b/gui/widgets/groupedlist.cpp
@@ -146,7 +146,9 @@ void GroupedListWidget::sortGroups() {
 	checkBounds();
 	scrollBarRecalc();
 
-	_scrollBar->_currentPos = _currentPos;
+	_scrollPos = (float)_currentPos * (kLineHeight + _itemSpacing);
+	_scrollBar->_currentPos = (int)_scrollPos;
+	_fluidScroller->setPosition(_scrollPos, false);
 	_scrollBar->recalc();
 	// FIXME: Temporary solution to clear/display the background ofthe scrollbar when list
 	// grows too small or large during group toggle. We shouldn't have to redraw the top dialog,
@@ -247,11 +249,9 @@ void GroupedListWidget::loadSelection(const Common::Array<bool> &savedSelection)
 	}
 
 	checkBounds();
+	_scrollPos = (float)_currentPos * (kLineHeight + _itemSpacing);
+	_fluidScroller->setPosition(_scrollPos, false);
 	scrollBarRecalc();
-
-	_scrollBar->_currentPos = _currentPos;
-	_scrollBar->recalc();
-
 	markAsDirty();
 }
 
@@ -362,8 +362,8 @@ void GroupedListWidget::handleMouseWheel(int x, int y, int direction) {
 void GroupedListWidget::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
 	switch (cmd) {
 	case kSetPositionCmd:
-		if (_currentPos != (int)data) {
-			_scrollPos = (float)data * (kLineHeight + _itemSpacing);
+		if ((int)_scrollPos != (int)data) {
+			_scrollPos = (float)data;
 			_fluidScroller->stopAnimation();
 			_scrollPos = _fluidScroller->setPosition(_scrollPos, false);
 			applyScrollPos();
diff --git a/gui/widgets/list.cpp b/gui/widgets/list.cpp
index 34a3fc59a1a..9240e6afcc8 100644
--- a/gui/widgets/list.cpp
+++ b/gui/widgets/list.cpp
@@ -290,6 +290,8 @@ void ListWidget::setList(const Common::U32StringArray &list) {
 		_currentPos = size - 1;
 	if (_currentPos < 0)
 		_currentPos = 0;
+	_scrollPos = (float)_currentPos * (kLineHeight + _itemSpacing);
+	_fluidScroller->setPosition(_scrollPos, false);
 	_selectedItem = -1;
 	// Resize and clear bool array
 	_selectedItems.clear();
@@ -347,15 +349,14 @@ void ListWidget::scrollTo(int item) {
 
 void ListWidget::scrollBarRecalc() {
 	const int lineHeight = kLineHeight + _itemSpacing;
-	_scrollBar->_numEntries = _list.size();
-	_scrollBar->_entriesPerPage = _entriesPerPage;
-	int maxIndex = MAX(0, (int)_list.size() - _entriesPerPage);
-	_scrollBar->_currentPos = CLIP<int>(_currentPos, 0, maxIndex);
+	const int visibleHeight = _h - _topPadding - _bottomPadding;
+	_scrollBar->_numEntries = _list.size() * lineHeight;
+	_scrollBar->_entriesPerPage = visibleHeight;
+	int maxScroll = MAX(0, _scrollBar->_numEntries - _scrollBar->_entriesPerPage);
+	_scrollBar->_currentPos = CLIP<int>((int)_scrollPos, 0, maxScroll);
 	_scrollBar->_singleStep = lineHeight;
 	_scrollBar->recalc();
-
-	int maxScroll = MAX(0, (int)(_scrollBar->_numEntries - _scrollBar->_entriesPerPage) * lineHeight);
-	_fluidScroller->setBounds((float)maxScroll, _h - _topPadding - _bottomPadding, (float)_scrollBar->_singleStep);
+	_fluidScroller->setBounds((float)maxScroll, (float)visibleHeight, (float)_scrollBar->_singleStep);
 }
 
 void ListWidget::handleTickle() {
@@ -838,8 +839,8 @@ void ListWidget::lostFocusWidget() {
 void ListWidget::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
 	switch (cmd) {
 	case kSetPositionCmd:
-		if (_currentPos != (int)data) {
-			_scrollPos = (float)data * (kLineHeight + _itemSpacing);
+		if ((int)_scrollPos != (int)data) {
+			_scrollPos = (float)data;
 			_fluidScroller->stopAnimation();
 			_scrollPos = _fluidScroller->setPosition(_scrollPos, false);
 			applyScrollPos();
@@ -992,19 +993,16 @@ void ListWidget::scrollToCurrent() {
 
 	checkBounds();
 	_scrollPos = (float)_currentPos * (kLineHeight + _itemSpacing);
-	_scrollBar->_currentPos = _currentPos;
+	_scrollBar->_currentPos = (int)_scrollPos;
 	_scrollBar->recalc();
 	_fluidScroller->setPosition(_scrollPos, false);
 }
 
 void ListWidget::scrollToEnd() {
-	if (_currentPos + _entriesPerPage < (int)_list.size()) {
-		_currentPos = _list.size() - _entriesPerPage;
-	} else {
-		return;
-	}
-
-	_scrollBar->_currentPos = _currentPos;
+	_currentPos = MAX(0, (int)_list.size() - _entriesPerPage);
+	_scrollPos = (float)_currentPos * (kLineHeight + _itemSpacing);
+	_scrollBar->_currentPos = (int)_scrollPos;
+	_fluidScroller->setPosition(_scrollPos, false);
 	_scrollBar->recalc();
 	_scrollBar->markAsDirty();
 }


Commit: f7fb85e04026c1094724c7767eebe581bfe135b8
    https://github.com/scummvm/scummvm/commit/f7fb85e04026c1094724c7767eebe581bfe135b8
Author: Mohit Bankar (mohitbankar1212 at gmail.com)
Date: 2026-05-25T01:48:58+02:00

Commit Message:
GUI: Tickle the parent with a visible scrollbar in Dialog

Changed paths:
    gui/dialog.cpp
    gui/widget.cpp
    gui/widget.h


diff --git a/gui/dialog.cpp b/gui/dialog.cpp
index 1593bc458fd..21a435a1369 100644
--- a/gui/dialog.cpp
+++ b/gui/dialog.cpp
@@ -268,8 +268,21 @@ void Dialog::handleMouseWheel(int x, int y, int direction) {
 	Widget *w = findWidget(x, y);
 	if (!w)
 		w = _focusedWidget;
-	if (w)
+	if (w) {
 		w->handleMouseWheel(x - (w->getAbsX() - _x), y - (w->getAbsY() - _y), direction);
+		// Find the scrollable ancestor to set as the tickle target
+		Widget *scrollable = w;
+		while (scrollable) {
+			if (scrollable->hasVisibleScrollBar()) {
+				setTickleWidget(scrollable);
+				break;
+			}
+			if (scrollable->_boss == this)		
+				break;
+
+			scrollable = static_cast<Widget *>(scrollable->_boss);
+		}
+	}
 
 	_handlingMouseWheel = false;
 }
diff --git a/gui/widget.cpp b/gui/widget.cpp
index 6c5c405cc47..30393486116 100644
--- a/gui/widget.cpp
+++ b/gui/widget.cpp
@@ -186,6 +186,16 @@ Widget *Widget::findWidgetInChain(Widget *w, uint32 type) {
 	return nullptr;
 }
 
+bool Widget::hasVisibleScrollBar() const {
+	Widget *w = _firstWidget;
+	while (w) {
+		if (w->getType() == kScrollBarWidget && w->isVisible())
+			return true;
+		w = w->_next;
+	}
+	return false;
+}
+
 bool Widget::containsWidgetInChain(Widget *w, Widget *search) {
 	while (w) {
 		if (w == search || w->containsWidget(search))
diff --git a/gui/widget.h b/gui/widget.h
index 0aa62a3586f..1dd1f6a60d9 100644
--- a/gui/widget.h
+++ b/gui/widget.h
@@ -162,6 +162,8 @@ public:
 
 	uint32 getType() const { return _type; }
 
+	// Check if the widget or its children contain a visible scrollbar
+	virtual bool hasVisibleScrollBar() const;
 	void setFlags(int flags);
 	void clearFlags(int flags);
 	int getFlags() const		{ return _flags; }


Commit: 87818dfae6e63e3d213b61a77143490b2f270656
    https://github.com/scummvm/scummvm/commit/87818dfae6e63e3d213b61a77143490b2f270656
Author: Mohit Bankar (mohitbankar1212 at gmail.com)
Date: 2026-05-25T01:48:58+02:00

Commit Message:
GUI: Prevent scrolling and dragging when no scrollbar is present

Changed paths:
    gui/widgets/grid.cpp
    gui/widgets/groupedlist.cpp
    gui/widgets/list.cpp
    gui/widgets/richtext.cpp
    gui/widgets/scrollcontainer.cpp


diff --git a/gui/widgets/grid.cpp b/gui/widgets/grid.cpp
index b0a82e995c3..76e7cf26044 100644
--- a/gui/widgets/grid.cpp
+++ b/gui/widgets/grid.cpp
@@ -1023,6 +1023,9 @@ void GridWidget::selectVisualRange(int startPos, int endPos) {
 }
 
 void GridWidget::handleMouseWheel(int x, int y, int direction) {
+	if (!_scrollBar->isVisible())
+		return;
+
 	_fluidScroller->handleMouseWheel(direction);
 }
 
@@ -1058,7 +1061,7 @@ void GridWidget::handleMouseUp(int x, int y, int button, int clickCount) {
 }
 
 void GridWidget::handleMouseMoved(int x, int y, int button) {
-	if (!_isMouseDown)
+	if (!_isMouseDown || !_scrollBar->isVisible())
 		return;
 
 	if (!_isDragging && ABS(y - _dragStartY) > kDragThreshold) {
diff --git a/gui/widgets/groupedlist.cpp b/gui/widgets/groupedlist.cpp
index 935854758af..e2a89be7ca3 100644
--- a/gui/widgets/groupedlist.cpp
+++ b/gui/widgets/groupedlist.cpp
@@ -356,6 +356,9 @@ void GroupedListWidget::handleMouseUp(int x, int y, int button, int clickCount)
 }
 
 void GroupedListWidget::handleMouseWheel(int x, int y, int direction) {
+	if (!_scrollBar->isVisible())
+		return;
+
 	_fluidScroller->handleMouseWheel(direction);
 }
 
diff --git a/gui/widgets/list.cpp b/gui/widgets/list.cpp
index 9240e6afcc8..801b625df15 100644
--- a/gui/widgets/list.cpp
+++ b/gui/widgets/list.cpp
@@ -460,11 +460,14 @@ void ListWidget::handleMouseUp(int x, int y, int button, int clickCount) {
 }
 
 void ListWidget::handleMouseWheel(int x, int y, int direction) {
+	if (!_scrollBar->isVisible())
+		return;
+
 	_fluidScroller->handleMouseWheel(direction);
 }
 
 void ListWidget::handleMouseMoved(int x, int y, int button) {
-	if (!isEnabled())
+	if (!isEnabled() || !_scrollBar->isVisible())
 		return;
 
 	if (_isMouseDown && _dragLastY != 0) {
diff --git a/gui/widgets/richtext.cpp b/gui/widgets/richtext.cpp
index 03a15076e41..0a261bb857b 100644
--- a/gui/widgets/richtext.cpp
+++ b/gui/widgets/richtext.cpp
@@ -103,6 +103,8 @@ RichTextWidget::~RichTextWidget() {
 }
 
 void RichTextWidget::handleMouseWheel(int x, int y, int direction) {
+	if (!_verticalScroll->isVisible())
+		return;
 	_fluidScroller->handleMouseWheel(direction);
 	applyScrollPos();
 }
@@ -146,7 +148,7 @@ void RichTextWidget::handleMouseMoved(int x, int y, int button) {
 			g_gui.theme()->setActiveCursor(GUI::ThemeEngine::kCursorNormal);
 	}
 
-	if (_mouseDownStartY == 0 || _mouseDownY == y || !_txtWnd)
+	if (_mouseDownStartY == 0 || _mouseDownY == y || !_txtWnd || !_verticalScroll->isVisible())
 		return;
 
 	int deltaY = _mouseDownY - y;
diff --git a/gui/widgets/scrollcontainer.cpp b/gui/widgets/scrollcontainer.cpp
index 0cdd0fa999b..21eea4f6e46 100644
--- a/gui/widgets/scrollcontainer.cpp
+++ b/gui/widgets/scrollcontainer.cpp
@@ -53,7 +53,7 @@ void ScrollContainerWidget::init() {
 }
 
 void ScrollContainerWidget::handleMouseWheel(int x, int y, int direction) {
-	if (!isEnabled())
+	if (!isEnabled() || !_verticalScroll->isVisible())
 		return;
 
 	_fluidScroller->handleMouseWheel(direction);
@@ -77,7 +77,7 @@ void ScrollContainerWidget::handleMouseDown(int x, int y, int button, int clickC
 }
 
 void ScrollContainerWidget::handleMouseMoved(int x, int y, int button) {
-	if (!_isMouseDown || _mouseDownY == y)
+	if (!_isMouseDown || _mouseDownY == y || !_verticalScroll->isVisible())
 		return;
 
 	if (!_isDragging && ABS(y - _mouseDownStartY) > kDragThreshold)


Commit: 1271c91d2b85edaca5855c650be0ba12929f2390
    https://github.com/scummvm/scummvm/commit/1271c91d2b85edaca5855c650be0ba12929f2390
Author: Mohit Bankar (mohitbankar1212 at gmail.com)
Date: 2026-05-25T01:48:58+02:00

Commit Message:
GUI: Reset drag state on focus loss in some widgets

Fixes #16700
Reset drag state on focus loss in List, Grid, Scrollcontainer and Richtext widget to fix the unintended scrolling while interacting with a popup.

Changed paths:
    gui/dialog.cpp
    gui/widgets/grid.cpp
    gui/widgets/grid.h
    gui/widgets/list.cpp
    gui/widgets/richtext.cpp
    gui/widgets/richtext.h
    gui/widgets/scrollcontainer.cpp
    gui/widgets/scrollcontainer.h


diff --git a/gui/dialog.cpp b/gui/dialog.cpp
index 21a435a1369..3c816725b5f 100644
--- a/gui/dialog.cpp
+++ b/gui/dialog.cpp
@@ -119,7 +119,10 @@ void Dialog::reflowLayout() {
 }
 
 void Dialog::lostFocus() {
-	_dragWidget = nullptr;
+	if (_dragWidget) {
+		_dragWidget->lostFocus();
+		_dragWidget = nullptr;
+	}
 
 	if (_tickleWidget) {
 		_tickleWidget->lostFocus();
diff --git a/gui/widgets/grid.cpp b/gui/widgets/grid.cpp
index 76e7cf26044..061050659d8 100644
--- a/gui/widgets/grid.cpp
+++ b/gui/widgets/grid.cpp
@@ -1103,6 +1103,11 @@ bool GridWidget::handleKeyUp(Common::KeyState state) {
 	return false;
 }
 
+void GridWidget::lostFocusWidget() {
+	_isMouseDown = _isDragging = false;
+	_dragStartY = _dragLastY = 0;
+}
+
 void GridWidget::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
 	// Work in progress
 	switch (cmd) {
diff --git a/gui/widgets/grid.h b/gui/widgets/grid.h
index 9391cec6d73..564adf314ce 100644
--- a/gui/widgets/grid.h
+++ b/gui/widgets/grid.h
@@ -252,6 +252,7 @@ public:
 
 	bool wantsFocus() override { return true; }
 
+	void lostFocusWidget() override;
 	bool handleKeyDown(Common::KeyState state) override;
 	bool handleKeyUp(Common::KeyState state) override;
 	void openTrayAtSelected();
diff --git a/gui/widgets/list.cpp b/gui/widgets/list.cpp
index 801b625df15..c3edc794a9f 100644
--- a/gui/widgets/list.cpp
+++ b/gui/widgets/list.cpp
@@ -831,6 +831,8 @@ void ListWidget::receivedFocusWidget() {
 
 void ListWidget::lostFocusWidget() {
 	_inversion = ThemeEngine::kTextInversion;
+	_isMouseDown = _isDragging = false;
+	_dragStartY = _dragLastY = 0;
 
 	// If we lose focus, we simply forget the user changes
 	_editMode = false;
diff --git a/gui/widgets/richtext.cpp b/gui/widgets/richtext.cpp
index 0a261bb857b..8c7e6437e6c 100644
--- a/gui/widgets/richtext.cpp
+++ b/gui/widgets/richtext.cpp
@@ -392,6 +392,11 @@ void RichTextWidget::markAsDirty() {
 	}
 }
 
+void RichTextWidget::lostFocusWidget() {
+	_mouseDownY = _mouseDownStartY = 0;
+	_isDragging = false;
+}
+
 bool RichTextWidget::containsWidget(Widget *w) const {
 	if (w == _verticalScroll || _verticalScroll->containsWidget(w))
 		return true;
diff --git a/gui/widgets/richtext.h b/gui/widgets/richtext.h
index 6e4adc7487f..9782831175b 100644
--- a/gui/widgets/richtext.h
+++ b/gui/widgets/richtext.h
@@ -74,6 +74,7 @@ public:
 	void handleMouseDown(int x, int y, int button, int clickCount) override;
 	void handleMouseUp(int x, int y, int button, int clickCount) override;
 	void handleMouseMoved(int x, int y, int button) override;
+	void lostFocusWidget() override;
 	void handleTickle() override;
 	void handleTooltipUpdate(int x, int y) override;
 
diff --git a/gui/widgets/scrollcontainer.cpp b/gui/widgets/scrollcontainer.cpp
index 21eea4f6e46..9fca3580f44 100644
--- a/gui/widgets/scrollcontainer.cpp
+++ b/gui/widgets/scrollcontainer.cpp
@@ -248,6 +248,11 @@ void ScrollContainerWidget::markAsDirty() {
 	}
 }
 
+void ScrollContainerWidget::lostFocusWidget() {
+	_isMouseDown = _isDragging = false;
+	_mouseDownY = _mouseDownStartY = 0;
+}
+
 bool ScrollContainerWidget::containsWidget(Widget *w) const {
 	if (w == _verticalScroll || _verticalScroll->containsWidget(w))
 		return true;
diff --git a/gui/widgets/scrollcontainer.h b/gui/widgets/scrollcontainer.h
index 37c4582e805..46ac530dd17 100644
--- a/gui/widgets/scrollcontainer.h
+++ b/gui/widgets/scrollcontainer.h
@@ -66,6 +66,7 @@ public:
 	void handleMouseDown(int x, int y, int button, int clickCount) override;
 	void handleMouseUp(int x, int y, int button, int clickCount) override;
 	void handleMouseMoved(int x, int y, int button) override;
+	void lostFocusWidget() override;
 	void handleTickle() override;
 
 	// We overload getChildY to make sure child widgets are positioned correctly.


Commit: 4485898cf31cf8fea108e2dab9aef61196d7bf71
    https://github.com/scummvm/scummvm/commit/4485898cf31cf8fea108e2dab9aef61196d7bf71
Author: Mohit Bankar (mohitbankar1212 at gmail.com)
Date: 2026-05-25T01:48:58+02:00

Commit Message:
GUI: Fix GridWidget scroll redraw by explicitly marking it as dirty

Fixes #16718
This prevents old frames from leaving ghost artifacts on screen during the scroll.

Changed paths:
    gui/widgets/grid.cpp


diff --git a/gui/widgets/grid.cpp b/gui/widgets/grid.cpp
index 061050659d8..f179c230b5e 100644
--- a/gui/widgets/grid.cpp
+++ b/gui/widgets/grid.cpp
@@ -1087,6 +1087,7 @@ void GridWidget::applyScrollPos() {
 
 	assignEntriesToItems();
 	scrollBarRecalc();	
+	markAsDirty();
 	g_gui.scheduleTopDialogRedraw();
 }
 


Commit: 6b10fdce3a1394b909669ad67d8d358140be08d3
    https://github.com/scummvm/scummvm/commit/6b10fdce3a1394b909669ad67d8d358140be08d3
Author: Mohit Bankar (mohitbankar1212 at gmail.com)
Date: 2026-05-25T01:48:58+02:00

Commit Message:
GUI: Fix GridWidget highlight clearing during scroll

Implemented tracking of the currently highlighted item in GridWidget to allow clearing of hover states during scrolling. This ensures that items moving away from cursor don't stay highlighted

Changed paths:
    gui/widgets/grid.cpp
    gui/widgets/grid.h


diff --git a/gui/widgets/grid.cpp b/gui/widgets/grid.cpp
index f179c230b5e..a7aa469a2be 100644
--- a/gui/widgets/grid.cpp
+++ b/gui/widgets/grid.cpp
@@ -195,6 +195,7 @@ void GridItemWidget::handleMouseWheel(int x, int y, int direction) {
 void GridItemWidget::handleMouseEntered(int button) {
 	if (!_isHighlighted) {
 		_isHighlighted = true;
+		_grid->_highlightedItem = this;
 		markAsDirty();
 	}
 }
@@ -202,6 +203,8 @@ void GridItemWidget::handleMouseEntered(int button) {
 void GridItemWidget::handleMouseLeft(int button) {
 	if (_isHighlighted) {
 		_isHighlighted = false;
+		if (_grid->_highlightedItem == this)
+			_grid->_highlightedItem = nullptr;
 		markAsDirty();
 	}
 }
@@ -1088,6 +1091,8 @@ void GridWidget::applyScrollPos() {
 	assignEntriesToItems();
 	scrollBarRecalc();	
 	markAsDirty();
+	if (_highlightedItem)
+		_highlightedItem->handleMouseLeft(0);
 	g_gui.scheduleTopDialogRedraw();
 }
 
diff --git a/gui/widgets/grid.h b/gui/widgets/grid.h
index 564adf314ce..920550f4764 100644
--- a/gui/widgets/grid.h
+++ b/gui/widgets/grid.h
@@ -180,6 +180,7 @@ protected:
 	static const int kDragThreshold = 5;
 
 	FluidScroller *_fluidScroller;
+	GridItemWidget *_highlightedItem = nullptr;
 
 public:
 	int				_gridItemHeight;


Commit: f4c36ea754dee9d14014e90fb3ef9fc6f734fa8e
    https://github.com/scummvm/scummvm/commit/f4c36ea754dee9d14014e90fb3ef9fc6f734fa8e
Author: Mohit Bankar (mohitbankar1212 at gmail.com)
Date: 2026-05-25T01:48:58+02:00

Commit Message:
GUI: Fix group fold indicators drawing outside widget boundaries

Fixes #16780

Changed paths:
    gui/ThemeEngine.cpp


diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp
index 4d470792d82..118e3ff7eba 100644
--- a/gui/ThemeEngine.cpp
+++ b/gui/ThemeEngine.cpp
@@ -1514,6 +1514,7 @@ void ThemeEngine::drawFoldIndicator(const Common::Rect &r, bool expanded) {
 	else
 		orient = Graphics::VectorRenderer::kTriangleRight;
 
+	_vectorRenderer->setClippingRect(_clip);
 	_vectorRenderer->setFillMode(Graphics::VectorRenderer::kFillForeground);
 	_vectorRenderer->setFgColor(_textColors[kTextColorNormal]->r, _textColors[kTextColorNormal]->g, _textColors[kTextColorNormal]->b);
 	_vectorRenderer->drawTriangle(r.left + r.width() / 4, r.top + r.height() / 4, r.width() / 2, r.height() / 2, orient);


Commit: 57fc045bc312b1c0a65e9b2968e23f2c6cae27c3
    https://github.com/scummvm/scummvm/commit/57fc045bc312b1c0a65e9b2968e23f2c6cae27c3
Author: Mohit Bankar (mohitbankar1212 at gmail.com)
Date: 2026-05-25T01:48:58+02:00

Commit Message:
GUI: Allow mouse wheel fluid scrolling to build upon previous velocity

Changed paths:
    gui/animation/FluidScroll.cpp


diff --git a/gui/animation/FluidScroll.cpp b/gui/animation/FluidScroll.cpp
index e8a1051ca9e..060a1603360 100644
--- a/gui/animation/FluidScroll.cpp
+++ b/gui/animation/FluidScroll.cpp
@@ -168,6 +168,13 @@ void FluidScroller::feedWheel(uint32 time, float deltaY) {
 		effectiveDt = 20;
 
 	float velocity = deltaY / (float)effectiveDt;
+	if (_mode == kModeFling) {
+		float elapsed = (float)(time - _startTime);
+		float coefficient = powf(kDecelerationRate, elapsed);
+		float currentVelocity = _initialVelocity * coefficient;
+
+		velocity += currentVelocity * 0.2f;
+	}
 	startFling(velocity);
 }
 
@@ -176,7 +183,6 @@ void FluidScroller::handleMouseWheel(int direction, float multiplier) {
 	if (stepping == 0.0f)
 		return;
 
-	stopAnimation();
 	feedWheel(g_system->getMillis(), stepping);
 }
 




More information about the Scummvm-git-logs mailing list