aboutsummaryrefslogtreecommitdiff
path: root/engines/neverhood/menumodule.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/neverhood/menumodule.cpp')
-rw-r--r--engines/neverhood/menumodule.cpp119
1 files changed, 114 insertions, 5 deletions
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 01fcd41d75..7e1198abd0 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -358,7 +358,7 @@ WidgetScene::WidgetScene(NeverhoodEngine *vm, Module *parentModule)
: Scene(vm, parentModule, true), _currWidget(NULL) {
}
-void WidgetScene::getMousPos(NPoint &pt) {
+void WidgetScene::getMousePos(NPoint &pt) {
pt.x = _mouseCursor->getX();
pt.y = _mouseCursor->getY();
}
@@ -397,7 +397,7 @@ void Widget::hide() {
void Widget::onClick() {
_parentScene->setCurrWidget(this);
- // TODO Somehow _parentScene->onClick(_itemID, 0);
+ // TODO _parentScene->onClick(_itemID, 0);
}
void Widget::setPosition(int16 x, int16 y) {
@@ -406,7 +406,7 @@ void Widget::setPosition(int16 x, int16 y) {
updateBounds();
}
-void Widget::refresh() {
+void Widget::refreshPosition() {
_needRefresh = true;
StaticSprite::updatePosition();
_collisionBoundsOffset.set(0, 0,
@@ -494,8 +494,117 @@ void TextLabelWidget::setString(const byte *string, int stringLen) {
_stringLen = stringLen;
}
-void TextLabelWidget::setY(int16 y) {
- _ty = y;
+void TextLabelWidget::setTY(int16 ty) {
+ _ty = ty;
+}
+
+SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+ int baseObjectPriority, int baseSurfacePriority, bool visible,
+ StringArray *savegameList, TextSurface *textSurface1, TextSurface *textSurface2, uint32 fileHash1, NRect &rect)
+ : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority, visible),
+ _savegameList(savegameList), _textSurface1(textSurface1), _textSurface2(textSurface2), _fileHash1(fileHash1), _rect(rect),
+ _maxStringLength(0), _topIndex(0), _visibleItemsCount(0), _currIndex(0) {
+
+ _maxVisibleItemsCount = (_rect.y2 - _rect.y1) / _textSurface1->getCharHeight();
+ _maxStringLength = (_rect.x2 - _rect.x1) / _textSurface1->getCharWidth();
+}
+
+void SavegameListBox::onClick() {
+ NPoint mousePos;
+ int16 w = _rect.x2 - _rect.x1, h = _rect.y2 - _rect.y1;
+ _parentScene->getMousePos(mousePos);
+ mousePos.x -= _x + _rect.x1;
+ mousePos.y -= _y + _rect.y1;
+ if (mousePos.x >= 0 && mousePos.x <= w && mousePos.y >= 0 && mousePos.y <= h) {
+ int newIndex = _topIndex + mousePos.y / _textSurface1->getCharHeight();
+ if (newIndex <= _visibleItemsCount) {
+ _currIndex = newIndex;
+ refresh();
+ _parentScene->setCurrWidget(this);
+ // TODO _parentScene->onClick(_itemID, 5);
+ }
+ }
+}
+
+void SavegameListBox::addSprite() {
+ _spriteResource.load2(_fileHash1);
+ createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+ refreshPosition();
+ _parentScene->addSprite(this);
+ _vm->_collisionMan->addSprite(this);
+ if (_visible)
+ show();
+ else
+ hide();
+ buildItems();
+ _topIndex = 0;
+ _visibleItemsCount = MIN(_maxVisibleItemsCount, (int)_textLabelItems.size());
+ refresh();
+}
+
+void SavegameListBox::buildItems() {
+ StringArray &savegameList = *_savegameList;
+ int16 itemX = _rect.x1, itemY = 0;
+ for (uint i = 0; i < savegameList.size(); ++i) {
+ const byte *string = (const byte*)savegameList[i].c_str();
+ int stringLen = (int)savegameList[i].size();
+ TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, i, _parentScene, _baseObjectPriority + 1,
+ _baseSurfacePriority + 1, _visible, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _textSurface1);
+ label->addSprite();
+ _textLabelItems.push_back(label);
+ }
+}
+
+void SavegameListBox::drawItems() {
+ for (int i = 0; i < (int)_textLabelItems.size(); ++i) {
+ TextLabelWidget *label = _textLabelItems[i];
+ if (i >= _topIndex && i <= _visibleItemsCount) {
+ label->setY(_rect.y1 + (i - _topIndex) * _textSurface1->getCharHeight());
+ label->updateBounds();
+ label->drawString(_maxStringLength);
+ } else {
+ label->clear();
+ }
+ }
+}
+
+void SavegameListBox::refresh() {
+ refreshPosition();
+ drawItems();
+}
+
+void SavegameListBox::scrollUp() {
+ if (_topIndex > 0) {
+ --_topIndex;
+ --_visibleItemsCount;
+ refresh();
+ }
+}
+
+void SavegameListBox::scrollDown() {
+ if (_visibleItemsCount < (int)_textLabelItems.size()) {
+ ++_topIndex;
+ ++_visibleItemsCount;
+ refresh();
+ }
+}
+
+void SavegameListBox::pageUp() {
+ int distance = MIN(_topIndex, _maxVisibleItemsCount);
+ if (distance > 0) {
+ _topIndex -= distance;
+ _visibleItemsCount = distance;
+ refresh();
+ }
+}
+
+void SavegameListBox::pageDown() {
+ int distance = MIN((int)_textLabelItems.size() - _visibleItemsCount - 1, _maxVisibleItemsCount);
+ if (distance > 0) {
+ _topIndex += distance;
+ _visibleItemsCount += distance;
+ refresh();
+ }
}
} // End of namespace Neverhood