motion-kit 0.10.5 → 0.10.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.
- checksums.yaml +4 -4
- data/README.md +19 -2
- data/lib/motion-kit-cocoa/constraints/constraints_layout.rb +53 -344
- data/lib/motion-kit-osx/layouts/nsmenu_extensions.rb +3 -1
- data/lib/motion-kit/calculator/calculate.rb +9 -0
- data/lib/motion-kit/calculator/calculator.rb +28 -0
- data/lib/motion-kit/calculator/frame_calculator.rb +65 -0
- data/lib/motion-kit/calculator/origin_calculator.rb +90 -0
- data/lib/motion-kit/calculator/size_calculator.rb +65 -0
- data/lib/motion-kit/calculator/view_calculator.rb +51 -0
- data/lib/motion-kit/version.rb +1 -1
- metadata +8 -3
- data/lib/motion-kit/calculate.rb +0 -263
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20015e2ea39d1ee5ade966a4db342b0605fcfb6e
|
4
|
+
data.tar.gz: 74a853c1ddf2ecb4627d2ef159411f6b76c9c324
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2c4fb5357b601dafe6455b4f0f344b90b9913a44a2a984085f139903f187992f3d4b855a26717b0f4fb4beaaee83474f636318ad48e4f060cfc2249cedd0094
|
7
|
+
data.tar.gz: 3e7e1c372e731a783919e6567ebce275b4c74e149a463dc78ec1175d7839076d0ccd9660384721ed9a0298a109568ff0470afbeb43925c0a08cbc9ce473c5c9a
|
data/README.md
CHANGED
@@ -504,11 +504,18 @@ You can pass symbols like `autoresizing_mask :flexible_width`, or use
|
|
504
504
|
symbols that have more intuitive meaning than the usual
|
505
505
|
`UIViewAutoresizingFlexible*` constants. These work in iOS and OS X.
|
506
506
|
|
507
|
+
All of the `:pin_to_` shorthands have a fixed size, whereas the `:fill_`
|
508
|
+
shorthands have flexible size.
|
509
|
+
|
507
510
|
```ruby
|
511
|
+
# the :fill shorthands will get you a ton of mileage
|
512
|
+
autoresizing_mask :fill_top
|
513
|
+
# but if you want the size to stay constant, use :pin_to
|
514
|
+
autoresizing_mask :pin_to_bottom
|
515
|
+
# or, a list of flexible sides
|
508
516
|
autoresizing_mask :flexible_right, :flexible_bottom, :flexible_width
|
517
|
+
# or, combine them in some crazy fancy way
|
509
518
|
autoresizing_mask :pin_to_left, :rigid_top # 'rigid' undoes a 'flexible' setting
|
510
|
-
autoresizing_mask :pin_to_bottom, :flexible_width
|
511
|
-
autoresizing_mask :fill_top
|
512
519
|
|
513
520
|
flexible_left: Sticks to the right side
|
514
521
|
flexible_width: Width varies with parent
|
@@ -701,6 +708,16 @@ simplifying the controller code (and usually making it more testable). See the
|
|
701
708
|
[motion-kit-events]: https://github.com/rubymotion/motion-kit-events
|
702
709
|
|
703
710
|
|
711
|
+
### MotionKit::Templates
|
712
|
+
|
713
|
+
gem install motion-kit-templates
|
714
|
+
|
715
|
+
Adds project templates, for use with `motion create`.
|
716
|
+
|
717
|
+
motion create foo --template=mk-ios
|
718
|
+
motion create foo --template=mk-osx
|
719
|
+
|
720
|
+
|
704
721
|
## Some handy tricks and Features
|
705
722
|
|
706
723
|
### Orientation specific styles
|
@@ -18,485 +18,184 @@ module MotionKit
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def x(value=nil)
|
21
|
-
|
22
|
-
|
23
|
-
if value
|
24
|
-
constraint.equals(value)
|
25
|
-
end
|
26
|
-
|
27
|
-
target.add_constraints([constraint])
|
28
|
-
return constraint
|
21
|
+
target_constraint(:left, :equal, value)
|
29
22
|
end
|
30
23
|
alias left x
|
31
24
|
|
32
25
|
def min_x(value=nil)
|
33
|
-
|
34
|
-
|
35
|
-
if value
|
36
|
-
constraint.equals(value)
|
37
|
-
end
|
38
|
-
|
39
|
-
target.add_constraints([constraint])
|
40
|
-
return constraint
|
26
|
+
target_constraint(:left, :gte, value)
|
41
27
|
end
|
42
28
|
alias min_left min_x
|
43
29
|
|
44
30
|
def max_x(value=nil)
|
45
|
-
|
46
|
-
|
47
|
-
if value
|
48
|
-
constraint.equals(value)
|
49
|
-
end
|
50
|
-
|
51
|
-
target.add_constraints([constraint])
|
52
|
-
return constraint
|
31
|
+
target_constraint(:left, :lte, value)
|
53
32
|
end
|
54
33
|
alias max_left max_x
|
55
34
|
|
56
35
|
def leading(value=nil)
|
57
|
-
|
58
|
-
|
59
|
-
if value
|
60
|
-
constraint.equals(value)
|
61
|
-
end
|
62
|
-
|
63
|
-
target.add_constraints([constraint])
|
64
|
-
return constraint
|
36
|
+
target_constraint(:leading, :equal, value)
|
65
37
|
end
|
66
38
|
|
67
39
|
def min_leading(value=nil)
|
68
|
-
|
69
|
-
|
70
|
-
if value
|
71
|
-
constraint.equals(value)
|
72
|
-
end
|
73
|
-
|
74
|
-
target.add_constraints([constraint])
|
75
|
-
return constraint
|
40
|
+
target_constraint(:leading, :gte, value)
|
76
41
|
end
|
77
42
|
|
78
43
|
def max_leading(value=nil)
|
79
|
-
|
80
|
-
|
81
|
-
if value
|
82
|
-
constraint.equals(value)
|
83
|
-
end
|
84
|
-
|
85
|
-
target.add_constraints([constraint])
|
86
|
-
return constraint
|
44
|
+
target_constraint(:leading, :lte, value)
|
87
45
|
end
|
88
46
|
|
89
47
|
def center_x(value=nil)
|
90
|
-
|
91
|
-
|
92
|
-
if value
|
93
|
-
constraint.equals(value)
|
94
|
-
end
|
95
|
-
|
96
|
-
target.add_constraints([constraint])
|
97
|
-
return constraint
|
48
|
+
target_constraint(:center_x, :equal, value)
|
98
49
|
end
|
99
50
|
|
100
51
|
def min_center_x(value=nil)
|
101
|
-
|
102
|
-
|
103
|
-
if value
|
104
|
-
constraint.equals(value)
|
105
|
-
end
|
106
|
-
|
107
|
-
target.add_constraints([constraint])
|
108
|
-
return constraint
|
52
|
+
target_constraint(:center_x, :gte, value)
|
109
53
|
end
|
110
54
|
|
111
55
|
def max_center_x(value=nil)
|
112
|
-
|
113
|
-
|
114
|
-
if value
|
115
|
-
constraint.equals(value)
|
116
|
-
end
|
117
|
-
|
118
|
-
target.add_constraints([constraint])
|
119
|
-
return constraint
|
56
|
+
target_constraint(:center_x, :lte, value)
|
120
57
|
end
|
121
58
|
|
122
59
|
def right(value=nil)
|
123
|
-
|
124
|
-
|
125
|
-
if value
|
126
|
-
constraint.equals(value)
|
127
|
-
end
|
128
|
-
|
129
|
-
target.add_constraints([constraint])
|
130
|
-
return constraint
|
60
|
+
target_constraint(:right, :equal, value)
|
131
61
|
end
|
132
62
|
|
133
63
|
def min_right(value=nil)
|
134
|
-
|
135
|
-
|
136
|
-
if value
|
137
|
-
constraint.equals(value)
|
138
|
-
end
|
139
|
-
|
140
|
-
target.add_constraints([constraint])
|
141
|
-
return constraint
|
64
|
+
target_constraint(:right, :gte, value)
|
142
65
|
end
|
143
66
|
|
144
67
|
def max_right(value=nil)
|
145
|
-
|
146
|
-
|
147
|
-
if value
|
148
|
-
constraint.equals(value)
|
149
|
-
end
|
150
|
-
|
151
|
-
target.add_constraints([constraint])
|
152
|
-
return constraint
|
68
|
+
target_constraint(:right, :lte, value)
|
153
69
|
end
|
154
70
|
|
155
71
|
def trailing(value=nil)
|
156
|
-
|
157
|
-
|
158
|
-
if value
|
159
|
-
constraint.equals(value)
|
160
|
-
end
|
161
|
-
|
162
|
-
target.add_constraints([constraint])
|
163
|
-
return constraint
|
72
|
+
target_constraint(:trailing, :equal, value)
|
164
73
|
end
|
165
74
|
|
166
75
|
def min_trailing(value=nil)
|
167
|
-
|
168
|
-
|
169
|
-
if value
|
170
|
-
constraint.equals(value)
|
171
|
-
end
|
172
|
-
|
173
|
-
target.add_constraints([constraint])
|
174
|
-
return constraint
|
76
|
+
target_constraint(:trailing, :gte, value)
|
175
77
|
end
|
176
78
|
|
177
79
|
def max_trailing(value=nil)
|
178
|
-
|
179
|
-
|
180
|
-
if value
|
181
|
-
constraint.equals(value)
|
182
|
-
end
|
183
|
-
|
184
|
-
target.add_constraints([constraint])
|
185
|
-
return constraint
|
80
|
+
target_constraint(:trailing, :lte, value)
|
186
81
|
end
|
187
82
|
|
188
83
|
def y(value=nil)
|
189
|
-
|
190
|
-
|
191
|
-
if value
|
192
|
-
constraint.equals(value)
|
193
|
-
end
|
194
|
-
|
195
|
-
target.add_constraints([constraint])
|
196
|
-
return constraint
|
84
|
+
target_constraint(:top, :equal, value)
|
197
85
|
end
|
198
86
|
alias top y
|
199
87
|
|
200
88
|
def min_y(value=nil)
|
201
|
-
|
202
|
-
|
203
|
-
if value
|
204
|
-
constraint.equals(value)
|
205
|
-
end
|
206
|
-
|
207
|
-
target.add_constraints([constraint])
|
208
|
-
return constraint
|
89
|
+
target_constraint(:top, :gte, value)
|
209
90
|
end
|
210
91
|
alias min_top min_y
|
211
92
|
|
212
93
|
def max_y(value=nil)
|
213
|
-
|
214
|
-
|
215
|
-
if value
|
216
|
-
constraint.equals(value)
|
217
|
-
end
|
218
|
-
|
219
|
-
target.add_constraints([constraint])
|
220
|
-
return constraint
|
94
|
+
target_constraint(:top, :lte, value)
|
221
95
|
end
|
222
96
|
alias max_top max_y
|
223
97
|
|
224
98
|
def center_y(value=nil)
|
225
|
-
|
226
|
-
|
227
|
-
if value
|
228
|
-
constraint.equals(value)
|
229
|
-
end
|
230
|
-
|
231
|
-
target.add_constraints([constraint])
|
232
|
-
return constraint
|
99
|
+
target_constraint(:center_y, :equal, value)
|
233
100
|
end
|
234
101
|
|
235
102
|
def min_center_y(value=nil)
|
236
|
-
|
237
|
-
|
238
|
-
if value
|
239
|
-
constraint.equals(value)
|
240
|
-
end
|
241
|
-
|
242
|
-
target.add_constraints([constraint])
|
243
|
-
return constraint
|
103
|
+
target_constraint(:center_y, :gte, value)
|
244
104
|
end
|
245
105
|
|
246
106
|
def max_center_y(value=nil)
|
247
|
-
|
248
|
-
|
249
|
-
if value
|
250
|
-
constraint.equals(value)
|
251
|
-
end
|
252
|
-
|
253
|
-
target.add_constraints([constraint])
|
254
|
-
return constraint
|
107
|
+
target_constraint(:center_y, :lte, value)
|
255
108
|
end
|
256
109
|
|
257
110
|
def bottom(value=nil)
|
258
|
-
|
259
|
-
|
260
|
-
if value
|
261
|
-
constraint.equals(value)
|
262
|
-
end
|
263
|
-
|
264
|
-
target.add_constraints([constraint])
|
265
|
-
return constraint
|
111
|
+
target_constraint(:bottom, :equal, value)
|
266
112
|
end
|
267
113
|
|
268
114
|
def min_bottom(value=nil)
|
269
|
-
|
270
|
-
|
271
|
-
if value
|
272
|
-
constraint.equals(value)
|
273
|
-
end
|
274
|
-
|
275
|
-
target.add_constraints([constraint])
|
276
|
-
return constraint
|
115
|
+
target_constraint(:bottom, :gte, value)
|
277
116
|
end
|
278
117
|
|
279
118
|
def max_bottom(value=nil)
|
280
|
-
|
281
|
-
|
282
|
-
if value
|
283
|
-
constraint.equals(value)
|
284
|
-
end
|
285
|
-
|
286
|
-
target.add_constraints([constraint])
|
287
|
-
return constraint
|
119
|
+
target_constraint(:bottom, :lte, value)
|
288
120
|
end
|
289
121
|
|
290
122
|
def baseline(value=nil)
|
291
|
-
|
292
|
-
|
293
|
-
if value
|
294
|
-
constraint.equals(value)
|
295
|
-
end
|
296
|
-
|
297
|
-
target.add_constraints([constraint])
|
298
|
-
return constraint
|
123
|
+
target_constraint(:baseline, :equal, value)
|
299
124
|
end
|
300
125
|
|
301
126
|
def min_baseline(value=nil)
|
302
|
-
|
303
|
-
|
304
|
-
if value
|
305
|
-
constraint.equals(value)
|
306
|
-
end
|
307
|
-
|
308
|
-
target.add_constraints([constraint])
|
309
|
-
return constraint
|
127
|
+
target_constraint(:baseline, :gte, value)
|
310
128
|
end
|
311
129
|
|
312
130
|
def max_baseline(value=nil)
|
313
|
-
|
314
|
-
|
315
|
-
if value
|
316
|
-
constraint.equals(value)
|
317
|
-
end
|
318
|
-
|
319
|
-
target.add_constraints([constraint])
|
320
|
-
return constraint
|
131
|
+
target_constraint(:baseline, :lte, value)
|
321
132
|
end
|
322
133
|
|
323
134
|
def width(value=nil)
|
324
|
-
|
325
|
-
|
326
|
-
if value
|
327
|
-
constraint.equals(value)
|
328
|
-
end
|
329
|
-
|
330
|
-
target.add_constraints([constraint])
|
331
|
-
return constraint
|
135
|
+
target_constraint(:width, :equal, value)
|
332
136
|
end
|
333
137
|
alias w width
|
334
138
|
|
335
139
|
def min_width(value=nil)
|
336
|
-
|
337
|
-
|
338
|
-
if value
|
339
|
-
constraint.equals(value)
|
340
|
-
end
|
341
|
-
|
342
|
-
target.add_constraints([constraint])
|
343
|
-
return constraint
|
140
|
+
target_constraint(:width, :gte, value)
|
344
141
|
end
|
345
142
|
|
346
143
|
def max_width(value=nil)
|
347
|
-
|
348
|
-
|
349
|
-
if value
|
350
|
-
constraint.equals(value)
|
351
|
-
end
|
352
|
-
|
353
|
-
target.add_constraints([constraint])
|
354
|
-
return constraint
|
144
|
+
target_constraint(:width, :lte, value)
|
355
145
|
end
|
356
146
|
|
357
147
|
def height(value=nil)
|
358
|
-
|
359
|
-
|
360
|
-
if value
|
361
|
-
constraint.equals(value)
|
362
|
-
end
|
363
|
-
|
364
|
-
target.add_constraints([constraint])
|
365
|
-
return constraint
|
148
|
+
target_constraint(:height, :equal, value)
|
366
149
|
end
|
367
150
|
alias h height
|
368
151
|
|
369
152
|
def min_height(value=nil)
|
370
|
-
|
371
|
-
|
372
|
-
if value
|
373
|
-
constraint.equals(value)
|
374
|
-
end
|
375
|
-
|
376
|
-
target.add_constraints([constraint])
|
377
|
-
return constraint
|
153
|
+
target_constraint(:height, :gte, value)
|
378
154
|
end
|
379
155
|
|
380
156
|
def max_height(value=nil)
|
381
|
-
|
382
|
-
|
383
|
-
if value
|
384
|
-
constraint.equals(value)
|
385
|
-
end
|
386
|
-
|
387
|
-
target.add_constraints([constraint])
|
388
|
-
return constraint
|
157
|
+
target_constraint(:height, :lte, value)
|
389
158
|
end
|
390
159
|
|
391
160
|
def size(value=nil)
|
392
|
-
|
393
|
-
|
394
|
-
if value
|
395
|
-
constraint.equals(value)
|
396
|
-
end
|
397
|
-
|
398
|
-
target.add_constraints([constraint])
|
399
|
-
return constraint
|
161
|
+
target_constraint(:size, :equal, value, SizeConstraint)
|
400
162
|
end
|
401
163
|
|
402
164
|
def min_size(value=nil)
|
403
|
-
|
404
|
-
|
405
|
-
if value
|
406
|
-
constraint.equals(value)
|
407
|
-
end
|
408
|
-
|
409
|
-
target.add_constraints([constraint])
|
410
|
-
return constraint
|
165
|
+
target_constraint(:size, :gte, value, SizeConstraint)
|
411
166
|
end
|
412
167
|
|
413
168
|
def max_size(value=nil)
|
414
|
-
|
415
|
-
|
416
|
-
if value
|
417
|
-
constraint.equals(value)
|
418
|
-
end
|
419
|
-
|
420
|
-
target.add_constraints([constraint])
|
421
|
-
return constraint
|
169
|
+
target_constraint(:size, :lte, value, SizeConstraint)
|
422
170
|
end
|
423
171
|
|
424
172
|
def center(value=nil)
|
425
|
-
|
426
|
-
|
427
|
-
if value
|
428
|
-
constraint.equals(value)
|
429
|
-
end
|
430
|
-
|
431
|
-
target.add_constraints([constraint])
|
432
|
-
return constraint
|
173
|
+
target_constraint([:center_x, :center_y], :equal, value, PointConstraint)
|
433
174
|
end
|
434
175
|
|
435
176
|
def min_center(value=nil)
|
436
|
-
|
437
|
-
|
438
|
-
if value
|
439
|
-
constraint.equals(value)
|
440
|
-
end
|
441
|
-
|
442
|
-
target.add_constraints([constraint])
|
443
|
-
return constraint
|
177
|
+
target_constraint([:center_x, :center_y], :gte, value, PointConstraint)
|
444
178
|
end
|
445
179
|
|
446
180
|
def max_center(value=nil)
|
447
|
-
|
448
|
-
|
449
|
-
if value
|
450
|
-
constraint.equals(value)
|
451
|
-
end
|
452
|
-
|
453
|
-
target.add_constraints([constraint])
|
454
|
-
return constraint
|
181
|
+
target_constraint([:center_x, :center_y], :lte, value, PointConstraint)
|
455
182
|
end
|
456
183
|
|
457
184
|
def top_left(value=nil)
|
458
|
-
|
459
|
-
|
460
|
-
if value
|
461
|
-
constraint.equals(value)
|
462
|
-
end
|
463
|
-
|
464
|
-
target.add_constraints([constraint])
|
465
|
-
return constraint
|
185
|
+
target_constraint([:left, :top], :equal, value, PointConstraint)
|
466
186
|
end
|
467
187
|
alias origin top_left
|
468
188
|
|
469
189
|
def top_right(value=nil)
|
470
|
-
|
471
|
-
|
472
|
-
if value
|
473
|
-
constraint.equals(value)
|
474
|
-
end
|
475
|
-
|
476
|
-
target.add_constraints([constraint])
|
477
|
-
return constraint
|
190
|
+
target_constraint([:right, :top], :equal, value, PointConstraint)
|
478
191
|
end
|
479
192
|
|
480
193
|
def bottom_left(value=nil)
|
481
|
-
|
482
|
-
|
483
|
-
if value
|
484
|
-
constraint.equals(value)
|
485
|
-
end
|
486
|
-
|
487
|
-
target.add_constraints([constraint])
|
488
|
-
return constraint
|
194
|
+
target_constraint([:left, :bottom], :equal, value, PointConstraint)
|
489
195
|
end
|
490
196
|
|
491
197
|
def bottom_right(value=nil)
|
492
|
-
|
493
|
-
|
494
|
-
if value
|
495
|
-
constraint.equals(value)
|
496
|
-
end
|
497
|
-
|
498
|
-
target.add_constraints([constraint])
|
499
|
-
return constraint
|
198
|
+
target_constraint([:right, :bottom], :equal, value, PointConstraint)
|
500
199
|
end
|
501
200
|
|
502
201
|
def above(view)
|
@@ -533,5 +232,15 @@ module MotionKit
|
|
533
232
|
end
|
534
233
|
alias right_of after
|
535
234
|
|
235
|
+
private
|
236
|
+
|
237
|
+
def target_constraint(attribute, relationship, value=nil, constraint_class=nil)
|
238
|
+
constraint_class ||= Constraint
|
239
|
+
constraint = constraint_class.new(target.view, attribute, relationship)
|
240
|
+
constraint.equals(value) if value
|
241
|
+
target.add_constraints([constraint])
|
242
|
+
constraint
|
243
|
+
end
|
244
|
+
|
536
245
|
end
|
537
246
|
end
|
@@ -4,7 +4,9 @@ module MotionKit
|
|
4
4
|
|
5
5
|
# useful when writing menus
|
6
6
|
def app_name
|
7
|
-
|
7
|
+
# this returns an ImmediateRef, whatever that is. It needs to be
|
8
|
+
# converted to a String.
|
9
|
+
"#{NSBundle.mainBundle.infoDictionary['CFBundleName']}"
|
8
10
|
end
|
9
11
|
|
10
12
|
def _menu_title_and_options(title, options, default_title=nil, default_options={})
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# @provides MotionKit::Calculator
|
2
|
+
module MotionKit
|
3
|
+
class Calculator
|
4
|
+
attr_accessor :factor, :constant
|
5
|
+
|
6
|
+
def self.memo
|
7
|
+
@memo ||= {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.scan(amount)
|
11
|
+
amount = amount.gsub(' ', '')
|
12
|
+
Calculator.memo[amount] ||= Calculator.new(amount)
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(amount)
|
16
|
+
location = amount.index '%'
|
17
|
+
if location
|
18
|
+
self.factor = amount.slice(0, location).to_f / 100.0
|
19
|
+
location += 1
|
20
|
+
else
|
21
|
+
self.factor = 0
|
22
|
+
location = 0
|
23
|
+
end
|
24
|
+
self.constant = amount.slice(location, amount.size).to_f
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# @provides module:MotionKit::FrameCalculator
|
2
|
+
module MotionKit
|
3
|
+
|
4
|
+
module FrameCalculator
|
5
|
+
|
6
|
+
def calculate_frame(view, amount, full_view)
|
7
|
+
if amount.is_a?(Symbol)
|
8
|
+
calculate_frame_from_symbol(view, amount, full_view)
|
9
|
+
elsif amount.is_a?(Array)
|
10
|
+
calculate_frame_from_array(view, amount, full_view)
|
11
|
+
elsif amount.is_a?(Hash)
|
12
|
+
calculate_frame_from_hash(view, amount, full_view)
|
13
|
+
else
|
14
|
+
return amount
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def calculate_frame_from_symbol(view, amount, full_view)
|
19
|
+
case amount
|
20
|
+
when :full, :auto
|
21
|
+
size = calculate_size(view, amount, full_view)
|
22
|
+
origin = [0, 0]
|
23
|
+
when :center
|
24
|
+
size = view.frame.size
|
25
|
+
origin = calculate_origin(view, :center, ['50%', '50%'], size, full_view)
|
26
|
+
origin.x -= size.width / 2.0
|
27
|
+
origin.y -= size.height / 2.0
|
28
|
+
else
|
29
|
+
raise "Unrecognized amount symbol #{amount.inspect} in MotionKit#calculate_frame"
|
30
|
+
end
|
31
|
+
|
32
|
+
return CGRect.new(origin, size)
|
33
|
+
end
|
34
|
+
|
35
|
+
def calculate_frame_from_array(view, amount, full_view)
|
36
|
+
if amount.length == 2
|
37
|
+
size = calculate_size(view, amount[1], full_view)
|
38
|
+
origin = calculate_origin(view, :origin, amount[0], size, full_view)
|
39
|
+
elsif amount.length == 4
|
40
|
+
size = calculate_size(view, [amount[2], amount[3]], full_view)
|
41
|
+
origin = calculate_origin(view, :origin, [amount[0], amount[1]], size, full_view)
|
42
|
+
else
|
43
|
+
raise "Don't know what to do with frame value #{amount.inspect}"
|
44
|
+
end
|
45
|
+
|
46
|
+
return CGRect.new(origin, size)
|
47
|
+
end
|
48
|
+
|
49
|
+
def calculate_frame_from_hash(view, amount, full_view)
|
50
|
+
size = calculate_size(view, (amount[:size] || amount), full_view)
|
51
|
+
|
52
|
+
if amount.key?(:center)
|
53
|
+
origin = calculate_origin(view, :center, amount[:center], size, full_view)
|
54
|
+
origin.x -= size.width / 2
|
55
|
+
origin.y -= size.height / 2
|
56
|
+
else
|
57
|
+
origin = calculate_origin(view, :origin, (amount[:origin] || amount), size, full_view)
|
58
|
+
end
|
59
|
+
|
60
|
+
return CGRect.new(origin, size)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# @provides module:MotionKit::OriginCalculator
|
2
|
+
module MotionKit
|
3
|
+
|
4
|
+
module OriginCalculator
|
5
|
+
|
6
|
+
def calculate_origin(view, dimension, amount, my_size=nil, full_view)
|
7
|
+
my_size ||= view.frame.size
|
8
|
+
if amount == :center
|
9
|
+
calculate_from_center(view, dimension, amount, my_size, full_view)
|
10
|
+
elsif amount.is_a?(Array) || amount.is_a?(Hash)
|
11
|
+
calculate_from_hash_array(view, dimension, amount, my_size, full_view)
|
12
|
+
else
|
13
|
+
return amount
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def calculate_from_center(view, dimension, amount, my_size, full_view)
|
18
|
+
x = calculate(view, :width, '50%', full_view) - my_size.width / 2.0
|
19
|
+
y = calculate(view, :height, '50%', full_view) - my_size.height / 2.0
|
20
|
+
return CGPoint.new(x, y)
|
21
|
+
end
|
22
|
+
|
23
|
+
def calculate_from_hash_array(view, dimension, amount, my_size, full_view)
|
24
|
+
x, y, x_offset, y_offset = calculate_from_hash(view, dimension, amount, my_size)
|
25
|
+
x = calculate(view, :width, x, full_view) + (x_offset || 0)
|
26
|
+
y = calculate(view, :height, y, full_view) + (y_offset || 0)
|
27
|
+
return CGPoint.new(x, y)
|
28
|
+
end
|
29
|
+
|
30
|
+
def calculate_from_hash(view, dimension, amount, my_size)
|
31
|
+
return amount[0], amount[1], nil, nil if amount.is_a?(Array)
|
32
|
+
if amount[:relative]
|
33
|
+
calculate_relative_from_hash(view, dimension, amount, my_size)
|
34
|
+
else
|
35
|
+
calculate_absolute_from_hash(view, dimension, amount, my_size)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def calculate_relative_from_hash(view, dimension, amount, my_size)
|
40
|
+
x = amount[:x] || begin
|
41
|
+
x = view.frame.origin.x
|
42
|
+
x += my_size.width / 2.0 if dimension == :center
|
43
|
+
x
|
44
|
+
end
|
45
|
+
|
46
|
+
y = amount[:y] || begin
|
47
|
+
y = view.frame.origin.y
|
48
|
+
y += my_size.height / 2.0 if dimension == :center
|
49
|
+
y
|
50
|
+
end
|
51
|
+
|
52
|
+
x_offset = amount[:right] if amount.key?(:right)
|
53
|
+
x_offset = -amount[:left] if amount.key?(:left)
|
54
|
+
|
55
|
+
y_offset = amount[:down] if amount.key?(:down)
|
56
|
+
y_offset = -amount[:up] if amount.key?(:up)
|
57
|
+
y_offset = -y_offset if amount[:flipped]
|
58
|
+
|
59
|
+
return x, y, x_offset, y_offset
|
60
|
+
end
|
61
|
+
|
62
|
+
def calculate_absolute_from_hash(view, dimension, amount, my_size)
|
63
|
+
if amount.key?(:right)
|
64
|
+
x_offset = -my_size.width
|
65
|
+
x = amount[:right]
|
66
|
+
elsif amount.key?(:x) || amount.key?(:left)
|
67
|
+
x = amount[:x] || amount[:left]
|
68
|
+
elsif dimension == :center
|
69
|
+
x = view.frame.origin.x + (my_size.width / 2)
|
70
|
+
else
|
71
|
+
x = view.frame.origin.x
|
72
|
+
end
|
73
|
+
|
74
|
+
if amount.key?(:bottom)
|
75
|
+
y_offset = -my_size.height
|
76
|
+
y = amount[:bottom]
|
77
|
+
elsif amount.key?(:y) || amount.key?(:top)
|
78
|
+
y = amount[:y] || amount[:top]
|
79
|
+
elsif dimension == :center
|
80
|
+
y = view.frame.origin.y + (my_size.height / 2)
|
81
|
+
else
|
82
|
+
y = view.frame.origin.y
|
83
|
+
end
|
84
|
+
|
85
|
+
return x, y, x_offset, y_offset
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# @provides module:MotionKit::SizeCalculator
|
2
|
+
module MotionKit
|
3
|
+
|
4
|
+
module SizeCalculator
|
5
|
+
|
6
|
+
def calculate_size(view, amount, full_view)
|
7
|
+
if amount.is_a?(Array) || amount.is_a?(Hash)
|
8
|
+
calculate_size_from_multiple(view, amount, full_view)
|
9
|
+
elsif amount == :full
|
10
|
+
w = calculate(view, :width, '100%', full_view)
|
11
|
+
h = calculate(view, :height, '100%', full_view)
|
12
|
+
return CGSize.new(w, h)
|
13
|
+
elsif amount == :auto
|
14
|
+
return intrinsic_size(view)
|
15
|
+
elsif amount.is_a?(Symbol)
|
16
|
+
raise "Unrecognized amount symbol #{amount.inspect} in MotionKit#calculate_size"
|
17
|
+
else
|
18
|
+
return amount
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def calculate_size_from_multiple(view, amount, full_view)
|
23
|
+
w, h = resolve_width_and_height(view, amount)
|
24
|
+
|
25
|
+
if w == :scale || h == :scale
|
26
|
+
w, h = calculate_scaled_width_height(w, h, view, full_view)
|
27
|
+
else
|
28
|
+
w = calculate(view, :width, w, full_view)
|
29
|
+
h = calculate(view, :height, h, full_view)
|
30
|
+
end
|
31
|
+
|
32
|
+
return CGSize.new(w, h)
|
33
|
+
end
|
34
|
+
|
35
|
+
def calculate_scaled_width_height(w, h, view, full_view)
|
36
|
+
# scaling is handled a little differently, because it is dependent on
|
37
|
+
# the other amount and the intrinsic size.
|
38
|
+
if w == :scale && h == :scale
|
39
|
+
raise "Either width or height can be :scale, but not both"
|
40
|
+
elsif w == :scale
|
41
|
+
h = calculate(view, :height, h, full_view)
|
42
|
+
size = intrinsic_size(view)
|
43
|
+
w = h * size.width / size.height
|
44
|
+
elsif h == :scale
|
45
|
+
w = calculate(view, :width, w, full_view)
|
46
|
+
size = intrinsic_size(view)
|
47
|
+
h = w * size.height / size.width
|
48
|
+
end
|
49
|
+
return w, h
|
50
|
+
end
|
51
|
+
|
52
|
+
def resolve_width_and_height(view, amount)
|
53
|
+
if amount.is_a?(Hash)
|
54
|
+
w = amount[:w] || amount[:width] || view.frame.size.width
|
55
|
+
h = amount[:h] || amount[:height] || view.frame.size.height
|
56
|
+
else
|
57
|
+
w = amount[0]
|
58
|
+
h = amount[1]
|
59
|
+
end
|
60
|
+
return w, h
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# @requires MotionKit::Calculator
|
2
|
+
# @requires module:MotionKit::OriginCalculator
|
3
|
+
# @requires module:MotionKit::SizeCalculator
|
4
|
+
# @requires module:MotionKit::FrameCalculator
|
5
|
+
# @provides MotionKit::ViewCalculator
|
6
|
+
module MotionKit
|
7
|
+
class ViewCalculator
|
8
|
+
include MotionKit::OriginCalculator
|
9
|
+
include MotionKit::SizeCalculator
|
10
|
+
include MotionKit::FrameCalculator
|
11
|
+
|
12
|
+
def calculate(view, dimension, amount, full_view=nil)
|
13
|
+
if amount.is_a? Proc
|
14
|
+
return view.instance_exec(&amount)
|
15
|
+
elsif dimension == :origin || dimension == :center
|
16
|
+
return calculate_origin(view, dimension, amount, nil, full_view)
|
17
|
+
elsif dimension == :size
|
18
|
+
return calculate_size(view, amount, full_view)
|
19
|
+
elsif dimension == :frame
|
20
|
+
return calculate_frame(view, amount, full_view)
|
21
|
+
elsif amount == :full
|
22
|
+
return calculate(view, dimension, '100%', full_view)
|
23
|
+
elsif amount == :auto
|
24
|
+
return intrinsic_size(view).send(dimension) # :left or :right
|
25
|
+
elsif amount.is_a?(String) && amount.include?('%')
|
26
|
+
full_view ||= view.superview || begin
|
27
|
+
raise NoSuperviewError.new("Cannot calculate #{amount}% of #{dimension.inspect} because view #{view} has no superview.")
|
28
|
+
end
|
29
|
+
calc = Calculator.scan(amount)
|
30
|
+
|
31
|
+
raise "Unknown dimension #{dimension}" unless [:width, :height].include?(dimension)
|
32
|
+
return (full_view.frame.size.send(dimension) * calc.factor + calc.constant).round
|
33
|
+
else
|
34
|
+
return amount
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def intrinsic_size(view)
|
39
|
+
size_that_fits = view.intrinsicContentSize
|
40
|
+
if size_that_fits.width == MotionKit.no_intrinsic_metric
|
41
|
+
size_that_fits.width = 0
|
42
|
+
end
|
43
|
+
if size_that_fits.height == MotionKit.no_intrinsic_metric
|
44
|
+
size_that_fits.height = 0
|
45
|
+
end
|
46
|
+
return size_that_fits
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
data/lib/motion-kit/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-kit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Colin T.A. Gray
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-06-
|
12
|
+
date: 2014-06-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: dbt
|
@@ -34,7 +34,12 @@ executables: []
|
|
34
34
|
extensions: []
|
35
35
|
extra_rdoc_files: []
|
36
36
|
files:
|
37
|
-
- lib/motion-kit/calculate.rb
|
37
|
+
- lib/motion-kit/calculator/calculate.rb
|
38
|
+
- lib/motion-kit/calculator/calculator.rb
|
39
|
+
- lib/motion-kit/calculator/frame_calculator.rb
|
40
|
+
- lib/motion-kit/calculator/origin_calculator.rb
|
41
|
+
- lib/motion-kit/calculator/size_calculator.rb
|
42
|
+
- lib/motion-kit/calculator/view_calculator.rb
|
38
43
|
- lib/motion-kit/layouts/base_layout.rb
|
39
44
|
- lib/motion-kit/layouts/base_layout_class_methods.rb
|
40
45
|
- lib/motion-kit/layouts/parent.rb
|
data/lib/motion-kit/calculate.rb
DELETED
@@ -1,263 +0,0 @@
|
|
1
|
-
# @provides MotionKit::Calculator
|
2
|
-
module MotionKit
|
3
|
-
module_function
|
4
|
-
|
5
|
-
def calculate(view, dimension, amount, full_view=nil)
|
6
|
-
if amount.is_a? Proc
|
7
|
-
return view.instance_exec(&amount)
|
8
|
-
elsif dimension == :origin || dimension == :center
|
9
|
-
return calculate_origin(view, dimension, amount, nil, full_view)
|
10
|
-
elsif dimension == :size
|
11
|
-
return calculate_size(view, amount, full_view)
|
12
|
-
elsif dimension == :frame
|
13
|
-
return calculate_frame(view, amount, full_view)
|
14
|
-
elsif amount == :full
|
15
|
-
return calculate(view, dimension, '100%', full_view)
|
16
|
-
elsif amount == :auto
|
17
|
-
size_that_fits = intrinsic_size(view)
|
18
|
-
|
19
|
-
return case dimension
|
20
|
-
when :width
|
21
|
-
return size_that_fits.width
|
22
|
-
when :height
|
23
|
-
return size_that_fits.height
|
24
|
-
end
|
25
|
-
elsif amount.is_a?(String) && amount.include?('%')
|
26
|
-
full_view ||= view.superview
|
27
|
-
unless full_view
|
28
|
-
raise NoSuperviewError.new("Cannot calculate #{amount}% of #{dimension.inspect} because view #{view} has no superview.")
|
29
|
-
end
|
30
|
-
calc = Calculator.scan(amount)
|
31
|
-
|
32
|
-
factor = calc.factor
|
33
|
-
constant = calc.constant
|
34
|
-
|
35
|
-
return case dimension
|
36
|
-
when :width
|
37
|
-
return (full_view.frame.size.width * factor + constant).round
|
38
|
-
when :height
|
39
|
-
return (full_view.frame.size.height * factor + constant).round
|
40
|
-
else
|
41
|
-
raise "Unknown dimension #{dimension}"
|
42
|
-
end
|
43
|
-
else
|
44
|
-
return amount
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def calculate_origin(view, dimension, amount, my_size=nil, full_view)
|
49
|
-
my_size ||= view.frame.size
|
50
|
-
|
51
|
-
if amount == :center
|
52
|
-
x = calculate(view, :width, '50%', full_view) - my_size.width / 2.0
|
53
|
-
y = calculate(view, :height, '50%', full_view) - my_size.height / 2.0
|
54
|
-
return CGPoint.new(x, y)
|
55
|
-
elsif amount.is_a?(Array) || amount.is_a?(Hash)
|
56
|
-
x_offset = 0
|
57
|
-
y_offset = 0
|
58
|
-
|
59
|
-
if amount.is_a?(Hash)
|
60
|
-
if amount[:relative]
|
61
|
-
if amount.key?(:x)
|
62
|
-
x = amount[:x]
|
63
|
-
else
|
64
|
-
x = view.frame.origin.x
|
65
|
-
if dimension == :center
|
66
|
-
x += my_size.width / 2.0
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
if amount.key?(:y)
|
71
|
-
y = amount[:y]
|
72
|
-
else
|
73
|
-
y = view.frame.origin.y
|
74
|
-
if dimension == :center
|
75
|
-
y += my_size.height / 2.0
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
if amount.key?(:right)
|
80
|
-
x_offset = amount[:right]
|
81
|
-
elsif amount.key?(:left)
|
82
|
-
x_offset = -amount[:left]
|
83
|
-
end
|
84
|
-
|
85
|
-
if amount.key?(:down)
|
86
|
-
y_offset = amount[:down]
|
87
|
-
elsif amount.key?(:up)
|
88
|
-
y_offset = -amount[:up]
|
89
|
-
end
|
90
|
-
y_offset = -y_offset if amount[:flipped]
|
91
|
-
else
|
92
|
-
if amount.key?(:right)
|
93
|
-
x_offset = -my_size.width
|
94
|
-
x = amount[:right]
|
95
|
-
elsif amount.key?(:x) || amount.key?(:left)
|
96
|
-
x = amount[:x] || amount[:left]
|
97
|
-
elsif dimension == :center
|
98
|
-
x = view.frame.origin.x
|
99
|
-
x += my_size.width / 2
|
100
|
-
else
|
101
|
-
x = view.frame.origin.x
|
102
|
-
end
|
103
|
-
|
104
|
-
if amount.key?(:bottom)
|
105
|
-
y_offset = -my_size.height
|
106
|
-
y = amount[:bottom]
|
107
|
-
elsif amount.key?(:y) || amount.key?(:top)
|
108
|
-
y = amount[:y] || amount[:top]
|
109
|
-
elsif dimension == :center
|
110
|
-
y = view.frame.origin.y
|
111
|
-
y += my_size.height / 2
|
112
|
-
else
|
113
|
-
y = view.frame.origin.y
|
114
|
-
end
|
115
|
-
end
|
116
|
-
else
|
117
|
-
x = amount[0]
|
118
|
-
y = amount[1]
|
119
|
-
end
|
120
|
-
|
121
|
-
x = calculate(view, :width, x, full_view) + x_offset
|
122
|
-
y = calculate(view, :height, y, full_view) + y_offset
|
123
|
-
return CGPoint.new(x, y)
|
124
|
-
else
|
125
|
-
return amount
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def calculate_size(view, amount, full_view)
|
130
|
-
if amount.is_a?(Array) || amount.is_a?(Hash)
|
131
|
-
if amount.is_a?(Hash)
|
132
|
-
w = amount.fetch(:w, amount.fetch(:width, view.frame.size.width))
|
133
|
-
h = amount.fetch(:h, amount.fetch(:height, view.frame.size.height))
|
134
|
-
else
|
135
|
-
w = amount[0]
|
136
|
-
h = amount[1]
|
137
|
-
end
|
138
|
-
|
139
|
-
# scaling is handled a little differently, because it is dependent on
|
140
|
-
# the other amount and the intrinsic size.
|
141
|
-
if w == :scale || h == :scale
|
142
|
-
if w == :scale && h == :scale
|
143
|
-
raise "Either width or height can be :scale, but not both"
|
144
|
-
elsif w == :scale
|
145
|
-
h = calculate(view, :height, h, full_view)
|
146
|
-
size = intrinsic_size(view)
|
147
|
-
w = h * size.width / size.height
|
148
|
-
elsif h == :scale
|
149
|
-
w = calculate(view, :width, w, full_view)
|
150
|
-
size = intrinsic_size(view)
|
151
|
-
h = w * size.height / size.width
|
152
|
-
end
|
153
|
-
else
|
154
|
-
w = calculate(view, :width, w, full_view)
|
155
|
-
h = calculate(view, :height, h, full_view)
|
156
|
-
end
|
157
|
-
|
158
|
-
return CGSize.new(w, h)
|
159
|
-
elsif amount == :full
|
160
|
-
w = calculate(view, :width, '100%', full_view)
|
161
|
-
h = calculate(view, :height, '100%', full_view)
|
162
|
-
return CGSize.new(w, h)
|
163
|
-
elsif amount == :auto
|
164
|
-
return intrinsic_size(view)
|
165
|
-
elsif amount.is_a?(Symbol)
|
166
|
-
raise "Unrecognized amount symbol #{amount.inspect} in MotionKit#calculate_size"
|
167
|
-
else
|
168
|
-
return amount
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
def calculate_frame(view, amount, full_view)
|
173
|
-
if amount.is_a?(Symbol)
|
174
|
-
case amount
|
175
|
-
when :full, :auto
|
176
|
-
size = calculate_size(view, amount, full_view)
|
177
|
-
origin = [0, 0]
|
178
|
-
when :center
|
179
|
-
size = view.frame.size
|
180
|
-
origin = calculate_origin(view, :center, ['50%', '50%'], size, full_view)
|
181
|
-
origin.x -= size.width / 2.0
|
182
|
-
origin.y -= size.height / 2.0
|
183
|
-
else
|
184
|
-
raise "Unrecognized amount symbol #{amount.inspect} in MotionKit#calculate_frame"
|
185
|
-
end
|
186
|
-
|
187
|
-
return CGRect.new(origin, size)
|
188
|
-
elsif amount.is_a?(Array)
|
189
|
-
if amount.length == 2
|
190
|
-
size = calculate_size(view, amount[1], full_view)
|
191
|
-
origin = calculate_origin(view, :origin, amount[0], size, full_view)
|
192
|
-
elsif amount.length == 4
|
193
|
-
size = calculate_size(view, [amount[2], amount[3]], full_view)
|
194
|
-
origin = calculate_origin(view, :origin, [amount[0], amount[1]], size, full_view)
|
195
|
-
else
|
196
|
-
raise "Don't know what to do with frame value #{amount.inspect}"
|
197
|
-
end
|
198
|
-
|
199
|
-
return CGRect.new(origin, size)
|
200
|
-
elsif amount.is_a?(Hash)
|
201
|
-
if amount.key?(:size)
|
202
|
-
size = calculate_size(view, amount[:size], full_view)
|
203
|
-
else
|
204
|
-
size = calculate_size(view, amount, full_view)
|
205
|
-
end
|
206
|
-
|
207
|
-
if amount.key?(:center)
|
208
|
-
origin = calculate_origin(view, :center, amount[:center], size, full_view)
|
209
|
-
origin.x -= size.width / 2
|
210
|
-
origin.y -= size.height / 2
|
211
|
-
elsif amount.key?(:origin)
|
212
|
-
origin = calculate_origin(view, :origin, amount[:origin], size, full_view)
|
213
|
-
else
|
214
|
-
origin = calculate_origin(view, :origin, amount, size, full_view)
|
215
|
-
end
|
216
|
-
|
217
|
-
return CGRect.new(origin, size)
|
218
|
-
else
|
219
|
-
return amount
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
|
-
def intrinsic_size(view)
|
224
|
-
size_that_fits = view.intrinsicContentSize
|
225
|
-
if size_that_fits.width == MotionKit.no_intrinsic_metric
|
226
|
-
size_that_fits.width = 0
|
227
|
-
end
|
228
|
-
if size_that_fits.height == MotionKit.no_intrinsic_metric
|
229
|
-
size_that_fits.height = 0
|
230
|
-
end
|
231
|
-
return size_that_fits
|
232
|
-
end
|
233
|
-
|
234
|
-
class Calculator
|
235
|
-
attr_accessor :factor, :constant
|
236
|
-
|
237
|
-
def self.memo
|
238
|
-
@memo ||= {}
|
239
|
-
end
|
240
|
-
|
241
|
-
def self.scan(amount)
|
242
|
-
amount = amount.gsub(' ', '')
|
243
|
-
return Calculator.memo[amount] if Calculator.memo[amount]
|
244
|
-
|
245
|
-
calc = Calculator.new
|
246
|
-
|
247
|
-
location = amount.index '%'
|
248
|
-
if location
|
249
|
-
calc.factor = amount.slice(0, location).to_f / 100.0
|
250
|
-
location += 1
|
251
|
-
else
|
252
|
-
calc.factor = 0
|
253
|
-
location = 0
|
254
|
-
end
|
255
|
-
calc.constant = amount.slice(location, amount.size).to_f
|
256
|
-
|
257
|
-
Calculator.memo[amount] = calc
|
258
|
-
return calc
|
259
|
-
end
|
260
|
-
|
261
|
-
end
|
262
|
-
|
263
|
-
end
|