atome 0.5.6.7.8 → 0.5.6.8.3

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: 65f6cf64a7ecd0b856f3a84bbd519314197caa2745a1150ba9b2ed8a124c7e87
4
- data.tar.gz: 0d8a07920c05601ad82a3e6abaf9748316b190cfbec203ae0bd1d8045da44efc
3
+ metadata.gz: 56128962742a3c148f7ce1187577af8438466642a81d1b227e0c3ab66275e322
4
+ data.tar.gz: aada78b1931101f52fe14e414e0396e9e15eb03754005d0836b1198f1b0091ac
5
5
  SHA512:
6
- metadata.gz: 7f8e08c7ecd5716e16a798637ba60309537948906d370c35f8594267d43ec6f42fb3b648fa0c544c4d8d09790589c24bfa2725f2702c269727790ce79ec0a17a
7
- data.tar.gz: dbb3a6e0642b2908e6acf1634dd2d06fe2d263609cdb5b2b5f49d87b466eda7f64a5ffeae09336b8cdd22622f270045b7c0b9c8f2125531f6c0fa37dbda86c7f
6
+ metadata.gz: 817bee9de2868ed5983838b98a6b650423f04dbf4d5f35ceb20c2315b6ae54c991465e31c2e10ee74f8300d963e4106e53d036f1ecbd2ef10d668783e3194cc9
7
+ data.tar.gz: 6f075107a7e5b85f33ae0d0e757025a0702447365d7ffdb048b65a4f89138ac3d8e95acfb53b795b9a9743b2229692bae3edf32f17597a5bdc5e578dc26cede5
data/lib/atome/atome.rb CHANGED
@@ -5,6 +5,8 @@
5
5
  # Atome.instance_variable_set('@initialized',{})
6
6
  class Atome
7
7
  include Essentials
8
+ # controller_proc is used to stack multiple procs from native controller
9
+ attr_accessor :controller_proc
8
10
 
9
11
  def aid(_v = nil)
10
12
  @aid
@@ -36,6 +38,7 @@ class Atome
36
38
  # @language = :english
37
39
  # @callback = {}
38
40
  @tag = {}
41
+ @behavior = {}
39
42
  @selected = false
40
43
  #@metrics = {}
41
44
  @unit = {}
@@ -44,7 +47,7 @@ class Atome
44
47
  @int8 = {}
45
48
  @css = {}
46
49
  @aid = identity_generator
47
-
50
+ @controller_proc=[]
48
51
  @id = new_atome[:id] || @aid
49
52
  Universe.atomes.each do |_aid,atome_f|
50
53
  # we affect the already existing atome to target
@@ -51,6 +51,10 @@ module ObjectExtension
51
51
  # alert option
52
52
  # bloc.call(option)
53
53
  # end
54
+ elsif params.key?(:molecule)
55
+ molecule=params[:molecule]
56
+ Genesis.build_molecule(molecule, &bloc)
57
+ Universe.add_to_molecule_list(molecule)
54
58
  end
55
59
  super if defined?(super)
56
60
  end
@@ -156,6 +160,10 @@ class Object
156
160
  grab(:view).box(params, &proc)
157
161
  end
158
162
 
163
+ # def intuition(params = {}, &proc)
164
+ # grab(:view).intuition(params, &proc)
165
+ # end
166
+
159
167
  def circle(params = {}, &proc)
160
168
  grab(:view).circle(params, &proc)
161
169
  end
@@ -661,6 +669,11 @@ class CssProxy
661
669
  @current_atome.instance_variable_get('@css').to_s
662
670
  end
663
671
 
672
+ def receptor(msg, &bloc)
673
+ parsed = JSON.parse(msg)
674
+ bloc.call(parsed)
675
+ end
676
+
664
677
  end
665
678
 
666
679
 
@@ -50,6 +50,12 @@ class Genesis
50
50
  new_atome(atome_name, &atome_proc)
51
51
 
52
52
  end
53
+ def build_molecule(molecule_name, &molecule_proc)
54
+ new_molecule(molecule_name, &molecule_proc)
55
+ end
56
+
57
+
58
+
53
59
 
54
60
  def auto_render_generator(element)
55
61
  Universe.renderer_list.each do |render_engine|
@@ -193,6 +199,74 @@ class Genesis
193
199
 
194
200
  end
195
201
 
202
+ def new_molecule(molecule, &method_proc)
203
+
204
+ Molecule.define_method molecule do |params, &user_proc|
205
+ m= instance_exec(params, user_proc, &method_proc) if method_proc.is_a?(Proc)
206
+ m
207
+ end
208
+
209
+
210
+
211
+ # # the method define below is the slowest but params are analysed and sanitized
212
+ # Atome.define_method element do |params = nil, &user_proc|
213
+ # instance_exec(params, user_proc, &method_proc) if method_proc.is_a?(Proc)
214
+ # if params
215
+ # params = atome_sanitizer(element, params, &user_proc)
216
+ # atome_processor(element, params, &user_proc)
217
+ # else
218
+ # # when no params passed whe assume teh user want a getter,
219
+ # # as getter should give us all atome of a given within the atome
220
+ # # ex : puts a.shape => return all atome with the type 'shape' in this atome
221
+ # collected_atomes = []
222
+ # # attached.each do |attached_atome|
223
+ # # collected_atomes << attached_atome if grab(attached_atome).type.to_sym == element.to_sym
224
+ # # end
225
+ # # TODO : add category for atome( material/physical vs modifier : color, shadow, .. vs shape, image ..)
226
+ # # then add condition same things fo code in presets/atome atome_common
227
+ # if %i[color shadow paint border].include?(element)
228
+ # # we do the same for apply to be able to retrieve 'color' and other atome that apply instead of being attached
229
+ # @apply.each do |attached_atome|
230
+ # collected_atomes << attached_atome if grab(attached_atome).type.to_sym == element.to_sym
231
+ # end
232
+ # else
233
+ # # collected_atomes = attached
234
+ # # if @attached
235
+ # attached.each do |attached_atome|
236
+ # collected_atomes << attached_atome if grab(attached_atome).type.to_sym == element.to_sym
237
+ # end
238
+ # # end
239
+ #
240
+ # end
241
+ # # TODO/ FIXME : potential problem with group here"
242
+ # # group({ collect: collected_atomes })
243
+ # collected_atomes
244
+ # end
245
+ # end
246
+ #
247
+ # # the method define below is the fastest params are passed directly
248
+ # Atome.define_method "set_#{element}" do |params, &user_proc|
249
+ # # we generate the corresponding module here:
250
+ # # Object.const_set(element, Module.new)
251
+ # # we add the newly created atome to the list of "child in it's category, eg if it's a shape we add the new atome
252
+ # # to the shape particles list : @!atome[:shape] << params[:id]
253
+ # # Atome.new(params, &user_proc)
254
+ #
255
+ # if Universe.atomes[params[:id]]
256
+ # # if atome id already exist we grab the previous one
257
+ # # this prevent the creation of new atome if the atome already exist
258
+ # previous_atome= grab(params[:id])
259
+ # # now we must re-affect affected atomes
260
+ # previous_atome.affect(params[:affect])
261
+ # previous_atome
262
+ # else
263
+ # Atome.new(params, &user_proc)
264
+ # end
265
+ # # Now we return the newly created atome instead of the current atome that is the parent cf: b=box; c=b.circle
266
+ # end
267
+
268
+ end
269
+
196
270
  end
197
271
 
198
272
  end
@@ -20,9 +20,7 @@ new({ particle: :message, category: :communication, type: :hash }) do |params, b
20
20
 
21
21
  end
22
22
 
23
- new({ particle: :controller, category: :communication, type: :hash }) do |msg|
24
- Atome.controller_sender(msg)
25
- end
23
+
26
24
 
27
25
  new({ particle: :int8, category: :communication, type: :int })
28
26
 
@@ -30,4 +28,16 @@ new({ particle: :language, category: :communication, type: :string }) do |params
30
28
  @data = int8[params]
31
29
  params
32
30
  end
31
+ # method below are used for communication with ntaive core
32
+ def receptor(msg)
33
+ parsed = JSON.parse(msg)
34
+ A.controller_code[:controller].call(parsed)
35
+ end
33
36
 
37
+ new({ particle: :controller, category: :communication, type: :hash }) do |msg|
38
+ Atome.controller_sender(msg)
39
+ end
40
+
41
+ new({post: :controller}) do |_p, bloc|
42
+ @controller_proc << bloc
43
+ end
@@ -134,4 +134,13 @@ new({particle: :inside, render: false})
134
134
  new({ initialized: :inside }) do |params, &user_proc|
135
135
  render(:inside, params, &user_proc)
136
136
  end
137
- new({ particle: :margin })
137
+ new({ particle: :margin })
138
+
139
+ new({ particle: :value }) do |val|
140
+ pro_f = behavior[:value]
141
+ instance_exec(val, &pro_f) if pro_f.is_a?(Proc)
142
+ val
143
+ end
144
+
145
+
146
+ new({ particle: :behavior })
@@ -234,4 +234,14 @@ new ({ particle: :css, category: :utility, type: :string })
234
234
 
235
235
  new({ read: :css }) do
236
236
  CssProxy.new(js, nil, self)
237
- end
237
+ end
238
+
239
+ new({particle: :holder, category: :utility, type: :atome})
240
+
241
+ # this particle is mainly used in conjunction with alternate particle as a 'lambda' to alternate methods
242
+ new({particle: :executor, category: :utility, type: :hash}) do |params|
243
+ params.each do |method, opt|
244
+ send(method, opt)
245
+ end
246
+ params
247
+ end
@@ -6,6 +6,7 @@ class Universe
6
6
  @atomes = {}
7
7
  @atomes_ids = {}
8
8
  @atome_list = []
9
+ @molecule_list = []
9
10
  @particle_list = {}
10
11
  @renderer_list = %i[html browser headless server log]
11
12
  @sanitizers = {}
@@ -24,7 +25,7 @@ class Universe
24
25
  @database_ready = false
25
26
  # @historicize=false
26
27
  class << self
27
- attr_reader :atomes, :atomes_ids, :renderer_list, :atome_list, :particle_list, :classes, :counter, :atomes_specificities
28
+ attr_reader :atomes, :atomes_ids, :renderer_list,:molecule_list, :atome_list, :particle_list, :classes, :counter, :atomes_specificities
28
29
  attr_accessor :connected,:allow_sync, :allow_localstorage, :database_ready
29
30
 
30
31
  def messages
@@ -68,7 +69,8 @@ class Universe
68
69
  end
69
70
 
70
71
  def add_to_particle_list(particle = nil, type, category)
71
- instance_variable_get('@particle_list')[particle] = { type: type, category: category }
72
+ # instance_variable_get('@particle_list')[particle] = { type: type, category: category }
73
+ @particle_list[particle] = { type: type, category: category }
72
74
  end
73
75
 
74
76
  def add_atomes_specificities atome_type_to_add
@@ -87,16 +89,22 @@ class Universe
87
89
 
88
90
  def add_sanitizer_method(method_name, &method_proc)
89
91
  # this method is used to add sanitizer methods
90
- instance_variable_get('@sanitizers').merge!({ method_name => method_proc })
92
+ # instance_variable_get('@sanitizers').merge!({ method_name => method_proc })
93
+ @sanitizers.merge!({ method_name => method_proc })
91
94
  end
92
95
 
93
96
  def get_sanitizer_method(method_name)
94
97
  # this method is used to add optional methods
95
- instance_variable_get('@sanitizers')[method_name]
98
+ # instance_variable_get('@sanitizers')[method_name]
99
+ @sanitizers[method_name]
96
100
  end
97
101
 
98
102
  def add_to_atome_list(atome)
99
- instance_variable_get('@atome_list').push(atome)
103
+ @atome_list.push(atome)
104
+ end
105
+
106
+ def add_to_molecule_list(molecule)
107
+ @molecule_list.push(molecule)
100
108
  end
101
109
 
102
110
  def add_to_atomes(aid, atome)
@@ -54,12 +54,17 @@ class Atome
54
54
  end
55
55
 
56
56
  def box(params = {}, &bloc)
57
-
58
57
  atome_preset = :box
59
58
  params = atome_common(atome_preset, params)
60
59
  preset_common(params, &bloc)
61
60
  end
62
61
 
62
+ # def intuition(params = {}, &bloc)
63
+ # atome_preset = :intuition
64
+ # params = atome_common(atome_preset, params)
65
+ # preset_common(params, &bloc)
66
+ # end
67
+
63
68
  def circle(params = {}, &bloc)
64
69
  atome_preset = :circle
65
70
  params = atome_common(atome_preset, params)
@@ -25,6 +25,9 @@ module Essentials
25
25
  box: { type: :shape, width: 39, height: 39,
26
26
  apply: [:box_color],
27
27
  left: 0, top: 0, preset: :box },
28
+ # intuition: { type: :intuition, width: 39, height: 39,
29
+ # apply: [:box_color],
30
+ # left: 0, top: 0, preset: :intuition },
28
31
  vector: { type: :vector, width: 39, height: 39,
29
32
  left: 0, top: 0, preset: :vector, definition: corp },
30
33
  circle: { type: :shape, width: 39, height: 39, smooth: '100%',
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.6.7.8'
5
+ VERSION = '0.5.6.8.3'
6
6
  end
@@ -1,78 +1,269 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Molecule
4
- def slider(params, &bloc)
5
- attach_to = params[:attach] || :view
6
- color_found = params[:color] ||= :gray
7
- default_slider_particles = { color: color_found, width: 333, height: 33, left: 0, top: 0, smooth: 9 }
8
- default_cursor_particles = { color: color_found, width: 29, height: 29, left: 0, smooth: '100%' }
9
- cursor_found = params.delete(:cursor)
10
- cursor_particle = default_cursor_particles.merge(cursor_found)
11
- slider_particle = default_slider_particles.merge(params)
12
- slider = grab(attach_to).box(slider_particle)
13
- slider.shadow({
14
- id: :s2,
15
- left: 3, top: 3, blur: 9,
16
- invert: true,
17
- red: 0, green: 0, blue: 0, alpha: 0.7
18
- })
19
- cursor_top = (slider_particle[:height] - cursor_particle[:height]) / 2.0
20
- cursor = slider.box(cursor_particle)
21
- bloc.call(cursor_particle[:left])
22
- cursor.top(cursor_top)
23
- cursor.shadow({
24
- id: :s4,
25
- left: 1, top: 1, blur: 3,
26
- option: :natural,
27
- red: 0, green: 0, blue: 0, alpha: 0.6
28
- })
29
- cursor.drag({ restrict: { max: { left: slider_particle[:width] - cursor_particle[:width], top: cursor_top }, min: { top: cursor_top } } }) do |_event|
30
- value = cursor.left.to_f / (slider_particle[:width] - cursor_particle[:width]) * 100
31
- bloc.call(value)
3
+ new(molecule: :input) do |params, bloc|
4
+ params[:height] ||= 15
5
+ params[:width] ||= 222
6
+ trigger = params.delete(:trigger)
7
+ trigger ||= :return
8
+ limit = params.delete(:limit)
9
+ limit ||= 15
10
+ back_col = params.delete(:back)
11
+ back_col ||= :grey
12
+ text_col = params.delete(:text)
13
+ text_col ||= :black
14
+ default_text = params.delete(:default)
15
+ default_text ||= :input
16
+ default_parent = if self.instance_of?(Atome)
17
+ id
18
+ else
19
+ :view
20
+ end
21
+ attach_to = params[:attach] || default_parent
22
+ renderer_found = grab(attach_to).renderers
23
+ input_back = Atome.new(
24
+ { renderers: renderer_found, type: :shape, color: back_col,
25
+ left: 0, top: 0, data: '', attach: attach_to,
26
+ smooth: 6, overflow: :hidden,
27
+ })
28
+
29
+ text_input = Atome.new(
30
+ { renderers: [:html], type: :text, color: text_col, component: { size: params[:height] },
31
+ data: default_text, left: params[:height] * 20 / 100, top: 0, edit: true, attach: input_back.id, height: params[:height],
32
+ position: :absolute
33
+ }
34
+ )
35
+
36
+ text_input.touch(:down) do
37
+ text_input.edit(true)
38
+ end
39
+
40
+ text_input.keyboard(:down) do |native_event|
41
+ # text_input.component({ selected: { color: :red, text: :red } })
42
+
43
+ event = Native(native_event)
44
+ if event[:keyCode].to_s == '8' || event[:keyCode].to_s == '46'
45
+ # always allow
46
+ elsif event[:keyCode].to_s == '13'
47
+ # we prevent the input
48
+ if trigger == :return
49
+ bloc.call(text_input.data)
50
+ end
51
+ text_input.edit(false)
52
+ event.preventDefault()
53
+ elsif text_input.data.length > limit
54
+ event.preventDefault()
55
+ end
56
+ if trigger == :down
57
+ bloc.call(text_input.data)
32
58
  end
33
- slider
34
59
  end
35
60
 
36
- def list(params)
37
- styles_found = params.delete(:styles)
38
- element = params.delete(:element)
39
- listing = params.delete(:listing)
40
-
41
- styles_found ||= {
42
- width: 99,
43
- height: 33,
44
- margin: 6,
45
- shadow: { blur: 9, left: 3, top: 3, id: :cell_shadow, red: 0, green: 0, blue: 0, alpha: 0.6 },
46
- left: 0,
47
- color: :yellowgreen
48
- }
49
- element ||= { width: 33,
50
- height: 33,
51
- left: :center,
52
- top: :center,
53
- color: :orange,
54
- type: :text }
55
- unless params[:width]
56
- params[:width] = styles_found[:width]
61
+ text_input.keyboard(:up) do |native_event|
62
+ input_back.data = text_input.data
63
+ if trigger == :up
64
+ bloc.call(text_input.data)
65
+ end
66
+ end
67
+ params.each do |part_f, val_f|
68
+ input_back.send(part_f, val_f)
69
+ end
70
+ input_back.holder(text_input)
71
+ input_back
72
+ end
73
+ new(molecule: :list) do |params, _bloc|
74
+
75
+ styles_found = params.delete(:styles)
76
+ element = params.delete(:element)
77
+ listing = params.delete(:listing)
78
+
79
+ styles_found ||= {
80
+ width: 99,
81
+ height: 33,
82
+ margin: 6,
83
+ shadow: { blur: 9, left: 3, top: 3, id: :cell_shadow, red: 0, green: 0, blue: 0, alpha: 0.6 },
84
+ left: 0,
85
+ color: :yellowgreen
86
+ }
87
+ element ||= { width: 33,
88
+ height: 33,
89
+ left: :center,
90
+ top: :center,
91
+ color: :orange,
92
+ type: :text }
93
+ unless params[:width]
94
+ params[:width] = styles_found[:width]
95
+ end
96
+ unless element[:width]
97
+ element[:width] = styles_found[width]
98
+ end
99
+ margin = styles_found[:margin]
100
+ height_found = styles_found[:height]
101
+
102
+ # lets create the listing container
103
+ default_parent = if self.instance_of?(Atome)
104
+ id
105
+ else
106
+ :view
107
+ end
108
+ attach_to = params[:attach] || default_parent
109
+ renderer_found = grab(attach_to).renderers
110
+ list = Atome.new({ renderers: renderer_found, type: :shape, color: { alpha: 0 }, attach: attach_to }.merge(params))
111
+ # Atome.new(
112
+ # { renderers: [:html], type: :shape, attach: :view, color: back_col,
113
+ # left: 0, top: 0, data: '', attach: attach_to,
114
+ # smooth: 6, overflow: :hidden,
115
+ # })
116
+ # now the listing
117
+ listing.each_with_index do |data, index|
118
+ # let's create the container
119
+ new_atome = { renderers: renderer_found, attach: list.id }.merge(styles_found).merge({ type: :shape })
120
+ el = Atome.new(new_atome)
121
+ el.top((height_found + margin) * index)
122
+ # now the content
123
+ Atome.new({ renderers: renderer_found, attach: el.id }.merge(element).merge(data))
124
+
125
+ end
126
+ list
127
+ end
128
+ new({ molecule: :slider }) do |params, bloc|
129
+
130
+ default_value = params[:value] ||= 0
131
+ orientation = params.delete(:orientation) || :horizontal
132
+ range_found = params.delete(:range)
133
+ min_value = params.delete(:min) || 0
134
+ max_value = params.delete(:max) || 100
135
+ color_found = params[:color] ||= :gray
136
+ default_smooth = 9
137
+ default_slider_particles = { color: color_found, width: 333, height: 33, left: 0, top: 0, smooth: default_smooth }
138
+ default_cursor_particles = { color: color_found, width: 29, height: 29, left: 0, smooth: '100%' }
139
+ cursor_found = params.delete(:cursor)
140
+ slider_particle = default_slider_particles.merge(params)
141
+ slider = box(slider_particle)
142
+
143
+ slider_shadow = slider.shadow({
144
+ id: :s2,
145
+ left: 3, top: 3, blur: 9,
146
+ invert: true,
147
+ red: 0, green: 0, blue: 0, alpha: 0.7
148
+ })
149
+
150
+ range = slider.box({ id: "#{slider.id}_range", top: :auto, bottom: 0 })
151
+
152
+ if range_found
153
+ range.apply(slider_shadow.id,)
154
+ range_found.each do |part, val|
155
+ range.send(part, val)
57
156
  end
58
- unless element[:width]
59
- element[:width] = styles_found[width]
157
+ else
158
+ range.color({ alpha: 0 })
159
+ end
160
+ cursor_particle = default_cursor_particles.merge(cursor_found).merge({ id: "#{slider.id}_cursor" })
161
+ cursor = slider.box(cursor_particle)
162
+ cursor_left = (slider_particle[:width] - cursor_particle[:width]) / 2.0
163
+ cursor_top = (slider_particle[:height] - cursor_particle[:height]) / 2.0
164
+
165
+ my_behavior = lambda() do |new_value|
166
+ if orientation == :vertical
167
+ if cursor.width < slider.width
168
+ range.width(cursor.width)
169
+ range.left(cursor_left)
170
+ else
171
+ range.width(slider.width)
172
+ range.smooth(default_smooth)
173
+ end
174
+ cursor_top_initial = ((max_value - new_value).to_f / (max_value - min_value)) * (slider_particle[:height] - cursor_particle[:height])
175
+ bloc.call(new_value)
176
+ slider.instance_variable_set('@value',new_value)
177
+ cursor.top(cursor_top_initial)
178
+ cursor.left(cursor_left)
179
+ range.height((slider.height - cursor.top) - cursor.height / 2)
180
+ else
181
+ if cursor.height < slider.height
182
+ range.height(cursor.height)
183
+ range.top(cursor_top)
184
+ else
185
+ range.height(slider.height)
186
+ range.smooth(default_smooth)
187
+ end
188
+ cursor_left_initial = ((new_value - min_value).to_f / (max_value - min_value)) * (slider_particle[:width] - cursor_particle[:width])
189
+ bloc.call(new_value)
190
+ slider.instance_variable_set('@value',new_value)
191
+ cursor.left(cursor_left_initial)
192
+ cursor.top(cursor_top)
193
+ range.width(cursor.left + cursor.width / 2)
60
194
  end
61
- margin = styles_found[:margin]
62
- height_found = styles_found[:height]
63
- renderer_found = renderers
64
- # lets create the listing container
65
- list = box({ attach: id, color: { alpha: 0 } }.merge(params))
66
- # now the listing
67
- listing.each_with_index do |data, index|
68
- # let's create the container
69
- new_atome = { renderers: renderer_found, attach: list.id }.merge(styles_found).merge({ type: :shape })
70
- el = Atome.new(new_atome)
71
- el.top((height_found + margin) * index)
72
- # now the content
73
- Atome.new({ renderers: renderer_found, attach: el.id }.merge(element).merge(data))
195
+ end
196
+ slider.behavior({ value: my_behavior })
74
197
 
198
+ update_value = lambda do |cursor_position, cursor_size, slider_size, orientation|
199
+ effective_slider_size = slider_size - cursor_size
200
+ if orientation == :vertical
201
+ percentage = 1.0 - (cursor_position.to_f / effective_slider_size)
202
+ else
203
+ percentage = cursor_position.to_f / effective_slider_size
75
204
  end
76
- list
205
+ value_range = max_value - min_value
206
+ calculated_value = min_value + (value_range * percentage).round
207
+ calculated_value.clamp(min_value, max_value)
77
208
  end
209
+
210
+ if orientation == :vertical
211
+ if cursor.width < slider.width
212
+ range.width(cursor.width)
213
+ range.left(cursor_left)
214
+ else
215
+ range.width(slider.width)
216
+ range.smooth(default_smooth)
217
+ end
218
+
219
+ cursor_top_initial = ((max_value - default_value).to_f / (max_value - min_value)) * (slider_particle[:height] - cursor_particle[:height])
220
+ bloc.call(default_value)
221
+ cursor.top(cursor_top_initial)
222
+ cursor.left(cursor_left)
223
+ range.height((slider.height - cursor.top) - cursor.height / 2)
224
+ # now the event
225
+ cursor.drag({ restrict: { max: { top: slider_particle[:height] - cursor_particle[:height], left: cursor_left }, min: { left: cursor_left } } }) do |event|
226
+ value = update_value.call(cursor.top, cursor_particle[:height], slider_particle[:height], orientation)
227
+ range.height((slider.height - cursor.top) - cursor.height / 2)
228
+ bloc.call(value)
229
+ slider.instance_variable_set('@value',value)
230
+ end
231
+
232
+ else
233
+
234
+ if cursor.height < slider.height
235
+ range.height(cursor.height)
236
+ range.top(cursor_top)
237
+ else
238
+ range.height(slider.height)
239
+ range.smooth(default_smooth)
240
+ end
241
+
242
+ cursor_left_initial = ((default_value - min_value).to_f / (max_value - min_value)) * (slider_particle[:width] - cursor_particle[:width])
243
+ bloc.call(default_value)
244
+ cursor.left(cursor_left_initial)
245
+ cursor.top(cursor_top)
246
+ range.width(cursor.left + cursor.width / 2)
247
+
248
+ # now the event
249
+ cursor.drag({ restrict: { max: { left: slider_particle[:width] - cursor_particle[:width], top: cursor_top }, min: { top: cursor_top } } }) do |event|
250
+ value = update_value.call(cursor.left, cursor_particle[:width], slider_particle[:width], orientation)
251
+ range.width(cursor.left + cursor.width / 2)
252
+ bloc.call(value)
253
+ slider.instance_variable_set('@value',value)
254
+ end
255
+ end
256
+ cursor.touch(:double) do
257
+ slider.value(default_value)
258
+ end
259
+
260
+ cursor.shadow({
261
+ id: :s4,
262
+ left: 1, top: 1, blur: 3,
263
+ option: :natural,
264
+ red: 0, green: 0, blue: 0, alpha: 0.6
265
+ })
266
+ slider
267
+
78
268
  end
269
+ new({ particle: :behavior })
@@ -25,6 +25,7 @@ class HTML
25
25
  @id = id_found
26
26
  @original_atome = current_atome
27
27
  @touch_removed = {}
28
+
28
29
  end
29
30
 
30
31
  def object
@@ -1,4 +1,14 @@
1
1
  # frozen_string_literal: true
2
+ def act_on(obj)
3
+ obj.color(:red)
4
+ obj.left(56)
5
+ end
6
+
7
+ def act_off(obj)
8
+ obj.color(:blue)
9
+ obj.left(33)
10
+ end
11
+
2
12
 
3
13
  b = box({ left: 12, id: :the_first_box, top: 30 })
4
14
 
@@ -6,7 +16,7 @@ b.touch(true) do
6
16
  b.alternate({ width: 33, color: :red, height: 33 , smooth: 0 }, { width: 66, color: :orange, blur: 8}, { height: 66, color: :green, smooth: 9, blur: 0})
7
17
  end
8
18
 
9
- c = circle({ left: 333 , top: 30})
19
+ c = circle({ left: 99 , top: 30})
10
20
 
11
21
  c.touch(true) do
12
22
  alt = b.alternate(true, false)
@@ -15,4 +25,12 @@ c.touch(true) do
15
25
  else
16
26
  c.color(:orange)
17
27
  end
18
- end
28
+ end
29
+
30
+
31
+ c2 = circle({ left: 333 , top: 30})
32
+
33
+
34
+ c2.touch(true) do
35
+ b.alternate({ executor: {act_on: b} }, { executor: {act_off: b}})
36
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Behaviors allow you to add specific code to any particle, enabling the particle to behave differently.
4
+ # Here, when the first box receives a value, it behaves differently from the second box even if they received
5
+ # the same params .
6
+
7
+ text({ data: :hello, id: :the_txt, left: 120 })
8
+
9
+ b=box
10
+
11
+ my_lambda= lambda do |new_value|
12
+ grab(:the_txt).color(:red)
13
+ end
14
+
15
+ b.behavior({value: my_lambda})
16
+
17
+ my_second_lambda= lambda do |new_value|
18
+ grab(:the_txt).data('from cirle')
19
+ end
20
+ c=box({top: 69})
21
+ c.behavior({value: my_second_lambda})
22
+
23
+ wait 1 do
24
+ c.value(:ok)
25
+ end
26
+ wait 2 do
27
+ b.value(:ok)
28
+ end
29
+
30
+
31
+
32
+
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+ def act_on(obj)
3
+ obj.color(:red)
4
+ obj.left(56)
5
+ end
6
+
7
+ def act_off(obj)
8
+ obj.color(:blue)
9
+ obj.left(33)
10
+ end
11
+
12
+
13
+ b = box({ left: 12, id: :the_first_box, top: 30 })
14
+
15
+ b.touch(true) do
16
+ b.alternate({ width: 33, color: :red, height: 33 , smooth: 0 }, { width: 66, color: :orange, blur: 8}, { height: 66, color: :green, smooth: 9, blur: 0})
17
+ end
18
+
19
+ c = circle({ left: 99 , top: 30})
20
+
21
+ c.touch(true) do
22
+ alt = b.alternate(true, false)
23
+ if alt
24
+ c.color(:yellowgreen)
25
+ else
26
+ c.color(:orange)
27
+ end
28
+ end
29
+
30
+
31
+ c2 = circle({ left: 333 , top: 30})
32
+
33
+
34
+ c2.touch(true) do
35
+ b.alternate({ executor: {act_on: b} }, { executor: {act_off: b}})
36
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+ # holder is a particle that contain an atome so we use my_objet.holder.left(33)
3
+ # and it will move the atome contain in the holder particle to be manipulated
4
+ # it facilitate the access of some atome without being worried about their id
5
+ # this is mainly used int context of input , slider , etc...
6
+
7
+
8
+ # simple example
9
+ b=box({color: :black})
10
+
11
+ c=b.circle({width: 10, height: 10, color: :red})
12
+
13
+ b.holder(c)
14
+ wait 1 do
15
+ b.holder.center(true)
16
+ end
17
+
18
+
19
+
20
+
21
+
22
+
23
+ # second example ( holder is build in the input molecule)
24
+ text({ left: 33, top: 33, data: 'data collected', id: :infos })
25
+
26
+ inp = A.input({ width: 166,
27
+ trigger: :up,
28
+ back: :orange,
29
+ shadow: {
30
+ id: :s2,
31
+ left: 3, top: 3, blur: 3,
32
+ invert: true,
33
+ red: 0, green: 0, blue: 0, alpha: 0.9
34
+ },
35
+ text: :black,
36
+ smooth: 3,
37
+ left: 66,
38
+ top: 33,
39
+ default: 'type here'
40
+ }) do |val|
41
+
42
+ grab(:infos).data(val)
43
+ end
44
+
45
+ wait 2 do
46
+ inp.top(12)
47
+ wait 1 do
48
+ inp.width(666)
49
+ inp.holder.blur(6)
50
+ wait 1 do
51
+ inp.holder.blur(0)
52
+ inp.holder.data('injected data')
53
+ end
54
+ end
55
+
56
+ end
57
+
58
+
59
+
60
+
61
+
62
+
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+ t = text({ left: 33, top: 33, data: 'data collected', id: :infos })
3
+
4
+ inp=input({ width: 166,
5
+ trigger: :up,
6
+ back: :orange,
7
+ shadow: {
8
+ id: :s2,
9
+ left: 3, top: 3, blur: 3,
10
+ invert: true,
11
+ red: 0, green: 0, blue: 0, alpha: 0.9
12
+ },
13
+ attach: :intuition,
14
+ text: :black,
15
+ smooth: 3,
16
+ left: 66,
17
+ top: 33,
18
+ default: 'type here'
19
+ }) do |val|
20
+
21
+ grab(:infos).data(val)
22
+ end
23
+
24
+ inp.top(12)
25
+
26
+ wait 1 do
27
+ inp.width(666)
28
+ wait 1 do
29
+ inp.holder.data('new data')
30
+ end
31
+ end
32
+
33
+
34
+
35
+
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
-
4
3
  styles = {
5
4
  width: 199,
6
5
  height: 33,
@@ -24,11 +23,13 @@ listing = [
24
23
  { data: :hi },
25
24
  { data: :ho }
26
25
  ]
27
-
28
- list_1 = A.list({
26
+ b=box({drag: true})
27
+ list_1 = grab(:intuition).list({
29
28
  styles: styles,
30
29
  element: element,
31
- listing: listing
30
+ listing: listing,
31
+ left: 33,
32
+ attach: b.id
32
33
  })
33
34
 
34
35
  # test2
@@ -1,6 +1,17 @@
1
1
  # frozen_string_literal: true
2
- label=text({data: 0, top: 69, left: 69,attach: :intuition, component: { size: 12 }, color: :gray})
3
2
 
4
- A.slider({width: 333} ) do |value|
3
+ label = text({ data: 0, top: 400, left: 69, component: { size: 12 }, color: :gray })
4
+
5
+ aaa = grab(:intuition).slider({ id: :toto, range: { color: :yellow }, min: -12, max: 33, width: 333, value: 12, height: 25, left: 99, top: 350, color: :orange, cursor: { color: :orange, width: 25, height: 25 } }) do |value|
6
+ label.data("(#{value})")
7
+ end
8
+
9
+ aa = grab(:intuition).slider({ orientation: :vertical, range: { color: :white }, value: 55, width: 55, height: 555, attach: :intuition, left: 555, top: 33, color: :red, cursor: { color: {alpha: 1, red: 0.12, green: 0.12, blue: 0.12}, width: 33, height: 66, smooth: 3 } }) do |value|
5
10
  label.data("(#{value})")
6
11
  end
12
+
13
+ b=box
14
+ b.touch(true) do
15
+ aa.value(12)
16
+ aaa.value(-6)
17
+ end
@@ -29,7 +29,7 @@
29
29
  // }
30
30
 
31
31
 
32
- function controller_message(msg) {
33
- // let json_msgs = JSON.parse(msg);
34
- rubyVMCallback("A.receptor("+msg+")")
35
- }
32
+ // function controller_message(msg) {
33
+ // // let json_msgs = JSON.parse(msg);
34
+ // rubyVMCallback("A.receptor("+msg+")")
35
+ // }
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.6.7.8
4
+ version: 0.5.6.8.3
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-03-16 00:00:00.000000000 Z
11
+ date: 2024-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: artoo
@@ -540,6 +540,7 @@ files:
540
540
  - vendor/assets/application/examples/attach.rb
541
541
  - vendor/assets/application/examples/attached.rb
542
542
  - vendor/assets/application/examples/basic_understanding.rb
543
+ - vendor/assets/application/examples/behavior.rb
543
544
  - vendor/assets/application/examples/blur.rb
544
545
  - vendor/assets/application/examples/border.rb
545
546
  - vendor/assets/application/examples/browse.rb
@@ -569,6 +570,7 @@ files:
569
570
  - vendor/assets/application/examples/encode.rb
570
571
  - vendor/assets/application/examples/encrypt.rb
571
572
  - vendor/assets/application/examples/example.rb
573
+ - vendor/assets/application/examples/executor.rb
572
574
  - vendor/assets/application/examples/file.rb
573
575
  - vendor/assets/application/examples/fill.rb
574
576
  - vendor/assets/application/examples/find.rb
@@ -581,11 +583,13 @@ files:
581
583
  - vendor/assets/application/examples/help.rb
582
584
  - vendor/assets/application/examples/hierarchy.rb
583
585
  - vendor/assets/application/examples/history.rb
586
+ - vendor/assets/application/examples/holder.rb
584
587
  - vendor/assets/application/examples/hypertext.rb
585
588
  - vendor/assets/application/examples/image.rb
586
589
  - vendor/assets/application/examples/import.rb
587
590
  - vendor/assets/application/examples/increment.rb
588
591
  - vendor/assets/application/examples/infos.rb
592
+ - vendor/assets/application/examples/input.rb
589
593
  - vendor/assets/application/examples/int8.rb
590
594
  - vendor/assets/application/examples/js&ruby.rb
591
595
  - vendor/assets/application/examples/keyboard.rb