diff options
Diffstat (limited to 'engines')
| -rw-r--r-- | engines/sherlock/tattoo/tattoo_user_interface.cpp | 11 | ||||
| -rw-r--r-- | engines/sherlock/tattoo/tattoo_user_interface.h | 5 | ||||
| -rw-r--r-- | engines/sherlock/tattoo/widget_base.cpp | 17 | ||||
| -rw-r--r-- | engines/sherlock/tattoo/widget_base.h | 10 | ||||
| -rw-r--r-- | engines/sherlock/tattoo/widget_files.cpp | 108 | ||||
| -rw-r--r-- | engines/sherlock/tattoo/widget_files.h | 11 | 
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  | 
