aboutsummaryrefslogtreecommitdiff
path: root/engines/toltecs/menu.cpp
diff options
context:
space:
mode:
authorBenjamin Haisch2009-12-09 07:43:36 +0000
committerWillem Jan Palenstijn2011-11-20 22:43:08 +0100
commit284c358f7cab64b112770d66c090cb879897504e (patch)
treeafb0cbcec78a268881edfe51b0abe2b1fc4e05f0 /engines/toltecs/menu.cpp
parentd93bd3c01c3952649c69091e8bf516880bce053b (diff)
downloadscummvm-rg350-284c358f7cab64b112770d66c090cb879897504e.tar.gz
scummvm-rg350-284c358f7cab64b112770d66c090cb879897504e.tar.bz2
scummvm-rg350-284c358f7cab64b112770d66c090cb879897504e.zip
TOLTECS: Started implementing the menu from scratch
Diffstat (limited to 'engines/toltecs/menu.cpp')
-rw-r--r--engines/toltecs/menu.cpp346
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