aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2015-07-25 21:25:59 -0400
committerPaul Gilbert2015-07-25 21:25:59 -0400
commit1d16677e3571add7baefecb9ee630e2e99e8e48d (patch)
tree5c40b5a09fd570b05474f9b19fff6206fc67a172
parente754adbf776c9c591772090f59c2d9a2a63d9313 (diff)
downloadscummvm-rg350-1d16677e3571add7baefecb9ee630e2e99e8e48d.tar.gz
scummvm-rg350-1d16677e3571add7baefecb9ee630e2e99e8e48d.tar.bz2
scummvm-rg350-1d16677e3571add7baefecb9ee630e2e99e8e48d.zip
SHERLOCK: RT: Implemented rendering of Files dialog
-rw-r--r--engines/sherlock/tattoo/tattoo_user_interface.cpp11
-rw-r--r--engines/sherlock/tattoo/tattoo_user_interface.h5
-rw-r--r--engines/sherlock/tattoo/widget_base.cpp17
-rw-r--r--engines/sherlock/tattoo/widget_base.h10
-rw-r--r--engines/sherlock/tattoo/widget_files.cpp108
-rw-r--r--engines/sherlock/tattoo/widget_files.h11
6 files changed, 115 insertions, 47 deletions
diff --git a/engines/sherlock/tattoo/tattoo_user_interface.cpp b/engines/sherlock/tattoo/tattoo_user_interface.cpp
index 12d097a657..6c40323b0d 100644
--- a/engines/sherlock/tattoo/tattoo_user_interface.cpp
+++ b/engines/sherlock/tattoo/tattoo_user_interface.cpp
@@ -297,9 +297,6 @@ void TattooUserInterface::handleInput() {
case LOOK_MODE:
doLookControl();
break;
- case FILES_MODE:
- doFileControl();
- break;
default:
break;
}
@@ -542,10 +539,6 @@ void TattooUserInterface::doLookControl() {
}
}
-void TattooUserInterface::doFileControl() {
- warning("TODO: ui control (file)");
-}
-
void TattooUserInterface::displayObjectNames() {
Events &events = *_vm->_events;
Scene &scene = *_vm->_scene;
@@ -564,10 +557,6 @@ void TattooUserInterface::displayObjectNames() {
_oldArrowZone = _arrowZone;
}
-void TattooUserInterface::initFileMenu() {
- // TODO
-}
-
void TattooUserInterface::doInventory(int mode) {
People &people = *_vm->_people;
people[HOLMES].gotoStand();
diff --git a/engines/sherlock/tattoo/tattoo_user_interface.h b/engines/sherlock/tattoo/tattoo_user_interface.h
index f894e2e0be..f8c0056903 100644
--- a/engines/sherlock/tattoo/tattoo_user_interface.h
+++ b/engines/sherlock/tattoo/tattoo_user_interface.h
@@ -87,11 +87,6 @@ private:
void doVerbControl();
/**
- * Set up to display the Files menu
- */
- void initFileMenu();
-
- /**
* Free any active menu
*/
void freeMenu();
diff --git a/engines/sherlock/tattoo/widget_base.cpp b/engines/sherlock/tattoo/widget_base.cpp
index ba4aee26f3..60d057edfc 100644
--- a/engines/sherlock/tattoo/widget_base.cpp
+++ b/engines/sherlock/tattoo/widget_base.cpp
@@ -223,15 +223,18 @@ void WidgetBase::checkTabbingKeys(int numOptions) {
}
void WidgetBase::drawScrollBar(int index, int pageSize, int count) {
+ Common::Rect r(BUTTON_SIZE, _bounds.height() - 6);
+ r.moveTo(_bounds.width() - BUTTON_SIZE - 3, 3);
+ drawScrollBar(index, pageSize, count, r);
+}
+
+void WidgetBase::drawScrollBar(int index, int pageSize, int count, const Common::Rect &r) {
TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
- bool raised;
// Fill the area with transparency
- Common::Rect r(BUTTON_SIZE, _bounds.height() - 6);
- r.moveTo(_bounds.width() - BUTTON_SIZE - 3, 3);
_surface.fillRect(r, TRANSPARENCY);
- raised = ui._scrollHighlight != 1;
+ bool raised = ui._scrollHighlight != 1;
_surface.fillRect(Common::Rect(r.left + 2, r.top + 2, r.right - 2, r.top + BUTTON_SIZE - 2), INFO_MIDDLE);
ui.drawDialogRect(_surface, Common::Rect(r.left, r.top, r.left + BUTTON_SIZE, r.top + BUTTON_SIZE), raised);
@@ -269,6 +272,10 @@ void WidgetBase::drawScrollBar(int index, int pageSize, int count) {
}
void WidgetBase::handleScrollbarEvents(int index, int pageSize, int count) {
+ handleScrollbarEvents(index, pageSize, count, Common::Rect(_bounds.right - BUTTON_SIZE - 3, _bounds.top + 3, _bounds.right - 3, _bounds.bottom - 3));
+}
+
+void WidgetBase::handleScrollbarEvents(int index, int pageSize, int count, const Common::Rect &r) {
Events &events = *_vm->_events;
TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
Common::Point mousePos = events.mousePos();
@@ -282,8 +289,6 @@ void WidgetBase::handleScrollbarEvents(int index, int pageSize, int count) {
if ((!events._pressed && !events._rightReleased) || !_scroll)
return;
- Common::Rect r(_bounds.right - BUTTON_SIZE - 3, _bounds.top + 3, _bounds.right - 3, _bounds.bottom - 3);
-
// Calculate the Scroll Position bar
int barHeight = (_bounds.height() - BUTTON_SIZE * 2) * pageSize / count;
barHeight = CLIP(barHeight, BUTTON_SIZE, _bounds.height() - BUTTON_SIZE * 2);
diff --git a/engines/sherlock/tattoo/widget_base.h b/engines/sherlock/tattoo/widget_base.h
index 401dba6aed..87f513e7b8 100644
--- a/engines/sherlock/tattoo/widget_base.h
+++ b/engines/sherlock/tattoo/widget_base.h
@@ -75,11 +75,21 @@ protected:
void drawScrollBar(int index, int pageSize, int count);
/**
+ * Draw a scrollbar for the dialog in a specified area
+ */
+ void drawScrollBar(int index, int pageSize, int count, const Common::Rect &r);
+
+ /**
* Handles any events when the mouse is on the scrollbar
*/
void handleScrollbarEvents(int index, int pageSize, int count);
/**
+ * Handles any events when the mouse is on the scrollbar
+ */
+ void handleScrollbarEvents(int index, int pageSize, int count, const Common::Rect &r);
+
+ /**
* Close the dialog
*/
void close();
diff --git a/engines/sherlock/tattoo/widget_files.cpp b/engines/sherlock/tattoo/widget_files.cpp
index 0666e173aa..21dd10851f 100644
--- a/engines/sherlock/tattoo/widget_files.cpp
+++ b/engines/sherlock/tattoo/widget_files.cpp
@@ -32,9 +32,13 @@ namespace Sherlock {
namespace Tattoo {
+#define FILES_LINES_COUNT 5
+
WidgetFiles::WidgetFiles(SherlockEngine *vm, const Common::String &target) :
SaveManager(vm, target), WidgetBase(vm), _vm(vm) {
_fileMode = SAVEMODE_NONE;
+ _selector = _oldSelector = -1;
+ savegameIndex = 0;
}
void WidgetFiles::show(SaveMode mode) {
@@ -45,7 +49,19 @@ void WidgetFiles::show(SaveMode mode) {
if (_vm->_showOriginalSavesDialog) {
// Render and display the file dialog
_fileMode = mode;
- render();
+ ui._menuMode = FILES_MODE;
+ _selector = _oldSelector = -1;
+ _scroll = true;
+ createSavegameList();
+
+ // Set up the display area
+ _bounds = Common::Rect(SHERLOCK_SCREEN_WIDTH * 2 / 3, (_surface.fontHeight() + 1) *
+ (FILES_LINES_COUNT + 1) + 17);
+ _bounds.moveTo(mousePos.x - _bounds.width() / 2, mousePos.y - _bounds.height() / 2);
+
+ // Create the surface and render it's contents
+ _surface.create(_bounds.width(), _bounds.height());
+ render(RENDER_ALL);
summonWindow();
ui._menuMode = FILES_MODE;
@@ -86,34 +102,88 @@ void WidgetFiles::showScummVMRestoreDialog() {
}
}
-void WidgetFiles::render() {
- Events &events = *_vm->_events;
- Common::Point mousePos = events.mousePos();
+void WidgetFiles::render(FilesRenderMode mode) {
+ TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
+ ImageFile &images = *ui._interfaceImages;
+ byte color;
+
+ if (mode == OP_ALL) {
+ _surface.fill(TRANSPARENCY);
+ makeInfoArea();
+
+ switch (_fileMode) {
+ case SAVEMODE_LOAD:
+ _surface.writeString(FIXED(LoadGame),
+ Common::Point((_surface.w() - _surface.stringWidth(FIXED(LoadGame))) / 2, 5), INFO_TOP);
+ break;
+
+ case SAVEMODE_SAVE:
+ _surface.writeString(FIXED(SaveGame),
+ Common::Point((_surface.w() - _surface.stringWidth(FIXED(SaveGame))) / 2, 5), INFO_TOP);
+ break;
+
+ default:
+ break;
+ }
- createSavegameList();
+ _surface.hLine(3, _surface.fontHeight() + 7, _surface.w() - 4, INFO_TOP);
+ _surface.hLine(3, _surface.fontHeight() + 8, _surface.w() - 4, INFO_MIDDLE);
+ _surface.hLine(3, _surface.fontHeight() + 9, _surface.w() - 4, INFO_BOTTOM);
+ _surface.transBlitFrom(images[4], Common::Point(0, _surface.fontHeight() + 6));
+ _surface.transBlitFrom(images[5], Common::Point(_surface.w() - images[5]._width, _surface.fontHeight() + 6));
+
+ int xp = _surface.w() - BUTTON_SIZE - 6;
+ _surface.vLine(xp, _surface.fontHeight() + 10, _bounds.height() - 4, INFO_TOP);
+ _surface.vLine(xp + 1, _surface.fontHeight() + 10, _bounds.height() - 4, INFO_MIDDLE);
+ _surface.vLine(xp + 2, _surface.fontHeight() + 10, _bounds.height() - 4, INFO_BOTTOM);
+ _surface.transBlitFrom(images[6], Common::Point(xp - 1, _surface.fontHeight() + 8));
+ _surface.transBlitFrom(images[7], Common::Point(xp - 1, _bounds.height() - 4));
+ }
+
+ int xp = _surface.stringWidth("00.") + _surface.widestChar() + 5;
+ int yp = _surface.fontHeight() + 14;
+
+ for (int idx = _savegameIndex; idx < (_savegameIndex + FILES_LINES_COUNT); ++idx) {
+ if (OP_NAMES || idx == _selector || idx == _oldSelector) {
+ if (idx == _selector && mode != OP_ALL)
+ color = COMMAND_HIGHLIGHTED;
+ else
+ color = INFO_TOP;
+
+ if (mode == RENDER_NAMES_AND_SCROLLBAR)
+ _surface.fillRect(Common::Rect(4, yp, _surface.w() - BUTTON_SIZE - 9, yp + _surface.fontHeight() - 1), TRANSPARENCY);
+
+ Common::String numStr = Common::String::format("%d.", idx + 1);
+ _surface.writeString(numStr, Common::Point(_surface.widestChar(), yp), color);
+ _surface.writeString(_savegames[idx], Common::Point(xp, yp), color);
+ }
- // Set up the display area
- _bounds = Common::Rect(_surface.stringWidth(FIXED(AreYouSureYou)) + _surface.widestChar() * 2,
- (_surface.fontHeight() + 7) * 4);
- _bounds.moveTo(mousePos.x - _bounds.width() / 2, mousePos.y - _bounds.height() / 2);
+ yp += _surface.fontHeight() + 1;
+ }
- // Create the surface
- _surface.create(_bounds.width(), _bounds.height());
- _surface.fill(TRANSPARENCY);
- makeInfoArea();
+ // Draw the Scrollbar if neccessary
+ if (mode != RENDER_NAMES) {
+ Common::Rect scrollRect(BUTTON_SIZE, _bounds.height() - _surface.fontHeight() - 16);
+ scrollRect.moveTo(_bounds.width() - BUTTON_SIZE - 3, _surface.fontHeight() + 13);
+ drawScrollBar(_savegameIndex, FILES_LINES_COUNT, _savegames.size(), scrollRect);
+ }
}
void WidgetFiles::handleEvents() {
//Events &events = *_vm->_events;
+ TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
-}
+ // Handle scrollbar events
+ ScrollHighlight oldHighlight = ui._scrollHighlight;
+ Common::Rect scrollRect(BUTTON_SIZE, _bounds.height() - _surface.fontHeight() - 16);
+ scrollRect.moveTo(_bounds.right - BUTTON_SIZE - 3, _bounds.top + _surface.fontHeight() + 13);
+ handleScrollbarEvents(_savegameIndex, FILES_LINES_COUNT, _savegames.size(), scrollRect);
-void WidgetFiles::close() {
- TattooScene &scene = *(TattooScene *)_vm->_scene;
- TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
+ // If the highlight has changed, redraw the scrollbar
+ if (ui._scrollHighlight != oldHighlight)
+ render(RENDER_NAMES_AND_SCROLLBAR);
- banishWindow();
- ui._menuMode = scene._labTableScene ? LAB_MODE : STD_MODE;
+ // TODO
}
} // End of namespace Tattoo
diff --git a/engines/sherlock/tattoo/widget_files.h b/engines/sherlock/tattoo/widget_files.h
index 495a95c003..bf4eb85d2b 100644
--- a/engines/sherlock/tattoo/widget_files.h
+++ b/engines/sherlock/tattoo/widget_files.h
@@ -33,20 +33,19 @@ class SherlockEngine;
namespace Tattoo {
+enum FilesRenderMode { RENDER_ALL, RENDER_NAMES, RENDER_NAMES_AND_SCROLLBAR };
+
class WidgetFiles: public WidgetBase, public SaveManager {
private:
SherlockEngine *_vm;
SaveMode _fileMode;
+ int _selector, _oldSelector;
+ int savegameIndex;
/**
* Render the dialog
*/
- void render();
-
- /**
- * Close the dialog
- */
- void close();
+ void render(FilesRenderMode mode);
/**
* Show the ScummVM Save Game dialog