aboutsummaryrefslogtreecommitdiff
path: root/engines/pegasus
diff options
context:
space:
mode:
authorMatthew Hoops2011-09-18 15:48:31 -0400
committerMatthew Hoops2011-09-18 15:48:31 -0400
commit8f6e6030999e7263062461eaf6e0fe378a3892ba (patch)
treec057fd4ad7f7b1e027c0548bdd12a17b5a368949 /engines/pegasus
parent1390db1df12a8a853deca62df2e11a899c111fcf (diff)
downloadscummvm-rg350-8f6e6030999e7263062461eaf6e0fe378a3892ba.tar.gz
scummvm-rg350-8f6e6030999e7263062461eaf6e0fe378a3892ba.tar.bz2
scummvm-rg350-8f6e6030999e7263062461eaf6e0fe378a3892ba.zip
PEGASUS: Add the Tracker class
Diffstat (limited to 'engines/pegasus')
-rwxr-xr-xengines/pegasus/input.cpp27
-rwxr-xr-xengines/pegasus/input.h35
2 files changed, 62 insertions, 0 deletions
diff --git a/engines/pegasus/input.cpp b/engines/pegasus/input.cpp
index 37f9945634..9ef369eb60 100755
--- a/engines/pegasus/input.cpp
+++ b/engines/pegasus/input.cpp
@@ -267,4 +267,31 @@ bool InputHandler::wantsCursor() {
return false;
}
+Tracker *Tracker::_currentTracker = 0;
+
+void Tracker::handleInput(const Input &input, const Hotspot *) {
+ if (stopTrackingInput(input))
+ stopTracking(input);
+ else if (isTracking())
+ continueTracking(input);
+}
+
+void Tracker::startTracking(const Input &) {
+ if (!isTracking()) {
+ _savedHandler = InputHandler::setInputHandler(this);
+ _currentTracker = this;
+ }
+}
+
+void Tracker::stopTracking(const Input &) {
+ if (isTracking()) {
+ _currentTracker = NULL;
+ InputHandler::setInputHandler(_savedHandler);
+ }
+}
+
+bool Tracker::isClickInput(const Input &input, const Hotspot *hotspot) {
+ return !isTracking() && InputHandler::isClickInput(input, hotspot);
+}
+
} // End of namespace Pegasus
diff --git a/engines/pegasus/input.h b/engines/pegasus/input.h
index 432ff8098b..4da0418a53 100755
--- a/engines/pegasus/input.h
+++ b/engines/pegasus/input.h
@@ -414,6 +414,41 @@ protected:
bool _allowInput;
};
+
+/*
+
+ Tracker implements "dragging". A Tracker can receive a startTracking message,
+ which causes it to be the current tracker, as well as setting it up as the current
+ input handler. In addition, only one tracker can be tracking at a time, and no
+ other handler can be set up as the current handler until the track finishes. By
+ default, there is no next input handler for a Tracker, but this behavior can be
+ overridden if desired.
+
+*/
+
+class Tracker : public InputHandler {
+public:
+ Tracker() : InputHandler(0) {}
+ virtual ~Tracker();
+
+ virtual void handleInput(const Input &, const Hotspot *);
+ virtual bool stopTrackingInput(const Input &) { return false; }
+
+ virtual void startTracking(const Input &);
+ virtual void stopTracking(const Input &);
+ virtual void continueTracking(const Input &) {}
+
+ bool isTracking() { return this == _currentTracker; }
+ bool isClickInput(const Input &, const Hotspot *);
+
+ bool releaseInputFocus() { return !isTracking(); }
+
+protected:
+ static Tracker *_currentTracker;
+
+ InputHandler *_savedHandler;
+};
+
} // End of namespace Pegasus
#endif