sugarcube 0.11.3 → 0.12
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.yardopts +1 -0
- data/README.md +104 -113
- data/Rakefile +3 -1
- data/app/app_delegate.rb +4 -0
- data/lib/sugarcube-gestures.rb +23 -0
- data/lib/sugarcube-gestures/gestures.rb +134 -0
- data/lib/sugarcube/adjust.rb +69 -64
- data/lib/sugarcube/calayer.rb +8 -0
- data/lib/sugarcube/core_graphics.rb +107 -459
- data/lib/sugarcube/modal.rb +25 -6
- data/lib/sugarcube/{array.rb → nsarray.rb} +7 -1
- data/lib/sugarcube/nsdata.rb +22 -0
- data/lib/sugarcube/nsdate.rb +23 -0
- data/lib/sugarcube/nserror.rb +16 -0
- data/lib/sugarcube/nsstring.rb +29 -19
- data/lib/sugarcube/nsstring_files.rb +6 -0
- data/lib/sugarcube/nsuserdefaults.rb +34 -1
- data/lib/sugarcube/symbol.rb +125 -17
- data/lib/sugarcube/timer.rb +7 -0
- data/lib/sugarcube/to_s/nslayoutconstraint.rb +97 -0
- data/lib/sugarcube/to_s/uilabel.rb +4 -0
- data/lib/sugarcube/to_s/uitextfield.rb +15 -0
- data/lib/sugarcube/to_s/uiview.rb +11 -1
- data/lib/sugarcube/uiactionsheet.rb +86 -0
- data/lib/sugarcube/uialertview.rb +1 -1
- data/lib/sugarcube/uicolor.rb +18 -9
- data/lib/sugarcube/uiimage.rb +158 -12
- data/lib/sugarcube/uitableview.rb +2 -2
- data/lib/sugarcube/uiview.rb +92 -51
- data/lib/sugarcube/uiviewcontroller.rb +1 -0
- data/lib/sugarcube/version.rb +1 -1
- data/spec/core_graphics_spec.rb +304 -0
- metadata +17 -4
data/lib/sugarcube/adjust.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
$sugarcube_view = nil
|
2
|
+
$sugarcube_items = nil
|
3
|
+
$sugarcube_restore = nil
|
4
|
+
|
1
5
|
module SugarCube
|
2
6
|
module Adjust
|
3
7
|
module_function
|
@@ -14,17 +18,18 @@ module SugarCube
|
|
14
18
|
|
15
19
|
def adjust(view=nil, format=nil)
|
16
20
|
SugarCube::Adjust::repl_format(format.to_sym) if format
|
17
|
-
|
18
|
-
return @@sugarcube_view if not view
|
21
|
+
return $sugarcube_view if not view
|
19
22
|
|
20
23
|
if view.is_a? Fixnum
|
21
|
-
|
22
|
-
view =
|
24
|
+
$sugarcube_items ||= SugarCube::Adjust::build_tree(UIApplication.sharedApplication.keyWindow, :subviews)
|
25
|
+
view = $sugarcube_items[view]
|
23
26
|
end
|
24
27
|
|
28
|
+
# a/adjust will return this object
|
29
|
+
$sugarcube_view = view
|
30
|
+
|
25
31
|
if view.is_a?(UIView)
|
26
|
-
|
27
|
-
@@sugarcube_restore = {
|
32
|
+
$sugarcube_restore = {
|
28
33
|
frame: SugarCube::Adjust.frame,
|
29
34
|
shadow: SugarCube::Adjust.shadow,
|
30
35
|
}
|
@@ -40,15 +45,14 @@ module SugarCube
|
|
40
45
|
|
41
46
|
##| FRAME
|
42
47
|
def frame f=nil
|
43
|
-
|
44
|
-
raise "no view has been assigned to SugarCube::Adjust::adjust" unless @@sugarcube_view
|
48
|
+
raise "no view has been assigned to SugarCube::Adjust::adjust" unless $sugarcube_view
|
45
49
|
|
46
|
-
return SugarCube::CoreGraphics::Rect(
|
50
|
+
return SugarCube::CoreGraphics::Rect($sugarcube_view.frame) if not f
|
47
51
|
|
48
|
-
|
52
|
+
$sugarcube_view.frame = f
|
49
53
|
puts format_frame(f)
|
50
54
|
|
51
|
-
|
55
|
+
$sugarcube_view
|
52
56
|
end
|
53
57
|
alias f frame
|
54
58
|
|
@@ -59,15 +63,14 @@ module SugarCube
|
|
59
63
|
alias l left
|
60
64
|
|
61
65
|
def right val=1
|
62
|
-
|
63
|
-
raise "no view has been assigned to SugarCube::Adjust::adjust" unless @@sugarcube_view
|
66
|
+
raise "no view has been assigned to SugarCube::Adjust::adjust" unless $sugarcube_view
|
64
67
|
|
65
|
-
f =
|
68
|
+
f = $sugarcube_view.frame
|
66
69
|
f.origin.x += val
|
67
|
-
|
70
|
+
$sugarcube_view.frame = f
|
68
71
|
puts format_frame(f)
|
69
72
|
|
70
|
-
|
73
|
+
$sugarcube_view
|
71
74
|
end
|
72
75
|
alias r right
|
73
76
|
|
@@ -77,23 +80,21 @@ module SugarCube
|
|
77
80
|
alias u up
|
78
81
|
|
79
82
|
def down val=1
|
80
|
-
|
81
|
-
raise "no view has been assigned to SugarCube::Adjust::adjust" unless @@sugarcube_view
|
83
|
+
raise "no view has been assigned to SugarCube::Adjust::adjust" unless $sugarcube_view
|
82
84
|
|
83
|
-
f =
|
85
|
+
f = $sugarcube_view.frame
|
84
86
|
f.origin.y += val
|
85
|
-
|
87
|
+
$sugarcube_view.frame = f
|
86
88
|
puts format_frame(f)
|
87
89
|
|
88
|
-
|
90
|
+
$sugarcube_view
|
89
91
|
end
|
90
92
|
alias d down
|
91
93
|
|
92
94
|
def origin x=nil, y=nil
|
93
|
-
|
94
|
-
raise "no view has been assigned to SugarCube::Adjust::adjust" unless @@sugarcube_view
|
95
|
+
raise "no view has been assigned to SugarCube::Adjust::adjust" unless $sugarcube_view
|
95
96
|
|
96
|
-
f =
|
97
|
+
f = $sugarcube_view.frame
|
97
98
|
return SugarCube::CoreGraphics::Point(f.origin) if not x
|
98
99
|
|
99
100
|
if y
|
@@ -102,10 +103,10 @@ module SugarCube
|
|
102
103
|
else
|
103
104
|
f.origin = x
|
104
105
|
end
|
105
|
-
|
106
|
+
$sugarcube_view.frame = f
|
106
107
|
puts format_frame(f)
|
107
108
|
|
108
|
-
|
109
|
+
$sugarcube_view
|
109
110
|
end
|
110
111
|
alias o origin
|
111
112
|
|
@@ -116,15 +117,14 @@ module SugarCube
|
|
116
117
|
alias n thinner
|
117
118
|
|
118
119
|
def wider val=1
|
119
|
-
|
120
|
-
raise "no view has been assigned to SugarCube::Adjust::adjust" unless @@sugarcube_view
|
120
|
+
raise "no view has been assigned to SugarCube::Adjust::adjust" unless $sugarcube_view
|
121
121
|
|
122
|
-
f =
|
122
|
+
f = $sugarcube_view.frame
|
123
123
|
f.size.width += val
|
124
|
-
|
124
|
+
$sugarcube_view.frame = f
|
125
125
|
puts format_frame(f)
|
126
126
|
|
127
|
-
|
127
|
+
$sugarcube_view
|
128
128
|
end
|
129
129
|
alias w wider
|
130
130
|
|
@@ -134,23 +134,21 @@ module SugarCube
|
|
134
134
|
alias s shorter
|
135
135
|
|
136
136
|
def taller val=1
|
137
|
-
|
138
|
-
raise "no view has been assigned to SugarCube::Adjust::adjust" unless @@sugarcube_view
|
137
|
+
raise "no view has been assigned to SugarCube::Adjust::adjust" unless $sugarcube_view
|
139
138
|
|
140
|
-
f =
|
139
|
+
f = $sugarcube_view.frame
|
141
140
|
f.size.height += val
|
142
|
-
|
141
|
+
$sugarcube_view.frame = f
|
143
142
|
puts format_frame(f)
|
144
143
|
|
145
|
-
|
144
|
+
$sugarcube_view
|
146
145
|
end
|
147
146
|
alias t taller
|
148
147
|
|
149
148
|
def size w=nil, h=nil
|
150
|
-
|
151
|
-
raise "no view has been assigned to SugarCube::Adjust::adjust" unless @@sugarcube_view
|
149
|
+
raise "no view has been assigned to SugarCube::Adjust::adjust" unless $sugarcube_view
|
152
150
|
|
153
|
-
f =
|
151
|
+
f = $sugarcube_view.frame
|
154
152
|
return SugarCube::CoreGraphics::Size(f.size) if not w
|
155
153
|
|
156
154
|
if h
|
@@ -159,16 +157,15 @@ module SugarCube
|
|
159
157
|
else
|
160
158
|
f.size = w
|
161
159
|
end
|
162
|
-
|
160
|
+
$sugarcube_view.frame = f
|
163
161
|
puts format_frame(f)
|
164
162
|
|
165
|
-
|
163
|
+
$sugarcube_view
|
166
164
|
end
|
167
165
|
alias z size
|
168
166
|
|
169
167
|
def center(*args)
|
170
|
-
|
171
|
-
raise "no view has been assigned to SugarCube::Adjust::adjust" unless @@sugarcube_view
|
168
|
+
raise "no view has been assigned to SugarCube::Adjust::adjust" unless $sugarcube_view
|
172
169
|
|
173
170
|
element = nil
|
174
171
|
total = nil
|
@@ -192,7 +189,7 @@ module SugarCube
|
|
192
189
|
element = 1 unless element
|
193
190
|
total = 1 unless total
|
194
191
|
|
195
|
-
view =
|
192
|
+
view = $sugarcube_view
|
196
193
|
|
197
194
|
left = view.origin.x
|
198
195
|
top = view.origin.y
|
@@ -214,8 +211,7 @@ module SugarCube
|
|
214
211
|
|
215
212
|
##| SHADOW
|
216
213
|
def shadow shadow=nil
|
217
|
-
|
218
|
-
raise "no view has been assigned to SugarCube::Adjust::adjust" unless @@sugarcube_view
|
214
|
+
raise "no view has been assigned to SugarCube::Adjust::adjust" unless $sugarcube_view
|
219
215
|
|
220
216
|
if shadow
|
221
217
|
{
|
@@ -229,19 +225,19 @@ module SugarCube
|
|
229
225
|
if key == :color and [Symbol, Fixnum, NSString, UIImage, UIColor].any?{|klass| value.is_a? klass}
|
230
226
|
value = value.uicolor.CGColor
|
231
227
|
end
|
232
|
-
|
233
|
-
|
234
|
-
|
228
|
+
$sugarcube_view.layer.send(msg, value)
|
229
|
+
$sugarcube_view.layer.masksToBounds = false
|
230
|
+
$sugarcube_view.layer.shouldRasterize = true
|
235
231
|
end
|
236
232
|
}
|
237
|
-
|
233
|
+
$sugarcube_view
|
238
234
|
else
|
239
235
|
{
|
240
|
-
opacity:
|
241
|
-
radius:
|
242
|
-
offset:
|
243
|
-
color:
|
244
|
-
path:
|
236
|
+
opacity: $sugarcube_view.layer.shadowOpacity,
|
237
|
+
radius: $sugarcube_view.layer.shadowRadius,
|
238
|
+
offset: $sugarcube_view.layer.shadowOffset,
|
239
|
+
color: $sugarcube_view.layer.shadowColor,
|
240
|
+
path: $sugarcube_view.layer.shadowPath,
|
245
241
|
}
|
246
242
|
end
|
247
243
|
end
|
@@ -276,16 +272,18 @@ module SugarCube
|
|
276
272
|
end
|
277
273
|
ret
|
278
274
|
}
|
275
|
+
elsif item.is_a? CALayer
|
276
|
+
selector = :sublayers
|
279
277
|
else
|
280
278
|
raise "Unable to determine a SugarCube::Adjust::tree selector for #{item.class.name}"
|
281
279
|
end
|
282
280
|
end
|
283
281
|
|
284
|
-
|
282
|
+
$sugarcube_items = SugarCube::Adjust::build_tree(item, selector)
|
285
283
|
if self.respond_to? :draw_tree
|
286
|
-
|
284
|
+
draw_tree(item, selector)
|
287
285
|
else
|
288
|
-
|
286
|
+
SugarCube::Adjust::draw_tree(item, selector)
|
289
287
|
end
|
290
288
|
puts ''
|
291
289
|
|
@@ -317,7 +315,7 @@ module SugarCube
|
|
317
315
|
tab = ''
|
318
316
|
end
|
319
317
|
|
320
|
-
if self == item
|
318
|
+
if self == item || $sugarcube_view == item
|
321
319
|
print "\033[1m"
|
322
320
|
end
|
323
321
|
if item.is_a? UIView
|
@@ -325,7 +323,7 @@ module SugarCube
|
|
325
323
|
else
|
326
324
|
puts item.to_s
|
327
325
|
end
|
328
|
-
if self == item
|
326
|
+
if self == item || $sugarcube_view == item
|
329
327
|
print "\033[0m"
|
330
328
|
end
|
331
329
|
|
@@ -334,9 +332,15 @@ module SugarCube
|
|
334
332
|
else
|
335
333
|
items = item.send(selector)
|
336
334
|
end
|
335
|
+
items ||= []
|
336
|
+
|
337
337
|
items.each_with_index { |subview, index|
|
338
338
|
items_index += 1
|
339
|
-
|
339
|
+
if self.respond_to? :draw_tree
|
340
|
+
items_index = draw_tree(subview, selector, tab, index == items.length - 1, items_index)
|
341
|
+
else
|
342
|
+
items_index = SugarCube::Adjust::draw_tree(subview, selector, tab, index == items.length - 1, items_index)
|
343
|
+
end
|
340
344
|
}
|
341
345
|
|
342
346
|
return items_index
|
@@ -348,6 +352,8 @@ module SugarCube
|
|
348
352
|
else
|
349
353
|
items = item.send(selector)
|
350
354
|
end
|
355
|
+
items ||= []
|
356
|
+
|
351
357
|
ret = [item]
|
352
358
|
items.each_with_index { |subview, index|
|
353
359
|
ret.concat SugarCube::Adjust::build_tree(subview, selector)
|
@@ -361,10 +367,9 @@ module SugarCube
|
|
361
367
|
|
362
368
|
##| RESTORE
|
363
369
|
def restore
|
364
|
-
|
365
|
-
raise 'no view has been assigned to SugarCube::Adjust::adjust' unless @@sugarcube_view
|
370
|
+
raise 'no view has been assigned to SugarCube::Adjust::adjust' unless $sugarcube_view
|
366
371
|
|
367
|
-
|
372
|
+
$sugarcube_restore.each do |msg, value|
|
368
373
|
SugarCube::Adjust.send(msg, value)
|
369
374
|
end
|
370
375
|
end
|
@@ -1,426 +1,49 @@
|
|
1
|
-
module SugarCube
|
2
|
-
# Extensions to make CGRect a "real class"
|
3
|
-
module CGRectExtensions
|
4
|
-
module ClassMethods
|
5
|
-
def empty
|
6
|
-
SugarCube::CoreGraphics::Rect(CGRectZero)
|
7
|
-
end
|
8
|
-
|
9
|
-
def null
|
10
|
-
SugarCube::CoreGraphics::Rect(CGRectNull)
|
11
|
-
end
|
12
|
-
|
13
|
-
def infinite
|
14
|
-
SugarCube::CoreGraphics::Rect([0, 0], CGSize.infinite)
|
15
|
-
end
|
16
|
-
|
17
|
-
def from_hash(hash)
|
18
|
-
ret = Pointer.new(CGRect.type)
|
19
|
-
if CGRectMakeWithDictionaryRepresentation(hash, ret)
|
20
|
-
ret[0]
|
21
|
-
else
|
22
|
-
nil
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def from_s(s)
|
27
|
-
CGRectFromString(s)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.included(base)
|
32
|
-
base.extend(ClassMethods)
|
33
|
-
end
|
34
|
-
|
35
|
-
def empty?
|
36
|
-
CGRectIsEmpty(self)
|
37
|
-
end
|
38
|
-
|
39
|
-
def infinite?
|
40
|
-
self.size.infinite?
|
41
|
-
end
|
42
|
-
|
43
|
-
def null?
|
44
|
-
CGRectIsNull(self)
|
45
|
-
end
|
46
|
-
|
47
|
-
def left
|
48
|
-
return CGRectGetMinX(self)
|
49
|
-
end
|
50
|
-
|
51
|
-
def right
|
52
|
-
return CGRectGetMaxX(self)
|
53
|
-
end
|
54
|
-
|
55
|
-
def width
|
56
|
-
return CGRectGetWidth(self)
|
57
|
-
end
|
58
|
-
|
59
|
-
def top
|
60
|
-
return CGRectGetMinY(self)
|
61
|
-
end
|
62
|
-
|
63
|
-
def bottom
|
64
|
-
return CGRectGetMaxY(self)
|
65
|
-
end
|
66
|
-
|
67
|
-
def height
|
68
|
-
return CGRectGetHeight(self)
|
69
|
-
end
|
70
|
-
|
71
|
-
def center
|
72
|
-
return SugarCube::CoreGraphics::Point(CGRectGetMidX(self), CGRectGetMidY(self))
|
73
|
-
end
|
74
|
-
|
75
|
-
def to_s
|
76
|
-
NSStringFromCGRect(self)
|
77
|
-
end
|
78
|
-
|
79
|
-
def inspect
|
80
|
-
"#{self.class.name}([#{self.origin.x}, #{self.origin.y}],{#{self.size.width} × #{self.size.height}})"
|
81
|
-
end
|
82
|
-
|
83
|
-
def to_hash
|
84
|
-
CGRectCreateDictionaryRepresentation(self)
|
85
|
-
end
|
86
|
-
|
87
|
-
# # returns an intersection of self and rect, or moves the Rect using Point,
|
88
|
-
# or increases the size using Size
|
89
|
-
def +(rect)
|
90
|
-
case rect
|
91
|
-
when SugarCube::CoreGraphics::Rect, CGRect
|
92
|
-
SugarCube::CoreGraphics::Rect(CGRectUnion(self, rect))
|
93
|
-
when SugarCube::CoreGraphics::Point, CGPoint
|
94
|
-
SugarCube::CoreGraphics::Rect(CGRectOffset(self, rect.x, rect.y))
|
95
|
-
when SugarCube::CoreGraphics::Offset, UIOffset
|
96
|
-
SugarCube::CoreGraphics::Rect(CGRectOffset(self, rect.horizontal, rect.vertical))
|
97
|
-
when SugarCube::CoreGraphics::Size, CGSize
|
98
|
-
SugarCube::CoreGraphics::Rect(CGRectInset(self, - rect.width, - rect.height))
|
99
|
-
when SugarCube::CoreGraphics::EdgeInsets, UIEdgeInsets
|
100
|
-
SugarCube::CoreGraphics::Rect(UIEdgeInsetsInsetRect(self, rect))
|
101
|
-
else
|
102
|
-
super
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def intersection(rect)
|
107
|
-
SugarCube::CoreGraphics::Rect(CGRectIntersection(self, rect))
|
108
|
-
end
|
109
|
-
|
110
|
-
def intersects?(rect_or_point)
|
111
|
-
case rect_or_point
|
112
|
-
when SugarCube::CoreGraphics::Point, CGPoint
|
113
|
-
CGRectContainsPoint(self, rect_or_point)
|
114
|
-
when Array, CGRect
|
115
|
-
CGRectIntersectsRect(self, rect_or_point)
|
116
|
-
else
|
117
|
-
super
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
def contains?(rect_or_point)
|
122
|
-
case rect_or_point
|
123
|
-
when SugarCube::CoreGraphics::Point, CGPoint
|
124
|
-
CGRectContainsPoint(self, rect_or_point)
|
125
|
-
when Array, CGRect
|
126
|
-
CGRectContainsRect(self, rect_or_point)
|
127
|
-
else
|
128
|
-
super
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
def ==(rect)
|
133
|
-
CGRectEqualToRect(self, rect)
|
134
|
-
end
|
135
|
-
|
136
|
-
end
|
137
|
-
|
138
|
-
# Extensions to make CGPoint a "real class"
|
139
|
-
module CGPointExtensions
|
140
|
-
module ClassMethods
|
141
|
-
def from_hash(hash)
|
142
|
-
ret = Pointer.new(CGPoint.type)
|
143
|
-
if CGPointMakeWithDictionaryRepresentation(hash, ret)
|
144
|
-
ret[0]
|
145
|
-
else
|
146
|
-
nil
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
def from_s(s)
|
151
|
-
CGPointFromString(s)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
def self.included(base)
|
156
|
-
base.extend(ClassMethods)
|
157
|
-
end
|
158
|
-
|
159
|
-
def intersects?(rect)
|
160
|
-
CGRectContainsPoint(rect, self)
|
161
|
-
end
|
162
|
-
|
163
|
-
def ==(point)
|
164
|
-
CGPointEqualToPoint(self, point)
|
165
|
-
end
|
166
|
-
|
167
|
-
def to_s
|
168
|
-
NSStringFromCGPoint(self)
|
169
|
-
end
|
170
|
-
|
171
|
-
def inspect
|
172
|
-
"#{self.class.name}(#{self.x}, #{self.y})"
|
173
|
-
end
|
174
|
-
|
175
|
-
def to_hash
|
176
|
-
CGPointCreateDictionaryRepresentation(self)
|
177
|
-
end
|
178
|
-
|
179
|
-
end
|
180
|
-
|
181
|
-
# Extensions to make CGSize a "real class"
|
182
|
-
module CGSizeExtensions
|
183
|
-
module ClassMethods
|
184
|
-
def infinite
|
185
|
-
infinity = CGRect.null[0][0]
|
186
|
-
SugarCube::CoreGraphics::Size(infinity, infinity)
|
187
|
-
end
|
188
|
-
|
189
|
-
def from_hash(hash)
|
190
|
-
ret = Pointer.new(CGSize.type)
|
191
|
-
if CGSizeMakeWithDictionaryRepresentation(hash, ret)
|
192
|
-
ret[0]
|
193
|
-
else
|
194
|
-
nil
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
def from_s(s)
|
199
|
-
CGSizeFromString(s)
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
def self.included(base)
|
204
|
-
base.extend(ClassMethods)
|
205
|
-
end
|
206
|
-
|
207
|
-
def infinite?
|
208
|
-
infinity = CGRect.null[0][0]
|
209
|
-
self.width == infinity or self.height == infinity
|
210
|
-
end
|
211
|
-
|
212
|
-
def ==(size)
|
213
|
-
CGSizeEqualToSize(self, size)
|
214
|
-
end
|
215
|
-
|
216
|
-
def to_s
|
217
|
-
NSStringFromCGSize(self)
|
218
|
-
end
|
219
|
-
|
220
|
-
def inspect
|
221
|
-
"#{self.class.name}(#{self.width} × #{self.height})"
|
222
|
-
end
|
223
|
-
|
224
|
-
def to_hash
|
225
|
-
CGSizeCreateDictionaryRepresentation(self)
|
226
|
-
end
|
227
|
-
|
228
|
-
end
|
229
|
-
end
|
230
|
-
|
231
|
-
|
232
|
-
class CGRect
|
233
|
-
include SugarCube::CGRectExtensions
|
234
|
-
end
|
235
|
-
|
236
|
-
|
237
|
-
class CGPoint
|
238
|
-
include SugarCube::CGPointExtensions
|
239
|
-
end
|
240
|
-
|
241
|
-
|
242
|
-
class CGSize
|
243
|
-
include SugarCube::CGSizeExtensions
|
244
|
-
end
|
245
|
-
|
246
|
-
|
247
1
|
module SugarCube
|
248
2
|
module CoreGraphics
|
249
|
-
|
250
|
-
PHI = 1.618033989
|
251
|
-
E = 2.718281828
|
252
|
-
|
253
|
-
class Rect < Array
|
254
|
-
include SugarCube::CGRectExtensions
|
255
|
-
|
256
|
-
def initialize args
|
257
|
-
if args.length == 4
|
258
|
-
super [Point.new([args[0], args[1]]), Size.new([args[2], args[3]])]
|
259
|
-
else
|
260
|
-
unless args[0].is_a? Point
|
261
|
-
args[0] = SugarCube::CoreGraphics::Point(args[0])
|
262
|
-
end
|
263
|
-
unless args[1].is_a? Size
|
264
|
-
args[1] = SugarCube::CoreGraphics::Size(args[1])
|
265
|
-
end
|
266
|
-
super [args[0], args[1]]
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
def origin
|
271
|
-
return self[0]
|
272
|
-
end
|
273
|
-
|
274
|
-
def origin= val
|
275
|
-
self[0] = SugarCube::CoreGraphics::Point(val)
|
276
|
-
end
|
277
|
-
|
278
|
-
def size
|
279
|
-
return self[1]
|
280
|
-
end
|
281
|
-
|
282
|
-
def size= val
|
283
|
-
self[1] = SugarCube::CoreGraphics::Size(val)
|
284
|
-
end
|
285
|
-
end
|
286
|
-
|
287
|
-
|
288
|
-
class Point < Array
|
289
|
-
include SugarCube::CGPointExtensions
|
290
|
-
|
291
|
-
def x
|
292
|
-
return self[0]
|
293
|
-
end
|
294
|
-
|
295
|
-
def x= val
|
296
|
-
self[0] = val
|
297
|
-
end
|
298
|
-
|
299
|
-
def y
|
300
|
-
return self[1]
|
301
|
-
end
|
302
|
-
|
303
|
-
def y= val
|
304
|
-
self[1] = val
|
305
|
-
end
|
306
|
-
|
307
|
-
# adds a vector to this point, or creates a Rect by adding a size
|
308
|
-
def +(point)
|
309
|
-
case point
|
310
|
-
when SugarCube::CoreGraphics::Point, CGPoint
|
311
|
-
x = self.x + point.x
|
312
|
-
y = self.y + point.y
|
313
|
-
Point[x, y]
|
314
|
-
when SugarCube::CoreGraphics::Size, CGSize
|
315
|
-
Rect[self, point]
|
316
|
-
else
|
317
|
-
super
|
318
|
-
end
|
319
|
-
end
|
320
|
-
end
|
321
|
-
|
322
|
-
|
323
|
-
class Size < Array
|
324
|
-
include SugarCube::CGSizeExtensions
|
325
|
-
|
326
|
-
def width
|
327
|
-
return self[0]
|
328
|
-
end
|
329
|
-
|
330
|
-
def width= val
|
331
|
-
self[0] = val
|
332
|
-
end
|
333
|
-
|
334
|
-
def height
|
335
|
-
return self[1]
|
336
|
-
end
|
337
|
-
|
338
|
-
def height= val
|
339
|
-
self[1] = val
|
340
|
-
end
|
3
|
+
module_function
|
341
4
|
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
5
|
+
# Accepts 1 or 2 arguments
|
6
|
+
# 1 argument should be a CGPoint, CGSize, Array[Numeric, Numeric] or UIOffset
|
7
|
+
# 2 arguments should be Numeric, Numeric
|
8
|
+
def Point(x_or_origin, y=nil)
|
9
|
+
unless y
|
10
|
+
case x_or_origin
|
11
|
+
when CGPoint
|
12
|
+
x = x_or_origin.x
|
13
|
+
y = x_or_origin.y
|
14
|
+
when CGSize
|
15
|
+
x = x_or_origin.width
|
16
|
+
y = x_or_origin.height
|
17
|
+
when UIOffset
|
18
|
+
x = x_or_origin.horizontal
|
19
|
+
y = x_or_origin.vertical
|
20
|
+
when Array
|
21
|
+
x = x_or_origin[0]
|
22
|
+
y = x_or_origin[1]
|
351
23
|
else
|
352
|
-
|
24
|
+
raise RuntimeError.new("Invalid argument sent to Point(#{x_or_origin.inspect})")
|
353
25
|
end
|
26
|
+
else
|
27
|
+
x = x_or_origin
|
354
28
|
end
|
355
|
-
|
356
|
-
end
|
357
|
-
|
358
|
-
|
359
|
-
class EdgeInsets < Array
|
360
|
-
|
361
|
-
def top
|
362
|
-
return self[0]
|
363
|
-
end
|
364
|
-
|
365
|
-
def top= val
|
366
|
-
self[0] = val
|
367
|
-
end
|
368
|
-
|
369
|
-
def left
|
370
|
-
return self[1]
|
371
|
-
end
|
372
|
-
|
373
|
-
def left= val
|
374
|
-
self[1] = val
|
375
|
-
end
|
376
|
-
|
377
|
-
def bottom
|
378
|
-
return self[2]
|
379
|
-
end
|
380
|
-
|
381
|
-
def bottom= val
|
382
|
-
self[2] = val
|
383
|
-
end
|
384
|
-
|
385
|
-
def right
|
386
|
-
return self[3]
|
387
|
-
end
|
388
|
-
|
389
|
-
def right= val
|
390
|
-
self[3] = val
|
391
|
-
end
|
392
|
-
|
393
|
-
end
|
394
|
-
|
395
|
-
|
396
|
-
class Offset < Array
|
397
|
-
|
398
|
-
def horizontal
|
399
|
-
return self[0]
|
400
|
-
end
|
401
|
-
|
402
|
-
def horizontal= val
|
403
|
-
self[0] = val
|
404
|
-
end
|
405
|
-
|
406
|
-
def vertical
|
407
|
-
return self[1]
|
408
|
-
end
|
409
|
-
|
410
|
-
def vertical= val
|
411
|
-
self[1] = val
|
412
|
-
end
|
413
|
-
|
29
|
+
return CGPoint.new(x, y)
|
414
30
|
end
|
415
31
|
|
416
|
-
|
417
|
-
|
32
|
+
# Accepts 1 or 2 arguments
|
33
|
+
# 1 argument should be a CGPoint, CGSize, Array[Numeric, Numeric] or UIOffset
|
34
|
+
# 2 arguments should be Numeric, Numeric
|
418
35
|
def Size(w_or_size, h=nil)
|
419
|
-
|
36
|
+
unless h
|
420
37
|
case w_or_size
|
421
38
|
when CGSize
|
422
39
|
w = w_or_size.width
|
423
40
|
h = w_or_size.height
|
41
|
+
when CGPoint
|
42
|
+
w = w_or_size.x
|
43
|
+
h = w_or_size.y
|
44
|
+
when UIOffset
|
45
|
+
w = w_or_size.horizontal
|
46
|
+
h = w_or_size.vertical
|
424
47
|
when Array
|
425
48
|
w = w_or_size[0]
|
426
49
|
h = w_or_size[1]
|
@@ -430,33 +53,17 @@ module SugarCube
|
|
430
53
|
else
|
431
54
|
w = w_or_size
|
432
55
|
end
|
433
|
-
return
|
434
|
-
end
|
435
|
-
|
436
|
-
def Point(x_or_origin, y=nil)
|
437
|
-
if not y
|
438
|
-
case x_or_origin
|
439
|
-
when CGPoint
|
440
|
-
x = x_or_origin.x
|
441
|
-
y = x_or_origin.y
|
442
|
-
when Array
|
443
|
-
x = x_or_origin[0]
|
444
|
-
y = x_or_origin[1]
|
445
|
-
else
|
446
|
-
raise RuntimeError.new("Invalid argument sent to Point(#{x_or_origin.inspect})")
|
447
|
-
end
|
448
|
-
else
|
449
|
-
x = x_or_origin
|
450
|
-
end
|
451
|
-
return Point.new([x, y])
|
56
|
+
return CGSize.new(w, h)
|
452
57
|
end
|
453
58
|
|
454
59
|
# Accepts 1, 2 or 4 arguments.
|
455
|
-
# 1 argument should be an Array[4],
|
456
|
-
# 2 arguments should be a
|
60
|
+
# 1 argument should be an Array[Numeric*4], Array[[Numeric*2],[Numeric*2]], CGRect, UIView or CALayar
|
61
|
+
# 2 arguments should be a CGPoint and a CGSize,
|
62
|
+
# 3 arguments should be either Numeric, Numeric, Size or Point, Numeric, Numeric
|
457
63
|
# 4 should be x, y, w, h
|
458
64
|
def Rect(x_or_origin, y_or_size=nil, w=nil, h=nil)
|
459
|
-
|
65
|
+
# one arg
|
66
|
+
if y_or_size.nil? and w.nil? and h.nil?
|
460
67
|
case x_or_origin
|
461
68
|
when CGRect
|
462
69
|
x = x_or_origin.origin.x
|
@@ -468,11 +75,6 @@ module SugarCube
|
|
468
75
|
y = x_or_origin.frame.origin.y
|
469
76
|
w = x_or_origin.frame.size.width
|
470
77
|
h = x_or_origin.frame.size.height
|
471
|
-
when Rect
|
472
|
-
x = x_or_origin[0][0]
|
473
|
-
y = x_or_origin[0][1]
|
474
|
-
w = x_or_origin[1][0]
|
475
|
-
h = x_or_origin[1][1]
|
476
78
|
when Array
|
477
79
|
if x_or_origin.length == 2
|
478
80
|
x = x_or_origin[0][0]
|
@@ -490,69 +92,115 @@ module SugarCube
|
|
490
92
|
else
|
491
93
|
raise RuntimeError.new("Invalid argument sent to Rect(#{x_or_origin.inspect})")
|
492
94
|
end
|
493
|
-
|
494
|
-
|
95
|
+
# two args
|
96
|
+
elsif w.nil? and h.nil?
|
97
|
+
x_or_origin = SugarCube::CoreGraphics::Point(x_or_origin) unless x_or_origin.is_a? CGPoint
|
495
98
|
x = x_or_origin.x
|
496
99
|
y = x_or_origin.y
|
497
|
-
y_or_size = SugarCube::CoreGraphics::Size(y_or_size) unless y_or_size.is_a?
|
100
|
+
y_or_size = SugarCube::CoreGraphics::Size(y_or_size) unless y_or_size.is_a? CGSize
|
498
101
|
w = y_or_size.width
|
499
102
|
h = y_or_size.height
|
103
|
+
# three args
|
104
|
+
elsif h.nil?
|
105
|
+
if x_or_origin.is_a? Numeric
|
106
|
+
# x_or_origin: x, y_or_size: y, w: size
|
107
|
+
point = SugarCube::CoreGraphics::Point(x_or_origin, y_or_size)
|
108
|
+
size = w
|
109
|
+
return SugarCube::CoreGraphics::Rect(point, size)
|
110
|
+
elsif w.is_a? Numeric
|
111
|
+
# x_or_origin: point, y_or_size: w, w: h
|
112
|
+
point = x_or_origin
|
113
|
+
size = SugarCube::CoreGraphics::Size(y_or_size, w)
|
114
|
+
return SugarCube::CoreGraphics::Rect(point, size)
|
115
|
+
else
|
116
|
+
raise RuntimeError.new("Invalid arguments sent to Rect(#{x_or_origin.inspect}, #{y_or_size.inspect}, #{w.inspect})")
|
117
|
+
end
|
500
118
|
else
|
501
119
|
x = x_or_origin
|
502
120
|
y = y_or_size
|
503
121
|
end
|
504
|
-
return
|
122
|
+
return CGRect.new([x, y], [w, h])
|
505
123
|
end
|
506
124
|
|
507
|
-
# Accepts 1
|
508
|
-
# 1 argument should be an Array[4] or
|
125
|
+
# Accepts 1..4 arguments.
|
126
|
+
# 1 argument should be an Array[Numeric * 1..4], UIEdgeInset, or Numeric
|
127
|
+
# 2 arguments should be top/bottom, left/right
|
128
|
+
# 3 arguments should be top, left/right, bottom
|
509
129
|
# 4 should be top, left, bottom, right
|
510
130
|
def EdgeInsets(top_or_inset, left=nil, bottom=nil, right=nil)
|
511
|
-
|
131
|
+
if left.nil? and bottom.nil? and right.nil?
|
512
132
|
case top_or_inset
|
513
133
|
when UIEdgeInsets
|
514
|
-
top =
|
515
|
-
left =
|
516
|
-
bottom =
|
517
|
-
right =
|
134
|
+
top = top_or_inset.top
|
135
|
+
left = top_or_inset.left
|
136
|
+
bottom = top_or_inset.bottom
|
137
|
+
right = top_or_inset.right
|
138
|
+
when CGRect
|
139
|
+
# converting a rect to insets is hard to visualize,
|
140
|
+
# but it goes something like this:
|
141
|
+
# +-----------.....----------+
|
142
|
+
# | origin |y | top inset |
|
143
|
+
# |--------+ V |
|
144
|
+
# | x .......... |
|
145
|
+
# . . . .
|
146
|
+
# .-------->. . right .
|
147
|
+
# . left . . inset .
|
148
|
+
# . inset . .<------.
|
149
|
+
# . . . .
|
150
|
+
# | .......... w |
|
151
|
+
# | ^ +------|
|
152
|
+
# | bottom inset| h| size |
|
153
|
+
# +-----------.....----------+
|
154
|
+
left = top_or_inset.origin.x
|
155
|
+
top = top_or_inset.origin.y
|
156
|
+
right = top_or_inset.size.width
|
157
|
+
bottom = top_or_inset.size.height
|
518
158
|
when Array
|
519
|
-
|
520
|
-
|
521
|
-
bottom = top_or_inset[2]
|
522
|
-
right = top_or_inset[3]
|
159
|
+
# okay, in this ONE case, I use the splat operator.
|
160
|
+
return SugarCube::CoreGraphics::EdgeInsets(*top_or_inset)
|
523
161
|
when Numeric
|
524
162
|
top = left = bottom = right = top_or_inset
|
525
163
|
else
|
526
164
|
raise RuntimeError.new("Invalid argument sent to EdgeInsets(#{top_or_inset.inspect})")
|
527
165
|
end
|
166
|
+
elsif bottom.nil? and right.nil?
|
167
|
+
return SugarCube::CoreGraphics::EdgeInsets(top_or_inset, left, top_or_inset, left)
|
168
|
+
elsif right.nil?
|
169
|
+
return SugarCube::CoreGraphics::EdgeInsets(top_or_inset, left, bottom, left)
|
528
170
|
else
|
529
171
|
top = top_or_inset
|
530
172
|
end
|
531
|
-
return
|
173
|
+
return UIEdgeInsets.new(top, left, bottom, right)
|
532
174
|
end
|
533
175
|
|
534
176
|
# Accepts 1 or 2 arguments.
|
535
|
-
# 1 argument should be an Array[2] or
|
177
|
+
# 1 argument should be an Array[2], UIOffset, CGPoint, CGSize, or Numeric
|
536
178
|
# 2 should be horizontal, vertical
|
537
179
|
def Offset(horizontal_or_offset, vertical=nil)
|
538
|
-
|
180
|
+
unless vertical
|
539
181
|
case horizontal_or_offset
|
540
182
|
when UIOffset
|
541
183
|
horizontal = horizontal_or_offset.horizontal
|
542
184
|
vertical = horizontal_or_offset.vertical
|
185
|
+
when CGPoint
|
186
|
+
horizontal = horizontal_or_offset.x
|
187
|
+
vertical = horizontal_or_offset.y
|
188
|
+
when CGSize
|
189
|
+
horizontal = horizontal_or_offset.width
|
190
|
+
vertical = horizontal_or_offset.height
|
543
191
|
when Array
|
544
192
|
horizontal = horizontal_or_offset[0]
|
545
193
|
vertical = horizontal_or_offset[1]
|
546
|
-
when
|
547
|
-
|
548
|
-
vertical = horizontal_or_offset
|
194
|
+
when Numeric
|
195
|
+
horizontal = horizontal_or_offset
|
196
|
+
vertical = horizontal_or_offset
|
549
197
|
else
|
550
198
|
raise RuntimeError.new("Invalid argument sent to Offset(#{horizontal_or_offset.inspect})")
|
551
199
|
end
|
552
200
|
else
|
553
201
|
horizontal = horizontal_or_offset
|
554
202
|
end
|
555
|
-
return
|
203
|
+
return UIOffset.new(horizontal, vertical)
|
556
204
|
end
|
557
205
|
|
558
206
|
end
|