[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