Libmacro  0.2
Libmacro is an extensible macro and hotkey library.
signal_functions.h
Go to the documentation of this file.
1 /* Libmacro - A multi-platform, extendable macro and hotkey C library
2  Copyright (C) 2013 Jonathan Pelletier, New Paradigm Software
3 
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Lesser General Public
6  License as published by the Free Software Foundation; either
7  version 2.1 of the License, or (at your option) any later version.
8 
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Lesser General Public License for more details.
13 
14  You should have received a copy of the GNU Lesser General Public
15  License along with this library; if not, write to the Free Software
16  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18 
23 #ifndef MCR_EXTRAS_SIGNAL_FUNCTIONS_H_
24 #define MCR_EXTRAS_SIGNAL_FUNCTIONS_H_
25 
26 #include <QtCore>
27 
28 #include "mcr/extras/iserializer.h"
33 
34 namespace mcr
35 {
36 class SerSignal;
37 class SignalFunctionsPrivate;
39 class MCR_API SignalFunctions : public QObject
40 {
41  Q_OBJECT
42  friend class SignalFunctionsPrivate;
43 public:
44  explicit SignalFunctions(QObject *parent = nullptr,
45  Libmacro *libmacroPt = nullptr);
46  SignalFunctions(const SignalFunctions &) = delete;
47  virtual ~SignalFunctions() override;
48  SignalFunctions &operator =(const SignalFunctions &) = delete;
49 
50  Libmacro &context() const
51  {
52  return *_context;
53  }
54  /* ID of ISignal name */
55  Q_INVOKABLE QVariant id(const QString &name) const;
56  /* Name of ISignal ID */
57  Q_INVOKABLE QString name(const QVariant &id) const;
58 
59  Q_INVOKABLE int modifierCount() const;
60  Q_INVOKABLE unsigned int modifier(const QString &name) const;
61  Q_INVOKABLE QString modifierName(unsigned int mod) const;
62  Q_INVOKABLE QStringList modifierNames() const;
63 
64  Q_INVOKABLE int echoCount() const;
65  Q_INVOKABLE int echo(const QString &name) const;
66  Q_INVOKABLE QString echoName(int echo) const;
67  Q_INVOKABLE QStringList echoNames() const;
68 
69  Q_INVOKABLE int keyCount() const;
70  Q_INVOKABLE int key(const QString &name) const;
71  Q_INVOKABLE QString keyName(int code) const;
72  Q_INVOKABLE QStringList keyNames() const;
73  Q_INVOKABLE unsigned int keyMod(int code) const;
74 
75  SerSignal *serializer(size_t id);
76  SerSignal *serializer(const QVariant &id)
77  {
78  return serializer(id.value<size_t>());
79  }
80  void setSerializer(size_t id, SerSignal *(*serFnc)());
81 private:
82  Libmacro *_context;
83  /* non-exportable */
84  SignalFunctionsPrivate *_private;
85 };
86 
87 class SerSignalPrivate;
88 class MCR_API SerSignal : public ISerializer, public SignalBuilder
89 {
90  friend class SerSignalPrivate;
91 public:
96  typedef SerSignal *(*get_serializer)();
98  typedef QVariant (*get)(const SerSignal &container);
99  typedef void (*set)(SerSignal &container, const QVariant &value);
100 
101  SerSignal(size_t reserveKeys = 0, mcr_ISignal *valueInterface = nullptr);
102  SerSignal(const SerSignal &) = default;
103  virtual ~SerSignal() override;
104  SerSignal &operator =(const SerSignal &) = delete;
105 
106  virtual size_t keyCount(bool canonical) const override;
107  virtual QString *keysArray(bool canonical) const override;
108  virtual QVariant value(const QString &name) const override;
109  virtual void setValue(const QString &name, const QVariant &val) override;
110 
111  virtual inline void setValueInterface(mcr_ISignal *isigPt)
112  {
113  mcr_throwif(!isigPt, EFAULT);
114  _valueInterface = isigPt;
115  }
116  /* Will modify keys, getMap, and setMap */
117  virtual void setMaps(const QString &key, get fnGet, set fnSet);
118  /* Will modify keysCanonical, getMap, and setMap */
119  virtual void setMapsCanonical(const QString &key, get fnGet, set fnSet);
120  /* Will add to both keys and keysCanonical, and add to both getMap and setMap. */
121  virtual void setMapsGeneric(const QString &key, get fnGet, set fnSet)
122  {
123  setMaps(key, fnGet, fnSet);
124  setMapsCanonical(key, fnGet, fnSet);
125  }
126 private:
127  mcr_ISignal *_valueInterface;
128  /* Not exportable */
129  SerSignalPrivate *_private;
130 };
131 
132 class MCR_API SerHidEcho : public SerSignal
133 {
134 public:
135  SerHidEcho();
136 
137  static QVariant echo(const SerSignal &container)
138  {
139  return QVariant::fromValue<size_t>(container.empty() ? 0 :
140  container.data<mcr_HidEcho>()->echo);
141  }
142  static void setEcho(SerSignal &container, const QVariant &val)
143  {
144  container.mkdata().data<mcr_HidEcho>()->echo = val.value<size_t>();
145  }
146  static QVariant echoName(const SerSignal &container);
147  static void setEchoName(SerSignal &container, const QVariant &val);
148 };
149 
150 class MCR_API SerKey : public SerSignal
151 {
152 public:
153  SerKey();
154 
155  static QVariant key(const SerSignal &container)
156  {
157  return container.empty() ? 0 : container.data<mcr_Key>()->key;
158  }
159  static void setKey(SerSignal &container, const QVariant &val)
160  {
161  container.mkdata().data<mcr_Key>()->key = val.toInt();
162  }
163  static QVariant applyType(const SerSignal &container)
164  {
165  return container.empty() ? 0 : container.data<mcr_Key>()->apply;
166  }
167  static void setApplyType(SerSignal &container, const QVariant &val)
168  {
169  container.mkdata().data<mcr_Key>()->apply = static_cast<mcr_ApplyType>
170  (val.toInt());
171  }
172  static QVariant keyName(const SerSignal &container);
173  static void setKeyName(SerSignal &container, const QVariant &val);
174 };
175 
176 class MCR_API SerModifier : public SerSignal
177 {
178 public:
179  SerModifier();
180 
181  static QVariant modifiers(const SerSignal &container)
182  {
183  return container.empty() ? 0 : container.data<mcr_Modifier>()->modifiers;
184  }
185  static void setModifiers(SerSignal &container, const QVariant &val)
186  {
187  container.mkdata().data<mcr_Modifier>()->modifiers = val.toUInt();
188  }
189  static QVariant applyType(const SerSignal &container)
190  {
191  return container.empty() ? 0 : container.data<mcr_Modifier>()->apply;
192  }
193  static void setApplyType(SerSignal &container, const QVariant &val)
194  {
195  container.mkdata().data<mcr_Modifier>()->apply = static_cast<mcr_ApplyType>
196  (val.toInt());
197  }
198 };
199 
200 class MCR_API SerMoveCursor : public SerSignal
201 {
202 public:
203  SerMoveCursor();
204 
205  static QVariant justify(const SerSignal &container)
206  {
207  return container.empty() ? false :
208  container.data<mcr_MoveCursor>()->justify_flag;
209  }
210  static void setJustify(SerSignal &container, const QVariant &val)
211  {
212  container.mkdata().data<mcr_MoveCursor>()->justify_flag = val.toBool();
213  }
214  static QVariant x(const SerSignal &container)
215  {
216  return container.empty() ? 0 : container.data<mcr_MoveCursor>()->position[MCR_X];
217  }
218  static void setX(SerSignal &container, const QVariant &val)
219  {
220  container.mkdata().data<mcr_MoveCursor>()->position[MCR_X] = val.toLongLong();
221  }
222  static QVariant y(const SerSignal &container)
223  {
224  return container.empty() ? 0 : container.data<mcr_MoveCursor>()->position[MCR_Y];
225  }
226  static void setY(SerSignal &container, const QVariant &val)
227  {
228  container.mkdata().data<mcr_MoveCursor>()->position[MCR_Y] = val.toLongLong();
229  }
230  static QVariant z(const SerSignal &container)
231  {
232  return container.empty() ? 0 : container.data<mcr_MoveCursor>()->position[MCR_Z];
233  }
234  static void setZ(SerSignal &container, const QVariant &val)
235  {
236  container.mkdata().data<mcr_MoveCursor>()->position[MCR_Z] = val.toLongLong();
237  }
238 };
239 
240 class MCR_API SerNoOp : public SerSignal
241 {
242 public:
243  SerNoOp();
244 
245  static QVariant sec(const SerSignal &container)
246  {
247  return container.empty() ? 0 : container.data<mcr_NoOp>()->seconds;
248  }
249  static void setSec(SerSignal &container, const QVariant &val)
250  {
251  container.mkdata().data<mcr_NoOp>()->seconds = val.toInt();
252  }
253  static QVariant msec(const SerSignal &container)
254  {
255  return container.empty() ? 0 : container.data<mcr_NoOp>()->milliseconds;
256  }
257  static void setMsec(SerSignal &container, const QVariant &val)
258  {
259  container.mkdata().data<mcr_NoOp>()->milliseconds = val.toInt();
260  }
261 };
262 
263 class MCR_API SerScroll : public SerSignal
264 {
265 public:
266  SerScroll();
267 
268  static QVariant x(const SerSignal &container)
269  {
270  return container.empty() ? 0 : container.data<mcr_Scroll>()->dimensions[MCR_X];
271  }
272  static void setX(SerSignal &container, const QVariant &val)
273  {
274  container.mkdata().data<mcr_Scroll>()->dimensions[MCR_X] = val.toLongLong();
275  }
276  static QVariant y(const SerSignal &container)
277  {
278  return container.empty() ? 0 : container.data<mcr_Scroll>()->dimensions[MCR_Y];
279  }
280  static void setY(SerSignal &container, const QVariant &val)
281  {
282  container.mkdata().data<mcr_Scroll>()->dimensions[MCR_Y] = val.toLongLong();
283  }
284  static QVariant z(const SerSignal &container)
285  {
286  return container.empty() ? 0 : container.data<mcr_Scroll>()->dimensions[MCR_Z];
287  }
288  static void setZ(SerSignal &container, const QVariant &val)
289  {
290  container.mkdata().data<mcr_Scroll>()->dimensions[MCR_Z] = val.toLongLong();
291  }
292 };
293 
294 class MCR_API SerCommand : public SerSignal
295 {
296 public:
297  SerCommand();
298 
299  static QVariant cryptic(const SerSignal &container)
300  {
301  return container.empty() ? false : container.data<ICommand>()->cryptic();
302  }
303  static void setCryptic(SerSignal &container, const QVariant &val)
304  {
305  container.mkdata().data<ICommand>()->setCryptic(val.toBool());
306  }
307  static QVariant file(const SerSignal &container)
308  {
309  return QString::fromStdString(container.empty() ? "" :
310  *container.data<ICommand>()->file());
311  }
312  static void setFile(SerSignal &container, const QVariant &val)
313  {
314  QString f = val.toString();
315  container.mkdata().data<ICommand>()->setFile(f.toUtf8().constData());
316  }
317  static QVariant args(const SerSignal &container);
318  static void setArgs(SerSignal &container, const QVariant &val);
319 };
320 
321 class MCR_API SerInterrupt : public SerSignal
322 {
323 public:
324  SerInterrupt();
325 
326  static QVariant type(const SerSignal &container)
327  {
328  return container.empty() ? 0 : container.data<IInterrupt>()->type();
329  }
330  static void setType(SerSignal &container, const QVariant &val)
331  {
332  container.mkdata().data<IInterrupt>()->setType(val.toInt());
333  }
334  static QVariant target(const SerSignal &container)
335  {
336  return container.empty() ? "" : container.data<IInterrupt>()->target();
337  }
338  static void setTarget(SerSignal &container, const QVariant &val)
339  {
340  QString t = val.toString();
341  container.mkdata().data<IInterrupt>()->setTarget(t.toUtf8().constData());
342  }
343 };
344 
345 class MCR_API SerStringKey : public SerSignal
346 {
347 public:
348  SerStringKey();
349 
350  static QVariant cryptic(const SerSignal &container)
351  {
352  return container.empty() ? false : container.data<IStringKey>()->cryptic();
353  }
354  static void setCryptic(SerSignal &container, const QVariant &val)
355  {
356  container.mkdata().data<IStringKey>()->setCryptic(val.toBool());
357  }
358  static QVariant sec(const SerSignal &container)
359  {
360  return container.empty() ? 0 : container.data<IStringKey>()->seconds();
361  }
362  static void setSec(SerSignal &container, const QVariant &val)
363  {
364  container.mkdata().data<IStringKey>()->setSeconds(val.toInt());
365  }
366  static QVariant msec(const SerSignal &container)
367  {
368  return container.empty() ? 0 : container.data<IStringKey>()->milliseconds();
369  }
370  static void setMsec(SerSignal &container, const QVariant &val)
371  {
372  container.mkdata().data<IStringKey>()->setMilliseconds(val.toInt());
373  }
374  static QVariant text(const SerSignal &container)
375  {
376  return QString::fromStdString(container.empty() ? "" :
377  *container.data<IStringKey>()->text());
378  }
379  static void setText(SerSignal &container, const QVariant &val)
380  {
381  QString f = val.toString();
382  container.mkdata().data<IStringKey>()->setText(f.toUtf8().constData());
383  }
384 };
385 }
386 
387 #endif
#define mcr_throwif(condition, errorNumber)
Definition: defines.h:415
Command - Execute a shell command, similar to execvp, with restrictions and without closing current p...
StringKey - Turn a text string into a set of signals, such as a key press
Definition: key.h:38
Definition: noop.h:33
Libmacro, by Jonathan Pelletier, New Paradigm Software. Alpha version.
Definition: classes.h:31
Get/Set all values of an object.
Definition: iserializer.h:35