sugarcube 0.1.0 → 0.1.1
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.
- data/.gitignore +3 -0
- data/README.md +127 -0
- data/Rakefile +1 -0
- data/lib/sugarcube.rb +10 -0
- data/lib/sugarcube/exceptions.rb +2 -0
- data/lib/sugarcube/fixnum.rb +24 -0
- data/lib/sugarcube/float.rb +9 -0
- data/lib/sugarcube/string.rb +35 -0
- data/lib/sugarcube/symbol.rb +190 -0
- data/lib/sugarcube/symbol/symbol_uicolor.rb +172 -0
- data/lib/sugarcube/uicolor.rb +59 -0
- data/lib/sugarcube/uicontrol.rb +46 -0
- data/lib/sugarcube/uiimage.rb +14 -0
- data/lib/sugarcube/uiview.rb +24 -0
- data/lib/sugarcube/version.rb +3 -0
- data/sugarcube.gemspec +34 -0
- metadata +62 -11
data/.gitignore
ADDED
data/README.md
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
sugarcube
|
2
|
+
=========
|
3
|
+
|
4
|
+
Some sugar for your cocoa, or your tea.
|
5
|
+
|
6
|
+
About
|
7
|
+
-----
|
8
|
+
|
9
|
+
CocoaTouch/iOS is a *verbose* framework. These extensions hope to make
|
10
|
+
development in rubymotion more enjoyable by tacking "UI" methods onto the base
|
11
|
+
classes (String, Fixnum, Float). With sugarcube, you can create a color from an
|
12
|
+
integer or symbol, or create a UIFont or UIImage from a string.
|
13
|
+
|
14
|
+
Some UI classes are opened up as well, like adding the '<<' operator to a UIView
|
15
|
+
instance, instead of view.addSubview(subview), you can use the more idiomatic:
|
16
|
+
view << subview.
|
17
|
+
|
18
|
+
examples
|
19
|
+
========
|
20
|
+
|
21
|
+
Fixnum
|
22
|
+
--------
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
# create a UIColor from a hex value
|
26
|
+
0xffffff.uicolor # => UIColor.colorWithRed(1.0, green:1.0, blue:1.0, alpha:1.0)
|
27
|
+
0xffffff.uicolor(0.5) # => UIColor.colorWithRed(1.0, green:1.0, blue:1.0, alpha:0.5)
|
28
|
+
|
29
|
+
# create a percentage
|
30
|
+
100.percent # => 1.00
|
31
|
+
55.percent # => 0.55
|
32
|
+
```
|
33
|
+
|
34
|
+
Float
|
35
|
+
-------
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
# create a percentage
|
39
|
+
100.0.percent # => 1.00
|
40
|
+
55.0.percent # => 0.55
|
41
|
+
```
|
42
|
+
|
43
|
+
String
|
44
|
+
--------
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
# UIImage from name
|
48
|
+
"my_image".uiimage # => UIImage.imageNamed("my_image")
|
49
|
+
# (if you have an image named "blue", use "blue".uiimage.uicolor)
|
50
|
+
|
51
|
+
# UIFont from name
|
52
|
+
"my_font".uifont # => UIFont.fontWithName("my_font", size:UIFont.systemFontSize)
|
53
|
+
"my_font".uifont(20) # => UIFont.fontWithName("my_font", size:20)
|
54
|
+
|
55
|
+
# UIColor from color name OR image name OR hex code
|
56
|
+
"blue".uicolor == :blue.uicolor # => UIColor.blueColor
|
57
|
+
"#ff00ff".uicolor == :fuchsia.uicolor == 0xff00ff.uicolor # => UIColor.colorWithRed(1.0, green:0.0, blue:1.0, alpha:1.0)
|
58
|
+
"#f0f".uicolor(0.5) == :fuchsia.uicolor(0.5) == 0xff00ff.uicolor(0.5) # => UIColor.colorWithRed(1.0, green:1.0, blue:1.0, alpha:0.5)
|
59
|
+
# note: 0xf0f.uicolor == 0x00f0f.uicolor. There's no way to tell the difference
|
60
|
+
# at run time between those two Fixnum literals.
|
61
|
+
"my_image".uicolor == "my_image".uiimage.uicolor # => UIColor.colorWithPatternImage(UIImage.imageNamed("my_image"))
|
62
|
+
|
63
|
+
# NSLocalizedString from string
|
64
|
+
"hello".localized # => NSBundle.mainBundle.localizedStringForKey("hello", value:nil, table:nil)
|
65
|
+
"hello".localized('Hello!', 'hello_table') # => ...("hello", value:'Hello!', table:'hello_table')
|
66
|
+
```
|
67
|
+
|
68
|
+
Symbol
|
69
|
+
--------
|
70
|
+
|
71
|
+
This is the "big daddy". Lots of sugar here...
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
:center.uialignment # => UITextAlignmentCenter
|
75
|
+
:upside_down.uiorientation # => UIDeviceOrientationPortraitUpsideDown
|
76
|
+
:rounded.uibuttontype # => UIButtonTypeRoundedRect
|
77
|
+
:highlighted.uicontrolstate # => UIControlStateHighlighted
|
78
|
+
:touch.uicontrolevent # => UIControlEventTouchUpInside
|
79
|
+
:all.uicontrolevent # => UIControlEventAllEvents
|
80
|
+
:blue.uicolor # UIColor.blueColor
|
81
|
+
# all CSS colors are supported, and alpha
|
82
|
+
# (no "grey"s, only "gray"s, consistent with UIKit, which only provides "grayColor")
|
83
|
+
:firebrick.uicolor(0.25) # => 0xb22222.uicolor(0.25)
|
84
|
+
:bold.uifont # UIFont.boldSystemFontOfSize(UIFont.systemFontSize)
|
85
|
+
:bold.uifont(10) # UIFont.boldSystemFontOfSize(10)
|
86
|
+
:small.uifontsize # => UIFont.smallSystemFontSize
|
87
|
+
:small.uifont # => UIFont.systemFontOfSize(:small.uifontsize)
|
88
|
+
:bold.uifont(:small) # UIFont.boldSystemFontOfSize(:small.uifontsize)
|
89
|
+
```
|
90
|
+
|
91
|
+
UIImage
|
92
|
+
---------
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
image = "my_image".uiimage
|
96
|
+
image.uicolor # => UIColor.colorWithPatternImage(image)
|
97
|
+
```
|
98
|
+
|
99
|
+
UIView
|
100
|
+
--------
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
self.view << subview # => self.view.addSubview(subview)
|
104
|
+
```
|
105
|
+
|
106
|
+
UIControl
|
107
|
+
-----------
|
108
|
+
|
109
|
+
Inspired by BubbleWrap's `when` method, but I prefer jQuery-style verbs and
|
110
|
+
sugarcube symbols.
|
111
|
+
|
112
|
+
```ruby
|
113
|
+
button = UIButton.alloc.initWithFrame([0, 0, 10, 10])
|
114
|
+
|
115
|
+
button.on(:touch) { my_code }
|
116
|
+
button.on(:touchupoutside, :touchcancel) { |event|
|
117
|
+
puts event.inspect
|
118
|
+
# my_code...
|
119
|
+
}
|
120
|
+
|
121
|
+
# remove handlers
|
122
|
+
button.off(:touch, :touchupoutside, :touchcancel)
|
123
|
+
button.off(:all)
|
124
|
+
```
|
125
|
+
|
126
|
+
You can only remove handlers by "type", not by the action. e.g. If you bind
|
127
|
+
three `:touch` events, calling `button.off(:touch)` will remove all three.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
data/lib/sugarcube.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
unless defined?(Motion::Project::Config)
|
2
|
+
raise "This file must be required within a RubyMotion project Rakefile."
|
3
|
+
end
|
4
|
+
|
5
|
+
|
6
|
+
Motion::Project::App.setup do |app|
|
7
|
+
Dir.glob(File.join(File.dirname(__FILE__), 'sugarcube/*.rb')).each do |file|
|
8
|
+
app.files.unshift(file)
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
class Fixnum
|
4
|
+
|
5
|
+
# 0xffffff.uicolor
|
6
|
+
# 0xffffff.uicolor(0.33)
|
7
|
+
# =>
|
8
|
+
# UIColor.colorWithRed(1.0, green:1.0, red: 1.0, alpha:1.0)
|
9
|
+
# UIColor.colorWithRed(1.0, green:1.0, red: 1.0, alpha:0.33)
|
10
|
+
def uicolor(alpha=nil)
|
11
|
+
alpha = 1.0 if alpha.nil?
|
12
|
+
|
13
|
+
red = ((self & 0xFF0000) >> 16).to_f / 255.0
|
14
|
+
green = ((self & 0xFF00) >> 8).to_f / 255.0
|
15
|
+
blue = (self & 0xFF).to_f / 255.0
|
16
|
+
|
17
|
+
UIColor.colorWithRed(red, green:green, blue:blue, alpha:alpha.to_f)
|
18
|
+
end
|
19
|
+
|
20
|
+
def percent
|
21
|
+
self.to_f.percent
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class String
|
2
|
+
|
3
|
+
def uiimage
|
4
|
+
UIImage.imageNamed(self)
|
5
|
+
end
|
6
|
+
|
7
|
+
def uifont(size=UIFont.systemFontSize)
|
8
|
+
UIFont.fontWithName(self, size:size)
|
9
|
+
end
|
10
|
+
|
11
|
+
def uicolor(alpha=nil)
|
12
|
+
if self[0,1] == '#'
|
13
|
+
# #fff
|
14
|
+
if self.length == 4
|
15
|
+
return (self[1] * 2 + self[2] * 2 + self[3] * 2).to_i(16).uicolor(alpha)
|
16
|
+
end
|
17
|
+
# else
|
18
|
+
return self[1..-1].to_i(16).uicolor(alpha)
|
19
|
+
end
|
20
|
+
|
21
|
+
begin
|
22
|
+
self.to_sym.uicolor(alpha)
|
23
|
+
rescue SugarNotFoundException
|
24
|
+
self.uiimage.uicolor(alpha)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# This can be called as `"Hello".localized` or `"Hello"._`. The `str._`
|
29
|
+
# syntax is meant to be reminiscent of gettext-style `_(str)`.
|
30
|
+
def localized(value=nil, table=nil)
|
31
|
+
NSBundle.mainBundle.localizedStringForKey(self, value:value, table:table)
|
32
|
+
end
|
33
|
+
alias :_ :localized
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,190 @@
|
|
1
|
+
=begin
|
2
|
+
Adds some UI classes to the Symbol class. These methods are prefixed with `ui`
|
3
|
+
to make their intent clear, and to provide a little bit of "namespacing"
|
4
|
+
|
5
|
+
# alignment
|
6
|
+
:left.uialignment => UITextAlignmentLeft
|
7
|
+
|
8
|
+
# uicolors
|
9
|
+
:black.uicolor => UIColor.blackColor
|
10
|
+
|
11
|
+
:darkturquoise.uicolor => UIColor.blackColor
|
12
|
+
|
13
|
+
# fonts
|
14
|
+
:system.uifont => UIFont.systemFontOfSize(UIFont.systemFontSize)
|
15
|
+
:label.uifont => UIFont.systemFontOfSize(UIFont.labelFontSize)
|
16
|
+
|
17
|
+
You can extend the defaults by adding entries:
|
18
|
+
|
19
|
+
Symbol.css_colors[:my_color] = 0x123456
|
20
|
+
Symbol.font_sizes[:big] = 40
|
21
|
+
|
22
|
+
:my_color.uicolor => UIColor
|
23
|
+
:big.uifont => UIFont
|
24
|
+
=end
|
25
|
+
class Symbol
|
26
|
+
class << self
|
27
|
+
attr_accessor :devices
|
28
|
+
attr_accessor :alignments
|
29
|
+
attr_accessor :orientations
|
30
|
+
attr_accessor :buttontypes
|
31
|
+
attr_accessor :bordertypes
|
32
|
+
attr_accessor :controlstates
|
33
|
+
attr_accessor :controlevents
|
34
|
+
attr_accessor :system_fonts
|
35
|
+
attr_accessor :font_sizes
|
36
|
+
end
|
37
|
+
|
38
|
+
@devices = {
|
39
|
+
iphone: UIUserInterfaceIdiomPhone,
|
40
|
+
ipad: UIUserInterfaceIdiomPad,
|
41
|
+
}
|
42
|
+
|
43
|
+
@alignments = {
|
44
|
+
left: UITextAlignmentLeft,
|
45
|
+
right: UITextAlignmentRight,
|
46
|
+
center: UITextAlignmentCenter,
|
47
|
+
}
|
48
|
+
|
49
|
+
@orientations = {
|
50
|
+
portrait: UIInterfaceOrientationPortrait,
|
51
|
+
upside_down: UIInterfaceOrientationPortraitUpsideDown,
|
52
|
+
left: UIInterfaceOrientationLandscapeLeft,
|
53
|
+
right: UIInterfaceOrientationLandscapeRight,
|
54
|
+
}
|
55
|
+
|
56
|
+
@buttontypes = {
|
57
|
+
custom: UIButtonTypeCustom,
|
58
|
+
rounded: UIButtonTypeRoundedRect,
|
59
|
+
rounded_rect: UIButtonTypeRoundedRect,
|
60
|
+
detail: UIButtonTypeDetailDisclosure,
|
61
|
+
detail_disclosure: UIButtonTypeDetailDisclosure,
|
62
|
+
info: UIButtonTypeInfoLight,
|
63
|
+
info_light: UIButtonTypeInfoLight,
|
64
|
+
info_dark: UIButtonTypeInfoDark,
|
65
|
+
contact: UIButtonTypeContactAdd,
|
66
|
+
contact_add: UIButtonTypeContactAdd,
|
67
|
+
}
|
68
|
+
|
69
|
+
@bordertypes = {
|
70
|
+
none: UITextBorderStyleNone,
|
71
|
+
line: UITextBorderStyleLine,
|
72
|
+
bezel: UITextBorderStyleBezel,
|
73
|
+
rounded: UITextBorderStyleRoundedRect,
|
74
|
+
rounded_rect: UITextBorderStyleRoundedRect,
|
75
|
+
}
|
76
|
+
|
77
|
+
@controlstates = {
|
78
|
+
normal: UIControlStateNormal,
|
79
|
+
highlighted: UIControlStateHighlighted,
|
80
|
+
disabled: UIControlStateDisabled,
|
81
|
+
selected: UIControlStateSelected,
|
82
|
+
application: UIControlStateApplication,
|
83
|
+
}
|
84
|
+
|
85
|
+
@controlevents = {
|
86
|
+
touch: UIControlEventTouchUpInside,
|
87
|
+
touch_down: UIControlEventTouchDown,
|
88
|
+
|
89
|
+
touch_down_repeat: UIControlEventTouchDownRepeat,
|
90
|
+
touch_drag_inside: UIControlEventTouchDragInside,
|
91
|
+
touch_drag_outside: UIControlEventTouchDragOutside,
|
92
|
+
touch_drag_enter: UIControlEventTouchDragEnter,
|
93
|
+
touch_drag_exit: UIControlEventTouchDragExit,
|
94
|
+
touch_up_inside: UIControlEventTouchUpInside,
|
95
|
+
touch_up_outside: UIControlEventTouchUpOutside,
|
96
|
+
touch_cancel: UIControlEventTouchCancel,
|
97
|
+
|
98
|
+
value_changed: UIControlEventValueChanged,
|
99
|
+
|
100
|
+
editing_did_begin: UIControlEventEditingDidBegin,
|
101
|
+
editing_changed: UIControlEventEditingChanged,
|
102
|
+
editing_did_end: UIControlEventEditingDidEnd,
|
103
|
+
editing_did_endonexit: UIControlEventEditingDidEndOnExit,
|
104
|
+
|
105
|
+
all_touch: UIControlEventAllTouchEvents,
|
106
|
+
all_editing: UIControlEventAllEditingEvents,
|
107
|
+
application: UIControlEventApplicationReserved,
|
108
|
+
system: UIControlEventSystemReserved,
|
109
|
+
all: UIControlEventAllEvents,
|
110
|
+
}
|
111
|
+
|
112
|
+
@system_fonts = {
|
113
|
+
system: :"systemFontOfSize:",
|
114
|
+
bold: :"boldSystemFontOfSize:",
|
115
|
+
italic: :"italicSystemFontOfSize:",
|
116
|
+
}
|
117
|
+
|
118
|
+
@font_sizes = {
|
119
|
+
label: :labelFontSize,
|
120
|
+
button: :buttonFontSize,
|
121
|
+
small: :smallSystemFontSize,
|
122
|
+
system: :systemFontSize,
|
123
|
+
}
|
124
|
+
|
125
|
+
private
|
126
|
+
def look_in(here)
|
127
|
+
return here[self] if here.has_key? self
|
128
|
+
raise SugarNotFoundException.new(self)
|
129
|
+
end
|
130
|
+
|
131
|
+
public
|
132
|
+
def uidevice
|
133
|
+
look_in(Symbol.devices)
|
134
|
+
if Symbol.devices[self]
|
135
|
+
return Symbol.devices[self]
|
136
|
+
end
|
137
|
+
raise SugarNotFoundException.new(self)
|
138
|
+
end
|
139
|
+
|
140
|
+
def uialignment
|
141
|
+
look_in(Symbol.alignments)
|
142
|
+
end
|
143
|
+
|
144
|
+
def uiorientation
|
145
|
+
look_in(Symbol.orientations)
|
146
|
+
end
|
147
|
+
|
148
|
+
def uibuttontype
|
149
|
+
look_in(Symbol.buttontypes)
|
150
|
+
end
|
151
|
+
|
152
|
+
def uibordertype
|
153
|
+
look_in(Symbol.bordertypes)
|
154
|
+
end
|
155
|
+
|
156
|
+
def uicontrolstate
|
157
|
+
look_in(Symbol.controlstates)
|
158
|
+
end
|
159
|
+
|
160
|
+
def uicontrolevent
|
161
|
+
look_in(Symbol.controlevents)
|
162
|
+
end
|
163
|
+
|
164
|
+
def uifont(size=UIFont.systemFontSize)
|
165
|
+
# system fonts
|
166
|
+
begin
|
167
|
+
font = look_in(Symbol.system_fonts)
|
168
|
+
if Symbol === size
|
169
|
+
size = Symbol.font_sizes.fetch(size).uifontsize
|
170
|
+
end
|
171
|
+
return UIFont.send(font, size)
|
172
|
+
rescue SugarNotFoundException
|
173
|
+
size = look_in(font_sizes).uifontsize
|
174
|
+
return UIFont.systemFontOfSize(size)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def uifontsize
|
179
|
+
size = look_in(Symbol.system_fonts)
|
180
|
+
if Symbol === size
|
181
|
+
return UIFont.send(Symbol.font_sizes[self])
|
182
|
+
end
|
183
|
+
return size.to_f
|
184
|
+
end
|
185
|
+
|
186
|
+
def to_teacup_stylesheet
|
187
|
+
Teacup::Stylesheet[self]
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
class Symbol
|
2
|
+
class << self
|
3
|
+
attr_accessor :uicolors
|
4
|
+
attr_accessor :css_colors
|
5
|
+
end
|
6
|
+
|
7
|
+
def uicolor(alpha=nil)
|
8
|
+
begin
|
9
|
+
# iOS colors
|
10
|
+
color = UIColor.send(look_in(Symbol.uicolors))
|
11
|
+
|
12
|
+
if not alpha.nil?
|
13
|
+
color = color.colorWithAlphaComponent(alpha.to_f)
|
14
|
+
end
|
15
|
+
rescue SugarNotFoundException
|
16
|
+
# css colors
|
17
|
+
color = look_in(Symbol.css_colors).uicolor(alpha)
|
18
|
+
end
|
19
|
+
|
20
|
+
color
|
21
|
+
end
|
22
|
+
|
23
|
+
@uicolors = {
|
24
|
+
black: :blackColor,
|
25
|
+
blue: :blueColor,
|
26
|
+
brown: :brownColor,
|
27
|
+
cyan: :cyanColor,
|
28
|
+
darkgray: :darkGrayColor,
|
29
|
+
gray: :grayColor,
|
30
|
+
green: :greenColor,
|
31
|
+
lightgray: :lightGrayColor,
|
32
|
+
magenta: :magentaColor,
|
33
|
+
orange: :orangeColor,
|
34
|
+
purple: :purpleColor,
|
35
|
+
red: :redColor,
|
36
|
+
yellow: :yellowColor,
|
37
|
+
white: :whiteColor,
|
38
|
+
clear: :clearColor,
|
39
|
+
|
40
|
+
table_view: :groupTableViewBackgroundColor,
|
41
|
+
}
|
42
|
+
|
43
|
+
@css_colors = {
|
44
|
+
aliceblue: 0xf0f8ff,
|
45
|
+
antiquewhite: 0xfaebd7,
|
46
|
+
aqua: 0x00ffff,
|
47
|
+
aquamarine: 0x7fffd4,
|
48
|
+
azure: 0xf0ffff,
|
49
|
+
beige: 0xf5f5dc,
|
50
|
+
bisque: 0xffe4c4,
|
51
|
+
blanchedalmond: 0xffebcd,
|
52
|
+
blueviolet: 0x8a2be2,
|
53
|
+
burlywood: 0xdeb887,
|
54
|
+
cadetblue: 0x5f9ea0,
|
55
|
+
chartreuse: 0x7fff00,
|
56
|
+
chocolate: 0xd2691e,
|
57
|
+
coral: 0xff7f50,
|
58
|
+
cornflowerblue: 0x6495ed,
|
59
|
+
cornsilk: 0xfff8dc,
|
60
|
+
crimson: 0xdc143c,
|
61
|
+
darkblue: 0x00008b,
|
62
|
+
darkcyan: 0x008b8b,
|
63
|
+
darkgoldenrod: 0xb8860b,
|
64
|
+
darkgreen: 0x006400,
|
65
|
+
darkkhaki: 0xbdb76b,
|
66
|
+
darkmagenta: 0x8b008b,
|
67
|
+
darkolivegreen: 0x556b2f,
|
68
|
+
darkorange: 0xff8c00,
|
69
|
+
darkorchid: 0x9932cc,
|
70
|
+
darkred: 0x8b0000,
|
71
|
+
darksalmon: 0xe9967a,
|
72
|
+
darkseagreen: 0x8fbc8f,
|
73
|
+
darkslateblue: 0x483d8b,
|
74
|
+
darkslategray: 0x2f4f4f,
|
75
|
+
darkturquoise: 0x00ced1,
|
76
|
+
darkviolet: 0x9400d3,
|
77
|
+
deeppink: 0xff1493,
|
78
|
+
deepskyblue: 0x00bfff,
|
79
|
+
dimgray: 0x696969,
|
80
|
+
dodgerblue: 0x1e90ff,
|
81
|
+
firebrick: 0xb22222,
|
82
|
+
floralwhite: 0xfffaf0,
|
83
|
+
forestgreen: 0x228b22,
|
84
|
+
fuchsia: 0xff00ff,
|
85
|
+
gainsboro: 0xdcdcdc,
|
86
|
+
ghostwhite: 0xf8f8ff,
|
87
|
+
gold: 0xffd700,
|
88
|
+
goldenrod: 0xdaa520,
|
89
|
+
greenyellow: 0xadff2f,
|
90
|
+
honeydew: 0xf0fff0,
|
91
|
+
hotpink: 0xff69b4,
|
92
|
+
indianred: 0xcd5c5c,
|
93
|
+
indigo: 0x4b0082,
|
94
|
+
ivory: 0xfffff0,
|
95
|
+
khaki: 0xf0e68c,
|
96
|
+
lavender: 0xe6e6fa,
|
97
|
+
lavenderblush: 0xfff0f5,
|
98
|
+
lawngreen: 0x7cfc00,
|
99
|
+
lemonchiffon: 0xfffacd,
|
100
|
+
lightblue: 0xadd8e6,
|
101
|
+
lightcoral: 0xf08080,
|
102
|
+
lightcyan: 0xe0ffff,
|
103
|
+
lightgoldenrodyellow: 0xfafad2,
|
104
|
+
lightgreen: 0x90ee90,
|
105
|
+
lightpink: 0xffb6c1,
|
106
|
+
lightsalmon: 0xffa07a,
|
107
|
+
lightseagreen: 0x20b2aa,
|
108
|
+
lightskyblue: 0x87cefa,
|
109
|
+
lightslategray: 0x778899,
|
110
|
+
lightsteelblue: 0xb0c4de,
|
111
|
+
lightyellow: 0xffffe0,
|
112
|
+
lime: 0x00ff00,
|
113
|
+
limegreen: 0x32cd32,
|
114
|
+
linen: 0xfaf0e6,
|
115
|
+
maroon: 0x800000,
|
116
|
+
mediumaquamarine: 0x66cdaa,
|
117
|
+
mediumblue: 0x0000cd,
|
118
|
+
mediumorchid: 0xba55d3,
|
119
|
+
mediumpurple: 0x9370d8,
|
120
|
+
mediumseagreen: 0x3cb371,
|
121
|
+
mediumslateblue: 0x7b68ee,
|
122
|
+
mediumspringgreen: 0x00fa9a,
|
123
|
+
mediumturquoise: 0x48d1cc,
|
124
|
+
mediumvioletred: 0xc71585,
|
125
|
+
midnightblue: 0x191970,
|
126
|
+
mintcream: 0xf5fffa,
|
127
|
+
mistyrose: 0xffe4e1,
|
128
|
+
moccasin: 0xffe4b5,
|
129
|
+
navajowhite: 0xffdead,
|
130
|
+
navy: 0x000080,
|
131
|
+
oldlace: 0xfdf5e6,
|
132
|
+
olive: 0x808000,
|
133
|
+
olivedrab: 0x6b8e23,
|
134
|
+
orangered: 0xff4500,
|
135
|
+
orchid: 0xda70d6,
|
136
|
+
palegoldenrod: 0xeee8aa,
|
137
|
+
palegreen: 0x98fb98,
|
138
|
+
paleturquoise: 0xafeeee,
|
139
|
+
palevioletred: 0xd87093,
|
140
|
+
papayawhip: 0xffefd5,
|
141
|
+
peachpuff: 0xffdab9,
|
142
|
+
peru: 0xcd853f,
|
143
|
+
pink: 0xffc0cb,
|
144
|
+
plum: 0xdda0dd,
|
145
|
+
powderblue: 0xb0e0e6,
|
146
|
+
rosybrown: 0xbc8f8f,
|
147
|
+
royalblue: 0x4169e1,
|
148
|
+
saddlebrown: 0x8b4513,
|
149
|
+
salmon: 0xfa8072,
|
150
|
+
sandybrown: 0xf4a460,
|
151
|
+
seagreen: 0x2e8b57,
|
152
|
+
seashell: 0xfff5ee,
|
153
|
+
sienna: 0xa0522d,
|
154
|
+
silver: 0xc0c0c0,
|
155
|
+
skyblue: 0x87ceeb,
|
156
|
+
slateblue: 0x6a5acd,
|
157
|
+
slategray: 0x708090,
|
158
|
+
snow: 0xfffafa,
|
159
|
+
springgreen: 0x00ff7f,
|
160
|
+
steelblue: 0x4682b4,
|
161
|
+
tan: 0xd2b48c,
|
162
|
+
teal: 0x008080,
|
163
|
+
thistle: 0xd8bfd8,
|
164
|
+
tomato: 0xff6347,
|
165
|
+
turquoise: 0x40e0d0,
|
166
|
+
violet: 0xee82ee,
|
167
|
+
wheat: 0xf5deb3,
|
168
|
+
whitesmoke: 0xf5f5f5,
|
169
|
+
yellowgreen: 0x9acd32,
|
170
|
+
}
|
171
|
+
|
172
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
|
2
|
+
class UIColor
|
3
|
+
|
4
|
+
def to_s
|
5
|
+
alpha = self.alpha.to_s
|
6
|
+
|
7
|
+
Symbol.uicolors.each_pair do |color, method|
|
8
|
+
if UIColor.send(method) == self
|
9
|
+
return "UIColor.#{method}(#{alpha})"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
red = (self.red * 255).to_i << 16
|
14
|
+
green = (self.green * 255).to_i << 8
|
15
|
+
blue = (self.blue * 255).to_i
|
16
|
+
my_color = red + green + blue
|
17
|
+
Symbol.css_colors.each_pair do |color, hex|
|
18
|
+
if hex == my_color
|
19
|
+
return "UIColor.color(#{color.inspect}, #{alpha})"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
return "UIColor.color(#{red}, #{green}, #{blue}, #{alpha})"
|
23
|
+
end
|
24
|
+
|
25
|
+
def color
|
26
|
+
if not @color
|
27
|
+
red = Pointer.new(:float)
|
28
|
+
green = Pointer.new(:float)
|
29
|
+
blue = Pointer.new(:float)
|
30
|
+
alpha = Pointer.new(:float)
|
31
|
+
self.getRed(red, green:green, blue:blue, alpha:alpha)
|
32
|
+
@color = {
|
33
|
+
red: red[0],
|
34
|
+
green: green[0],
|
35
|
+
blue: blue[0],
|
36
|
+
alpha: alpha[0],
|
37
|
+
}
|
38
|
+
end
|
39
|
+
@color
|
40
|
+
end
|
41
|
+
|
42
|
+
def red
|
43
|
+
self.color[:red]
|
44
|
+
end
|
45
|
+
|
46
|
+
def green
|
47
|
+
self.color[:green]
|
48
|
+
end
|
49
|
+
|
50
|
+
def blue
|
51
|
+
self.color[:blue]
|
52
|
+
end
|
53
|
+
|
54
|
+
def alpha
|
55
|
+
self.color[:alpha]
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
class UIControl
|
4
|
+
|
5
|
+
# event blocks need to be retained, and the addTarget method explicitly does
|
6
|
+
# *not* retain `target`. This makes sure that callbacks are retained by
|
7
|
+
# pushing the block onto a stack.
|
8
|
+
def sugarcube_callbacks
|
9
|
+
@sugarcube_callbacks ||= Hash.new { |hash, key| hash[key] = [] }
|
10
|
+
end
|
11
|
+
|
12
|
+
# Add event handlers to UIControls
|
13
|
+
#
|
14
|
+
# @example
|
15
|
+
# button = UIButton.alloc.initWithFrame([0, 0, 10, 10])
|
16
|
+
# button.on(:touch) { my_code }
|
17
|
+
# button.on(:touchupoutside, :touchcancel) { my_code }
|
18
|
+
def on(*events, &block)
|
19
|
+
events.each do |event|
|
20
|
+
event = event.uicontrolevent unless Fixnum === event
|
21
|
+
|
22
|
+
sugarcube_callbacks[event].push block
|
23
|
+
addTarget(block, action: :call, forControlEvents:event)
|
24
|
+
end
|
25
|
+
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
# Removes all events that were bound with `on`.
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
# button.off(:touch)
|
33
|
+
# button.off(:touchupoutside, :touchcancel)
|
34
|
+
def off(*events)
|
35
|
+
events.each do |event|
|
36
|
+
event = event.uicontrolevent unless Fixnum === event
|
37
|
+
|
38
|
+
sugarcube_callbacks[event].each do |block|
|
39
|
+
self.removeTarget(block, action: :call, forControlEvents:event)
|
40
|
+
end
|
41
|
+
sugarcube_callbacks.delete(event)
|
42
|
+
end
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
class UIView
|
4
|
+
|
5
|
+
def <<(view)
|
6
|
+
self.addSubview view
|
7
|
+
end
|
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
|
+
def to_s
|
19
|
+
"{#{self.class.name} @ x: #{self.frame.origin.x} y:#{self.frame.origin.y}, "\
|
20
|
+
"#{self.frame.size.width}×#{self.frame.size.height}}"\
|
21
|
+
"#{self.superview ? ' child of ' + self.superview.class.name : ''}"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/sugarcube.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/sugarcube/version.rb', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = 'sugarcube'
|
6
|
+
gem.version = SugarCube::Version
|
7
|
+
|
8
|
+
gem.authors = ['Colin Thomas-Arnold', 'Chris Clarke']
|
9
|
+
gem.email = ['colin@fusionbox.com']
|
10
|
+
gem.summary = %{Extensions for Ruby to make Rubymotion development more enjoyable, and hopefully more rubyesque!}
|
11
|
+
gem.description = <<-DESC
|
12
|
+
CocoaTouch/iOS is a *verbose* framework. These extensions hope to make
|
13
|
+
development in rubymotion more enjoyable by tacking "UI" methods onto the
|
14
|
+
base classes (String, Fixnum, Float). With sugarcube, you can create a
|
15
|
+
color from an integer or symbol, or create a UIFont or UIImage from a
|
16
|
+
string.
|
17
|
+
|
18
|
+
Some UI classes are opened up as well, like adding the '<<' operator to a
|
19
|
+
UIView instance, instead of view.addSubview(subview), you can use the more
|
20
|
+
idiomatic: view << subview.
|
21
|
+
DESC
|
22
|
+
|
23
|
+
gem.homepage = 'https://github.com/fusionbox/sugarcube'
|
24
|
+
|
25
|
+
gem.files = `git ls-files`.split($\)
|
26
|
+
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
27
|
+
gem.test_files = gem.files.grep(%r{^spec/})
|
28
|
+
|
29
|
+
gem.require_paths = ['lib']
|
30
|
+
|
31
|
+
gem.add_dependency 'rake'
|
32
|
+
gem.add_development_dependency 'rspec'
|
33
|
+
|
34
|
+
end
|
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.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,19 +11,70 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
date: 2012-07-10 00:00:00.000000000 Z
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rake
|
17
|
+
requirement: &70117501802540 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *70117501802540
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rspec
|
28
|
+
requirement: &70117501801900 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *70117501801900
|
37
|
+
description: ! 'CocoaTouch/iOS is a *verbose* framework. These extensions hope to
|
38
|
+
make
|
39
|
+
|
40
|
+
development in rubymotion more enjoyable by tacking "UI" methods onto the
|
41
|
+
|
42
|
+
base classes (String, Fixnum, Float). With sugarcube, you can create a
|
43
|
+
|
44
|
+
color from an integer or symbol, or create a UIFont or UIImage from a
|
45
|
+
|
46
|
+
string.
|
47
|
+
|
48
|
+
|
49
|
+
Some UI classes are opened up as well, like adding the ''<<'' operator to a
|
50
|
+
|
51
|
+
UIView instance, instead of view.addSubview(subview), you can use the more
|
52
|
+
|
53
|
+
idiomatic: view << subview.
|
54
|
+
|
55
|
+
'
|
56
|
+
email:
|
57
|
+
- colin@fusionbox.com
|
23
58
|
executables: []
|
24
59
|
extensions: []
|
25
60
|
extra_rdoc_files: []
|
26
|
-
files:
|
61
|
+
files:
|
62
|
+
- .gitignore
|
63
|
+
- README.md
|
64
|
+
- Rakefile
|
65
|
+
- lib/sugarcube.rb
|
66
|
+
- lib/sugarcube/exceptions.rb
|
67
|
+
- lib/sugarcube/fixnum.rb
|
68
|
+
- lib/sugarcube/float.rb
|
69
|
+
- lib/sugarcube/string.rb
|
70
|
+
- lib/sugarcube/symbol.rb
|
71
|
+
- lib/sugarcube/symbol/symbol_uicolor.rb
|
72
|
+
- lib/sugarcube/uicolor.rb
|
73
|
+
- lib/sugarcube/uicontrol.rb
|
74
|
+
- lib/sugarcube/uiimage.rb
|
75
|
+
- lib/sugarcube/uiview.rb
|
76
|
+
- lib/sugarcube/version.rb
|
77
|
+
- sugarcube.gemspec
|
27
78
|
homepage: https://github.com/fusionbox/sugarcube
|
28
79
|
licenses: []
|
29
80
|
post_install_message:
|