reflexion 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/application.cpp +37 -6
  3. data/.doc/ext/reflex/capture_event.cpp +1 -1
  4. data/.doc/ext/reflex/chase_constraint.cpp +1 -1
  5. data/.doc/ext/reflex/clipboard.cpp +1 -1
  6. data/.doc/ext/reflex/color_event.cpp +76 -0
  7. data/.doc/ext/reflex/color_picker.cpp +113 -0
  8. data/.doc/ext/reflex/constraint.cpp +1 -1
  9. data/.doc/ext/reflex/contact_event.cpp +1 -1
  10. data/.doc/ext/reflex/control_change_event.cpp +1 -1
  11. data/.doc/ext/reflex/device.cpp +1 -1
  12. data/.doc/ext/reflex/device_event.cpp +1 -1
  13. data/.doc/ext/reflex/draw_event.cpp +1 -1
  14. data/.doc/ext/reflex/ellipse_shape.cpp +1 -1
  15. data/.doc/ext/reflex/event.cpp +1 -1
  16. data/.doc/ext/reflex/file_dialog.cpp +181 -0
  17. data/.doc/ext/reflex/file_event.cpp +103 -0
  18. data/.doc/ext/reflex/filter.cpp +1 -1
  19. data/.doc/ext/reflex/focus_event.cpp +1 -1
  20. data/.doc/ext/reflex/frame_event.cpp +1 -1
  21. data/.doc/ext/reflex/gamepad.cpp +48 -0
  22. data/.doc/ext/reflex/image_view.cpp +1 -1
  23. data/.doc/ext/reflex/key_event.cpp +1 -274
  24. data/.doc/ext/reflex/line_shape.cpp +1 -1
  25. data/.doc/ext/reflex/link_constraint.cpp +1 -1
  26. data/.doc/ext/reflex/menu.cpp +6 -5
  27. data/.doc/ext/reflex/midi.cpp +9 -2
  28. data/.doc/ext/reflex/midi_event.cpp +1 -1
  29. data/.doc/ext/reflex/motion_event.cpp +1 -1
  30. data/.doc/ext/reflex/native.cpp +18 -6
  31. data/.doc/ext/reflex/note_event.cpp +1 -1
  32. data/.doc/ext/reflex/pin.cpp +1 -1
  33. data/.doc/ext/reflex/pointer.cpp +1 -1
  34. data/.doc/ext/reflex/pointer_event.cpp +2 -2
  35. data/.doc/ext/reflex/polygon_shape.cpp +1 -1
  36. data/.doc/ext/reflex/rect_shape.cpp +1 -1
  37. data/.doc/ext/reflex/reflex.cpp +566 -232
  38. data/.doc/ext/reflex/screen.cpp +27 -1
  39. data/.doc/ext/reflex/scroll_event.cpp +1 -1
  40. data/.doc/ext/reflex/selector.cpp +1 -1
  41. data/.doc/ext/reflex/shape.cpp +1 -1
  42. data/.doc/ext/reflex/snap_constraint.cpp +1 -1
  43. data/.doc/ext/reflex/style.cpp +1 -1
  44. data/.doc/ext/reflex/style_length.cpp +1 -1
  45. data/.doc/ext/reflex/text_event.cpp +104 -0
  46. data/.doc/ext/reflex/timer.cpp +1 -1
  47. data/.doc/ext/reflex/timer_event.cpp +1 -1
  48. data/.doc/ext/reflex/update_event.cpp +1 -1
  49. data/.doc/ext/reflex/view.cpp +110 -56
  50. data/.doc/ext/reflex/wheel_constraint.cpp +1 -1
  51. data/.doc/ext/reflex/wheel_event.cpp +1 -1
  52. data/.doc/ext/reflex/window.cpp +226 -17
  53. data/.github/workflows/release-gem.yml +2 -49
  54. data/.github/workflows/tag.yml +5 -28
  55. data/.github/workflows/test.yml +1 -37
  56. data/ChangeLog.md +54 -0
  57. data/Gemfile.lock +13 -8
  58. data/Rakefile +13 -2
  59. data/Reflex.podspec +2 -2
  60. data/VERSION +1 -1
  61. data/ext/reflex/application.cpp +41 -6
  62. data/ext/reflex/capture_event.cpp +1 -1
  63. data/ext/reflex/chase_constraint.cpp +1 -1
  64. data/ext/reflex/clipboard.cpp +1 -1
  65. data/ext/reflex/color_event.cpp +80 -0
  66. data/ext/reflex/color_picker.cpp +121 -0
  67. data/ext/reflex/constraint.cpp +1 -1
  68. data/ext/reflex/contact_event.cpp +1 -1
  69. data/ext/reflex/control_change_event.cpp +1 -1
  70. data/ext/reflex/device.cpp +1 -1
  71. data/ext/reflex/device_event.cpp +1 -1
  72. data/ext/reflex/draw_event.cpp +1 -1
  73. data/ext/reflex/ellipse_shape.cpp +1 -1
  74. data/ext/reflex/event.cpp +1 -1
  75. data/ext/reflex/extconf.rb +4 -2
  76. data/ext/reflex/file_dialog.cpp +194 -0
  77. data/ext/reflex/file_event.cpp +108 -0
  78. data/ext/reflex/filter.cpp +1 -1
  79. data/ext/reflex/focus_event.cpp +1 -1
  80. data/ext/reflex/frame_event.cpp +1 -1
  81. data/ext/reflex/gamepad.cpp +50 -0
  82. data/ext/reflex/image_view.cpp +1 -1
  83. data/ext/reflex/key_event.cpp +1 -275
  84. data/ext/reflex/line_shape.cpp +1 -1
  85. data/ext/reflex/link_constraint.cpp +1 -1
  86. data/ext/reflex/menu.cpp +8 -7
  87. data/ext/reflex/midi.cpp +11 -3
  88. data/ext/reflex/midi_event.cpp +1 -1
  89. data/ext/reflex/motion_event.cpp +1 -1
  90. data/ext/reflex/native.cpp +18 -6
  91. data/ext/reflex/note_event.cpp +1 -1
  92. data/ext/reflex/pin.cpp +1 -1
  93. data/ext/reflex/pointer.cpp +1 -1
  94. data/ext/reflex/pointer_event.cpp +2 -2
  95. data/ext/reflex/polygon_shape.cpp +1 -1
  96. data/ext/reflex/rect_shape.cpp +1 -1
  97. data/ext/reflex/reflex.cpp +568 -232
  98. data/ext/reflex/screen.cpp +31 -2
  99. data/ext/reflex/scroll_event.cpp +1 -1
  100. data/ext/reflex/selector.cpp +1 -1
  101. data/ext/reflex/selector.h +9 -9
  102. data/ext/reflex/shape.cpp +1 -1
  103. data/ext/reflex/snap_constraint.cpp +1 -1
  104. data/ext/reflex/style.cpp +1 -1
  105. data/ext/reflex/style_length.cpp +1 -1
  106. data/ext/reflex/text_event.cpp +111 -0
  107. data/ext/reflex/timer.cpp +1 -1
  108. data/ext/reflex/timer_event.cpp +1 -1
  109. data/ext/reflex/update_event.cpp +1 -1
  110. data/ext/reflex/view.cpp +121 -61
  111. data/ext/reflex/wheel_constraint.cpp +1 -1
  112. data/ext/reflex/wheel_event.cpp +1 -1
  113. data/ext/reflex/window.cpp +256 -25
  114. data/include/reflex/application.h +10 -0
  115. data/include/reflex/color_picker.h +65 -0
  116. data/include/reflex/event.h +178 -88
  117. data/include/reflex/file_dialog.h +73 -0
  118. data/include/reflex/gamepad.h +3 -0
  119. data/include/reflex/menu.h +3 -3
  120. data/include/reflex/midi.h +3 -0
  121. data/include/reflex/reflex.h +2 -0
  122. data/include/reflex/ruby/application.h +6 -1
  123. data/include/reflex/ruby/color_picker.h +89 -0
  124. data/include/reflex/ruby/event.h +62 -29
  125. data/include/reflex/ruby/file_dialog.h +89 -0
  126. data/include/reflex/ruby/gamepad.h +46 -0
  127. data/include/reflex/ruby/reflex.h +3 -0
  128. data/include/reflex/ruby/view.h +92 -44
  129. data/include/reflex/ruby/window.h +60 -1
  130. data/include/reflex/ruby.h +3 -0
  131. data/include/reflex/screen.h +11 -2
  132. data/include/reflex/view.h +28 -16
  133. data/include/reflex/window.h +40 -8
  134. data/include/reflex.h +3 -0
  135. data/lib/reflex/application.rb +5 -5
  136. data/lib/reflex/autoinit.rb +3 -1
  137. data/lib/reflex/button.rb +3 -3
  138. data/lib/reflex/color_event.rb +16 -0
  139. data/lib/reflex/color_picker.rb +45 -0
  140. data/lib/reflex/control_change_event.rb +17 -0
  141. data/lib/reflex/file_dialog.rb +70 -0
  142. data/lib/reflex/file_event.rb +37 -0
  143. data/lib/reflex/helper.rb +58 -7
  144. data/lib/reflex/key_event.rb +9 -4
  145. data/lib/reflex/menu.rb +17 -1
  146. data/lib/reflex/model.rb +19 -19
  147. data/lib/reflex/note_event.rb +1 -1
  148. data/lib/reflex/pointer.rb +14 -3
  149. data/lib/reflex/pointer_event.rb +12 -1
  150. data/lib/reflex/reflex.rb +5 -0
  151. data/lib/reflex/shape.rb +14 -14
  152. data/lib/reflex/style.rb +16 -16
  153. data/lib/reflex/text_event.rb +40 -0
  154. data/lib/reflex/timer.rb +3 -3
  155. data/lib/reflex/view.rb +29 -14
  156. data/lib/reflex/wheel_event.rb +12 -3
  157. data/lib/reflex/window.rb +25 -13
  158. data/lib/reflex.rb +8 -2
  159. data/reflex.gemspec +4 -4
  160. data/samples/ime.rb +100 -0
  161. data/samples/ios/hello/hello.xcodeproj/project.pbxproj +236 -224
  162. data/samples/menu.rb +4 -1
  163. data/samples/model.rb +3 -3
  164. data/samples/test/alert.rb +93 -0
  165. data/samples/test/always_on.rb +76 -0
  166. data/samples/test/app_background.rb +51 -0
  167. data/samples/test/boundary.rb +75 -0
  168. data/samples/test/callback_exception.rb +101 -0
  169. data/samples/test/cancel.rb +53 -0
  170. data/samples/test/color_picker.rb +63 -0
  171. data/samples/test/file_dialog.rb +102 -0
  172. data/samples/window_style.rb +156 -0
  173. data/src/application.cpp +159 -18
  174. data/src/application.h +92 -7
  175. data/src/color_picker.cpp +113 -0
  176. data/src/color_picker.h +36 -0
  177. data/src/event.cpp +410 -252
  178. data/src/event.h +12 -0
  179. data/src/file_dialog.cpp +163 -0
  180. data/src/file_dialog.h +52 -0
  181. data/src/gamepad.cpp +42 -5
  182. data/src/gamepad.h +4 -0
  183. data/src/ios/app_delegate.mm +5 -3
  184. data/src/ios/application.mm +24 -0
  185. data/src/ios/color_picker.mm +19 -0
  186. data/src/ios/file_dialog.mm +21 -0
  187. data/src/ios/gamepad.mm +4 -4
  188. data/src/ios/menu.mm +5 -0
  189. data/src/ios/reflex.mm +8 -0
  190. data/src/ios/screen.mm +26 -0
  191. data/src/ios/view_controller.mm +2 -30
  192. data/src/ios/window.mm +38 -9
  193. data/src/menu.cpp +66 -4
  194. data/src/menu.h +17 -1
  195. data/src/midi.cpp +61 -31
  196. data/src/osx/app_delegate.h +4 -0
  197. data/src/osx/app_delegate.mm +102 -22
  198. data/src/osx/application.mm +88 -6
  199. data/src/osx/color_picker.mm +112 -0
  200. data/src/osx/event.h +10 -0
  201. data/src/osx/event.mm +84 -30
  202. data/src/osx/file_dialog.mm +168 -0
  203. data/src/osx/gamepad.mm +2 -2
  204. data/src/osx/gamepad_hid.mm +1 -1
  205. data/src/osx/menu.mm +177 -33
  206. data/src/osx/native_window.h +16 -2
  207. data/src/osx/native_window.mm +114 -57
  208. data/src/osx/opengl_view.h +2 -1
  209. data/src/osx/opengl_view.mm +184 -43
  210. data/src/osx/reflex.mm +38 -0
  211. data/src/osx/screen.mm +36 -0
  212. data/src/osx/window.mm +106 -24
  213. data/src/pointer.cpp +13 -4
  214. data/src/pointer.h +4 -0
  215. data/src/rays.h +46 -0
  216. data/src/sdl/application.cpp +68 -8
  217. data/src/sdl/color_picker.cpp +18 -0
  218. data/src/sdl/event.cpp +24 -3
  219. data/src/sdl/event.h +12 -0
  220. data/src/sdl/file_dialog.cpp +20 -0
  221. data/src/sdl/gamepad.cpp +3 -7
  222. data/src/sdl/menu.cpp +5 -0
  223. data/src/sdl/reflex.cpp +20 -0
  224. data/src/sdl/screen.cpp +36 -0
  225. data/src/sdl/window.cpp +142 -29
  226. data/src/shape.cpp +15 -10
  227. data/src/view.cpp +287 -198
  228. data/src/view.h +4 -2
  229. data/src/vk.h +416 -0
  230. data/src/win32/application.cpp +162 -12
  231. data/src/win32/application.h +20 -0
  232. data/src/win32/color_picker.cpp +82 -0
  233. data/src/win32/event.cpp +114 -12
  234. data/src/win32/event.h +21 -4
  235. data/src/win32/file_dialog.cpp +226 -0
  236. data/src/win32/gamepad.cpp +9 -2
  237. data/src/win32/menu.cpp +191 -53
  238. data/src/win32/menu.h +9 -1
  239. data/src/win32/opengl.cpp +2 -9
  240. data/src/win32/reflex.cpp +44 -3
  241. data/src/win32/screen.cpp +164 -3
  242. data/src/win32/screen.h +8 -0
  243. data/src/win32/tray.cpp +191 -0
  244. data/src/win32/tray.h +22 -0
  245. data/src/win32/vk.cpp +11 -0
  246. data/src/win32/window.cpp +809 -148
  247. data/src/win32/window.h +6 -0
  248. data/src/window.cpp +718 -185
  249. data/src/window.h +66 -33
  250. data/src/world.cpp +9 -1
  251. data/test/helper.rb +17 -0
  252. data/test/test_application.rb +90 -1
  253. data/test/test_chase_constraint.rb +1 -3
  254. data/test/test_color_event.rb +36 -0
  255. data/test/test_color_picker.rb +62 -0
  256. data/test/test_constraint.rb +2 -4
  257. data/test/test_event.rb +1 -1
  258. data/test/test_file_dialog.rb +48 -0
  259. data/test/test_file_event.rb +43 -0
  260. data/test/test_has_text_preedit.rb +54 -0
  261. data/test/test_key_event.rb +20 -5
  262. data/test/test_link_constraint.rb +1 -3
  263. data/test/test_menu.rb +40 -10
  264. data/test/test_pointer.rb +33 -23
  265. data/test/test_pointer_event.rb +24 -9
  266. data/test/test_reflex.rb +36 -0
  267. data/test/test_screen.rb +24 -2
  268. data/test/test_snap_constraint.rb +1 -3
  269. data/test/test_text_event.rb +54 -0
  270. data/test/test_view.rb +41 -4
  271. data/test/test_wheel_constraint.rb +1 -3
  272. data/test/test_wheel_event.rb +13 -5
  273. data/test/test_window.rb +196 -44
  274. metadata +80 -10
  275. data/.github/workflows/utils.rb +0 -127
data/src/event.cpp CHANGED
@@ -626,6 +626,73 @@ namespace Reflex
626
626
  }
627
627
 
628
628
 
629
+ struct TextEvent::Data
630
+ {
631
+
632
+ Action action;
633
+
634
+ String text;
635
+
636
+ int selection_offset, selection_size;
637
+
638
+ Data (
639
+ Action action = ACTION_NONE, const char* text = NULL,
640
+ int selection_offset = -1, int selection_size = 0)
641
+ : action(action), text(text ? text : ""),
642
+ selection_offset(selection_offset), selection_size(selection_size)
643
+ {
644
+ }
645
+
646
+ };// TextEvent::Data
647
+
648
+
649
+ TextEvent::TextEvent ()
650
+ {
651
+ }
652
+
653
+ TextEvent::TextEvent (
654
+ Action action, const char* text,
655
+ int selection_offset, int selection_size)
656
+ : self(new Data(action, text, selection_offset, selection_size))
657
+ {
658
+ }
659
+
660
+ TextEvent::TextEvent (const TextEvent* src)
661
+ : Event(src), self(new Data(*src->self))
662
+ {
663
+ }
664
+
665
+ TextEvent
666
+ TextEvent::dup () const
667
+ {
668
+ return TextEvent(this);
669
+ }
670
+
671
+ TextEvent::Action
672
+ TextEvent::action () const
673
+ {
674
+ return self->action;
675
+ }
676
+
677
+ const char*
678
+ TextEvent::text () const
679
+ {
680
+ return self->text;
681
+ }
682
+
683
+ int
684
+ TextEvent::selection_offset () const
685
+ {
686
+ return self->selection_offset;
687
+ }
688
+
689
+ int
690
+ TextEvent::selection_size () const
691
+ {
692
+ return self->selection_size;
693
+ }
694
+
695
+
629
696
  struct PointerEvent::Data
630
697
  {
631
698
 
@@ -712,6 +779,8 @@ namespace Reflex
712
779
  if (!child)
713
780
  argument_error(__FILE__, __LINE__);
714
781
 
782
+ if (pthis->empty()) return;
783
+
715
784
  const Bounds& frame = child->frame();
716
785
 
717
786
  std::vector<Pointer> pointers;
@@ -834,6 +903,12 @@ namespace Reflex
834
903
  {
835
904
  }
836
905
 
906
+ WheelEvent::WheelEvent (
907
+ const Point& position, const Point& dposition, uint modifiers)
908
+ : self(new Data(position, dposition, modifiers))
909
+ {
910
+ }
911
+
837
912
  WheelEvent::WheelEvent (const WheelEvent* src)
838
913
  : Event(src), self(new Data(*src->self))
839
914
  {
@@ -876,503 +951,586 @@ namespace Reflex
876
951
  }
877
952
 
878
953
 
879
- struct MIDIEvent::Data
954
+ struct CaptureEvent::Data
880
955
  {
881
956
 
882
- MIDI::Ref midi;
957
+ uint begin, end;
883
958
 
884
- uchar bytes[3] = {0};
959
+ Data (uint begin = 0, uint end = 0)
960
+ : begin(begin), end(end)
961
+ {
962
+ }
885
963
 
886
- bool captured = false;
964
+ };// CaptureEvent::Data
887
965
 
888
- };// MIDIEvent
889
966
 
967
+ CaptureEvent::CaptureEvent ()
968
+ {
969
+ }
890
970
 
891
- bool
892
- MIDIEvent_to_note_event (NoteEvent* result, const MIDIEvent& event)
971
+ CaptureEvent::CaptureEvent (uint begin, uint end)
972
+ : self(new Data(begin, end))
893
973
  {
894
- auto a = event.action();
895
- if (a != MIDIEvent::NOTE_ON && a != MIDIEvent::NOTE_OFF)
896
- return false;
974
+ }
897
975
 
898
- *result = NoteEvent(
899
- a == MIDIEvent::NOTE_ON ? NoteEvent::ON : NoteEvent::OFF,
900
- event.channel(), event.data1(), event.data2() / 127.f, event.time());
901
- return true;
976
+ CaptureEvent::CaptureEvent (const CaptureEvent* src)
977
+ : Event(src), self(new Data(*src->self))
978
+ {
902
979
  }
903
980
 
904
- bool
905
- MIDIEvent_to_control_change_event (
906
- ControlChangeEvent* result, const MIDIEvent& event)
981
+ CaptureEvent
982
+ CaptureEvent::dup () const
907
983
  {
908
- if (event.action() != MIDIEvent::CONTROL_CHANGE)
909
- return false;
984
+ return CaptureEvent(this);
985
+ }
910
986
 
911
- *result = ControlChangeEvent(
912
- event.channel(), event.data1(), event.data2() / 127.f, event.time());
913
- return true;
987
+ uint
988
+ CaptureEvent::begin () const
989
+ {
990
+ return self->begin;
914
991
  }
915
992
 
916
- void
917
- MIDIEvent_set_captured (MIDIEvent* pthis, bool captured)
993
+ uint
994
+ CaptureEvent::end () const
918
995
  {
919
- pthis->self->captured = captured;
996
+ return self->end;
920
997
  }
921
998
 
922
999
 
923
- MIDIEvent::MIDIEvent ()
1000
+ struct TimerEvent::Data
1001
+ {
1002
+
1003
+ Timer::Ref timer;
1004
+
1005
+ Data (Timer* timer = NULL)
1006
+ : timer(timer)
1007
+ {
1008
+ }
1009
+
1010
+ };// TimerEvent::Data
1011
+
1012
+
1013
+ TimerEvent::TimerEvent ()
924
1014
  {
925
1015
  }
926
1016
 
927
- MIDIEvent::MIDIEvent (MIDI* midi, const uchar* bytes, double time)
928
- : Event(time)
1017
+ TimerEvent::TimerEvent (Timer* timer)
1018
+ : self(new Data(timer))
929
1019
  {
930
- self->midi = midi;
931
- memcpy(self->bytes, bytes, sizeof(uchar) * 3);
932
1020
  }
933
1021
 
934
- MIDIEvent::MIDIEvent (const MIDIEvent* src)
1022
+ TimerEvent::TimerEvent (const TimerEvent* src)
935
1023
  : Event(src), self(new Data(*src->self))
936
1024
  {
937
1025
  }
938
1026
 
939
- MIDIEvent
940
- MIDIEvent::dup () const
1027
+ TimerEvent
1028
+ TimerEvent::dup () const
941
1029
  {
942
- return MIDIEvent(this);
1030
+ return TimerEvent(this);
943
1031
  }
944
1032
 
945
- MIDI*
946
- MIDIEvent::midi () const
1033
+ Timer*
1034
+ TimerEvent::timer ()
947
1035
  {
948
- return self->midi;
1036
+ return self->timer;
949
1037
  }
950
1038
 
951
- MIDIEvent::Action
952
- MIDIEvent::action () const
1039
+ const Timer*
1040
+ TimerEvent::timer () const
953
1041
  {
954
- switch (self->bytes[0] >> 4)
955
- {
956
- case 0x9: return NOTE_ON;
957
- case 0x8: return NOTE_OFF;
958
- case 0xA: return KEY_PRESSURE;
959
- case 0xB: return CONTROL_CHANGE;
960
- case 0xC: return PROGRAM_CHANGE;
961
- case 0xD: return CHANNEL_PRESSURE;
962
- case 0xE: return PITCH_BEND_CHANGE;
963
- case 0xF: return SYSTEM;
964
- default: return ACTION_NONE;
965
- }
1042
+ return const_cast<TimerEvent*>(this)->timer();
966
1043
  }
967
1044
 
968
- int
969
- MIDIEvent::channel () const
1045
+ View*
1046
+ TimerEvent::owner () const
970
1047
  {
971
- auto a = action();
972
- if (a == ACTION_NONE || a == SYSTEM)
973
- return -1;
1048
+ return self->timer ? self->timer->owner() : NULL;
1049
+ }
974
1050
 
975
- return self->bytes[0] & 0xF;
1051
+ int
1052
+ TimerEvent::id () const
1053
+ {
1054
+ return self->timer ? self->timer->id() : Timer::ID_INVALID;
976
1055
  }
977
1056
 
978
- uchar
979
- MIDIEvent::data1 () const
1057
+ float
1058
+ TimerEvent::interval () const
980
1059
  {
981
- return self->bytes[1];
1060
+ return self->timer ? self->timer->interval() : -1;
982
1061
  }
983
1062
 
984
- uchar
985
- MIDIEvent::data2 () const
1063
+ int
1064
+ TimerEvent::count () const
986
1065
  {
987
- return self->bytes[2];
1066
+ return self->timer ? self->timer->count() : 0;
988
1067
  }
989
1068
 
990
1069
  bool
991
- MIDIEvent::is_captured () const
1070
+ TimerEvent::is_finished () const
992
1071
  {
993
- return self->captured;
1072
+ return self->timer ? self->timer->is_finished() : true;
994
1073
  }
995
1074
 
996
1075
 
997
- struct NoteEvent::Data
1076
+ struct ContactEvent::Data
998
1077
  {
999
1078
 
1000
- Action action = ACTION_NONE;
1001
-
1002
- int channel = 0;
1003
-
1004
- int note = 0;
1005
-
1006
- float velocity = 0;
1079
+ Action action;
1007
1080
 
1008
- bool captured = false;
1081
+ Shape* shape;
1009
1082
 
1010
- };// NoteEvent::Data
1083
+ View* view;
1011
1084
 
1085
+ Data (Action action = ACTION_NONE, Shape* shape = NULL, View* view = NULL)
1086
+ : action(action), shape(shape), view(view)
1087
+ {
1088
+ }
1012
1089
 
1013
- void
1014
- NoteEvent_set_captured (NoteEvent* pthis, bool captured)
1015
- {
1016
- pthis->self->captured = captured;
1017
- }
1090
+ };// ContactEvent::Data
1018
1091
 
1019
1092
 
1020
- NoteEvent::NoteEvent ()
1093
+ ContactEvent::ContactEvent ()
1021
1094
  {
1022
1095
  }
1023
1096
 
1024
- NoteEvent::NoteEvent (
1025
- Action action, int channel, int note, float velocity, double time)
1026
- : Event(time)
1097
+ ContactEvent::ContactEvent (Action action, Shape* shape)
1098
+ : self(new Data(action, shape, shape ? shape->owner() : NULL))
1027
1099
  {
1028
- self->action = action;
1029
- self->channel = channel;
1030
- self->note = note;
1031
- self->velocity = velocity;
1032
1100
  }
1033
1101
 
1034
- NoteEvent::NoteEvent (const NoteEvent* src)
1102
+ ContactEvent::ContactEvent (const ContactEvent* src)
1035
1103
  : Event(src), self(new Data(*src->self))
1036
1104
  {
1037
1105
  }
1038
1106
 
1039
- NoteEvent
1040
- NoteEvent::dup () const
1107
+ ContactEvent
1108
+ ContactEvent::dup () const
1041
1109
  {
1042
- return NoteEvent(this);
1110
+ return ContactEvent(this);
1043
1111
  }
1044
1112
 
1045
- NoteEvent::Action
1046
- NoteEvent::action () const
1113
+ ContactEvent::Action
1114
+ ContactEvent::action () const
1047
1115
  {
1048
1116
  return self->action;
1049
1117
  }
1050
1118
 
1051
- int
1052
- NoteEvent::channel () const
1119
+ Shape*
1120
+ ContactEvent::shape ()
1053
1121
  {
1054
- return self->channel;
1122
+ return self->shape;
1055
1123
  }
1056
1124
 
1057
- int
1058
- NoteEvent::note () const
1125
+ const Shape*
1126
+ ContactEvent::shape () const
1059
1127
  {
1060
- return self->note;
1128
+ return const_cast<ContactEvent*>(this)->shape();
1061
1129
  }
1062
1130
 
1063
- float
1064
- NoteEvent::frequency () const
1131
+ View*
1132
+ ContactEvent::view ()
1065
1133
  {
1066
- static const int A4 = 69;
1067
- return 440 * std::pow(2.0, (note() - A4) / 12.0);
1134
+ return self->view;
1068
1135
  }
1069
1136
 
1070
- float
1071
- NoteEvent::velocity () const
1137
+ const View*
1138
+ ContactEvent::view () const
1072
1139
  {
1073
- return self->velocity;
1140
+ return const_cast<ContactEvent*>(this)->view();
1074
1141
  }
1075
1142
 
1076
- bool
1077
- NoteEvent::is_captured () const
1078
- {
1079
- return self->captured;
1080
- }
1081
-
1082
-
1083
- struct ControlChangeEvent::Data
1143
+
1144
+ struct MotionEvent::Data
1084
1145
  {
1085
1146
 
1086
- int channel = 0;
1087
-
1088
- int controller = 0;
1089
-
1090
- float value = 0;
1147
+ Point gravity;
1091
1148
 
1092
- bool captured = false;
1149
+ Data (const Point& gravity)
1150
+ : gravity(gravity)
1151
+ {
1152
+ }
1093
1153
 
1094
- };// ControlChangeEvent::Data
1154
+ };// MotionEvent::Data
1095
1155
 
1096
1156
 
1097
- void
1098
- ControlChangeEvent_set_captured (ControlChangeEvent* pthis, bool captured)
1157
+ MotionEvent::MotionEvent (const Point& gravity)
1158
+ : self(new Data(gravity))
1099
1159
  {
1100
- pthis->self->captured = captured;
1101
1160
  }
1102
1161
 
1162
+ MotionEvent::MotionEvent (const MotionEvent* src)
1163
+ : Event(src), self(new Data(*src->self))
1164
+ {
1165
+ }
1103
1166
 
1104
- ControlChangeEvent::ControlChangeEvent ()
1167
+ MotionEvent
1168
+ MotionEvent::dup () const
1105
1169
  {
1170
+ return MotionEvent(this);
1106
1171
  }
1107
1172
 
1108
- ControlChangeEvent::ControlChangeEvent (
1109
- int channel, int controller, float value, double time)
1110
- : Event(time)
1173
+ const Point&
1174
+ MotionEvent::gravity () const
1111
1175
  {
1112
- self->channel = channel;
1113
- self->controller = controller;
1114
- self->value = value;
1176
+ return self->gravity;
1115
1177
  }
1116
1178
 
1117
- ControlChangeEvent::ControlChangeEvent (const ControlChangeEvent* src)
1118
- : Event(src), self(new Data(*src->self))
1179
+
1180
+ struct FileEvent::Data
1181
+ {
1182
+
1183
+ Action action;
1184
+
1185
+ StringList paths;
1186
+
1187
+ Data (Action action = ACTION_NONE, const StringList& paths = {})
1188
+ : action(action), paths(paths)
1189
+ {
1190
+ }
1191
+
1192
+ };// FileEvent::Data
1193
+
1194
+
1195
+ FileEvent::FileEvent ()
1119
1196
  {
1120
1197
  }
1121
1198
 
1122
- ControlChangeEvent
1123
- ControlChangeEvent::dup () const
1199
+ FileEvent::FileEvent (Action action, const StringList& paths)
1200
+ : self(new Data(action, paths))
1124
1201
  {
1125
- return ControlChangeEvent(this);
1126
1202
  }
1127
1203
 
1128
- int
1129
- ControlChangeEvent::channel () const
1204
+ FileEvent::FileEvent (const FileEvent* src)
1205
+ : Event(src), self(new Data(*src->self))
1130
1206
  {
1131
- return self->channel;
1132
1207
  }
1133
1208
 
1134
- int
1135
- ControlChangeEvent::controller () const
1209
+ FileEvent
1210
+ FileEvent::dup () const
1136
1211
  {
1137
- return self->controller;
1212
+ return FileEvent(this);
1138
1213
  }
1139
1214
 
1140
- float
1141
- ControlChangeEvent::value () const
1215
+ FileEvent::Action
1216
+ FileEvent::action () const
1142
1217
  {
1143
- return self->value;
1218
+ return self->action;
1144
1219
  }
1145
1220
 
1146
- bool
1147
- ControlChangeEvent::is_captured () const
1221
+ const StringList&
1222
+ FileEvent::paths () const
1148
1223
  {
1149
- return self->captured;
1224
+ return self->paths;
1150
1225
  }
1151
1226
 
1152
1227
 
1153
- struct CaptureEvent::Data
1228
+ struct ColorEvent::Data
1154
1229
  {
1155
1230
 
1156
- uint begin, end;
1231
+ Color color;
1157
1232
 
1158
- Data (uint begin = 0, uint end = 0)
1159
- : begin(begin), end(end)
1160
- {
1161
- }
1162
-
1163
- };// CaptureEvent::Data
1233
+ };// ColorEvent::Data
1164
1234
 
1165
1235
 
1166
- CaptureEvent::CaptureEvent ()
1236
+ ColorEvent::ColorEvent ()
1167
1237
  {
1168
1238
  }
1169
1239
 
1170
- CaptureEvent::CaptureEvent (uint begin, uint end)
1171
- : self(new Data(begin, end))
1240
+ ColorEvent::ColorEvent (const Color& color)
1172
1241
  {
1242
+ self->color = color;
1173
1243
  }
1174
1244
 
1175
- CaptureEvent::CaptureEvent (const CaptureEvent* src)
1245
+ ColorEvent::ColorEvent (const ColorEvent* src)
1176
1246
  : Event(src), self(new Data(*src->self))
1177
1247
  {
1178
1248
  }
1179
1249
 
1180
- CaptureEvent
1181
- CaptureEvent::dup () const
1250
+ ColorEvent
1251
+ ColorEvent::dup () const
1182
1252
  {
1183
- return CaptureEvent(this);
1253
+ return ColorEvent(this);
1184
1254
  }
1185
1255
 
1186
- uint
1187
- CaptureEvent::begin () const
1256
+ const Color&
1257
+ ColorEvent::color () const
1188
1258
  {
1189
- return self->begin;
1259
+ return self->color;
1190
1260
  }
1191
1261
 
1192
- uint
1193
- CaptureEvent::end () const
1262
+
1263
+ struct MIDIEvent::Data
1194
1264
  {
1195
- return self->end;
1196
- }
1197
1265
 
1266
+ MIDI::Ref midi;
1198
1267
 
1199
- struct TimerEvent::Data
1200
- {
1268
+ uchar bytes[3] = {0};
1201
1269
 
1202
- Timer::Ref timer;
1270
+ bool captured = false;
1203
1271
 
1204
- Data (Timer* timer = NULL)
1205
- : timer(timer)
1206
- {
1207
- }
1272
+ };// MIDIEvent::Data
1208
1273
 
1209
- };// TimerEvent::Data
1210
1274
 
1275
+ bool
1276
+ MIDIEvent_to_note_event (NoteEvent* result, const MIDIEvent& event)
1277
+ {
1278
+ auto a = event.action();
1279
+ if (a != MIDIEvent::NOTE_ON && a != MIDIEvent::NOTE_OFF)
1280
+ return false;
1211
1281
 
1212
- TimerEvent::TimerEvent ()
1282
+ *result = NoteEvent(
1283
+ a == MIDIEvent::NOTE_ON ? NoteEvent::ON : NoteEvent::OFF,
1284
+ event.channel(), event.data1(), event.data2() / 127.f, event.time());
1285
+ return true;
1286
+ }
1287
+
1288
+ bool
1289
+ MIDIEvent_to_control_change_event (
1290
+ ControlChangeEvent* result, const MIDIEvent& event)
1213
1291
  {
1292
+ if (event.action() != MIDIEvent::CONTROL_CHANGE)
1293
+ return false;
1294
+
1295
+ *result = ControlChangeEvent(
1296
+ event.channel(), event.data1(), event.data2() / 127.f, event.time());
1297
+ return true;
1214
1298
  }
1215
1299
 
1216
- TimerEvent::TimerEvent (Timer* timer)
1217
- : self(new Data(timer))
1300
+ void
1301
+ MIDIEvent_set_captured (MIDIEvent* pthis, bool captured)
1218
1302
  {
1303
+ pthis->self->captured = captured;
1219
1304
  }
1220
1305
 
1221
- TimerEvent::TimerEvent (const TimerEvent* src)
1222
- : Event(src), self(new Data(*src->self))
1306
+
1307
+ MIDIEvent::MIDIEvent ()
1223
1308
  {
1224
1309
  }
1225
1310
 
1226
- TimerEvent
1227
- TimerEvent::dup () const
1311
+ MIDIEvent::MIDIEvent (MIDI* midi, const uchar* bytes, double time)
1312
+ : Event(time)
1228
1313
  {
1229
- return TimerEvent(this);
1314
+ self->midi = midi;
1315
+ memcpy(self->bytes, bytes, sizeof(uchar) * 3);
1230
1316
  }
1231
1317
 
1232
- Timer*
1233
- TimerEvent::timer ()
1318
+ MIDIEvent::MIDIEvent (const MIDIEvent* src)
1319
+ : Event(src), self(new Data(*src->self))
1234
1320
  {
1235
- return self->timer;
1236
1321
  }
1237
1322
 
1238
- const Timer*
1239
- TimerEvent::timer () const
1323
+ MIDIEvent
1324
+ MIDIEvent::dup () const
1240
1325
  {
1241
- return const_cast<TimerEvent*>(this)->timer();
1326
+ return MIDIEvent(this);
1242
1327
  }
1243
1328
 
1244
- View*
1245
- TimerEvent::owner () const
1329
+ MIDI*
1330
+ MIDIEvent::midi () const
1246
1331
  {
1247
- return self->timer ? self->timer->owner() : NULL;
1332
+ return self->midi;
1333
+ }
1334
+
1335
+ MIDIEvent::Action
1336
+ MIDIEvent::action () const
1337
+ {
1338
+ switch (self->bytes[0] >> 4)
1339
+ {
1340
+ case 0x9: return NOTE_ON;
1341
+ case 0x8: return NOTE_OFF;
1342
+ case 0xA: return KEY_PRESSURE;
1343
+ case 0xB: return CONTROL_CHANGE;
1344
+ case 0xC: return PROGRAM_CHANGE;
1345
+ case 0xD: return CHANNEL_PRESSURE;
1346
+ case 0xE: return PITCH_BEND_CHANGE;
1347
+ case 0xF: return SYSTEM;
1348
+ default: return ACTION_NONE;
1349
+ }
1248
1350
  }
1249
1351
 
1250
1352
  int
1251
- TimerEvent::id () const
1353
+ MIDIEvent::channel () const
1252
1354
  {
1253
- return self->timer ? self->timer->id() : Timer::ID_INVALID;
1355
+ auto a = action();
1356
+ if (a == ACTION_NONE || a == SYSTEM)
1357
+ return -1;
1358
+
1359
+ return self->bytes[0] & 0xF;
1254
1360
  }
1255
1361
 
1256
- float
1257
- TimerEvent::interval () const
1362
+ uchar
1363
+ MIDIEvent::data1 () const
1258
1364
  {
1259
- return self->timer ? self->timer->interval() : -1;
1365
+ return self->bytes[1];
1260
1366
  }
1261
1367
 
1262
- int
1263
- TimerEvent::count () const
1368
+ uchar
1369
+ MIDIEvent::data2 () const
1264
1370
  {
1265
- return self->timer ? self->timer->count() : 0;
1371
+ return self->bytes[2];
1266
1372
  }
1267
1373
 
1268
1374
  bool
1269
- TimerEvent::is_finished () const
1375
+ MIDIEvent::is_captured () const
1270
1376
  {
1271
- return self->timer ? self->timer->is_finished() : true;
1377
+ return self->captured;
1272
1378
  }
1273
1379
 
1274
1380
 
1275
- struct ContactEvent::Data
1381
+ struct NoteEvent::Data
1276
1382
  {
1277
1383
 
1278
- Action action;
1384
+ Action action = ACTION_NONE;
1279
1385
 
1280
- Shape* shape;
1386
+ int channel = 0;
1281
1387
 
1282
- View* view;
1388
+ int note = 0;
1283
1389
 
1284
- Data (Action action = ACTION_NONE, Shape* shape = NULL, View* view = NULL)
1285
- : action(action), shape(shape), view(view)
1286
- {
1287
- }
1390
+ float velocity = 0;
1288
1391
 
1289
- };// ContactEvent::Data
1392
+ bool captured = false;
1290
1393
 
1394
+ };// NoteEvent::Data
1291
1395
 
1292
- ContactEvent::ContactEvent ()
1396
+
1397
+ void
1398
+ NoteEvent_set_captured (NoteEvent* pthis, bool captured)
1293
1399
  {
1400
+ pthis->self->captured = captured;
1294
1401
  }
1295
1402
 
1296
- ContactEvent::ContactEvent (Action action, Shape* shape)
1297
- : self(new Data(action, shape, shape ? shape->owner() : NULL))
1403
+
1404
+ NoteEvent::NoteEvent ()
1298
1405
  {
1299
1406
  }
1300
1407
 
1301
- ContactEvent::ContactEvent (const ContactEvent* src)
1408
+ NoteEvent::NoteEvent (
1409
+ Action action, int channel, int note, float velocity, double time)
1410
+ : Event(time)
1411
+ {
1412
+ self->action = action;
1413
+ self->channel = channel;
1414
+ self->note = note;
1415
+ self->velocity = velocity;
1416
+ }
1417
+
1418
+ NoteEvent::NoteEvent (const NoteEvent* src)
1302
1419
  : Event(src), self(new Data(*src->self))
1303
1420
  {
1304
1421
  }
1305
1422
 
1306
- ContactEvent
1307
- ContactEvent::dup () const
1423
+ NoteEvent
1424
+ NoteEvent::dup () const
1308
1425
  {
1309
- return ContactEvent(this);
1426
+ return NoteEvent(this);
1310
1427
  }
1311
1428
 
1312
- ContactEvent::Action
1313
- ContactEvent::action () const
1429
+ NoteEvent::Action
1430
+ NoteEvent::action () const
1314
1431
  {
1315
1432
  return self->action;
1316
1433
  }
1317
1434
 
1318
- Shape*
1319
- ContactEvent::shape ()
1435
+ int
1436
+ NoteEvent::channel () const
1320
1437
  {
1321
- return self->shape;
1438
+ return self->channel;
1322
1439
  }
1323
1440
 
1324
- const Shape*
1325
- ContactEvent::shape () const
1441
+ int
1442
+ NoteEvent::note () const
1326
1443
  {
1327
- return const_cast<ContactEvent*>(this)->shape();
1444
+ return self->note;
1328
1445
  }
1329
1446
 
1330
- View*
1331
- ContactEvent::view ()
1447
+ float
1448
+ NoteEvent::frequency () const
1332
1449
  {
1333
- return self->view;
1450
+ static const int A4 = 69;
1451
+ return 440 * std::pow(2.0, (note() - A4) / 12.0);
1334
1452
  }
1335
1453
 
1336
- const View*
1337
- ContactEvent::view () const
1454
+ float
1455
+ NoteEvent::velocity () const
1338
1456
  {
1339
- return const_cast<ContactEvent*>(this)->view();
1457
+ return self->velocity;
1340
1458
  }
1341
1459
 
1460
+ bool
1461
+ NoteEvent::is_captured () const
1462
+ {
1463
+ return self->captured;
1464
+ }
1342
1465
 
1343
- struct MotionEvent::Data
1466
+
1467
+ struct ControlChangeEvent::Data
1344
1468
  {
1345
1469
 
1346
- Point gravity;
1470
+ int channel = 0;
1347
1471
 
1348
- Data (const Point& gravity)
1349
- : gravity(gravity)
1350
- {
1351
- }
1472
+ int controller = 0;
1352
1473
 
1353
- };// MotionEvent::Data
1474
+ float value = 0;
1354
1475
 
1476
+ bool captured = false;
1355
1477
 
1356
- MotionEvent::MotionEvent (const Point& gravity)
1357
- : self(new Data(gravity))
1478
+ };// ControlChangeEvent::Data
1479
+
1480
+
1481
+ void
1482
+ ControlChangeEvent_set_captured (ControlChangeEvent* pthis, bool captured)
1358
1483
  {
1484
+ pthis->self->captured = captured;
1359
1485
  }
1360
1486
 
1361
- MotionEvent::MotionEvent (const MotionEvent* src)
1487
+
1488
+ ControlChangeEvent::ControlChangeEvent ()
1489
+ {
1490
+ }
1491
+
1492
+ ControlChangeEvent::ControlChangeEvent (
1493
+ int channel, int controller, float value, double time)
1494
+ : Event(time)
1495
+ {
1496
+ self->channel = channel;
1497
+ self->controller = controller;
1498
+ self->value = value;
1499
+ }
1500
+
1501
+ ControlChangeEvent::ControlChangeEvent (const ControlChangeEvent* src)
1362
1502
  : Event(src), self(new Data(*src->self))
1363
1503
  {
1364
1504
  }
1365
1505
 
1366
- MotionEvent
1367
- MotionEvent::dup () const
1506
+ ControlChangeEvent
1507
+ ControlChangeEvent::dup () const
1368
1508
  {
1369
- return MotionEvent(this);
1509
+ return ControlChangeEvent(this);
1370
1510
  }
1371
1511
 
1372
- const Point&
1373
- MotionEvent::gravity () const
1512
+ int
1513
+ ControlChangeEvent::channel () const
1374
1514
  {
1375
- return self->gravity;
1515
+ return self->channel;
1516
+ }
1517
+
1518
+ int
1519
+ ControlChangeEvent::controller () const
1520
+ {
1521
+ return self->controller;
1522
+ }
1523
+
1524
+ float
1525
+ ControlChangeEvent::value () const
1526
+ {
1527
+ return self->value;
1528
+ }
1529
+
1530
+ bool
1531
+ ControlChangeEvent::is_captured () const
1532
+ {
1533
+ return self->captured;
1376
1534
  }
1377
1535
 
1378
1536