kredki 0.1.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 (386) hide show
  1. checksums.yaml +7 -0
  2. data/lib/kredki/core/application.rb +314 -0
  3. data/lib/kredki/core/color.rb +100 -0
  4. data/lib/kredki/core/event/block_event_reaction.rb +44 -0
  5. data/lib/kredki/core/event/composite_event_manager.rb +37 -0
  6. data/lib/kredki/core/event/event.rb +91 -0
  7. data/lib/kredki/core/event/event_manager.rb +60 -0
  8. data/lib/kredki/core/event/event_manager_jobs.rb +53 -0
  9. data/lib/kredki/core/event/event_reaction.rb +36 -0
  10. data/lib/kredki/core/event/family/drop_event.rb +40 -0
  11. data/lib/kredki/core/event/family/exit_event.rb +5 -0
  12. data/lib/kredki/core/event/family/focus_enter_event.rb +5 -0
  13. data/lib/kredki/core/event/family/focus_leave_event.rb +5 -0
  14. data/lib/kredki/core/event/family/hide_event.rb +5 -0
  15. data/lib/kredki/core/event/family/joystick_event.rb +102 -0
  16. data/lib/kredki/core/event/family/key_event.rb +40 -0
  17. data/lib/kredki/core/event/family/mouse_event.rb +190 -0
  18. data/lib/kredki/core/event/family/pastele_event.rb +11 -0
  19. data/lib/kredki/core/event/family/show_event.rb +5 -0
  20. data/lib/kredki/core/event/family/text_event.rb +23 -0
  21. data/lib/kredki/core/event/family/tick_event.rb +5 -0
  22. data/lib/kredki/core/event/family/update_complete_event.rb +5 -0
  23. data/lib/kredki/core/event/family/window_event.rb +108 -0
  24. data/lib/kredki/core/event/job_event_reaction.rb +44 -0
  25. data/lib/kredki/core/event/joystick_event_manager.rb +30 -0
  26. data/lib/kredki/core/event/keyboard_event_manager.rb +29 -0
  27. data/lib/kredki/core/event/method_event_reaction.rb +46 -0
  28. data/lib/kredki/core/event/mouse_event_manager.rb +27 -0
  29. data/lib/kredki/core/font.rb +53 -0
  30. data/lib/kredki/core/job/after_job.rb +59 -0
  31. data/lib/kredki/core/job/job.rb +108 -0
  32. data/lib/kredki/core/job/loop_job.rb +87 -0
  33. data/lib/kredki/core/job/play_animation_job.rb +44 -0
  34. data/lib/kredki/core/job/play_job.rb +41 -0
  35. data/lib/kredki/core/job/play_loop_animation_job.rb +98 -0
  36. data/lib/kredki/core/job/play_loop_job.rb +104 -0
  37. data/lib/kredki/core/job/side_job.rb +62 -0
  38. data/lib/kredki/core/kernel-path.rb +71 -0
  39. data/lib/kredki/core/kredki.rb +89 -0
  40. data/lib/kredki/core/linear_gradient.rb +43 -0
  41. data/lib/kredki/core/media/clipboard.rb +35 -0
  42. data/lib/kredki/core/media/joystick.rb +199 -0
  43. data/lib/kredki/core/media/keyboard.rb +84 -0
  44. data/lib/kredki/core/media/keyboard_modifiers_decoder.rb +154 -0
  45. data/lib/kredki/core/media/mouse.rb +197 -0
  46. data/lib/kredki/core/paint/animation.rb +247 -0
  47. data/lib/kredki/core/paint/area.rb +67 -0
  48. data/lib/kredki/core/paint/block_shape_area.rb +102 -0
  49. data/lib/kredki/core/paint/ellipse.rb +22 -0
  50. data/lib/kredki/core/paint/paint.rb +392 -0
  51. data/lib/kredki/core/paint/picture.rb +126 -0
  52. data/lib/kredki/core/paint/rectangle.rb +202 -0
  53. data/lib/kredki/core/paint/scene.rb +277 -0
  54. data/lib/kredki/core/paint/shape.rb +394 -0
  55. data/lib/kredki/core/paint/shape_area.rb +57 -0
  56. data/lib/kredki/core/paint/text.rb +222 -0
  57. data/lib/kredki/core/pastele/pastele-extern.rb +139 -0
  58. data/lib/kredki/core/pastele/pastele.rb +205 -0
  59. data/lib/kredki/core/radial_gradient.rb +45 -0
  60. data/lib/kredki/core/setup.rb +214 -0
  61. data/lib/kredki/core/window/pane.rb +178 -0
  62. data/lib/kredki/core/window/pane_event_manager.rb +44 -0
  63. data/lib/kredki/core/window/pane_events.rb +366 -0
  64. data/lib/kredki/core/window/window.rb +584 -0
  65. data/lib/kredki/core.rb +2 -0
  66. data/lib/kredki/hide.rb +9 -0
  67. data/lib/kredki/irb.rb +90 -0
  68. data/lib/kredki/module.rb +3 -0
  69. data/lib/kredki/pads/application.rb +13 -0
  70. data/lib/kredki/pads/button.rb +151 -0
  71. data/lib/kredki/pads/checkbox/checkbox.rb +68 -0
  72. data/lib/kredki/pads/checkbox/checkbox_button.rb +65 -0
  73. data/lib/kredki/pads/context/item.rb +65 -0
  74. data/lib/kredki/pads/context/item_group.rb +10 -0
  75. data/lib/kredki/pads/context/layer.rb +59 -0
  76. data/lib/kredki/pads/context/menu.rb +77 -0
  77. data/lib/kredki/pads/context/pad.rb +26 -0
  78. data/lib/kredki/pads/context/primary_layer.rb +51 -0
  79. data/lib/kredki/pads/context/secondary_layer.rb +60 -0
  80. data/lib/kredki/pads/item/item.rb +140 -0
  81. data/lib/kredki/pads/item/item_group.rb +44 -0
  82. data/lib/kredki/pads/item/item_x.rb +22 -0
  83. data/lib/kredki/pads/item/item_y.rb +31 -0
  84. data/lib/kredki/pads/label.rb +71 -0
  85. data/lib/kredki/pads/layer.rb +326 -0
  86. data/lib/kredki/pads/layout/align.rb +10 -0
  87. data/lib/kredki/pads/layout/layout.rb +88 -0
  88. data/lib/kredki/pads/layout/way.rb +99 -0
  89. data/lib/kredki/pads/layout/x_way.rb +119 -0
  90. data/lib/kredki/pads/layout/y_way.rb +120 -0
  91. data/lib/kredki/pads/list/item.rb +117 -0
  92. data/lib/kredki/pads/list/item_group.rb +36 -0
  93. data/lib/kredki/pads/list/pad.rb +74 -0
  94. data/lib/kredki/pads/list/tree/item.rb +138 -0
  95. data/lib/kredki/pads/list/tree/item_group.rb +86 -0
  96. data/lib/kredki/pads/list/tree/pad.rb +94 -0
  97. data/lib/kredki/pads/module.rb +11 -0
  98. data/lib/kredki/pads/note.rb +212 -0
  99. data/lib/kredki/pads/notes.rb +32 -0
  100. data/lib/kredki/pads/option/option.rb +121 -0
  101. data/lib/kredki/pads/option/option_item.rb +15 -0
  102. data/lib/kredki/pads/option/option_item_group.rb +16 -0
  103. data/lib/kredki/pads/option/option_layer.rb +81 -0
  104. data/lib/kredki/pads/pad/animation_pad.rb +106 -0
  105. data/lib/kredki/pads/pad/glyph_pad.rb +71 -0
  106. data/lib/kredki/pads/pad/pad.rb +1290 -0
  107. data/lib/kredki/pads/pad/pad_events.rb +358 -0
  108. data/lib/kredki/pads/pad/picture_pad.rb +89 -0
  109. data/lib/kredki/pads/pad/rectangle_pad.rb +181 -0
  110. data/lib/kredki/pads/pad/scroll_pad.rb +176 -0
  111. data/lib/kredki/pads/pad/shape_pad.rb +148 -0
  112. data/lib/kredki/pads/pad/space_pad.rb +33 -0
  113. data/lib/kredki/pads/pad/text_pad.rb +310 -0
  114. data/lib/kredki/pads/pane.rb +267 -0
  115. data/lib/kredki/pads/portal_layer.rb +94 -0
  116. data/lib/kredki/pads/radio/group.rb +45 -0
  117. data/lib/kredki/pads/radio/item.rb +69 -0
  118. data/lib/kredki/pads/radio/item_button.rb +143 -0
  119. data/lib/kredki/pads/service/event_queue.rb +79 -0
  120. data/lib/kredki/pads/service/service.rb +248 -0
  121. data/lib/kredki/pads/service/service_event_manager.rb +43 -0
  122. data/lib/kredki/pads/service/service_filter.rb +98 -0
  123. data/lib/kredki/pads/service/service_inherited.rb +48 -0
  124. data/lib/kredki/pads/setup.rb +36 -0
  125. data/lib/kredki/pads/slider/slider.rb +145 -0
  126. data/lib/kredki/pads/slider/slider_x.rb +41 -0
  127. data/lib/kredki/pads/slider/slider_y.rb +41 -0
  128. data/lib/kredki/pads/table/cell.rb +22 -0
  129. data/lib/kredki/pads/table/column.rb +63 -0
  130. data/lib/kredki/pads/table/column_layout.rb +88 -0
  131. data/lib/kredki/pads/table/pad.rb +116 -0
  132. data/lib/kredki/pads/table/row.rb +24 -0
  133. data/lib/kredki/pads/table/scroll_rows.rb +50 -0
  134. data/lib/kredki/pads/text/editable_text_verse.rb +77 -0
  135. data/lib/kredki/pads/text/editable_text_verses.rb +59 -0
  136. data/lib/kredki/pads/text/navigable_text_pad.rb +413 -0
  137. data/lib/kredki/pads/text/text_edition.rb +97 -0
  138. data/lib/kredki/pads/text/text_navigation.rb +109 -0
  139. data/lib/kredki/pads/toolbar/item.rb +62 -0
  140. data/lib/kredki/pads/toolbar/item_group.rb +22 -0
  141. data/lib/kredki/pads/toolbar/layer.rb +41 -0
  142. data/lib/kredki/pads/toolbar/pad.rb +51 -0
  143. data/lib/kredki/pads/toolbar/primary_layer.rb +64 -0
  144. data/lib/kredki/pads/window.rb +11 -0
  145. data/lib/kredki/script.rb +29 -0
  146. data/lib/kredki/setup.rb +2 -0
  147. data/lib/kredki/test.rb +35 -0
  148. data/lib/kredki.rb +10 -0
  149. data/lib/readme.md +31 -0
  150. data/stuff/config/config.rb +431 -0
  151. data/stuff/config/pads_config.rb +111 -0
  152. data/stuff/dll/SDL3.dll +0 -0
  153. data/stuff/dll/pastele.dll +0 -0
  154. data/stuff/dll/thorvg-1.dll +0 -0
  155. data/stuff/font/MartianMono-StdRg.ttf +0 -0
  156. data/stuff/font/MavenPro-Medium.ttf +0 -0
  157. data/stuff/font/MavenPro-Regular.ttf +0 -0
  158. data/stuff/glyph/alert-circle-svgrepo-com.svg +4 -0
  159. data/stuff/glyph/alert-triangle-svgrepo-com.svg +12 -0
  160. data/stuff/glyph/archivebox-svgrepo-com.svg +5 -0
  161. data/stuff/glyph/arrow-2-ccw-svgrepo-com.svg +5 -0
  162. data/stuff/glyph/arrow-2-cw-svgrepo-com.svg +5 -0
  163. data/stuff/glyph/arrow-2-rectangle-path-svgrepo-com.svg +5 -0
  164. data/stuff/glyph/arrow-4-way-svgrepo-com.svg +4 -0
  165. data/stuff/glyph/arrow-ccw-svgrepo-com.svg +4 -0
  166. data/stuff/glyph/arrow-circle-down-svgrepo-com.svg +4 -0
  167. data/stuff/glyph/arrow-circle-left-svgrepo-com.svg +4 -0
  168. data/stuff/glyph/arrow-circle-right-svgrepo-com.svg +4 -0
  169. data/stuff/glyph/arrow-circle-up-svgrepo-com.svg +4 -0
  170. data/stuff/glyph/arrow-cw-svgrepo-com.svg +4 -0
  171. data/stuff/glyph/arrow-down-svgrepo-com.svg +4 -0
  172. data/stuff/glyph/arrow-from-line-down-svgrepo-com.svg +5 -0
  173. data/stuff/glyph/arrow-from-line-left-svgrepo-com.svg +5 -0
  174. data/stuff/glyph/arrow-from-line-right-svgrepo-com.svg +5 -0
  175. data/stuff/glyph/arrow-from-line-up-svgrepo-com.svg +5 -0
  176. data/stuff/glyph/arrow-from-shape-right-svgrepo-com.svg +5 -0
  177. data/stuff/glyph/arrow-from-shape-up-svgrepo-com.svg +5 -0
  178. data/stuff/glyph/arrow-left-svgrepo-com.svg +4 -0
  179. data/stuff/glyph/arrow-right-arrow-left-svgrepo-com.svg +5 -0
  180. data/stuff/glyph/arrow-right-svgrepo-com.svg +4 -0
  181. data/stuff/glyph/arrow-shape-turn-left-svgrepo-com.svg +4 -0
  182. data/stuff/glyph/arrow-shape-turn-right-svgrepo-com.svg +4 -0
  183. data/stuff/glyph/arrow-small-down-svgrepo-com.svg +4 -0
  184. data/stuff/glyph/arrow-small-left-svgrepo-com.svg +4 -0
  185. data/stuff/glyph/arrow-small-right-svgrepo-com.svg +4 -0
  186. data/stuff/glyph/arrow-small-up-svgrepo-com.svg +4 -0
  187. data/stuff/glyph/arrow-thin-down-svgrepo-com.svg +4 -0
  188. data/stuff/glyph/arrow-thin-left-svgrepo-com.svg +4 -0
  189. data/stuff/glyph/arrow-thin-right-svgrepo-com.svg +4 -0
  190. data/stuff/glyph/arrow-thin-up-svgrepo-com.svg +4 -0
  191. data/stuff/glyph/arrow-to-line-down-svgrepo-com.svg +5 -0
  192. data/stuff/glyph/arrow-to-line-left-svgrepo-com.svg +5 -0
  193. data/stuff/glyph/arrow-to-line-right-svgrepo-com.svg +5 -0
  194. data/stuff/glyph/arrow-to-line-up-svgrepo-com.svg +5 -0
  195. data/stuff/glyph/arrow-to-shape-down-svgrepo-com.svg +5 -0
  196. data/stuff/glyph/arrow-to-shape-right-svgrepo-com.svg +5 -0
  197. data/stuff/glyph/arrow-trend-down-svgrepo-com.svg +12 -0
  198. data/stuff/glyph/arrow-trend-up-svgrepo-com.svg +12 -0
  199. data/stuff/glyph/arrow-turn-down-left-svgrepo-com.svg +4 -0
  200. data/stuff/glyph/arrow-turn-down-right-svgrepo-com.svg +4 -0
  201. data/stuff/glyph/arrow-turn-left-down-svgrepo-com.svg +4 -0
  202. data/stuff/glyph/arrow-turn-left-up-svgrepo-com.svg +4 -0
  203. data/stuff/glyph/arrow-turn-right-down-svgrepo-com.svg +4 -0
  204. data/stuff/glyph/arrow-turn-right-up-svgrepo-com.svg +4 -0
  205. data/stuff/glyph/arrow-turn-up-left-svgrepo-com.svg +4 -0
  206. data/stuff/glyph/arrow-turn-up-right-svgrepo-com.svg +4 -0
  207. data/stuff/glyph/arrow-up-arrow-down-svgrepo-com.svg +5 -0
  208. data/stuff/glyph/arrow-up-svgrepo-com.svg +4 -0
  209. data/stuff/glyph/at-sign-svgrepo-com.svg +4 -0
  210. data/stuff/glyph/bag-svgrepo-com.svg +4 -0
  211. data/stuff/glyph/bell-slash-svgrepo-com.svg +6 -0
  212. data/stuff/glyph/bell-svgrepo-com.svg +5 -0
  213. data/stuff/glyph/book-open-svgrepo-com.svg +5 -0
  214. data/stuff/glyph/bookmark-svgrepo-com.svg +4 -0
  215. data/stuff/glyph/box-svgrepo-com.svg +6 -0
  216. data/stuff/glyph/calendar-svgrepo-com.svg +5 -0
  217. data/stuff/glyph/camera-svgrepo-com.svg +4 -0
  218. data/stuff/glyph/caret-down-svgrepo-com.svg +4 -0
  219. data/stuff/glyph/caret-left-svgrepo-com.svg +4 -0
  220. data/stuff/glyph/caret-right-svgrepo-com.svg +4 -0
  221. data/stuff/glyph/caret-up-svgrepo-com.svg +4 -0
  222. data/stuff/glyph/cart-svgrepo-com.svg +6 -0
  223. data/stuff/glyph/chart-pie-svgrepo-com.svg +5 -0
  224. data/stuff/glyph/chartbar-2-svgrepo-com.svg +7 -0
  225. data/stuff/glyph/chartbar-svgrepo-com.svg +7 -0
  226. data/stuff/glyph/checkmark-circle-svgrepo-com.svg +4 -0
  227. data/stuff/glyph/checkmark-double-svgrepo-com.svg +5 -0
  228. data/stuff/glyph/checkmark-square-svgrepo-com.svg +4 -0
  229. data/stuff/glyph/checkmark-svgrepo-com.svg +4 -0
  230. data/stuff/glyph/chevron-down-svgrepo-com.svg +4 -0
  231. data/stuff/glyph/chevron-left-chevron-right-svgrepo-com.svg +5 -0
  232. data/stuff/glyph/chevron-left-svgrepo-com.svg +4 -0
  233. data/stuff/glyph/chevron-right-svgrepo-com.svg +4 -0
  234. data/stuff/glyph/chevron-small-down-svgrepo-com.svg +4 -0
  235. data/stuff/glyph/chevron-small-left-svgrepo-com.svg +4 -0
  236. data/stuff/glyph/chevron-small-right-svgrepo-com.svg +4 -0
  237. data/stuff/glyph/chevron-small-up-svgrepo-com.svg +4 -0
  238. data/stuff/glyph/chevron-up-chevron-down-svgrepo-com.svg +5 -0
  239. data/stuff/glyph/chevron-up-svgrepo-com.svg +4 -0
  240. data/stuff/glyph/clock-svgrepo-com.svg +4 -0
  241. data/stuff/glyph/cloud-arrow-up-svgrepo-com.svg +4 -0
  242. data/stuff/glyph/cloud-download-svgrepo-com.svg +4 -0
  243. data/stuff/glyph/cloud-slash-svgrepo-com.svg +5 -0
  244. data/stuff/glyph/cloud-svgrepo-com.svg +4 -0
  245. data/stuff/glyph/columns-svgrepo-com.svg +5 -0
  246. data/stuff/glyph/command-svgrepo-com.svg +4 -0
  247. data/stuff/glyph/compass-svgrepo-com.svg +5 -0
  248. data/stuff/glyph/credit-card-svgrepo-com.svg +5 -0
  249. data/stuff/glyph/crop-svgrepo-com.svg +5 -0
  250. data/stuff/glyph/crown-svgrepo-com.svg +4 -0
  251. data/stuff/glyph/delete-left-svgrepo-com.svg +4 -0
  252. data/stuff/glyph/device-desktop-svgrepo-com.svg +4 -0
  253. data/stuff/glyph/device-mobile-svgrepo-com.svg +4 -0
  254. data/stuff/glyph/device-tablet-svgrepo-com.svg +4 -0
  255. data/stuff/glyph/doc-svgrepo-com.svg +5 -0
  256. data/stuff/glyph/dot-small-svgrepo-com.svg +4 -0
  257. data/stuff/glyph/dots-3-horizontal-svgrepo-com.svg +6 -0
  258. data/stuff/glyph/dots-3-vertical-svgrepo-com.svg +6 -0
  259. data/stuff/glyph/dots-6-horizontal-svgrepo-com.svg +9 -0
  260. data/stuff/glyph/dots-6-vertical-svgrepo-com.svg +9 -0
  261. data/stuff/glyph/dots-9-svgrepo-com.svg +12 -0
  262. data/stuff/glyph/emoji-frown-svgrepo-com.svg +4 -0
  263. data/stuff/glyph/emoji-meh-svgrepo-com.svg +4 -0
  264. data/stuff/glyph/emoji-smile-svgrepo-com.svg +4 -0
  265. data/stuff/glyph/envelope-svgrepo-com.svg +5 -0
  266. data/stuff/glyph/external-link-svgrepo-com.svg +5 -0
  267. data/stuff/glyph/eye-slash-svgrepo-com.svg +15 -0
  268. data/stuff/glyph/eye-svgrepo-com.svg +4 -0
  269. data/stuff/glyph/filter-svgrepo-com.svg +4 -0
  270. data/stuff/glyph/flame-svgrepo-com.svg +4 -0
  271. data/stuff/glyph/floppy-disk-svgrepo-com.svg +4 -0
  272. data/stuff/glyph/folder-svgrepo-com.svg +4 -0
  273. data/stuff/glyph/fullscreen-alt-svgrepo-com.svg +7 -0
  274. data/stuff/glyph/fullscreen-exit-alt-svgrepo-com.svg +7 -0
  275. data/stuff/glyph/fullscreen-exit-svgrepo-com.svg +5 -0
  276. data/stuff/glyph/fullscreen-svgrepo-com.svg +5 -0
  277. data/stuff/glyph/gear-svgrepo-com.svg +4 -0
  278. data/stuff/glyph/giftbox-svgrepo-com.svg +6 -0
  279. data/stuff/glyph/half-star-svgrepo-com.svg +4 -0
  280. data/stuff/glyph/hashtag-svgrepo-com.svg +4 -0
  281. data/stuff/glyph/headphones-svgrepo-com.svg +4 -0
  282. data/stuff/glyph/heart-half-svgrepo-com.svg +4 -0
  283. data/stuff/glyph/heart-svgrepo-com.svg +4 -0
  284. data/stuff/glyph/house-svgrepo-com.svg +4 -0
  285. data/stuff/glyph/image-svgrepo-com.svg +4 -0
  286. data/stuff/glyph/info-circle-svgrepo-com.svg +4 -0
  287. data/stuff/glyph/key-svgrepo-com.svg +4 -0
  288. data/stuff/glyph/layers-3-svgrepo-com.svg +6 -0
  289. data/stuff/glyph/layout-svgrepo-com.svg +6 -0
  290. data/stuff/glyph/line-3-svgrepo-com.svg +6 -0
  291. data/stuff/glyph/link-alt-svgrepo-com.svg +5 -0
  292. data/stuff/glyph/link-svgrepo-com.svg +6 -0
  293. data/stuff/glyph/list-bullet-svgrepo-com.svg +9 -0
  294. data/stuff/glyph/location-svgrepo-com.svg +4 -0
  295. data/stuff/glyph/lock-open-svgrepo-com.svg +4 -0
  296. data/stuff/glyph/lock-svgrepo-com.svg +4 -0
  297. data/stuff/glyph/map-pin-svgrepo-com.svg +4 -0
  298. data/stuff/glyph/medal-svgrepo-com.svg +13 -0
  299. data/stuff/glyph/media-backward-end-svgrepo-com.svg +5 -0
  300. data/stuff/glyph/media-backward-svgrepo-com.svg +5 -0
  301. data/stuff/glyph/media-forward-end-svgrepo-com.svg +5 -0
  302. data/stuff/glyph/media-forward-svgrepo-com.svg +4 -0
  303. data/stuff/glyph/media-pause-circle-svgrepo-com.svg +4 -0
  304. data/stuff/glyph/media-pause-svgrepo-com.svg +5 -0
  305. data/stuff/glyph/media-play-circle-svgrepo-com.svg +4 -0
  306. data/stuff/glyph/media-play-svgrepo-com.svg +4 -0
  307. data/stuff/glyph/media-stop-circle-svgrepo-com.svg +4 -0
  308. data/stuff/glyph/media-stop-svgrepo-com.svg +4 -0
  309. data/stuff/glyph/message-bubble-2-svgrepo-com.svg +4 -0
  310. data/stuff/glyph/message-bubble-svgrepo-com.svg +4 -0
  311. data/stuff/glyph/mic-slash-svgrepo-com.svg +6 -0
  312. data/stuff/glyph/mic-svgrepo-com.svg +5 -0
  313. data/stuff/glyph/minus-circle-svgrepo-com.svg +4 -0
  314. data/stuff/glyph/minus-square-svgrepo-com.svg +4 -0
  315. data/stuff/glyph/minus-svgrepo-com.svg +4 -0
  316. data/stuff/glyph/moon-svgrepo-com.svg +4 -0
  317. data/stuff/glyph/music-note-svgrepo-com.svg +4 -0
  318. data/stuff/glyph/nosign-svgrepo-com.svg +4 -0
  319. data/stuff/glyph/paper-clip-svgrepo-com.svg +4 -0
  320. data/stuff/glyph/paper-plane-svgrepo-com.svg +4 -0
  321. data/stuff/glyph/pen-tool-svgrepo-com.svg +4 -0
  322. data/stuff/glyph/pencil-svgrepo-com.svg +5 -0
  323. data/stuff/glyph/percent-svgrepo-com.svg +6 -0
  324. data/stuff/glyph/phone-incoming-svgrepo-com.svg +5 -0
  325. data/stuff/glyph/phone-missed-svgrepo-com.svg +4 -0
  326. data/stuff/glyph/phone-outgoing-svgrepo-com.svg +5 -0
  327. data/stuff/glyph/phone-slash-svgrepo-com.svg +4 -0
  328. data/stuff/glyph/phone-svgrepo-com.svg +4 -0
  329. data/stuff/glyph/plus-circle-svgrepo-com.svg +4 -0
  330. data/stuff/glyph/plus-square-svgrepo-com.svg +4 -0
  331. data/stuff/glyph/plus-svgrepo-com.svg +4 -0
  332. data/stuff/glyph/power-svgrepo-com.svg +5 -0
  333. data/stuff/glyph/printer-svgrepo-com.svg +5 -0
  334. data/stuff/glyph/question-circle-svgrepo-com.svg +4 -0
  335. data/stuff/glyph/scissors-svgrepo-com.svg +5 -0
  336. data/stuff/glyph/search-svgrepo-com.svg +4 -0
  337. data/stuff/glyph/server-svgrepo-com.svg +5 -0
  338. data/stuff/glyph/shape-circle-svgrepo-com.svg +4 -0
  339. data/stuff/glyph/shape-rhombus-svgrepo-com.svg +4 -0
  340. data/stuff/glyph/shape-square-svgrepo-com.svg +4 -0
  341. data/stuff/glyph/shape-triangle-svgrepo-com.svg +12 -0
  342. data/stuff/glyph/share-svgrepo-com.svg +4 -0
  343. data/stuff/glyph/shield-slash-svgrepo-com.svg +13 -0
  344. data/stuff/glyph/shield-svgrepo-com.svg +4 -0
  345. data/stuff/glyph/shippingbox-svgrepo-com.svg +7 -0
  346. data/stuff/glyph/slider-3-horizontal-svgrepo-com.svg +9 -0
  347. data/stuff/glyph/slider-3-vertical-svgrepo-com.svg +9 -0
  348. data/stuff/glyph/speaker-svgrepo-com.svg +4 -0
  349. data/stuff/glyph/speaker-wave-1-svgrepo-com.svg +5 -0
  350. data/stuff/glyph/speaker-wave-2-svgrepo-com.svg +6 -0
  351. data/stuff/glyph/speaker-xmark-svgrepo-com.svg +5 -0
  352. data/stuff/glyph/square-4-grid-svgrepo-com.svg +7 -0
  353. data/stuff/glyph/square-on-square-svgrepo-com.svg +5 -0
  354. data/stuff/glyph/star-svgrepo-com.svg +4 -0
  355. data/stuff/glyph/sun-svgrepo-com.svg +12 -0
  356. data/stuff/glyph/tag-svgrepo-com.svg +4 -0
  357. data/stuff/glyph/text-align-center-svgrepo-com.svg +7 -0
  358. data/stuff/glyph/text-align-justify-svgrepo-com.svg +7 -0
  359. data/stuff/glyph/text-align-left-svgrepo-com.svg +7 -0
  360. data/stuff/glyph/text-align-right-svgrepo-com.svg +7 -0
  361. data/stuff/glyph/text-bold-svgrepo-com.svg +4 -0
  362. data/stuff/glyph/text-heading-svgrepo-com.svg +4 -0
  363. data/stuff/glyph/text-italic-svgrepo-com.svg +4 -0
  364. data/stuff/glyph/text-svgrepo-com.svg +4 -0
  365. data/stuff/glyph/text-underline-svgrepo-com.svg +5 -0
  366. data/stuff/glyph/thumbs-down-svgrepo-com.svg +5 -0
  367. data/stuff/glyph/thumbs-up-svgrepo-com.svg +5 -0
  368. data/stuff/glyph/trash-svgrepo-com.svg +5 -0
  369. data/stuff/glyph/tray-svgrepo-com.svg +4 -0
  370. data/stuff/glyph/umbrela-svgrepo-com.svg +4 -0
  371. data/stuff/glyph/user-svgrepo-com.svg +5 -0
  372. data/stuff/glyph/users-svgrepo-com.svg +7 -0
  373. data/stuff/glyph/video-svgrepo-com.svg +12 -0
  374. data/stuff/glyph/waveform-ecg-svgrepo-com.svg +4 -0
  375. data/stuff/glyph/wi-fi-svgrepo-com.svg +7 -0
  376. data/stuff/glyph/xmark-circle-svgrepo-com.svg +4 -0
  377. data/stuff/glyph/xmark-small-svgrepo-com.svg +4 -0
  378. data/stuff/glyph/xmark-svgrepo-com.svg +4 -0
  379. data/stuff/glyph/zap-svgrepo-com.svg +4 -0
  380. data/stuff/glyph/zoom-in-svgrepo-com.svg +5 -0
  381. data/stuff/glyph/zoom-out-svgrepo-com.svg +5 -0
  382. data/stuff/readme.md +266 -0
  383. data/stuff/so/libSDL3.so +0 -0
  384. data/stuff/so/libpastele.so +0 -0
  385. data/stuff/so/libthorvg-1.so +0 -0
  386. metadata +427 -0
@@ -0,0 +1,248 @@
1
+ require 'weakref'
2
+ require_relative 'service_event_manager'
3
+ require_relative 'service_inherited'
4
+ require_relative 'service_filter'
5
+
6
+ module Kredki
7
+ module Pads
8
+ # Base class of Pads tree nodes.
9
+ class Service
10
+ extend ServiceInherited
11
+ include ServiceFilter
12
+
13
+ # Get lower services.
14
+ def lower_iterator include_self = true
15
+ Enumerator.new do |e|
16
+ c = include_self ? self : lower
17
+ while c && !c.is(Pane)
18
+ e << c
19
+ c = c.lower
20
+ end
21
+ end
22
+ end
23
+
24
+ # Get service layer.
25
+ def layer
26
+ is Layer or find_lower Layer
27
+ end
28
+
29
+ # Get service pane.
30
+ def pane
31
+ layer&.lower_pad
32
+ end
33
+
34
+ # Get service window.
35
+ def window
36
+ pane&.window
37
+ end
38
+
39
+ # Get service application.
40
+ def app
41
+ window&.app
42
+ end
43
+
44
+ # Get whether +lower+ is lower service of +self+.
45
+ def in? lower
46
+ lower_iterator(false).include? lower
47
+ end
48
+
49
+ # Get whether +upper+ is upper service of +self+.
50
+ def include? upper
51
+ upper.in? self
52
+ end
53
+
54
+ # Get lower service.
55
+ def lower
56
+ @lower
57
+ end
58
+
59
+ # Attach self to +lower+ service.
60
+ def attach lower, at: nil
61
+ raise "service loop detected" if find_lower self
62
+ detach true if @lower
63
+ lower&.put_service self, at: at
64
+ end
65
+
66
+ # Detach self.
67
+ def detach transfer = false
68
+ @lower&.delete_upper self
69
+ @lower = nil
70
+ end
71
+
72
+ def on event_type, early: false, always: false, do: nil, &block
73
+ @event_manager.manager event_type, block || binding.local_variable_get(:do), early, always
74
+ end
75
+
76
+ # Match self with +filter+.
77
+ def =~ filter
78
+ case filter
79
+ when nil
80
+ true
81
+ when Symbol
82
+ if filter.end_with? "?"
83
+ respond_to? filter and send filter
84
+ else
85
+ !!@tags[filter]
86
+ end
87
+ when Service
88
+ filter == self
89
+ when Module, Proc
90
+ filter === self
91
+ when Integer
92
+ pad_index == filter
93
+ when WeakRef
94
+ self =~ filter.__getobj__
95
+ when Array
96
+ filter.all?{|it| self =~ it }
97
+ when Hash
98
+ filter.all?{|key, value| respond_to? key and value === send(key) }
99
+ else
100
+ raise "Unsupported =~ (#{filter} : #{filter.class})"
101
+ end
102
+ end
103
+
104
+ # Set whether Pad is tagged with +tag+.
105
+ def set_tag tag, value = true
106
+ return if (c = self.tag tag) == (value = block_given? ? yield(c) : value == Not ? !c : value)
107
+ if value
108
+ @tags[tag] = true
109
+ else
110
+ @tags.delete tag
111
+ end
112
+ true
113
+ end
114
+
115
+ # See #set_tag.
116
+ def tag= param
117
+ send_bundle :set_tag, param
118
+ end
119
+
120
+ # Get whether Pad is tagged with +tag+.
121
+ def tag tag
122
+ @tags[tag]
123
+ end
124
+
125
+ # Get tags.
126
+ def tags
127
+ @tags.keys
128
+ end
129
+
130
+ # Create new job tree.
131
+ def job run = true, &block
132
+ job = AfterJob.new block, 0
133
+ job.run pane if run
134
+ job
135
+ end
136
+
137
+ # Set a feature recognized by its class.
138
+ def << feature
139
+ case feature
140
+ when Symbol
141
+ set_tag feature
142
+ # eval "#{feature} = WeakRef.new self" if feature.start_with? "$"
143
+ # lower&.instance_variable_set feature, self if feature.start_with? "@"
144
+ when Hash
145
+ set **feature
146
+ when Array
147
+ set *feature
148
+ when Proc
149
+ set &feature
150
+ else
151
+ raise "Unsupported << (#{feature} : #{feature.class})"
152
+ end
153
+ self
154
+ end
155
+
156
+ # :section: LEVEL 2
157
+
158
+ def initialize
159
+ super
160
+ @lower = nil
161
+ @tags = {}
162
+ @services = []
163
+ @event_manager = ServiceEventManager.new
164
+ end
165
+
166
+ def sketch_service
167
+ sketch
168
+ end
169
+
170
+ def sketch
171
+ end
172
+
173
+ def inspect
174
+ "#{self.class}:#{object_id}"
175
+ end
176
+
177
+ attr :services
178
+ attr :event_manager
179
+
180
+ def service_tree
181
+ @services.map{|it| [it, it.service_tree] }.to_h
182
+ end
183
+
184
+ def put service_class, *a, at: nil, **ka, &b
185
+ service = service_class.new
186
+ put_service service, at: at if at != false
187
+ service.sketch_service
188
+ service.set *a, **ka, &b
189
+ service
190
+ end
191
+
192
+ def put_service service, at: nil
193
+ service.update_lower self, at
194
+ case at
195
+ when Integer
196
+ @services.insert at, service
197
+ when Pad
198
+ @services.insert @services.index(at), service
199
+ else
200
+ @services << service
201
+ end
202
+ service
203
+ end
204
+
205
+ def service_index service
206
+ @services.index service
207
+ end
208
+
209
+ def delete_upper upper
210
+ @services.delete upper
211
+ end
212
+
213
+ def update_lower lower, at = nil
214
+ different_lower = @lower != lower
215
+ if different_lower
216
+ @lower = lower
217
+ c_set_lower at
218
+ end
219
+ different_lower
220
+ end
221
+
222
+ def c_set_lower at
223
+ @services.each{|it| it.update_lower self }
224
+ end
225
+
226
+ def lower_pad_detached
227
+ @services.each{ _1.lower_pad_detached }
228
+ end
229
+
230
+ def report event, path = false, instant = false
231
+ event.target ||= self
232
+ event_queue = pane&.event_queue
233
+ return unless event_queue
234
+ if path
235
+ path.each do |it|
236
+ event_queue.push event, it.event_manager, true, instant
237
+ end
238
+ path.reverse_each do |it|
239
+ event_queue.push event, it.event_manager, false, instant
240
+ end
241
+ else
242
+ event_queue.push event, @event_manager, true, instant
243
+ event_queue.push event, @event_manager, false, instant
244
+ end
245
+ end
246
+ end
247
+ end
248
+ end
@@ -0,0 +1,43 @@
1
+ module Kredki
2
+ # Event manager for Service.
3
+ class ServiceEventManager
4
+
5
+ # :section: LEVEL 2
6
+
7
+ def initialize
8
+ @managers = {
9
+ true => {},
10
+ false => {},
11
+ }
12
+ end
13
+
14
+ def manager event_class, block, early, always
15
+ manager = (@managers[early][event_class] ||= EventManager.new)
16
+ block ? manager.attach(block, always:) : manager
17
+ end
18
+
19
+ def keyboard_manager event_class, keycodes, block, early, always
20
+ manager = (@managers[early][event_class] ||= KeyboardEventManager.new)[*keycodes]
21
+ block ? manager.attach(block, always:) : manager
22
+ end
23
+
24
+ def mouse_manager event_class, indexes, block, early, always
25
+ manager = (@managers[early][event_class] ||= MouseEventManager.new)[*indexes]
26
+ block ? manager.attach(block, always:) : manager
27
+ end
28
+
29
+ def joystick_manager event_class, joystick, indexes, block, early, always
30
+ manager = (@managers[early][event_class] ||= JoystickEventManager.new)[joystick, indexes]
31
+ block ? manager.attach(block, always:) : manager
32
+ end
33
+
34
+ def report event, early
35
+ cl = event.class
36
+ manager = @managers[early]
37
+ while cl != Object
38
+ manager[cl]&.report event
39
+ cl = cl.superclass
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,98 @@
1
+ module Kredki
2
+ module Pads
3
+ # Module to include in service containers.
4
+ module ServiceFilter
5
+
6
+ def respond_to? name, include_all = false
7
+ name.end_with? "?" or super
8
+ end
9
+
10
+ def method_missing name, ...
11
+ if name.end_with? "?"
12
+ find_upper(name.to_s.tr("?", "!").to_sym, ...)
13
+ else
14
+ super
15
+ end
16
+ end
17
+
18
+ # Get self if it matches filters.
19
+ def is *filters, **ka, &block
20
+ return self if self =~ [*filters, ka, block]
21
+ end
22
+
23
+ # Find direct upper service matching filters.
24
+ def find *filters, last: false, **ka, &block
25
+ each(*filters, **ka, reverse: last, &block).first
26
+ end
27
+
28
+ # Find upper service matching filters.
29
+ def find_upper *filters, last: false, **ka, &block
30
+ each_upper(*filters, **ka, reverse: last, &block).first
31
+ end
32
+
33
+ # Find lower service matching filters.
34
+ def find_lower *filters, last: false, **ka, &block
35
+ each_lower(*filters, **ka, reverse: last, &block).first
36
+ end
37
+
38
+ # Get each direct lower service matching filters.
39
+ def each *filters, reverse: false, **ka, &block
40
+ upper_iterator deep: false, reverse:, filter: [*filters, ka, block]
41
+ end
42
+
43
+ # Get each lower service matching filters.
44
+ def each_lower *filters, reverse: false, **ka, &block
45
+ lower_iterator(false).then{|it| reverse ? it.reverse_each : it }.filter{|it| it =~ [*filters, ka, block] }
46
+ end
47
+
48
+ # Get each upper service matching filters.
49
+ def each_upper *filters, reverse: false, **ka, &block
50
+ upper_iterator deep: true, reverse:, filter: [*filters, ka, block]
51
+ end
52
+
53
+ # Get upper services iterator.
54
+ def upper_iterator enum = nil, reverse: false, deep: true, filter: nil
55
+ if enum
56
+ method = reverse ? :reverse_each : :each
57
+ case deep
58
+ when false
59
+ @services.send(method){|it| enum << it if it =~ filter }
60
+ when :first
61
+ @services.send method do |it|
62
+ enum << it if it =~ filter
63
+ it.upper_iterator enum, reverse:, deep:, filter: ;
64
+ end
65
+ else
66
+ @services.send(method){|it| enum << it if it =~ filter }
67
+ @services.send(method){|it| it.upper_iterator enum, reverse:, deep:, filter: }
68
+ end
69
+ enum
70
+ else
71
+ Enumerator.new{|enum| upper_iterator enum, reverse:, deep:, filter: }
72
+ end
73
+ end
74
+
75
+ # Iterate over pad descedants.
76
+ def upper_pad_iterator enum = nil, reverse: false, deep: true
77
+ if enum
78
+ method = reverse ? :reverse_each : :each
79
+ case deep
80
+ when false
81
+ @pads.send(method){ enum << _1 }
82
+ when :first
83
+ @pads.send method do
84
+ enum << _1
85
+ _1.upper_pad_iterator enum, reverse:, deep:;
86
+ end
87
+ else
88
+ @pads.send(method){ enum << _1 }
89
+ @pads.send(method){ _1.upper_pad_iterator enum, reverse:, deep: }
90
+ end
91
+ enum
92
+ else
93
+ Enumerator.new{|enum| upper_pad_iterator enum, reverse:, deep: }
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,48 @@
1
+ module Kredki
2
+ module Pads
3
+ # Module extended in Kredki::Pads::Service and all inherited classes.
4
+ module ServiceInherited
5
+ def self.extended cl
6
+ cl.define_singleton_method :inherited do |cl1|
7
+ cl1.extend ServiceInherited
8
+ end
9
+ end
10
+
11
+ def method_missing name, ...
12
+ if name.end_with? "!"
13
+ define(name, ...)
14
+ else
15
+ super
16
+ end
17
+ end
18
+
19
+ def respond_to? name, all = false
20
+ name.end_with? "!" or super
21
+ end
22
+
23
+ # Define method.
24
+ def define name, klass = nil, &block
25
+ case klass
26
+ when Class
27
+ class_eval <<~xx
28
+ def #{name} ...
29
+ put(#{klass}, :#{name}, ...)
30
+ end
31
+ xx
32
+ when nil
33
+ if block.parameters.empty?
34
+ define_method name do |*a, **ka, &b|
35
+ instance_exec(&block).set *a, **ka, &b
36
+ end
37
+ else
38
+ define_method name do |*a, **ka, &b|
39
+ instance_exec(*a, **ka, &block).set &b
40
+ end
41
+ end
42
+ else raise_ia klass
43
+ end
44
+ end
45
+
46
+ end#ServiceInherited
47
+ end#Pads
48
+ end#Kredki
@@ -0,0 +1,36 @@
1
+ require_relative 'service/service_inherited'
2
+ require_relative "layout/layout"
3
+
4
+ module Kredki
5
+ module Pads
6
+
7
+ class << self
8
+ attr_accessor :layout_map
9
+
10
+ def layout! id, layout
11
+ @layout_map[id] = layout
12
+ end
13
+
14
+ def layout param = nil
15
+ case param
16
+ in Layout
17
+ param
18
+ else
19
+ @layout_map[param] or raise "Unknown layout '#{param}'"
20
+ end
21
+ end
22
+
23
+ attr_accessor :config
24
+ end
25
+
26
+ self.layout_map = {}
27
+ self.config = "#{Kredki.dir}/stuff/config/pads_config.rb"
28
+
29
+ Auto = :auto
30
+ Fit = :fit
31
+ Ratio = :ratio
32
+ Start = :start
33
+ Center = :center
34
+ End = :end
35
+ end
36
+ end
@@ -0,0 +1,145 @@
1
+ module Kredki
2
+ module Pads
3
+ # A base class for controls that allows you to set a value by dragging a handle.
4
+ class Slider < RectanglePad
5
+
6
+ class EditEvent < Event
7
+ def initialize value, ...
8
+ super(...)
9
+ @value = value
10
+ end
11
+
12
+ def value
13
+ @value
14
+ end
15
+
16
+ def param
17
+ value
18
+ end
19
+ end
20
+
21
+ # Set value.
22
+ def set_value value = @value
23
+ return send_bundle :set_value, yield(self.value) if block_given?
24
+ return if @value == value
25
+ @value = value
26
+ layer&.break_layout
27
+ end
28
+
29
+ # See #set_value.
30
+ def value= param
31
+ send_bundle :set_value, param
32
+ end
33
+
34
+ # Get value.
35
+ def value
36
+ @value
37
+ end
38
+
39
+ # Set suit.
40
+ def set_suit *suit
41
+ return send_bundle :set_suit, yield(self.suit) if block_given?
42
+ suit = Util.uncover suit
43
+ return if @suit == suit && suit != :random
44
+ @suit = suit
45
+ repaint
46
+ true
47
+ end
48
+
49
+ # See #set_suit.
50
+ def suit= param
51
+ send_bundle :set_suit, param
52
+ end
53
+
54
+ # Get suit.
55
+ def suit
56
+ @suit
57
+ end
58
+
59
+ # Create and attach edit event reaction.
60
+ def on_edit ...
61
+ on(EditEvent, ...)
62
+ end
63
+
64
+ # See #on_edit.
65
+ def on_edit= param
66
+ on_edit do: param
67
+ end
68
+
69
+ # :section: LEVEL 2
70
+
71
+ def initialize
72
+ super
73
+
74
+ @value = 0.0
75
+ @c0 = 0
76
+ @handle = put RectanglePad, fill: :gray
77
+ end
78
+
79
+ attr :handle
80
+
81
+ def sketch
82
+ super
83
+
84
+ set_suit :gray
85
+ end
86
+
87
+ def presence
88
+ super
89
+
90
+ Event.each(
91
+ on_mouse_press,
92
+ on_mouse_release,
93
+ on_mouse_enter,
94
+ on_mouse_leave,
95
+ do: method(:repaint)
96
+ )
97
+ end
98
+
99
+ def repaint event = nil
100
+ color = Kredki.color @suit
101
+
102
+ if in_disabled
103
+ set_opacity 3/4r
104
+ handle.area.set_fill color.darken
105
+ else
106
+ set_opacity 1r
107
+ handle.area.set_fill mouse_in ? color.lighten : color.darken
108
+ end
109
+ end
110
+
111
+ def behavior
112
+ super
113
+
114
+ on_mouse_scroll do |e|
115
+ v, y = Kredki.relative_scroll *e.xy
116
+ v = y if v.abs < y.abs
117
+ jump = 0.1
118
+ v = (@value - jump * v).clamp(0..1)
119
+ report EditEvent.new(v, e)
120
+ e.close
121
+ end
122
+
123
+ on_mouse_move do |e|
124
+ if e.drag?
125
+ process_drag e
126
+ e.close
127
+ end
128
+ end
129
+
130
+ on_edit early: true do |e|
131
+ e.close if in_disabled
132
+ end
133
+
134
+ on_edit do |e|
135
+ set_value e.value
136
+ end
137
+
138
+ @handle.on_mouse_press do |e|
139
+ @handle.start_drag e.xy, e.button.id
140
+ e.close
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,41 @@
1
+ module Kredki
2
+ module Pads
3
+ # A control that allows you to set a value by dragging a handle in X axis.
4
+ class SliderX < Slider
5
+
6
+ # :section: LEVEL 2
7
+
8
+ def process_drag e, speed = 1
9
+ hsx = @handle.area_size_x
10
+ max_x = area_size_x - hsx
11
+ @c0 = @handle.area_x if e.start?
12
+ start_x = layer.pin_xy[0]
13
+ x = [[0, @c0 + (e.x - start_x) * speed].max, max_x].min
14
+ report EditEvent.new(1.0 * x / max_x, e) if max_x > 0
15
+ end
16
+
17
+ def sketch
18
+ super
19
+
20
+ set_size_y 10
21
+ end
22
+
23
+ def behavior
24
+ super
25
+
26
+ on_mouse_press :primary do |e|
27
+ @handle.start_drag @handle.translate(@handle.area_size_x * 0.5, 0), :primary
28
+ e.close
29
+ end
30
+ end
31
+
32
+ def arrange request_size_x = nil
33
+ csx = clip_size_x
34
+ request_size_x ||= 3 * csx
35
+ size_x = (csx.to_f / request_size_x * csx).clamp 20, [csx - 20, 20].max
36
+ @handle.update_size size_x, area_size_y
37
+ @handle.update_xy ((csx - size_x) * @value.to_f.then{|it| it.nan? ? 0 : it.clamp(0..1) }).ceil, 0
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,41 @@
1
+ module Kredki
2
+ module Pads
3
+ # A control that allows you to set a value by dragging a handle in Y axis.
4
+ class SliderY < Slider
5
+
6
+ # :section: LEVEL 2
7
+
8
+ def process_drag e, speed = 1
9
+ hsy = @handle.area_size_y
10
+ max_y = area_size_y - hsy
11
+ @c0 = @handle.area_y if e.start?
12
+ start_y = layer.pin_xy[1]
13
+ y = [[0, @c0 + (e.y - start_y) * speed].max, max_y].min
14
+ report EditEvent.new(1.0 * y / max_y, e) if max_y > 0
15
+ end
16
+
17
+ def sketch
18
+ super
19
+
20
+ set_size_x 10
21
+ end
22
+
23
+ def behavior
24
+ super
25
+
26
+ on_mouse_press :primary do |e|
27
+ @handle.start_drag @handle.translate(0, @handle.area_size_x * 0.5), :primary
28
+ e.close
29
+ end
30
+ end
31
+
32
+ def arrange request_size_y = nil
33
+ csy = clip_size_y
34
+ request_size_y ||= 3 * csy
35
+ size_y = (csy.to_f / request_size_y * csy).clamp 20, [csy - 20, 20].max
36
+ @handle.update_size area_size_x, size_y
37
+ @handle.update_xy 0, ((csy - size_y) * @value.to_f.then{|it| it.nan? ? 0 : it.clamp(0..1) }).ceil
38
+ end
39
+ end
40
+ end
41
+ end