[Scummvm-git-logs] scummvm master -> 054b8ddeb06e066d9aecf5909ba52fc51447e701

djsrv dservilla at gmail.com
Mon Jul 27 20:44:06 UTC 2020


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

Summary:
fcb79c78c2 DIRECTOR: Update puppet scriptId
054b8ddeb0 DIRECTOR: Improve mouse event handling


Commit: fcb79c78c2764cb558d5d3d2be28f278b9836753
    https://github.com/scummvm/scummvm/commit/fcb79c78c2764cb558d5d3d2be28f278b9836753
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-27T16:28:47-04:00

Commit Message:
DIRECTOR: Update puppet scriptId

Changed paths:
    engines/director/channel.cpp


diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index 0eed8530a4..dc9ca8edb8 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -260,22 +260,20 @@ void Channel::setClean(Sprite *nextSprite, int spriteId, bool partial) {
 	bool replace = isDirty(nextSprite);
 
 	if (nextSprite) {
-		if (!_sprite->_puppet) {
-			if (partial) {
-				// Updating scripts, etc. does not require a full re-render
-				_sprite->_scriptId = nextSprite->_scriptId;
-			} else {
-				_sprite = nextSprite;
-
-				// Sprites marked moveable are constrained to the same bounding box until
-				// the moveable is disabled
-				if (!_sprite->_moveable || newSprite)
-					_currentPoint = _sprite->_startPoint;
-
-				if (!_sprite->_stretch) {
-					_width = _sprite->_width;
-					_height = _sprite->_height;
-				}
+		if (_sprite->_puppet || partial) {
+			// Updating scripts, etc. does not require a full re-render
+			_sprite->_scriptId = nextSprite->_scriptId;
+		} else {
+			_sprite = nextSprite;
+
+			// Sprites marked moveable are constrained to the same bounding box until
+			// the moveable is disabled
+			if (!_sprite->_moveable || newSprite)
+				_currentPoint = _sprite->_startPoint;
+
+			if (!_sprite->_stretch) {
+				_width = _sprite->_width;
+				_height = _sprite->_height;
 			}
 		}
 


Commit: 054b8ddeb06e066d9aecf5909ba52fc51447e701
    https://github.com/scummvm/scummvm/commit/054b8ddeb06e066d9aecf5909ba52fc51447e701
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-27T16:42:42-04:00

Commit Message:
DIRECTOR: Improve mouse event handling

Changed paths:
    engines/director/events.cpp
    engines/director/movie.cpp
    engines/director/movie.h
    engines/director/score.cpp
    engines/director/score.h
    engines/director/sprite.cpp
    engines/director/sprite.h


diff --git a/engines/director/events.cpp b/engines/director/events.cpp
index b1cfa2404f..495d156245 100644
--- a/engines/director/events.cpp
+++ b/engines/director/events.cpp
@@ -143,9 +143,8 @@ bool Movie::processEvent(Common::Event &event) {
 
 		// D3 doesn't have both mouse up and down.
 		// But we still want to know if the mouse is down for press effects.
-		spriteId = sc->getSpriteIDFromPos(pos, kEventMouseDown);
-		_currentMouseDownSpriteId = spriteId;
-		_currentClickOnSpriteId = spriteId;
+		spriteId = sc->getMouseSpriteIDFromPos(pos);
+		_currentClickOnSpriteId = sc->getActiveSpriteIDFromPos(pos);
 
 		if (spriteId > 0 && sc->_channels[spriteId]->_sprite->shouldHilite())
 			g_director->getCurrentStage()->invertChannel(sc->_channels[spriteId]);
@@ -167,17 +166,12 @@ bool Movie::processEvent(Common::Event &event) {
 	case Common::EVENT_LBUTTONUP:
 		pos = _stage->getMousePos();
 
-		spriteId = sc->getSpriteIDFromPos(pos, kEventMouseUp);
-
-		if (!sc->getChannelById(_currentMouseDownSpriteId)->getBbox().contains(pos))
-			_currentMouseDownSpriteId = 0;
+		spriteId = sc->getMouseSpriteIDFromPos(pos);
+		_currentClickOnSpriteId = sc->getActiveSpriteIDFromPos(pos);
 
 		if (spriteId > 0 && sc->_channels[spriteId]->_sprite->shouldHilite())
 			g_director->getCurrentStage()->invertChannel(sc->_channels[spriteId]);
 
-		if (!(g_director->_wm->_mode & Graphics::kWMModeButtonDialogStyle))
-			_currentMouseDownSpriteId = spriteId;
-
 		debugC(3, kDebugEvents, "event: Button Up @(%d, %d), movie '%s', sprite id: %d", pos.x, pos.y, _macName.c_str(), spriteId);
 
 		_currentDraggedChannel = nullptr;
@@ -190,7 +184,6 @@ bool Movie::processEvent(Common::Event &event) {
 
 		registerEvent(kEventMouseUp, spriteId);
 		sc->renderCursor(sc->getSpriteIDFromPos(pos));
-		_currentMouseDownSpriteId = 0;
 		return true;
 
 	case Common::EVENT_KEYDOWN:
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 6919664b49..5d43f4bfd3 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -44,7 +44,6 @@ Movie::Movie(Stage *stage) {
 	_flags = 0;
 	_stageColor = 0xFF;
 
-	_currentMouseDownSpriteId = 0;
 	_currentClickOnSpriteId = 0;
 	_currentEditableTextChannel = 0;
 	_lastEventTime = _vm->getMacTicks();
diff --git a/engines/director/movie.h b/engines/director/movie.h
index 757891c4ec..6a8d75000a 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -132,7 +132,6 @@ private:
 public:
 	Archive *_movieArchive;
 	Common::Rect _movieRect;
-	uint16 _currentMouseDownSpriteId;
 	uint16 _currentClickOnSpriteId;
 	uint16 _currentEditableTextChannel;
 	uint32 _lastEventTime;
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 559d985746..267cd09e8d 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -511,18 +511,28 @@ void Score::screenShot() {
 	newSurface->free();
 }
 
-uint16 Score::getSpriteIDFromPos(Common::Point pos, LEvent respondsToEvent) {
-	int unfocusableSprite = 0;
+uint16 Score::getSpriteIDFromPos(Common::Point pos) {
+	for (int i = _channels.size() - 1; i >= 0; i--)
+		if (_channels[i]->isMouseIn(pos))
+			return i;
+
+	return 0;
+}
 
+uint16 Score::getMouseSpriteIDFromPos(Common::Point pos) {
 	for (int i = _channels.size() - 1; i >= 0; i--)
-		if (_channels[i]->isMouseIn(pos)) {
-			if (respondsToEvent == kEventNone || _channels[i]->_sprite->respondsToEvent(respondsToEvent))
-				return i;
-			else if (unfocusableSprite == 0)
-				unfocusableSprite = i;
-		}
+		if (_channels[i]->isMouseIn(pos) && _channels[i]->_sprite->respondsToMouse())
+			return i;
 
-	return unfocusableSprite;
+	return 0;
+}
+
+uint16 Score::getActiveSpriteIDFromPos(Common::Point pos) {
+	for (int i = _channels.size() - 1; i >= 0; i--)
+		if (_channels[i]->isMouseIn(pos) && _channels[i]->_sprite->isActive())
+			return i;
+
+	return 0;
 }
 
 bool Score::checkSpriteIntersection(uint16 spriteId, Common::Point pos) {
diff --git a/engines/director/score.h b/engines/director/score.h
index 6e0ada35d9..e5392bebf2 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -95,7 +95,9 @@ public:
 	int getCurrentLabelNumber();
 	int getNextLabelNumber(int referenceFrame);
 
-	uint16 getSpriteIDFromPos(Common::Point pos, LEvent respondsToEvent = kEventNone);
+	uint16 getSpriteIDFromPos(Common::Point pos);
+	uint16 getMouseSpriteIDFromPos(Common::Point pos);
+	uint16 getActiveSpriteIDFromPos(Common::Point pos);
 	bool checkSpriteIntersection(uint16 spriteId, Common::Point pos);
 	Common::List<Channel *> getSpriteIntersections(const Common::Rect &r);
 
diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index 0636fa0f0f..7997bc0949 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -98,26 +98,28 @@ void Sprite::updateCast() {
 		_cast->setEditable(_editable);
 }
 
-bool Sprite::respondsToEvent(LEvent event) {
-	if (_moveable && (event == kEventMouseDown || event == kEventMouseUp))
+bool Sprite::respondsToMouse() {
+	if (_moveable)
 		return true;
 
 	ScriptContext *spriteScript = _movie->getScriptContext(kScoreScript, _scriptId);
-	if (spriteScript) {
-		if (((event == kEventMouseDown && _immediate) || (event == kEventMouseUp && !_immediate))
-				&& spriteScript->_eventHandlers.contains(kEventGeneric))
-					return true;
-		if (spriteScript->_eventHandlers.contains(event))
-			return true;
-	}
+	if (spriteScript && (spriteScript->_eventHandlers.contains(kEventGeneric)
+					  || spriteScript->_eventHandlers.contains(kEventMouseDown)
+					  || spriteScript->_eventHandlers.contains(kEventMouseUp)))
+		return true;
 
 	ScriptContext *castScript = _movie->getScriptContext(kCastScript, _castId);
-	if (castScript && castScript->_eventHandlers.contains(event))
+	if (castScript && (castScript->_eventHandlers.contains(kEventMouseDown)
+					|| castScript->_eventHandlers.contains(kEventMouseUp)))
 		return true;
 
 	return false;
 }
 
+bool Sprite::isActive() {
+	return _movie->getScriptContext(kScoreScript, _scriptId) != nullptr;
+}
+
 bool Sprite::shouldHilite() {
 	if ((_cast && _cast->_autoHilite) || (isQDShape() && _ink == kInkTypeMatte))
 		if (g_director->getVersion() < 4 && !_moveable)
diff --git a/engines/director/sprite.h b/engines/director/sprite.h
index dbeaf2cc67..9941eb3b72 100644
--- a/engines/director/sprite.h
+++ b/engines/director/sprite.h
@@ -67,7 +67,8 @@ public:
 
 	void updateCast();
 
-	bool respondsToEvent(LEvent event);
+	bool respondsToMouse();
+	bool isActive();
 	bool shouldHilite();
 
 	uint16 getPattern();




More information about the Scummvm-git-logs mailing list