00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __MANIP_EVENT_BASE_DOT_H
00020 #define __MANIP_EVENT_BASE_DOT_H
00021
00022 #include "../include/smartptr.h"
00023 #include <map>
00024
00025 namespace gutz {
00026
00027 class MouseEvent;
00028 class MouseMoveEvent;
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 template<class MT>
00049 class ManipEventBase : public gutz::Counted
00050 {
00051 public:
00052 typedef MT ManipType;
00053
00054 virtual ~ManipEventBase() {}
00055
00056
00057
00058 virtual ManipEventBase<MT> *clone() const = 0;
00059
00060
00061
00062
00063
00064
00065
00066 virtual bool startEvent(ManipType *m, const MouseEvent &me) = 0;
00067
00068 virtual bool handleEvent(ManipType *m, const MouseMoveEvent &mme) = 0;
00069
00070 virtual void endEvent(ManipType *m, const MouseEvent &me) = 0;
00071
00072
00073
00074
00075
00076 virtual bool tumble(ManipType *m) {return false;}
00077
00078
00079
00080
00081 float getSpeed() const { return _speed; }
00082 void setSpeed(float speed) { _speed = speed; }
00083
00084
00085 protected:
00086 ManipEventBase(float speed = 1.0f): _speed(speed) {}
00087 ManipEventBase(const ManipEventBase &m): _speed(m._speed) {}
00088 ManipEventBase &operator=(const ManipEventBase &m)
00089 { _speed = m._speed; return *this; }
00090
00091 float _speed;
00092 };
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 template<class MT>
00118 class EventMap :
00119 public std::map<unsigned int,
00120 gutz::SmartPtr< ManipEventBase<MT> >,
00121 std::less<unsigned int> >
00122 {
00123 public:
00124 typedef MT ManipType;
00125 typedef ManipEventBase<MT> ManipEventType;
00126 typedef SmartPtr< ManipEventType > ManipEventTypeSP;
00127 typedef std::map<unsigned int, ManipEventTypeSP, std::less<unsigned int> > BaseType;
00128 typedef typename BaseType::iterator Iter;
00129 typedef typename BaseType::const_iterator CIter;
00130
00131 EventMap() : BaseType() {}
00132 EventMap(const EventMap &em) : BaseType(em) {}
00133 virtual ~EventMap() {}
00134 EventMap &operator=(const EventMap &em)
00135 {
00136 BaseType::operator=(em);
00137 return *this;
00138 }
00139
00140
00141
00142
00143
00144
00145
00146
00147 ManipEventTypeSP operator[](unsigned int key) const
00148 {
00149 CIter ei = find(key);
00150 if( ei == end() ) return ManipEventTypeSP(0);
00151 return (*ei).second;
00152 }
00153
00154
00155 ManipEventTypeSP &operator[](unsigned int key)
00156 {
00157 return BaseType::operator[](key);
00158 }
00159
00160
00161
00162
00163
00164
00165 ManipEventTypeSP getEvent(const gutz::MouseEvent &me) const
00166 {
00167 return operator[]( me.getButton() );
00168 }
00169
00170 void mapEvent(unsigned int button, ManipEventType *met)
00171 {
00172 operator[](button) = met;
00173 }
00174
00175
00176
00177
00178
00179
00180 bool mouse(ManipType *m, const gutz::MouseEvent &me)
00181 {
00182 if( ! (_lastEvent = getEvent(me)) ) return false;
00183 if( !me.isButtonDown() ) return false;
00184 return _lastEvent->startEvent(m, me);
00185 }
00186 bool move(ManipType *m, const gutz::MouseMoveEvent &mme)
00187 {
00188 if( (!_lastEvent) ) return false;
00189 return _lastEvent->handleEvent(m, mme);
00190 }
00191 void endEvent(ManipType *m, const gutz::MouseEvent &me)
00192 {
00193 if( _lastEvent ) _lastEvent->endEvent(m, me);
00194 }
00195 bool tumble(ManipType *m)
00196 {
00197 if( ! _lastEvent ) return false;
00198 return _lastEvent->tumble(m);
00199 }
00200
00201
00202
00203
00204
00205
00206
00207
00208 void clearEvents() { clear(); }
00209
00210
00211
00212
00213
00214
00215 void cloneEvents(const EventMap &em)
00216 {
00217 for(CIter ei = em.begin(); ei != em.end(); ++ei)
00218 {
00219 if( (*ei).second )
00220 mapEvent((*ei).first, (*ei).second->clone());
00221 }
00222 }
00223
00224 void shareEvents(const EventMap &em)
00225 {
00226 for(CIter ei = em.begin(); ei != em.end(); ++ei)
00227 {
00228 if( (*ei).second )
00229 mapEvent((*ei).first, (*ei).second);
00230 }
00231 }
00232
00233
00234
00235 protected:
00236 ManipEventTypeSP _lastEvent;
00237
00238 };
00239
00240
00241 }
00242
00243 #endif
00244