TDME2  1.9.200
GUIMiniScript.cpp
Go to the documentation of this file.
2 
3 #include <memory>
4 #include <span>
5 #include <string>
6 #include <unordered_map>
7 #include <vector>
8 
9 #include <tdme/tdme.h>
14 #include <tdme/gui/GUI.h>
15 #include <tdme/gui/GUIParser.h>
28 #include <tdme/utilities/Console.h>
31 
32 using std::make_unique;
33 using std::span;
34 using std::string;
35 using std::to_string;
36 using std::unique_ptr;
37 using std::unordered_map;
38 using std::vector;
39 
44 using tdme::gui::GUI;
63 
64 const vector<string> GUIMiniScript::CONTEXTFUNCTION_GUI = {};
65 
66 GUIMiniScript::GUIMiniScript(GUIScreenNode* screenNode): EngineMiniScript(), screenNode(screenNode) {
67 }
68 
70 }
71 
73  return "tdme::gui::scripting::GUIMiniScript";
74 }
75 
76 const vector<string> GUIMiniScript::getTranspilationUnits() {
77  auto transpilationUnits = EngineMiniScript::getTranspilationUnits();
78  transpilationUnits.push_back("src/tdme/gui/scripting/GUIMiniScript.cpp");
79  return transpilationUnits;
80 }
81 
83  EngineMiniScript::registerStateMachineStates();
84 }
85 
87  EngineMiniScript::registerMethods();
88  // input
89  {
90  //
91  class ScriptMethodInputKeyboardKEYCODE_LEFT: public ScriptMethod {
92  private:
93  GUIMiniScript* miniScript { nullptr };
94  public:
95  ScriptMethodInputKeyboardKEYCODE_LEFT(GUIMiniScript* miniScript):
96  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
97  miniScript(miniScript) {}
98  const string getMethodName() override {
99  return "input.keyboard.KEYCODE_LEFT";
100  }
101  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
102  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_LEFT);
103  }
104  const vector<string>& getContextFunctions() {
105  return CONTEXTFUNCTION_GUI;
106  }
107  };
108  registerMethod(new ScriptMethodInputKeyboardKEYCODE_LEFT(this));
109  }
110  {
111  //
112  class ScriptMethodInputKeyboardKEYCODE_RIGHT: public ScriptMethod {
113  private:
114  GUIMiniScript* miniScript { nullptr };
115  public:
116  ScriptMethodInputKeyboardKEYCODE_RIGHT(GUIMiniScript* miniScript):
117  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
118  miniScript(miniScript) {}
119  const string getMethodName() override {
120  return "input.keyboard.KEYCODE_RIGHT";
121  }
122  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
123  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_RIGHT);
124  }
125  const vector<string>& getContextFunctions() {
126  return CONTEXTFUNCTION_GUI;
127  }
128  };
129  registerMethod(new ScriptMethodInputKeyboardKEYCODE_RIGHT(this));
130  }
131  {
132  //
133  class ScriptMethodInputKeyboardKEYCODE_UP: public ScriptMethod {
134  private:
135  GUIMiniScript* miniScript { nullptr };
136  public:
137  ScriptMethodInputKeyboardKEYCODE_UP(GUIMiniScript* miniScript):
138  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
139  miniScript(miniScript) {}
140  const string getMethodName() override {
141  return "input.keyboard.KEYCODE_UP";
142  }
143  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
144  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_UP);
145  }
146  const vector<string>& getContextFunctions() {
147  return CONTEXTFUNCTION_GUI;
148  }
149  };
150  registerMethod(new ScriptMethodInputKeyboardKEYCODE_UP(this));
151  }
152  {
153  //
154  class ScriptMethodInputKeyboardKEYCODE_DOWN: public ScriptMethod {
155  private:
156  GUIMiniScript* miniScript { nullptr };
157  public:
158  ScriptMethodInputKeyboardKEYCODE_DOWN(GUIMiniScript* miniScript):
159  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
160  miniScript(miniScript) {}
161  const string getMethodName() override {
162  return "input.keyboard.KEYCODE_DOWN";
163  }
164  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
165  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_DOWN);
166  }
167  const vector<string>& getContextFunctions() {
168  return CONTEXTFUNCTION_GUI;
169  }
170  };
171  registerMethod(new ScriptMethodInputKeyboardKEYCODE_DOWN(this));
172  }
173  {
174  //
175  class ScriptMethodInputKeyboardKEYCODE_POS1: public ScriptMethod {
176  private:
177  GUIMiniScript* miniScript { nullptr };
178  public:
179  ScriptMethodInputKeyboardKEYCODE_POS1(GUIMiniScript* miniScript):
180  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
181  miniScript(miniScript) {}
182  const string getMethodName() override {
183  return "input.keyboard.KEYCODE_POS1";
184  }
185  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
186  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_POS1);
187  }
188  const vector<string>& getContextFunctions() {
189  return CONTEXTFUNCTION_GUI;
190  }
191  };
192  registerMethod(new ScriptMethodInputKeyboardKEYCODE_POS1(this));
193  }
194  {
195  //
196  class ScriptMethodInputKeyboardKEYCODE_END: public ScriptMethod {
197  private:
198  GUIMiniScript* miniScript { nullptr };
199  public:
200  ScriptMethodInputKeyboardKEYCODE_END(GUIMiniScript* miniScript):
201  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
202  miniScript(miniScript) {}
203  const string getMethodName() override {
204  return "input.keyboard.KEYCODE_END";
205  }
206  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
207  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_END);
208  }
209  const vector<string>& getContextFunctions() {
210  return CONTEXTFUNCTION_GUI;
211  }
212  };
213  registerMethod(new ScriptMethodInputKeyboardKEYCODE_END(this));
214  }
215  {
216  //
217  class ScriptMethodInputKeyboardKEYCODE_PAGEUP: public ScriptMethod {
218  private:
219  GUIMiniScript* miniScript { nullptr };
220  public:
221  ScriptMethodInputKeyboardKEYCODE_PAGEUP(GUIMiniScript* miniScript):
222  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
223  miniScript(miniScript) {}
224  const string getMethodName() override {
225  return "input.keyboard.KEYCODE_PAGEUP";
226  }
227  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
228  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_PAGE_UP);
229  }
230  const vector<string>& getContextFunctions() {
231  return CONTEXTFUNCTION_GUI;
232  }
233  };
234  registerMethod(new ScriptMethodInputKeyboardKEYCODE_PAGEUP(this));
235  }
236  {
237  //
238  class ScriptMethodInputKeyboardKEYCODE_PAGEDOWN: public ScriptMethod {
239  private:
240  GUIMiniScript* miniScript { nullptr };
241  public:
242  ScriptMethodInputKeyboardKEYCODE_PAGEDOWN(GUIMiniScript* miniScript):
243  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
244  miniScript(miniScript) {}
245  const string getMethodName() override {
246  return "input.keyboard.KEYCODE_PAGEDOWN";
247  }
248  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
249  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_PAGE_DOWN);
250  }
251  const vector<string>& getContextFunctions() {
252  return CONTEXTFUNCTION_GUI;
253  }
254  };
255  registerMethod(new ScriptMethodInputKeyboardKEYCODE_PAGEDOWN(this));
256  }
257  {
258  //
259  class ScriptMethodInputKeyboardKEYCODE_BACKSPACE: public ScriptMethod {
260  private:
261  GUIMiniScript* miniScript { nullptr };
262  public:
263  ScriptMethodInputKeyboardKEYCODE_BACKSPACE(GUIMiniScript* miniScript):
264  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
265  miniScript(miniScript) {}
266  const string getMethodName() override {
267  return "input.keyboard.KEYCODE_BACKSPACE";
268  }
269  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
270  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_BACKSPACE);
271  }
272  const vector<string>& getContextFunctions() {
273  return CONTEXTFUNCTION_GUI;
274  }
275  };
276  registerMethod(new ScriptMethodInputKeyboardKEYCODE_BACKSPACE(this));
277  }
278  {
279  //
280  class ScriptMethodInputKeyboardKEYCODE_DELETE: public ScriptMethod {
281  private:
282  GUIMiniScript* miniScript { nullptr };
283  public:
284  ScriptMethodInputKeyboardKEYCODE_DELETE(GUIMiniScript* miniScript):
285  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
286  miniScript(miniScript) {}
287  const string getMethodName() override {
288  return "input.keyboard.KEYCODE_DELETE";
289  }
290  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
291  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_DELETE);
292  }
293  const vector<string>& getContextFunctions() {
294  return CONTEXTFUNCTION_GUI;
295  }
296  };
297  registerMethod(new ScriptMethodInputKeyboardKEYCODE_DELETE(this));
298  }
299  {
300  //
301  class ScriptMethodInputKeyboardKEYCODE_SPACE: public ScriptMethod {
302  private:
303  GUIMiniScript* miniScript { nullptr };
304  public:
305  ScriptMethodInputKeyboardKEYCODE_SPACE(GUIMiniScript* miniScript):
306  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
307  miniScript(miniScript) {}
308  const string getMethodName() override {
309  return "input.keyboard.KEYCODE_SPACE";
310  }
311  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
312  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_SPACE);
313  }
314  const vector<string>& getContextFunctions() {
315  return CONTEXTFUNCTION_GUI;
316  }
317  };
318  registerMethod(new ScriptMethodInputKeyboardKEYCODE_SPACE(this));
319  }
320  {
321  //
322  class ScriptMethodInputKeyboardKEYCODE_RETURN: public ScriptMethod {
323  private:
324  GUIMiniScript* miniScript { nullptr };
325  public:
326  ScriptMethodInputKeyboardKEYCODE_RETURN(GUIMiniScript* miniScript):
327  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
328  miniScript(miniScript) {}
329  const string getMethodName() override {
330  return "input.keyboard.KEYCODE_RETURN";
331  }
332  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
333  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_RETURN);
334  }
335  const vector<string>& getContextFunctions() {
336  return CONTEXTFUNCTION_GUI;
337  }
338  };
339  registerMethod(new ScriptMethodInputKeyboardKEYCODE_RETURN(this));
340  }
341  {
342  //
343  class ScriptMethodInputKeyboardKEYCODE_ESCAPE: public ScriptMethod {
344  private:
345  GUIMiniScript* miniScript { nullptr };
346  public:
347  ScriptMethodInputKeyboardKEYCODE_ESCAPE(GUIMiniScript* miniScript):
348  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
349  miniScript(miniScript) {}
350  const string getMethodName() override {
351  return "input.keyboard.KEYCODE_ESCAPE";
352  }
353  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
354  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_ESCAPE);
355  }
356  const vector<string>& getContextFunctions() {
357  return CONTEXTFUNCTION_GUI;
358  }
359  };
360  registerMethod(new ScriptMethodInputKeyboardKEYCODE_ESCAPE(this));
361  }
362  {
363  //
364  class ScriptMethodInputKeyboardKEYCODE_F1: public ScriptMethod {
365  private:
366  GUIMiniScript* miniScript { nullptr };
367  public:
368  ScriptMethodInputKeyboardKEYCODE_F1(GUIMiniScript* miniScript):
369  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
370  miniScript(miniScript) {}
371  const string getMethodName() override {
372  return "input.keyboard.KEYCODE_F1";
373  }
374  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
375  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F1);
376  }
377  const vector<string>& getContextFunctions() {
378  return CONTEXTFUNCTION_GUI;
379  }
380  };
381  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F1(this));
382  }
383  {
384  //
385  class ScriptMethodInputKeyboardKEYCODE_F2: public ScriptMethod {
386  private:
387  GUIMiniScript* miniScript { nullptr };
388  public:
389  ScriptMethodInputKeyboardKEYCODE_F2(GUIMiniScript* miniScript):
390  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
391  miniScript(miniScript) {}
392  const string getMethodName() override {
393  return "input.keyboard.KEYCODE_F2";
394  }
395  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
396  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F2);
397  }
398  const vector<string>& getContextFunctions() {
399  return CONTEXTFUNCTION_GUI;
400  }
401  };
402  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F2(this));
403  }
404  {
405  //
406  class ScriptMethodInputKeyboardKEYCODE_F3: public ScriptMethod {
407  private:
408  GUIMiniScript* miniScript { nullptr };
409  public:
410  ScriptMethodInputKeyboardKEYCODE_F3(GUIMiniScript* miniScript):
411  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
412  miniScript(miniScript) {}
413  const string getMethodName() override {
414  return "input.keyboard.KEYCODE_F3";
415  }
416  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
417  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F3);
418  }
419  const vector<string>& getContextFunctions() {
420  return CONTEXTFUNCTION_GUI;
421  }
422  };
423  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F3(this));
424  }
425  {
426  //
427  class ScriptMethodInputKeyboardKEYCODE_F4: public ScriptMethod {
428  private:
429  GUIMiniScript* miniScript { nullptr };
430  public:
431  ScriptMethodInputKeyboardKEYCODE_F4(GUIMiniScript* miniScript):
432  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
433  miniScript(miniScript) {}
434  const string getMethodName() override {
435  return "input.keyboard.KEYCODE_F4";
436  }
437  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
438  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F4);
439  }
440  const vector<string>& getContextFunctions() {
441  return CONTEXTFUNCTION_GUI;
442  }
443  };
444  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F4(this));
445  }
446  {
447  //
448  class ScriptMethodInputKeyboardKEYCODE_F5: public ScriptMethod {
449  private:
450  GUIMiniScript* miniScript { nullptr };
451  public:
452  ScriptMethodInputKeyboardKEYCODE_F5(GUIMiniScript* miniScript):
453  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
454  miniScript(miniScript) {}
455  const string getMethodName() override {
456  return "input.keyboard.KEYCODE_F5";
457  }
458  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
459  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F5);
460  }
461  const vector<string>& getContextFunctions() {
462  return CONTEXTFUNCTION_GUI;
463  }
464  };
465  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F5(this));
466  }
467  {
468  //
469  class ScriptMethodInputKeyboardKEYCODE_F6: public ScriptMethod {
470  private:
471  GUIMiniScript* miniScript { nullptr };
472  public:
473  ScriptMethodInputKeyboardKEYCODE_F6(GUIMiniScript* miniScript):
474  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
475  miniScript(miniScript) {}
476  const string getMethodName() override {
477  return "input.keyboard.KEYCODE_F6";
478  }
479  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
480  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F6);
481  }
482  const vector<string>& getContextFunctions() {
483  return CONTEXTFUNCTION_GUI;
484  }
485  };
486  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F6(this));
487  }
488  {
489  //
490  class ScriptMethodInputKeyboardKEYCODE_F7: public ScriptMethod {
491  private:
492  GUIMiniScript* miniScript { nullptr };
493  public:
494  ScriptMethodInputKeyboardKEYCODE_F7(GUIMiniScript* miniScript):
495  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
496  miniScript(miniScript) {}
497  const string getMethodName() override {
498  return "input.keyboard.KEYCODE_F7";
499  }
500  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
501  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F7);
502  }
503  const vector<string>& getContextFunctions() {
504  return CONTEXTFUNCTION_GUI;
505  }
506  };
507  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F7(this));
508  }
509  {
510  //
511  class ScriptMethodInputKeyboardKEYCODE_F8: public ScriptMethod {
512  private:
513  GUIMiniScript* miniScript { nullptr };
514  public:
515  ScriptMethodInputKeyboardKEYCODE_F8(GUIMiniScript* miniScript):
516  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
517  miniScript(miniScript) {}
518  const string getMethodName() override {
519  return "input.keyboard.KEYCODE_F8";
520  }
521  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
522  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F8);
523  }
524  const vector<string>& getContextFunctions() {
525  return CONTEXTFUNCTION_GUI;
526  }
527  };
528  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F8(this));
529  }
530  {
531  //
532  class ScriptMethodInputKeyboardKEYCODE_F9: public ScriptMethod {
533  private:
534  GUIMiniScript* miniScript { nullptr };
535  public:
536  ScriptMethodInputKeyboardKEYCODE_F9(GUIMiniScript* miniScript):
537  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
538  miniScript(miniScript) {}
539  const string getMethodName() override {
540  return "input.keyboard.KEYCODE_F9";
541  }
542  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
543  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F9);
544  }
545  const vector<string>& getContextFunctions() {
546  return CONTEXTFUNCTION_GUI;
547  }
548  };
549  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F9(this));
550  }
551  {
552  //
553  class ScriptMethodInputKeyboardKEYCODE_F10: public ScriptMethod {
554  private:
555  GUIMiniScript* miniScript { nullptr };
556  public:
557  ScriptMethodInputKeyboardKEYCODE_F10(GUIMiniScript* miniScript):
558  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
559  miniScript(miniScript) {}
560  const string getMethodName() override {
561  return "input.keyboard.KEYCODE_F10";
562  }
563  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
564  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F10);
565  }
566  const vector<string>& getContextFunctions() {
567  return CONTEXTFUNCTION_GUI;
568  }
569  };
570  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F10(this));
571  }
572  {
573  //
574  class ScriptMethodInputKeyboardKEYCODE_F11: public ScriptMethod {
575  private:
576  GUIMiniScript* miniScript { nullptr };
577  public:
578  ScriptMethodInputKeyboardKEYCODE_F11(GUIMiniScript* miniScript):
579  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
580  miniScript(miniScript) {}
581  const string getMethodName() override {
582  return "input.keyboard.KEYCODE_F11";
583  }
584  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
585  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F11);
586  }
587  const vector<string>& getContextFunctions() {
588  return CONTEXTFUNCTION_GUI;
589  }
590  };
591  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F11(this));
592  }
593  {
594  //
595  class ScriptMethodInputKeyboardKEYCODE_F12: public ScriptMethod {
596  private:
597  GUIMiniScript* miniScript { nullptr };
598  public:
599  ScriptMethodInputKeyboardKEYCODE_F12(GUIMiniScript* miniScript):
600  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
601  miniScript(miniScript) {}
602  const string getMethodName() override {
603  return "input.keyboard.KEYCODE_F12";
604  }
605  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
606  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F12);
607  }
608  const vector<string>& getContextFunctions() {
609  return CONTEXTFUNCTION_GUI;
610  }
611  };
612  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F12(this));
613  }
614  {
615  //
616  class ScriptMethodInputKeyboardIsKeyDown: public ScriptMethod {
617  private:
618  GUIMiniScript* miniScript { nullptr };
619  public:
620  ScriptMethodInputKeyboardIsKeyDown(GUIMiniScript* miniScript):
621  ScriptMethod(
622  {
623  { .type = ScriptVariableType::TYPE_INTEGER, .name = "keyCode", .optional = false, .reference = false, .nullable = false }
624  },
625  ScriptVariableType::TYPE_BOOLEAN
626  ),
627  miniScript(miniScript) {}
628  const string getMethodName() override {
629  return "input.keyboard.isKeyDown";
630  }
631  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
632  int64_t keyCode;
633  if (miniScript->getIntegerValue(argumentValues, 0, keyCode) == true) {
634  returnValue = miniScript->keyboardKeys.find(keyCode) != miniScript->keyboardKeys.end();
635  } else {
636  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
637  miniScript->startErrorScript();
638  }
639  }
640  const vector<string>& getContextFunctions() {
641  return CONTEXTFUNCTION_GUI;
642  }
643  };
644  registerMethod(new ScriptMethodInputKeyboardIsKeyDown(this));
645  }
646  {
647  //
648  class ScriptMethodInputKeyboardIsCharDown: public ScriptMethod {
649  private:
650  GUIMiniScript* miniScript { nullptr };
651  public:
652  ScriptMethodInputKeyboardIsCharDown(GUIMiniScript* miniScript):
653  ScriptMethod(
654  {
655  { .type = ScriptVariableType::TYPE_STRING, .name = "charAsString", .optional = false, .reference = false, .nullable = false }
656  },
657  ScriptVariableType::TYPE_BOOLEAN
658  ),
659  miniScript(miniScript) {}
660  const string getMethodName() override {
661  return "input.keyboard.isCharDown";
662  }
663  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
664  string charAsString;
665  if (miniScript->getStringValue(argumentValues, 0, charAsString) == true) {
666  UTF8CharacterIterator u8It(charAsString);
667  auto keyChar = u8It.hasNext() == true?u8It.next():-1;
668  returnValue = miniScript->keyboardChars.find(keyChar) != miniScript->keyboardChars.end();
669  } else {
670  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
671  miniScript->startErrorScript();
672  }
673  }
674  const vector<string>& getContextFunctions() {
675  return CONTEXTFUNCTION_GUI;
676  }
677  };
678  registerMethod(new ScriptMethodInputKeyboardIsCharDown(this));
679  }
680  {
681  //
682  class ScriptMethodInputKeyboardGetTypedString: public ScriptMethod {
683  private:
684  GUIMiniScript* miniScript { nullptr };
685  public:
686  ScriptMethodInputKeyboardGetTypedString(GUIMiniScript* miniScript):
687  ScriptMethod({}, ScriptVariableType::TYPE_STRING),
688  miniScript(miniScript) {}
689  const string getMethodName() override {
690  return "input.keyboard.getTypedString";
691  }
692  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
693  returnValue = miniScript->keyboardTypedChars;
694  }
695  const vector<string>& getContextFunctions() {
696  return CONTEXTFUNCTION_GUI;
697  }
698  };
699  registerMethod(new ScriptMethodInputKeyboardGetTypedString(this));
700  }
701  {
702  //
703  class ScriptMethodInputKeyboardIsControlDown: public ScriptMethod {
704  private:
705  GUIMiniScript* miniScript { nullptr };
706  public:
707  ScriptMethodInputKeyboardIsControlDown(GUIMiniScript* miniScript):
708  ScriptMethod({}, ScriptVariableType::TYPE_BOOLEAN),
709  miniScript(miniScript) {}
710  const string getMethodName() override {
711  return "input.keyboard.isControlDown";
712  }
713  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
714  returnValue = miniScript->keyboardControlDown == true;
715  }
716  const vector<string>& getContextFunctions() {
717  return CONTEXTFUNCTION_GUI;
718  }
719  };
720  registerMethod(new ScriptMethodInputKeyboardIsControlDown(this));
721  }
722  {
723  //
724  class ScriptMethodInputKeyboardIsMetaDown: public ScriptMethod {
725  private:
726  GUIMiniScript* miniScript { nullptr };
727  public:
728  ScriptMethodInputKeyboardIsMetaDown(GUIMiniScript* miniScript):
729  ScriptMethod({}, ScriptVariableType::TYPE_BOOLEAN),
730  miniScript(miniScript) {}
731  const string getMethodName() override {
732  return "input.keyboard.isMetaDown";
733  }
734  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
735  returnValue = miniScript->keyboardControlDown == true;
736  }
737  const vector<string>& getContextFunctions() {
738  return CONTEXTFUNCTION_GUI;
739  }
740  };
741  registerMethod(new ScriptMethodInputKeyboardIsMetaDown(this));
742  }
743  {
744  //
745  class ScriptMethodInputKeyboardIsAltDown: public ScriptMethod {
746  private:
747  GUIMiniScript* miniScript { nullptr };
748  public:
749  ScriptMethodInputKeyboardIsAltDown(GUIMiniScript* miniScript):
750  ScriptMethod({}, ScriptVariableType::TYPE_BOOLEAN),
751  miniScript(miniScript) {}
752  const string getMethodName() override {
753  return "input.keyboard.isAltDown";
754  }
755  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
756  returnValue = miniScript->keyboardAltDown == true;
757  }
758  const vector<string>& getContextFunctions() {
759  return CONTEXTFUNCTION_GUI;
760  }
761  };
762  registerMethod(new ScriptMethodInputKeyboardIsAltDown(this));
763  }
764  {
765  //
766  class ScriptMethodInputKeyboardIsShiftDown: public ScriptMethod {
767  private:
768  GUIMiniScript* miniScript { nullptr };
769  public:
770  ScriptMethodInputKeyboardIsShiftDown(GUIMiniScript* miniScript):
771  ScriptMethod({}, ScriptVariableType::TYPE_BOOLEAN),
772  miniScript(miniScript) {}
773  const string getMethodName() override {
774  return "input.keyboard.isShiftDown";
775  }
776  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
777  returnValue = miniScript->keyboardShiftDown == true;
778  }
779  const vector<string>& getContextFunctions() {
780  return CONTEXTFUNCTION_GUI;
781  }
782  };
783  registerMethod(new ScriptMethodInputKeyboardIsShiftDown(this));
784  }
785  // mouse input
786  {
787  //
788  class ScriptMethodInputMouseBUTTON_LEFT: public ScriptMethod {
789  private:
790  GUIMiniScript* miniScript { nullptr };
791  public:
792  ScriptMethodInputMouseBUTTON_LEFT(GUIMiniScript* miniScript):
793  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
794  miniScript(miniScript) {}
795  const string getMethodName() override {
796  return "input.mouse.BUTTON_LEFT";
797  }
798  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
799  returnValue = static_cast<int64_t>(GUIMouseEvent::MOUSEEVENT_BUTTON_LEFT - 1);
800  }
801  const vector<string>& getContextFunctions() {
802  return CONTEXTFUNCTION_GUI;
803  }
804  };
805  registerMethod(new ScriptMethodInputMouseBUTTON_LEFT(this));
806  }
807  {
808  //
809  class ScriptMethodInputMouseBUTTON_MIDDLE: public ScriptMethod {
810  private:
811  GUIMiniScript* miniScript { nullptr };
812  public:
813  ScriptMethodInputMouseBUTTON_MIDDLE(GUIMiniScript* miniScript):
814  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
815  miniScript(miniScript) {}
816  const string getMethodName() override {
817  return "input.mouse.BUTTON_MIDDLE";
818  }
819  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
820  returnValue = static_cast<int64_t>(GUIMouseEvent::MOUSEEVENT_BUTTON_MIDDLE - 1);
821  }
822  const vector<string>& getContextFunctions() {
823  return CONTEXTFUNCTION_GUI;
824  }
825  };
826  registerMethod(new ScriptMethodInputMouseBUTTON_MIDDLE(this));
827  }
828  {
829  //
830  class ScriptMethodInputMouseBUTTON_RIGHT: public ScriptMethod {
831  private:
832  GUIMiniScript* miniScript { nullptr };
833  public:
834  ScriptMethodInputMouseBUTTON_RIGHT(GUIMiniScript* miniScript):
835  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
836  miniScript(miniScript) {}
837  const string getMethodName() override {
838  return "input.mouse.BUTTON_RIGHT";
839  }
840  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
841  returnValue = static_cast<int64_t>(GUIMouseEvent::MOUSEEVENT_BUTTON_RIGHT - 1);
842  }
843  const vector<string>& getContextFunctions() {
844  return CONTEXTFUNCTION_GUI;
845  }
846  };
847  registerMethod(new ScriptMethodInputMouseBUTTON_RIGHT(this));
848  }
849  {
850  //
851  class ScriptMethodInputMouseIsButtonDown: public ScriptMethod {
852  private:
853  GUIMiniScript* miniScript { nullptr };
854  public:
855  ScriptMethodInputMouseIsButtonDown(GUIMiniScript* miniScript):
856  ScriptMethod(
857  {
858  { .type = ScriptVariableType::TYPE_INTEGER, .name = "button", .optional = false, .reference = false, .nullable = false }
859  },
860  ScriptVariableType::TYPE_BOOLEAN),
861  miniScript(miniScript) {}
862  const string getMethodName() override {
863  return "input.mouse.isButtonDown";
864  }
865  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
866  int64_t button;
867  if (miniScript->getIntegerValue(argumentValues, 0, button) == true) {
868  returnValue = button >= 0 && button <= 3?miniScript->mouseDown[button]:false;
869  } else {
870  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
871  miniScript->startErrorScript();
872  }
873  }
874  const vector<string>& getContextFunctions() {
875  return CONTEXTFUNCTION_GUI;
876  }
877  };
878  registerMethod(new ScriptMethodInputMouseIsButtonDown(this));
879  }
880  {
881  //
882  class ScriptMethodInputMouseIsButtonUp: public ScriptMethod {
883  private:
884  GUIMiniScript* miniScript { nullptr };
885  public:
886  ScriptMethodInputMouseIsButtonUp(GUIMiniScript* miniScript):
887  ScriptMethod(
888  {
889  { .type = ScriptVariableType::TYPE_INTEGER, .name = "button", .optional = false, .reference = false, .nullable = false }
890  },
891  ScriptVariableType::TYPE_BOOLEAN),
892  miniScript(miniScript) {}
893  const string getMethodName() override {
894  return "input.mouse.isButtonUp";
895  }
896  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
897  int64_t button;
898  if (miniScript->getIntegerValue(argumentValues, 0, button) == true) {
899  returnValue = button >= 0 && button <= 3?miniScript->mouseUp[button]:false;
900  } else {
901  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
902  miniScript->startErrorScript();
903  }
904  }
905  const vector<string>& getContextFunctions() {
906  return CONTEXTFUNCTION_GUI;
907  }
908  };
909  registerMethod(new ScriptMethodInputMouseIsButtonUp(this));
910  }
911  {
912  //
913  class ScriptMethodInputMouseIsDragging: public ScriptMethod {
914  private:
915  GUIMiniScript* miniScript { nullptr };
916  public:
917  ScriptMethodInputMouseIsDragging(GUIMiniScript* miniScript):
918  ScriptMethod(
919  {
920  { .type = ScriptVariableType::TYPE_INTEGER, .name = "button", .optional = false, .reference = false, .nullable = false }
921  },
922  ScriptVariableType::TYPE_BOOLEAN),
923  miniScript(miniScript) {}
924  const string getMethodName() override {
925  return "input.mouse.isDragging";
926  }
927  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
928  int64_t button;
929  if (miniScript->getIntegerValue(argumentValues, 0, button) == true) {
930  returnValue = button >= 0 && button <= 3?miniScript->mouseDragging[button]:false;
931  } else {
932  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
933  miniScript->startErrorScript();
934  }
935  }
936  const vector<string>& getContextFunctions() {
937  return CONTEXTFUNCTION_GUI;
938  }
939  };
940  registerMethod(new ScriptMethodInputMouseIsDragging(this));
941  }
942  {
943  //
944  class ScriptMethodInputMouseHasMoved: public ScriptMethod {
945  private:
946  GUIMiniScript* miniScript { nullptr };
947  public:
948  ScriptMethodInputMouseHasMoved(GUIMiniScript* miniScript):
949  ScriptMethod({}, ScriptVariableType::TYPE_BOOLEAN),
950  miniScript(miniScript) {}
951  const string getMethodName() override {
952  return "input.mouse.hasMoved";
953  }
954  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
955  returnValue = miniScript->mouseMoved;
956  }
957  const vector<string>& getContextFunctions() {
958  return CONTEXTFUNCTION_GUI;
959  }
960  };
961  registerMethod(new ScriptMethodInputMouseHasMoved(this));
962  }
963  {
964  //
965  class ScriptMethodInputMouseGetX: public ScriptMethod {
966  private:
967  GUIMiniScript* miniScript { nullptr };
968  public:
969  ScriptMethodInputMouseGetX(GUIMiniScript* miniScript):
970  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
971  miniScript(miniScript) {}
972  const string getMethodName() override {
973  return "input.mouse.getX";
974  }
975  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
976  returnValue = static_cast<int64_t>(miniScript->mouseX);
977  }
978  const vector<string>& getContextFunctions() {
979  return CONTEXTFUNCTION_GUI;
980  }
981  };
982  registerMethod(new ScriptMethodInputMouseGetX(this));
983  }
984  {
985  //
986  class ScriptMethodInputMouseGetXUnscaled: public ScriptMethod {
987  private:
988  GUIMiniScript* miniScript { nullptr };
989  public:
990  ScriptMethodInputMouseGetXUnscaled(GUIMiniScript* miniScript):
991  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
992  miniScript(miniScript) {}
993  const string getMethodName() override {
994  return "input.mouse.getXUnscaled";
995  }
996  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
997  returnValue = static_cast<int64_t>(miniScript->mouseXUnscaled);
998  }
999  const vector<string>& getContextFunctions() {
1000  return CONTEXTFUNCTION_GUI;
1001  }
1002  };
1003  registerMethod(new ScriptMethodInputMouseGetXUnscaled(this));
1004  }
1005  {
1006  //
1007  class ScriptMethodInputMouseGetY: public ScriptMethod {
1008  private:
1009  GUIMiniScript* miniScript { nullptr };
1010  public:
1011  ScriptMethodInputMouseGetY(GUIMiniScript* miniScript):
1012  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1013  miniScript(miniScript) {}
1014  const string getMethodName() override {
1015  return "input.mouse.getY";
1016  }
1017  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1018  returnValue = static_cast<int64_t>(miniScript->mouseY);
1019  }
1020  const vector<string>& getContextFunctions() {
1021  return CONTEXTFUNCTION_GUI;
1022  }
1023  };
1024  registerMethod(new ScriptMethodInputMouseGetY(this));
1025  }
1026  {
1027  //
1028  class ScriptMethodInputMouseGetYUnscaled: public ScriptMethod {
1029  private:
1030  GUIMiniScript* miniScript { nullptr };
1031  public:
1032  ScriptMethodInputMouseGetYUnscaled(GUIMiniScript* miniScript):
1033  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1034  miniScript(miniScript) {}
1035  const string getMethodName() override {
1036  return "input.mouse.getYUnscaled";
1037  }
1038  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1039  returnValue = static_cast<int64_t>(miniScript->mouseYUnscaled);
1040  }
1041  const vector<string>& getContextFunctions() {
1042  return CONTEXTFUNCTION_GUI;
1043  }
1044  };
1045  registerMethod(new ScriptMethodInputMouseGetYUnscaled(this));
1046  }
1047  {
1048  //
1049  class ScriptMethodInputMouseGetWheelX: public ScriptMethod {
1050  private:
1051  GUIMiniScript* miniScript { nullptr };
1052  public:
1053  ScriptMethodInputMouseGetWheelX(GUIMiniScript* miniScript):
1054  ScriptMethod({}, ScriptVariableType::TYPE_FLOAT),
1055  miniScript(miniScript) {}
1056  const string getMethodName() override {
1057  return "input.mouse.getWheelX";
1058  }
1059  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1060  returnValue = miniScript->mouseWheelX;
1061  }
1062  const vector<string>& getContextFunctions() {
1063  return CONTEXTFUNCTION_GUI;
1064  }
1065  };
1066  registerMethod(new ScriptMethodInputMouseGetWheelX(this));
1067  }
1068  {
1069  //
1070  class ScriptMethodInputMouseGetWheelY: public ScriptMethod {
1071  private:
1072  GUIMiniScript* miniScript { nullptr };
1073  public:
1074  ScriptMethodInputMouseGetWheelY(GUIMiniScript* miniScript):
1075  ScriptMethod({}, ScriptVariableType::TYPE_FLOAT),
1076  miniScript(miniScript) {}
1077  const string getMethodName() override {
1078  return "input.mouse.getWheelY";
1079  }
1080  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1081  returnValue = miniScript->mouseWheelY;
1082  }
1083  const vector<string>& getContextFunctions() {
1084  return CONTEXTFUNCTION_GUI;
1085  }
1086  };
1087  registerMethod(new ScriptMethodInputMouseGetWheelY(this));
1088  }
1089  {
1090  //
1091  class ScriptMethodInputMouseGetWheelZ: public ScriptMethod {
1092  private:
1093  GUIMiniScript* miniScript { nullptr };
1094  public:
1095  ScriptMethodInputMouseGetWheelZ(GUIMiniScript* miniScript):
1096  ScriptMethod({}, ScriptVariableType::TYPE_FLOAT),
1097  miniScript(miniScript) {}
1098  const string getMethodName() override {
1099  return "input.mouse.getWheelZ";
1100  }
1101  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1102  returnValue = miniScript->mouseWheelZ;
1103  }
1104  const vector<string>& getContextFunctions() {
1105  return CONTEXTFUNCTION_GUI;
1106  }
1107  };
1108  registerMethod(new ScriptMethodInputMouseGetWheelZ(this));
1109  }
1110  // gui
1111  {
1112  //
1113  class ScriptMethodGUIScreenSetEnabled: public ScriptMethod {
1114  private:
1115  GUIMiniScript* miniScript { nullptr };
1116  public:
1117  ScriptMethodGUIScreenSetEnabled(GUIMiniScript* miniScript):
1118  ScriptMethod(
1119  {
1120  { .type = ScriptVariableType::TYPE_STRING, .name = "screenId", .optional = false, .reference = false, .nullable = false },
1121  { .type = ScriptVariableType::TYPE_BOOLEAN, .name = "enabled", .optional = false, .reference = false, .nullable = false }
1122  },
1123  ScriptVariableType::TYPE_NULL
1124  ),
1125  miniScript(miniScript) {}
1126  const string getMethodName() override {
1127  return "gui.screen.setEnabled";
1128  }
1129  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1130  string screenId;
1131  bool enabled;
1132  if (miniScript->getStringValue(argumentValues, 0, screenId, false) == false ||
1133  miniScript->getBooleanValue(argumentValues, 1, enabled, false) == false) {
1134  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1135  miniScript->startErrorScript();
1136  } else {
1137  auto screen = miniScript->screenNode->getGUI()->getScreen(screenId);
1138  if (screen != nullptr) {
1139  screen->setEnabled(enabled);
1140  } else {
1141  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no screen with given id: " + screenId);
1142  miniScript->startErrorScript();
1143  }
1144  }
1145  }
1146  const vector<string>& getContextFunctions() {
1147  return CONTEXTFUNCTION_GUI;
1148  }
1149  };
1150  registerMethod(new ScriptMethodGUIScreenSetEnabled(this));
1151  }
1152  {
1153  //
1154  class ScriptMethodGUIScreenIsEnabled: public ScriptMethod {
1155  private:
1156  GUIMiniScript* miniScript { nullptr };
1157  public:
1158  ScriptMethodGUIScreenIsEnabled(GUIMiniScript* miniScript):
1159  ScriptMethod(
1160  {
1161  { .type = ScriptVariableType::TYPE_STRING, .name = "screenId", .optional = false, .reference = false, .nullable = false },
1162  },
1163  ScriptVariableType::TYPE_BOOLEAN
1164  ),
1165  miniScript(miniScript) {}
1166  const string getMethodName() override {
1167  return "gui.screen.isEnabled";
1168  }
1169  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1170  string screenId;
1171  if (miniScript->getStringValue(argumentValues, 0, screenId, false) == false) {
1172  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1173  miniScript->startErrorScript();
1174  } else {
1175  auto screen = miniScript->screenNode->getGUI()->getScreen(screenId);
1176  if (screen != nullptr) {
1177  returnValue.setValue(screen->isEnabled());
1178  } else {
1179  returnValue.setValue(false);
1180  }
1181  }
1182  }
1183  const vector<string>& getContextFunctions() {
1184  return CONTEXTFUNCTION_GUI;
1185  }
1186  };
1187  registerMethod(new ScriptMethodGUIScreenIsEnabled(this));
1188  }
1189  {
1190  //
1191  class ScriptMethodGUIScreenGoto: public ScriptMethod {
1192  private:
1193  GUIMiniScript* miniScript { nullptr };
1194  public:
1195  ScriptMethodGUIScreenGoto(GUIMiniScript* miniScript):
1196  ScriptMethod(
1197  {
1198  { .type = ScriptVariableType::TYPE_STRING, .name = "fileName", .optional = false, .reference = false, .nullable = false },
1199  { .type = ScriptVariableType::TYPE_MAP, .name = "variables", .optional = true, .reference = false, .nullable = false },
1200  { .type = ScriptVariableType::TYPE_PSEUDO_MIXED, .name = "arguments", .optional = true, .reference = false, .nullable = false }
1201  },
1202  ScriptVariableType::TYPE_NULL
1203  ),
1204  miniScript(miniScript) {}
1205  const string getMethodName() override {
1206  return "gui.screen.goto";
1207  }
1208  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1209  string fileName;
1210  if (argumentValues.size() > 3 ||
1211  EngineMiniScript::getStringValue(argumentValues, 0, fileName, false) == false) {
1212  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1213  miniScript->startErrorScript();
1214  } else {
1215  // delete next screen node if given
1216  miniScript->nextScreenNode = nullptr;
1217  // variables
1218  unordered_map<string, string> variables;
1219  if (argumentValues.size() >= 2) {
1220  auto mapPtr = argumentValues[1].getMapPointer();
1221  if (mapPtr != nullptr) {
1222  for (const auto& [mapEntryKey, mapEntryValue]: *mapPtr) {
1223  variables[mapEntryKey] = mapEntryValue->getValueAsString();
1224  }
1225  }
1226  }
1227  // setup next screen node
1228  try {
1229  string screenPathName;
1230  string screenFileName;
1231  miniScript->screenNode->getProjectFilePathNameAndFileName(fileName, screenPathName, screenFileName);
1232  //
1233  miniScript->nextScreenNode = unique_ptr<GUIScreenNode>(
1235  screenPathName,
1236  screenFileName,
1237  variables,
1238  argumentValues.size() == 3?argumentValues[2]:EngineMiniScript::ScriptVariable(),
1239  miniScript->screenNode->getContext()
1240  )
1241  );
1242  } catch (Exception& exception) {
1243  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": an error occurred with goto screen to '" + fileName + "': " + string(exception.what()));
1244  miniScript->startErrorScript();
1245  }
1246  }
1247  }
1248  const vector<string>& getContextFunctions() {
1249  return CONTEXTFUNCTION_GUI;
1250  }
1251  };
1252  registerMethod(new ScriptMethodGUIScreenGoto(this));
1253  }
1254  {
1255  //
1256  class ScriptMethodGUIScreenPush: public ScriptMethod {
1257  private:
1258  GUIMiniScript* miniScript { nullptr };
1259  public:
1260  ScriptMethodGUIScreenPush(GUIMiniScript* miniScript):
1261  ScriptMethod(
1262  {
1263  { .type = ScriptVariableType::TYPE_STRING, .name = "fileName", .optional = false, .reference = false, .nullable = false },
1264  { .type = ScriptVariableType::TYPE_MAP, .name = "variables", .optional = true, .reference = false, .nullable = false },
1265  { .type = ScriptVariableType::TYPE_PSEUDO_MIXED, .name = "arguments", .optional = true, .reference = false, .nullable = false }
1266  },
1267  ScriptVariableType::TYPE_NULL
1268  ),
1269  miniScript(miniScript) {}
1270  const string getMethodName() override {
1271  return "gui.screen.push";
1272  }
1273  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1274  string fileName;
1275  if (argumentValues.size() > 3 ||
1276  EngineMiniScript::getStringValue(argumentValues, 0, fileName, false) == false) {
1277  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1278  miniScript->startErrorScript();
1279  } else {
1280  // variables
1281  unordered_map<string, string> variables;
1282  if (argumentValues.size() >= 2) {
1283  auto mapPtr = argumentValues[1].getMapPointer();
1284  if (mapPtr != nullptr) {
1285  for (const auto& [mapEntryKey, mapEntryValue]: *mapPtr) {
1286  variables[mapEntryKey] = mapEntryValue->getValueAsString();
1287  }
1288  }
1289  }
1290  // push screen node
1291  try {
1292  string screenPathName;
1293  string screenFileName;
1294  miniScript->screenNode->getProjectFilePathNameAndFileName(fileName, screenPathName, screenFileName);
1295  //
1297  screenPathName,
1298  screenFileName,
1299  variables,
1300  argumentValues.size() == 3?argumentValues[2]:EngineMiniScript::ScriptVariable(),
1301  miniScript->screenNode->getContext()
1302  );
1303  miniScript->screenNode->getGUI()->addScreen(screenNode->getId(), screenNode);
1304  miniScript->screenNode->getGUI()->addRenderScreen(screenNode->getId());
1305  } catch (Exception& exception) {
1306  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": an error occurred with pushing screen '" + fileName + "': " + string(exception.what()));
1307  miniScript->startErrorScript();
1308  }
1309  }
1310  }
1311  const vector<string>& getContextFunctions() {
1312  return CONTEXTFUNCTION_GUI;
1313  }
1314  };
1315  registerMethod(new ScriptMethodGUIScreenPush(this));
1316  }
1317  {
1318  //
1319  class ScriptMethodGUIScreenPop: public ScriptMethod {
1320  private:
1321  GUIMiniScript* miniScript { nullptr };
1322  public:
1323  ScriptMethodGUIScreenPop(GUIMiniScript* miniScript):
1324  ScriptMethod(
1325  {},
1326  ScriptVariableType::TYPE_NULL
1327  ),
1328  miniScript(miniScript) {}
1329  const string getMethodName() override {
1330  // mark as popped
1331  return "gui.screen.pop";
1332  }
1333  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1334  miniScript->popped = true;
1335  }
1336  const vector<string>& getContextFunctions() {
1337  return CONTEXTFUNCTION_GUI;
1338  }
1339  };
1340  registerMethod(new ScriptMethodGUIScreenPop(this));
1341  }
1342  {
1343  //
1344  class ScriptMethodGUIScreenCall: public ScriptMethod {
1345  private:
1346  GUIMiniScript* miniScript { nullptr };
1347  public:
1348  ScriptMethodGUIScreenCall(GUIMiniScript* miniScript):
1349  ScriptMethod(
1350  {
1351  { .type = ScriptVariableType::TYPE_STRING, .name = "screenId", .optional = false, .reference = false, .nullable = false },
1352  { .type = ScriptVariableType::TYPE_STRING, .name = "function", .optional = false, .reference = false, .nullable = false }
1353  },
1354  ScriptVariableType::TYPE_PSEUDO_MIXED
1355  ),
1356  miniScript(miniScript) {}
1357  const string getMethodName() override {
1358  return "gui.screen.call";
1359  }
1360  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1361  string screenId;
1362  string function;
1363  if (miniScript->getStringValue(argumentValues, 0, screenId) == false ||
1364  miniScript->getStringValue(argumentValues, 1, function) == false) {
1365  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1366  miniScript->startErrorScript();
1367  } else {
1368  auto screen = miniScript->screenNode->getGUI()->getScreen(screenId);
1369  auto screenMiniScript = screen != nullptr?screen->getMiniScript():nullptr;
1370  auto scriptIdx = screenMiniScript != nullptr?screenMiniScript->getFunctionScriptIdx(function):SCRIPTIDX_NONE;
1371  if (screen == nullptr) {
1372  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": screen not found: " + screenId);
1373  miniScript->startErrorScript();
1374  } else
1375  if (screenMiniScript == nullptr) {
1376  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": screen mini script not found for given screen: " + screenId);
1377  miniScript->startErrorScript();
1378  } else
1379  if (scriptIdx == SCRIPTIDX_NONE) {
1380  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": screen: " + screenId + ", function not found: " + function);
1381  miniScript->startErrorScript();
1382  } else {
1383  #if defined (__APPLE__)
1384  // MACOSX currently does not support initializing span using begin and end iterators,
1385  // so we need to make a copy of argumentValues beginning from second element
1386  vector<ScriptVariable> callArgumentValues;
1387  for (auto i = 2; i < argumentValues.size(); i++) callArgumentValues.push_back(argumentValues[i]);
1388  // call
1389  span callArgumentValuesSpan(callArgumentValues);
1390  screenMiniScript->call(scriptIdx, callArgumentValuesSpan, returnValue);
1391  #else
1392  span callArgumentValuesSpan(argumentValues.begin() + 2, argumentValues.end());
1393  screenMiniScript->call(scriptIdx, callArgumentValuesSpan, returnValue);
1394  #endif
1395  }
1396  }
1397  }
1398  bool isVariadic() const override {
1399  return true;
1400  }
1401  const vector<string>& getContextFunctions() {
1402  return CONTEXTFUNCTION_GUI;
1403  }
1404  };
1405  registerMethod(new ScriptMethodGUIScreenCall(this));
1406  }
1407  {
1408  //
1409  class ScriptMethodScreenNodeGetId: public ScriptMethod {
1410  private:
1411  GUIMiniScript* miniScript { nullptr };
1412  public:
1413  ScriptMethodScreenNodeGetId(GUIMiniScript* miniScript):
1414  ScriptMethod({}, ScriptVariableType::TYPE_STRING),
1415  miniScript(miniScript) {}
1416  const string getMethodName() override {
1417  return "gui.screennode.getId";
1418  }
1419  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1420  returnValue.setValue(miniScript->screenNode->getId());
1421  }
1422  const vector<string>& getContextFunctions() {
1423  return CONTEXTFUNCTION_GUI;
1424  }
1425  };
1426  registerMethod(new ScriptMethodScreenNodeGetId(this));
1427  }
1428  {
1429  //
1430  class ScriptMethodGUIEventACTIONTYPE_PERFORMING: public ScriptMethod {
1431  private:
1432  GUIMiniScript* miniScript { nullptr };
1433  public:
1434  ScriptMethodGUIEventACTIONTYPE_PERFORMING(GUIMiniScript* miniScript):
1435  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1436  miniScript(miniScript) {}
1437  const string getMethodName() override {
1438  return "gui.event.ACTIONTYPE_PERFORMING";
1439  }
1440  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1441  returnValue.setValue(static_cast<int64_t>(GUIActionListenerType::PERFORMING));
1442  }
1443  const vector<string>& getContextFunctions() {
1444  return CONTEXTFUNCTION_GUI;
1445  }
1446  };
1447  registerMethod(new ScriptMethodGUIEventACTIONTYPE_PERFORMING(this));
1448  }
1449  {
1450  //
1451  class ScriptMethodGUIEventACTIONTYPE_PERFORMED: public ScriptMethod {
1452  private:
1453  GUIMiniScript* miniScript { nullptr };
1454  public:
1455  ScriptMethodGUIEventACTIONTYPE_PERFORMED(GUIMiniScript* miniScript):
1456  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1457  miniScript(miniScript) {}
1458  const string getMethodName() override {
1459  return "gui.event.ACTIONTYPE_PERFORMED";
1460  }
1461  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1462  returnValue.setValue(static_cast<int64_t>(GUIActionListenerType::PERFORMED));
1463  }
1464  const vector<string>& getContextFunctions() {
1465  return CONTEXTFUNCTION_GUI;
1466  }
1467  };
1468  registerMethod(new ScriptMethodGUIEventACTIONTYPE_PERFORMED(this));
1469  }
1470  {
1471  //
1472  class ScriptMethodGUINodeControllerGetValue: public ScriptMethod {
1473  private:
1474  GUIMiniScript* miniScript { nullptr };
1475  public:
1476  ScriptMethodGUINodeControllerGetValue(GUIMiniScript* miniScript):
1477  ScriptMethod(
1478  {
1479  { .type = ScriptVariableType::TYPE_STRING, .name = "nodeId", .optional = false, .reference = false, .nullable = false }
1480  },
1481  ScriptVariableType::TYPE_STRING
1482  ),
1483  miniScript(miniScript) {}
1484  const string getMethodName() override {
1485  return "gui.node.controller.getValue";
1486  }
1487  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1488  string nodeId;
1489  if (EngineMiniScript::getStringValue(argumentValues, 0, nodeId, false) == false) {
1490  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1491  miniScript->startErrorScript();
1492  } else {
1493  auto node = miniScript->screenNode->getNodeById(nodeId);
1494  auto controller = node != nullptr?node->getController():nullptr;
1495  if (controller != nullptr) {
1496  returnValue.setValue(controller->getValue().getString());
1497  } else {
1498  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no node controller found for given node id '" + nodeId + "'");
1499  miniScript->startErrorScript();
1500  }
1501  }
1502  }
1503  const vector<string>& getContextFunctions() {
1504  return CONTEXTFUNCTION_GUI;
1505  }
1506  };
1507  registerMethod(new ScriptMethodGUINodeControllerGetValue(this));
1508  }
1509  {
1510  //
1511  class ScriptMethodGUINodeControllerSetValue: public ScriptMethod {
1512  private:
1513  GUIMiniScript* miniScript { nullptr };
1514  public:
1515  ScriptMethodGUINodeControllerSetValue(GUIMiniScript* miniScript):
1516  ScriptMethod(
1517  {
1518  { .type = ScriptVariableType::TYPE_STRING, .name = "nodeId", .optional = false, .reference = false, .nullable = false },
1519  { .type = ScriptVariableType::TYPE_STRING, .name = "value", .optional = false, .reference = false, .nullable = false }
1520  },
1521  ScriptVariableType::TYPE_NULL
1522  ),
1523  miniScript(miniScript) {}
1524  const string getMethodName() override {
1525  return "gui.node.controller.setValue";
1526  }
1527  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1528  string nodeId;
1529  string value;
1530  if (EngineMiniScript::getStringValue(argumentValues, 0, nodeId, false) == false ||
1531  EngineMiniScript::getStringValue(argumentValues, 1, value, false) == false) {
1532  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1533  miniScript->startErrorScript();
1534  } else {
1535  auto node = miniScript->screenNode->getNodeById(nodeId);
1536  auto controller = node != nullptr?node->getController():nullptr;
1537  if (controller != nullptr) {
1538  controller->setValue(MutableString(value));
1539  } else {
1540  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no node controller found for given node id '" + nodeId + "'");
1541  miniScript->startErrorScript();
1542  }
1543  }
1544  }
1545  const vector<string>& getContextFunctions() {
1546  return CONTEXTFUNCTION_GUI;
1547  }
1548  };
1549  registerMethod(new ScriptMethodGUINodeControllerSetValue(this));
1550  }
1551  {
1552  //
1553  class ScriptMethodGUITextNodeGetText: public ScriptMethod {
1554  private:
1555  GUIMiniScript* miniScript { nullptr };
1556  public:
1557  ScriptMethodGUITextNodeGetText(GUIMiniScript* miniScript):
1558  ScriptMethod(
1559  {
1560  { .type = ScriptVariableType::TYPE_STRING, .name = "textNodeId", .optional = false, .reference = false, .nullable = false },
1561  },
1562  ScriptVariableType::TYPE_STRING
1563  ),
1564  miniScript(miniScript) {}
1565  const string getMethodName() override {
1566  return "gui.textnode.getText";
1567  }
1568  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1569  string textNodeId;
1570  if (EngineMiniScript::getStringValue(argumentValues, 0, textNodeId, false) == false) {
1571  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1572  miniScript->startErrorScript();
1573  } else {
1574  auto textNode = dynamic_cast<GUITextNode*>(miniScript->screenNode->getNodeById(textNodeId));
1575  auto styledTextNode = textNode == nullptr?dynamic_cast<GUIStyledTextNode*>(miniScript->screenNode->getNodeById(textNodeId)):nullptr;
1576  if (textNode != nullptr) {
1577  returnValue.setValue(textNode->getText().getString());
1578  } else
1579  if (styledTextNode != nullptr) {
1580  returnValue.setValue(styledTextNode->getText().getString());
1581  } else {
1582  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no text or styled text node found for given node id '" + textNodeId + "'");
1583  miniScript->startErrorScript();
1584  }
1585  }
1586  }
1587  const vector<string>& getContextFunctions() {
1588  return CONTEXTFUNCTION_GUI;
1589  }
1590  };
1591  registerMethod(new ScriptMethodGUITextNodeGetText(this));
1592  }
1593  {
1594  //
1595  class ScriptMethodGUITextNodeSetText: public ScriptMethod {
1596  private:
1597  GUIMiniScript* miniScript { nullptr };
1598  public:
1599  ScriptMethodGUITextNodeSetText(GUIMiniScript* miniScript):
1600  ScriptMethod(
1601  {
1602  { .type = ScriptVariableType::TYPE_STRING, .name = "textNodeId", .optional = false, .reference = false, .nullable = false },
1603  { .type = ScriptVariableType::TYPE_STRING, .name = "text", .optional = false, .reference = false, .nullable = false }
1604  },
1605  ScriptVariableType::TYPE_NULL
1606  ),
1607  miniScript(miniScript) {}
1608  const string getMethodName() override {
1609  return "gui.textnode.setText";
1610  }
1611  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1612  string textNodeId;
1613  string text;
1614  if (EngineMiniScript::getStringValue(argumentValues, 0, textNodeId, false) == false ||
1615  EngineMiniScript::getStringValue(argumentValues, 1, text, false) == false) {
1616  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1617  miniScript->startErrorScript();
1618  } else {
1619  auto textNode = dynamic_cast<GUITextNode*>(miniScript->screenNode->getNodeById(textNodeId));
1620  auto styledTextNode = textNode == nullptr?dynamic_cast<GUIStyledTextNode*>(miniScript->screenNode->getNodeById(textNodeId)):nullptr;
1621  if (textNode != nullptr) {
1622  textNode->setText(MutableString(text));
1623  } else
1624  if (styledTextNode != nullptr) {
1625  styledTextNode->setText(MutableString(text));
1626  } else {
1627  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no text or styled text node found for given node id '" + textNodeId + "'");
1628  miniScript->startErrorScript();
1629  }
1630  }
1631  }
1632  const vector<string>& getContextFunctions() {
1633  return CONTEXTFUNCTION_GUI;
1634  }
1635  };
1636  registerMethod(new ScriptMethodGUITextNodeSetText(this));
1637  }
1638  {
1639  //
1640  class ScriptMethodGUIElementNodeConditionsHas: public ScriptMethod {
1641  private:
1642  GUIMiniScript* miniScript { nullptr };
1643  public:
1644  ScriptMethodGUIElementNodeConditionsHas(GUIMiniScript* miniScript):
1645  ScriptMethod(
1646  {
1647  { .type = ScriptVariableType::TYPE_STRING, .name = "elementNodeId", .optional = false, .reference = false, .nullable = false },
1648  { .type = ScriptVariableType::TYPE_STRING, .name = "condition", .optional = false, .reference = false, .nullable = false },
1649  },
1650  ScriptVariableType::TYPE_BOOLEAN
1651  ),
1652  miniScript(miniScript) {}
1653  const string getMethodName() override {
1654  return "gui.elementnode.conditions.has";
1655  }
1656  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1657  string elementNodeId;
1658  string condition;
1659  if (EngineMiniScript::getStringValue(argumentValues, 0, elementNodeId, false) == false ||
1660  EngineMiniScript::getStringValue(argumentValues, 1, condition, false) == false) {
1661  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1662  miniScript->startErrorScript();
1663  } else {
1664  auto elementNode = dynamic_cast<GUIElementNode*>(miniScript->screenNode->getNodeById(elementNodeId));
1665  if (elementNode != nullptr) {
1666  returnValue.setValue(elementNode->getActiveConditions().has(condition));
1667  } else {
1668  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no element node found for given node id '" + elementNodeId + "'");
1669  miniScript->startErrorScript();
1670  }
1671  }
1672  }
1673  const vector<string>& getContextFunctions() {
1674  return CONTEXTFUNCTION_GUI;
1675  }
1676  };
1677  registerMethod(new ScriptMethodGUIElementNodeConditionsHas(this));
1678  }
1679  {
1680  //
1681  class ScriptMethodGUIElementNodeConditionsGet: public ScriptMethod {
1682  private:
1683  GUIMiniScript* miniScript { nullptr };
1684  public:
1685  ScriptMethodGUIElementNodeConditionsGet(GUIMiniScript* miniScript):
1686  ScriptMethod(
1687  {
1688  { .type = ScriptVariableType::TYPE_STRING, .name = "elementNodeId", .optional = false, .reference = false, .nullable = false }
1689  },
1690  ScriptVariableType::TYPE_ARRAY
1691  ),
1692  miniScript(miniScript) {}
1693  const string getMethodName() override {
1694  return "gui.elementnode.conditions.get";
1695  }
1696  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1697  string elementNodeId;
1698  if (EngineMiniScript::getStringValue(argumentValues, 0, elementNodeId, false) == false) {
1699  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1700  miniScript->startErrorScript();
1701  } else {
1702  auto elementNode = dynamic_cast<GUIElementNode*>(miniScript->screenNode->getNodeById(elementNodeId));
1703  if (elementNode != nullptr) {
1704  auto conditions = elementNode->getActiveConditions().getConditions();
1705  returnValue.setType(TYPE_ARRAY);
1706  for (const auto& condition: conditions) {
1707  returnValue.pushArrayEntry(condition);
1708  }
1709  } else {
1710  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no element node found for given node id '" + elementNodeId + "'");
1711  miniScript->startErrorScript();
1712  }
1713  }
1714  }
1715  const vector<string>& getContextFunctions() {
1716  return CONTEXTFUNCTION_GUI;
1717  }
1718  };
1719  registerMethod(new ScriptMethodGUIElementNodeConditionsGet(this));
1720  }
1721  {
1722  //
1723  class ScriptMethodGUIElementNodeConditionsSet: public ScriptMethod {
1724  private:
1725  GUIMiniScript* miniScript { nullptr };
1726  public:
1727  ScriptMethodGUIElementNodeConditionsSet(GUIMiniScript* miniScript):
1728  ScriptMethod(
1729  {
1730  { .type = ScriptVariableType::TYPE_STRING, .name = "elementNodeId", .optional = false, .reference = false, .nullable = false },
1731  { .type = ScriptVariableType::TYPE_STRING, .name = "condition", .optional = false, .reference = false, .nullable = false },
1732  },
1733  ScriptVariableType::TYPE_NULL
1734  ),
1735  miniScript(miniScript) {}
1736  const string getMethodName() override {
1737  return "gui.elementnode.conditions.set";
1738  }
1739  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1740  string elementNodeId;
1741  string condition;
1742  if (EngineMiniScript::getStringValue(argumentValues, 0, elementNodeId, false) == false ||
1743  EngineMiniScript::getStringValue(argumentValues, 1, condition, false) == false) {
1744  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1745  miniScript->startErrorScript();
1746  } else {
1747  auto elementNode = dynamic_cast<GUIElementNode*>(miniScript->screenNode->getNodeById(elementNodeId));
1748  if (elementNode != nullptr) {
1749  elementNode->getActiveConditions().set(condition);
1750  } else {
1751  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no element node found for given node id '" + elementNodeId + "'");
1752  miniScript->startErrorScript();
1753  }
1754  }
1755  }
1756  const vector<string>& getContextFunctions() {
1757  return CONTEXTFUNCTION_GUI;
1758  }
1759  };
1760  registerMethod(new ScriptMethodGUIElementNodeConditionsSet(this));
1761  }
1762  {
1763  //
1764  class ScriptMethodGUIElementNodeConditionsAdd: public ScriptMethod {
1765  private:
1766  GUIMiniScript* miniScript { nullptr };
1767  public:
1768  ScriptMethodGUIElementNodeConditionsAdd(GUIMiniScript* miniScript):
1769  ScriptMethod(
1770  {
1771  { .type = ScriptVariableType::TYPE_STRING, .name = "elementNodeId", .optional = false, .reference = false, .nullable = false },
1772  { .type = ScriptVariableType::TYPE_STRING, .name = "condition", .optional = false, .reference = false, .nullable = false },
1773  },
1774  ScriptVariableType::TYPE_NULL
1775  ),
1776  miniScript(miniScript) {}
1777  const string getMethodName() override {
1778  return "gui.elementnode.conditions.add";
1779  }
1780  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1781  string elementNodeId;
1782  string condition;
1783  if (EngineMiniScript::getStringValue(argumentValues, 0, elementNodeId, false) == false ||
1784  EngineMiniScript::getStringValue(argumentValues, 1, condition, false) == false) {
1785  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1786  miniScript->startErrorScript();
1787  } else {
1788  auto elementNode = dynamic_cast<GUIElementNode*>(miniScript->screenNode->getNodeById(elementNodeId));
1789  if (elementNode != nullptr) {
1790  elementNode->getActiveConditions().add(condition);
1791  } else {
1792  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no element node found for given node id '" + elementNodeId + "'");
1793  miniScript->startErrorScript();
1794  }
1795  }
1796  }
1797  const vector<string>& getContextFunctions() {
1798  return CONTEXTFUNCTION_GUI;
1799  }
1800  };
1801  registerMethod(new ScriptMethodGUIElementNodeConditionsAdd(this));
1802  }
1803  {
1804  //
1805  class ScriptMethodGUIElementNodeConditionsSetAll: public ScriptMethod {
1806  private:
1807  GUIMiniScript* miniScript { nullptr };
1808  public:
1809  ScriptMethodGUIElementNodeConditionsSetAll(GUIMiniScript* miniScript):
1810  ScriptMethod(
1811  {
1812  { .type = ScriptVariableType::TYPE_STRING, .name = "elementNodeId", .optional = false, .reference = false, .nullable = false },
1813  { .type = ScriptVariableType::TYPE_ARRAY, .name = "conditions", .optional = false, .reference = false, .nullable = false },
1814  },
1815  ScriptVariableType::TYPE_NULL
1816  ),
1817  miniScript(miniScript) {}
1818  const string getMethodName() override {
1819  return "gui.elementnode.conditions.setAll";
1820  }
1821  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1822  string elementNodeId;
1823  if (EngineMiniScript::getStringValue(argumentValues, 0, elementNodeId, false) == false ||
1824  argumentValues.size() <= 1 || argumentValues[1].getType() != ScriptVariableType::TYPE_ARRAY) {
1825  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1826  miniScript->startErrorScript();
1827  } else {
1828  auto elementNode = dynamic_cast<GUIElementNode*>(miniScript->screenNode->getNodeById(elementNodeId));
1829  if (elementNode != nullptr) {
1830  vector<string> conditions;
1831  for (auto i = 0; i < argumentValues[1].getArraySize(); i++) {
1832  string condition;
1833  if (argumentValues[1].getArrayEntry(i).getStringValue(condition, false) == false) {
1834  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1835  } else {
1836  conditions.push_back(condition);
1837  }
1838  }
1839  elementNode->getActiveConditions().set(conditions);
1840  } else {
1841  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no element node found for given node id '" + elementNodeId + "'");
1842  miniScript->startErrorScript();
1843  }
1844  }
1845  }
1846  const vector<string>& getContextFunctions() {
1847  return CONTEXTFUNCTION_GUI;
1848  }
1849  };
1850  registerMethod(new ScriptMethodGUIElementNodeConditionsSetAll(this));
1851  }
1852  {
1853  //
1854  class ScriptMethodGUIElementNodeConditionsRemove: public ScriptMethod {
1855  private:
1856  GUIMiniScript* miniScript { nullptr };
1857  public:
1858  ScriptMethodGUIElementNodeConditionsRemove(GUIMiniScript* miniScript):
1859  ScriptMethod(
1860  {
1861  { .type = ScriptVariableType::TYPE_STRING, .name = "elementNodeId", .optional = false, .reference = false, .nullable = false },
1862  { .type = ScriptVariableType::TYPE_STRING, .name = "condition", .optional = false, .reference = false, .nullable = false },
1863  },
1864  ScriptVariableType::TYPE_NULL
1865  ),
1866  miniScript(miniScript) {}
1867  const string getMethodName() override {
1868  return "gui.elementnode.conditions.remove";
1869  }
1870  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1871  string elementNodeId;
1872  string condition;
1873  if (EngineMiniScript::getStringValue(argumentValues, 0, elementNodeId, false) == false ||
1874  EngineMiniScript::getStringValue(argumentValues, 1, condition, false) == false) {
1875  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1876  miniScript->startErrorScript();
1877  } else {
1878  auto elementNode = dynamic_cast<GUIElementNode*>(miniScript->screenNode->getNodeById(elementNodeId));
1879  if (elementNode != nullptr) {
1880  elementNode->getActiveConditions().remove(condition);
1881  } else {
1882  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no element node found for given node id '" + elementNodeId + "'");
1883  miniScript->startErrorScript();
1884  }
1885  }
1886  }
1887  const vector<string>& getContextFunctions() {
1888  return CONTEXTFUNCTION_GUI;
1889  }
1890  };
1891  registerMethod(new ScriptMethodGUIElementNodeConditionsRemove(this));
1892  }
1893  {
1894  //
1895  class ScriptMethodGUIElementNodeConditionsRemoveAll: public ScriptMethod {
1896  private:
1897  GUIMiniScript* miniScript { nullptr };
1898  public:
1899  ScriptMethodGUIElementNodeConditionsRemoveAll(GUIMiniScript* miniScript):
1900  ScriptMethod(
1901  {
1902  { .type = ScriptVariableType::TYPE_STRING, .name = "elementNodeId", .optional = false, .reference = false, .nullable = false }
1903  },
1904  ScriptVariableType::TYPE_NULL
1905  ),
1906  miniScript(miniScript) {}
1907  const string getMethodName() override {
1908  return "gui.elementnode.conditions.removeAll";
1909  }
1910  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1911  string elementNodeId;
1912  if (EngineMiniScript::getStringValue(argumentValues, 0, elementNodeId, false) == false) {
1913  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1914  miniScript->startErrorScript();
1915  } else {
1916  auto elementNode = dynamic_cast<GUIElementNode*>(miniScript->screenNode->getNodeById(elementNodeId));
1917  if (elementNode != nullptr) {
1918  elementNode->getActiveConditions().removeAll();
1919  } else {
1920  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no element node found for given node id '" + elementNodeId + "'");
1921  miniScript->startErrorScript();
1922  }
1923  }
1924  }
1925  const vector<string>& getContextFunctions() {
1926  return CONTEXTFUNCTION_GUI;
1927  }
1928  };
1929  registerMethod(new ScriptMethodGUIElementNodeConditionsRemoveAll(this));
1930  }
1931  {
1932  //
1933  class ScriptMethodGUIImageNodeGetSource: public ScriptMethod {
1934  private:
1935  GUIMiniScript* miniScript { nullptr };
1936  public:
1937  ScriptMethodGUIImageNodeGetSource(GUIMiniScript* miniScript):
1938  ScriptMethod(
1939  {
1940  { .type = ScriptVariableType::TYPE_STRING, .name = "imageNodeId", .optional = false, .reference = false, .nullable = false }
1941  },
1942  ScriptVariableType::TYPE_STRING
1943  ),
1944  miniScript(miniScript) {}
1945  const string getMethodName() override {
1946  return "gui.imagenode.getSource";
1947  }
1948  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1949  string imageNodeId;
1950  if (EngineMiniScript::getStringValue(argumentValues, 0, imageNodeId, false) == false) {
1951  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1952  miniScript->startErrorScript();
1953  } else {
1954  auto imageNode = dynamic_cast<GUIImageNode*>(miniScript->screenNode->getNodeById(imageNodeId));
1955  if (imageNode != nullptr) {
1956  returnValue.setValue(imageNode->getSource());
1957  } else {
1958  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no image node found for given image node id '" + imageNodeId + "'");
1959  miniScript->startErrorScript();
1960  }
1961  }
1962  }
1963  const vector<string>& getContextFunctions() {
1964  return CONTEXTFUNCTION_GUI;
1965  }
1966  };
1967  registerMethod(new ScriptMethodGUIImageNodeGetSource(this));
1968  }
1969  {
1970  //
1971  class ScriptMethodGUIImageNodeSetSource: public ScriptMethod {
1972  private:
1973  GUIMiniScript* miniScript { nullptr };
1974  public:
1975  ScriptMethodGUIImageNodeSetSource(GUIMiniScript* miniScript):
1976  ScriptMethod(
1977  {
1978  { .type = ScriptVariableType::TYPE_STRING, .name = "imageNodeId", .optional = false, .reference = false, .nullable = false },
1979  { .type = ScriptVariableType::TYPE_STRING, .name = "source", .optional = false, .reference = false, .nullable = false }
1980  },
1981  ScriptVariableType::TYPE_NULL
1982  ),
1983  miniScript(miniScript) {}
1984  const string getMethodName() override {
1985  return "gui.imagenode.setSource";
1986  }
1987  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1988  string imageNodeId;
1989  string source;
1990  if (EngineMiniScript::getStringValue(argumentValues, 0, imageNodeId, false) == false ||
1991  EngineMiniScript::getStringValue(argumentValues, 1, source, false) == false) {
1992  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1993  miniScript->startErrorScript();
1994  } else {
1995  auto imageNode = dynamic_cast<GUIImageNode*>(miniScript->screenNode->getNodeById(imageNodeId));
1996  if (imageNode != nullptr) {
1997  imageNode->setSource(source);
1998  } else {
1999  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no image node found for given image node id '" + imageNodeId + "'");
2000  miniScript->startErrorScript();
2001  }
2002  }
2003  }
2004  const vector<string>& getContextFunctions() {
2005  return CONTEXTFUNCTION_GUI;
2006  }
2007  };
2008  registerMethod(new ScriptMethodGUIImageNodeSetSource(this));
2009  }
2010  {
2011  //
2012  class ScriptMethodGUIVideoNodeGetSource: public ScriptMethod {
2013  private:
2014  GUIMiniScript* miniScript { nullptr };
2015  public:
2016  ScriptMethodGUIVideoNodeGetSource(GUIMiniScript* miniScript):
2017  ScriptMethod(
2018  {
2019  { .type = ScriptVariableType::TYPE_STRING, .name = "videoNodeId", .optional = false, .reference = false, .nullable = false }
2020  },
2021  ScriptVariableType::TYPE_STRING
2022  ),
2023  miniScript(miniScript) {}
2024  const string getMethodName() override {
2025  return "gui.videonode.getSource";
2026  }
2027  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2028  string videoNodeId;
2029  if (EngineMiniScript::getStringValue(argumentValues, 0, videoNodeId, false) == false) {
2030  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2031  miniScript->startErrorScript();
2032  } else {
2033  auto videoNode = dynamic_cast<GUIVideoNode*>(miniScript->screenNode->getNodeById(videoNodeId));
2034  if (videoNode != nullptr) {
2035  returnValue.setValue(videoNode->getSource());
2036  } else {
2037  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no video node found for given video node id '" + videoNodeId + "'");
2038  miniScript->startErrorScript();
2039  }
2040  }
2041  }
2042  const vector<string>& getContextFunctions() {
2043  return CONTEXTFUNCTION_GUI;
2044  }
2045  };
2046  registerMethod(new ScriptMethodGUIVideoNodeGetSource(this));
2047  }
2048  {
2049  //
2050  class ScriptMethodGUIVideoNodeSetSource: public ScriptMethod {
2051  private:
2052  GUIMiniScript* miniScript { nullptr };
2053  public:
2054  ScriptMethodGUIVideoNodeSetSource(GUIMiniScript* miniScript):
2055  ScriptMethod(
2056  {
2057  { .type = ScriptVariableType::TYPE_STRING, .name = "videoNodeId", .optional = false, .reference = false, .nullable = false },
2058  { .type = ScriptVariableType::TYPE_STRING, .name = "source", .optional = false, .reference = false, .nullable = false }
2059  },
2060  ScriptVariableType::TYPE_NULL
2061  ),
2062  miniScript(miniScript) {}
2063  const string getMethodName() override {
2064  return "gui.videonode.setSource";
2065  }
2066  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2067  string videoNodeId;
2068  string source;
2069  if (EngineMiniScript::getStringValue(argumentValues, 0, videoNodeId, false) == false ||
2070  EngineMiniScript::getStringValue(argumentValues, 1, source, false) == false) {
2071  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2072  miniScript->startErrorScript();
2073  } else {
2074  auto videoNode = dynamic_cast<GUIVideoNode*>(miniScript->screenNode->getNodeById(videoNodeId));
2075  if (videoNode != nullptr) {
2076  videoNode->setSource(source);
2077  } else {
2078  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no video node found for given video node id '" + videoNodeId + "'");
2079  miniScript->startErrorScript();
2080  }
2081  }
2082  }
2083  const vector<string>& getContextFunctions() {
2084  return CONTEXTFUNCTION_GUI;
2085  }
2086  };
2087  registerMethod(new ScriptMethodGUIVideoNodeSetSource(this));
2088  }
2089  {
2090  //
2091  class ScriptMethodGUIParentNodeClearSubNodes: public ScriptMethod {
2092  private:
2093  GUIMiniScript* miniScript { nullptr };
2094  public:
2095  ScriptMethodGUIParentNodeClearSubNodes(GUIMiniScript* miniScript):
2096  ScriptMethod(
2097  {
2098  { .type = ScriptVariableType::TYPE_STRING, .name = "parentNodeId", .optional = false, .reference = false, .nullable = false }
2099  },
2100  ScriptVariableType::TYPE_NULL
2101  ),
2102  miniScript(miniScript) {}
2103  const string getMethodName() override {
2104  return "gui.parentnode.clearSubNodes";
2105  }
2106  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2107  string parentNodeId;
2108  if (EngineMiniScript::getStringValue(argumentValues, 0, parentNodeId, false) == false) {
2109  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2110  miniScript->startErrorScript();
2111  } else {
2112  auto parentNode = dynamic_cast<GUIParentNode*>(miniScript->screenNode->getNodeById(parentNodeId));
2113  if (parentNode != nullptr) {
2114  parentNode->clearSubNodes();
2115  } else {
2116  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no parent node found for given parent node id '" + parentNodeId + "'");
2117  miniScript->startErrorScript();
2118  }
2119  }
2120  }
2121  const vector<string>& getContextFunctions() {
2122  return CONTEXTFUNCTION_GUI;
2123  }
2124  };
2125  registerMethod(new ScriptMethodGUIParentNodeClearSubNodes(this));
2126  }
2127  {
2128  //
2129  class ScriptMethodGUIParentNodeAddSubNodes: public ScriptMethod {
2130  private:
2131  GUIMiniScript* miniScript { nullptr };
2132  public:
2133  ScriptMethodGUIParentNodeAddSubNodes(GUIMiniScript* miniScript):
2134  ScriptMethod(
2135  {
2136  { .type = ScriptVariableType::TYPE_STRING, .name = "parentNodeId", .optional = false, .reference = false, .nullable = false },
2137  { .type = ScriptVariableType::TYPE_STRING, .name = "xml", .optional = false, .reference = false, .nullable = false },
2138  { .type = ScriptVariableType::TYPE_BOOLEAN, .name = "resetScrollOffsets", .optional = true, .reference = false, .nullable = false }
2139  },
2140  ScriptVariableType::TYPE_NULL
2141  ),
2142  miniScript(miniScript) {}
2143  const string getMethodName() override {
2144  return "gui.parentnode.addSubNodes";
2145  }
2146  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2147  string parentNodeId;
2148  string xml;
2149  bool resetScrollOffsets = true;
2150  if (EngineMiniScript::getStringValue(argumentValues, 0, parentNodeId, false) == false ||
2151  EngineMiniScript::getStringValue(argumentValues, 1, xml, false) == false ||
2152  EngineMiniScript::getBooleanValue(argumentValues, 2, resetScrollOffsets, true) == false) {
2153  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2154  miniScript->startErrorScript();
2155  } else {
2156  auto parentNode = dynamic_cast<GUIParentNode*>(miniScript->screenNode->getNodeById(parentNodeId));
2157  if (parentNode != nullptr) {
2158  parentNode->addSubNodes(xml, resetScrollOffsets);
2159  } else {
2160  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no parent node found for given parent node id '" + parentNodeId + "'");
2161  miniScript->startErrorScript();
2162  }
2163  }
2164  }
2165  const vector<string>& getContextFunctions() {
2166  return CONTEXTFUNCTION_GUI;
2167  }
2168  };
2169  registerMethod(new ScriptMethodGUIParentNodeAddSubNodes(this));
2170  }
2171  {
2172  //
2173  class ScriptMethodGUIParentNodeReplaceSubNodes: public ScriptMethod {
2174  private:
2175  GUIMiniScript* miniScript { nullptr };
2176  public:
2177  ScriptMethodGUIParentNodeReplaceSubNodes(GUIMiniScript* miniScript):
2178  ScriptMethod(
2179  {
2180  { .type = ScriptVariableType::TYPE_STRING, .name = "parentNodeId", .optional = false, .reference = false, .nullable = false },
2181  { .type = ScriptVariableType::TYPE_STRING, .name = "xml", .optional = false, .reference = false, .nullable = false },
2182  { .type = ScriptVariableType::TYPE_BOOLEAN, .name = "resetScrollOffsets", .optional = true, .reference = false, .nullable = false }
2183  },
2184  ScriptVariableType::TYPE_NULL
2185  ),
2186  miniScript(miniScript) {}
2187  const string getMethodName() override {
2188  return "gui.parentnode.replaceSubNodes";
2189  }
2190  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2191  string parentNodeId;
2192  string xml;
2193  bool resetScrollOffsets = true;
2194  if (EngineMiniScript::getStringValue(argumentValues, 0, parentNodeId, false) == false ||
2195  EngineMiniScript::getStringValue(argumentValues, 1, xml, false) == false ||
2196  EngineMiniScript::getBooleanValue(argumentValues, 2, resetScrollOffsets, true) == false) {
2197  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2198  miniScript->startErrorScript();
2199  } else {
2200  auto parentNode = dynamic_cast<GUIParentNode*>(miniScript->screenNode->getNodeById(parentNodeId));
2201  if (parentNode != nullptr) {
2202  parentNode->replaceSubNodes(xml, resetScrollOffsets);
2203  } else {
2204  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no parent node found for given parent node id '" + parentNodeId + "'");
2205  miniScript->startErrorScript();
2206  }
2207  }
2208  }
2209  const vector<string>& getContextFunctions() {
2210  return CONTEXTFUNCTION_GUI;
2211  }
2212  };
2213  registerMethod(new ScriptMethodGUIParentNodeReplaceSubNodes(this));
2214  }
2215  {
2216  //
2217  class ScriptMethodLogicSignalSend: public ScriptMethod {
2218  private:
2219  GUIMiniScript* miniScript { nullptr };
2220  public:
2221  ScriptMethodLogicSignalSend(GUIMiniScript* miniScript):
2222  ScriptMethod({
2223  { .type = ScriptVariableType::TYPE_STRING, .name = "logicId", .optional = false, .reference = false, .nullable = false },
2224  { .type = ScriptVariableType::TYPE_STRING, .name = "signal", .optional = false, .reference = false, .nullable = false }
2225  }),
2226  miniScript(miniScript) {}
2227  const string getMethodName() override {
2228  return "logic.signal.send";
2229  }
2230  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2231  auto context = miniScript->screenNode->getContext();
2232  if (context != nullptr) {
2233  string logicId;
2234  string signal;
2235  if (EngineMiniScript::getStringValue(argumentValues, 0, logicId) == true &&
2236  EngineMiniScript::getStringValue(argumentValues, 1, signal) == true) {
2237  context->getLogicsMutex()->lock();
2238  auto logic = static_cast<Logic*>(context->getLogic(logicId));
2239  if (logic == nullptr) {
2240  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no logic with given id: " + logicId);
2241  miniScript->startErrorScript();
2242  } else {
2243  vector<ScriptVariable> arguments(argumentValues.size() - 2);
2244  for (auto i = 2; i < argumentValues.size(); i++) arguments.push_back(argumentValues[i]);
2245  logic->addSignal(signal, arguments);
2246  }
2247  context->getLogicsMutex()->unlock();
2248  } else {
2249  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2250  miniScript->startErrorScript();
2251  }
2252  } else {
2253  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no application logic context available");
2254  miniScript->startErrorScript();
2255  }
2256  }
2257  bool isVariadic() const override {
2258  return true;
2259  }
2260  const vector<string>& getContextFunctions() {
2261  return CONTEXTFUNCTION_GUI;
2262  }
2263  };
2264  registerMethod(new ScriptMethodLogicSignalSend(this));
2265  }
2266  {
2267  //
2268  class ScriptMethodLogicHas: public ScriptMethod {
2269  private:
2270  GUIMiniScript* miniScript { nullptr };
2271  public:
2272  ScriptMethodLogicHas(GUIMiniScript* miniScript):
2273  ScriptMethod(
2274  {
2275  { .type = ScriptVariableType::TYPE_STRING, .name = "logicId", .optional = false, .reference = false, .nullable = false },
2276  { .type = ScriptVariableType::TYPE_STRING, .name = "callable", .optional = false, .reference = false, .nullable = false }
2277  },
2278  ScriptVariableType::TYPE_BOOLEAN
2279  ),
2280  miniScript(miniScript) {}
2281  const string getMethodName() override {
2282  return "logic.has";
2283  }
2284  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2285  auto context = miniScript->screenNode->getContext();
2286  if (context != nullptr) {
2287  string logicId;
2288  string callable;
2289  if (EngineMiniScript::getStringValue(argumentValues, 0, logicId) == false ||
2290  EngineMiniScript::getStringValue(argumentValues, 1, callable) == false) {
2291  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2292  miniScript->startErrorScript();
2293  } else {
2294  context->getLogicsMutex()->lock();
2295  auto logic = dynamic_cast<MiniScriptLogic*>(context->getLogic(logicId));
2296  if (logic == nullptr || logic->getMiniScript() == nullptr) {
2297  returnValue.setValue(false);
2298  } else {
2299  auto logicMiniScript = logic->getMiniScript();
2300  auto scriptIdx = logicMiniScript->getFunctionScriptIdx(callable);
2301  if (scriptIdx == SCRIPTIDX_NONE || logicMiniScript->getScripts()[scriptIdx].callable == false) {
2302  returnValue.setValue(false);
2303  } else {
2304  returnValue.setValue(true);
2305  }
2306  }
2307  context->getLogicsMutex()->unlock();
2308  }
2309  } else {
2310  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no application logic context available");
2311  miniScript->startErrorScript();
2312  }
2313  }
2314  const vector<string>& getContextFunctions() {
2315  return CONTEXTFUNCTION_GUI;
2316  }
2317  };
2318  registerMethod(new ScriptMethodLogicHas(this));
2319  }
2320  {
2321  //
2322  class ScriptMethodLogicCall: public ScriptMethod {
2323  private:
2324  GUIMiniScript* miniScript { nullptr };
2325  public:
2326  ScriptMethodLogicCall(GUIMiniScript* miniScript):
2327  ScriptMethod(
2328  {
2329  { .type = ScriptVariableType::TYPE_STRING, .name = "logicId", .optional = false, .reference = false, .nullable = false },
2330  { .type = ScriptVariableType::TYPE_STRING, .name = "callable", .optional = false, .reference = false, .nullable = false }
2331  },
2332  ScriptVariableType::TYPE_PSEUDO_MIXED
2333  ),
2334  miniScript(miniScript) {}
2335  const string getMethodName() override {
2336  return "logic.call";
2337  }
2338  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2339  auto context = miniScript->screenNode->getContext();
2340  if (context != nullptr) {
2341  string logicId;
2342  string callable;
2343  if (EngineMiniScript::getStringValue(argumentValues, 0, logicId) == false ||
2344  EngineMiniScript::getStringValue(argumentValues, 1, callable) == false) {
2345  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2346  miniScript->startErrorScript();
2347  } else {
2348  context->getLogicsMutex()->lock();
2349  auto logic = dynamic_cast<MiniScriptLogic*>(context->getLogic(logicId));
2350  if (logic == nullptr || logic->getMiniScript() == nullptr) {
2351  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no mini script logic with given id: " + logicId);
2352  miniScript->startErrorScript();
2353  } else {
2354  auto logicMiniScript = logic->getMiniScript();
2355  auto scriptIdx = logicMiniScript->getFunctionScriptIdx(callable);
2356  if (scriptIdx == SCRIPTIDX_NONE || logicMiniScript->getScripts()[scriptIdx].callable == false) {
2357  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": callable not found: " + callable);
2358  miniScript->startErrorScript();
2359  } else {
2360  #if defined (__APPLE__)
2361  // MACOSX currently does not support initializing span using begin and end iterators,
2362  // so we need to make a copy of argumentValues beginning from second element
2363  vector<ScriptVariable> callArgumentValues;
2364  for (auto i = 2; i < argumentValues.size(); i++) callArgumentValues.push_back(argumentValues[i]);
2365  // call
2366  span callArgumentValuesSpan(callArgumentValues);
2367  logicMiniScript->call(scriptIdx, callArgumentValuesSpan, returnValue);
2368  #else
2369  span callArgumentValuesSpan(argumentValues.begin() + 2, argumentValues.end());
2370  logicMiniScript->call(scriptIdx, callArgumentValuesSpan, returnValue);
2371  #endif
2372  }
2373  }
2374  context->getLogicsMutex()->unlock();
2375  }
2376  } else {
2377  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no application logic context available");
2378  miniScript->startErrorScript();
2379  }
2380  }
2381  bool isVariadic() const override {
2382  return true;
2383  }
2384  const vector<string>& getContextFunctions() {
2385  return CONTEXTFUNCTION_GUI;
2386  }
2387  };
2388  registerMethod(new ScriptMethodLogicCall(this));
2389  }
2390 }
2391 
2393 }
2394 
2395 void GUIMiniScript::collectHIDEvents(vector<GUIMouseEvent>& mouseEvents, vector<GUIKeyboardEvent>& keyEvents) {
2396  // keyboard events
2397  keyboardTypedChars.clear();
2398  keyboardControlDown = false;
2399  keyboardMetaDown = false;
2400  keyboardAltDown = false;
2401  keyboardShiftDown = false;
2402  for (const auto& event: keyEvents) {
2403  // processed already?
2404  if (event.isProcessed() == true) continue;
2405  // key pressed
2406  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
2407  keyboardChars.insert(event.getKeyChar());
2408  keyboardKeys.insert(event.getKeyCode());
2409  } else
2410  // key released
2411  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_RELEASED) {
2412  keyboardChars.erase(event.getKeyChar());
2413  keyboardKeys.erase(event.getKeyCode());
2414  } else
2415  // key typed
2416  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_TYPED) {
2417  Character::appendToString(keyboardTypedChars, event.getKeyChar());
2418  }
2419  // extra keys
2420  if (event.isControlDown() == true) keyboardControlDown = true;
2421  if (event.isMetaDown() == true) keyboardMetaDown = true;
2422  if (event.isAltDown() == true) keyboardAltDown = true;
2423  if (event.isShiftDown() == true) keyboardShiftDown = true;
2424  }
2425 
2426  // mouse
2427  mouseDown.fill(false);
2428  mouseUp.fill(false);
2429  mouseDragging.fill(false);
2430  mouseMoved = false;
2431  mouseWheelX = 0.0f;
2432  mouseWheelY = 0.0f;
2433  mouseWheelZ = 0.0f;
2434  for (const auto& event: mouseEvents) {
2435  // mouse move
2436  if (event.isProcessed() == false && event.getType() == GUIMouseEvent::MOUSEEVENT_MOVED) {
2437  mouseMoved = true;
2438  } else
2439  // on press and drag
2440  // store button and mouse dragging properties
2441  if (event.isProcessed() == false && event.getType() == GUIMouseEvent::MOUSEEVENT_PRESSED) {
2442  if (event.getButton() != GUIMouseEvent::MOUSEEVENT_BUTTON_NONE) {
2443  mouseDown[event.getButton() - 1] = true;
2444  }
2445  } else
2446  if (event.isProcessed() == false && event.getType() == GUIMouseEvent::MOUSEEVENT_DRAGGED) {
2447  if (event.getButton() != GUIMouseEvent::MOUSEEVENT_BUTTON_NONE) {
2448  mouseDragging[event.getButton() - 1] = true;
2449  }
2450  } else
2451  // on release
2452  // store release
2453  if (event.getType() == GUIMouseEvent::MOUSEEVENT_RELEASED) {
2454  if (event.getButton() != GUIMouseEvent::MOUSEEVENT_BUTTON_NONE) {
2455  mouseUp[event.getButton() - 1] = true;
2456  }
2457  } else
2458  // wheel
2459  if (event.isProcessed() == false && event.getType() == GUIMouseEvent::MOUSEEVENT_WHEEL_MOVED) {
2460  mouseWheelX+= event.getWheelX();
2461  mouseWheelY+= event.getWheelY();
2462  mouseWheelZ+= event.getWheelZ();
2463  }
2464  // always store mouse position
2465  mouseX = event.getX();
2466  mouseXUnscaled = event.getXUnscaled();
2467  mouseY = event.getY();
2468  mouseYUnscaled = event.getYUnscaled();
2469  // extra keys
2470  if (event.isControlDown() == true) keyboardControlDown = true;
2471  if (event.isMetaDown() == true) keyboardMetaDown = true;
2472  if (event.isAltDown() == true) keyboardAltDown = true;
2473  if (event.isShiftDown() == true) keyboardShiftDown = true;
2474  }
2475 }
GUI parser.
Definition: GUIParser.h:40
static GUIScreenNode * parse(const string &pathName, const string &fileName, const unordered_map< string, string > &variables={}, const EngineMiniScript::ScriptVariable &miniScriptArguments=EngineMiniScript::ScriptVariable(), Context *context=nullptr)
Parses a GUI XML file.
GUI module class.
Definition: GUI.h:64
void addRenderScreen(const string &screenId, int screenIdx=-1)
Add render screen.
Definition: GUI.cpp:155
GUIScreenNode * getScreen(const string &id)
Get screen.
Definition: GUI.h:222
void addScreen(const string &id, GUIScreenNode *screen)
Add screen.
Definition: GUI.cpp:98
GUINodeConditions & getActiveConditions()
void setSource(const string &source)
Set image source.
bool add(const string &condition)
Add a condition.
bool remove(const string &condition)
Remove a condition.
void set(const string &condition)
Set condition.
const vector< string > & getConditions() const
GUI node controller base class.
virtual void setValue(const MutableString &value)=0
Set value.
GUINodeController * getController()
Definition: GUINode.h:661
const string & getId()
Definition: GUINode.h:339
GUI parent node base class thats supporting child nodes.
Definition: GUIParentNode.h:42
void replaceSubNodes(const string &xml, bool resetScrollOffsets)
Replace sub nodes with given XML.
void clearSubNodes()
Clear sub nodes.
void addSubNodes(const string &xml, bool resetScrollOffsets)
Add sub nodes with given XML.
GUI screen node that represents a screen that can be rendered via GUI system.
Definition: GUIScreenNode.h:72
void getProjectFilePathNameAndFileName(const string &fileName, string &projectFilePathName, string &projectFileFileName)
Get project path and filename of given file name.
void setEnabled(bool enabled)
Set enabled.
GUINode * getNodeById(const string &nodeId)
Get GUI node by id.
void setText(const MutableString &text)
Set text.
void setSource(const string &source)
Set image source.
void collectHIDEvents(vector< GUIMouseEvent > &mouseEvents, vector< GUIKeyboardEvent > &keyEvents)
Collect HID events.
unique_ptr< GUIScreenNode > nextScreenNode
Definition: GUIMiniScript.h:79
unordered_set< int32_t > keyboardKeys
Definition: GUIMiniScript.h:84
static STATIC_DLL_IMPEXT const vector< string > CONTEXTFUNCTION_GUI
Definition: GUIMiniScript.h:76
const vector< string > getTranspilationUnits()
unordered_set< int32_t > keyboardChars
Definition: GUIMiniScript.h:83
File system singleton class.
Definition: FileSystem.h:17
Mutex implementation.
Definition: Mutex.h:19
void lock()
Locks the mutex, additionally mutex locks will block until other locks have been unlocked.
Definition: Mutex.h:47
Character class.
Definition: Character.h:17
Console class.
Definition: Console.h:29
void setValue(ScriptVariable &variable, bool value)
Set boolean value from given value into variable.
Mutable utf8 aware string class.
Definition: MutableString.h:23
UTF8 string character iterator.
std::exception Exception
Exception base class.
Definition: Exception.h:18
GUI action listener interface.