[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