00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef VRS_SG_INTERACTIONTECHNIQUE_H
00021 #define VRS_SG_INTERACTIONTECHNIQUE_H
00022
00023 #include <vrs/sg/interactionconcept.h>
00024 #include <vrs/sg/inputevent.h>
00025
00026 namespace VRS {
00027
00028 class ConstraintHint;
00029 class KeyEvent;
00030 class ButtonEvent;
00031 class MotionEvent;
00032 class TimeEvent;
00033 class WheelEvent;
00034 template<typename K, typename V> class NonPersistentDictionary;
00035
00058
00059 class VRS_CORE_API InteractionTechnique : public SharedObj {
00060
00061 public:
00062
00063 typedef InteractionConcept::ViewParameterSet ViewParameterSet;
00064
00068 SO<ViewParameterSet> getViewParameters() const;
00069
00072 SO<ViewParameterSet> getPreviousViewParameters() const;
00073
00080 virtual void onTimer(SO<TimeEvent> event, double secondsSinceLastTimeEvent);
00081
00086 SO<ConstraintHint> getConstraintHint();
00087
00088 typedef int KeyFunctionID;
00089 typedef int MouseButtonFunctionID;
00090
00097 void assignKey(
00098 KeyFunctionID id,
00099 unsigned int key,
00100 InputEvent::Modifier mustModifier = InputEvent::NoModifier,
00101 InputEvent::Modifier mustNotModifier = InputEvent::AllKeys);
00102
00103
00104 void assignMouseButton(
00105 MouseButtonFunctionID id,
00106 InputEvent::Button button,
00107 InputEvent::Modifier mustModifier = InputEvent::NoModifier,
00108 InputEvent::Modifier mustNotModifier = InputEvent::AllKeys,
00109 InputEvent::Change mustChange = InputEvent::NoChange,
00110 InputEvent::Change mustNotChange = InputEvent::DoubleClick);
00111
00112
00114 void disableKeyFunction(KeyFunctionID id);
00115 void disableMouseButtonFunction(MouseButtonFunctionID id);
00116
00120 bool getAssignedKey(
00121 KeyFunctionID id,
00122 unsigned int& key,
00123 InputEvent::Modifier& mustModifier,
00124 InputEvent::Modifier& mustNotModifier) const;
00125
00129 bool getAssignedMouseButton(
00130 MouseButtonFunctionID id,
00131 InputEvent::Button& button,
00132 InputEvent::Modifier& mustModifier,
00133 InputEvent::Modifier& mustNotModifier,
00134 InputEvent::Change& mustChange,
00135 InputEvent::Change& mustNotChange) const;
00136
00137
00139 void setWheelEnable(bool onOff);
00140
00142 virtual void onKey(SO<KeyEvent> event, KeyFunctionID id);
00143
00146 virtual void onDragStart(int x, int y, SO<ButtonEvent>, MouseButtonFunctionID id);
00147
00151 virtual void onDragMotion(
00152 int x, int y,
00153 SO<MotionEvent>,
00154 MouseButtonFunctionID id,
00155 int startX, int startY);
00156
00158 virtual void onDragEnd(
00159 int x, int y,
00160 SO<ButtonEvent>,
00161 MouseButtonFunctionID id,
00162 int startX, int startY);
00163
00166 virtual void onWheelEvent(SO<WheelEvent> we);
00167
00170 virtual void onEvent(SO<Event> e);
00171
00177 virtual void onEventPassive(SO<Event> e, bool modeActive);
00178
00181 virtual void onActivation();
00182
00185 virtual void onDeactivation();
00186
00192 virtual bool checkEventRelevance(SO<Event> event) const;
00193
00198 bool canWork() const;
00199
00204 virtual bool preservingViewDirectionRequired() const;
00205
00209 virtual void setEnabled(bool yesNo = true);
00210 virtual bool enabled() const;
00211
00212 VRS_TYPEINFO(InteractionTechnique, SharedObj);
00213 VRS_SERIALIZABLE(InteractionTechnique);
00214
00215 protected:
00216
00217 InteractionTechnique();
00218
00222 void brake();
00223
00229
00232 void registerMouseButtonFunction(MouseButtonFunctionID id);
00233 void registerKeyFunction(KeyFunctionID id);
00234
00237 bool dragging(MouseButtonFunctionID id);
00238
00240 bool pressed(KeyFunctionID id);
00241
00243 SO<InteractionConcept> getParent() const;
00244
00245 private:
00246
00247 friend class InteractionMode;
00248
00249
00250 void setParent(SO<InteractionConcept> parent);
00251 void handle(SO<Event> event);
00252 void activate();
00253 void deactivate();
00254 bool wakeUpAt(SO<Event> event) const;
00255
00256
00257
00258 InteractionConcept* parent_;
00259
00260 struct KeyAssignment : public SharedObj {
00261 unsigned int key;
00262 InputEvent::Modifier mustModifier;
00263 InputEvent::Modifier mustNotModifier;
00264 bool pressed;
00265 };
00266
00267 struct ButtonAssignment : public SharedObj {
00268 InputEvent::Button button;
00269 InputEvent::Modifier mustModifier;
00270 InputEvent::Modifier mustNotModifier;
00271 InputEvent::Change mustChange;
00272 InputEvent::Change mustNotChange;
00273 bool pressed;
00274 int dragStartX;
00275 int dragStartY;
00276 };
00277
00278
00279 SO<KeyAssignment> findKeyFunctionID(SO<KeyEvent> event, KeyFunctionID& id) const;
00280 SO<ButtonAssignment> findMouseButtonFunctionID(SO<InputEvent> event, MouseButtonFunctionID& id) const;
00281
00282 SO<NonPersistentDictionary<KeyFunctionID, SO<KeyAssignment> > > keyAssignments_;
00283 SO<NonPersistentDictionary<MouseButtonFunctionID, SO<ButtonAssignment> > > buttonAssignments_;
00284
00285 bool enableWheel_;
00286 bool m_enabled;
00287 };
00288
00289 }
00290
00291 #endif // VRS_SG_INTERACTIONTECHNIQUE_H