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

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Tue Jan 12 21:38:57 CET 2010


Revision: 47277
          http://scummvm.svn.sourceforge.net/scummvm/?rev=47277&view=rev
Author:   m_kiewitz
Date:     2010-01-12 20:38:57 +0000 (Tue, 12 Jan 2010)

Log Message:
-----------
SCI: interactive menu with mouse fully implemented, mouse within keyboard menu not yet done

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

Modified: scummvm/trunk/engines/sci/graphics/menu.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/menu.cpp	2010-01-12 20:26:49 UTC (rev 47276)
+++ scummvm/trunk/engines/sci/graphics/menu.cpp	2010-01-12 20:38:57 UTC (rev 47277)
@@ -561,6 +561,9 @@
 void Menu::invertMenuSelection(uint16 itemId) {
 	Common::Rect itemRect = _menuRect;
 
+	if (itemId == 0)
+		return;
+
 	itemRect.top += (itemId - 1) * _gfx->_curPort->fontHeight;
 	itemRect.bottom = itemRect.top + _gfx->_curPort->fontHeight + 1;
 	itemRect.left++; itemRect.right--;
@@ -583,20 +586,73 @@
 	GuiMenuEntry *listEntry;
 	GuiMenuList::iterator listIterator;
 	GuiMenuList::iterator listEnd = _list.end();
-	uint16 curX = 8;
+	uint16 curXstart = 8;
 
 	listIterator = _list.begin();
 	while (listIterator != listEnd) {
 		listEntry = *listIterator;
-		if (mousePosition.x >= curX && mousePosition.x < curX + listEntry->textWidth) {
+		if (mousePosition.x >= curXstart && mousePosition.x < curXstart + listEntry->textWidth) {
 			return listEntry->id;
 		}
-		curX += listEntry->textWidth;
+		curXstart += listEntry->textWidth;
 		listIterator++;
 	}
 	return 0;
 }
 
+uint16 Menu::mouseFindMenuItemSelection(Common::Point mousePosition, uint16 menuId) {
+	GuiMenuEntry *listEntry;
+	GuiMenuList::iterator listIterator;
+	GuiMenuList::iterator listEnd = _list.end();
+	uint16 curXstart = 8;
+	uint16 curXend = curXstart;
+	GuiMenuItemEntry *listItemEntry;
+	GuiMenuItemList::iterator listItemIterator;
+	GuiMenuItemList::iterator listItemEnd = _itemList.end();
+	uint16 curYstart = 10;
+	int16 maxTextWidth = 0, maxTextRightAlignedWidth = 0;
+	uint16 itemId = 0;
+
+	if (!menuId)
+		error("No menu active, but mouseFindMenuItemSelection() called");
+
+	listIterator = _list.begin();
+	while (listIterator != listEnd) {
+		listEntry = *listIterator;
+		if (listEntry->id == menuId)
+			break;
+		curXstart += listEntry->textWidth;
+		listIterator++;
+	}
+
+	if (mousePosition.x < curXstart)
+		return 0;
+
+	listItemIterator = _itemList.begin();
+	while (listItemIterator != listItemEnd) {
+		listItemEntry = *listItemIterator;
+		if (listItemEntry->menuId == menuId) {
+			curYstart += _gfx->_curPort->fontHeight;
+			// Found it
+			if ((!itemId) && (curYstart > mousePosition.y))
+				itemId = listItemEntry->id;
+			maxTextWidth = MAX<int16>(maxTextWidth, listItemEntry->textWidth);
+			maxTextRightAlignedWidth = MAX<int16>(maxTextRightAlignedWidth, listItemEntry->textRightAlignedWidth);
+		}
+
+		listItemIterator++;
+	}
+	curXend = curXstart + 16 + 4 + 2;
+	curXend += maxTextWidth + maxTextRightAlignedWidth;
+	if (!maxTextRightAlignedWidth)
+		_menuRect.right -= 5;
+
+	// Verify that horizontal position is correct
+	if (mousePosition.x >= curXend)
+		return 0;
+	return itemId;
+}
+
 GuiMenuItemEntry *Menu::interactiveWithKeyboard() {
 	sciEvent curEvent;
 	uint16 newMenuId = _curMenuId;
@@ -727,6 +783,7 @@
 	uint16 curMenuId = 0, curItemId = 0;
 	Common::Point mousePosition = _cursor->getPosition();
 	bool firstMenuChange = true;
+	GuiMenuItemEntry *curItemEntry = NULL;
 
 	calculateTextWidth();
 	_oldPort = _gfx->SetPort(_gfx->_menuPort);
@@ -745,7 +802,7 @@
 		case SCI_EVENT_MOUSE_RELEASE:
 			if ((curMenuId == 0) || (curItemId == 0))
 				return NULL;
-			break;
+			return curItemEntry;
 
 		case SCI_EVENT_NONE:
 			kernel_sleep(_event, 2500 / 1000);
@@ -760,7 +817,8 @@
 			newItemId = 0;
 		} else {
 			// Somewhere below menubar
-			// TODO: Find out if item is selected
+			newItemId = mouseFindMenuItemSelection(mousePosition, newMenuId);
+			curItemEntry = interactiveGetItem(curMenuId, newItemId, false);
 		}
 
 		if (newMenuId != curMenuId) {

Modified: scummvm/trunk/engines/sci/graphics/menu.h
===================================================================
--- scummvm/trunk/engines/sci/graphics/menu.h	2010-01-12 20:26:49 UTC (rev 47276)
+++ scummvm/trunk/engines/sci/graphics/menu.h	2010-01-12 20:38:57 UTC (rev 47277)
@@ -99,6 +99,7 @@
 	GuiMenuItemEntry *interactiveWithKeyboard();
 	GuiMenuItemEntry *interactiveWithMouse();
 	uint16 mouseFindMenuSelection(Common::Point mousePosition);
+	uint16 mouseFindMenuItemSelection(Common::Point mousePosition, uint16 menuId);
 	GuiMenuItemEntry *interactiveGetItem(uint16 menuId, uint16 itemId, bool menuChanged);
 
 	SciEvent *_event;


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