[Scummvm-cvs-logs] SF.net SVN: scummvm:[47285] scummvm/trunk/engines/sci/graphics/menu.cpp

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Tue Jan 12 22:49:43 CET 2010


Revision: 47285
          http://scummvm.svn.sourceforge.net/scummvm/?rev=47285&view=rev
Author:   m_kiewitz
Date:     2010-01-12 21:49:43 +0000 (Tue, 12 Jan 2010)

Log Message:
-----------
SCI: implemented mouse interaction while being in keyboard mode, also ignore disabled entries/separator lines within mouse mode

Modified Paths:
--------------
    scummvm/trunk/engines/sci/graphics/menu.cpp

Modified: scummvm/trunk/engines/sci/graphics/menu.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/menu.cpp	2010-01-12 21:46:50 UTC (rev 47284)
+++ scummvm/trunk/engines/sci/graphics/menu.cpp	2010-01-12 21:49:43 UTC (rev 47285)
@@ -634,7 +634,7 @@
 	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 @@
 			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 @@
 		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:


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list