Mercurial > otakunoraifu
diff window/event.h @ 0:223b71206888
Initial import
author | thib |
---|---|
date | Fri, 01 Aug 2008 16:32:45 +0000 |
parents | |
children | 5ae5533b3a9a |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/window/event.h @@ -0,0 +1,99 @@ +#ifndef __EVENT__ +#define __EVENT__ + +#include"rect.h" +#include"SDL.h" + +namespace Event { + +class Video; +class Time; +class Container; + +/* +** マウスの press, ドラッグ、in/out を検出できる +** focus がある時の left/right/space(==press) のキーを判別できる +*/ +struct Video { + virtual void Press(void) {} + virtual void Release(void) {} + virtual void Drag(int x_from, int y_from, int x_to, int y_to) {} + virtual void Motion(int x, int y) {} + virtual void In(void) {} + virtual void Out(void) {} + virtual void KeyLeft(void) {} + virtual void KeyRight(void) {} + + int point_in(int x, int y); /* z or -1 を返す。大きいほど高いところにある */ + + Video(Container& container); + Video(Container& container, const Rect& init_rect); + Video(Container& container, const Rect& init_rect, int z); + void SetRegion(const Rect& new_rect); + void SetZ(int new_z); + void activate(void); + void deactivate(void); + virtual ~Video(); + + Rect Region(void) const { return region;} +private: + Rect region; + int z; + Container& parent; + bool activated; + friend bool operator <(const Video& position1, const Video& position2); +}; + +struct Time { + enum { NEVER_WAKE = 0xffffffff, FRAME_UPDATE = 0xfffffffe}; + virtual void Elapsed(unsigned int current_time) {wakeup_time = NEVER_WAKE; }; /* next: never elapsed */ + void SetWakeup(unsigned int new_wakeup_time) { wakeup_time = new_wakeup_time; } + unsigned Wakeup(void) const { return wakeup_time; } + + Time(Container& container); + ~Time(); +private: + unsigned int wakeup_time; + Container& parent; +}; + +struct Container { +#define MOUSE_LEFT 0 +#define MOUSE_MIDDLE 1 +#define MOUSE_RIGHT 2 +#define MOUSE_UP 3 +#define MOUSE_DOWN 4 +#define KEY_SHIFT 10 +#define BUTTON_MAX 32 + int button_pressed; + int button_presscount[BUTTON_MAX]; + int current_time; + + void MousePos(int& x, int& y); + bool Exec(unsigned int current_time); + + void Add(Video* item); + void Delete(Video* item); + + void Add(Time* item); + void Delete(Time* item); + + typedef bool (*motionfunc)(int x, int y, void* pointer); + void RegisterGlobalMotionFunc(motionfunc, void* pointer); // マウスの移動のたびに呼び出される関数を登録する + void DeleteGlobalMotionFunc(motionfunc, void* pointer); + void RegisterGlobalPressFunc(motionfunc, void* pointer); // マウスのクリックのたびに呼び出される関数を登録する + void DeleteGlobalPressFunc(motionfunc, void* pointer); + + Container(void); + ~Container(void); + bool pressed(int mask); + bool presscount(int mask); +private: + class ContainerImplVideo* pimpl_video; + class ContainerImplTime* pimpl_time; +}; + +}; /* end of namespace Event */ + + +#endif