atome 0.5.7.1.0 → 0.5.7.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ac857ff76516c3e581e3204e6e1e1f9e497d1dc80575edeb0045e001e235b53
4
- data.tar.gz: a6f94e75d6ab5596d005d3f84565b25f413406ec959aae10ddaa8eaeebef7777
3
+ metadata.gz: 4a382b0c451af7a259820a14e61aadbf779d0ddba6a67a603ec3940a28d6f252
4
+ data.tar.gz: a44e9004e18b867645ca3be9681d295997cce04fd7b4c13b8107b546b76e0e2e
5
5
  SHA512:
6
- metadata.gz: 6b6c2f0f2cdc28ef9a51ba50c0e42a5d564db451b3842b20ded678b43fcb94edf20dd63144e381269bf580c8bb521b23d7a324c6e55947319bd510dba79b4072
7
- data.tar.gz: 3de7b9612d651409b56ce4ce04a5c951739414066d904135be8311ebdf24dfc2487ac78594bd80a18b54b440d4818b62555bc56667ea3bbe5ca942641f2cce4f
6
+ metadata.gz: 956973bed7a67e04f0ec7c2921602b1751afc5281f9869587596be81621eb4cf323f870183ae9dabc5fa9a476f7e67926f8255a65adc6c9daeacdf433dc7c494
7
+ data.tar.gz: bf54e93e8ab7a82854f6da1a185c2926f7bef89222da5a80b28fedb24a052ec083b2cd6341754116e72f4fb5e10f55d9f67d24df45081d055606b04787a7f7c7
@@ -142,6 +142,8 @@ new({ particle: :value }) do |val|
142
142
  val
143
143
  end
144
144
 
145
- new({ particle: :behavior })
145
+ new({ particle: :behavior, type: :symbol, category: :property })
146
146
 
147
147
  new({ particle: :orientation, type: :symbol, category: :property })
148
+
149
+ new({ particle: :align , type: :symbol, category: :property })
@@ -23,6 +23,7 @@ class Universe
23
23
  @allow_sync = false # temp server storage sync
24
24
  @connected = false
25
25
  @database_ready = false
26
+ @tools_root=[]
26
27
  @tools = {}
27
28
  @allow_tool_operations = false
28
29
  @active_tools = []
@@ -33,7 +34,7 @@ class Universe
33
34
  class << self
34
35
  attr_reader :atomes, :atomes_ids, :renderer_list, :molecule_list, :atome_list, :particle_list, :classes, :counter,
35
36
  :atomes_specificities
36
- attr_accessor :connected, :allow_sync, :allow_localstorage, :database_ready, :edit_mode, :tools,
37
+ attr_accessor :connected, :allow_sync, :allow_localstorage, :database_ready, :edit_mode, :tools,:tools_root,
37
38
  :allow_tool_operations, :active_tools, :atome_preset, :applicable_atomes, :default_selection_style
38
39
 
39
40
  def messages
data/lib/atome/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  # return atome version
4
4
  class Atome
5
- VERSION = '0.5.7.1.0'
5
+ VERSION = '0.5.7.1.2'
6
6
  end
@@ -1339,6 +1339,7 @@ STRDELIM
1339
1339
  # Table manipulation
1340
1340
 
1341
1341
  def table(data)
1342
+
1342
1343
  table_html = JS.global[:document].createElement('table')
1343
1344
  thead = JS.global[:document].createElement('thead')
1344
1345
 
@@ -1358,7 +1359,7 @@ STRDELIM
1358
1359
 
1359
1360
  table_html.appendChild(thead)
1360
1361
  tbody = JS.global[:document].createElement('tbody')
1361
-
1362
+ # alert data
1362
1363
  data.each_with_index do |row, row_index|
1363
1364
  tr = JS.global[:document].createElement('tr')
1364
1365
 
@@ -1388,6 +1389,20 @@ STRDELIM
1388
1389
  JS.global[:document].querySelector("##{@id}").appendChild(table_html)
1389
1390
  end
1390
1391
 
1392
+
1393
+
1394
+ # Helper function to handle Atome objects
1395
+ def handle_atome(atome, td_element)
1396
+ atome.fit(cell_height)
1397
+ html_element = JS.global[:document].getElementById(atome.id.to_s)
1398
+ td_element.appendChild(html_element)
1399
+ html_element[:style][:transformOrigin] = 'top left'
1400
+ html_element[:style][:position] = 'relative'
1401
+ atome.top(0)
1402
+ atome.left(0)
1403
+ end
1404
+
1405
+
1391
1406
  def refresh_table(_params)
1392
1407
  # first we need to extact all atome from the table or they will be deleted by the table refres
1393
1408
  data = @original_atome.data
@@ -1425,18 +1440,19 @@ STRDELIM
1425
1440
  end
1426
1441
 
1427
1442
  def set_td_style(td)
1428
- cell_height = 50
1443
+ cell_height = @original_atome.component[:height]
1444
+ cell_width = @original_atome.component[:width]
1429
1445
  td[:style][:border] = '1px solid black'
1430
1446
  td[:style][:backgroundColor] = 'white'
1431
1447
  td[:style][:boxShadow] = '10px 10px 5px #888888'
1432
- td[:style][:width] = "#{cell_height}px"
1433
- td[:style]['min-width'] = "#{cell_height}px"
1448
+ td[:style][:width] = "#{cell_width}px"
1449
+ td[:style]['min-width'] = "#{cell_width}px"
1434
1450
  td[:style]['max-width'] = "#{cell_height}px"
1435
1451
  td[:style]['min-height'] = "#{cell_height}px"
1436
1452
  td[:style]['max-height'] = "#{cell_height}px"
1437
1453
  td[:style][:height] = "#{cell_height}px"
1438
1454
  td[:style][:overflow] = 'hidden'
1439
- { cell_height: cell_height, cell_width: cell_height }
1455
+ { cell_height: cell_height, cell_width: cell_width }
1440
1456
  end
1441
1457
 
1442
1458
  def insert_cell(params)
@@ -20,9 +20,11 @@ new({ method: :remove, renderer: :html, type: :string }) do |object_id_to_remove
20
20
  when :category
21
21
  html.remove_class(value)
22
22
  else
23
- atome_ids_found = send(object_id_to_remove[:all])
24
- atome_ids_found.each do |atome_id|
25
- remove(atome_id)
23
+ if object_id_to_remove[:all]
24
+ atome_ids_found = send(object_id_to_remove[:all])
25
+ atome_ids_found.each do |atome_id|
26
+ remove(atome_id)
27
+ end
26
28
  end
27
29
  end
28
30
  end
@@ -44,9 +46,7 @@ new({ method: :remove, renderer: :html, type: :string }) do |object_id_to_remove
44
46
  html.style("boxShadow", 'none')
45
47
  html.style("filter", 'none')
46
48
  @apply.delete(object_id_to_remove)
47
- # apply(@apply)
48
49
  when :border
49
- # alert :poipoipoipoipo
50
50
  html.style("border", 'none')
51
51
  html.style("filter", 'none')
52
52
  @apply.delete(object_id_to_remove)
@@ -81,20 +81,20 @@ end
81
81
  #
82
82
  # html.style(:border, "#{type} #{thickness}px rgba(#{red},#{green},#{blue},#{alpha})")
83
83
  # end
84
- new({ method: :thickness, type: :integer, renderer: :html})
84
+ new({ method: :thickness, type: :integer, renderer: :html })
85
85
 
86
86
  # end
87
- new({ method: :pattern, type: :integer, renderer: :html})
87
+ new({ method: :pattern, type: :integer, renderer: :html })
88
88
 
89
89
  new({ method: :fill, renderer: :html }) do |params|
90
90
  html.fill(params)
91
91
  end
92
92
 
93
- new({ method: :opacity, type: :integer, renderer: :html}) do |value|
93
+ new({ method: :opacity, type: :integer, renderer: :html }) do |value|
94
94
  # html.opacity(value)
95
- html.style('opacity',value)
95
+ html.style('opacity', value)
96
96
  end
97
97
 
98
98
  new({ method: :visual, type: :string, renderer: :html, specific: :text }) do |value, _user_proc|
99
- html.style('fontFamily', value)
99
+ html.style('fontFamily', value)
100
100
  end
@@ -46,3 +46,8 @@ new({ method: :inside, renderer: :html }) do |params|
46
46
  html.style("boxSizing", ' content-box')
47
47
  end
48
48
  end
49
+
50
+
51
+ new({ method: :align, renderer: :html, type: :hash }) do |params|
52
+ html.style('text-align', params)
53
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+
4
+ b=box
5
+ i=b.image({path: 'medias/images/icons/hamburger.svg'})
6
+ wait 2 do
7
+ i.rotate(22)
8
+ end
@@ -1,584 +1,57 @@
1
- # frozen_string_literal: true
2
-
3
- # grab(:intuition).box({id: :toolbox, left: 33, top: 333})
4
- # toolbox_style contain all tools styles
5
- size = 33
6
- smooth = 3
7
- shadow({
8
- id: :tool_shade,
9
- left: 3, top: 3, blur: 3,
10
- invert: false,
11
- red: 0, green: 0, blue: 0, alpha: 0.6
12
- })
13
-
14
- color({ id: :tool_inactive_color, red: 1, green: 1, blue: 1, alpha: 0.12 })
15
- color({ id: :tool_active_color, red: 1, green: 1, blue: 1, alpha: 0.3 })
16
- border({ id: :tool_box_border, thickness: 1, red: 1, green: 1, blue: 1, alpha: 0.06, pattern: :solid, inside: true })
17
- # Tool's style object container below
18
- element({ aid: :toolbox_style, id: :toolbox_style, data: {
19
- color: :gray,
20
- size: size,
21
- smooth: smooth
22
- } })
23
-
24
- class Atome
25
- @tools_actions_to_exec = {}
26
-
27
- class << self
28
-
29
- def init_intuition
30
- Atome.start_click_analysis
31
- Universe.tools.each_with_index do |(tool_name, bloc), index|
32
- # puts "add position and orientation"
33
- A.build_tool({ name: tool_name, index: index }, &bloc)
34
- end
35
- end
36
-
37
- def selection
38
- grab(Universe.current_user).selection.collect
39
- end
40
-
41
- def add_tool_actions(tool_name, tool_content)
42
- # alert "tool_content is : tool_content#{tool_content}"
43
- # int8_f=tool_content[:int8]
44
- # activation_f=tool_content[:active]
45
- # inactivation_f=tool_content[:inactive]
46
- # creator=tool_content[:creation]
47
- # alterator=tool_content[:alteration]
48
- @tools_actions_to_exec[tool_name] = tool_content
49
- end
50
-
51
- def tool_actions_to_exec
52
- @tools_actions_to_exec
53
- end
54
-
55
- def activate_click_analysis
56
-
57
- # the condition below avoid touchdown analysis accumulation
58
- unless @click_analysis_active
59
- # this method analyse all object under the touchdown to find the first user objet and return it's id
60
-
61
- @click_analysis = lambda { |native_event|
62
- # the instance variable below check if we can apply tool (cf: if the atome we don't want to apply tool)
63
- if Universe.allow_tool_operations
64
- event = Native(native_event)
65
- x = event[:clientX]
66
- y = event[:clientY]
67
- elements = JS.global[:document].elementsFromPoint(x, y)
68
- elements.to_a.each do |element|
69
- id_found = element[:id].to_s
70
- atome_touched = grab(id_found)
71
- if grab(id_found) && grab(id_found).tag[:system]
72
- else
73
- @creations_f = []
74
- @alterations_f = []
75
- current_tool = ''
76
- @tools_actions_to_exec.each do |tool_name, actions|
77
- current_tool = grab(tool_name)
78
- @creations_f = @creations_f.concat(actions[:creation]) if actions[:creation] # Concaténation
79
- @alterations_f = @alterations_f.concat(actions[:alteration]) if actions[:alteration] # Concaténation
80
- end
81
- # Creation below
82
- @creations_f.each do |create_content|
83
- code_before_applying = create_content[:pre]
84
- code_after_applying = create_content[:post]
85
- instance_exec(atome_touched,event,&code_before_applying) if code_before_applying.is_a? Proc
86
- atome_type = create_content[:type]
87
- particles = create_content[:particles]
88
- new_atome = grab(:view).send(atome_type)
89
- particles.each do |particle_found, value_found|
90
- new_atome.send(particle_found, value_found)
91
- end
92
- new_atome.resize(true)
93
- new_atome.drag(true)
94
- new_atome.left(event[:pageX].to_i)
95
- new_atome.top(event[:pageY].to_i)
96
- current_tool.data << new_atome
97
- instance_exec(atome_touched,new_atome,event,&code_after_applying) if code_after_applying.is_a? Proc
98
-
99
- # now applying alterations on new atome if needed:
100
- @alterations_f.each do |actions_f|
101
- code_before_applying = actions_f[:pre]
102
- code_after_applying = actions_f[:post]
103
- instance_exec(new_atome,event,&code_before_applying) if code_before_applying.is_a? Proc
104
- action = actions_f[:particle]
105
- value = actions_f[:value]
106
- new_atome.send(action, value)
107
- instance_exec(new_atome,event,&code_after_applying) if code_after_applying.is_a? Proc
108
- end
109
-
110
-
111
- end
112
- if atome_touched
113
- @alterations_f.each do |actions_f|
114
- code_before_applying = actions_f[:pre]
115
- code_after_applying = actions_f[:post]
116
- instance_exec(nil,event,&code_before_applying) if code_before_applying.is_a? Proc
117
- action = actions_f[:particle]
118
- value = actions_f[:value]
119
- atome_touched.send(action, value)
120
- instance_exec(nil,event,&code_after_applying) if code_after_applying.is_a? Proc
121
- end
122
- # Atome.instance_exec(id_found, x, y, &@click_analysis_action) if @click_analysis_action.is_a?(Proc)
123
- end
124
- break
125
- end
126
- end
127
- else
128
- Universe.allow_tool_operations=true
129
- end
130
-
131
- }
132
- @click_analysis_active = true
133
- end
134
-
135
- end
136
-
137
- def de_activate_click_analysis
138
- # alert 'we need to find how many tools are still active'
139
- @click_analysis = nil
140
- @click_analysis_active = false
141
- end
142
-
143
- def start_click_analysis
144
- @click_analysis_active = false
145
- JS.global[:document].addEventListener('mouseup') do |native_event|
146
- Atome.instance_exec(native_event, &@click_analysis) if @click_analysis.is_a?(Proc)
147
- end
148
- end
149
-
150
- end
151
-
152
- def build_tool(params, &bloc)
153
- label = params[:name]
154
- name = "#{params[:name]}_tool"
155
- index = params[:index]
156
- orientation = params[:orientation]
157
- orientation_wanted = :sn
158
- color({ id: :active_tool_col, alpha: 1, red: 1, green: 1, blue: 1 })
159
- color({ id: :inactive_tool_col, alpha: 0.6 })
160
- tool_content = Atome.instance_exec(&bloc) if bloc.is_a?(Proc)
161
- grab(:intuition).storage[:tool_open] ||= []
162
- grab(:intuition).storage[:tool_open] << name
163
- size = grab(:toolbox_style).data[:size]
164
- smooth = grab(:toolbox_style).data[:smooth]
165
- case orientation_wanted
166
- when :sn
167
- top = :auto
168
- bottom = index * (size + 3)
169
- left = 0
170
- right = :auto
171
- when :ns
172
- when :ew
173
- when :we
174
- else
175
- #
176
- end
177
-
178
- # tool creation
179
- tool = grab(:intuition).box({ id: name,
180
- tag: { system: true },
181
- # orientation: orientation_wanted,
182
- top: top,
183
- bottom: bottom,
184
- left: left,
185
- right: right,
186
- width: size,
187
- height: size,
188
- smooth: smooth,
189
- apply: [:tool_inactive_color, :tool_box_border, :tool_shade],
190
- state: :closed,
191
- # storage: { taxonomy: Intuition.impulse },
192
- })
193
- tool.vector({ tag: { system: true }, left: 9, top: :auto, bottom: 9, width: 18, height: 18, id: "#{name}_icon" })
194
- tool.text({ tag: { system: true }, data: label, component: { size: 9 }, color: :grey, id: "#{name}_label" })
195
- tool.touch(true) do |ev|
196
- # we add all specific tool actions to @tools_actions_to_exec hash
197
-
198
- Atome.add_tool_actions(name, tool_content)
199
- # we set allow_tool_operations to false to ignore tool operation when clicking on a tool
200
- Universe.allow_tool_operations=false
201
- # we create the creation_layer if not already exist
202
-
203
- tick(name)
204
- # active code exec
205
- if tick[name] == 1 # first click
206
- # we set edit mode to true (this allow to prevent user atome to respond from click)
207
- Universe.edit_mode = true
208
- # activate tool analysis test
209
- Atome.activate_click_analysis
210
-
211
- # check_me_first = lambda { |atome_id_found, x, y|
212
- # puts "first user atome ==> #{grab(atome_id_found).id}, x: #{x}, y: #{y}"
213
- # }
214
- # Atome.instance_variable_set('@click_analysis_action', check_me_first)
215
- # init the tool
216
- tool.data = []
217
- # generic behavior
218
- tool.apply(:active_tool_col)
219
- # activation code
220
- tool_content[:active].each do |code_exec|
221
- tool.instance_exec(&code_exec)
222
- end if tool_content && tool_content[:active]
223
- if tool_content && tool_content[:alteration]
224
- # here we treat any selected items on tool activation
225
- tool_content[:alteration].each do |action|
226
- Atome.selection.each do |atome_id_to_treat|
227
- atome_to_treat=grab(atome_id_to_treat)
228
- pre_proc = action[:pre]
229
- tool.instance_exec(atome_to_treat,nil, &pre_proc) if pre_proc.is_a? Proc
230
- particle_f = action[:particle]
231
- value_f = action[:value]
232
- atome_to_treat.send(particle_f, value_f)
233
- post_proc = action[:post]
234
- tool.instance_exec(atome_to_treat,nil, &post_proc) if post_proc.is_a? Proc
235
- end
236
- end
237
- end
238
-
239
- else
240
- # when closing delete tools action from tool_actions_to_exec
241
- Atome.tool_actions_to_exec.delete(name)
242
- # we check if all tools are inactive if so we set edit_mode to false
243
- if Atome.tool_actions_to_exec.length == 0
244
- # puts "Atome.tool_actions_to_exec.length = 0"
245
- Atome.de_activate_click_analysis
246
- Universe.edit_mode = false
247
- end
248
-
249
- # inactivation code
250
- tool_content[:inactive].each do |code_exec|
251
- tool.instance_exec(tool.data, &code_exec)
252
- end if tool_content && tool_content[:inactive]
253
-
254
- # generic behavior
255
- # we remove touch and resize binding on newly created atomes
256
- tool.apply(:inactive_tool_col)
257
- tool.data.each do |new_atome|
258
- new_atome.drag(false)
259
- new_atome.resize(:remove)
260
- end
261
- tick[name] = 0
262
- end
263
- end
264
- end
265
- end
266
-
267
- module Intuition
268
- class << self
269
- @toolbox = { impulse: [:capture_tool, :communication_tool, :creation_tool, :view_tool, :time_tool, :find_tool, :home_tool],
270
- capture_tool: [:microphone_tool, :camera_tool,]
271
- }
272
-
273
- def intuition_int8
274
- # tool taxonomy and list
275
- {
276
- capture: { int8: { french: :enregistrement, english: :record, german: :datensatz } },
277
- communication: { french: :communication, english: :communication, german: :communication },
278
- tool: { french: :outils, english: :tools, german: :werkzeuge },
279
- view: { french: :vue, english: :view, german: :aussicht },
280
- time: { french: :horloge, english: :clock, german: :Uhr },
281
- find: { french: :trouve, english: :find, german: :finden },
282
- home: { french: :accueil, english: :home, german: :zuhause },
283
- code: { french: :code, english: :code, german: :code },
284
- impulse: { french: :impulse, english: :impulse, german: :impulse },
285
- }
286
- end
287
-
288
- def impulse
289
-
290
- # initialise touchdown analysis
291
- # Atome.start_click_analysis
292
-
293
- # tool start point
294
- # [:capture_tool, :communication, :tool, :view, :time, :find, :home]
295
- end
296
- end
297
-
298
- end
299
-
300
- ##########################################################
301
- # new({ tool: :impulse }) do |params|
302
- #
303
- # creation_code = lambda { |event|
304
- # puts :box_creation
305
- # }
306
- #
307
- # active_code = lambda { |event|
308
- # puts :start
309
- # apply([:tool_active_color])
310
- # storage[:taxonomy].each_with_index do |tool, index|
311
- #
312
- # # Atome.display_tool("tool_#{tool}", index + 1, :ns)
313
- # end
314
- # state(:open)
315
- # }
316
- #
317
- # inactive_code = lambda { |param|
318
- # puts :stop
319
- # # impulse.storage[:taxonomy].each do |tool|
320
- # # grab("tool_#{tool}").delete(true)
321
- # # end
322
- # # impulse.apply([:tool_inactive_color])
323
- # # impulse.state(:closed)
324
- # }
325
- #
326
- # {
327
- # active: [active_code],
328
- # inactive: [inactive_code],
329
- # creation: [creation_code],
330
- # int8: { french: :impulse, english: :impulse, german: :impulse }
331
- # }
332
- # end
333
-
334
- # toolbox creation
335
- # Atome.display_tool(:impulse, 0, :ns)
336
- # grab(:impulse).touch(true) do
337
- # impulse = grab(:impulse)
338
- # if impulse.state == :closed
339
- # impulse.apply([:tool_active_color])
340
- # impulse.storage[:taxonomy].each_with_index do |tool, index|
341
- #
342
- # Atome.display_tool("tool_#{tool}", index + 1, :ns)
343
- # end
344
- # impulse.state(:open)
345
- # else
346
- # impulse.storage[:taxonomy].each do |tool|
347
- # grab("tool_#{tool}").delete(true)
348
- # end
349
- # impulse.apply([:tool_inactive_color])
350
- # impulse.state(:closed)
351
- # end
352
- # end
353
-
354
- # ##############################################################################################
355
-
356
- new({ tool: :shape }) do |params|
357
-
358
- active_code = lambda {
359
- puts :creation_tool_code_activated
360
- # puts "activation code here"
361
- }
362
-
363
- inactive_code = lambda { |atomes_treated|
364
- puts :creation_tool_code_inactivated
365
- # atomes_treated.each do |new_atome|
366
- # if new_atome.selected
367
- # new_atome.left(new_atome.left + 33)
368
- # new_atome.color({ red: rand, green: rand, blue: rand })
369
- # end
370
- # end
371
- }
372
- pre_crea_code = lambda { |atome_touched, event|
373
- puts "pre_creation_code : atome_touched : #{atome_touched} event : #{event} "
374
- # Atome.selection.each do |atome_to_treat|
375
- # grab(atome_to_treat).color(:red)
376
- # grab(atome_to_treat).rotate(21)
377
- # puts "pre"
378
- # end
379
- }
380
-
381
- post_crea_code = lambda { |atome_touched, new_atome, event|
382
- puts "post_creation_code,atome_touched: #{atome_touched}, new_atome :#{new_atome}, event : #{event}"
383
-
384
- # new_atome.color(:blue)
385
- # puts "post"
386
- }
387
-
388
- creation_code = [{ type: :box, particles: { width: 66, height: 66 }, pre: pre_crea_code },
389
- { type: :circle, particles: { width: 66, height: 66 }, post: post_crea_code }
390
- ]
391
- pre_code = lambda { |atome_touched, event|
392
- # grab(atome_touched).height(99)
393
- puts 'alteration pre treatment'
394
- }
395
-
396
- post_code = lambda { |atome_touched, event|
397
-
398
- atome_touched.height(199)
399
- # new_atome.height(199) if new_atome
400
- # grab(new_atome).width(99)
401
- puts 'alteration post treatment'
402
-
403
- }
404
-
405
- alterations = [{ particle: :blur, value: 3, pre: pre_code, post: post_code }]
406
-
407
- { creation: creation_code, alteration: alterations,
408
- active: [active_code],
409
- inactive: [inactive_code],
410
- int8: { french: :formes, english: :shape, german: :jesaispas } }
411
-
412
- end
413
-
414
- ### tool2 test
415
-
416
- new({ tool: :color }) do |params|
417
-
418
-
419
- active_code = lambda {
420
- # grab(:intuition).data[:color] = :red
421
- puts :alteration_tool_code_activated
422
- }
423
-
424
- inactive_code = lambda { |param|
425
- puts :alteration_tool_code_inactivated
426
- }
427
- pre_code= lambda { |atome_touched, event|
428
- puts "post_creation_code,atome_touched: #{atome_touched}, event : #{event}"
429
-
430
- # new_atome.color(:blue)
431
- # puts "post"
432
- }
433
- post_code= lambda { |atome_touched, event|
434
- puts "post_creation_code,atome_touched: #{atome_touched}, event : #{event}"
435
-
436
- # new_atome.color(:blue)
437
- # puts "post"
438
- }
439
- alterations = [{ particle: :width, value: 22 }, { particle: :color, value: :red, pre: pre_code,
440
- post: post_code, }, { particle: :rotate, value: 33 }]
441
- {
442
- active: [active_code],
443
- inactive: [inactive_code],
444
- alteration: alterations,
445
-
446
- int8: { french: :couleur, english: :color, german: :colorad } }
447
-
448
- end
449
-
450
- # new({ tool: :color }) do |params|
451
- #
452
- # { alteration: [{ particle: :blur, value: 22 }] }
453
- #
454
- # end
455
- # verif below
456
- # wait 1 do
457
-
458
- Atome.init_intuition
459
- # end
460
-
461
- # ##############################################################################################
462
- #
463
-
464
- b = box({ left: 123, top: 66, selected: false, id: :the_box })
465
- b.touch(:down) do
466
- puts '"im touched"'
467
- end
468
- circle({ left: 123, top: 120, selected: true, id: :the_circle, drag: true })
469
-
470
- # def id_found_under_touch(obj_found)
471
- # alert obj_found
472
- # end
473
- # aa=<<STR
474
- # document.addEventListener('click', function(event) {
475
- # var x = event.clientX;
476
- # var y = event.clientY;
477
- # var elementUnderCursor = document.elementFromPoint(x, y).id;
478
- # Opal.Object.$id_found_under_touch(elementUnderCursor);
479
- # });
480
- # STR
481
- #
482
- # JS.eval(aa)
483
-
484
- # ###################### marche
485
- class Atome
486
-
487
- def set_action_on_touch(&action)
488
- @touch_action = action
489
-
490
- end
491
-
492
- # def set_atome_on_touch
493
- # document = JS.global[:document]
494
- # document.addEventListener("click") do |native_event|
495
- # event = Native(native_event)
496
- # x = event[:clientX]
497
- # y = event[:clientY]
498
- # element = document.elementFromPoint(x, y)
499
- # element_id = element[:id]
500
- # puts "test if element is a system element else select it "
501
- # @touch_action.call(element_id) if @touch_action.is_a? Proc
502
- # end
503
- # end
504
-
505
- # def set_atome_on_touch
506
- # document = JS.global[:document]
507
- # document.addEventListener("click") do |native_event|
508
- # event = Native(native_event)
509
- # x = event[:clientX]
510
- # y = event[:clientY]
511
- # element = document.elementFromPoint(x, y)
512
- #
513
- # # Boucle pour remonter la hiérarchie des éléments
514
- # while element && element != document
515
- # # Vérifie si l'élément a l'ID 'view'
516
- # if element[:id].to_s == 'view'
517
- # element_id = element[:id]
518
- # @touch_action.call(element_id) if @touch_action.is_a? Proc
519
- #
520
- # # alert "Clic sur un descendant de 'view'"
521
- # break
522
- # end
523
- # # Passe au parent de l'élément actuel
524
- # # element = element.JS[:parentNode]
525
- # break
526
- # end
527
- # end
528
- # end
529
-
530
- def remove_get_atome_on_touch
531
- @touch_action = nil
532
- end
533
-
534
- end
535
-
536
- ###### verif
537
- # A.set_action_on_touch do |at_id|
538
- # puts "==> #{at_id}"
539
- # end
540
- # A.set_atome_on_touch
541
- #
542
- #
543
- # wait 2 do
544
- # A.remove_get_atome_on_touch
545
- # wait 3 do
546
- # puts 'ready again !!'
547
- # A.set_action_on_touch do |at_id|
548
- # puts "******> #{at_id}"
549
- # end
550
- # end
551
- # end
552
-
553
- ###### good algo
554
- # class Atome
555
- # class << self
556
- #
557
- #
558
- # end
559
- #
560
- # end
561
-
562
- # check_me_first = lambda { |atome_id_found|
563
- # puts "first user atome ==> #{grab(atome_id_found).id}"
564
- # }
565
- # Atome.instance_variable_set('@click_analysis_action', check_me_first)
566
- # alert grab(:intuition).instance_variable_get('@click_analysis_action')
567
-
568
- # wait 3 do
569
- # check_me = lambda { |atome_id_found|
570
- # puts "Cool cool cool, for :#{atome_id_found}"
571
- # }
572
- # Atome.instance_variable_set('@click_analysis_action', check_me)
573
- # # wait 2 do
574
- # # Atome.de_activate_click_analysis
575
- # # alert :game_over
576
- # # end
577
- # end
578
-
579
- # array1 = [1, 2, 3]
580
- # array2 = nil
581
- # array1.concat(array2) if array2
582
- #
583
- # alert array1
584
- bb = box()
1
+ m = table({ renderers: [:html], attach: :view, id: :my_test_box, type: :table, apply: [:shape_color],
2
+ left: 333, top: 0, width: 300, smooth: 15, height: 900, overflow: :scroll, option: { header: false },
3
+ component: {
4
+ border: { thickness: 5, color: :blue, pattern: :dotted },
5
+ overflow: :auto,
6
+ color: "white",
7
+ shadow: {
8
+ id: :s4,
9
+ left: 20, top: 0, blur: 9,
10
+ option: :natural,
11
+ red: 0, green: 1, blue: 0, alpha: 1
12
+ },
13
+ # height: 80,
14
+ # width: 12,
15
+ component: { size: 12, color: :black }
16
+ },
17
+ data: [
18
+ { remove_me: :nonono },
19
+ { dfgdf: 1, name: 'Alice', age: 30, no: 'oko', t: 123, r: 654, f: 123, g: 654, w: 123, x: 654, c: 123, v: 654 },
20
+ ]
21
+ })
22
+
23
+
24
+
25
+ m.data( [
26
+ {header_title: nil },
27
+ { dfgdf:nil, name: nil, age: nil, no: nil, t: nil, r: nil, f: nil, g: nil, w: nil, x: nil, c: nil, v: nil },
28
+ { id: nil, name: nil, age: nil },
29
+ { dfg: nil, name: nil, age: nil, no: nil },
30
+ { dfgd: nil, name: nil, age: nil, no: nil },
31
+ {header_title: nil },
32
+ { dfgdf:nil, name: nil, age: nil, no: nil, t: nil, r: nil, f: nil, g: nil, w: nil, x: nil, c: nil, v: nil },
33
+ { id: nil, name: nil, age: nil },
34
+ { dfg: nil, name: nil, age: nil, no: nil },
35
+ { dfgd: nil, name: nil, age: nil, no: nil },
36
+ {header_title: nil },
37
+ { dfgdf:nil, name: nil, age: nil, no: nil, t: nil, r: nil, f: nil, g: nil, w: nil, x: nil, c: nil, v: nil },
38
+ { id: nil, name: nil, age: nil },
39
+ { dfg: nil, name: nil, age: nil, no: nil },
40
+ { dfgd: nil, name: nil, age: nil, no: nil },
41
+ {header_title: nil },
42
+ { dfgdf:nil, name: nil, age: nil, no: nil, t: nil, r: nil, f: nil, g: nil, w: nil, x: nil, c: nil, v: nil },
43
+ { id: nil, name: nil, age: nil },
44
+ { dfg: nil, name: nil, age: nil, no: nil },
45
+ { dfgd: nil, name: nil, age: nil, no: nil },
46
+ {header_title: nil },
47
+ { dfgdf:nil, name: nil, age: nil, no: nil, t: nil, r: nil, f: nil, g: nil, w: nil, x: nil, c: nil, v: nil },
48
+ { id: nil, name: nil, age: nil },
49
+ { dfg: nil, name: nil, age: nil, no: nil },
50
+ { dfgd: nil, name: nil, age: nil, no: nil },
51
+ {header_title: nil },
52
+ { dfgdf:nil, name: nil, age: nil, no: nil, t: nil, r: nil, f: nil, g: nil, w: nil, x: nil, c: nil, v: nil },
53
+ { id: nil, name: nil, age: nil },
54
+ { dfg: nil, name: nil, age: nil, no: nil },
55
+ { dfgd: nil, name: nil, age: nil, no: nil },
56
+
57
+ ])
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal
2
+
3
+ text({data: :centering,align: :center, width: 180, top: 33, left: 0, position: :absolute, color: :red})
@@ -23,11 +23,12 @@ class Atome
23
23
  class << self
24
24
  def init_intuition
25
25
  Atome.start_click_analysis
26
- root = [:box, :blur, :drag, :rotate, :select, :move,:project]
26
+ root = Universe.tools_root
27
27
  root.each_with_index do |root_tool, index|
28
28
  tools_scheme = Universe.tools[root_tool]
29
29
  A.build_tool({ name: root_tool, scheme: tools_scheme, index: index })
30
30
  end
31
+
31
32
  # Universe.tools.each_with_index do |(tool_name, bloc), index|
32
33
  #
33
34
  # A.build_tool({ name: tool_name, index: index }, &bloc)
@@ -511,6 +512,7 @@ end
511
512
  new({ tool: :rotate }) do
512
513
  { alteration: { height: 150, rotate: 45 } }
513
514
  end
515
+
514
516
  new({ tool: :move }) do |params|
515
517
  active_code = lambda {
516
518
  # if Atome.selection.instance_of? Array
@@ -564,6 +566,7 @@ new({ tool: :move }) do |params|
564
566
  int8: { french: :drag, english: :drag, german: :drag } }
565
567
 
566
568
  end
569
+
567
570
  new({ tool: :project }) do
568
571
  active_code = lambda {
569
572
 
@@ -579,43 +582,55 @@ new({ tool: :project }) do
579
582
  }
580
583
  { activation: active_code }
581
584
  end
582
- # new({ tool: :move }) do
583
- # inactivate=lambda{|param|
584
- # param[:treated].each do |atome_f|
585
- # atome_f.drag(false)
586
- # end
587
- # }
588
- # { alteration: { drag: true, left: nil , top: nil}, inactivation: inactivate }
589
- # end
590
- ### tool2 test
591
585
 
592
- Atome.init_intuition
586
+ new({tool: :test}) do
587
+ active_code = lambda {
588
+ # alert :ok
589
+ b=Object.box
590
+ # b=grab(:view).box
591
+ b.touch(true) do
592
+ Object.alert :kool
593
+ end
594
+ }
595
+ # active_code=:tito
596
+ { activation: active_code }
597
+ end
593
598
 
594
- # ###################
595
599
 
596
- b = box({ left: 123, top: 66, selected: false, id: :the_box, color: :green })
597
- b.touch(:down) do
598
- puts " on touch : #{Universe.allow_localstorage}"
599
- end
600
- b.resize(true) do
601
- puts :good!
602
- end
603
- the_circ = circle({ left: 123, top: 120, selected: false, id: :the_circle })
600
+ # Universe.tools_root=[:box, :blur, :drag, :rotate, :select, :move,:project]
601
+ Universe.tools_root=[:test]
602
+ Atome.init_intuition
604
603
 
605
- the_circ.touch(:down) do |params|
606
- puts " down : params: #{params}, id: #{the_circ.id}"
607
- end
608
604
 
609
- the_circ.touch(:up) do
610
- puts "up :kool"
611
- end
612
- the_circ.drag(true) do
613
- puts "drag : now"
614
- end
615
605
 
616
- bb = box({ left: 333, width: 120, selected: false, id: :big_box })
617
606
 
618
- b = box({ id: :the_big_boxy })
607
+ # ################### check below
608
+
609
+ # b = box({ left: 123, top: 66, selected: false, id: :the_box, color: :green })
610
+ # b.touch(:down) do
611
+ # puts " on touch : #{Universe.allow_localstorage}"
612
+ # end
613
+ # b.resize(true) do
614
+ # puts :good!
615
+ # end
616
+ # the_circ = circle({ left: 123, top: 120, selected: false, id: :the_circle })
617
+ #
618
+ # the_circ.touch(:down) do |params|
619
+ # puts " down : params: #{params}, id: #{the_circ.id}"
620
+ # end
621
+ #
622
+ # the_circ.touch(:up) do
623
+ # puts "up :kool"
624
+ # end
625
+ # the_circ.drag(true) do
626
+ # puts "drag : now"
627
+ # end
628
+ #
629
+ # bb = box({ left: 333, width: 120, selected: false, id: :big_box })
630
+ #
631
+ # b = box({ id: :the_big_boxy })
632
+
633
+ #################@
619
634
  # text({ data: :hello, selected: true, left: 120, id: :texting, blur: 12 })
620
635
  # text({data: :hello, left: 120, id: :texting})
621
636
  # Universe.tools.each_with_index do |(tool_name, bloc), index|
@@ -14,6 +14,7 @@
14
14
  <script type="text/javascript" src="js/third_parties/popmotion.min.js" defer></script>
15
15
  <script type="text/javascript" src="js/third_parties/sortable.min.js" defer></script>
16
16
  <script type="text/javascript" src="js/third_parties/wad.min.js" defer></script>
17
+ <script type="text/javascript" src="js/third_parties/wavesurfer.min.js" defer></script>
17
18
  <script type="text/javascript" src="js/third_parties/sha256.min.js" defer></script>
18
19
  <script type="text/javascript" src="js/third_parties/ping.min.js" defer></script>
19
20
  <script type="text/javascript" src="js/third_parties/fabric.min.js" defer></script>
@@ -13,6 +13,7 @@
13
13
  <script type="text/javascript" src="js/third_parties/popmotion.min.js" defer></script>
14
14
  <script type="text/javascript" src="js/third_parties/sortable.min.js" defer></script>
15
15
  <script type="text/javascript" src="js/third_parties/wad.min.js" defer></script>
16
+ <script type="text/javascript" src="js/third_parties/wavesurfer.min.js" defer></script>
16
17
  <script type="text/javascript" src="js/third_parties/sha256.min.js" defer></script>
17
18
  <script type="text/javascript" src="js/third_parties/ping.min.js" defer></script>
18
19
  <script defer src="js/third_parties/fabric.min.js" type="text/javascript"></script>
@@ -13,6 +13,7 @@
13
13
  <script defer src="js/third_parties/popmotion.min.js" type="text/javascript"></script>
14
14
  <script defer src="js/third_parties/sortable.min.js" type="text/javascript"></script>
15
15
  <script defer src="js/third_parties/wad.min.js" type="text/javascript"></script>
16
+ <script defer src="js/third_parties/wavesurfer.min.js" type="text/javascript"></script>
16
17
  <script defer src="js/third_parties/sha256.min.js" type="text/javascript"></script>
17
18
  <script defer src="js/third_parties/ping.min.js" type="text/javascript"></script>
18
19
  <script defer src="js/third_parties/fabric.min.js" type="text/javascript"></script>
@@ -14,6 +14,7 @@
14
14
  <script type="text/javascript" src="js/third_parties/popmotion.min.js" defer></script>
15
15
  <script type="text/javascript" src="js/third_parties/sortable.min.js" defer></script>
16
16
  <script type="text/javascript" src="js/third_parties/wad.min.js" defer></script>
17
+ <script type="text/javascript" src="js/third_parties/wavesurfer.min.js" defer></script>
17
18
  <script type="text/javascript" src="js/third_parties/sha256.min.js" defer></script>
18
19
  <script type="text/javascript" src="js/third_parties/ping.min.js" defer></script>
19
20
  <script type="text/javascript" src="js/third_parties/fabric.min.js" defer></script>
@@ -14,6 +14,7 @@
14
14
  <script type="text/javascript" src="js/third_parties/popmotion.min.js" defer></script>
15
15
  <script type="text/javascript" src="js/third_parties/sortable.min.js" defer></script>
16
16
  <script type="text/javascript" src="js/third_parties/wad.min.js" defer></script>
17
+ <script type="text/javascript" src="js/third_parties/wavesurfer.min.js" defer></script>
17
18
  <script type="text/javascript" src="js/third_parties/sha256.min.js" defer></script>
18
19
  <script type="text/javascript" src="js/third_parties/ping.min.js" defer></script>
19
20
  <script type="text/javascript" src="js/third_parties/fabric.min.js" defer></script>
@@ -0,0 +1 @@
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):((t="undefined"!=typeof globalThis?globalThis:t||self).WaveSurfer=t.WaveSurfer||{},t.WaveSurfer.Regions=e())}(this,(function(){"use strict";class t{constructor(){this.listeners={}}on(t,e,i){if(this.listeners[t]||(this.listeners[t]=new Set),this.listeners[t].add(e),null==i?void 0:i.once){const i=()=>{this.un(t,i),this.un(t,e)};return this.on(t,i),i}return()=>this.un(t,e)}un(t,e){var i;null===(i=this.listeners[t])||void 0===i||i.delete(e)}once(t,e){return this.on(t,e,{once:!0})}unAll(){this.listeners={}}emit(t,...e){this.listeners[t]&&this.listeners[t].forEach((t=>t(...e)))}}class e extends t{constructor(t){super(),this.subscriptions=[],this.options=t}onInit(){}_init(t){this.wavesurfer=t,this.onInit()}destroy(){this.emit("destroy"),this.subscriptions.forEach((t=>t()))}}function i(t,e,i,n,s=3,o=0,r=100){if(!t)return()=>{};const a=matchMedia("(pointer: coarse)").matches;let l=()=>{};const h=h=>{if(h.button!==o)return;h.preventDefault(),h.stopPropagation();let d=h.clientX,c=h.clientY,u=!1;const g=Date.now(),p=n=>{if(n.preventDefault(),n.stopPropagation(),a&&Date.now()-g<r)return;const o=n.clientX,l=n.clientY,h=o-d,p=l-c;if(u||Math.abs(h)>s||Math.abs(p)>s){const n=t.getBoundingClientRect(),{left:s,top:r}=n;u||(null==i||i(d-s,c-r),u=!0),e(h,p,o-s,l-r),d=o,c=l}},v=e=>{if(u){const i=e.clientX,s=e.clientY,o=t.getBoundingClientRect(),{left:r,top:a}=o;null==n||n(i-r,s-a)}l()},m=t=>{t.relatedTarget&&t.relatedTarget!==document.documentElement||v(t)},f=t=>{u&&(t.stopPropagation(),t.preventDefault())},b=t=>{u&&t.preventDefault()};document.addEventListener("pointermove",p),document.addEventListener("pointerup",v),document.addEventListener("pointerout",m),document.addEventListener("pointercancel",m),document.addEventListener("touchmove",b,{passive:!1}),document.addEventListener("click",f,{capture:!0}),l=()=>{document.removeEventListener("pointermove",p),document.removeEventListener("pointerup",v),document.removeEventListener("pointerout",m),document.removeEventListener("pointercancel",m),document.removeEventListener("touchmove",b),setTimeout((()=>{document.removeEventListener("click",f,{capture:!0})}),10)}};return t.addEventListener("pointerdown",h),()=>{l(),t.removeEventListener("pointerdown",h)}}function n(t,e){const i=e.xmlns?document.createElementNS(e.xmlns,t):document.createElement(t);for(const[t,s]of Object.entries(e))if("children"===t)for(const[t,s]of Object.entries(e))"string"==typeof s?i.appendChild(document.createTextNode(s)):i.appendChild(n(t,s));else"style"===t?Object.assign(i.style,s):"textContent"===t?i.textContent=s:i.setAttribute(t,s.toString());return i}function s(t,e,i){const s=n(t,e||{});return null==i||i.appendChild(s),s}class o extends t{constructor(t,e,i=0){var n,s,o,r,a,l,h,d;super(),this.totalDuration=e,this.numberOfChannels=i,this.minLength=0,this.maxLength=1/0,this.contentEditable=!1,this.subscriptions=[],this.subscriptions=[],this.id=t.id||`region-${Math.random().toString(32).slice(2)}`,this.start=this.clampPosition(t.start),this.end=this.clampPosition(null!==(n=t.end)&&void 0!==n?n:t.start),this.drag=null===(s=t.drag)||void 0===s||s,this.resize=null===(o=t.resize)||void 0===o||o,this.color=null!==(r=t.color)&&void 0!==r?r:"rgba(0, 0, 0, 0.1)",this.minLength=null!==(a=t.minLength)&&void 0!==a?a:this.minLength,this.maxLength=null!==(l=t.maxLength)&&void 0!==l?l:this.maxLength,this.channelIdx=null!==(h=t.channelIdx)&&void 0!==h?h:-1,this.contentEditable=null!==(d=t.contentEditable)&&void 0!==d?d:this.contentEditable,this.element=this.initElement(),this.setContent(t.content),this.setPart(),this.renderPosition(),this.initMouseEvents()}clampPosition(t){return Math.max(0,Math.min(this.totalDuration,t))}setPart(){const t=this.start===this.end;this.element.setAttribute("part",`${t?"marker":"region"} ${this.id}`)}addResizeHandles(t){const e={position:"absolute",zIndex:"2",width:"6px",height:"100%",top:"0",cursor:"ew-resize",wordBreak:"keep-all"},n=s("div",{part:"region-handle region-handle-left",style:Object.assign(Object.assign({},e),{left:"0",borderLeft:"2px solid rgba(0, 0, 0, 0.5)",borderRadius:"2px 0 0 2px"})},t),o=s("div",{part:"region-handle region-handle-right",style:Object.assign(Object.assign({},e),{right:"0",borderRight:"2px solid rgba(0, 0, 0, 0.5)",borderRadius:"0 2px 2px 0"})},t);this.subscriptions.push(i(n,(t=>this.onResize(t,"start")),(()=>null),(()=>this.onEndResizing()),1),i(o,(t=>this.onResize(t,"end")),(()=>null),(()=>this.onEndResizing()),1))}removeResizeHandles(t){const e=t.querySelector('[part*="region-handle-left"]'),i=t.querySelector('[part*="region-handle-right"]');e&&t.removeChild(e),i&&t.removeChild(i)}initElement(){const t=this.start===this.end;let e=0,i=100;this.channelIdx>=0&&this.channelIdx<this.numberOfChannels&&(i=100/this.numberOfChannels,e=i*this.channelIdx);const n=s("div",{style:{position:"absolute",top:`${e}%`,height:`${i}%`,backgroundColor:t?"none":this.color,borderLeft:t?"2px solid "+this.color:"none",borderRadius:"2px",boxSizing:"border-box",transition:"background-color 0.2s ease",cursor:this.drag?"grab":"default",pointerEvents:"all"}});return!t&&this.resize&&this.addResizeHandles(n),n}renderPosition(){const t=this.start/this.totalDuration,e=(this.totalDuration-this.end)/this.totalDuration;this.element.style.left=100*t+"%",this.element.style.right=100*e+"%"}toggleCursor(t){var e;this.drag&&(null===(e=this.element)||void 0===e?void 0:e.style)&&(this.element.style.cursor=t?"grabbing":"grab")}initMouseEvents(){const{element:t}=this;t&&(t.addEventListener("click",(t=>this.emit("click",t))),t.addEventListener("mouseenter",(t=>this.emit("over",t))),t.addEventListener("mouseleave",(t=>this.emit("leave",t))),t.addEventListener("dblclick",(t=>this.emit("dblclick",t))),t.addEventListener("pointerdown",(()=>this.toggleCursor(!0))),t.addEventListener("pointerup",(()=>this.toggleCursor(!1))),this.subscriptions.push(i(t,(t=>this.onMove(t)),(()=>this.toggleCursor(!0)),(()=>{this.toggleCursor(!1),this.drag&&this.emit("update-end")}))),this.contentEditable&&this.content&&(this.content.addEventListener("click",(t=>this.onContentClick(t))),this.content.addEventListener("blur",(()=>this.onContentBlur()))))}_onUpdate(t,e){if(!this.element.parentElement)return;const{width:i}=this.element.parentElement.getBoundingClientRect(),n=t/i*this.totalDuration,s=e&&"start"!==e?this.start:this.start+n,o=e&&"end"!==e?this.end:this.end+n,r=o-s;s>=0&&o<=this.totalDuration&&s<=o&&r>=this.minLength&&r<=this.maxLength&&(this.start=s,this.end=o,this.renderPosition(),this.emit("update",e))}onMove(t){this.drag&&this._onUpdate(t)}onResize(t,e){this.resize&&this._onUpdate(t,e)}onEndResizing(){this.resize&&this.emit("update-end")}onContentClick(t){t.stopPropagation();t.target.focus(),this.emit("click",t)}onContentBlur(){this.emit("update-end")}_setTotalDuration(t){this.totalDuration=t,this.renderPosition()}play(){this.emit("play")}setContent(t){var e;if(null===(e=this.content)||void 0===e||e.remove(),t){if("string"==typeof t){const e=this.start===this.end;this.content=s("div",{style:{padding:`0.2em ${e?.2:.4}em`,display:"inline-block"},textContent:t})}else this.content=t;this.contentEditable&&(this.content.contentEditable="true"),this.content.setAttribute("part","region-content"),this.element.appendChild(this.content)}else this.content=void 0}setOptions(t){var e,i;if(t.color&&(this.color=t.color,this.element.style.backgroundColor=this.color),void 0!==t.drag&&(this.drag=t.drag,this.element.style.cursor=this.drag?"grab":"default"),void 0!==t.start||void 0!==t.end){const n=this.start===this.end;this.start=this.clampPosition(null!==(e=t.start)&&void 0!==e?e:this.start),this.end=this.clampPosition(null!==(i=t.end)&&void 0!==i?i:n?this.start:this.end),this.renderPosition(),this.setPart()}if(t.content&&this.setContent(t.content),t.id&&(this.id=t.id,this.setPart()),void 0!==t.resize&&t.resize!==this.resize){const e=this.start===this.end;this.resize=t.resize,this.resize&&!e?this.addResizeHandles(this.element):this.removeResizeHandles(this.element)}}remove(){this.emit("remove"),this.subscriptions.forEach((t=>t())),this.element.remove(),this.element=null}}class r extends e{constructor(t){super(t),this.regions=[],this.regionsContainer=this.initRegionsContainer()}static create(t){return new r(t)}onInit(){if(!this.wavesurfer)throw Error("WaveSurfer is not initialized");this.wavesurfer.getWrapper().appendChild(this.regionsContainer);let t=[];this.subscriptions.push(this.wavesurfer.on("timeupdate",(e=>{const i=this.regions.filter((t=>t.start<=e&&(t.end===t.start?t.start+.05:t.end)>=e));i.forEach((e=>{t.includes(e)||this.emit("region-in",e)})),t.forEach((t=>{i.includes(t)||this.emit("region-out",t)})),t=i})))}initRegionsContainer(){return s("div",{style:{position:"absolute",top:"0",left:"0",width:"100%",height:"100%",zIndex:"3",pointerEvents:"none"}})}getRegions(){return this.regions}avoidOverlapping(t){if(!t.content)return;const e=t.content,i=e.getBoundingClientRect(),n=this.regions.map((e=>{if(e===t||!e.content)return 0;const n=e.content.getBoundingClientRect();return i.left<n.left+n.width&&n.left<i.left+i.width?n.height:0})).reduce(((t,e)=>t+e),0);e.style.marginTop=`${n}px`}adjustScroll(t){var e,i;const n=null===(i=null===(e=this.wavesurfer)||void 0===e?void 0:e.getWrapper())||void 0===i?void 0:i.parentElement;if(!n)return;const{clientWidth:s,scrollWidth:o}=n;if(o<=s)return;const r=n.getBoundingClientRect(),a=t.element.getBoundingClientRect(),l=a.left-r.left,h=a.right-r.left;l<0?n.scrollLeft+=l:h>s&&(n.scrollLeft+=h-s)}saveRegion(t){this.regionsContainer.appendChild(t.element),this.avoidOverlapping(t),this.regions.push(t);const e=[t.on("update",(e=>{e||this.adjustScroll(t)})),t.on("update-end",(()=>{this.avoidOverlapping(t),this.emit("region-updated",t)})),t.on("play",(()=>{var e,i;null===(e=this.wavesurfer)||void 0===e||e.play(),null===(i=this.wavesurfer)||void 0===i||i.setTime(t.start)})),t.on("click",(e=>{this.emit("region-clicked",t,e)})),t.on("dblclick",(e=>{this.emit("region-double-clicked",t,e)})),t.once("remove",(()=>{e.forEach((t=>t())),this.regions=this.regions.filter((e=>e!==t)),this.emit("region-removed",t)}))];this.subscriptions.push(...e),this.emit("region-created",t)}addRegion(t){var e,i;if(!this.wavesurfer)throw Error("WaveSurfer is not initialized");const n=this.wavesurfer.getDuration(),s=null===(i=null===(e=this.wavesurfer)||void 0===e?void 0:e.getDecodedData())||void 0===i?void 0:i.numberOfChannels,r=new o(t,n,s);return n?this.saveRegion(r):this.subscriptions.push(this.wavesurfer.once("ready",(t=>{r._setTotalDuration(t),this.saveRegion(r)}))),r}enableDragSelection(t,e=3){var n;const s=null===(n=this.wavesurfer)||void 0===n?void 0:n.getWrapper();if(!(s&&s instanceof HTMLElement))return()=>{};let r=null,a=0;return i(s,((t,e,i)=>{r&&r._onUpdate(t,i>a?"end":"start")}),(e=>{var i,n;if(a=e,!this.wavesurfer)return;const s=this.wavesurfer.getDuration(),l=null===(n=null===(i=this.wavesurfer)||void 0===i?void 0:i.getDecodedData())||void 0===n?void 0:n.numberOfChannels,{width:h}=this.wavesurfer.getWrapper().getBoundingClientRect(),d=e/h*s,c=(e+5)/h*s;r=new o(Object.assign(Object.assign({},t),{start:d,end:c}),s,l),this.regionsContainer.appendChild(r.element)}),(()=>{r&&(this.saveRegion(r),r=null)}),e)}clearRegions(){this.regions.forEach((t=>t.remove()))}destroy(){this.clearRegions(),super.destroy(),this.regionsContainer.remove()}}return r}));
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1024" height="1024" xml:space="preserve" id="moduleCanvas">
4
+ <path id="moduleCanvas-bezier" stroke="none" fill="rgb(255, 255, 255)" d="M 896,85.33 L 597.33,85.33 597.33,85.33 C 573.77,85.33 554.67,104.44 554.67,128 L 554.67,426.67 554.67,426.67 C 554.67,450.23 573.77,469.33 597.33,469.33 L 896,469.33 896,469.33 C 919.56,469.33 938.67,450.23 938.67,426.67 L 938.67,128 938.67,128 C 938.67,104.44 919.56,85.33 896,85.33 Z M 853.33,384 L 640,384 640,170.67 853.33,170.67 853.33,384 Z M 853.33,384" />
5
+ <path id="moduleCanvas-bezier2" stroke="none" fill="rgb(255, 255, 255)" d="M 810.67,512 L 512,512 512,213.33 512,213.33 C 512,189.77 492.9,170.67 469.33,170.67 L 128,170.67 128,170.67 C 104.44,170.67 85.33,189.77 85.33,213.33 L 85.33,896 85.33,896 C 85.33,919.56 104.44,938.67 128,938.67 L 810.67,938.67 810.67,938.67 C 834.23,938.67 853.33,919.56 853.33,896 L 853.33,554.67 853.33,554.67 C 853.33,531.1 834.23,512 810.67,512 Z M 170.67,256 L 426.67,256 426.67,512 170.67,512 170.67,256 Z M 170.67,597.33 L 426.67,597.33 426.67,853.33 170.67,853.33 170.67,597.33 Z M 768,853.33 L 512,853.33 512,597.33 768,597.33 768,853.33 Z M 768,853.33" />
6
+ </svg>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: atome
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.7.1.0
4
+ version: 0.5.7.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean-Eric Godard
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-04-29 00:00:00.000000000 Z
11
+ date: 2024-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: artoo
@@ -623,6 +623,7 @@ files:
623
623
  - vendor/assets/application/examples/remove.rb
624
624
  - vendor/assets/application/examples/repeat.rb
625
625
  - vendor/assets/application/examples/resize.rb
626
+ - vendor/assets/application/examples/rotate.rb
626
627
  - vendor/assets/application/examples/scroll.rb
627
628
  - vendor/assets/application/examples/security.rb
628
629
  - vendor/assets/application/examples/select_text.rb
@@ -645,6 +646,7 @@ files:
645
646
  - vendor/assets/application/examples/terminal.rb
646
647
  - vendor/assets/application/examples/test.rb
647
648
  - vendor/assets/application/examples/text.rb
649
+ - vendor/assets/application/examples/text_align.rb
648
650
  - vendor/assets/application/examples/tick.rb
649
651
  - vendor/assets/application/examples/tools.rb
650
652
  - vendor/assets/application/examples/touch.rb
@@ -724,6 +726,7 @@ files:
724
726
  - vendor/assets/src/js/third_parties/three.min.js
725
727
  - vendor/assets/src/js/third_parties/w3color.js
726
728
  - vendor/assets/src/js/third_parties/wad.min.js
729
+ - vendor/assets/src/js/third_parties/wavesurfer.min.js
727
730
  - vendor/assets/src/js/third_parties/zim.min.js
728
731
  - vendor/assets/src/medias/audios/audio_missing.wav
729
732
  - vendor/assets/src/medias/audios/clap.wav
@@ -793,6 +796,7 @@ files:
793
796
  - vendor/assets/src/medias/images/icons/midi_in.svg
794
797
  - vendor/assets/src/medias/images/icons/midi_out.svg
795
798
  - vendor/assets/src/medias/images/icons/mixer.svg
799
+ - vendor/assets/src/medias/images/icons/module.svg
796
800
  - vendor/assets/src/medias/images/icons/modules.svg
797
801
  - vendor/assets/src/medias/images/icons/new.svg
798
802
  - vendor/assets/src/medias/images/icons/panel.svg