SDL Window Engine  20200905
swe_events.h
1 /***************************************************************************
2  * Copyright (C) 2017 by SWE team <sdl.window.engine@gmail.com> *
3  * *
4  * Part of the SWE: SDL Window Engine: *
5  * https://github.com/AndreyBarmaley/sdl-window-engine *
6  * *
7  * This program is free software; you can redistribute it and/or modify *
8  * it under the terms of the GNU General Public License as published by *
9  * the Free Software Foundation; either version 3 of the License, or *
10  * (at your option) any later version. *
11  * *
12  * This program is distributed in the hope that it will be useful, *
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15  * GNU General Public License for more details. *
16  * *
17  * You should have received a copy of the GNU General Public License *
18  * along with this program; if not, write to the *
19  * Free Software Foundation, Inc., *
20  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21  ***************************************************************************/
22 
23 #ifndef _SWE_EVENTS_
24 #define _SWE_EVENTS_
25 
26 #include "swe_rect.h"
27 #include "swe_object.h"
28 
30 namespace SWE
31 {
33  void clearAllSignals(void);
34 
36 
56  class SignalMember : public ObjectEvent
57  {
58  public:
59  virtual ~SignalMember();
60 
65  static void signalSubscribe(const SignalMember & sender, int sig, SignalMember & receiver);
66 
69  static void signalUnsubscribe(const SignalMember & receiver);
70 
74  static void signalEmit(const SignalMember & sender, int sig);
75 
78  static bool signalSubscribed(const SignalMember & sender, int sig = 0 /* all signals */);
79 
80  const char* className(void) const override { return "SWE::SignalMember"; }
81 
82  protected:
86  void signalSubscribe(const SignalMember & sender, int sig);
87 
88 
91  void signalEmit(int sig);
92 
94  virtual void signalReceive(int sig, const SignalMember* sender) {}
95  };
96 
98  class BaseObject : public SignalMember
99  {
100  public:
101  BaseObject();
102  virtual ~BaseObject();
103 
105  virtual bool isValidObject(void) const { return false; }
106  };
107 
108 #ifdef SWE_SDL12
109  enum ButtonType
112  {
113  ButtonNone, ButtonLeft = SDL_BUTTON(SDL_BUTTON_LEFT), ButtonRight = SDL_BUTTON(SDL_BUTTON_RIGHT), ButtonMiddle = SDL_BUTTON(SDL_BUTTON_MIDDLE),
114  ButtonX1 = SDL_BUTTON(SDL_BUTTON_WHEELUP), ButtonX2 = SDL_BUTTON(SDL_BUTTON_WHEELDOWN), FingerTap = SDL_BUTTON(ButtonLeft)
115  };
116 #else
117  enum ButtonType
120  {
121  ButtonNone, ButtonLeft = SDL_BUTTON(SDL_BUTTON_LEFT), ButtonRight = SDL_BUTTON(SDL_BUTTON_RIGHT), ButtonMiddle = SDL_BUTTON(SDL_BUTTON_MIDDLE),
122  ButtonX1 = SDL_BUTTON(SDL_BUTTON_X1), ButtonX2 = SDL_BUTTON(SDL_BUTTON_X2), FingerTap = SDL_BUTTON(ButtonLeft)
123  };
124 #endif
125 
128  {
129  protected:
130  ButtonType btn;
131 
132  public:
133  MouseButton(ButtonType type = ButtonNone) : btn(type) {}
134 
135  bool isButton(ButtonType type) const { return btn == type; }
136  bool isButtonLeft(void) const { return btn == ButtonLeft; }
137  bool isButtonRight(void) const { return btn == ButtonRight; }
138  bool isButtonMiddle(void) const { return btn == ButtonMiddle; }
139  bool isButtonX1(void) const { return btn == ButtonX1; }
140  bool isButtonX2(void) const { return btn == ButtonX2; }
141  const ButtonType & button(void) const { return btn; }
142  };
143 
145  class ButtonEvent : public MouseButton
146  {
147  protected:
148  Point coord;
149 
150  public:
151  ButtonEvent(ButtonType type = ButtonNone) : MouseButton(type) {}
152  ButtonEvent(ButtonType type, const Point & pos) : MouseButton(type), coord(pos) {}
153 
154  void setPosition(const Point & pos) { coord = pos; }
155  const Point & position(void) const { return coord; }
156  };
157 
160  {
161  protected:
162  ButtonEvent coord1;
163  ButtonEvent coord2;
164 
165  public:
166  ButtonsEvent(ButtonType type = ButtonNone) : coord1(type), coord2(type) {}
167  ButtonsEvent(ButtonType type, const Point & pos1, const Point & pos2) : coord1(type, pos1), coord2(type, pos2) {}
168 
169  bool isClick(const Rect & rt) const {
170  return (rt & coord1.position()) && (rt & coord2.position()); }
171 
172  void setPress(const Point & pos) { coord1.setPosition(pos); }
173  void setRelease(const Point & pos) { coord2.setPosition(pos); }
174 
175  const ButtonEvent & press(void) const { return coord1; }
176  const ButtonEvent & release(void) const { return coord2; }
177 
178  bool isButtonLeft(void) const { return press().isButtonLeft(); }
179  bool isButtonRight(void) const { return press().isButtonRight(); }
180  bool isButtonMiddle(void) const { return press().isButtonMiddle(); }
181  bool isButtonX1(void) const { return press().isButtonX1(); }
182  bool isButtonX2(void) const { return press().isButtonX2(); }
183  };
184 
186  struct UserEvent
187  {
188  int code;
189  void* data1;
190  void* data2;
191 
192  UserEvent() : code(0), data1(nullptr), data2(nullptr) {}
193  UserEvent(int v, void* p1, void* p2) : code(v), data1(p1), data2(p2) {}
194  UserEvent(const SDL_UserEvent & ev) : code(ev.code), data1(ev.data1), data2(ev.data2) {}
195 
196  bool operator== (const UserEvent & ev) const
197  {
198  return code == ev.code && data1 == ev.data1 && data2 == ev.data2;
199  }
200  };
201 
204  enum Signal
205  {
206  EventNone = 0x01000000,
207  SceneDirty,
208  WindowCreated, WindowCheckFocus, WindowScrolledPrev, WindowScrolledNext, WindowPageUp, WindowPageDown,
209  ListWidgetScrolled, ListWidgetChanged, ListWidgetRemoveItem, ListWidgetTakeItem,
210  ScrollBarMoved,
211  LineEditTextChanged, LineEditCursorChanged, LineEditReturnPressed,
212 
213  ButtonPressed, ButtonReleased, ButtonClicked, ButtonSetFocus, ButtonResetFocus, ButtonTimerComplete,
214  GestureFingerUp, GestureFingerDown, GestureFingerLeft, GestureFingerRight,
215  FingerMoveUp, FingerMoveDown, FingerMoveLeft, FingerMoveRight,
216  LuaUnrefAction
217  };
218 
219 } // SWE
220 #endif
класс объектов сцены DisplayScene, с возможностью отправки/получения сигналов
Definition: swe_events.h:56
класс объектов сцены DisplayScene, с возможностью отправки/получения сообщений
Definition: swe_object.h:79
static bool signalSubscribed(const SignalMember &sender, int sig=0)
функция проверки на подписку сигнала
Definition: swe_events.cpp:66
Signal
перечисление системных сигналов
Definition: swe_events.h:204
пространство SWE.
Definition: swe_binarybuf.cpp:30
класс прямоугольника
Definition: swe_rect.h:144
ButtonType
перечисление тип кнопки мышки
Definition: swe_events.h:119
event класс кнопки мыши (с состояниями press, release)
Definition: swe_events.h:159
класс точки с двумя координатами
Definition: swe_rect.h:72
базовый класс не графических объектов сцены DisplayScene.
Definition: swe_events.h:98
static void signalSubscribe(const SignalMember &sender, int sig, SignalMember &receiver)
функция подписки на сигнал
Definition: swe_events.cpp:61
базовый класс кнопки мышки
Definition: swe_events.h:127
const char * className(void) const override
идентификацинная метка класса
Definition: swe_events.h:80
virtual bool isValidObject(void) const
функция состояния объекта, используется для авторизации получения событий ObjectEvent::tickEvent и Ob...
Definition: swe_events.h:105
static void signalEmit(const SignalMember &sender, int sig)
функция отправки сигнала с подстановкой отправителя
Definition: swe_events.cpp:91
event класс пользовательских данных
Definition: swe_events.h:186
event класс кнопки мыши
Definition: swe_events.h:145
virtual void signalReceive(int sig, const SignalMember *sender)
метод получатель, вызывается при signalEmit со стороны отправителя
Definition: swe_events.h:94
static void signalUnsubscribe(const SignalMember &receiver)
функция отписки от сигнала
Definition: swe_events.cpp:77