diff options
-rw-r--r-- | engines/sci/gui/gui.cpp | 6 | ||||
-rw-r--r-- | engines/sci/gui/gui.h | 2 | ||||
-rw-r--r-- | engines/sci/gui/gui_menu.cpp | 77 | ||||
-rw-r--r-- | engines/sci/gui/gui_menu.h | 23 |
4 files changed, 92 insertions, 16 deletions
diff --git a/engines/sci/gui/gui.cpp b/engines/sci/gui/gui.cpp index e6b3bf422b..18ef57f9fd 100644 --- a/engines/sci/gui/gui.cpp +++ b/engines/sci/gui/gui.cpp @@ -62,7 +62,7 @@ SciGui::SciGui(EngineState *state, SciGuiScreen *screen, SciGuiPalette *palette, _text = new SciGuiText(_s->resMan, _gfx, _screen); _windowMgr = new SciGuiWindowMgr(this, _screen, _gfx, _text); _controls = new SciGuiControls(_s->_segMan, _gfx, _text); - _menu = new SciGuiMenu(_gfx, _text, _screen); + _menu = new SciGuiMenu(_s->_segMan, _gfx, _text, _screen); // _gui32 = new SciGui32(_s, _screen, _palette, _cursor); // for debug purposes } @@ -314,8 +314,8 @@ void SciGui::drawMenuBar(bool clear) { } } -void SciGui::menuAdd(Common::String title, Common::String content, reg_t entriesBase) { - _menu->add(title, content); +void SciGui::menuAdd(Common::String title, Common::String content, reg_t contentVmPtr) { + _menu->add(title, content, contentVmPtr); } void SciGui::menuSet(uint16 menuId, uint16 itemId, uint16 attributeId, reg_t value) { diff --git a/engines/sci/gui/gui.h b/engines/sci/gui/gui.h index 008aae1c92..13756f37ae 100644 --- a/engines/sci/gui/gui.h +++ b/engines/sci/gui/gui.h @@ -81,7 +81,7 @@ public: virtual void drawStatus(const char *text, int16 colorPen, int16 colorBack); virtual void drawMenuBar(bool clear); - virtual void menuAdd(Common::String title, Common::String content, reg_t entriesBase); + virtual void menuAdd(Common::String title, Common::String content, reg_t contentVmPtr); virtual void menuSet(uint16 menuId, uint16 itemId, uint16 attributeId, reg_t value); virtual reg_t menuGet(uint16 menuId, uint16 itemId, uint16 attributeId); virtual reg_t menuSelect(reg_t eventObject); diff --git a/engines/sci/gui/gui_menu.cpp b/engines/sci/gui/gui_menu.cpp index 737e90f35e..7c81b8a017 100644 --- a/engines/sci/gui/gui_menu.cpp +++ b/engines/sci/gui/gui_menu.cpp @@ -37,14 +37,16 @@ namespace Sci { -SciGuiMenu::SciGuiMenu(SciGuiGfx *gfx, SciGuiText *text, SciGuiScreen *screen) - : _gfx(gfx), _text(text), _screen(screen) { +SciGuiMenu::SciGuiMenu(SegManager *segMan, SciGuiGfx *gfx, SciGuiText *text, SciGuiScreen *screen) + : _segMan(segMan), _gfx(gfx), _text(text), _screen(screen) { + + _listCount = 0; } SciGuiMenu::~SciGuiMenu() { } -void SciGuiMenu::add(Common::String title, Common::String content) { +void SciGuiMenu::add(Common::String title, Common::String content, reg_t contentVmPtr) { GuiMenuEntry *menuEntry; uint16 itemCount = 0; GuiMenuItemEntry *itemEntry; @@ -166,6 +168,8 @@ void SciGuiMenu::add(Common::String title, Common::String content) { } else { itemEntry->text = Common::String(content.c_str() + beginPos, tempPos - beginPos); } + itemEntry->textVmPtr = contentVmPtr; + itemEntry->textVmPtr.offset += beginPos; if (rightAlignedPos) { rightAlignedPos++; @@ -188,11 +192,76 @@ void SciGuiMenu::add(Common::String title, Common::String content) { } while (curPos < contentSize); } +GuiMenuItemEntry *SciGuiMenu::findItem(uint16 menuId, uint16 itemId) { + GuiMenuItemList::iterator listIterator; + GuiMenuItemList::iterator listEnd = _itemList.end(); + GuiMenuItemEntry *listEntry; + + listIterator = _itemList.begin(); + while (listIterator != listEnd) { + listEntry = *listIterator; + if ((listEntry->menuId == menuId) && (listEntry->id == itemId)) + return listEntry; + + listIterator++; + } + return NULL; +} + void SciGuiMenu::setAttribute(uint16 menuId, uint16 itemId, uint16 attributeId, reg_t value) { - warning("setAttr: %d %d %d", menuId, itemId, attributeId); + GuiMenuItemEntry *itemEntry = findItem(menuId, itemId); + if (!itemEntry) + error("Tried to setAttribute() on non-existant menu-item %d:%d", menuId, itemId); + switch (attributeId) { + case SCI_MENU_ATTRIBUTE_ENABLED: + itemEntry->enabled = value.isNull() ? false : true; + break; + case SCI_MENU_ATTRIBUTE_SAID: + itemEntry->said = _segMan->getString(value); + itemEntry->saidVmPtr = value; + break; + case SCI_MENU_ATTRIBUTE_TEXT: + itemEntry->text = _segMan->getString(value); + itemEntry->textVmPtr = value; + break; + case SCI_MENU_ATTRIBUTE_KEYPRESS: + itemEntry->keyPress = value.offset; + itemEntry->keyModifier = 0; + // TODO: Find out how modifier is handled + printf("setAttr keypress %X %X\n", value.segment, value.offset); + break; + case SCI_MENU_ATTRIBUTE_TAG: + itemEntry->tag = value.offset; + break; + default: + error("setAttribute() called with unsupported attributeId %X", attributeId); + } } reg_t SciGuiMenu::getAttribute(uint16 menuId, uint16 itemId, uint16 attributeId) { + GuiMenuItemEntry *itemEntry = findItem(menuId, itemId); + if (!itemEntry) + error("Tried to getAttribute() on non-existant menu-item %d:%d", menuId, itemId); + switch (attributeId) { + case SCI_MENU_ATTRIBUTE_ENABLED: + if (itemEntry->enabled) + return make_reg(0, 1); + break; + case SCI_MENU_ATTRIBUTE_SAID: + return itemEntry->saidVmPtr; + break; + case SCI_MENU_ATTRIBUTE_TEXT: + return itemEntry->textVmPtr; + break; + case SCI_MENU_ATTRIBUTE_KEYPRESS: + // TODO: Find out how modifier is handled + return make_reg(0, itemEntry->keyPress); + break; + case SCI_MENU_ATTRIBUTE_TAG: + return make_reg(0, itemEntry->tag); + default: + error("setAttribute() called with unsupported attributeId %X", attributeId); + } return NULL_REG; } diff --git a/engines/sci/gui/gui_menu.h b/engines/sci/gui/gui_menu.h index 32fbbbaf9a..c511ea7c95 100644 --- a/engines/sci/gui/gui_menu.h +++ b/engines/sci/gui/gui_menu.h @@ -31,7 +31,7 @@ namespace Sci { enum { SCI_MENU_ATTRIBUTE_SAID = 0x6d, SCI_MENU_ATTRIBUTE_TEXT = 0x6e, - SCI_MENU_ATTRIBUTE_KEY = 0x6f, + SCI_MENU_ATTRIBUTE_KEYPRESS = 0x6f, SCI_MENU_ATTRIBUTE_ENABLED = 0x70, SCI_MENU_ATTRIBUTE_TAG = 0x71 }; @@ -46,8 +46,8 @@ struct GuiMenuEntry { uint16 id; Common::String text; - GuiMenuEntry(uint16 id_) - : id(id_) { } + GuiMenuEntry(uint16 curId) + : id(curId) { } }; typedef Common::List<GuiMenuEntry *> GuiMenuList; @@ -60,28 +60,35 @@ struct GuiMenuItemEntry { uint16 keyModifier; bool separatorLine; Common::String said; + reg_t saidVmPtr; Common::String text; + reg_t textVmPtr; Common::String textRightAligned; - GuiMenuItemEntry(uint16 menuId_, uint16 id_) - : menuId(menuId_), id(id_), - enabled(true), tag(0), keyPress(0), keyModifier(0), separatorLine(false) { } + GuiMenuItemEntry(uint16 curMenuId, uint16 curId) + : menuId(curMenuId), id(curId), + enabled(true), tag(0), keyPress(0), keyModifier(0), separatorLine(false) { + saidVmPtr = NULL_REG; + textVmPtr = NULL_REG; + } }; typedef Common::List<GuiMenuItemEntry *> GuiMenuItemList; class SciGuiMenu { public: - SciGuiMenu(SciGuiGfx *gfx, SciGuiText *text, SciGuiScreen *screen); + SciGuiMenu(SegManager *segMan, SciGuiGfx *gfx, SciGuiText *text, SciGuiScreen *screen); ~SciGuiMenu(); - void add(Common::String title, Common::String content); + void add(Common::String title, Common::String content, reg_t contentVmPtr); void setAttribute(uint16 menuId, uint16 itemId, uint16 attributeId, reg_t value); reg_t getAttribute(uint16 menuId, uint16 itemId, uint16 attributeId); void drawBar(); private: + GuiMenuItemEntry *findItem(uint16 menuId, uint16 itemId); + SegManager *_segMan; SciGuiGfx *_gfx; SciGuiText *_text; SciGuiScreen *_screen; |