[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