atome 0.5.7.1.0 → 0.5.7.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/documentation/deep learning/basic_infos.txt +1 -1
  4. data/lib/atome/extensions/atome.rb +9 -19
  5. data/lib/atome/genesis/atomes.rb +11 -0
  6. data/lib/atome/genesis/particles/property.rb +3 -1
  7. data/lib/atome/genesis/sparkle.rb +2 -1
  8. data/lib/atome/kernel/universe.rb +2 -1
  9. data/lib/atome/presets/atome.rb +5 -14
  10. data/lib/atome/version.rb +1 -1
  11. data/lib/renderers/html/hierarchy.rb +2 -2
  12. data/lib/renderers/html/html.rb +44 -17
  13. data/lib/renderers/html/identity.rb +4 -1
  14. data/lib/renderers/html/material.rb +10 -10
  15. data/lib/renderers/html/property.rb +5 -0
  16. data/lib/renderers/html/utility.rb +1 -1
  17. data/vendor/assets/application/examples/audio.rb +70 -0
  18. data/vendor/assets/application/examples/hypertext.rb +24 -3
  19. data/vendor/assets/application/examples/rotate.rb +8 -0
  20. data/vendor/assets/application/examples/test.rb +146 -572
  21. data/vendor/assets/application/examples/text_align.rb +3 -0
  22. data/vendor/assets/application/examples/tools.rb +46 -31
  23. data/vendor/assets/src/index.html +14 -6
  24. data/vendor/assets/src/index_opal.html +16 -7
  25. data/vendor/assets/src/index_server.html +20 -0
  26. data/vendor/assets/src/index_server_wasm.html +14 -6
  27. data/vendor/assets/src/index_wasm.html +20 -12
  28. data/vendor/assets/src/js/third_parties/wavesurfer.min.js +1 -0
  29. data/vendor/assets/src/js/third_parties/webaudio-pianoroll.min.js +66 -0
  30. data/vendor/assets/src/medias/images/icons/module.svg +6 -0
  31. data/vendor/assets/src/medias/images/utils/full_keyboard.svg +50 -0
  32. data/vendor/assets/src/medias/images/utils/keyboard.svg +29 -0
  33. data/vendor/assets/src/medias/images/utils/notes.svg +28 -0
  34. metadata +12 -3
@@ -1,584 +1,158 @@
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)
1
+ # # frozen_string_literal: true
2
+ #
3
+ # # m = table({ renderers: [:html], attach: :view, id: :my_test_box, type: :table, apply: [:shape_color],
4
+ # # left: 333, top: 0, width: 900, smooth: 15, height: 900, overflow: :scroll, option: { header: false },
5
+ # # component: {
6
+ # # # border: { thickness: 5, color: :blue, pattern: :dotted },
7
+ # # # overflow: :auto,
8
+ # # # color: "red",
9
+ # # shadow: {
10
+ # # id: :s4,
11
+ # # left: 20, top: 0, blur: 9,
12
+ # # option: :natural,
13
+ # # red: 0, green: 0, blue: 0, alpha: 1
14
+ # # },
15
+ # # height: 5,
16
+ # # width: 12,
17
+ # # component: { size: 12, color: :black }
18
+ # # },
19
+ # # # data: [
20
+ # # # { titi: :toto },
21
+ # # # { dfgdf: 1, name: 'Alice', age: 30, no: 'oko', t: 123, r: 654 },
22
+ # # # { id: 2, name: 'Bob', age: 22 },
23
+ # # # { dfg: 4, name: 'Vincent', age: 33, no: grab(:my_circle) },
24
+ # # # { dfgd: 3, name: 'Roger', age: 18, no: image(:red_planet), now: :nothing }
25
+ # # #
26
+ # # # ]
27
+ # # })
28
+ # b=box({top: 120})
29
+ # box({top: 190, id: :the_box})
30
+ #
31
+ # b.touch(true) do
32
+ # a=JS.eval("return performance.now()")
33
+ # z=Time.now
34
+ # circle
35
+ # columns = []
36
+ #
37
+ # 96.times do
38
+ # line = {}
39
+ # 128.times do |index|
40
+ # line[:"vel#{index}"] = nil
313
41
  # 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)
42
+ # columns << line
43
+ # end
44
+ # columns.each_with_index do |a, index|
45
+ # b= box({left: index*30, width: 12})
46
+ # # b.touch(true) do
47
+ # # alert b.id
321
48
  # # 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
49
  # 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
- # ##############################################################################################
50
+ # z2=Time.now
51
+ # x=JS.eval("return performance.now();")
52
+ # alert "#{x.to_f-a.to_f} : #{(z2-z)*1000}"
462
53
  #
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
54
  # 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
55
  #
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
56
  #
57
+ # # m.data(columns)
58
+ # # # tests
59
+ # # m.color(:orange)
60
+ # # m.border({ thickness: 5, color: :blue, pattern: :dotted })
61
+ # #
62
+ # # m.get({ cell: [1, 2]}).class
63
+ # # wait 2 do
64
+ # # m.insert({ cell: [2, 2], content: 999 })
65
+ # # m.insert({ row: 1 })
66
+ # # wait 1 do
67
+ # # m.remove({ row: 2 })
68
+ # # end
69
+ # # wait 2 do
70
+ # # m.remove({ column: 1 })
71
+ # # end
72
+ # # wait 3 do
73
+ # # m.insert({ column: 3 })
74
+ # # end
75
+ # #
76
+ # # wait 4 do
77
+ # # m.sort({ column: 1, method: :alphabetic })
78
+ # # puts 1
79
+ # # wait 1 do
80
+ # # puts 2
81
+ # # m.sort({ column: 2, method: :numeric })
82
+ # # wait 1 do
83
+ # # puts 3
84
+ # # m.sort({ column: 3, method: :numeric })
85
+ # # wait 1 do
86
+ # # puts 4
87
+ # # m.sort({ column: 1, method: :numeric })
88
+ # # end
89
+ # # end
90
+ # # end
91
+ # # end
92
+ # #
93
+ # # end
94
+ # #
95
+ # # # cell.fusion() # to be implemented later
96
+ #
97
+ #
98
+ # # b=box({width: 1200, height: 900, color: {alpha: 0},top: -50})
99
+ # # grab(:black_matter).image({id: :kb,path: 'medias/images/utils/keyboard.svg', width: 66, left: 55})
100
+ # # # grab(:black_matter).image({id: :planet,path: 'medias/images/red_planet.png', width: 66,height: 66, left: 555, top: 180})
101
+ # # b.fill([atome: :kb, repeat: {x: 8, y: 1}])
102
+ # # b.drag(true)
103
+ # #
104
+ # #
105
+ # # b2=box({width: 1200, height: 298, top: -100})
106
+ # # grab(:black_matter).image({id: :notes,path: 'medias/images/utils/notes.svg', width: 166, left: 55})
107
+ # # # grab(:black_matter).image({id: :planet,path: 'medias/images/red_planet.png', width: 66,height: 66, left: 555, top: 180})
108
+ # # b2.fill([atome: :notes, repeat: {x: 8, y: 5}])
109
+ # # b2.drag(true)
110
+ #
111
+ #
112
+ # JS.eval("
113
+ # // Fonction pour créer les divs
114
+ # function createDivs() {
115
+ # // Démarrer le chronomètre
116
+ # const startTime = performance.now();
117
+ #
118
+ # const view = document.getElementById('view');
119
+ # //view.innerHTML = ''; // Nettoyer le contenu précédent de 'view' si nécessaire
120
+ #
121
+ # // Boucle pour créer 98 divs sur l'axe X
122
+ # for (let i = 0; i < 98; i++) {
123
+ # const xDiv = document.createElement('div');
124
+ # xDiv.style.display = 'flex';
125
+ # xDiv.style.flexDirection = 'column';
126
+ # xDiv.style.margin = '2px'; // Marge entre les divs de l'axe X
127
+ #
128
+ # // Boucle pour créer 128 divs sur l'axe Y
129
+ # for (let j = 0; j < 128; j++) {
130
+ # const yDiv = document.createElement('div');
131
+ # yDiv.style.width = '10px'; // Largeur de chaque div sur l'axe Y
132
+ # yDiv.style.height = '10px'; // Hauteur de chaque div sur l'axe Y
133
+ # yDiv.style.border = '1px solid black'; // Bordure pour rendre les divs visibles
134
+ # yDiv.style.boxSizing = 'border-box'; // Inclure la bordure dans les dimensions
135
+ # xDiv.appendChild(yDiv);
136
+ # }
137
+ #
138
+ # view.appendChild(xDiv);
139
+ # }
542
140
  #
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
141
+ # // Arrêter le chronomètre
142
+ # const endTime = performance.now();
143
+ # const timeTaken = endTime - startTime;
556
144
  #
145
+ # // Afficher le temps écoulé en console
146
+ # alert(`Temps écoulé pour créer les divs : ${timeTaken.toFixed(2)} ms`);
147
+ # }
557
148
  #
558
- # end
149
+ # // Ajouter un écouteur d'événements au div 'the_box'
150
+ # document.getElementById('the_box').addEventListener('click', createDivs);
151
+ # ``
559
152
  #
560
- # end
153
+ # ")
561
154
 
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()
155
+ new({particle: :merge})
156
+ a=box
157
+ c=box
158
+ d=a.merge(c)