diff options
| author | Paul Gilbert | 2015-07-25 11:26:09 -0400 | 
|---|---|---|
| committer | Paul Gilbert | 2015-07-25 11:26:09 -0400 | 
| commit | cb9aab65b0b49770f3552bbe001be012d45827e6 (patch) | |
| tree | ca1256c32481da3235626198ab7a6e70c1d5fd28 | |
| parent | e77f9f1779adc885f85299840b4ab58a8dcb6c13 (diff) | |
| download | scummvm-rg350-cb9aab65b0b49770f3552bbe001be012d45827e6.tar.gz scummvm-rg350-cb9aab65b0b49770f3552bbe001be012d45827e6.tar.bz2 scummvm-rg350-cb9aab65b0b49770f3552bbe001be012d45827e6.zip  | |
SHERLOCK: RT: Clean up handling of WidgetLab for lab table scene
| -rw-r--r-- | engines/sherlock/tattoo/tattoo_scene.cpp | 4 | ||||
| -rw-r--r-- | engines/sherlock/tattoo/tattoo_scene.h | 3 | ||||
| -rw-r--r-- | engines/sherlock/tattoo/tattoo_user_interface.cpp | 35 | ||||
| -rw-r--r-- | engines/sherlock/tattoo/tattoo_user_interface.h | 16 | ||||
| -rw-r--r-- | engines/sherlock/tattoo/widget_base.cpp | 9 | 
5 files changed, 48 insertions, 19 deletions
diff --git a/engines/sherlock/tattoo/tattoo_scene.cpp b/engines/sherlock/tattoo/tattoo_scene.cpp index 9b5c5b2156..17c27a0ab6 100644 --- a/engines/sherlock/tattoo/tattoo_scene.cpp +++ b/engines/sherlock/tattoo/tattoo_scene.cpp @@ -49,7 +49,7 @@ static bool sortImagesY(const ShapeEntry &s1, const ShapeEntry &s2) {  /*----------------------------------------------------------------*/ -TattooScene::TattooScene(SherlockEngine *vm) : Scene(vm) { +TattooScene::TattooScene(SherlockEngine *vm) : Scene(vm), _labWidget(vm) {  	_labTableScene = false;  } @@ -103,7 +103,7 @@ bool TattooScene::loadScene(const Common::String &filename) {  		ui._menuMode = _labTableScene ? LAB_MODE : STD_MODE;  		if (_labTableScene) -			ui._labWidget.summonWindow(); +			ui.addFixedWidget(&_labWidget);  	}  	return result; diff --git a/engines/sherlock/tattoo/tattoo_scene.h b/engines/sherlock/tattoo/tattoo_scene.h index c432849bed..d9e4ae30b8 100644 --- a/engines/sherlock/tattoo/tattoo_scene.h +++ b/engines/sherlock/tattoo/tattoo_scene.h @@ -25,6 +25,7 @@  #include "common/scummsys.h"  #include "sherlock/scene.h" +#include "sherlock/tattoo/widget_lab.h"  namespace Sherlock { @@ -46,6 +47,8 @@ struct SceneTripEntry {  class TattooScene : public Scene {  private: +	WidgetLab _labWidget; +  	void doBgAnimCheckCursor();  	/** diff --git a/engines/sherlock/tattoo/tattoo_user_interface.cpp b/engines/sherlock/tattoo/tattoo_user_interface.cpp index bbe93b50f1..12d097a657 100644 --- a/engines/sherlock/tattoo/tattoo_user_interface.cpp +++ b/engines/sherlock/tattoo/tattoo_user_interface.cpp @@ -29,9 +29,20 @@ namespace Sherlock {  namespace Tattoo { +bool WidgetList::contains(const WidgetBase *item) const { +	for (const_iterator i = begin(); i != end(); ++i) { +		if ((*i) == item) +			return true; +	} + +	return false; +} + +/*-------------------------------------------------------------------------*/ +  TattooUserInterface::TattooUserInterface(SherlockEngine *vm): UserInterface(vm), -		_inventoryWidget(vm), _messageWidget(vm), _textWidget(vm), _tooltipWidget(vm), _verbsWidget(vm), -		_labWidget(vm), _creditsWidget(vm), _optionsWidget(vm), _quitWidget(vm) { +		_inventoryWidget(vm), _messageWidget(vm), _textWidget(vm), _tooltipWidget(vm),  +		_verbsWidget(vm), _creditsWidget(vm), _optionsWidget(vm), _quitWidget(vm) {  	Common::fill(&_lookupTable[0], &_lookupTable[PALETTE_COUNT], 0);  	Common::fill(&_lookupTable1[0], &_lookupTable1[PALETTE_COUNT], 0);  	_scrollSize = 0; @@ -224,6 +235,7 @@ void TattooUserInterface::reset() {  	_lookPos = Common::Point(SHERLOCK_SCREEN_WIDTH / 2, SHERLOCK_SCREEN_HEIGHT / 2);  	_tooltipWidget.setText("");  	_widgets.clear(); +	_fixedWidgets.clear();  }  void TattooUserInterface::handleInput() { @@ -274,6 +286,8 @@ void TattooUserInterface::handleInput() {  	// If there's any active widgets/windows, let the most recently open one do event processing  	if (!_widgets.empty())  		_widgets.back()->handleEvents(); +	else if (!_fixedWidgets.empty()) +		_fixedWidgets.back()->handleEvents();  	// Handle input depending on what mode we're in  	switch (_menuMode) { @@ -295,10 +309,13 @@ void TattooUserInterface::drawInterface(int bufferNum) {  	Screen &screen = *_vm->_screen;  	// Draw any active on-screen widgets +	for (Common::List<WidgetBase *>::iterator i = _fixedWidgets.begin(); i != _fixedWidgets.end(); ++i) +		(*i)->draw();  	for (Common::List<WidgetBase *>::iterator i = _widgets.begin(); i != _widgets.end(); ++i)  		(*i)->draw();  	// Handle drawing credits +	// TODO: See if credits are only shown on a single screen. If so, _fixedWidgets could be used  	if (_creditsWidget.active())  		_creditsWidget.drawCredits(); @@ -321,6 +338,8 @@ void TattooUserInterface::doBgAnimRestoreUI() {  	// If there are any on-screen widgets, then erase them  	for (Common::List<WidgetBase *>::iterator i = _widgets.begin(); i != _widgets.end(); ++i)  		(*i)->erase(); +	for (Common::List<WidgetBase *>::iterator i = _fixedWidgets.begin(); i != _fixedWidgets.end(); ++i) +		(*i)->erase();  	// If there is a Text Tag being display, restore the area underneath it  	_tooltipWidget.erase(); @@ -859,15 +878,8 @@ void TattooUserInterface::drawDialogRect(Surface &s, const Common::Rect &r, bool  }  void TattooUserInterface::banishWindow(bool slideUp) { -	TattooScene &scene = *(TattooScene *)_vm->_scene;  	if (!_widgets.empty())  		_widgets.back()->banishWindow(); - -	if (scene._labTableScene && !_labWidget.active()) { -		// In the lab table scene, so ensure  -		_labWidget.summonWindow(); -		_menuMode = LAB_MODE; -	}  }  void TattooUserInterface::freeMenu() { @@ -890,6 +902,11 @@ void TattooUserInterface::saveGame() {  	files.show(SAVEMODE_SAVE);  } +void TattooUserInterface::addFixedWidget(WidgetBase *widget) { +	_fixedWidgets.push_back(widget); +	widget->summonWindow(); +} +  } // End of namespace Tattoo  } // End of namespace Sherlock diff --git a/engines/sherlock/tattoo/tattoo_user_interface.h b/engines/sherlock/tattoo/tattoo_user_interface.h index a5a678fa21..f894e2e0be 100644 --- a/engines/sherlock/tattoo/tattoo_user_interface.h +++ b/engines/sherlock/tattoo/tattoo_user_interface.h @@ -31,7 +31,6 @@  #include "sherlock/tattoo/widget_credits.h"  #include "sherlock/tattoo/widget_files.h"  #include "sherlock/tattoo/widget_inventory.h" -#include "sherlock/tattoo/widget_lab.h"  #include "sherlock/tattoo/widget_options.h"  #include "sherlock/tattoo/widget_quit.h"  #include "sherlock/tattoo/widget_text.h" @@ -48,6 +47,11 @@ class WidgetBase;  enum ScrollHighlight { SH_NONE = 0, SH_SCROLL_UP = 1, SH_PAGE_UP = 2, SH_THUMBNAIL = 3, SH_PAGE_DOWN = 4, SH_SCROLL_DOWN = 5 }; +class WidgetList : public Common::List <WidgetBase *> { +public: +	bool contains(const WidgetBase *item) const; +}; +  class TattooUserInterface : public UserInterface {  	friend class WidgetBase;  private: @@ -57,7 +61,8 @@ private:  	WidgetInventory _inventoryWidget;  	WidgetMessage _messageWidget;  	WidgetQuit _quitWidget; -	Common::List<WidgetBase *> _widgets; +	WidgetList _fixedWidgets; +	WidgetList _widgets;  	byte _lookupTable[PALETTE_COUNT];  	byte _lookupTable1[PALETTE_COUNT];  private: @@ -106,7 +111,6 @@ public:  	int _maskCounter;  	ImageFile *_interfaceImages;  	WidgetCredits _creditsWidget; -	WidgetLab _labWidget;  	WidgetOptions _optionsWidget;  	WidgetText _textWidget;  	WidgetSceneTooltip _tooltipWidget; @@ -216,6 +220,12 @@ public:  	 * Show the save game dialog, and allow the user to save the game  	 */  	void saveGame(); + +	/** +	 * Add a widget to the current scene to be executed if there are no active widgets in the +	 * main _widgets list +	 */ +	void addFixedWidget(WidgetBase *widget);  public:  	/**  	 * Resets the user interface diff --git a/engines/sherlock/tattoo/widget_base.cpp b/engines/sherlock/tattoo/widget_base.cpp index 3a4e331f2d..ba4aee26f3 100644 --- a/engines/sherlock/tattoo/widget_base.cpp +++ b/engines/sherlock/tattoo/widget_base.cpp @@ -38,13 +38,12 @@ void WidgetBase::summonWindow() {  	TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;  	// Double-check that the same widget isn't added twice -	for (Common::List<WidgetBase *>::iterator i = ui._widgets.begin(); i != ui._widgets.end(); ++i) { -		if ((*i) == this) -			error("Tried to add a widget twice"); -	} +	if (ui._widgets.contains(this)) +		error("Tried to add a widget multiple times");  	// Add widget to the screen -	ui._widgets.push_back(this); +	if (!ui._fixedWidgets.contains(this)) +		ui._widgets.push_back(this);  	_outsideMenu = false;  	draw();  | 
