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

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Wed Nov 11 21:29:39 CET 2009


Revision: 45840
          http://scummvm.svn.sourceforge.net/scummvm/?rev=45840&view=rev
Author:   m_kiewitz
Date:     2009-11-11 20:29:39 +0000 (Wed, 11 Nov 2009)

Log Message:
-----------
SCI/newgui: separator line support for menu, also fixed item adjustment

Modified Paths:
--------------
    scummvm/trunk/engines/sci/gui/gui_menu.cpp
    scummvm/trunk/engines/sci/gui/gui_menu.h

Modified: scummvm/trunk/engines/sci/gui/gui_menu.cpp
===================================================================
--- scummvm/trunk/engines/sci/gui/gui_menu.cpp	2009-11-11 20:08:55 UTC (rev 45839)
+++ scummvm/trunk/engines/sci/gui/gui_menu.cpp	2009-11-11 20:29:39 UTC (rev 45840)
@@ -396,7 +396,7 @@
 	return NULL_REG;
 }
 
-GuiMenuItemEntry *SciGuiMenu::interactiveGetItem(uint16 menuId, uint16 itemId) {
+GuiMenuItemEntry *SciGuiMenu::interactiveGetItem(uint16 menuId, uint16 itemId, bool menuChanged) {
 	GuiMenuItemList::iterator itemIterator = _itemList.begin();
 	GuiMenuItemList::iterator itemEnd = _itemList.end();
 	GuiMenuItemEntry *itemEntry;
@@ -420,7 +420,7 @@
 		}
 		itemIterator++;
 	}
-	if (itemId == 0)
+	if ((itemId == 0) || (menuChanged))
 		return lastItemEntry;
 	return firstItemEntry;
 }
@@ -435,6 +435,7 @@
 	uint16 listNr = 0;
 	int16 maxTextWidth = 0, maxTextRightAlignedWidth = 0;
 	int16 topPos;
+	Common::Point pixelPos;
 
 	// Remove menu, if one is displayed
 	if (!_menuSaveHandle.isNull()) {
@@ -484,10 +485,20 @@
 	while (listItemIterator != listItemEnd) {
 		listItemEntry = *listItemIterator;
 		if (listItemEntry->menuId == menuId) {
-			_gfx->MoveTo(_menuRect.left, topPos);
-			_text->Draw_String(listItemEntry->text.c_str());
-			_gfx->MoveTo(_menuRect.right - listItemEntry->textRightAlignedWidth - 3, topPos);
-			_text->Draw_String(listItemEntry->textRightAligned.c_str());
+			if (!listItemEntry->separatorLine) {
+				_gfx->MoveTo(_menuRect.left, topPos);
+				_text->Draw_String(listItemEntry->text.c_str());
+				_gfx->MoveTo(_menuRect.right - listItemEntry->textRightAlignedWidth - 3, topPos);
+				_text->Draw_String(listItemEntry->textRightAligned.c_str());
+			} else {
+				// We dont 100% follow sierra here, we draw the line from left to right. Looks better
+				pixelPos.y = topPos + (_gfx->_curPort->fontHeight >> 1);
+				pixelPos.x = _menuRect.left - 7;
+				while (pixelPos.x < (_menuRect.right - 1)) {
+					_screen->putPixel(pixelPos.x, pixelPos.y, SCI_SCREEN_MASK_VISUAL, 0, 0, 0);
+					pixelPos.x += 2;
+				}
+			}
 			topPos += _gfx->_curPort->fontHeight;
 		}
 		listItemIterator++;
@@ -534,31 +545,35 @@
 
 		switch (curEvent.type) {
 		case SCI_EVT_KEYBOARD:
-			switch (curEvent.data) {
-			case SCI_K_ESC:
-				_curMenuId = curItemEntry->menuId; _curItemId = curItemEntry->id;
-				return NULL;
-			case SCI_K_ENTER:
-				_curMenuId = curItemEntry->menuId; _curItemId = curItemEntry->id;
-				return curItemEntry;
-			case SCI_K_LEFT:
-				newMenuId--;
-				break;
-			case SCI_K_RIGHT:
-				newMenuId++;
-				break;
-			case SCI_K_UP:
-				newItemId--;
-				break;
-			case SCI_K_DOWN:
-				newItemId++;
-				break;
-			}
+			do {
+				switch (curEvent.data) {
+				case SCI_K_ESC:
+					_curMenuId = curItemEntry->menuId; _curItemId = curItemEntry->id;
+					return NULL;
+				case SCI_K_ENTER:
+					_curMenuId = curItemEntry->menuId; _curItemId = curItemEntry->id;
+					return curItemEntry;
+				case SCI_K_LEFT:
+					newMenuId--;
+					break;
+				case SCI_K_RIGHT:
+					newMenuId++;
+					break;
+				case SCI_K_UP:
+					newItemId--;
+					break;
+				case SCI_K_DOWN:
+					newItemId++;
+					break;
+				}
+				if ((newMenuId != curItemEntry->menuId) || (newItemId != curItemEntry->id)) {
+					// Selection changed, fix up new selection if required
+					newItemEntry = interactiveGetItem(newMenuId, newItemId, newMenuId != curItemEntry->menuId);
+					newMenuId = newItemEntry->menuId; newItemId = newItemEntry->id;
+				}
+			} while (newItemEntry->separatorLine);
 			if ((newMenuId != curItemEntry->menuId) || (newItemId != curItemEntry->id)) {
-				// Selection changed, fix up new selection if required and paint old and new
-				newItemEntry = interactiveGetItem(newMenuId, newItemId);
-				newMenuId = newItemEntry->menuId; newItemId = newItemEntry->id;
-
+				// paint old and new
 				if (newMenuId != curItemEntry->menuId) {
 					// Menu changed, remove cur menu and paint new menu
 					drawMenu(newMenuId);

Modified: scummvm/trunk/engines/sci/gui/gui_menu.h
===================================================================
--- scummvm/trunk/engines/sci/gui/gui_menu.h	2009-11-11 20:08:55 UTC (rev 45839)
+++ scummvm/trunk/engines/sci/gui/gui_menu.h	2009-11-11 20:29:39 UTC (rev 45840)
@@ -97,7 +97,7 @@
 	void invertMenuSelection(uint16 itemId);
 	GuiMenuItemEntry *interactiveWithKeyboard();
 	GuiMenuItemEntry *interactiveWithMouse();
-	GuiMenuItemEntry *interactiveGetItem(uint16 menuId, uint16 itemId);
+	GuiMenuItemEntry *interactiveGetItem(uint16 menuId, uint16 itemId, bool menuChanged);
 
 	GfxState *_gfxstate;
 	SegManager *_segMan;


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