atome 0.5.7.1.2 → 0.5.7.1.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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/atome.gemspec +2 -2
  4. data/documentation/deep learning/basic_infos.txt +1 -1
  5. data/lib/atome/extensions/atome.rb +57 -19
  6. data/lib/atome/genesis/atomes.rb +11 -0
  7. data/lib/atome/genesis/particles/event.rb +24 -2
  8. data/lib/atome/genesis/sparkle.rb +2 -1
  9. data/lib/atome/presets/atome.rb +5 -14
  10. data/lib/atome/utilities/utilities.rb +0 -10
  11. data/lib/atome/version.rb +1 -1
  12. data/lib/atome.rb +2 -1
  13. data/lib/atome_relative.rb +2 -1
  14. data/lib/molecules/intuition/tools.rb +344 -0
  15. data/lib/renderers/html/hierarchy.rb +2 -2
  16. data/lib/renderers/html/html.rb +52 -48
  17. data/lib/renderers/html/identity.rb +4 -1
  18. data/lib/renderers/html/utility.rb +1 -1
  19. data/vendor/assets/application/examples/above_below_before_after.rb +22 -0
  20. data/vendor/assets/application/examples/animation.rb +29 -1
  21. data/vendor/assets/application/examples/audio.rb +54 -0
  22. data/vendor/assets/application/examples/hypertext.rb +24 -3
  23. data/vendor/assets/application/examples/test.rb +1 -56
  24. data/vendor/assets/application/examples/tools.rb +7 -384
  25. data/vendor/assets/src/index.html +13 -6
  26. data/vendor/assets/src/index_opal.html +15 -7
  27. data/vendor/assets/src/index_server.html +19 -0
  28. data/vendor/assets/src/index_server_wasm.html +13 -6
  29. data/vendor/assets/src/index_wasm.html +19 -12
  30. data/vendor/assets/src/js/third_parties/webaudio-pianoroll.min.js +66 -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 +25 -18
  35. /data/lib/molecules/intuition/{utillities.rb → utilities.rb} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4a382b0c451af7a259820a14e61aadbf779d0ddba6a67a603ec3940a28d6f252
4
- data.tar.gz: a44e9004e18b867645ca3be9681d295997cce04fd7b4c13b8107b546b76e0e2e
3
+ metadata.gz: c05197d3eeae9cee5e96894387b264fa64b3f0436c513d03c9bee7edd7edc7aa
4
+ data.tar.gz: d21606ce307a9c85eca0207d95b502572bf287668c360228230d917672306f53
5
5
  SHA512:
6
- metadata.gz: 956973bed7a67e04f0ec7c2921602b1751afc5281f9869587596be81621eb4cf323f870183ae9dabc5fa9a476f7e67926f8255a65adc6c9daeacdf433dc7c494
7
- data.tar.gz: bf54e93e8ab7a82854f6da1a185c2926f7bef89222da5a80b28fedb24a052ec083b2cd6341754116e72f4fb5e10f55d9f67d24df45081d055606b04787a7f7c7
6
+ metadata.gz: 69e1cc8e30ca124fa5402bd30ea6cb302bbef0b7aa90cad60cbcf9c80cef49bfefc2dc1ba35551f5ecc8d604154fd62f7c21dc3ca6340902d1a6a2c390d18aae
7
+ data.tar.gz: 4a3b520343611c272ea18853bf5449af84e35adbc8153538b1c3a969dcbaaccbe60375ba08ac97eb70e27b8cdf57ba38d0eb1f1d8d5a9ac998d80832f4a44476
data/Gemfile CHANGED
@@ -12,3 +12,4 @@ gem 'faye-websocket'
12
12
  gem "minitest", "~> 5.0"
13
13
 
14
14
  gem 'rubocop', group: 'development', require: false
15
+ gem 'rubocop', group: 'development', require: false
data/atome.gemspec CHANGED
@@ -52,7 +52,7 @@ Gem::Specification.new do |spec|
52
52
  spec.require_paths = ['lib']
53
53
 
54
54
 
55
- spec.add_runtime_dependency 'artoo', '~> 1.8.2'
55
+ # spec.add_runtime_dependency 'artoo', '~> 1.8.2'
56
56
  # spec.add_runtime_dependency 'arduino_firmata', '~> 0.3'
57
57
  # spec.add_runtime_dependency 'eVe', '~> 0.1.0'
58
58
  spec.add_runtime_dependency 'eventmachine', '~> 1.2.7'
@@ -90,7 +90,7 @@ Gem::Specification.new do |spec|
90
90
  spec.add_runtime_dependency 'wdm', '>= 0.1.0' if Gem.win_platform?
91
91
 
92
92
  # patch because guard have bad dependency
93
- # spec.add_runtime_dependency 'pry', '>= 0.14.2'
93
+ spec.add_runtime_dependency 'pry', '>= 0.14.2'
94
94
 
95
95
  # Uncomment to register a new dependency of your gem
96
96
  # spec.add_dependency "example-gem", "~> 1.0"
@@ -13,7 +13,7 @@ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
13
13
  brew install openssl
14
14
  cargo install tauri-cli --force
15
15
 
16
- Install Homebew
16
+ Install Homebrew
17
17
 
18
18
  /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
19
19
 
@@ -614,11 +614,6 @@ class Object
614
614
  end
615
615
 
616
616
 
617
- JS.eval(<<~JS)
618
- window.preventDefaultAction = function(e) {
619
- e.preventDefault();
620
- }
621
- JS
622
617
 
623
618
  def touch_allow(allow)
624
619
  if allow
@@ -633,26 +628,67 @@ JS
633
628
 
634
629
  def allow_copy(allow)
635
630
  if allow
636
- # Rétablir la sélection et la copie de texte
631
+ # allow selection and text copy
637
632
  JS.eval(<<~JS)
638
- document.body.style.userSelect = 'auto'; // Permet la sélection de texte
639
- document.removeEventListener('copy', preventDefaultAction); // Permet la copie
640
- JS
633
+ document.body.style.userSelect = 'auto'; // allow text slectiion
634
+ document.removeEventListener('copy', preventDefaultAction); // allow copy
635
+ JS
641
636
  else
642
- # Bloquer la sélection et la copie de texte
637
+ # lock selection and text copy
643
638
  JS.eval(<<~JS)
644
- document.body.style.userSelect = 'none'; // Bloque la sélection de texte
645
- document.addEventListener('copy', preventDefaultAction); // Bloque la copie
646
- JS
639
+ document.body.style.userSelect = 'none'; // prevent text selection
640
+ document.addEventListener('copy', preventDefaultAction); // prevent copy
641
+ JS
642
+ end
643
+ end
644
+
645
+ def above(item, margin)
646
+ pos = item.to_px(:bottom) + item.height + margin
647
+ if item.display == :none
648
+ 33
649
+ else
650
+ pos
647
651
  end
648
652
  end
649
653
 
650
- # Définit la fonction preventDefaultAction dans un contexte global pour être utilisée par allow_copy
651
- JS.eval(<<~JS)
652
- window.preventDefaultAction = function(e) {
653
- e.preventDefault();
654
- }
655
- JS
654
+ def below(item, margin)
655
+ pos = item.to_px(:top) + item.to_px(:height) + margin
656
+ if item.display == :none
657
+ 0
658
+ else
659
+ pos
660
+ end
661
+
662
+ end
663
+
664
+ def after(item, margin)
665
+ left_f = if item.left.instance_of?(Integer)
666
+ item.left
667
+ else
668
+ item.to_px(:left)
669
+ end
670
+
671
+ width_f = if item.width.instance_of?(Integer)
672
+ item.width
673
+ else
674
+ item.to_px(:width)
675
+ end
676
+ pos = left_f + width_f + margin
677
+ if item.display == :none
678
+ 0
679
+ else
680
+ pos
681
+ end
682
+ end
683
+
684
+ def before(item, margin)
685
+ pos = item.to_px(:right) + item.width + margin
686
+ if item.display == :none
687
+ 0
688
+ else
689
+ pos
690
+ end
691
+ end
656
692
 
657
693
 
658
694
  end
@@ -697,6 +733,8 @@ class CssProxy
697
733
  bloc.call(parsed)
698
734
  end
699
735
 
736
+
737
+
700
738
  end
701
739
 
702
740
 
@@ -63,6 +63,17 @@ new({ atome: :raw })
63
63
  new({ atome: :shape })
64
64
  new({ atome: :code })
65
65
  new({ atome: :audio })
66
+ new({ sanitizer: :audio }) do |params|
67
+ unless params.instance_of? Hash
68
+ # TODO : we have to convert all image to png or maintain a database with extension
69
+ # FIXME : temporary patch that add .mp4 to the string if no extension is found
70
+ params = "#{params}.mp4" if params.to_s.split('.').length == 1
71
+
72
+ params = { path: "./medias/audios/#{params}" }
73
+ end
74
+ # TODO : the line below should get the value from default params Essentials
75
+ params
76
+ end
66
77
  new({ atome: :element })
67
78
  new({ sanitizer: :element }) do |params|
68
79
  default_params = { data: '' }
@@ -334,11 +334,33 @@ new({ particle: :overflow, category: :event, type: :boolean }) do |params, bloc|
334
334
  params
335
335
 
336
336
  end
337
- new({ particle: :animate, category: :event, type: :hash }) do |params|
337
+
338
+ class Atome
339
+ def animation_callback(proc_sub_category, value=nil)
340
+ # puts "#{p◊roc_sub_category}"
341
+ proc_found = @animate_code[proc_sub_category]
342
+ # puts proc_found
343
+ instance_exec(value,&proc_found) if proc_found.is_a?(Proc)
344
+ end
345
+ end
346
+
347
+ new({ particle: :animate, category: :event, type: :hash }) do |params, proc|
338
348
  if params.instance_of? Hash
339
349
  params = { from: 0, to: 300, duration: 1000 }.merge(params)
340
350
  else
341
351
  params = { from: 0, to: 300, duration: 1000 }
342
352
  end
343
- html.play_animation(params)
353
+ # @animate_code["#{params[:particle]}"] = proc
354
+ if params[:end]
355
+ @animate_code["#{params[:end]}_end"] = proc
356
+ else
357
+ @animate_code||= {}
358
+ @animate_code["#{params[:particle]}"] = proc
359
+ end
360
+
361
+ params
362
+ end
363
+
364
+ new ({ after: :animate }) do |params|
365
+ html.animate(params) unless params[:end] || params[:start]
344
366
  end
@@ -154,7 +154,8 @@ def atome_genesis
154
154
  end
155
155
  end
156
156
 
157
- def init_database # this method is call from JS (atome/communication) at WS connection
157
+ # this method is call from JS (atome/communication) at WS connection
158
+ def init_database
158
159
  # we init the db file eDen
159
160
  A.sync({ action: :init_db, data: { database: :eDen } }) do |data|
160
161
  Universe.database_ready = data[:data][:message] == 'database_ready'
@@ -16,13 +16,15 @@ class Atome
16
16
  # preset_params = {preset: atome_preset}
17
17
  basic_params[:type] = preset_params[:type] || :element
18
18
  # basic_params[:aid] = identity_generator(:a)
19
- basic_params[:id] = params[:id]|| identity_generator
19
+ # alert "common => #{params[:id]}"
20
+ # alert "basic_params #{basic_params[:id].class}"
21
+ basic_params[:id] = params[:id] || identity_generator
20
22
  basic_params[:renderers] = @renderers || preset_params[:renderers]
21
23
  essential_params = basic_params.merge(preset_params)
22
24
  #
23
25
  reordered_params = essential_params.reject { |key, _| params.has_key?(key) }
24
26
  params = reordered_params.merge(params)
25
- params[:id]=params[:id].to_sym
27
+ params[:id] = params[:id].to_sym
26
28
  # condition to handle color/shadow/paint atomes that shouldn't be attach to view
27
29
  if Universe.applicable_atomes.include?(atome_preset)
28
30
  unless params[:affect]
@@ -36,24 +38,13 @@ class Atome
36
38
  params[:attach] = params[:attach] || @id || :view
37
39
  end
38
40
  # we reorder the hash
39
- reorder_particles(params)
41
+ reorder_particles(params)
40
42
  end
41
43
 
42
44
  def preset_common(params, &bloc)
43
-
44
- ## if an atome with current id exist we update the ID in the params
45
- # params[:id] = "#{params[:id]}_#{Universe.atomes.length}" if grab(params[:id])
46
- # if Universe.atomes[params[:id]]
47
- # alert "atome found : #{ grab(params[:id])}"
48
- # grab(params[:id])
49
- # else
50
-
51
45
  Atome.new(params, &bloc)
52
- # end
53
46
  end
54
47
 
55
-
56
-
57
48
  # def box(params = {}, &bloc)
58
49
  # atome_preset = :box
59
50
  # params = atome_common(atome_preset, params)
@@ -350,18 +350,8 @@ class Atome
350
350
 
351
351
  def js_callback(id, particle, value, sub = nil)
352
352
  current_atome = grab(id)
353
- # # alert current_atome.instance_variable_get('@record_code')
354
353
  proc_found = current_atome.instance_variable_get("@#{particle}_code")[particle.to_sym]
355
- # proc_found= current_atome.instance_variable_get("@record_code")[:record]
356
- # # alert particle.class
357
- # # alert proc_found.class
358
- # proc_found.call
359
354
  instance_exec(value, &proc_found) if proc_found.is_a?(Proc)
360
- # # # puts "params to be exec #{id}, #{particle}, #{value}, #{sub}"
361
- # alpha= grab(:the_big_box)
362
- # proc_found= alpha.instance_variable_get("@record_code")[:record]
363
- # proc_found.call
364
-
365
355
  end
366
356
 
367
357
  # def callback(data)
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.2'
5
+ VERSION = '0.5.7.1.6'
6
6
  end
data/lib/atome.rb CHANGED
@@ -37,4 +37,5 @@ require 'atome/utilities/sanitizer'
37
37
  require 'atome/genesis/presets'
38
38
  require 'atome/genesis/sparkle'
39
39
  require 'molecules/init'
40
- require 'molecules/intuition/utillities'
40
+ require 'molecules/intuition/utilities'
41
+ require 'molecules/intuition/tools'
@@ -36,4 +36,5 @@ require_relative './atome/utilities/sanitizer'
36
36
  require_relative './atome/genesis/presets'
37
37
  require_relative './atome/genesis/sparkle'
38
38
  require_relative './molecules/init'
39
- require_relative './molecules/intuition/utillities'
39
+ require_relative './molecules/intuition/utilities'
40
+ require_relative './molecules/intuition/tools'
@@ -0,0 +1,344 @@
1
+ # frozen_string_literal: true
2
+
3
+
4
+
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
+ class << self
26
+ def init_intuition
27
+ Atome.start_click_analysis
28
+ root = Universe.tools_root
29
+ root.each_with_index do |root_tool, index|
30
+ tools_scheme = Universe.tools[root_tool]
31
+ A.build_tool({ name: root_tool, scheme: tools_scheme, index: index })
32
+ end
33
+ end
34
+
35
+ def selection
36
+ grab(Universe.current_user).selection.collect
37
+ end
38
+
39
+ def activate_click_analysis
40
+
41
+ # the condition below avoid touchdown analysis accumulation
42
+ unless @click_analysis_active
43
+ # this method analyse all object under the touchdown to find the first user objet and return it's id
44
+ @click_analysis = lambda { |native_event|
45
+ # the instance variable below check if we can apply tool (cf: if the atome we don't want to apply tool)
46
+ if Universe.allow_tool_operations
47
+ event = Native(native_event)
48
+ x = event[:clientX]
49
+ y = event[:clientY]
50
+ elements = JS.global[:document].elementsFromPoint(x, y)
51
+ elements.to_a.each do |atome_touched|
52
+ id_found = atome_touched[:id].to_s
53
+ atome_found = grab(id_found)
54
+ unless atome_found && atome_found.tag[:system]
55
+
56
+ # if atome_found
57
+ Universe.active_tools.each do |tool|
58
+ apply_tool(tool, atome_found, event)
59
+ end
60
+ break
61
+ end
62
+ end
63
+ else
64
+ Universe.allow_tool_operations = true
65
+ end
66
+ }
67
+ @click_analysis_active = true
68
+ end
69
+
70
+ end
71
+
72
+ def de_activate_click_analysis
73
+ @click_analysis = nil
74
+ @click_analysis_active = false
75
+ end
76
+
77
+ def start_click_analysis
78
+ @click_analysis_active = false
79
+ JS.global[:document].addEventListener('mouseup') do |native_event|
80
+ Atome.instance_exec(native_event, &@click_analysis) if @click_analysis.is_a?(Proc)
81
+ end
82
+ end
83
+
84
+ def alteration(current_tool, tool_actions, atome_touched, a_event)
85
+ if atome_touched
86
+ storage_allowed = Universe.allow_localstorage
87
+ action_found = tool_actions[:action]
88
+ pre = tool_actions[:pre]
89
+ post = tool_actions[:post]
90
+ params = { current_tool: current_tool, atome_touched: atome_touched, event: a_event }
91
+ action_found.each do |part, val|
92
+ Universe.allow_localstorage = false
93
+ #################################
94
+ touch_found = atome_touched.touch
95
+ touch_procs=atome_touched.instance_variable_get("@touch_code")
96
+ resize_found = atome_touched.resize
97
+ resize_procs=atome_touched.instance_variable_get("@resize_code")
98
+ current_tool.data[:prev_states][atome_touched] = {events: { touch: touch_found, resize: resize_found },
99
+ procs: {touch_code: touch_procs, resize_code: resize_procs } }
100
+ #################################
101
+ current_tool.instance_exec(params, &pre) if pre.is_a? Proc
102
+ Universe.allow_localstorage = storage_allowed
103
+ if current_tool.data[:allow_alteration]
104
+ atome_touched.send(part, val)
105
+ current_tool.data[:treated] << atome_touched
106
+ end
107
+ current_tool.instance_exec(params, &post) if post.is_a? Proc
108
+ end
109
+
110
+ end
111
+ end
112
+
113
+ def creation(current_tool, tool_actions, atome_touched, a_event)
114
+ # we store prev_local_storage prior to lock it to prevent unwanted logs
115
+ # prev_local_storage=Universe.allow_localstorage()
116
+ storage_allowed = Universe.allow_localstorage
117
+ Universe.allow_localstorage = false
118
+
119
+ action_found = tool_actions[:action]
120
+ pre = tool_actions[:pre]
121
+ post = tool_actions[:post]
122
+ params = { current_tool: current_tool, atome_touched: atome_touched, event: a_event }
123
+
124
+ action_found.each do |atome, particle|
125
+ current_tool.instance_exec(params, &pre) if pre.is_a? Proc
126
+ temp_val = particle.merge({ resize: true, drag: true, top: a_event[:pageY].to_i, left: a_event[:pageX].to_i })
127
+ if current_tool.data[:allow_creation]
128
+ # uncomment the line below if you want to attach to current atome
129
+ if atome_touched
130
+ new_atome = atome_touched.send(atome, temp_val)
131
+ else
132
+ new_atome = grab(:view).send(atome, temp_val)
133
+ end
134
+ # current_tool.data[:treated] << new_atome
135
+ current_tool.data[:created] << new_atome
136
+ params.delete(:atome_touched)
137
+ params[new_atome: new_atome]
138
+ Universe.allow_localstorage = [atome]
139
+ Universe.historicize(new_atome.aid, :write, atome, particle)
140
+ end
141
+
142
+ end
143
+ current_tool.instance_exec(params, &post) if post.is_a? Proc
144
+ # we restore prev_local_storage to allow logs of drag and resize ...
145
+ Universe.allow_localstorage = storage_allowed
146
+ end
147
+
148
+ def apply_tool(tool, atome_touched, a_event)
149
+ current_tool = grab(tool)
150
+ tool_actions = current_tool.data
151
+ method_found = tool_actions[:method]
152
+ unless method_found
153
+ method_found = :alteration
154
+ tool_actions[:action] = { noop: true }
155
+ current_tool.data = tool_actions
156
+ end
157
+
158
+ send(method_found, current_tool, tool_actions, atome_touched, a_event)
159
+ end
160
+
161
+ end
162
+
163
+ def noop(_p)
164
+ # this method is used by tools when no treatment is needed
165
+ end
166
+
167
+ def set_action_on_touch(&action)
168
+ @touch_action = action
169
+
170
+ end
171
+
172
+ def remove_get_atome_on_touch
173
+ @touch_action = nil
174
+ end
175
+
176
+ def build_tool(params)
177
+ label = params[:name]
178
+ tool_name = "#{params[:name]}_tool"
179
+ index = params[:index]
180
+ orientation_wanted = :sn
181
+ tool_scheme = params[:scheme]
182
+ color({ id: :active_tool_col, alpha: 1, red: 1, green: 1, blue: 1 })
183
+ color({ id: :inactive_tool_col, alpha: 0.6 })
184
+ grab(:intuition).storage[:tool_open] ||= []
185
+ grab(:intuition).storage[:tool_open] << tool_name
186
+ size = grab(:toolbox_style).data[:size]
187
+ smooth = grab(:toolbox_style).data[:smooth]
188
+ case orientation_wanted
189
+ when :sn
190
+ top = :auto
191
+ bottom = index * (size + 3)
192
+ left = 0
193
+ right = :auto
194
+ when :ns
195
+ when :ew
196
+ when :we
197
+ else
198
+ #
199
+ end
200
+
201
+ # tool creation
202
+ if tool_scheme[:creation]
203
+ action = tool_scheme[:creation]
204
+ method = :creation
205
+ end
206
+ if tool_scheme[:alteration]
207
+ action = tool_scheme[:alteration]
208
+ method = :alteration
209
+ end
210
+
211
+ tool = grab(:intuition).box({ id: tool_name,
212
+ tag: { system: true },
213
+ # orientation: orientation_wanted,
214
+ top: top,
215
+ bottom: bottom,
216
+ left: left,
217
+ right: right,
218
+ width: size,
219
+ height: size,
220
+ smooth: smooth,
221
+ apply: [:tool_inactive_color, :tool_box_border, :tool_shade],
222
+ state: :closed,
223
+ data: { method: method,
224
+ action: action,
225
+ allow_alteration: true,
226
+ allow_creation: true,
227
+ # activation: tool_scheme[:activation],
228
+ # inactivation: tool_scheme[:inactivation], zone: tool_scheme[:zone],
229
+ post: tool_scheme[:post],
230
+ pre: tool_scheme[:pre],
231
+ }
232
+
233
+ })
234
+ tool.vector({ tag: { system: true }, left: 9, top: :auto, bottom: 9, width: 18, height: 18, id: "#{tool_name}_icon" })
235
+ tool.text({ tag: { system: true }, data: label, component: { size: 9 }, color: :grey, id: "#{tool_name}_label" })
236
+ code_for_zone = tool_scheme[:zone]
237
+ tool.instance_exec(tool, &code_for_zone) if code_for_zone.is_a? Proc
238
+ tool.touch(true) do
239
+ # we add all specific tool actions to @tools_actions_to_exec hash
240
+ # we set allow_tool_operations to false to ignore tool operation when clicking on a tool
241
+ Universe.allow_tool_operations = false
242
+ # we create the creation_layer if not already exist
243
+ tick(tool_name)
244
+ # active code exec
245
+ if tick[tool_name] == 1 # first click
246
+ events_allow = [:top, :left, :right, :bottom, :width, :height]
247
+ alterations = tool_scheme[:alteration] ? tool_scheme[:alteration].keys : []
248
+ creations = tool_scheme[:creation] ? tool_scheme[:creation].keys : []
249
+ prev_auth = Universe.allow_localstorage ||= []
250
+ storage_allowed = events_allow.concat(alterations).concat(creations).concat(prev_auth).uniq
251
+ Universe.allow_localstorage = storage_allowed
252
+ # we set edit mode to true (this allow to prevent user atome to respond from click)
253
+ Universe.edit_mode = true
254
+ Universe.active_tools << tool_name
255
+ # init the tool
256
+ tool.data[:treated] = []
257
+ tool.data[:created] = []
258
+ tool.data[:prev_states] = {}
259
+ # generic behavior
260
+ tool.apply(:active_tool_col)
261
+ # activation code
262
+ activation_code = tool_scheme[:activation]
263
+ tool.instance_exec(&activation_code) if activation_code.is_a? Proc
264
+ # below we the particles of selected atomes to feed tools values
265
+ # possibility 1 (pipette like):
266
+ # now we get the values from selected atomes
267
+ Atome.selection.each do |atome_id_to_treat|
268
+ tool.data[:action].each do |particle_req, value_f|
269
+ unless Universe.atome_preset
270
+ value_found = grab(atome_id_to_treat).send(particle_req)
271
+ if value_found
272
+ tool.data[:action][particle_req] = value_found
273
+ else
274
+ end
275
+ end
276
+ end
277
+ end
278
+ # possibility 2 (immediate apply):
279
+ allow_creation = tool.data[:allow_creation]
280
+ allow_alteration = tool.data[:allow_alteration]
281
+ Atome.selection.each do |atome_id_to_treat|
282
+ atome_found = grab(atome_id_to_treat)
283
+ event = { pageX: 0, pageY: 0, clientX: 0, clientY: 0 }
284
+ Atome.apply_tool(tool_name, atome_found, event)
285
+ end unless tool_name.to_sym == :select_tool || !allow_creation || !allow_alteration
286
+
287
+ # activate tool analysis test
288
+ Atome.activate_click_analysis
289
+ else
290
+ Universe.allow_localstorage = false
291
+ # when closing delete tools action from tool_actions_to_exec
292
+ Universe.active_tools.delete(tool_name)
293
+ # we check if all tools are inactive if so we set edit_mode to false
294
+ if Universe.active_tools.length == 0
295
+ Atome.de_activate_click_analysis
296
+ Universe.edit_mode = false
297
+ end
298
+
299
+ inactivation_code = tool_scheme[:inactivation]
300
+ tool.instance_exec(tool.data, &inactivation_code) if inactivation_code.is_a? Proc
301
+ # end if tool_content && tool_content[:inactive]
302
+
303
+ # generic behavior
304
+ # we remove touch and resize binding on newly created atomes
305
+ tool.apply(:inactive_tool_col)
306
+ tool.data[:created].each do |new_atome|
307
+ new_atome.drag(false)
308
+ new_atome.resize(:remove)
309
+ end
310
+ ################################
311
+ # we restore prev touch and resize
312
+ tool.data[:prev_states].each do |atome_f, prev_par|
313
+ puts prev_par
314
+ # params[:events].each do |part_f, val_f|
315
+ # # alert "@#{part_f}, #{part_f}"
316
+ # atome_f.send(part_f, val_f)
317
+ # end
318
+ # alert "--> params : #{params[:events]}"
319
+ # alert "--> procs : #{params[:procs][params[:events]]}"
320
+ # atome_f.touch(false)
321
+ # atome_f.touch(true) do
322
+ # alert :kool
323
+ # end
324
+ # alert params[:procs]
325
+ # params[:procs].each do |var_n, procs_f|
326
+ # # procs_f.each do |action_f, proc|
327
+ # # # puts "#{var_n}==> #{action_f}, #{proc}"
328
+ # # end
329
+ # puts "==> #{var_n}, #{proc_f}"
330
+ # # atome_f.instance_variable_set("@#{var_n}", proc_f)
331
+ # end
332
+ # atome_f.touch(false)
333
+ # alert "#{atome_f.touch} : #{atome_f.instance_variable_get("@touch_code")}"
334
+ end
335
+
336
+ # atome_f.touch(touch_found)
337
+ # atome_f.resize(resize_found)
338
+ # inactivation code
339
+ #################################
340
+ tick[tool_name] = 0
341
+ end
342
+ end
343
+ end
344
+ end
@@ -4,9 +4,10 @@ new({ renderer: :html, method: :attach, type: :string }) do |parent_found, _user
4
4
  html.append_to(parent_found)
5
5
  end
6
6
 
7
+
7
8
  new({ renderer: :html, method: :apply, type: :string }) do |parent_found, _user_proc|
8
9
 
9
- # TODO : factorise code below between text and shape, especially shadow as code is written twice and identical
10
+ # TODO : factorise code below between text and shape, especially shadow as code is written twice and identical
10
11
  case parent_found.type
11
12
  when :shadow
12
13
  shadows_to_apply = { filter: [], boxShadow: [] }
@@ -32,7 +33,6 @@ new({ renderer: :html, method: :apply, type: :string }) do |parent_found, _user_
32
33
  html.style("boxShadow", box_shadow)
33
34
  html.style("filter", drop_shadow)
34
35
  when :color
35
-
36
36
  red = parent_found.red * 255
37
37
  green = parent_found.green * 255
38
38
  blue = parent_found.blue * 255