teacup 0.3.12 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/README.md +40 -0
- data/Rakefile +1 -0
- data/app/app_delegate.rb +3 -1
- data/app/controllers/first_controller.rb +0 -6
- data/lib/dummy.rb +13 -0
- data/lib/teacup/constraint.rb +258 -0
- data/lib/teacup/handler.rb +6 -3
- data/lib/teacup/layout.rb +52 -9
- data/lib/teacup/restyle.rb +12 -5
- data/lib/teacup/style.rb +1 -1
- data/lib/teacup/stylesheet.rb +45 -11
- data/lib/teacup/stylesheet_extensions/autoresize.rb +39 -0
- data/lib/teacup/stylesheet_extensions/constraints.rb +69 -0
- data/lib/teacup/stylesheet_extensions/geometry.rb +75 -0
- data/lib/teacup/stylesheet_extensions/rotation.rb +1 -2
- data/lib/teacup/version.rb +1 -1
- data/lib/teacup/z_core_extensions/ui_view.rb +115 -16
- data/lib/teacup/z_core_extensions/ui_view_controller.rb +54 -26
- data/lib/teacup/z_core_extensions/ui_view_getters.rb +8 -6
- data/lib/teacup/z_core_extensions/z_handlers.rb +45 -11
- data/lib/teacup.rb +2 -0
- data/spec/main_spec.rb +139 -191
- data/teacup.gemspec +1 -0
- data/vendor/TeacupDummy/TeacupDummy.h +11 -0
- data/vendor/TeacupDummy/TeacupDummy.m +8 -0
- metadata +9 -3
@@ -0,0 +1,69 @@
|
|
1
|
+
module Teacup
|
2
|
+
class Stylesheet
|
3
|
+
|
4
|
+
def constrain(target, attribute=nil)
|
5
|
+
if attribute.nil?
|
6
|
+
attribute = target
|
7
|
+
target = :self
|
8
|
+
end
|
9
|
+
Teacup::Constraint.new(target, attribute)
|
10
|
+
end
|
11
|
+
|
12
|
+
##|
|
13
|
+
def constrain_xy(x, y)
|
14
|
+
[
|
15
|
+
Teacup::Constraint.new(:self, :left).equals(:superview, :left).plus(x),
|
16
|
+
Teacup::Constraint.new(:self, :top).equals(:superview, :top).plus(y),
|
17
|
+
]
|
18
|
+
end
|
19
|
+
|
20
|
+
def constrain_left(x)
|
21
|
+
Teacup::Constraint.new(:self, :left).equals(:superview, :left).plus(x)
|
22
|
+
end
|
23
|
+
|
24
|
+
def constrain_right(x)
|
25
|
+
Teacup::Constraint.new(:self, :right).equals(:superview, :right).plus(x)
|
26
|
+
end
|
27
|
+
|
28
|
+
def constrain_top(y)
|
29
|
+
Teacup::Constraint.new(:self, :top).equals(:superview, :top).plus(y)
|
30
|
+
end
|
31
|
+
|
32
|
+
def constrain_bottom(y)
|
33
|
+
Teacup::Constraint.new(:self, :bottom).equals(:superview, :bottom).plus(y)
|
34
|
+
end
|
35
|
+
|
36
|
+
def constrain_width(width)
|
37
|
+
Teacup::Constraint.new(:self, :width).equals(width)
|
38
|
+
end
|
39
|
+
|
40
|
+
def constrain_height(height)
|
41
|
+
Teacup::Constraint.new(:self, :height).equals(height)
|
42
|
+
end
|
43
|
+
|
44
|
+
def constrain_size(width, height)
|
45
|
+
[
|
46
|
+
Teacup::Constraint.new(:self, :right).equals(:self, :left).plus(width),
|
47
|
+
Teacup::Constraint.new(:self, :bottom).equals(:self, :top).plus(height),
|
48
|
+
]
|
49
|
+
end
|
50
|
+
|
51
|
+
##|
|
52
|
+
def constrain_below(relative_to, margin=0)
|
53
|
+
Teacup::Constraint.new(:self, :top).equals(relative_to, :bottom).plus(margin)
|
54
|
+
end
|
55
|
+
|
56
|
+
def constrain_above(relative_to, margin=0)
|
57
|
+
Teacup::Constraint.new(:self, :bottom).equals(relative_to, :top).plus(margin)
|
58
|
+
end
|
59
|
+
|
60
|
+
def constrain_to_left(relative_to, margin=0)
|
61
|
+
Teacup::Constraint.new(:self, :right).equals(relative_to, :left).plus(margin)
|
62
|
+
end
|
63
|
+
|
64
|
+
def constrain_to_right(relative_to, margin=0)
|
65
|
+
Teacup::Constraint.new(:self, :left).equals(relative_to, :right).plus(margin)
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# Example:
|
2
|
+
# Teacup::Stylesheet.new :main do
|
3
|
+
# style :root,
|
4
|
+
# origin: [0, 0]
|
5
|
+
#
|
6
|
+
# # device returns a bitmask of devices,
|
7
|
+
# # device? expects a device bitmask, and returns true if it is present in
|
8
|
+
# # device (the conditions below are equivalent)
|
9
|
+
# if 0 < device & iPhone || device? iPhone
|
10
|
+
# style :root, width: 320
|
11
|
+
#
|
12
|
+
# if 0 < device & iPhone5 || device? iPhone5
|
13
|
+
# style :root, height: 548
|
14
|
+
# elsif 0 < device & iPhone || device? iPhone
|
15
|
+
# style :root, height: 460
|
16
|
+
# end
|
17
|
+
# elsif 0 < device & iPad || device? iPad
|
18
|
+
# style :root,
|
19
|
+
# width: 768,
|
20
|
+
# height: 1004
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# # that's a mess! and this does the same thing anyway:
|
24
|
+
# style :root,
|
25
|
+
# frame: [[0, 0], app_size]
|
26
|
+
# end
|
27
|
+
module Teacup
|
28
|
+
class Stylesheet
|
29
|
+
def iPhone ; 1 << 1 ; end
|
30
|
+
def iPhoneRetina ; 1 << 2 ; end
|
31
|
+
def iPhone5 ; 1 << 3 ; end
|
32
|
+
def iPad ; 1 << 4 ; end
|
33
|
+
def iPadRetina ; 1 << 5 ; end
|
34
|
+
|
35
|
+
# returns the device size in points, regardless of status bar
|
36
|
+
def screen_size
|
37
|
+
UIScreen.mainScreen.bounds.size
|
38
|
+
end
|
39
|
+
|
40
|
+
# returns the application frame, which takes the status bar into account
|
41
|
+
def app_size
|
42
|
+
UIScreen.mainScreen.applicationFrame.size
|
43
|
+
end
|
44
|
+
|
45
|
+
# returns a bit-wise OR of the device masks
|
46
|
+
def device
|
47
|
+
@@this_device ||= nil
|
48
|
+
return @@this_device if @@this_device
|
49
|
+
|
50
|
+
@@this_device = 0
|
51
|
+
if UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPhone
|
52
|
+
@@this_device |= iPhone
|
53
|
+
if UIScreen.mainScreen.respond_to? :scale
|
54
|
+
@@this_device |= iPhoneRetina
|
55
|
+
if UIScreen.mainScreen.bounds.size.height == 568
|
56
|
+
@@this_device |= iPhone5
|
57
|
+
end
|
58
|
+
end
|
59
|
+
else
|
60
|
+
@@this_device |= iPad
|
61
|
+
if UIScreen.mainScreen.respond_to? :scale
|
62
|
+
@@this_device |= iPadRetina
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
return @@this_device
|
67
|
+
end
|
68
|
+
|
69
|
+
def device_is?(this_device)
|
70
|
+
this_device = self.send(this_device) if this_device.is_a? Symbol
|
71
|
+
return device & this_device > 0
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
data/lib/teacup/version.rb
CHANGED
@@ -12,17 +12,6 @@ class UIView
|
|
12
12
|
# Enable debug messages for this object
|
13
13
|
attr_accessor :debug
|
14
14
|
|
15
|
-
# The current stylesheet will be looked at when properties are needed. It
|
16
|
-
# is loaded lazily, so that assignment can occur before the Stylesheet has
|
17
|
-
# been created.
|
18
|
-
def stylesheet
|
19
|
-
if @stylesheet.is_a? Symbol
|
20
|
-
@stylesheet = Teacup::Stylesheet[@stylesheet]
|
21
|
-
end
|
22
|
-
|
23
|
-
@stylesheet
|
24
|
-
end
|
25
|
-
|
26
15
|
# Alter the stylename of this view.
|
27
16
|
#
|
28
17
|
# This will cause new styles to be applied from the stylesheet.
|
@@ -50,8 +39,8 @@ class UIView
|
|
50
39
|
subviews.each{ |subview| subview.set_stylesheet_quickly(new_stylesheet) }
|
51
40
|
|
52
41
|
if should_restyle
|
53
|
-
restyle!
|
54
42
|
Teacup.should_restyle!
|
43
|
+
restyle!
|
55
44
|
end
|
56
45
|
end
|
57
46
|
|
@@ -62,7 +51,9 @@ class UIView
|
|
62
51
|
|
63
52
|
def restyle!(orientation=nil)
|
64
53
|
if Teacup.should_restyle?
|
65
|
-
|
54
|
+
resetTeacupConstraints
|
55
|
+
|
56
|
+
if stylesheet && stylesheet.is_a?(Teacup::Stylesheet)
|
66
57
|
style(stylesheet.query(stylename, self, orientation))
|
67
58
|
end
|
68
59
|
subviews.each{ |subview| subview.restyle!(orientation) }
|
@@ -118,11 +109,77 @@ class UIView
|
|
118
109
|
#
|
119
110
|
# @param Hash the properties to set.
|
120
111
|
def style(properties, orientation=nil)
|
121
|
-
|
122
|
-
|
123
|
-
|
112
|
+
if properties.key?(:constraints)
|
113
|
+
new_constraints = add_uniq_constraints(properties.delete(:constraints))
|
114
|
+
|
115
|
+
self.setTranslatesAutoresizingMaskIntoConstraints(false) unless new_constraints.empty?
|
116
|
+
|
117
|
+
@teacup_added_constraints ||= []
|
118
|
+
new_constraints.each do |original_constraint|
|
119
|
+
constraint = original_constraint.copy
|
120
|
+
|
121
|
+
case original_constraint.target
|
122
|
+
when :self
|
123
|
+
constraint.target = self
|
124
|
+
when :superview
|
125
|
+
constraint.target = self.superview
|
126
|
+
when Symbol, String
|
127
|
+
container = self
|
128
|
+
constraint.target = nil
|
129
|
+
while container.superview && constraint.target == nil
|
130
|
+
constraint.target = container.viewWithStylename(original_constraint.target)
|
131
|
+
container = container.superview
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
case original_constraint.relative_to
|
136
|
+
when :self
|
137
|
+
constraint.relative_to = self
|
138
|
+
when :superview
|
139
|
+
constraint.relative_to = self.superview
|
140
|
+
when Symbol, String
|
141
|
+
# TODO: this re-checks lots of views - everytime it goes up to the
|
142
|
+
# superview, it checks all the leaves again.
|
143
|
+
container = self
|
144
|
+
constraint.relative_to = nil
|
145
|
+
while container.superview && constraint.relative_to == nil
|
146
|
+
constraint.relative_to = container.viewWithStylename(original_constraint.relative_to)
|
147
|
+
container = container.superview
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
add_constraint_to = nil
|
152
|
+
if constraint.target == constraint.relative_to || constraint.relative_to.nil?
|
153
|
+
add_constraint_to = constraint.target.superview
|
154
|
+
elsif constraint.target.isDescendantOfView(constraint.relative_to)
|
155
|
+
add_constraint_to = constraint.relative_to
|
156
|
+
elsif constraint.relative_to.isDescendantOfView(constraint.target)
|
157
|
+
add_constraint_to = constraint.target
|
158
|
+
else
|
159
|
+
parent = constraint.relative_to.superview
|
160
|
+
while parent
|
161
|
+
if constraint.target.isDescendantOfView(parent)
|
162
|
+
add_constraint_to = parent
|
163
|
+
parent = nil
|
164
|
+
elsif parent.superview
|
165
|
+
parent = parent.superview
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
if add_constraint_to
|
171
|
+
ns_constraint = constraint.nslayoutconstraint
|
172
|
+
|
173
|
+
@teacup_added_constraints << { target: add_constraint_to, constraint: ns_constraint }
|
174
|
+
add_constraint_to.addConstraint(ns_constraint)
|
175
|
+
else
|
176
|
+
raise "The two views #{original_constraint.target} and #{original_constraint.relative_to} do not have a common ancestor"
|
177
|
+
end
|
178
|
+
end
|
124
179
|
end
|
125
180
|
|
181
|
+
Teacup.apply_hash self, properties
|
182
|
+
|
126
183
|
self.setNeedsDisplay
|
127
184
|
self.setNeedsLayout
|
128
185
|
end
|
@@ -131,4 +188,46 @@ class UIView
|
|
131
188
|
return self
|
132
189
|
end
|
133
190
|
|
191
|
+
def teacup_added_constraints ; @teacup_added_constraints ; end
|
192
|
+
|
193
|
+
def resetTeacupConstraints
|
194
|
+
if @teacup_added_constraints
|
195
|
+
@teacup_added_constraints.each do |added_constraint|
|
196
|
+
target = added_constraint[:target]
|
197
|
+
constraint = added_constraint[:constraint]
|
198
|
+
target.removeConstraint(constraint)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
@teacup_added_constraints = nil
|
202
|
+
@teacup_constrain_just_once = nil
|
203
|
+
end
|
204
|
+
|
205
|
+
def add_uniq_constraints(constraint)
|
206
|
+
@teacup_constrain_just_once ||= {}
|
207
|
+
|
208
|
+
if constraint.is_a? Array
|
209
|
+
new_consraints = constraint.map{|constraint| add_uniq_constraints(constraint) }.flatten
|
210
|
+
elsif constraint.is_a? Hash
|
211
|
+
new_consraints = constraint.select{|sym, relative_to|
|
212
|
+
@teacup_constrain_just_once[sym].nil?
|
213
|
+
}.map{|sym, relative_to|
|
214
|
+
@teacup_constrain_just_once[sym] = true
|
215
|
+
Teacup::Constraint.from_sym(sym, relative_to)
|
216
|
+
}
|
217
|
+
else
|
218
|
+
if @teacup_constrain_just_once[constraint]
|
219
|
+
new_consraints = []
|
220
|
+
else
|
221
|
+
@teacup_constrain_just_once[constraint] = true
|
222
|
+
if constraint.is_a? Symbol
|
223
|
+
new_consraints = [Teacup::Constraint.from_sym(constraint)]
|
224
|
+
else
|
225
|
+
new_consraints = [constraint]
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
return new_consraints
|
231
|
+
end
|
232
|
+
|
134
233
|
end
|
@@ -53,30 +53,6 @@ class UIViewController
|
|
53
53
|
|
54
54
|
end # class << self
|
55
55
|
|
56
|
-
# Returns a stylesheet to use to style the contents of this controller's
|
57
|
-
# view. You can also assign a stylesheet to {stylesheet=}, which will in
|
58
|
-
# turn call {restyle!}.
|
59
|
-
#
|
60
|
-
# This method will be queried each time {restyle!} is called, and also
|
61
|
-
# implicitly whenever Teacup needs to draw your layout (currently only at
|
62
|
-
# view load time).
|
63
|
-
#
|
64
|
-
# @return Teacup::Stylesheet
|
65
|
-
#
|
66
|
-
# @example
|
67
|
-
#
|
68
|
-
# def stylesheet
|
69
|
-
# if [UIInterfaceOrientationLandscapeLeft,
|
70
|
-
# UIInterfaceOrientationLandscapeRight].include?(UIInterface.currentDevice.orientation)
|
71
|
-
# Teacup::Stylesheet[:ipad]
|
72
|
-
# else
|
73
|
-
# Teacup::Stylesheet[:ipadvertical]
|
74
|
-
# end
|
75
|
-
# end
|
76
|
-
def stylesheet
|
77
|
-
@stylesheet
|
78
|
-
end
|
79
|
-
|
80
56
|
# Assigning a new stylesheet triggers {restyle!}, so do this during a
|
81
57
|
# rotation to get your different layouts applied.
|
82
58
|
#
|
@@ -129,14 +105,27 @@ class UIViewController
|
|
129
105
|
|
130
106
|
if layout_definition
|
131
107
|
stylename, properties, block = layout_definition
|
108
|
+
should_restyle = Teacup.should_restyle_and_block
|
132
109
|
layout(view, stylename, properties, &block)
|
110
|
+
Teacup.should_restyle! if should_restyle
|
133
111
|
end
|
134
112
|
|
135
113
|
layoutDidLoad
|
136
114
|
end
|
137
115
|
|
116
|
+
alias old_viewWillAppear viewWillAppear
|
117
|
+
|
138
118
|
def viewWillAppear(animated)
|
139
|
-
|
119
|
+
old_viewWillAppear(animated)
|
120
|
+
self.view.restyle! unless @teacup_view_appeared
|
121
|
+
@teacup_view_appeared = true
|
122
|
+
end
|
123
|
+
|
124
|
+
alias old_viewDidDisappear viewDidDisappear
|
125
|
+
|
126
|
+
def viewDidDisappear(animated)
|
127
|
+
old_viewDidDisappear(animated)
|
128
|
+
@teacup_view_appeared = false
|
140
129
|
end
|
141
130
|
|
142
131
|
def layoutDidLoad
|
@@ -152,7 +141,7 @@ class UIViewController
|
|
152
141
|
#
|
153
142
|
# the teacup developers apologize for any inconvenience. :-)
|
154
143
|
def autorotateToOrientation(orientation)
|
155
|
-
if view.stylesheet and view.stylename
|
144
|
+
if view.stylesheet and view.stylesheet.is_a?(Teacup::Stylesheet) and view.stylename
|
156
145
|
properties = view.stylesheet.query(view.stylename, self, orientation)
|
157
146
|
|
158
147
|
# check for orientation-specific properties
|
@@ -185,6 +174,45 @@ class UIViewController
|
|
185
174
|
return orientation == UIInterfaceOrientationPortrait
|
186
175
|
end
|
187
176
|
|
177
|
+
def autorotateMask
|
178
|
+
if view.stylesheet and view.stylesheet.is_a?(Teacup::Stylesheet) and view.stylename
|
179
|
+
properties = view.stylesheet.query(view.stylename, self, orientation)
|
180
|
+
device = UIDevice.currentDevice.userInterfaceIdiom
|
181
|
+
device == UIUserInterfaceIdiomPhone
|
182
|
+
|
183
|
+
orientations = 0
|
184
|
+
if properties.supports?(:portrait) or properties.supports?(:upside_up)
|
185
|
+
orientations |= UIInterfaceOrientationPortrait
|
186
|
+
end
|
187
|
+
|
188
|
+
if device == UIUserInterfaceIdiomPhone
|
189
|
+
# :portrait does not imply upside_down on the iphone
|
190
|
+
if properties.supports?(:upside_down)
|
191
|
+
orientations |= UIInterfaceOrientationPortraitUpsideDown
|
192
|
+
end
|
193
|
+
else
|
194
|
+
# but does on the ipad
|
195
|
+
if properties.supports?(:portrait) or properties.supports?(:upside_down)
|
196
|
+
orientations |= UIInterfaceOrientationPortraitUpsideDown
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
if properties.supports?(:landscape) or properties.supports?(:landscape_left)
|
201
|
+
orientations |= UIInterfaceOrientationLandscapeLeft
|
202
|
+
end
|
203
|
+
|
204
|
+
if properties.supports?(:landscape) or properties.supports?(:landscape_right)
|
205
|
+
orientations |= UIInterfaceOrientationLandscapeRight
|
206
|
+
end
|
207
|
+
|
208
|
+
if orientations == 0
|
209
|
+
orientations |= UIInterfaceOrientationPortrait
|
210
|
+
end
|
211
|
+
return orientations
|
212
|
+
end
|
213
|
+
return UIInterfaceOrientationPortrait
|
214
|
+
end
|
215
|
+
|
188
216
|
def willAnimateRotationToInterfaceOrientation(orientation, duration:duration)
|
189
217
|
view.restyle!(orientation)
|
190
218
|
end
|
@@ -2,8 +2,9 @@
|
|
2
2
|
# Kinda similar to jQuery-style $().find('stylename')
|
3
3
|
class UIView
|
4
4
|
|
5
|
-
# get one
|
6
|
-
# my_view
|
5
|
+
# get one subview by stylename or class
|
6
|
+
# my_view.viewWithStylename :button => #<UIButton..>
|
7
|
+
# my_view.viewWithStylename UIButton => #<UIButton..>
|
7
8
|
def viewWithStylename name_or_class
|
8
9
|
if name_or_class.is_a? Class
|
9
10
|
view = subviews.find { |view| view.is_a? name_or_class }
|
@@ -21,8 +22,9 @@ class UIView
|
|
21
22
|
nil # couldn't find it
|
22
23
|
end
|
23
24
|
|
24
|
-
# get
|
25
|
-
# my_view.
|
25
|
+
# get all subviews by stylename or class
|
26
|
+
# my_view.viewsWithStylename :button => [#<UIButton..>, #<UIButton...>]
|
27
|
+
# my_view.viewsWithStylename UIButton => [#<UIButton..>, #<UIButton...>]
|
26
28
|
def viewsWithStylename name_or_class
|
27
29
|
r = []
|
28
30
|
subviews.each do |view|
|
@@ -30,10 +32,10 @@ class UIView
|
|
30
32
|
if view.is_a? name_or_class
|
31
33
|
r << view
|
32
34
|
end
|
33
|
-
|
35
|
+
elsif view.stylename == name_or_class
|
34
36
|
r << view
|
35
37
|
end
|
36
|
-
r
|
38
|
+
r.concat view.viewsWithStylename name_or_class
|
37
39
|
end
|
38
40
|
r
|
39
41
|
end
|
@@ -1,51 +1,71 @@
|
|
1
|
+
module Teacup
|
2
|
+
module_function
|
3
|
+
def calculate(view, dimension, percent)
|
4
|
+
if percent.is_a? Proc
|
5
|
+
view.instance_exec(&percent)
|
6
|
+
elsif percent.is_a? String and percent[-1] == '%'
|
7
|
+
percent = percent[0...-1].to_f / 100.0
|
8
|
+
|
9
|
+
case dimension
|
10
|
+
when :width
|
11
|
+
CGRectGetWidth(view.superview.bounds) * percent
|
12
|
+
when :height
|
13
|
+
CGRectGetHeight(view.superview.bounds) * percent
|
14
|
+
end
|
15
|
+
else
|
16
|
+
percent
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
1
21
|
##|
|
2
22
|
##| UIView.frame
|
3
23
|
##|
|
4
24
|
Teacup.handler UIView, :left, :x { |x|
|
5
25
|
f = self.frame
|
6
|
-
f.origin.x = x
|
26
|
+
f.origin.x = Teacup::calculate(self, :width, x)
|
7
27
|
self.frame = f
|
8
28
|
}
|
9
29
|
|
10
30
|
Teacup.handler UIView, :right { |r|
|
11
31
|
f = self.frame
|
12
|
-
f.origin.x = r - f.size.width
|
32
|
+
f.origin.x = Teacup::calculate(self, :width, r) - f.size.width
|
13
33
|
self.frame = f
|
14
34
|
}
|
15
35
|
|
16
36
|
Teacup.handler UIView, :center_x, :middle_x { |x|
|
17
37
|
c = self.center
|
18
|
-
c.x = x
|
38
|
+
c.x = Teacup::calculate(self, :width, x)
|
19
39
|
self.center = c
|
20
40
|
}
|
21
41
|
|
22
42
|
Teacup.handler UIView, :top, :y { |y|
|
23
43
|
f = self.frame
|
24
|
-
f.origin.y = y
|
44
|
+
f.origin.y = Teacup::calculate(self, :height, y)
|
25
45
|
self.frame = f
|
26
46
|
}
|
27
47
|
|
28
48
|
Teacup.handler UIView, :bottom { |b|
|
29
49
|
f = self.frame
|
30
|
-
f.origin.y = b - f.size.height
|
50
|
+
f.origin.y = Teacup::calculate(self, :height, b) - f.size.height
|
31
51
|
self.frame = f
|
32
52
|
}
|
33
53
|
|
34
54
|
Teacup.handler UIView, :center_y, :middle_y { |y|
|
35
55
|
c = self.center
|
36
|
-
c.y = y
|
56
|
+
c.y = Teacup::calculate(self, :height, y)
|
37
57
|
self.center = c
|
38
58
|
}
|
39
59
|
|
40
60
|
Teacup.handler UIView, :width { |w|
|
41
61
|
f = self.frame
|
42
|
-
f.size.width = w
|
62
|
+
f.size.width = Teacup::calculate(self, :width, w)
|
43
63
|
self.frame = f
|
44
64
|
}
|
45
65
|
|
46
66
|
Teacup.handler UIView, :height { |h|
|
47
67
|
f = self.frame
|
48
|
-
f.size.height = h
|
68
|
+
f.size.height = Teacup::calculate(self, :height, h)
|
49
69
|
self.frame = f
|
50
70
|
}
|
51
71
|
|
@@ -56,12 +76,15 @@ Teacup.handler UIView, :origin { |origin|
|
|
56
76
|
}
|
57
77
|
|
58
78
|
Teacup.handler UIView, :size { |size|
|
79
|
+
# odd... if I changed these to .is_a?, weird errors happen. Use ===
|
59
80
|
if Symbol === size && size == :full
|
60
81
|
if self.superview
|
61
|
-
size =
|
82
|
+
size = self.superview.bounds.size
|
62
83
|
else
|
63
84
|
size = self.frame.size
|
64
85
|
end
|
86
|
+
elsif Array === size
|
87
|
+
size = [Teacup::calculate(self, :width, size[0]), Teacup::calculate(self, :height, size[1])]
|
65
88
|
end
|
66
89
|
f = self.frame
|
67
90
|
f.size = size
|
@@ -69,12 +92,23 @@ Teacup.handler UIView, :size { |size|
|
|
69
92
|
}
|
70
93
|
|
71
94
|
Teacup.handler UIView, :frame { |frame|
|
95
|
+
# odd... if I changed these to .is_a?, weird errors happen. Use ===
|
72
96
|
if Symbol === frame && frame == :full
|
73
97
|
if self.superview
|
74
|
-
frame =
|
98
|
+
frame = self.superview.bounds
|
75
99
|
else
|
76
100
|
frame = self.frame
|
77
101
|
end
|
102
|
+
elsif Array === frame && frame.length == 4
|
103
|
+
frame = [
|
104
|
+
[Teacup::calculate(self, :width, frame[0]), Teacup::calculate(self, :height, frame[1])],
|
105
|
+
[Teacup::calculate(self, :width, frame[2]), Teacup::calculate(self, :height, frame[3])]
|
106
|
+
]
|
107
|
+
elsif Array === frame && frame.length == 2
|
108
|
+
frame = [
|
109
|
+
[Teacup::calculate(self, :width, frame[0][0]), Teacup::calculate(self, :height, frame[0][1])],
|
110
|
+
[Teacup::calculate(self, :width, frame[1][0]), Teacup::calculate(self, :height, frame[1][1])]
|
111
|
+
]
|
78
112
|
end
|
79
113
|
self.frame = frame
|
80
114
|
}
|
@@ -92,7 +126,7 @@ Teacup.handler UIButton, :titleColor { |color|
|
|
92
126
|
}
|
93
127
|
|
94
128
|
|
95
|
-
Teacup.handler UIButton, :titleFont { |font|
|
129
|
+
Teacup.handler UIButton, :titleFont, :font { |font|
|
96
130
|
font = font.uifont
|
97
131
|
self.titleLabel.font = font
|
98
132
|
}
|
data/lib/teacup.rb
CHANGED
@@ -21,4 +21,6 @@ Motion::Project::App.setup do |app|
|
|
21
21
|
Dir.glob(File.join(File.dirname(__FILE__), 'teacup/**/*.rb')).reverse.each do |file|
|
22
22
|
app.files.insert(insert_point, file)
|
23
23
|
end
|
24
|
+
|
25
|
+
app.vendor_project File.join(File.dirname(__FILE__), '../vendor/TeacupDummy'), :static
|
24
26
|
end
|