[Scummvm-git-logs] scummvm master -> d2fdbba9048fe6481e8ad5e24ed292525bb9434f

eriktorbjorn noreply at scummvm.org
Sat Mar 28 06:54:01 UTC 2026


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

Summary:
d2fdbba904 SCUMM: MACGUI: Make PopUp widgets honor UIUX enhancement setting


Commit: d2fdbba9048fe6481e8ad5e24ed292525bb9434f
    https://github.com/scummvm/scummvm/commit/d2fdbba9048fe6481e8ad5e24ed292525bb9434f
Author: Torbjörn Andersson (eriktorbjorn at users.sourceforge.net)
Date: 2026-03-28T07:52:01+01:00

Commit Message:
SCUMM: MACGUI: Make PopUp widgets honor UIUX enhancement setting

Like the menu bar, you can now click on the popup and it will stay open
when you release the mouse (unless you've already moved the mouse over a
new entry). This should make them easier to use on touch devices like
Android. When the UIUX enhancment setting isn't enabled, they behave
like before.

Changed paths:
    engines/scumm/macgui/macgui_dialogwindow.cpp
    engines/scumm/macgui/macgui_impl.h
    engines/scumm/macgui/macgui_widgets.cpp


diff --git a/engines/scumm/macgui/macgui_dialogwindow.cpp b/engines/scumm/macgui/macgui_dialogwindow.cpp
index 6ac4d3e8753..58fcabfaad1 100644
--- a/engines/scumm/macgui/macgui_dialogwindow.cpp
+++ b/engines/scumm/macgui/macgui_dialogwindow.cpp
@@ -213,9 +213,10 @@ void MacGuiImpl::MacDialogWindow::show() {
 void MacGuiImpl::MacDialogWindow::setFocusedWidget(int x, int y) {
 	int nr = findWidget(x, y);
 	if (nr >= 0) {
+		if (_focusedWidget && _focusedWidget != _widgets[nr])
+			clearFocusedWidget();
+
 		_focusedWidget = _widgets[nr];
-		_focusClick.x = x;
-		_focusClick.y = y;
 		_focusedWidget->getFocus();
 	} else
 		clearFocusedWidget();
@@ -225,8 +226,6 @@ void MacGuiImpl::MacDialogWindow::clearFocusedWidget() {
 	if (_focusedWidget) {
 		_focusedWidget->loseFocus();
 		_focusedWidget = nullptr;
-		_focusClick.x = -1;
-		_focusClick.y = -1;
 	}
 }
 
@@ -621,13 +620,13 @@ bool MacGuiImpl::MacDialogWindow::runDialog(MacGuiImpl::MacDialogEvent &dialogEv
 				MacWidget *widget = _focusedWidget;
 
 				if (widget->findWidget(event.mouse.x, event.mouse.y)) {
-					if (widget->handleMouseUp(event)) {
-						clearFocusedWidget();
+					if (widget->handleMouseUp(event))
 						queueEvent(widget, kDialogClick);
-					}
-				}
 
-				clearFocusedWidget();
+					if (!widget->keepFocus(event.mouse.x, event.mouse.y))
+						clearFocusedWidget();
+				} else
+					clearFocusedWidget();
 			}
 
 			updateCursor();
diff --git a/engines/scumm/macgui/macgui_impl.h b/engines/scumm/macgui/macgui_impl.h
index 8bec8222ca5..f743e5315bc 100644
--- a/engines/scumm/macgui/macgui_impl.h
+++ b/engines/scumm/macgui/macgui_impl.h
@@ -299,6 +299,7 @@ public:
 
 		virtual void getFocus() { setRedraw(); }
 		virtual void loseFocus() { setRedraw(); }
+		virtual bool keepFocus(int x, int y) { return false; }
 
 		virtual void setRedraw(bool fullRedraw = false);
 
@@ -630,6 +631,10 @@ public:
 		int _selected;
 		Graphics::Surface _popUpBackground;
 		Common::Rect _popUpBounds;
+		bool _floating;
+		bool _enhUIUX;
+
+		void close();
 
 	public:
 		MacPopUpMenu(MacGuiImpl::MacDialogWindow *window, Common::Rect bounds, Common::String text, int textWidth, Common::StringArray texts, bool enabled);
@@ -641,6 +646,9 @@ public:
 		void handleMouseDown(Common::Event &event) override;
 		bool handleMouseUp(Common::Event &event) override;
 		void handleMouseMove(Common::Event &event) override;
+
+		void loseFocus() override;
+		bool keepFocus(int x, int y) override;
 	};
 
 	enum MacDialogEventType {
@@ -692,7 +700,6 @@ public:
 		MacWidget *_defaultWidget = nullptr;
 
 		MacWidget *_focusedWidget = nullptr;
-		Common::Point _focusClick;
 		Common::Point _oldMousePos;
 		Common::Point _mousePos;
 		Common::Point _realMousePos;
@@ -735,7 +742,6 @@ public:
 		void setFocusedWidget(int x, int y);
 		void clearFocusedWidget();
 		MacWidget *getFocusedWidget() const { return _focusedWidget; }
-		Common::Point getFocusClick() const { return _focusClick; }
 		Common::Point getMousePos() const { return _mousePos; }
 
 		int findWidget(int x, int y) const;
diff --git a/engines/scumm/macgui/macgui_widgets.cpp b/engines/scumm/macgui/macgui_widgets.cpp
index 81fd5e58a68..d555e71d535 100644
--- a/engines/scumm/macgui/macgui_widgets.cpp
+++ b/engines/scumm/macgui/macgui_widgets.cpp
@@ -1656,6 +1656,8 @@ bool MacGuiImpl::MacListBox::handleKeyDown(Common::Event &event) {
 // ---------------------------------------------------------------------------
 
 MacGuiImpl::MacPopUpMenu::MacPopUpMenu(MacGuiImpl::MacDialogWindow *window, Common::Rect bounds, Common::String text, int textWidth, Common::StringArray texts, bool enabled) : MacWidget(window, bounds, text, enabled), _textWidth(textWidth), _texts(texts) {
+	_enhUIUX = g_engine->enhancementEnabled(kEnhUIUX);
+	_floating = false;
 	_black = _window->_gui->getBlack();
 	_white = _window->_gui->getWhite();
 
@@ -1668,6 +1670,16 @@ MacGuiImpl::MacPopUpMenu::~MacPopUpMenu() {
 	_popUpBackground.free();
 }
 
+void MacGuiImpl::MacPopUpMenu::close() {
+	if (_menuVisible)
+		_window->drawSprite(&_popUpBackground, _popUpBounds.left, _popUpBounds.top);
+
+	_menuVisible = false;
+	_floating = false;
+
+	setRedraw();
+}
+
 bool MacGuiImpl::MacPopUpMenu::findWidget(int x, int y) const {
 	// Once we have opened the drop down list, any mouse position is
 	// considered within the widget.
@@ -1690,9 +1702,8 @@ void MacGuiImpl::MacPopUpMenu::draw(bool drawFocused) {
 	// in any way.
 
 	uint32 fg, bg;
-	bool focused = drawFocused || _window->getFocusedWidget() == this;
 
-	if (focused) {
+	if (_menuVisible) {
 		fg = _white;
 		bg = _black;
 	} else {
@@ -1706,7 +1717,7 @@ void MacGuiImpl::MacPopUpMenu::draw(bool drawFocused) {
 	s->fillRect(Common::Rect(_bounds.left, _bounds.top + 1, _bounds.left + _textWidth, _bounds.bottom - 3), bg);
 	font->drawString(s, _text, _bounds.left, _bounds.top + 1, _textWidth, fg, Graphics::kTextAlignLeft, 4);
 
-	if (focused) {
+	if (_menuVisible) {
 		Common::Rect r = _popUpBounds;
 		r.bottom--;
 		r.right--;
@@ -1766,11 +1777,17 @@ void MacGuiImpl::MacPopUpMenu::draw(bool drawFocused) {
 	_fullRedraw = false;
 
 	_window->markRectAsDirty(_bounds);
-	if (focused)
+	if (_menuVisible)
 		_window->markRectAsDirty(_popUpBounds);
 }
 
 void MacGuiImpl::MacPopUpMenu::handleMouseDown(Common::Event &event) {
+	if (_floating) {
+		if (!_popUpBounds.contains(event.mouse.x, event.mouse.y))
+			close();
+		return;
+	}
+
 	_popUpBounds.top = _bounds.top - 16 * _value;
 	_popUpBounds.bottom = _bounds.bottom - 1 + 16 * (_texts.size() - _value - 1);
 
@@ -1780,11 +1797,19 @@ void MacGuiImpl::MacPopUpMenu::handleMouseDown(Common::Event &event) {
 	_popUpBackground.copyFrom(background);
 
 	_menuVisible = true;
+	_floating = false;
 	_selected = _value;
 }
 
 bool MacGuiImpl::MacPopUpMenu::handleMouseUp(Common::Event &event) {
 	if (_selected != -1) {
+		if (_enhUIUX) {
+			if (!_floating && _selected == getValue()) {
+				_floating = true;
+				return false;
+			}
+		}
+
 		int selected = _selected;
 
 		for (int i = 0; i < 6; i++) {
@@ -1811,9 +1836,7 @@ bool MacGuiImpl::MacPopUpMenu::handleMouseUp(Common::Event &event) {
 		setValue(selected);
 	}
 
-	_window->drawSprite(&_popUpBackground, _popUpBounds.left, _popUpBounds.top);
-	_menuVisible = false;
-
+	close();
 	return false;
 }
 
@@ -1842,4 +1865,12 @@ void MacGuiImpl::MacPopUpMenu::handleMouseMove(Common::Event &event) {
 	}
 }
 
+void MacGuiImpl::MacPopUpMenu::loseFocus() {
+	close();
+}
+
+bool MacGuiImpl::MacPopUpMenu::keepFocus(int x, int y) {
+	return _floating && _popUpBounds.contains(x, y);
+}
+
 } // End of namespace Scumm




More information about the Scummvm-git-logs mailing list