hokusai-zero 0.2.6.pre.pinephone6 → 0.2.6

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/Gemfile.lock +2 -0
  4. data/README.md +1 -1
  5. data/ast/src/core/input.h +1 -0
  6. data/ast/src/core/util.c +23 -23
  7. data/ast/src/core/util.h +7 -7
  8. data/ext/extconf.rb +3 -3
  9. data/hokusai.gemspec +2 -1
  10. data/ui/examples/counter.rb +1 -2
  11. data/ui/examples/forum/file.rb +1 -1
  12. data/ui/examples/forum/post.rb +1 -0
  13. data/ui/examples/forum.rb +7 -7
  14. data/ui/examples/spreadsheet.rb +0 -1
  15. data/ui/examples/tic_tac_toe.rb +6 -6
  16. data/ui/lib/lib_hokusai.rb +24 -25
  17. data/ui/spec/spec_helper.rb +1 -1
  18. data/ui/src/hokusai/assets/chevron-down.svg +1 -0
  19. data/ui/src/hokusai/automation/driver_commands/base.rb +8 -2
  20. data/ui/src/hokusai/automation/driver_commands/trigger_keyboard.rb +6 -3
  21. data/ui/src/hokusai/automation/driver_commands/trigger_mouse.rb +5 -12
  22. data/ui/src/hokusai/automation/server.rb +3 -2
  23. data/ui/src/hokusai/backends/raylib/config.rb +1 -2
  24. data/ui/src/hokusai/backends/raylib/font.rb +3 -24
  25. data/ui/src/hokusai/backends/raylib.rb +36 -167
  26. data/ui/src/hokusai/backends/sdl2/config.rb +6 -9
  27. data/ui/src/hokusai/backends/sdl2/font.rb +1 -3
  28. data/ui/src/hokusai/backends/sdl2.rb +93 -188
  29. data/ui/src/hokusai/blocks/input.rb +2 -2
  30. data/ui/src/hokusai/commands/rect.rb +3 -12
  31. data/ui/src/hokusai/commands.rb +0 -22
  32. data/ui/src/hokusai/event.rb +1 -2
  33. data/ui/src/hokusai/events/keyboard.rb +18 -11
  34. data/ui/src/hokusai/events/mouse.rb +8 -10
  35. data/ui/src/hokusai/mounting/loop_entry.rb +1 -1
  36. data/ui/src/hokusai/painter.rb +8 -31
  37. data/ui/src/hokusai/types.rb +244 -20
  38. data/ui/src/hokusai.rb +35 -61
  39. data/xmake.lua +1 -1
  40. metadata +22 -32
  41. data/ui/examples/drag.rb +0 -154
  42. data/ui/examples/embedded.rb +0 -58
  43. data/ui/examples/game.rb +0 -143
  44. data/ui/examples/keyboard.rb +0 -47
  45. data/ui/examples/overlay.rb +0 -233
  46. data/ui/examples/provider.rb +0 -56
  47. data/ui/examples/shader/test.rb +0 -155
  48. data/ui/examples/shader.rb +0 -100
  49. data/ui/examples/wiki.rb +0 -82
  50. data/ui/spec/hokusai/e2e/keyboard_spec.rb +0 -52
  51. data/ui/src/hokusai/assets/arrow-down-line.png +0 -0
  52. data/ui/src/hokusai/assets/arrow-down-wide-line.png +0 -0
  53. data/ui/src/hokusai/assets/icons/outline/arrow-big-up.svg +0 -19
  54. data/ui/src/hokusai/assets/icons/outline/backspace.svg +0 -20
  55. data/ui/src/hokusai/blocks/color_picker.rb +0 -1080
  56. data/ui/src/hokusai/blocks/keyboard.rb +0 -249
  57. data/ui/src/hokusai/blocks/shader_begin.rb +0 -22
  58. data/ui/src/hokusai/blocks/shader_end.rb +0 -12
  59. data/ui/src/hokusai/blocks/slider.rb +0 -139
  60. data/ui/src/hokusai/blocks/texture.rb +0 -23
  61. data/ui/src/hokusai/commands/shader.rb +0 -33
  62. data/ui/src/hokusai/commands/texture.rb +0 -26
  63. data/ui/src/hokusai/events/touch.rb +0 -62
  64. data/ui/src/hokusai/types/display.rb +0 -151
  65. data/ui/src/hokusai/types/keyboard.rb +0 -168
  66. data/ui/src/hokusai/types/mouse.rb +0 -36
  67. data/ui/src/hokusai/types/primitives.rb +0 -56
  68. data/ui/src/hokusai/types/touch.rb +0 -181
  69. data/ui/src/hokusai/util/wrap_stream.rb +0 -193
@@ -1,249 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Hokusai::Blocks
4
- class Key < Hokusai::Block
5
- template <<~EOF
6
- [template]
7
- empty {
8
- @mousedown="set_down"
9
- @mouseup="set_up"
10
- cursor="pointer"
11
- }
12
- EOF
13
-
14
- uses(empty: Hokusai::Blocks::Empty)
15
-
16
- computed! :value
17
- computed :size, default: 24, convert: proc(&:to_i)
18
- computed :background, default: Hokusai::Color.new(70, 70, 70), convert: Hokusai::Color
19
- computed :color, default: Hokusai::Color.new(244, 244, 244), convert: Hokusai::Color
20
- computed :background_down, default: Hokusai::Color.new(33,33,33), convert: Hokusai::Color
21
- computed :margin, default: Hokusai::Padding.new(3.0, 2.5, 3.0, 2.5), convert: Hokusai::Padding
22
-
23
- inject :keyboard_icons
24
-
25
- attr_accessor :down, :last_commands, :last_canvas, :last_value
26
-
27
- def initialize(**args)
28
- @down = false
29
- @last_commands = []
30
- @last_canvas = nil
31
- @last_value = nil
32
-
33
- super
34
- end
35
-
36
- def set_down(event)
37
- if !down
38
- emit("clicked", value[0], event)
39
-
40
- self.down = true
41
- else
42
- emit("released", value[0], event)
43
- end
44
- end
45
-
46
- def set_up(event)
47
- self.down = false
48
- emit("released", value[0], event)
49
- end
50
-
51
- def render(canvas)
52
- hpad = (canvas.width - size) / 2
53
- vpad = (canvas.height - margin.height - size) / 2
54
-
55
- draw do
56
- if last_canvas != canvas && last_value != value
57
- self.last_value = value
58
- self.last_canvas = canvas
59
-
60
- if icon = keyboard_icons[value[0]]
61
- if icon[:width]
62
- node.meta.set_prop(:width, icon[:width])
63
- end
64
-
65
- rect(canvas.x + margin.left, canvas.y + margin.top, canvas.width - margin.width, canvas.height - margin.height) do |command|
66
- command.color = icon[:background]# down ? background_down : background
67
- command.round = 0.2
68
-
69
- last_commands << command
70
- end
71
-
72
- svg(icon[:file], canvas.x + icon[:size] / 3, canvas.y + icon[:size] / 3, icon[:size], icon[:size]) do |command|
73
- command.color = icon[:color]
74
-
75
- last_commands << command
76
- end
77
- else
78
- rect(canvas.x + margin.left, canvas.y + margin.top, canvas.width - margin.width, canvas.height - margin.height) do |command|
79
- command.color = down ? background_down : background
80
- command.round = 0.2
81
-
82
- last_commands << command
83
- end
84
-
85
- text(value[1].to_s, canvas.x + hpad + margin.width, canvas.y + margin.height) do |command|
86
- command.color = color
87
- command.size = size
88
-
89
- last_commands << command
90
- end
91
- end
92
- else
93
- queue.concat(last_commands)
94
- end
95
- end
96
-
97
- yield canvas
98
- end
99
- end
100
-
101
- class KeyboardRow < Hokusai::Block
102
- style <<~EOF
103
- [style]
104
- keyboardStyle {
105
- background: rgb(28, 28, 28);
106
- }
107
- keyStyle {
108
- background: rgb(46, 46, 46);
109
- color: rgb(208, 205, 218);
110
- background_down: rgb(37, 37, 37);
111
- }
112
- EOF
113
-
114
- template <<~EOF
115
- [template]
116
- hblock { ...keyboardStyle }
117
- [for="number in keys"]
118
- key {
119
- ...keyStyle
120
- :key="index"
121
- :value="number"
122
- @clicked="emit_key"
123
- @released="emit_released"
124
- }
125
- EOF
126
-
127
- uses(
128
- hblock: Hblock,
129
- vblock: Vblock,
130
- key: Key
131
- )
132
-
133
- computed! :keys
134
-
135
- inject :keyboard_icons
136
-
137
- def loop_key(value)
138
- @keys ||= {}
139
- @keys[value] ||= "key-#{value}".freeze
140
- end
141
-
142
- def emit_key(key, event)
143
- emit("key", key, event)
144
- end
145
-
146
- def emit_released(key, event)
147
- emit("released", key, event)
148
- end
149
- end
150
-
151
- class Keyboard < Hokusai::Block
152
- style <<~EOF
153
- [style]
154
- kstyle {
155
- padding: padding(10.0, 5.0, 10.0, 5.0);
156
- background: rgb(28, 28, 28);
157
- }
158
- EOF
159
-
160
- template <<~EOF
161
- [template]
162
- vblock { ...kstyle }
163
- [for="row in key_rows"]
164
- row {
165
- :icons="icons"
166
- @released="handle_released"
167
- @key="handle_keypress"
168
- :key="index"
169
- :keys="row"
170
- }
171
- EOF
172
-
173
- uses(
174
- vblock: Hokusai::Blocks::Vblock,
175
- row: KeyboardRow
176
- )
177
-
178
- def icons
179
- {
180
- :shift => {
181
- file: Hokusai.asset("icons/outline/arrow-big-up.svg"),
182
- width: 54.0,
183
- size: 30,
184
- background: Hokusai::Color.new(50, 109, 70),
185
- color: Hokusai::Color.new(172, 224, 189)
186
- },
187
- :backspace => {
188
- file: Hokusai.asset("icons/outline/backspace.svg"),
189
- width: 54.0,
190
- size: 30,
191
- background: Hokusai::Color.new(50, 109, 70),
192
- color: Hokusai::Color.new(172, 224, 189)
193
- }
194
- }
195
- end
196
-
197
- computed :row_height, default: 48.0, convert: proc(&:to_f)
198
-
199
- provide :keyboard_icons, :icons
200
-
201
- def on_mounted
202
- node.meta.set_prop(:height, row_height * 5.0 + 20)
203
- end
204
-
205
- def space_row
206
- [[:comma, ","], [:space, ''], [:period, "."]]
207
- end
208
-
209
- def key_rows
210
- [number_keys, querty_keys, asdf_keys, zxcv_keys, space_row]
211
- end
212
-
213
- def handle_released(key, event)
214
- event.input.keyboard_override = false
215
- end
216
-
217
- def handle_keypress(key, event)
218
- event.input.keyboard_override = true
219
- LibHokusai.hoku_input_keyboard_start(event.input.raw)
220
- LibHokusai.hoku_input_keyboard_set_key(event.input.raw, key.to_sym, true)
221
- LibHokusai.hoku_input_keyboard_stop(event.input.raw)
222
- end
223
-
224
- def zxcv_keys
225
- @zxcv_keys ||= begin
226
- keys = %w[z x c v b n m]
227
- middle = keys.zip(keys)
228
- # middle << [:backspace, :backspace]
229
- # middle.unshift([:shift, :shift])
230
- middle
231
- end
232
- end
233
-
234
- def asdf_keys
235
- keys = %w[a s d f g h j k l]
236
- @asdf_keys ||= keys.zip(keys)
237
- end
238
-
239
- def querty_keys
240
- keys = %w[q w e r t y u i o p]
241
- @querty_keys ||= keys.zip(keys)
242
- end
243
-
244
- def number_keys
245
- keys = [[:one,1],[:two, 2], [:three,3], [:four,4],[:five, 5], [:six,6], [:seven,7], [:eight,8],[:nine,9], [:zero, 0]]
246
- @number_keys ||= keys
247
- end
248
- end
249
- end
@@ -1,22 +0,0 @@
1
- class Hokusai::Blocks::ShaderBegin < Hokusai::Block
2
- template <<~EOF
3
- [template]
4
- slot
5
- EOF
6
-
7
- computed :fragment_shader, default: nil
8
- computed :vertex_shader, default: nil
9
- computed :uniforms, default: []
10
-
11
- def render(canvas)
12
- draw do
13
- shader_begin do |command|
14
- command.vertex_shader = vertex_shader
15
- command.fragment_shader = fragment_shader
16
- command.uniforms = uniforms
17
- end
18
- end
19
-
20
- yield canvas
21
- end
22
- end
@@ -1,12 +0,0 @@
1
- class Hokusai::Blocks::ShaderEnd < Hokusai::Block
2
- template <<~EOF
3
- [template]
4
- virtual
5
- EOF
6
-
7
- def render(canvas)
8
- draw do
9
- shader_end
10
- end
11
- end
12
- end
@@ -1,139 +0,0 @@
1
-
2
- module Hokusai::Blocks
3
- class Slider < Hokusai::Block
4
- template <<~EOF
5
- [template]
6
- empty {
7
- @click="start_slider"
8
- @mousemove="move_slider"
9
- @mouseup="stop_slider"
10
- }
11
- EOF
12
-
13
- uses(empty: Hokusai::Blocks::Empty)
14
-
15
- computed :fill, default: [61,171,211], convert: Hokusai::Color
16
- computed :initial, default: 0.0, convert: proc(&:to_f)
17
- computed :size, default: 50.0, convert: proc(&:to_f)
18
- computed :step, default: 20.0, convert: proc(&:to_f)
19
- computed :min, default: 0.0, convert: proc(&:to_f)
20
- computed :max, default: 100.0, convert: proc(&:to_f)
21
-
22
- attr_reader :slider_width, :slider_start, :steps_x, :steps_val
23
- attr_accessor :sliding, :slider_x, :last_index
24
-
25
- def initialize(**args)
26
- @sliding = false
27
- @slider_width = 0.0
28
- @slider_start = 0.0
29
- @slider_x = 0.0
30
- @last_index = 0
31
- @configured = false
32
-
33
- super
34
-
35
- @last_max = nil
36
- end
37
-
38
- def start_slider(event)
39
- self.sliding = true
40
- end
41
-
42
- def on_resize(canvas)
43
- # create our buckets for steps
44
- @slider_start = canvas.x
45
- @slider_width = canvas.width
46
-
47
- @steps_val = [*(min..max).step(step).to_a, max]
48
- steps_val.pop if steps_val[-1] == steps_val[-2]
49
-
50
- step_x = (slider_width) / (steps_val.size - 1)
51
- @steps_x = (slider_start..(slider_start + slider_width)).step(step_x).to_a
52
-
53
- (steps_val.size - steps_x.size).times do |i|
54
- steps_x << steps_x.last + step_x * i
55
- end
56
-
57
- steps_x[-1] = slider_start + slider_width if slider_start + slider_width != steps_x.last
58
- end
59
-
60
- def move_slider(event)
61
- if sliding && event.left.down
62
- pos = event.pos.x
63
- index = steps_x.size - 1
64
-
65
- (0...steps_x.size - 1).each do |i|
66
- next if steps_x[i + 1] && pos - steps_x[i + 1] > step
67
-
68
- if pos - steps_x[i] > pos - steps_x[i + 1]
69
- index = i
70
- break
71
- else
72
- index = i + 1
73
- break
74
- end
75
- end
76
-
77
- self.last_index = index
78
-
79
- emit("updated", steps_val[index])
80
- else
81
- self.sliding = false
82
- end
83
- end
84
-
85
- def stop_slider(event)
86
- if event.left.up
87
- self.sliding = false
88
- end
89
- end
90
-
91
- def render(canvas)
92
- if max != @last_max
93
- on_resize(canvas)
94
-
95
- @last_max = max
96
- end
97
-
98
- unless @setup || steps_val.nil? || initial.nil?
99
- steps_val.each_with_index do |val, index|
100
- if val == initial
101
- self.last_index = index
102
-
103
- break
104
- end
105
- end
106
-
107
- @setup = true
108
- end
109
-
110
- slider_x = steps_x[last_index]
111
- padding = Hokusai::Padding.new(0.0, 0.0, 0.0, 0.0)
112
- percent = slider_x * 100.00
113
- x = slider_x + padding.left
114
- x = (canvas.x + canvas.width) - (size / 2) - 2 if x > (canvas.x + canvas.width) - (size / 2)
115
- x = canvas.x if x < canvas.x
116
- cursor = (x + size / 2)
117
-
118
- draw do
119
- # draw background
120
- rect(canvas.x + padding.left, canvas.y + padding.top, canvas.width - padding.right - padding.left, size) do |command|
121
- command.round = size / 2
122
- command.color = Hokusai::Color.new(33, 33, 33)
123
- command.padding = Hokusai::Padding.new(5.0, 20.0, 5.0, 20.0)
124
- end
125
-
126
- rect(canvas.x + padding.left + 1, canvas.y + padding.top + 1, x + (size / 2) - canvas.x - 2, size - 2) do |command|
127
- command.round = size / 2
128
- command.color = fill
129
- end
130
-
131
- circle(cursor + padding.left, canvas.y + (size / 2) + padding.top, size / 2) do |command|
132
- command.color = Hokusai::Color.new(233, 233, 233)
133
- end
134
- end
135
-
136
- yield canvas
137
- end
138
- end
139
- end
@@ -1,23 +0,0 @@
1
- class Hokusai::Blocks::Texture < Hokusai::Block
2
- template <<~EOF
3
- [template]
4
- virtual
5
- EOF
6
-
7
- computed :width, default: nil, convert: proc(&:to_i)
8
- computed :height, default: nil, convert: proc(&:to_i)
9
- computed :x, default: nil
10
- computed :y, default: nil
11
- computed :rotation, default: nil
12
- computed :scale, default: 100.0
13
-
14
-
15
- def render(canvas)
16
- draw do
17
- texture(x || canvas.x, y || canvas.y, width || canvas.width, height || canvas.height) do |command|
18
- command.rotation = rotation if rotation
19
- command.scale = scale
20
- end
21
- end
22
- end
23
- end
@@ -1,33 +0,0 @@
1
- module Hokusai
2
- class Commands::ShaderBegin < Commands::Base
3
- attr_reader :vertex_shader, :fragment_shader, :uniforms
4
-
5
- def initialize
6
- @uniforms = []
7
- @vertex_shader = nil
8
- @fragment_shader = nil
9
- end
10
-
11
- def vertex_shader=(content)
12
- @vertex_shader = content
13
- end
14
-
15
- def fragment_shader=(content)
16
- @fragment_shader = content
17
- end
18
-
19
- def uniforms=(values)
20
- @uniforms = values
21
- end
22
-
23
- def hash
24
- [self.class, vertex_shader, fragment_shader].hash
25
- end
26
- end
27
-
28
- class Commands::ShaderEnd < Commands::Base;
29
- def hash
30
- [self.class].hash
31
- end
32
- end
33
- end
@@ -1,26 +0,0 @@
1
- module Hokusai
2
- class Commands::Texture < Commands::Base
3
- attr_reader :x, :y, :width, :height, :rotation, :scale
4
-
5
- def initialize(x, y, width, height)
6
- @x = x
7
- @y = y
8
- @width = width
9
- @height = height
10
- @rotation = 0.0
11
- @scale = 10.0
12
- end
13
-
14
- def rotation=(value)
15
- @rotation = value
16
- end
17
-
18
- def scale=(value)
19
- @scale = value
20
- end
21
-
22
- def hash
23
- [self.class, x, y, width, height].hash
24
- end
25
- end
26
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Hokusai
4
- class TouchEvent < Event
5
- extend Forwardable
6
-
7
- def_delegators :@touch, :tapped?, :swiped?, :longtapped?, :longtapping?, :touching?,
8
- :duration, :direction, :distance, :angle, :position, :last_position,
9
- :touch_len, :touch_count, :timer
10
-
11
- attr_reader :input
12
-
13
- def initialize(input, state)
14
- @input = input
15
- @state = state
16
- @touch = input.touch
17
- end
18
-
19
- def hovered(canvas)
20
- input.hovered?(canvas)
21
- end
22
-
23
- def to_json
24
- {
25
- keypress: {
26
- hold: hold,
27
- hold_duration: hold_duration.to_s,
28
- }
29
- }.to_json
30
- end
31
- end
32
-
33
- class TapHoldEvent < TouchEvent
34
- name "taphold"
35
-
36
- def capture(block, canvas)
37
- if matches(block) && longtapped? && hovered(canvas)
38
- captures << block
39
- end
40
- end
41
- end
42
-
43
- class PinchEvent < TouchEvent
44
- name "pinch"
45
-
46
- def capture(block, canvas)
47
- if false && matches(block)
48
- captures << block
49
- end
50
- end
51
- end
52
-
53
- class SwipeEvent < TouchEvent
54
- name "swipe"
55
-
56
- def capture(block, canvas)
57
- if swiped? && matches(block)
58
- captures << block
59
- end
60
- end
61
- end
62
- end