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