sugarcube 0.1.6 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +137 -22
- data/lib/sugarcube/adjust.rb +93 -0
- data/lib/sugarcube/core_graphics.rb +78 -8
- data/lib/sugarcube/defaults.rb +4 -10
- data/lib/sugarcube/document.rb +1 -1
- data/lib/sugarcube/notifications.rb +1 -3
- data/lib/sugarcube/string.rb +1 -1
- data/lib/sugarcube/uicolor.rb +2 -0
- data/lib/sugarcube/uifont.rb +6 -0
- data/lib/sugarcube/uiimage.rb +2 -0
- data/lib/sugarcube/uiview.rb +39 -9
- data/lib/sugarcube/version.rb +1 -1
- metadata +8 -6
data/README.md
CHANGED
@@ -54,18 +54,6 @@ Examples
|
|
54
54
|
# create a percentage
|
55
55
|
100.0.percent # => 1.00
|
56
56
|
55.0.percent # => 0.55
|
57
|
-
```
|
58
|
-
|
59
|
-
NSNotificationCenter
|
60
|
-
----------------------
|
61
|
-
|
62
|
-
Makes it easy to post a notification to some or all objects.
|
63
|
-
|
64
|
-
```ruby
|
65
|
-
# this one is handy, I think:
|
66
|
-
"my notification".post_notification # => NSNotificationCenter.defaultCenter.postNotificationName("my notification", object:nil)
|
67
|
-
"my notification".post_notification(obj) # => NSNotificationCenter.defaultCenter.postNotificationName("my notification", object:obj)
|
68
|
-
"my notification".post_notification(obj, user: 'dict') # => NSNotificationCenter.defaultCenter.postNotificationName("my notification", object:obj, userInfo:{user: 'dict'})
|
69
57
|
```
|
70
58
|
|
71
59
|
NSURL
|
@@ -76,16 +64,8 @@ Makes it easy to post a notification to some or all objects.
|
|
76
64
|
"https://github.com".nsurl.open # => UIApplication.sharedApplication.openURL(NSURL.URLWithString("https://github.com"))
|
77
65
|
```
|
78
66
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
```ruby
|
83
|
-
['any', 'objects'].save_to_default(:key) # => NSUserDefaults.standardUserDefaults.setObject(['any', 'objects'], forKey: :key)
|
84
|
-
:key.get_default # => NSUserDefaults.standardUserDefaults.objectForKey(:key)
|
85
|
-
```
|
86
|
-
|
87
|
-
String
|
88
|
-
--------
|
67
|
+
NSString
|
68
|
+
----------
|
89
69
|
|
90
70
|
```ruby
|
91
71
|
# UIImage from name
|
@@ -178,4 +158,139 @@ button.off(:all)
|
|
178
158
|
You can only remove handlers by "type", not by the action. e.g. If you bind
|
179
159
|
three `:touch` events, calling `button.off(:touch)` will remove all three.
|
180
160
|
|
161
|
+
NSNotificationCenter
|
162
|
+
----------------------
|
163
|
+
|
164
|
+
Makes it easy to post a notification to some or all objects.
|
165
|
+
|
166
|
+
```ruby
|
167
|
+
# this one is handy, I think:
|
168
|
+
"my notification".post_notification # => NSNotificationCenter.defaultCenter.postNotificationName("my notification", object:nil)
|
169
|
+
"my notification".post_notification(obj) # => NSNotificationCenter.defaultCenter.postNotificationName("my notification", object:obj)
|
170
|
+
"my notification".post_notification(obj, user: 'dict') # => NSNotificationCenter.defaultCenter.postNotificationName("my notification", object:obj, userInfo:{user: 'dict'})
|
171
|
+
```
|
172
|
+
|
173
|
+
NSUserDefaults
|
174
|
+
----------------
|
175
|
+
|
176
|
+
```ruby
|
177
|
+
:key.set_default(['any', 'objects']) # => NSUserDefaults.standardUserDefaults.setObject(['any', 'objects'], forKey: :key)
|
178
|
+
:key.get_default # => NSUserDefaults.standardUserDefaults.objectForKey(:key)
|
179
|
+
```
|
180
|
+
|
181
|
+
This is strange, and backwards, which is just sugarcube's style. But there is
|
182
|
+
one advantage to doing it this way. Compare these two snippets:
|
183
|
+
|
184
|
+
```ruby
|
185
|
+
# BubbleWrap
|
186
|
+
App::Persistance[:test] = { my: 'test' }
|
187
|
+
# sugarcube
|
188
|
+
:test.set_default { my: 'test' }
|
189
|
+
# k, BubbleWrap looks better
|
190
|
+
|
191
|
+
App::Persistance[:test][:my] == 'test' # true
|
192
|
+
:test.get_default[:my] # true, and odd looking - what's my point?
|
193
|
+
|
194
|
+
App::Persistance[:test][:my] = 'new' # nothing is saved. bug
|
195
|
+
:test.get_default[:my] = 'new' # nothing is saved, but that's *obvious*
|
196
|
+
|
197
|
+
test = App::Persistance[:test]
|
198
|
+
test[:my] = 'new'
|
199
|
+
App::Persistance[:test] = test # saved
|
200
|
+
|
201
|
+
test = :test.get_default
|
202
|
+
test[:my] = 'new'
|
203
|
+
:test.set_default test
|
204
|
+
```
|
205
|
+
|
206
|
+
CoreGraphics
|
207
|
+
--------------
|
208
|
+
|
209
|
+
###### Is it `CGMakeRect` or `CGRectMake`?
|
210
|
+
|
211
|
+
Instead, just use `Rect`, `Size` and `Point`. These are namespaced in
|
212
|
+
`SugarCube` module, but I recommend you `include SugarCube` in app_delegate.rb.
|
213
|
+
|
214
|
+
```ruby
|
215
|
+
f = SugarCube::Rect(view.frame) # converts a CGRect into a CGRectArray
|
216
|
+
o = SugarCube::Point(view.frame.origin) # converts a CGPoint into a CGPointArray
|
217
|
+
s = SugarCube::Size(view.frame.size) # converts a CGSize into a CGSizeArray
|
218
|
+
|
219
|
+
# lots of other conversions are possible. Let's assume `include SugarCube`, too
|
220
|
+
# 4 numbers
|
221
|
+
f = Rect(x, y, w, h)
|
222
|
+
# or two arrays
|
223
|
+
p = Point(x, y) # or just [x, y] works, too
|
224
|
+
s = Size(w, h) # again, [w, h] is fine
|
225
|
+
f = Rect(p, s)
|
226
|
+
f = Rect([[x, y], [w, h]]) # same as above (the CG*Array objects will get created for you)
|
227
|
+
|
228
|
+
view.frame = f # Rect returns a CGRectArray, which view.frame can accept
|
229
|
+
```
|
230
|
+
|
231
|
+
###### Animations
|
232
|
+
|
233
|
+
jQuery-like animation methods.
|
234
|
+
|
235
|
+
```ruby
|
236
|
+
# default timeout is 0.3
|
237
|
+
view.fadeout { |view|
|
238
|
+
view.removeFromSuperview
|
239
|
+
}
|
240
|
+
# options:
|
241
|
+
view.fadeout(0.5, delay: 0,
|
242
|
+
options: UIViewAnimationOptionCurveLinear,
|
243
|
+
opacity: 0.5) { |view|
|
244
|
+
view.removeFromSuperview
|
245
|
+
}
|
246
|
+
view.move_to([0, 100]) # move to position 0, 100
|
247
|
+
view.delta_to([0, 100]) # move over 0, down 100, from current position
|
248
|
+
```
|
249
|
+
|
250
|
+
REPL View adjustments
|
251
|
+
-----------------------
|
252
|
+
|
253
|
+
Pixel pushing is an unfortunate but necessary evil. Well, at least we can make
|
254
|
+
it a little less painful.
|
255
|
+
|
256
|
+
These methods help you adjust the frame of a view. They are in the `SugarCube`
|
257
|
+
module so as not to conflict. If you don't want the prefix, `include SugarCube` in
|
258
|
+
app_delegate.rb
|
259
|
+
|
260
|
+
```ruby
|
261
|
+
# if you are in the REPL, you might not be able to click on the view you want...
|
262
|
+
> SugarCube::adjust superview.subviews[4].subviews[1]
|
263
|
+
> SugarCube::up 1
|
264
|
+
> SugarCube::down 1 # same as up -1, obviously
|
265
|
+
> SugarCube::left 1
|
266
|
+
> SugarCube::right 1 # same as up -1, obviously
|
267
|
+
> SugarCube::origin 10, 12 # move to x:10, y:12
|
268
|
+
> SugarCube::wider 1
|
269
|
+
> SugarCube::thinner 1
|
270
|
+
> SugarCube::taller 1
|
271
|
+
> SugarCube::shorter 1
|
272
|
+
> SugarCube::size 100, 10 # set size to width:100, height: 10
|
273
|
+
> SugarCube::restore
|
274
|
+
```
|
275
|
+
|
276
|
+
```ruby
|
277
|
+
> # short versions! and let's assume I ran `include SC`
|
278
|
+
> a superview.subviews[4].subviews[1] # this is not uncommon in the REPL
|
279
|
+
> u # up, default value=1
|
280
|
+
> d # down
|
281
|
+
> l # left
|
282
|
+
> r # right
|
283
|
+
> o 10, 12 # origin, also accepts an array (or Point() object)
|
284
|
+
> w # wider
|
285
|
+
> n # thinner
|
286
|
+
> t # taller
|
287
|
+
> s # shorter
|
288
|
+
> z 100, 10 # size, also accepts an array (or Size() object)
|
289
|
+
> r # restore
|
290
|
+
|
291
|
+
# if you forget what view you are adjusting, run `adjust` again
|
292
|
+
> a
|
293
|
+
=> {UITextField @ x: 46.0 y:214.0, 280.0×33.0} child of UIView
|
294
|
+
```
|
295
|
+
|
181
296
|
[BubbleWrap]: https://github.com/rubymotion/BubbleWrap
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module SugarCube
|
2
|
+
module_function
|
3
|
+
|
4
|
+
def adjust view=nil
|
5
|
+
return @@sugarcube_view if not view
|
6
|
+
|
7
|
+
@@sugarcube_view = view
|
8
|
+
@@sugarcube_restore = view.frame
|
9
|
+
view
|
10
|
+
end
|
11
|
+
alias :a :adjust
|
12
|
+
|
13
|
+
##| ORIGIN
|
14
|
+
def left val=1
|
15
|
+
SugarCube::right -val
|
16
|
+
end
|
17
|
+
alias :l :left
|
18
|
+
|
19
|
+
def right val=1
|
20
|
+
f = @@sugarcube_view.frame
|
21
|
+
f.origin.x += val
|
22
|
+
@@sugarcube_view.frame = f
|
23
|
+
end
|
24
|
+
alias :r :right
|
25
|
+
|
26
|
+
def up val=1
|
27
|
+
SugarCube::down -val
|
28
|
+
end
|
29
|
+
alias :u :up
|
30
|
+
|
31
|
+
def down val=1
|
32
|
+
f = @@sugarcube_view.frame
|
33
|
+
f.origin.y += val
|
34
|
+
@@sugarcube_view.frame = f
|
35
|
+
end
|
36
|
+
alias :d :down
|
37
|
+
|
38
|
+
def origin x, y=nil
|
39
|
+
f = @@sugarcube_view.frame
|
40
|
+
if y
|
41
|
+
f.origin.x = x
|
42
|
+
f.origin.y = y
|
43
|
+
else
|
44
|
+
f.origin = x
|
45
|
+
end
|
46
|
+
@@sugarcube_view.frame = f
|
47
|
+
end
|
48
|
+
alias :o :origin
|
49
|
+
|
50
|
+
##| SIZE
|
51
|
+
def thinner val=1
|
52
|
+
SugarCube::wider -val
|
53
|
+
end
|
54
|
+
alias :n :thinner
|
55
|
+
|
56
|
+
def wider val=1
|
57
|
+
f = @@sugarcube_view.frame
|
58
|
+
f.size.width += val
|
59
|
+
@@sugarcube_view.frame = f
|
60
|
+
end
|
61
|
+
alias :w :wider
|
62
|
+
|
63
|
+
def taller val=1
|
64
|
+
SugarCube::shorter -val
|
65
|
+
end
|
66
|
+
alias :t :taller
|
67
|
+
|
68
|
+
def shorter val=1
|
69
|
+
f = @@sugarcube_view.frame
|
70
|
+
f.size.height += val
|
71
|
+
@@sugarcube_view.frame = f
|
72
|
+
end
|
73
|
+
alias :s :shorter
|
74
|
+
|
75
|
+
def size w, h=nil
|
76
|
+
f = @@sugarcube_view.frame
|
77
|
+
if h
|
78
|
+
f.size.width = w
|
79
|
+
f.size.height = h
|
80
|
+
else
|
81
|
+
f.size = w
|
82
|
+
end
|
83
|
+
@@sugarcube_view.frame = f
|
84
|
+
end
|
85
|
+
alias :z :size
|
86
|
+
|
87
|
+
##| RESTORE
|
88
|
+
def restore
|
89
|
+
@@sugarcube_view.frame = @@sugarcube_restore
|
90
|
+
end
|
91
|
+
alias :r :restore
|
92
|
+
|
93
|
+
end
|
@@ -1,12 +1,34 @@
|
|
1
1
|
|
2
2
|
class CGRectArray < Array
|
3
3
|
|
4
|
+
def initialize args
|
5
|
+
if args.length == 4
|
6
|
+
super [CGPointArray.new([args[0], args[1]]), CGSizeArray.new([args[2], args[3]])]
|
7
|
+
else
|
8
|
+
unless CGPointArray === args[0]
|
9
|
+
args[0] = Point(args[0])
|
10
|
+
end
|
11
|
+
unless CGSizeArray === args[1]
|
12
|
+
args[1] = Size(args[1])
|
13
|
+
end
|
14
|
+
super [args[0], args[1]]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
4
18
|
def origin
|
5
|
-
return
|
19
|
+
return self[0]
|
20
|
+
end
|
21
|
+
|
22
|
+
def origin= val
|
23
|
+
self[0] = Point(val)
|
6
24
|
end
|
7
25
|
|
8
26
|
def size
|
9
|
-
return
|
27
|
+
return self[1]
|
28
|
+
end
|
29
|
+
|
30
|
+
def size= val
|
31
|
+
self[1] = Size(val)
|
10
32
|
end
|
11
33
|
|
12
34
|
end
|
@@ -18,10 +40,18 @@ class CGPointArray < Array
|
|
18
40
|
return self[0]
|
19
41
|
end
|
20
42
|
|
43
|
+
def x= val
|
44
|
+
self[0] = val
|
45
|
+
end
|
46
|
+
|
21
47
|
def y
|
22
48
|
return self[1]
|
23
49
|
end
|
24
50
|
|
51
|
+
def y= val
|
52
|
+
self[1] = val
|
53
|
+
end
|
54
|
+
|
25
55
|
end
|
26
56
|
|
27
57
|
class CGSizeArray < Array
|
@@ -30,28 +60,68 @@ class CGSizeArray < Array
|
|
30
60
|
return self[0]
|
31
61
|
end
|
32
62
|
|
63
|
+
def width= val
|
64
|
+
self[0] = val
|
65
|
+
end
|
66
|
+
|
33
67
|
def height
|
34
68
|
return self[1]
|
35
69
|
end
|
36
70
|
|
71
|
+
def height= val
|
72
|
+
self[1] = val
|
73
|
+
end
|
74
|
+
|
37
75
|
end
|
38
76
|
|
39
77
|
|
40
|
-
|
78
|
+
module SugarCube
|
79
|
+
module_function
|
41
80
|
|
42
|
-
def Size(
|
43
|
-
|
81
|
+
def Size(w_or_size, h=nil)
|
82
|
+
if not h
|
83
|
+
if CGSize === w_or_size
|
84
|
+
w = w_or_size.width
|
85
|
+
h = w_or_size.height
|
86
|
+
elsif Array === w_or_size
|
87
|
+
w = w_or_size[0]
|
88
|
+
h = w_or_size[1]
|
89
|
+
else
|
90
|
+
raise RuntimeError.new("Invalid argument sent to Size(#{w_or_size.inspect})")
|
91
|
+
end
|
92
|
+
else
|
93
|
+
w = w_or_size
|
94
|
+
end
|
95
|
+
return CGSizeArray.new([w, h])
|
44
96
|
end
|
45
97
|
|
46
|
-
def Point(
|
47
|
-
|
98
|
+
def Point(x_or_origin, y=nil)
|
99
|
+
if not y
|
100
|
+
if CGPoint === x_or_origin
|
101
|
+
x = x_or_origin.x
|
102
|
+
y = x_or_origin.y
|
103
|
+
elsif Array === x_or_origin
|
104
|
+
x = x_or_origin[0]
|
105
|
+
y = x_or_origin[1]
|
106
|
+
else
|
107
|
+
raise RuntimeError.new("Invalid argument sent to Point(#{x_or_origin.inspect})")
|
108
|
+
end
|
109
|
+
else
|
110
|
+
x = x_or_origin
|
111
|
+
end
|
112
|
+
return CGPointArray.new([x, y])
|
48
113
|
end
|
49
114
|
|
50
115
|
# Accepts 2 or 4 arguments. 2 arguments should be a point and a size,
|
51
116
|
# 4 should be x, y, w, h
|
52
117
|
def Rect(x_or_origin, y_or_size=nil, w=nil, h=nil)
|
53
118
|
if not y_or_size
|
54
|
-
if
|
119
|
+
if CGRectArray === x_or_origin
|
120
|
+
x = x_or_origin[0][0]
|
121
|
+
y = x_or_origin[0][1]
|
122
|
+
w = x_or_origin[1][0]
|
123
|
+
h = x_or_origin[1][1]
|
124
|
+
elsif CGRect === x_or_origin
|
55
125
|
x = x_or_origin.origin.x
|
56
126
|
y = x_or_origin.origin.y
|
57
127
|
w = x_or_origin.size.width
|
data/lib/sugarcube/defaults.rb
CHANGED
@@ -1,21 +1,15 @@
|
|
1
|
-
|
2
1
|
class Symbol
|
3
2
|
|
4
3
|
def get_default
|
5
4
|
NSUserDefaults.standardUserDefaults.objectForKey(self)
|
6
5
|
end
|
7
6
|
|
8
|
-
def
|
9
|
-
NSUserDefaults.standardUserDefaults.
|
7
|
+
def set_default val
|
8
|
+
NSUserDefaults.standardUserDefaults.setObject(val, forKey:self)
|
10
9
|
end
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
class Object
|
16
|
-
|
17
|
-
def save_to_default(key)
|
18
|
-
NSUserDefaults.standardUserDefaults.setObject(self, forKey:key)
|
11
|
+
def remove_default
|
12
|
+
NSUserDefaults.standardUserDefaults.removeObjectForKey(self)
|
19
13
|
end
|
20
14
|
|
21
15
|
end
|
data/lib/sugarcube/document.rb
CHANGED
data/lib/sugarcube/string.rb
CHANGED
data/lib/sugarcube/uicolor.rb
CHANGED
data/lib/sugarcube/uiimage.rb
CHANGED
data/lib/sugarcube/uiview.rb
CHANGED
@@ -6,19 +6,49 @@ class UIView
|
|
6
6
|
self.addSubview view
|
7
7
|
end
|
8
8
|
|
9
|
-
# i like this idea, but view[0] = view doesn't *look* like an insertion,
|
10
|
-
# it lookes like a replacement... it should be written as
|
11
|
-
# view[0] += sub_view
|
12
|
-
# or
|
13
|
-
# view[0] << sub_view
|
14
|
-
# def []=(index, view)
|
15
|
-
# self.insertSubview(view, atIndex:index)
|
16
|
-
# end
|
17
|
-
|
18
9
|
def to_s
|
19
10
|
"{#{self.class.name} @ x: #{self.frame.origin.x} y:#{self.frame.origin.y}, "\
|
20
11
|
"#{self.frame.size.width}×#{self.frame.size.height}}"\
|
21
12
|
"#{self.superview ? ' child of ' + self.superview.class.name : ''}"
|
22
13
|
end
|
23
14
|
|
15
|
+
def fadeout(duration=0.3, options={}, &after)
|
16
|
+
UIView.animateWithDuration(duration,
|
17
|
+
delay: options[:delay] || 0,
|
18
|
+
options: options[:options] || UIViewAnimationOptionCurveLinear,
|
19
|
+
animations: proc{
|
20
|
+
self.layer.opacity = options[:opacity] || 0
|
21
|
+
}, completion:after
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def move_to(position, duration=0.3, options={}, &after)
|
26
|
+
UIView.animateWithDuration(duration,
|
27
|
+
delay: options[:delay] || 0,
|
28
|
+
options: options[:options] || UIViewAnimationOptionCurveLinear,
|
29
|
+
animations: proc{
|
30
|
+
f = self.frame
|
31
|
+
f.origin = position
|
32
|
+
self.frame = position
|
33
|
+
}, completion:after
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def delta_to(delta, duration=0.3, options={}, &after)
|
38
|
+
f = self.frame
|
39
|
+
delta = Point(delta)
|
40
|
+
position = Point(f.origin)
|
41
|
+
position.x += delta.x
|
42
|
+
position.y += delta.y
|
43
|
+
UIView.animateWithDuration(duration,
|
44
|
+
delay: options[:delay] || 0,
|
45
|
+
options: options[:options] || UIViewAnimationOptionCurveLinear,
|
46
|
+
animations: proc{
|
47
|
+
f = self.frame
|
48
|
+
f.origin = position
|
49
|
+
self.frame = position
|
50
|
+
}, completion:after
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
24
54
|
end
|
data/lib/sugarcube/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sugarcube
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-07-
|
13
|
+
date: 2012-07-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
17
|
-
requirement: &
|
17
|
+
requirement: &70353599174140 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70353599174140
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: rspec
|
28
|
-
requirement: &
|
28
|
+
requirement: &70353599189900 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,7 +33,7 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70353599189900
|
37
37
|
description: ! 'CocoaTouch/iOS is a *verbose* framework. These extensions hope to
|
38
38
|
make
|
39
39
|
|
@@ -64,6 +64,7 @@ files:
|
|
64
64
|
- README.md
|
65
65
|
- Rakefile
|
66
66
|
- lib/sugarcube.rb
|
67
|
+
- lib/sugarcube/adjust.rb
|
67
68
|
- lib/sugarcube/core_graphics.rb
|
68
69
|
- lib/sugarcube/defaults.rb
|
69
70
|
- lib/sugarcube/document.rb
|
@@ -76,6 +77,7 @@ files:
|
|
76
77
|
- lib/sugarcube/symbol/symbol_uicolor.rb
|
77
78
|
- lib/sugarcube/uicolor.rb
|
78
79
|
- lib/sugarcube/uicontrol.rb
|
80
|
+
- lib/sugarcube/uifont.rb
|
79
81
|
- lib/sugarcube/uiimage.rb
|
80
82
|
- lib/sugarcube/uiview.rb
|
81
83
|
- lib/sugarcube/version.rb
|