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

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Wed Nov 4 22:03:57 CET 2009


Revision: 45674
          http://scummvm.svn.sourceforge.net/scummvm/?rev=45674&view=rev
Author:   m_kiewitz
Date:     2009-11-04 21:03:57 +0000 (Wed, 04 Nov 2009)

Log Message:
-----------
SCI/newgui: select() implemented (interactive modes not done yet)

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

Modified: scummvm/trunk/engines/sci/gui/gui.cpp
===================================================================
--- scummvm/trunk/engines/sci/gui/gui.cpp	2009-11-04 16:16:55 UTC (rev 45673)
+++ scummvm/trunk/engines/sci/gui/gui.cpp	2009-11-04 21:03:57 UTC (rev 45674)
@@ -62,7 +62,7 @@
 	_text = new SciGuiText(_s->resMan, _gfx, _screen);
 	_windowMgr = new SciGuiWindowMgr(this, _screen, _gfx, _text);
 	_controls = new SciGuiControls(_s->_segMan, _gfx, _text);
-	_menu = new SciGuiMenu(_s->_segMan, _gfx, _text, _screen);
+	_menu = new SciGuiMenu(_s->_segMan, _gfx, _text, _screen, _cursor);
 //  	_gui32 = new SciGui32(_s, _screen, _palette, _cursor); // for debug purposes
 }
 

Modified: scummvm/trunk/engines/sci/gui/gui_menu.cpp
===================================================================
--- scummvm/trunk/engines/sci/gui/gui_menu.cpp	2009-11-04 16:16:55 UTC (rev 45673)
+++ scummvm/trunk/engines/sci/gui/gui_menu.cpp	2009-11-04 21:03:57 UTC (rev 45674)
@@ -30,6 +30,7 @@
 #include "sci/sci.h"
 #include "sci/engine/state.h"
 #include "sci/gui/gui_gfx.h"
+#include "sci/gui/gui_cursor.h"
 #include "sci/gui/gui_font.h"
 #include "sci/gui/gui_text.h"
 #include "sci/gui/gui_screen.h"
@@ -37,8 +38,8 @@
 
 namespace Sci {
 
-SciGuiMenu::SciGuiMenu(SegManager *segMan, SciGuiGfx *gfx, SciGuiText *text, SciGuiScreen *screen)
-	: _segMan(segMan), _gfx(gfx), _text(text), _screen(screen) {
+SciGuiMenu::SciGuiMenu(SegManager *segMan, SciGuiGfx *gfx, SciGuiText *text, SciGuiScreen *screen, SciGuiCursor *cursor)
+	: _segMan(segMan), _gfx(gfx), _text(text), _screen(screen), _cursor(cursor) {
 
 	_listCount = 0;
 }
@@ -225,7 +226,7 @@
 		itemEntry->textVmPtr = value;
 		break;
 	case SCI_MENU_ATTRIBUTE_KEYPRESS:
-		itemEntry->keyPress = value.offset;
+		itemEntry->keyPress = tolower(value.offset);
 		itemEntry->keyModifier = 0;
 		// TODO: Find out how modifier is handled
 		printf("setAttr keypress %X %X\n", value.segment, value.offset);
@@ -282,7 +283,86 @@
 	_gfx->BitsShow(_gfx->_menuRect);
 }
 
+void SciGuiMenu::calculateTextWidth() {
+	GuiMenuList::iterator menuIterator;
+	GuiMenuList::iterator menuEnd = _list.end();
+	GuiMenuEntry *menuEntry;
+	GuiMenuItemList::iterator itemIterator;
+	GuiMenuItemList::iterator itemEnd = _itemList.end();
+	GuiMenuItemEntry *itemEntry;
+	int16 dummyHeight;
+
+	menuIterator = _list.begin();
+	while (menuIterator != menuEnd) {
+		menuEntry = *menuIterator;
+		_text->StringWidth(menuEntry->text.c_str(), 0, menuEntry->textWidth, dummyHeight);
+
+		menuIterator++;
+	}
+
+	itemIterator = _itemList.begin();
+	while (itemIterator != itemEnd) {
+		itemEntry = *itemIterator;
+		_text->StringWidth(itemEntry->text.c_str(), 0, itemEntry->textWidth, dummyHeight);
+
+		itemIterator++;
+	}
+}
+
+GuiMenuItemEntry *SciGuiMenu::interactiveWithKeyboard() {
+	calculateTextWidth();
+
+	return NULL;
+}
+
+GuiMenuItemEntry *SciGuiMenu::interactiveWithMouse() {
+	calculateTextWidth();
+
+	return NULL;
+}
+
 reg_t SciGuiMenu::select(reg_t eventObject) {
+	int16 eventType = GET_SEL32V(_segMan, eventObject, type);
+	int16 keyPress = GET_SEL32V(_segMan, eventObject, message);
+	int16 keyModifier = GET_SEL32V(_segMan, eventObject, modifiers);
+	Common::Point mousePosition;
+	GuiMenuItemList::iterator itemIterator = _itemList.begin();
+	GuiMenuItemList::iterator itemEnd = _itemList.end();
+	GuiMenuItemEntry *itemEntry = NULL;
+	bool forceClaimed = false;
+
+	switch (eventType) {
+	case SCI_EVT_KEYBOARD:
+		if (keyPress == SCI_K_ESC) {
+			itemEntry = interactiveWithKeyboard();
+			forceClaimed = true;
+		} else if (keyPress) {
+			while (itemIterator != itemEnd) {
+				itemEntry = *itemIterator;
+				if ((itemEntry->keyPress == keyPress) && (itemEntry->keyModifier == keyModifier))
+					break;
+				itemIterator++;
+			}
+			if (itemIterator == itemEnd)
+				itemEntry = NULL;
+		}
+		break;
+	case SCI_EVT_SAID:
+		break;
+	case SCI_EVT_MOUSE_PRESS:
+		mousePosition = _cursor->getPosition();
+		if (mousePosition.y < 10) {
+			itemEntry = interactiveWithMouse();
+			forceClaimed = true;
+		}
+		break;
+	}
+
+	if ((itemEntry) || (forceClaimed)) {
+		PUT_SEL32(_segMan, eventObject, claimed, make_reg(0, 1));
+	}
+	if (itemEntry)
+		return make_reg(0, (itemEntry->menuId << 8) | (itemEntry->id));
 	return NULL_REG;
 }
 

Modified: scummvm/trunk/engines/sci/gui/gui_menu.h
===================================================================
--- scummvm/trunk/engines/sci/gui/gui_menu.h	2009-11-04 16:16:55 UTC (rev 45673)
+++ scummvm/trunk/engines/sci/gui/gui_menu.h	2009-11-04 21:03:57 UTC (rev 45674)
@@ -45,9 +45,10 @@
 struct GuiMenuEntry {
 	uint16 id;
 	Common::String text;
+	int16 textWidth;
 
 	GuiMenuEntry(uint16 curId)
-	 : id(curId) { }
+	 : id(curId), textWidth(0) { }
 };
 typedef Common::List<GuiMenuEntry *> GuiMenuList;
 
@@ -63,11 +64,12 @@
 	reg_t saidVmPtr;
 	Common::String text;
 	reg_t textVmPtr;
+	int16 textWidth;
 	Common::String textRightAligned;
 
 	GuiMenuItemEntry(uint16 curMenuId, uint16 curId)
 	 : menuId(curMenuId), id(curId),
-		enabled(true), tag(0), keyPress(0), keyModifier(0), separatorLine(false) {
+		enabled(true), tag(0), keyPress(0), keyModifier(0), separatorLine(false), textWidth(0) {
 		saidVmPtr = NULL_REG;
 		textVmPtr = NULL_REG;
 	}
@@ -76,7 +78,7 @@
 
 class SciGuiMenu {
 public:
-	SciGuiMenu(SegManager *segMan, SciGuiGfx *gfx, SciGuiText *text, SciGuiScreen *screen);
+	SciGuiMenu(SegManager *segMan, SciGuiGfx *gfx, SciGuiText *text, SciGuiScreen *screen, SciGuiCursor *cursor);
 	~SciGuiMenu();
 
 	void add(Common::String title, Common::String content, reg_t contentVmPtr);
@@ -88,11 +90,15 @@
 
 private:
 	GuiMenuItemEntry *findItem(uint16 menuId, uint16 itemId);
+	void calculateTextWidth();
+	GuiMenuItemEntry *interactiveWithKeyboard();
+	GuiMenuItemEntry *interactiveWithMouse();
 
 	SegManager *_segMan;
 	SciGuiGfx *_gfx;
 	SciGuiText *_text;
 	SciGuiScreen *_screen;
+	SciGuiCursor *_cursor;
 
 	uint16 _listCount;
 	GuiMenuList _list;


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