aboutsummaryrefslogtreecommitdiff
path: root/engines/toltecs
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
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')
-rw-r--r--engines/toltecs/menu.cpp346
-rw-r--r--engines/toltecs/menu.h137
2 files changed, 250 insertions, 233 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
diff --git a/engines/toltecs/menu.h b/engines/toltecs/menu.h
index 2ea9e1d270..9cb839ad7b 100644
--- a/engines/toltecs/menu.h
+++ b/engines/toltecs/menu.h
@@ -46,74 +46,35 @@
namespace Toltecs {
-const byte kFontColorMenuDefault = 229;
-const byte kFontColorMenuActive = 255;
-
-class Widget {
-public:
- Widget(ToltecsEngine *vm, int16 x, int16 y);
- virtual ~Widget();
- virtual void redraw();
- virtual Widget *getHoveredWidget(int mouseX, int mouseY);
- virtual void calcDimensions();
- void setRect(Common::Rect rect);
- //virtual void setHilighted(bool active);
- virtual void onMouseEnter();
- virtual void onMouseLeave();
- virtual void onMouseMove(int mouseX, int mouseY);
-protected:
- ToltecsEngine *_vm;
- Common::Rect _rect;
- //bool _hilighted;
+const byte kFontColorMenuDefault = 229;
+const byte kFontColorMenuActive = 255;
+const uint kFontResourceIndex = 13;
+
+enum MenuID {
+ kMenuIdNone,
+ kMenuIdMain,
+ kMenuIdSave,
+ kMenuIdLoad,
+ kMenuIdVolumes
};
-const int kLabelCentered = 1 << 1;
-const int kLabelHideOnMovie = 1 << 2;
-
-class LabelWidget : public Widget {
-public:
- LabelWidget(ToltecsEngine *vm, int x, int y, Common::String caption, uint flags);
- ~LabelWidget();
- void redraw();
- void calcDimensions();
- void setCaption(Common::String caption);
- void setFontColor(byte fontColor);
- void onMouseEnter();
- void onMouseLeave();
-protected:
- Common::String _caption;
- uint _flags;
- byte _fontColor;
-};
-
-class VolumeControlWidget : public Widget {
-public:
- VolumeControlWidget(ToltecsEngine *vm, int x, int y, Common::String caption, uint flags);
- ~VolumeControlWidget();
- void redraw();
- Widget *getHoveredWidget(int mouseX, int mouseY);
- void calcDimensions();
- //void setHilighted(bool active);
- void onMouseEnter();
- void onMouseLeave();
- void onMouseMove(int mouseX, int mouseY);
-protected:
- uint _flags;
- LabelWidget *_label, *_up, *_down, *_indicator;
- Widget *_activeWidget;
-};
-
-class MenuPage {
-public:
- MenuPage(Common::String caption);
- ~MenuPage();
- void addWidget(Widget *widget);
- void redraw();
- Widget *getHoveredWidget(int mouseX, int mouseY);
-protected:
- typedef Common::Array<Widget*> WidgetArray;
- Common::String _caption;
- WidgetArray _widgets;
+enum ItemID {
+ kItemIdNone,
+ // Main menu
+ kItemIdSave,
+ kItemIdLoad,
+ kItemIdToggleText,
+ kItemIdToggleVoices,
+ kItemIdVolumesMenu,
+ kItemIdPlay,
+ kItemIdQuit,
+ // Volumes menu
+ // TODO: Up/down buttons
+ kItemIdDone,
+ kItemIdCancel,
+ // Save/load menu
+ // TODO
+ kMenuIdDummy
};
class MenuSystem {
@@ -123,15 +84,51 @@ public:
~MenuSystem();
void update();
+ void handleEvents();
protected:
+
+ struct Item {
+ Common::Rect rect;
+ ItemID id;
+ //const byte *caption;
+ Common::String caption;
+ byte defaultColor, activeColor;
+ int x, y, w;
+ };
+
ToltecsEngine *_vm;
+ Graphics::Surface *_background;
+
+ MenuID _currMenuID, _newMenuID;
+ ItemID _currItemID;
+
+ Common::Array<Item> _items;
+
+ bool _cfgText, _cfgVoices;
+
+ void addClickTextItem(ItemID id, int x, int y, int w, const byte *caption, byte defaultColor, byte activeColor);
+
+ void drawItem(ItemID itemID, bool active);
+ void handleMouseMove(int x, int y);
+ void handleMouseClick(int x, int y);
+
+ ItemID findItemAt(int x, int y);
+ Item *getItem(ItemID id);
+ void setItemCaption(Item *item, const byte *caption);
- //LabelWidget *label1, *label2;
- MenuPage *_page;
+ void initMenu(MenuID menuID);
+
+ void enterItem(ItemID id);
+ void leaveItem(ItemID id);
+ void clickItem(ItemID id);
- Widget *_activeWidget;
- int16 _oldMouseX, _oldMouseY;
+ void saveBackground();
+ void restoreBackground();
+ void drawString(int16 x, int16 y, int w, byte color, byte *text);
+
+ void setCfgText(bool value, bool active);
+ void setCfgVoices(bool value, bool active);
};