aboutsummaryrefslogtreecommitdiff
path: root/gui/gui-manager.cpp
diff options
context:
space:
mode:
authorOri Avtalion2016-04-06 17:22:02 +0300
committerOri Avtalion2016-04-06 17:51:30 +0300
commitbe1fdf59bb80f963a4f97bfab49f59aca8d73d70 (patch)
treedcbcec9a6824d0ee4d0e53d9b19fca02b8b1c0b3 /gui/gui-manager.cpp
parent8fa543f58f251ef5c695f6c288ecd0303ec14144 (diff)
downloadscummvm-rg350-be1fdf59bb80f963a4f97bfab49f59aca8d73d70.tar.gz
scummvm-rg350-be1fdf59bb80f963a4f97bfab49f59aca8d73d70.tar.bz2
scummvm-rg350-be1fdf59bb80f963a4f97bfab49f59aca8d73d70.zip
GUI: When dialogs gain focus, inform them of the current mouse position
Previously, they only reacted to the mouse position once it was moved. This meant that if the cursor was on a button that just gained focus, it did not highlight. Fixes #7101.
Diffstat (limited to 'gui/gui-manager.cpp')
-rw-r--r--gui/gui-manager.cpp40
1 files changed, 23 insertions, 17 deletions
diff --git a/gui/gui-manager.cpp b/gui/gui-manager.cpp
index 4ddf62b2fe..3ce8bee020 100644
--- a/gui/gui-manager.cpp
+++ b/gui/gui-manager.cpp
@@ -281,15 +281,10 @@ void GuiManager::runLoop() {
redraw();
}
- _lastMousePosition.x = _lastMousePosition.y = -1;
- _lastMousePosition.time = 0;
-
Common::EventManager *eventMan = _system->getEventManager();
uint32 lastRedraw = 0;
const uint32 waitTime = 1000 / 60;
- bool tooltipCheck = false;
-
while (!_dialogStack.empty() && activeDialog == getTopDialog() && !eventMan->shouldQuit()) {
redraw();
@@ -336,11 +331,6 @@ void GuiManager::runLoop() {
processEvent(event, activeDialog);
- if (event.type == Common::EVENT_MOUSEMOVE) {
- tooltipCheck = true;
- }
-
-
if (lastRedraw + waitTime < _system->getMillis(true)) {
lastRedraw = _system->getMillis(true);
_theme->updateScreen();
@@ -348,7 +338,7 @@ void GuiManager::runLoop() {
}
}
- if (tooltipCheck && _lastMousePosition.time + kTooltipDelay < _system->getMillis(true)) {
+ if (_lastMousePosition.time + kTooltipDelay < _system->getMillis(true)) {
Widget *wdg = activeDialog->findWidget(_lastMousePosition.x, _lastMousePosition.y);
if (wdg && wdg->hasTooltip() && !(wdg->getFlags() & WIDGET_PRESSED)) {
Tooltip *tooltip = new Tooltip();
@@ -415,7 +405,7 @@ void GuiManager::restoreState() {
}
void GuiManager::openDialog(Dialog *dialog) {
- dialog->receivedFocus();
+ giveFocusToDialog(dialog);
if (!_dialogStack.empty())
getTopDialog()->lostFocus();
@@ -439,8 +429,10 @@ void GuiManager::closeTopDialog() {
// Remove the dialog from the stack
_dialogStack.pop()->lostFocus();
- if (!_dialogStack.empty())
- getTopDialog()->receivedFocus();
+ if (!_dialogStack.empty()) {
+ Dialog *dialog = getTopDialog();
+ giveFocusToDialog(dialog);
+ }
if (_redrawStatus != kRedrawFull)
_redrawStatus = kRedrawCloseDialog;
@@ -515,6 +507,7 @@ void GuiManager::processEvent(const Common::Event &event, Dialog *const activeDi
int button;
uint32 time;
Common::Point mouse(event.mouse.x - activeDialog->_x, event.mouse.y - activeDialog->_y);
+
switch (event.type) {
case Common::EVENT_KEYDOWN:
activeDialog->handleKeyDown(event.kbd);
@@ -523,12 +516,12 @@ void GuiManager::processEvent(const Common::Event &event, Dialog *const activeDi
activeDialog->handleKeyUp(event.kbd);
break;
case Common::EVENT_MOUSEMOVE:
+ _globalMousePosition.x = event.mouse.x;
+ _globalMousePosition.y = event.mouse.y;
activeDialog->handleMouseMoved(mouse.x, mouse.y, 0);
if (mouse.x != _lastMousePosition.x || mouse.y != _lastMousePosition.y) {
- _lastMousePosition.x = mouse.x;
- _lastMousePosition.y = mouse.y;
- _lastMousePosition.time = _system->getMillis(true);
+ setLastMousePos(mouse.x, mouse.y);
}
break;
@@ -571,4 +564,17 @@ void GuiManager::processEvent(const Common::Event &event, Dialog *const activeDi
}
}
+void GuiManager::giveFocusToDialog(Dialog *dialog) {
+ int16 dialogX = _globalMousePosition.x - dialog->_x;
+ int16 dialogY = _globalMousePosition.y - dialog->_y;
+ dialog->receivedFocus(dialogX, dialogY);
+ setLastMousePos(dialogX, dialogY);
+}
+
+void GuiManager::setLastMousePos(int16 x, int16 y) {
+ _lastMousePosition.x = x;
+ _lastMousePosition.y = y;
+ _lastMousePosition.time = _system->getMillis(true);
+}
+
} // End of namespace GUI