diff options
Diffstat (limited to 'engines/toltecs/menu.cpp')
-rw-r--r-- | engines/toltecs/menu.cpp | 346 |
1 files changed, 183 insertions, 163 deletions
diff --git a/engines/toltecs/menu.cpp b/engines/toltecs/menu.cpp index 1d6a3113a2..55cd755eb9 100644 --- a/engines/toltecs/menu.cpp +++ b/engines/toltecs/menu.cpp @@ -39,212 +39,232 @@ namespace Toltecs { -// This code is very experimental. - -Widget::Widget(ToltecsEngine *vm, int16 x, int16 y) : _vm(vm) { - _rect.left = x; - _rect.top = y; -} - -Widget::~Widget() { -} - -void Widget::redraw() { -} - -Widget *Widget::getHoveredWidget(int mouseX, int mouseY) { - if (_rect.contains(mouseX, mouseY)) - return this; - else - return NULL; +MenuSystem::MenuSystem(ToltecsEngine *vm) : _vm(vm) { + _background = new Graphics::Surface(); + _background->create(520, 240, 1); + _currMenuID = kMenuIdNone; + _newMenuID = kMenuIdMain; + _currItemID = kItemIdNone; + _cfgText = true; + _cfgVoices = true; } -void Widget::calcDimensions() { -} - -void Widget::setRect(Common::Rect rect) { - _rect = rect; -} - -void Widget::onMouseEnter() { -} - -void Widget::onMouseLeave() { -} - -void Widget::onMouseMove(int mouseX, int mouseY) { -} - -LabelWidget::LabelWidget(ToltecsEngine *vm, int x, int y, Common::String caption, uint flags) : - Widget(vm, x, y), _caption(caption), _flags(flags), _fontColor(kFontColorMenuDefault) { - - calcDimensions(); - +MenuSystem::~MenuSystem() { + delete _background; } -LabelWidget::~LabelWidget() { -} +void MenuSystem::update() { -void LabelWidget::redraw() { - _vm->_screen->drawString(_rect.left, _rect.top, _fontColor, 14, (byte*)_caption.c_str(), -1, NULL, true); -} + if (_currMenuID != _newMenuID) { + _currMenuID = _newMenuID; + debug("_currMenuID = %d", _currMenuID); + initMenu(_currMenuID); + } -void LabelWidget::calcDimensions() { - Font font(_vm->_res->load(14)->data); - _rect.setWidth(font.getTextWidth((byte*)_caption.c_str())); - _rect.setHeight(font.getHeight()); -} + handleEvents(); -void LabelWidget::setCaption(Common::String caption) { - _caption = caption; - calcDimensions(); -} + _vm->_system->copyRectToScreen((const byte *)_vm->_screen->_frontScreen, + 640, 0, 0, 640, 400); -void LabelWidget::setFontColor(byte fontColor) { - _fontColor = fontColor; -} + _vm->_system->delayMillis(5); -void LabelWidget::onMouseEnter() { - setFontColor(kFontColorMenuActive); } -void LabelWidget::onMouseLeave() { - setFontColor(kFontColorMenuDefault); -} +void MenuSystem::handleEvents() { + Common::Event event; + Common::EventManager *eventMan = _vm->_system->getEventManager(); + while (eventMan->pollEvent(event)) { + switch (event.type) { + case Common::EVENT_KEYDOWN: + break; + case Common::EVENT_QUIT: + // TODO: quitGame(); + break; + case Common::EVENT_MOUSEMOVE: + handleMouseMove(event.mouse.x, event.mouse.y); + break; + case Common::EVENT_LBUTTONDOWN: + handleMouseClick(event.mouse.x, event.mouse.y); + break; + default: + break; + } + } -VolumeControlWidget::VolumeControlWidget(ToltecsEngine *vm, int x, int y, Common::String caption, uint flags) : - Widget(_vm, x, y), _activeWidget(NULL) { - - _label = new LabelWidget(vm, x, y, caption, flags); - _up = new LabelWidget(vm, x + 350, y + 4, "[", flags); - _down = new LabelWidget(vm, x + 350 + 24, y + 4, "]", flags); - _indicator = new LabelWidget(vm, x + 350 + 24 + 24 + 8, y, "||||||||||", flags); - - _rect.setWidth(350 + 24 + 24 + 8 + 50); - _rect.setHeight(20); - } -VolumeControlWidget::~VolumeControlWidget() { - delete _label; - delete _up; - delete _down; - delete _indicator; +void MenuSystem::addClickTextItem(ItemID id, int x, int y, int w, const byte *caption, byte defaultColor, byte activeColor) { + Item item; + item.id = id; + item.defaultColor = defaultColor; + item.activeColor = activeColor; + item.x = x; + item.y = y; + item.w = w; + setItemCaption(&item, caption); + _items.push_back(item); } -void VolumeControlWidget::redraw() { - _label->redraw(); - _up->redraw(); - _down->redraw(); - _indicator->redraw(); +void MenuSystem::drawItem(ItemID itemID, bool active) { + Item *item = getItem(itemID); + if (item) { + byte color = active ? item->activeColor : item->defaultColor; + drawString(item->rect.left, item->rect.top, 0, color, (byte*)item->caption.c_str()); + } } -Widget *VolumeControlWidget::getHoveredWidget(int mouseX, int mouseY) { - return Widget::getHoveredWidget(mouseX, mouseY); +void MenuSystem::handleMouseMove(int x, int y) { + ItemID newItemID = findItemAt(x, y); + if (_currItemID != newItemID) { + leaveItem(_currItemID); + _currItemID = newItemID; + enterItem(newItemID); + } } -void VolumeControlWidget::calcDimensions() { +void MenuSystem::handleMouseClick(int x, int y) { + ItemID id = findItemAt(x, y); + clickItem(id); } -void VolumeControlWidget::onMouseEnter() { - _label->setFontColor(kFontColorMenuActive); - _indicator->setFontColor(kFontColorMenuActive); - _activeWidget = NULL; +ItemID MenuSystem::findItemAt(int x, int y) { + for (Common::Array<Item>::iterator iter = _items.begin(); iter != _items.end(); iter++) { + if ((*iter).rect.contains(x, y)) + return (*iter).id; + } + return kItemIdNone; } -void VolumeControlWidget::onMouseLeave() { - _label->setFontColor(kFontColorMenuDefault); - _up->setFontColor(kFontColorMenuDefault); - _down->setFontColor(kFontColorMenuDefault); - _indicator->setFontColor(kFontColorMenuDefault); +MenuSystem::Item *MenuSystem::getItem(ItemID id) { + for (Common::Array<Item>::iterator iter = _items.begin(); iter != _items.end(); iter++) { + if ((*iter).id == id) + return &(*iter); + } + return NULL; } -void VolumeControlWidget::onMouseMove(int mouseX, int mouseY) { - - Widget *hoveredWidget = NULL; - - hoveredWidget = _up->getHoveredWidget(mouseX, mouseY); - if (!hoveredWidget) - hoveredWidget = _down->getHoveredWidget(mouseX, mouseY); +void MenuSystem::setItemCaption(Item *item, const byte *caption) { + Font font(_vm->_res->load(kFontResourceIndex)->data); + int width = font.getTextWidth((byte*)caption); + int height = font.getHeight(); + item->rect = Common::Rect(item->x, item->y, item->x + width, item->y + height); + if (item->w) { + item->rect.translate(item->w - width / 2, 0); + debug("item->rect.width() = %d", item->rect.width()); + } + item->caption = (const char*)caption; +} + +void MenuSystem::initMenu(MenuID menuID) { + + _items.clear(); + + switch (menuID) { + case kMenuIdMain: + drawString(0, 74, 320, 229, (byte*)"What can I do for you?"); + addClickTextItem(kItemIdLoad, 0, 115, 320, (const byte*)"LOAD", kFontColorMenuDefault, kFontColorMenuActive); + addClickTextItem(kItemIdSave, 0, 135, 320, (const byte*)"SAVE", kFontColorMenuDefault, kFontColorMenuActive); + addClickTextItem(kItemIdToggleText, 0, 165, 320, (const byte*)"TEXT ON", kFontColorMenuDefault, kFontColorMenuActive); + addClickTextItem(kItemIdToggleVoices, 0, 185, 320, (const byte*)"VOICES ON", kFontColorMenuDefault, kFontColorMenuActive); + addClickTextItem(kItemIdVolumesMenu, 0, 215, 320, (const byte*)"VOLUME", kFontColorMenuDefault, kFontColorMenuActive); + addClickTextItem(kItemIdPlay, 0, 245, 320, (const byte*)"PLAY", kFontColorMenuDefault, kFontColorMenuActive); + addClickTextItem(kItemIdQuit, 0, 275, 320, (const byte*)"QUIT", kFontColorMenuDefault, kFontColorMenuActive); + break; + case kMenuIdVolumes: + addClickTextItem(kItemIdCancel, 0, 275, 440, (const byte*)"CANCEL", kFontColorMenuDefault, 253); + addClickTextItem(kItemIdCancel, 0, 275, 440, (const byte*)"CANCEL", kFontColorMenuDefault, 253); + break; + default: + break; + } - if (_activeWidget != hoveredWidget) { - _activeWidget = hoveredWidget; - if (!_activeWidget) { - _up->setFontColor(kFontColorMenuDefault); - _down->setFontColor(kFontColorMenuDefault); - } else if (_activeWidget == _up) { - _up->setFontColor(kFontColorMenuActive); - _down->setFontColor(kFontColorMenuDefault); - } else if (_activeWidget == _down) { - _up->setFontColor(kFontColorMenuDefault); - _down->setFontColor(kFontColorMenuActive); - } + for (Common::Array<Item>::iterator iter = _items.begin(); iter != _items.end(); iter++) { + drawItem((*iter).id, false); } } -MenuPage::MenuPage(Common::String caption) { +void MenuSystem::enterItem(ItemID id) { + drawItem(id, true); +} + +void MenuSystem::leaveItem(ItemID id) { + drawItem(id, false); +} + +void MenuSystem::clickItem(ItemID id) { + Item *item = getItem(id); + switch (id) { + // Main menu + case kItemIdSave: + debug("kItemIdSave"); + break; + case kItemIdLoad: + debug("kItemIdLoad"); + break; + case kItemIdToggleText: + setCfgText(!_cfgText, true); + break; + case kItemIdToggleVoices: + setCfgVoices(!_cfgVoices, true); + break; + case kItemIdVolumesMenu: + debug("kItemIdVolumesMenu"); + _newMenuID = kMenuIdVolumes; + break; + case kItemIdPlay: + debug("kItemIdPlay"); + break; + case kItemIdQuit: + debug("kItemIdQuit"); + break; + // Volumes menu + case kItemIdCancel: + _newMenuID = kMenuIdMain; + break; + // Save/Load menu + default: + break; + } } -MenuPage::~MenuPage() { - // TODO: Delete widgets +void MenuSystem::saveBackground() { } -void MenuPage::addWidget(Widget *widget) { - _widgets.push_back(widget); +void MenuSystem::restoreBackground() { } -void MenuPage::redraw() { - for (WidgetArray::iterator iter = _widgets.begin(); iter != _widgets.end(); iter++) { - (*iter)->redraw(); +void MenuSystem::drawString(int16 x, int16 y, int w, byte color, byte *text) { + if (w) { + Font font(_vm->_res->load(kFontResourceIndex)->data); + x = x + w - font.getTextWidth(text) / 2; } -} - -Widget *MenuPage::getHoveredWidget(int mouseX, int mouseY) { - Widget *hoveredWidget = NULL; - for (WidgetArray::iterator iter = _widgets.begin(); iter != _widgets.end() && !hoveredWidget; iter++) { - hoveredWidget = (*iter)->getHoveredWidget(mouseX, mouseY); + _vm->_screen->drawString(x, y, color, kFontResourceIndex, text, -1, NULL, true); +} + +void MenuSystem::setCfgText(bool value, bool active) { + if (_cfgText != value) { + Item *item = getItem(kItemIdToggleText); + _cfgText = value; + if (_cfgText) + setItemCaption(item, (const byte*)"TEXT ON"); + else + setItemCaption(item, (const byte*)"TEXT OFF"); + drawItem(kItemIdToggleText, true); } - return hoveredWidget; } -MenuSystem::MenuSystem(ToltecsEngine *vm) : _vm(vm), _activeWidget(NULL), _oldMouseX(-1), _oldMouseY(-1) { - _page = new MenuPage("Welcome"); - _page->addWidget(new LabelWidget(_vm, 10, 10, "Load game", 0)); - _page->addWidget(new LabelWidget(_vm, 10, 35, "Save game", 0)); - _page->addWidget(new VolumeControlWidget(_vm, 10, 60, "Master volume", 0)); - _page->addWidget(new VolumeControlWidget(_vm, 10, 90, "Some other volume", 0)); -} - -MenuSystem::~MenuSystem() { - delete _page; -} - -void MenuSystem::update() { - - _page->redraw(); - - if (_vm->_mouseX != _oldMouseX || _vm->_mouseY != _oldMouseY) { - - _oldMouseX = _vm->_mouseX; - _oldMouseY = _vm->_mouseY; - - Widget *hoveredWidget = _page->getHoveredWidget(_vm->_mouseX, _vm->_mouseY); - if (_activeWidget != hoveredWidget) { - if (_activeWidget) - _activeWidget->onMouseLeave(); - if (hoveredWidget) - hoveredWidget->onMouseEnter(); - _activeWidget = hoveredWidget; - } - - if (_activeWidget) { - _activeWidget->onMouseMove(_vm->_mouseX, _vm->_mouseY); - } - +void MenuSystem::setCfgVoices(bool value, bool active) { + if (_cfgVoices != value) { + Item *item = getItem(kItemIdToggleVoices); + _cfgVoices = value; + if (_cfgVoices) + setItemCaption(item, (const byte*)"VOICES ON"); + else + setItemCaption(item, (const byte*)"VOICES OFF"); + drawItem(kItemIdToggleVoices, true); } - } } // End of namespace Toltecs |