[Scummvm-git-logs] scummvm master -> 33d07334eba07d0f17fb3e209f67146b188882c7

djsrv dservilla at gmail.com
Mon Jul 27 16:53:19 UTC 2020


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:
33d07334eb DIRECTOR: Replace isFocusable with respondsToEvent


Commit: 33d07334eba07d0f17fb3e209f67146b188882c7
    https://github.com/scummvm/scummvm/commit/33d07334eba07d0f17fb3e209f67146b188882c7
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-27T12:51:51-04:00

Commit Message:
DIRECTOR: Replace isFocusable with respondsToEvent

Changed paths:
    engines/director/events.cpp
    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 39bbf6b344..b1cfa2404f 100644
--- a/engines/director/events.cpp
+++ b/engines/director/events.cpp
@@ -143,7 +143,7 @@ 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, true);
+		spriteId = sc->getSpriteIDFromPos(pos, kEventMouseDown);
 		_currentMouseDownSpriteId = spriteId;
 		_currentClickOnSpriteId = spriteId;
 
@@ -167,7 +167,7 @@ bool Movie::processEvent(Common::Event &event) {
 	case Common::EVENT_LBUTTONUP:
 		pos = _stage->getMousePos();
 
-		spriteId = sc->getSpriteIDFromPos(pos, true);
+		spriteId = sc->getSpriteIDFromPos(pos, kEventMouseUp);
 
 		if (!sc->getChannelById(_currentMouseDownSpriteId)->getBbox().contains(pos))
 			_currentMouseDownSpriteId = 0;
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 8cf2f29424..559d985746 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -511,12 +511,12 @@ void Score::screenShot() {
 	newSurface->free();
 }
 
-uint16 Score::getSpriteIDFromPos(Common::Point pos, bool firstActive) {
+uint16 Score::getSpriteIDFromPos(Common::Point pos, LEvent respondsToEvent) {
 	int unfocusableSprite = 0;
 
 	for (int i = _channels.size() - 1; i >= 0; i--)
 		if (_channels[i]->isMouseIn(pos)) {
-			if (!firstActive || _channels[i]->_sprite->isFocusable())
+			if (respondsToEvent == kEventNone || _channels[i]->_sprite->respondsToEvent(respondsToEvent))
 				return i;
 			else if (unfocusableSprite == 0)
 				unfocusableSprite = i;
diff --git a/engines/director/score.h b/engines/director/score.h
index 95dd6d2a84..6e0ada35d9 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -95,7 +95,7 @@ public:
 	int getCurrentLabelNumber();
 	int getNextLabelNumber(int referenceFrame);
 
-	uint16 getSpriteIDFromPos(Common::Point pos, bool firstActive = false);
+	uint16 getSpriteIDFromPos(Common::Point pos, LEvent respondsToEvent = kEventNone);
 	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 a9e187b763..0636fa0f0f 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -29,6 +29,7 @@
 #include "director/score.h"
 #include "director/sprite.h"
 #include "director/lingo/lingo.h"
+#include "director/lingo/lingo-object.h"
 
 namespace Director {
 
@@ -97,15 +98,28 @@ void Sprite::updateCast() {
 		_cast->setEditable(_editable);
 }
 
-bool Sprite::isFocusable() {
-	if (_moveable || _puppet || _scriptId)
+bool Sprite::respondsToEvent(LEvent event) {
+	if (_moveable && (event == kEventMouseDown || event == kEventMouseUp))
+		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;
+	}
+
+	ScriptContext *castScript = _movie->getScriptContext(kCastScript, _castId);
+	if (castScript && castScript->_eventHandlers.contains(event))
 		return true;
 
 	return false;
 }
 
 bool Sprite::shouldHilite() {
-	if (isFocusable() && ((_cast && _cast->_autoHilite) || (isQDShape() && _ink == kInkTypeMatte)))
+	if ((_cast && _cast->_autoHilite) || (isQDShape() && _ink == kInkTypeMatte))
 		if (g_director->getVersion() < 4 && !_moveable)
 			if (_movie->getScriptContext(kScoreScript, _scriptId) ||
 					_movie->getScriptContext(kCastScript, _castId))
diff --git a/engines/director/sprite.h b/engines/director/sprite.h
index eb2fc3cab9..dbeaf2cc67 100644
--- a/engines/director/sprite.h
+++ b/engines/director/sprite.h
@@ -67,7 +67,7 @@ public:
 
 	void updateCast();
 
-	bool isFocusable();
+	bool respondsToEvent(LEvent event);
 	bool shouldHilite();
 
 	uint16 getPattern();




More information about the Scummvm-git-logs mailing list