aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/graphics
diff options
context:
space:
mode:
authorMartin Kiewitz2010-01-12 21:49:43 +0000
committerMartin Kiewitz2010-01-12 21:49:43 +0000
commitef5c9f62d73bb3ebb5e140ea6ffb668999aed365 (patch)
tree362b4c66c356df9aaa032795f5b0123f6421116b /engines/sci/graphics
parentaf1ba4229812b74ea7c543cd14b34be0c9af5db6 (diff)
downloadscummvm-rg350-ef5c9f62d73bb3ebb5e140ea6ffb668999aed365.tar.gz
scummvm-rg350-ef5c9f62d73bb3ebb5e140ea6ffb668999aed365.tar.bz2
scummvm-rg350-ef5c9f62d73bb3ebb5e140ea6ffb668999aed365.zip
SCI: implemented mouse interaction while being in keyboard mode, also ignore disabled entries/separator lines within mouse mode
svn-id: r47285
Diffstat (limited to 'engines/sci/graphics')
-rw-r--r--engines/sci/graphics/menu.cpp44
1 files changed, 23 insertions, 21 deletions
diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp
index 6c69586d0c..705f5774e1 100644
--- a/engines/sci/graphics/menu.cpp
+++ b/engines/sci/graphics/menu.cpp
@@ -634,7 +634,7 @@ GuiMenuItemEntry *Menu::interactiveWithKeyboard() {
uint16 newItemId = _curItemId;
GuiMenuItemEntry *curItemEntry = findItem(_curMenuId, _curItemId);
GuiMenuItemEntry *newItemEntry = curItemEntry;
- uint16 cursorX, curX = 0;
+ Common::Point mousePosition;
// We don't 100% follow sierra here: we select last item instead of selecting first item of first menu everytime
// Also sierra sci didnt allow mouse interaction, when menu was activated via keyboard
@@ -711,36 +711,36 @@ GuiMenuItemEntry *Menu::interactiveWithKeyboard() {
break;
case SCI_EVENT_MOUSE_PRESS:
+ mousePosition = _cursor->getPosition();
if (_cursor->getPosition().y < 10) {
- cursorX = _cursor->getPosition().x;
- curX = 0;
-
- for (GuiMenuList::iterator menuIterator = _list.begin(); menuIterator != _list.end(); menuIterator++) {
- if (cursorX >= curX && cursorX <= curX + (*menuIterator)->textWidth) {
- newMenuId = (*menuIterator)->id; newItemId = 1;
- newItemEntry = interactiveGetItem(newMenuId, newItemId, newMenuId != curItemEntry->menuId);
- break;
- }
-
- curX += (*menuIterator)->textWidth;
- }
-
- if ((newMenuId != curItemEntry->menuId) || (newItemId != curItemEntry->id)) {
- // paint old and new
+ // Somewhere on the menubar
+ newMenuId = mouseFindMenuSelection(mousePosition);
+ if (newMenuId) {
+ newItemId = 1;
+ newItemEntry = interactiveGetItem(newMenuId, newItemId, newMenuId != curItemEntry->menuId);
if (newMenuId != curItemEntry->menuId) {
- // Menu changed, remove cur menu and paint new menu
drawMenu(curItemEntry->menuId, newMenuId);
} else {
invertMenuSelection(curItemEntry->id);
}
invertMenuSelection(newItemId);
-
curItemEntry = newItemEntry;
+ } else {
+ newMenuId = curItemEntry->menuId;
+ }
+ } else {
+ // Somewhere below menubar
+ newItemId = mouseFindMenuItemSelection(mousePosition, newMenuId);
+ if (newItemId) {
+ newItemEntry = interactiveGetItem(newMenuId, newItemId, false);
+ if ((newItemEntry->enabled) && (!newItemEntry->separatorLine)) {
+ _curMenuId = newItemEntry->menuId; _curItemId = newItemEntry->id;
+ return newItemEntry;
+ }
+ newItemEntry = curItemEntry;
}
+ newItemId = curItemEntry->id;
}
-
- // TODO: Handle mouse clicks for the menu items of each menu (i.e. when y >= 10)
-
break;
case SCI_EVENT_NONE:
kernel_sleep(_event, 2500 / 1000);
@@ -777,6 +777,8 @@ GuiMenuItemEntry *Menu::interactiveWithMouse() {
case SCI_EVENT_MOUSE_RELEASE:
if ((curMenuId == 0) || (curItemId == 0))
return NULL;
+ if ((!curItemEntry->enabled) || (curItemEntry->separatorLine))
+ return NULL;
return curItemEntry;
case SCI_EVENT_NONE: