[Scummvm-cvs-logs] scummvm master -> a23d878934a0669c5539d6b3548d88e698d81f0a

dreammaster dreammaster at scummvm.org
Wed Jun 24 02:12:04 CEST 2015


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
a23d878934 SHERLOCK: RT: Create WidgetMessage class for displaying messages


Commit: a23d878934a0669c5539d6b3548d88e698d81f0a
    https://github.com/scummvm/scummvm/commit/a23d878934a0669c5539d6b3548d88e698d81f0a
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2015-06-23T20:11:08-04:00

Commit Message:
SHERLOCK: RT: Create WidgetMessage class for displaying messages

Changed paths:
    engines/sherlock/tattoo/tattoo_talk.cpp
    engines/sherlock/tattoo/tattoo_talk.h
    engines/sherlock/tattoo/tattoo_user_interface.cpp
    engines/sherlock/tattoo/tattoo_user_interface.h
    engines/sherlock/tattoo/widget_text.cpp
    engines/sherlock/tattoo/widget_text.h



diff --git a/engines/sherlock/tattoo/tattoo_talk.cpp b/engines/sherlock/tattoo/tattoo_talk.cpp
index 52b6b51..1ae36ea 100644
--- a/engines/sherlock/tattoo/tattoo_talk.cpp
+++ b/engines/sherlock/tattoo/tattoo_talk.cpp
@@ -183,23 +183,25 @@ TattooTalk::TattooTalk(SherlockEngine *vm) : Talk(vm) {
 }
 
 void TattooTalk::talkInterface(const byte *&str) {
-	drawTalk((const char *)str);
+	TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
+	const char *s = (const char *)str;
 
+	// Move to past the end of the text string
 	_charCount = 0;
 	while ((*str < TATTOO_OPCODES[0] || *str == TATTOO_OPCODES[OP_NULL]) && *str) {
 		++_charCount;
 		++str;
 	}
 
+	// Display the text window
+	ui.banishWindow();
+	ui._textWidget.load(s);
+	ui._textWidget.summonWindow();
 	_wait = true;
 }
 
-void TattooTalk::drawTalk(const char *str) {
-	TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
-
-	ui.banishWindow();
-	ui._textWidget.load(str);
-	ui._textWidget.summonWindow();
+void TattooTalk::openTalkWindow() {
+	// TODO
 }
 
 OpcodeReturn TattooTalk::cmdSwitchSpeaker(const byte *&str) {
diff --git a/engines/sherlock/tattoo/tattoo_talk.h b/engines/sherlock/tattoo/tattoo_talk.h
index 9fd6f05..33eacd2 100644
--- a/engines/sherlock/tattoo/tattoo_talk.h
+++ b/engines/sherlock/tattoo/tattoo_talk.h
@@ -75,6 +75,12 @@ private:
 	OpcodeReturn cmdWalkHomesAndNPCToCoords(const byte *&str);
 private:
 	void drawTalk(const char *str);
+
+	/**
+	 * Figures out how many lines the available talk lines will take up, and opens a text window
+	 * of appropriate size
+	 */
+	void openTalkWindow();
 protected:
 	/**
 	 * Display the talk interface window
diff --git a/engines/sherlock/tattoo/tattoo_user_interface.cpp b/engines/sherlock/tattoo/tattoo_user_interface.cpp
index f81ea4c..4005dbb 100644
--- a/engines/sherlock/tattoo/tattoo_user_interface.cpp
+++ b/engines/sherlock/tattoo/tattoo_user_interface.cpp
@@ -30,7 +30,7 @@ namespace Sherlock {
 namespace Tattoo {
 
 TattooUserInterface::TattooUserInterface(SherlockEngine *vm): UserInterface(vm),
-		_inventoryWidget(vm),  _tooltipWidget(vm), _verbsWidget(vm), _textWidget(vm) {
+		_inventoryWidget(vm), _messageWidget(vm), _textWidget(vm), _tooltipWidget(vm), _verbsWidget(vm) {
 	Common::fill(&_lookupTable[0], &_lookupTable[PALETTE_COUNT], 0);
 	Common::fill(&_lookupTable1[0], &_lookupTable1[PALETTE_COUNT], 0);
 	_menuBuffer = nullptr;
@@ -261,6 +261,10 @@ void TattooUserInterface::handleInput() {
 	if (!events.isCursorVisible())
 		_keyState.keycode = Common::KEYCODE_INVALID;
 
+	// If there's an active widget/window, let it do event processing
+	if (_widget)
+		_widget->handleEvents();
+
 	// Handle input depending on what mode we're in
 	switch (_menuMode) {
 	case STD_MODE:
@@ -281,9 +285,6 @@ void TattooUserInterface::handleInput() {
 	case TALK_MODE:
 		doTalkControl();
 		break;
-	case MESSAGE_MODE:
-		doMessageControl();
-		break;
 	case LAB_MODE:
 		doLabControl();
 		break;
@@ -617,25 +618,6 @@ void TattooUserInterface::doTalkControl() {
 	warning("TODO: ui control (talk)");
 }
 
-void TattooUserInterface::doMessageControl() {
-	Events &events = *_vm->_events;
-	--_menuCounter;
-
-	// Check if a mouse or keypress has occurred, or the display counter has expired
-	if (events._pressed || events._released || events._rightPressed || events._rightReleased ||
-			_keyState.keycode || !_menuCounter) {
-		// Close the window
-		banishWindow();
-
-		// Reset cursor and switch back to standard mode
-		events.setCursor(ARROW);
-		events.clearEvents();
-		_key = -1;
-		_oldBgFound = -1;
-		_menuMode = STD_MODE;
-	}
-}
-
 void TattooUserInterface::doLabControl() {
 	warning("TODO: ui control (lab)");
 }
@@ -701,15 +683,9 @@ void TattooUserInterface::putMessage(const char *formatStr, ...) {
 	Common::String str = Common::String::vformat(formatStr, args);
 	va_end(args);
 
-	// Calculate display bounds and load a text window
-	Common::Rect r(screen.stringWidth(str) + screen.widestChar() * 2 + 6, screen.fontHeight() + 10);
-	r.moveTo(mousePos.x - r.width() / 2, mousePos.y - r.height() / 2);
-	_textWidget.load(str, r);
-	_textWidget.summonWindow();
-
-	_menuMode = MESSAGE_MODE;
-	events._pressed = events._released = events._rightReleased = false;
-	_menuCounter = 25;
+	// Open the message widget
+	_messageWidget.load(str, 25);
+	_messageWidget.summonWindow();
 }
 
 void TattooUserInterface::setupBGArea(const byte cMap[PALETTE_SIZE]) {
diff --git a/engines/sherlock/tattoo/tattoo_user_interface.h b/engines/sherlock/tattoo/tattoo_user_interface.h
index 44ba7ca..f21e699 100644
--- a/engines/sherlock/tattoo/tattoo_user_interface.h
+++ b/engines/sherlock/tattoo/tattoo_user_interface.h
@@ -61,6 +61,7 @@ private:
 	WidgetInventory _inventoryWidget;
 	WidgetSceneTooltip _tooltipWidget;
 	WidgetVerbs _verbsWidget;
+	WidgetMessage _messageWidget;
 	WidgetBase *_widget;
 	byte _lookupTable[PALETTE_COUNT];
 	byte _lookupTable1[PALETTE_COUNT];
@@ -100,11 +101,6 @@ private:
 	 * and handles any actions for clicking on the buttons or statements.
 	 */
 	void doTalkControl();
-
-	/**
-	 * Handles input when a message window is open at the bottom of the screen
-	 */
-	void doMessageControl();
 	
 	/**
 	 * Handles input when the player is in the Lab Table scene
diff --git a/engines/sherlock/tattoo/widget_text.cpp b/engines/sherlock/tattoo/widget_text.cpp
index 44680da..f4e4b6e 100644
--- a/engines/sherlock/tattoo/widget_text.cpp
+++ b/engines/sherlock/tattoo/widget_text.cpp
@@ -92,6 +92,52 @@ void WidgetText::load(const Common::String &str, const Common::Rect &bounds) {
 	}
 }
 
+/*----------------------------------------------------------------*/
+
+WidgetMessage::WidgetMessage(SherlockEngine *vm) : WidgetBase(vm) {
+	_menuCounter = 0;
+}
+
+void WidgetMessage::load(const Common::String &str, int time) {
+	Events &events = *_vm->_events;
+	Common::Point mousePos = events.mousePos();
+	_menuCounter = time;
+
+	// Set up the bounds for the dialog to be a single line
+	_bounds = Common::Rect(_surface.stringWidth(str) + _surface.widestChar() * 2 + 6, _surface.fontHeight() + 10);
+	_bounds.moveTo(mousePos.x - _bounds.width() / 2, mousePos.y - _bounds.height() / 2);
+
+	// Allocate a surface for the window
+	_surface.create(_bounds.width(), _bounds.height());
+	_surface.fill(TRANSPARENCY);
+
+	// Form the background for the new window and write the line of text
+	makeInfoArea();
+	_surface.writeString(str, Common::Point(_surface.widestChar() + 3, 5), INFO_TOP);
+}
+
+void WidgetMessage::handleEvents() {
+	Events &events = *_vm->_events;
+	TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
+	WidgetBase::handleEvents();
+
+	--_menuCounter;
+
+	// Check if a mouse or keypress has occurred, or the display counter has expired
+	if (events._pressed || events._released || events._rightPressed || events._rightReleased ||
+			ui._keyState.keycode || !_menuCounter) {
+		// Close the window
+		banishWindow();
+
+		// Reset cursor and switch back to standard mode
+		events.setCursor(ARROW);
+		events.clearEvents();
+		ui._key = -1;
+		ui._oldBgFound = -1;
+		ui._menuMode = STD_MODE;
+	}
+}
+
 } // End of namespace Tattoo
 
 } // End of namespace Sherlock
diff --git a/engines/sherlock/tattoo/widget_text.h b/engines/sherlock/tattoo/widget_text.h
index c213f2d..e773425 100644
--- a/engines/sherlock/tattoo/widget_text.h
+++ b/engines/sherlock/tattoo/widget_text.h
@@ -33,15 +33,39 @@ class SherlockEngine;
 namespace Tattoo {
 
 class WidgetText: public WidgetBase {
+private:
+	/**
+	 * Display the passed text in a window of the given bounds
+	 */
+	void load(const Common::String &str, const Common::Rect &bounds);
 public:
 	Common::String _remainingText;
 public:
 	WidgetText(SherlockEngine *vm);
 	virtual ~WidgetText() {}
 
+	/**
+	 * Load the data for the text window
+	 */
 	void load(const Common::String &str);
+};
 
-	void load(const Common::String &str, const Common::Rect &bounds);
+class WidgetMessage : public WidgetBase {
+private:
+	int _menuCounter;
+public:
+	WidgetMessage(SherlockEngine *vm);
+	virtual ~WidgetMessage() {}
+
+	/**
+	 * Load the data for the text window
+	 */
+	void load(const Common::String &str, int time);
+
+	/**
+	 * Handle event processing
+	 */
+	virtual void handleEvents();
 };
 
 } // End of namespace Tattoo






More information about the Scummvm-git-logs mailing list