bluepotion 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +10 -0
- data/lib/bluepotion.rb +16 -0
- data/lib/project/ext/activity.rb +62 -0
- data/lib/project/ext/array_list.rb +25 -0
- data/lib/project/ext/fragment.rb +2 -0
- data/lib/project/ext/object.rb +105 -0
- data/lib/project/ext/string.rb +23 -0
- data/lib/project/ext/view.rb +81 -0
- data/lib/project/potion.rb +50 -0
- data/lib/project/pro_motion/pm_activity.rb +38 -0
- data/lib/project/pro_motion/pm_application.rb +71 -0
- data/lib/project/pro_motion/pm_home_activity.rb +14 -0
- data/lib/project/pro_motion/pm_screen.rb +67 -0
- data/lib/project/pro_motion/pm_screen_module.rb +165 -0
- data/lib/project/pro_motion/pm_single_fragment_activity.rb +31 -0
- data/lib/project/ruby_motion_query/rmq/actions.rb +48 -0
- data/lib/project/ruby_motion_query/rmq/base.rb +260 -0
- data/lib/project/ruby_motion_query/rmq/data.rb +64 -0
- data/lib/project/ruby_motion_query/rmq/debug.rb +9 -0
- data/lib/project/ruby_motion_query/rmq/enumerablish.rb +99 -0
- data/lib/project/ruby_motion_query/rmq/events.rb +28 -0
- data/lib/project/ruby_motion_query/rmq/factory.rb +47 -0
- data/lib/project/ruby_motion_query/rmq/position.rb +2 -0
- data/lib/project/ruby_motion_query/rmq/selectors.rb +72 -0
- data/lib/project/ruby_motion_query/rmq/styles.rb +108 -0
- data/lib/project/ruby_motion_query/rmq/subviews.rb +95 -0
- data/lib/project/ruby_motion_query/rmq/tags.rb +58 -0
- data/lib/project/ruby_motion_query/rmq/traverse.rb +287 -0
- data/lib/project/ruby_motion_query/rmq/utils.rb +36 -0
- data/lib/project/ruby_motion_query/rmq/version.rb +6 -0
- data/lib/project/ruby_motion_query/rmq_activity_data.rb +3 -0
- data/lib/project/ruby_motion_query/rmq_app.rb +9 -0
- data/lib/project/ruby_motion_query/rmq_color.rb +121 -0
- data/lib/project/ruby_motion_query/rmq_device.rb +47 -0
- data/lib/project/ruby_motion_query/rmq_event.rb +1 -0
- data/lib/project/ruby_motion_query/rmq_font.rb +61 -0
- data/lib/project/ruby_motion_query/rmq_image.rb +55 -0
- data/lib/project/ruby_motion_query/rmq_rect.rb +576 -0
- data/lib/project/ruby_motion_query/rmq_screen_data.rb +3 -0
- data/lib/project/ruby_motion_query/rmq_stylesheet.rb +39 -0
- data/lib/project/ruby_motion_query/rmq_view_data.rb +88 -0
- data/lib/project/ruby_motion_query/stylers/rmq_button_styler.rb +3 -0
- data/lib/project/ruby_motion_query/stylers/rmq_image_button_styler.rb +3 -0
- data/lib/project/ruby_motion_query/stylers/rmq_image_view_styler.rb +24 -0
- data/lib/project/ruby_motion_query/stylers/rmq_linear_layout_styler.rb +32 -0
- data/lib/project/ruby_motion_query/stylers/rmq_relative_layout_styler.rb +7 -0
- data/lib/project/ruby_motion_query/stylers/rmq_styler_helper.rb +3 -0
- data/lib/project/ruby_motion_query/stylers/rmq_text_view_styler.rb +50 -0
- data/lib/project/ruby_motion_query/stylers/rmq_view_styler.rb +201 -0
- data/lib/project/version.rb +3 -0
- data/templates/screen/app/screens/name_screen.rb +20 -0
- data/templates/screen/app/stylesheets/name_screen_stylesheet.rb +24 -0
- data/templates/screen/spec/screens/name_screen_spec.rb +8 -0
- metadata +119 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
class RMQ
|
2
|
+
def device
|
3
|
+
RMQDevice
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.device
|
7
|
+
RMQDevice
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class RMQDevice
|
12
|
+
class << self
|
13
|
+
|
14
|
+
def os_version
|
15
|
+
@os_version ||= Android::Os::Build::VERSION.new.RELEASE.to_f
|
16
|
+
end
|
17
|
+
|
18
|
+
def os_code_name
|
19
|
+
@os_code_name ||= Android::Os::Build::VERSION.new.CODENAME
|
20
|
+
end
|
21
|
+
|
22
|
+
def sdk_version
|
23
|
+
@sdk_version ||= Android::Os::Build::VERSION.new.SDK_INT
|
24
|
+
end
|
25
|
+
|
26
|
+
def sdk_at_least?(version)
|
27
|
+
version.to_i <= sdk_version
|
28
|
+
end
|
29
|
+
|
30
|
+
def display
|
31
|
+
@display ||= RMQ.app.context.getSystemService(RMQ.app.context.WINDOW_SERVICE).defaultDisplay
|
32
|
+
end
|
33
|
+
|
34
|
+
def width
|
35
|
+
@width ||= display.width
|
36
|
+
end
|
37
|
+
|
38
|
+
def height
|
39
|
+
@height ||= display.height
|
40
|
+
end
|
41
|
+
|
42
|
+
def dpi
|
43
|
+
#TODO
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
class RMQ
|
2
|
+
def self.font
|
3
|
+
RMQFont
|
4
|
+
end
|
5
|
+
|
6
|
+
def font
|
7
|
+
RMQFont
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class RMQFont
|
12
|
+
attr_accessor :name, :size, :font_family, :text_style
|
13
|
+
|
14
|
+
def initialize(name, font_family, size, text_style)
|
15
|
+
@name = name
|
16
|
+
@font_family = font_family
|
17
|
+
@text_style = text_style
|
18
|
+
@size = size
|
19
|
+
end
|
20
|
+
|
21
|
+
def inspect
|
22
|
+
"<RMQFont #{@name} \"#{@font_family}\" #{@size} #{@text_style}>"
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s
|
26
|
+
self.inspect
|
27
|
+
end
|
28
|
+
|
29
|
+
def sdk_text_style
|
30
|
+
case @text_style
|
31
|
+
when :bold
|
32
|
+
Android::Graphics::Typeface::BOLD
|
33
|
+
when :italic
|
34
|
+
Android::Graphics::Typeface::ITALIC
|
35
|
+
when :bold_italic
|
36
|
+
Android::Graphics::Typeface::BOLD_ITALIC
|
37
|
+
when :normal
|
38
|
+
Android::Graphics::Typeface::NORMAL
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_typeface
|
43
|
+
Android::Graphics::Typeface.create(@font_family, sdk_text_style)
|
44
|
+
end
|
45
|
+
|
46
|
+
class << self
|
47
|
+
def add_named(name, font_family, size, text_style)
|
48
|
+
font_cache[name] = RMQFont.new(name, font_family, size, text_style)
|
49
|
+
end
|
50
|
+
|
51
|
+
def method_missing(font_key)
|
52
|
+
# define_singleton_method isn't implemented in Android :'(
|
53
|
+
font_cache[font_key]
|
54
|
+
end
|
55
|
+
|
56
|
+
def font_cache
|
57
|
+
@font_cache ||= {}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class RMQ
|
2
|
+
# @return [RMQImageUtils]
|
3
|
+
def self.image
|
4
|
+
RMQImageUtils
|
5
|
+
end
|
6
|
+
|
7
|
+
# @return [RMQImageUtils]
|
8
|
+
def image
|
9
|
+
RMQImageUtils
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class RMQImageUtils
|
14
|
+
class << self
|
15
|
+
DEFAULT_IMAGE_EXT = 'png'
|
16
|
+
|
17
|
+
# @return [UIImage]
|
18
|
+
def resource(file_base_name, opts = {})
|
19
|
+
ext = opts[:ext] || DEFAULT_IMAGE_EXT
|
20
|
+
#cached = opts[:cached]
|
21
|
+
#cached = true if cached.nil?
|
22
|
+
|
23
|
+
constant = R::Drawable.const_get(file_base_name.capitalize)
|
24
|
+
constant
|
25
|
+
#if cached
|
26
|
+
##UIImage.imageNamed("#{file_base_name}.#{ext}")
|
27
|
+
#else
|
28
|
+
#R::Drawable::Foo
|
29
|
+
#R::Drawable::Bluepotion_logo
|
30
|
+
#file_base_name << '@2x' if RMQ.device.retina?
|
31
|
+
#file = NSBundle.mainBundle.pathForResource(file_base_name, ofType: ext)
|
32
|
+
#UIImage.imageWithContentsOfFile(file)
|
33
|
+
#end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
__END__
|
39
|
+
|
40
|
+
|
41
|
+
A 48x48 image, should be in these sizes (3:4:6:8):
|
42
|
+
|
43
|
+
|
44
|
+
drawable-hdpi
|
45
|
+
drawable-ldpi
|
46
|
+
drawable-mdpi
|
47
|
+
drawable-xhdpi
|
48
|
+
drawable-xxhdpi
|
49
|
+
|
50
|
+
|
51
|
+
http://labs.rampinteractive.co.uk/android_dp_px_calculator/
|
52
|
+
|
53
|
+
http://romannurik.github.io/AndroidAssetStudio/nine-patches.html
|
54
|
+
|
55
|
+
http://grahamtodman.co.uk/blog/2013/02/how-to-design-android-apps-in-photoshop-what-the-frak-is-a-dp/
|
@@ -0,0 +1,576 @@
|
|
1
|
+
__END__
|
2
|
+
|
3
|
+
class RMQ
|
4
|
+
RECT_WHITELIST = [:grid, :g, :l, :left, :x, :fl, :top, :t, :y, :w, :width, :h, :height, :below_prev, :bp, :below_previous, :left_of_prev, :lop, :left_of_previous, :r, :right, :b, :bottom, :from_right, :fr, :from_bottom, :fb, :centered, :padding, :p, :above_prev, :ap, :above_previous, :rop, :right_of_prev, :right_of_previous, :left_of_prev, :lop, :left_of_previous]
|
5
|
+
|
6
|
+
# @return RMQRect or array of RMQRect
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# left = rmq(my_view).frame.left
|
10
|
+
def frame(params = nil)
|
11
|
+
if params
|
12
|
+
frame = params
|
13
|
+
self
|
14
|
+
else
|
15
|
+
if selected.length == 1
|
16
|
+
RMQRect.frame_for_view(selected.first)
|
17
|
+
else
|
18
|
+
selected.map{|s| RMQRect.frame_for_view(s)}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Same as layout:
|
24
|
+
# rmq(my_view).layout(l: 10, t: 20, w: 100, h: 150)
|
25
|
+
#
|
26
|
+
# Always applied in this order, regardless of the hash order:
|
27
|
+
# grid
|
28
|
+
# l, t, w, h
|
29
|
+
# prev, next
|
30
|
+
# from_right, from_bottom
|
31
|
+
# right, bottom
|
32
|
+
# left and right applied together (will change width)
|
33
|
+
# top and bottom applied together (will change height)
|
34
|
+
# centered
|
35
|
+
# padding
|
36
|
+
#
|
37
|
+
# @example
|
38
|
+
# rmq(my_view).frame = :full
|
39
|
+
# rmq(my_view).frame = {l: 10, t: 20, w: 100, h: 150}
|
40
|
+
# rmq(my_view).frame = {t: 20, h: 150, l: 10, w: 100}
|
41
|
+
# rmq(my_view).frame = {l: 10, t: 20}
|
42
|
+
# rmq(my_view).frame = {h: 20}
|
43
|
+
# rmq(my_view).frame = {l: :prev, t: 20, w: 100, h: 150}
|
44
|
+
# rmq(my_view).frame = {l: 10, below_prev: 10, w: prev, h: 150}
|
45
|
+
# rmq(my_view).frame = {left: 10, top: 20, width: 100, height: 150}
|
46
|
+
# rmq(my_view).frame = {l: 10, t: 10, fr: 10, fb: 10}
|
47
|
+
# rmq(my_view).frame = {width: 50, height: 20, centered: :both}
|
48
|
+
# rmq(my_view).frame = "a1:b5"
|
49
|
+
# rmq(my_view, my_other_view).frame = {grid: "b2", w: 100, h: 200}
|
50
|
+
# rmq(my_view, my_other_view).frame = {g: "b2", w: 100, h: 200}
|
51
|
+
#
|
52
|
+
# @example with padding
|
53
|
+
# rmq(my_view).frame = {grid: "b2:d14", padding: 5}
|
54
|
+
# rmq(my_view).frame = {grid: "b2:d14", padding: {l: 5, t: 0, r: 5, b:0}}
|
55
|
+
def frame=(value)
|
56
|
+
selected.each do |view|
|
57
|
+
RMQRect.update_view_frame(view, value)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def bounds
|
62
|
+
if selected.length == 1
|
63
|
+
RMQRect.bounds_for_view(selected.first)
|
64
|
+
else
|
65
|
+
selected.map{|s| RMQRect.bounds_for_view(s)}
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def bounds=(value)
|
70
|
+
selected.each do |view|
|
71
|
+
RMQRect.bounds_for_view(view).update(value, self.grid).apply_to_bounds
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
# RMQ Rect
|
79
|
+
#
|
80
|
+
# *******************---*******---*************************** value options
|
81
|
+
# * | | * -------------
|
82
|
+
# * | | * Integer
|
83
|
+
# * | | * signed Integer
|
84
|
+
# * top | * Float
|
85
|
+
# * | | * String
|
86
|
+
# * | | *
|
87
|
+
# * --- | * also
|
88
|
+
# * ***************|***** --- * -----------------------
|
89
|
+
# * * view | * | * :full
|
90
|
+
# * * | * | * :right_of_prev (:rop)
|
91
|
+
# * * bottom * | * :left_of_prev (:lop)
|
92
|
+
# * * | * | * :below_prev (:bp)
|
93
|
+
# *|--- left ---|* | * | * :above_prev (:ap)
|
94
|
+
# * * | * height * :grid (:g)
|
95
|
+
# * * | * | * :padding (:p)
|
96
|
+
# * * | * | * int or hash: l,t,b,r
|
97
|
+
# *|-------------------- right -+---|* | *
|
98
|
+
# * * | * | * abbreviations
|
99
|
+
# * * | * |--+--from_right----|* -----------------------
|
100
|
+
# * * --- * | * :l, :t, :w, :h
|
101
|
+
# * ***************---*** --- * :r, :b
|
102
|
+
# * | * :fr, fb
|
103
|
+
# * |------ width - + -| *
|
104
|
+
# * | * :centered options
|
105
|
+
# * | * -----------------------
|
106
|
+
# * from_bottom * :horizontal
|
107
|
+
# * | * :vertical
|
108
|
+
# * | * :both
|
109
|
+
# * --- *
|
110
|
+
# ***********************************************************
|
111
|
+
#
|
112
|
+
class RMQRect
|
113
|
+
attr_reader :view
|
114
|
+
|
115
|
+
class << self
|
116
|
+
|
117
|
+
def update_view_frame(view, params)
|
118
|
+
view.frame = object_to_cg_rect(params, view, view.frame, view.rmq.grid)
|
119
|
+
end
|
120
|
+
|
121
|
+
def update_view_bounds(view, params)
|
122
|
+
view.frame = object_to_cg_rect(params, view, view.bounds, view.rmq.grid)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Previous sibling
|
126
|
+
def previous_view(view)
|
127
|
+
if view
|
128
|
+
pv = view.rmq.prev.get
|
129
|
+
if RMQ.is_blank?(pv)
|
130
|
+
nil
|
131
|
+
else
|
132
|
+
pv
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def frame_for_view(view)
|
138
|
+
new(view.frame, view)
|
139
|
+
end
|
140
|
+
|
141
|
+
def bounds_for_view(view)
|
142
|
+
new(view.bounds, view)
|
143
|
+
end
|
144
|
+
|
145
|
+
# Used internally, don't use this
|
146
|
+
#
|
147
|
+
# In singleton for performance # TODO, test if this is necessary
|
148
|
+
def object_to_cg_rect(o, view = nil, existing_rect = nil, grid = nil)
|
149
|
+
if o.is_a?(Hash)
|
150
|
+
a = rect_hash_to_rect_array(view, existing_rect, o, grid)
|
151
|
+
CGRectMake(a[0], a[1], a[2], a[3])
|
152
|
+
elsif o == :full
|
153
|
+
if view && (sv = view.superview)
|
154
|
+
sv.bounds
|
155
|
+
else
|
156
|
+
rmq.root_view.bounds
|
157
|
+
end
|
158
|
+
elsif o.is_a?(RMQRect)
|
159
|
+
o.to_cgrect
|
160
|
+
elsif grid && o.is_a?(String)
|
161
|
+
a = rect_hash_to_rect_array(view, existing_rect, {grid: o}, grid)
|
162
|
+
CGRectMake(a[0], a[1], a[2], a[3])
|
163
|
+
elsif o.is_a?(Array)
|
164
|
+
case o.length
|
165
|
+
when 4
|
166
|
+
CGRectMake(o[0], o[1], o[2], o[3])
|
167
|
+
when 2
|
168
|
+
o
|
169
|
+
end
|
170
|
+
else
|
171
|
+
o # CGRect, etc
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
# Used internally, don't use this
|
176
|
+
#
|
177
|
+
# In singleton for performance # TODO, test if this is necessary
|
178
|
+
def rect_hash_to_rect_array(view, existing_rect, params, grid = nil)
|
179
|
+
# TODO check if this is performant, it should be
|
180
|
+
if (sv = view.superview) && (vc = view.rmq_data.view_controller)
|
181
|
+
not_in_root_view = !(vc.view == sv)
|
182
|
+
end
|
183
|
+
|
184
|
+
# performant warn if hash has keys that are not whitelisted
|
185
|
+
unknown_keys = params.keys - RMQ::RECT_WHITELIST
|
186
|
+
unless unknown_keys.empty?
|
187
|
+
puts "\n[RMQ ERROR] rect keys #{unknown_keys} don't exist. Verify your hash for #{view.class.name} uses approved keys - #{RMQ::RECT_WHITELIST}\n\n"
|
188
|
+
end
|
189
|
+
|
190
|
+
# Grid
|
191
|
+
if grid
|
192
|
+
if params_g = params[:grid] || params[:g]
|
193
|
+
params.delete(:grid)
|
194
|
+
params.delete(:g)
|
195
|
+
|
196
|
+
grid_h = grid[params_g]
|
197
|
+
params = grid_h.merge(params)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
params_l = params[:l] || params[:left] || params[:x] || params[:fl]
|
202
|
+
params_t = params[:t] || params[:top] || params[:y]
|
203
|
+
params_w = params[:w] || params[:width]
|
204
|
+
params_h = params[:h] || params[:height]
|
205
|
+
|
206
|
+
below_prev = params[:below_prev] || params[:bp] || params[:below_previous]
|
207
|
+
above_prev = params[:above_prev] || params[:ap] || params[:above_previous]
|
208
|
+
right_of_prev = params[:right_of_prev] || params[:rop] || params[:right_of_previous]
|
209
|
+
left_of_prev = params[:left_of_prev] || params[:lop] || params[:left_of_previous]
|
210
|
+
|
211
|
+
l = params_l || existing_rect.origin.x
|
212
|
+
t = params_t || existing_rect.origin.y
|
213
|
+
w = params_w || existing_rect.size.width
|
214
|
+
h = params_h || existing_rect.size.height
|
215
|
+
|
216
|
+
r = params[:r] || params[:right]
|
217
|
+
b = params[:b] || params[:bottom]
|
218
|
+
|
219
|
+
fr = params[:from_right] || params[:fr]
|
220
|
+
fb = params[:from_bottom] || params[:fb]
|
221
|
+
|
222
|
+
centered = params[:centered]
|
223
|
+
|
224
|
+
# Previous
|
225
|
+
if prev_view = previous_view(view)
|
226
|
+
if params_g && (prev_sv = prev_view.superview)
|
227
|
+
|
228
|
+
previous_root_view_point = vc.view.convertPoint(prev_view.origin, fromView: prev_sv)
|
229
|
+
|
230
|
+
if below_prev
|
231
|
+
t = params_t = previous_root_view_point.y + prev_view.frame.size.height + below_prev
|
232
|
+
elsif above_prev
|
233
|
+
t = params_t = previous_root_view_point.y - above_prev - h
|
234
|
+
end
|
235
|
+
|
236
|
+
if right_of_prev
|
237
|
+
l = params_l = previous_root_view_point.x + prev_view.frame.size.width + right_of_prev
|
238
|
+
elsif left_of_prev
|
239
|
+
l = params_l = previous_root_view_point.x - left_of_prev - w
|
240
|
+
end
|
241
|
+
|
242
|
+
else
|
243
|
+
if below_prev
|
244
|
+
t = prev_view.frame.origin.y + prev_view.frame.size.height + below_prev
|
245
|
+
elsif above_prev
|
246
|
+
t = prev_view.frame.origin.y - above_prev - h
|
247
|
+
end
|
248
|
+
|
249
|
+
if right_of_prev
|
250
|
+
l = prev_view.frame.origin.x + prev_view.frame.size.width + right_of_prev
|
251
|
+
elsif left_of_prev
|
252
|
+
l = prev_view.frame.origin.x - left_of_prev - w
|
253
|
+
end
|
254
|
+
end
|
255
|
+
else
|
256
|
+
if below_prev
|
257
|
+
t = below_prev
|
258
|
+
elsif above_prev
|
259
|
+
t = above_prev - h
|
260
|
+
end
|
261
|
+
|
262
|
+
if right_of_prev
|
263
|
+
l = right_of_prev
|
264
|
+
elsif left_of_prev
|
265
|
+
l = left_of_prev - w
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
if sv
|
270
|
+
if (fr || fb || centered) # Needs size
|
271
|
+
|
272
|
+
# Horrible horrible hack, TODO fix. This is here because
|
273
|
+
# the root_view's height isn't changed until after viewDidLoad when
|
274
|
+
# vc.edgesForExtendedLayout = UIRectEdgeNone.
|
275
|
+
# Not sure how often people use UIRectEdgeNone as I never do,
|
276
|
+
# perhaps an edge case that should be isolated in some wayo
|
277
|
+
# I hate to have to check and calc this every time
|
278
|
+
if vc && !not_in_root_view && (vc.edgesForExtendedLayout == UIRectEdgeNone)
|
279
|
+
sv_size = CGSizeMake(sv.bounds.size.width, rmq.device.screen_height - 64)
|
280
|
+
else
|
281
|
+
sv_size = sv.bounds.size
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
# From right, from_bottom
|
287
|
+
if (fr || fb) && sv
|
288
|
+
if fr
|
289
|
+
if params_l || left_of_prev || right_of_prev
|
290
|
+
w = sv_size.width - l - fr
|
291
|
+
else
|
292
|
+
l = sv_size.width - w - fr
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
if fb
|
297
|
+
if params_t || below_prev || above_prev
|
298
|
+
h = sv_size.height - t - fb
|
299
|
+
else
|
300
|
+
t = sv_size.height - h - fb
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
# Right and bottom
|
306
|
+
if r && !fr && !params_l
|
307
|
+
l = r - w
|
308
|
+
end
|
309
|
+
if b && !fb && !params_t
|
310
|
+
t = b - h
|
311
|
+
end
|
312
|
+
|
313
|
+
# Left and right applied together
|
314
|
+
if params_l && r && !params_w
|
315
|
+
w = r - l
|
316
|
+
end
|
317
|
+
# Top and bottom applied together
|
318
|
+
if params_t && b && !params_h
|
319
|
+
h = b - t
|
320
|
+
end
|
321
|
+
|
322
|
+
# Centered, :horizontal, :vertical, :both
|
323
|
+
if sv && centered
|
324
|
+
case centered
|
325
|
+
when :horizontal
|
326
|
+
l = (sv_size.width / 2) - (w / 2)
|
327
|
+
when :vertical
|
328
|
+
t = (sv_size.height / 2) - (h / 2)
|
329
|
+
when :both
|
330
|
+
l = (sv_size.width / 2) - (w / 2)
|
331
|
+
t = (sv_size.height / 2) - (h / 2)
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
if padding = params[:padding] || params[:p]
|
336
|
+
if padding.is_a?(Hash)
|
337
|
+
padding_l = padding[:l] || padding[:left] || 0
|
338
|
+
padding_t = padding[:t] || padding[:top] || 0
|
339
|
+
padding_r = padding[:r] || padding[:right] || 0
|
340
|
+
padding_b = padding[:b] || padding[:bottom] || 0
|
341
|
+
l += padding_l
|
342
|
+
t += padding_t
|
343
|
+
w -= (padding_l + padding_r)
|
344
|
+
h -= (padding_t + padding_b)
|
345
|
+
else
|
346
|
+
l += padding
|
347
|
+
t += padding
|
348
|
+
w -= (padding * 2)
|
349
|
+
h -= (padding * 2)
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
if params_g && not_in_root_view # Change to root_view_space
|
354
|
+
point = CGPointMake(l,t)
|
355
|
+
root_view_point = vc.view.convertPoint(point, toView: sv)
|
356
|
+
l = root_view_point.x
|
357
|
+
t = root_view_point.y
|
358
|
+
end
|
359
|
+
|
360
|
+
[l,t,w,h]
|
361
|
+
end
|
362
|
+
|
363
|
+
end # << self
|
364
|
+
|
365
|
+
def initialize(params, view = nil, grid = nil)
|
366
|
+
@left = @top = @width = @height = 0
|
367
|
+
@view = view
|
368
|
+
update params, grid
|
369
|
+
end
|
370
|
+
|
371
|
+
def update(params, grid = nil)
|
372
|
+
# Doing all of the updates to the Rect in singleton for performance.
|
373
|
+
# It would be better to be done inside an actual Rect instance, but that
|
374
|
+
# would require creating a lot of temporary objects.
|
375
|
+
# TODO performance and see if there is any real loss bringing
|
376
|
+
# object_to_cg_rect into Rect instance
|
377
|
+
#
|
378
|
+
# If we did it that way, then we'd create a new instance, then appy the
|
379
|
+
# rect instance to the frame or bounds, like so:
|
380
|
+
# Rect.new(params, view, grid).apply_to_frame
|
381
|
+
cg_rect = RMQRect.object_to_cg_rect(params, @view, self.to_cgrect, grid)
|
382
|
+
|
383
|
+
@left = cg_rect.origin.x
|
384
|
+
@top = cg_rect.origin.y
|
385
|
+
@width = cg_rect.size.width
|
386
|
+
@height = cg_rect.size.height
|
387
|
+
end
|
388
|
+
|
389
|
+
def apply_to_frame
|
390
|
+
@view.frame = to_cgrect if @view
|
391
|
+
end
|
392
|
+
def apply_to_bounds
|
393
|
+
@view.bounds = to_cgrect if @view
|
394
|
+
end
|
395
|
+
|
396
|
+
def left
|
397
|
+
@left
|
398
|
+
end
|
399
|
+
alias :l :left
|
400
|
+
alias :x :left
|
401
|
+
|
402
|
+
def right
|
403
|
+
@left + @width
|
404
|
+
end
|
405
|
+
alias :r :right
|
406
|
+
|
407
|
+
def from_right
|
408
|
+
if @view && (sv = @view.superview)
|
409
|
+
sv.size.width - right
|
410
|
+
end
|
411
|
+
end
|
412
|
+
alias :fr :from_right
|
413
|
+
|
414
|
+
def top
|
415
|
+
@top
|
416
|
+
end
|
417
|
+
alias :t :top
|
418
|
+
alias :y :top
|
419
|
+
|
420
|
+
def bottom
|
421
|
+
@top + @height
|
422
|
+
end
|
423
|
+
alias :b :bottom
|
424
|
+
|
425
|
+
def from_bottom
|
426
|
+
if @view && (sv = @view.superview)
|
427
|
+
sv.bounds.size.height - bottom
|
428
|
+
end
|
429
|
+
end
|
430
|
+
alias :fb :from_bottom
|
431
|
+
|
432
|
+
def width
|
433
|
+
@width
|
434
|
+
end
|
435
|
+
alias :w :width
|
436
|
+
|
437
|
+
def height
|
438
|
+
@height
|
439
|
+
end
|
440
|
+
alias :h :height
|
441
|
+
|
442
|
+
def z_order
|
443
|
+
if @view && (sv = @view.superview)
|
444
|
+
sv.subviews.to_a.index(@view) # is there a better way??
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
#def origin
|
449
|
+
#to_cgpoint
|
450
|
+
#end
|
451
|
+
|
452
|
+
#def size
|
453
|
+
#to_cgsize
|
454
|
+
#end
|
455
|
+
|
456
|
+
#def point_in_root_view
|
457
|
+
#if @view && (sv = @view.superview) && (vc = view.rmq.view_controller)
|
458
|
+
#vc.view.convertPoint(CGPointMake(@left,@top), fromView: sv)
|
459
|
+
#end
|
460
|
+
#end
|
461
|
+
|
462
|
+
#def rect_in_root_view
|
463
|
+
#if @view && (sv = @view.superview) && (vc = view.rmq.view_controller)
|
464
|
+
#point = vc.view.convertPoint(CGPointMake(@left,@top), fromView: sv)
|
465
|
+
#RMQRect.new({l: point.x, t: point.y, w: @view.size.width, h: @view.size.height}, @view)
|
466
|
+
#end
|
467
|
+
#end
|
468
|
+
|
469
|
+
#def left_in_root_view
|
470
|
+
#if point = point_in_root_view
|
471
|
+
#point.x
|
472
|
+
#end
|
473
|
+
#end
|
474
|
+
|
475
|
+
#def top_in_root_view
|
476
|
+
#if point = point_in_root_view
|
477
|
+
#point.y
|
478
|
+
#end
|
479
|
+
#end
|
480
|
+
|
481
|
+
# TODO add center
|
482
|
+
|
483
|
+
#def z_position
|
484
|
+
#if @view
|
485
|
+
#@view.layer.zPosition
|
486
|
+
#end
|
487
|
+
#end
|
488
|
+
|
489
|
+
#def to_cgpoint
|
490
|
+
#CGPointMake(@left, @top)
|
491
|
+
#end
|
492
|
+
|
493
|
+
#def to_cgsize
|
494
|
+
#CGSizeMake(@width, @height)
|
495
|
+
#end
|
496
|
+
|
497
|
+
#def to_cgrect
|
498
|
+
#CGRectMake(@left, @top, @width, @height)
|
499
|
+
#end
|
500
|
+
def to_a
|
501
|
+
[@left, @top, @width, @height]
|
502
|
+
end
|
503
|
+
def to_h
|
504
|
+
{left: @left, top: @top, width: @width, height: @height}
|
505
|
+
end
|
506
|
+
|
507
|
+
#def inspect
|
508
|
+
#format = '#0.#'
|
509
|
+
#s = "RMQRect {l: #{RMQ.format.numeric(left, format)}"
|
510
|
+
#s << ", t: #{RMQ.format.numeric(top, format)}"
|
511
|
+
#s << ", w: #{RMQ.format.numeric(width, format)}"
|
512
|
+
#s << ", h: #{RMQ.format.numeric(height, format)}}"
|
513
|
+
#s
|
514
|
+
#end
|
515
|
+
|
516
|
+
def log
|
517
|
+
def i_f_to_s(int_or_float)
|
518
|
+
if int_or_float % 1 == 0
|
519
|
+
int_or_float.to_i.to_s
|
520
|
+
else
|
521
|
+
int_or_float.to_s
|
522
|
+
end
|
523
|
+
end
|
524
|
+
|
525
|
+
l = i_f_to_s(left.round(2)).ljust(5)
|
526
|
+
t = i_f_to_s(top.round(2)).rjust(5)
|
527
|
+
w = i_f_to_s(width.round(2)).ljust(5)
|
528
|
+
h = i_f_to_s(height.round(2)).ljust(5)
|
529
|
+
b = i_f_to_s(bottom.round(2)).rjust(5)
|
530
|
+
r = i_f_to_s(right.round(2)).ljust(5)
|
531
|
+
fr = i_f_to_s(from_right.round(2)).ljust(5)
|
532
|
+
fb = i_f_to_s(from_bottom.round(2)).rjust(5)
|
533
|
+
|
534
|
+
ww = i_f_to_s(rmq.app.window.size.width.round(2))
|
535
|
+
wh = i_f_to_s(rmq.app.window.size.height.round(2))
|
536
|
+
|
537
|
+
if @view && (sv = @view.superview)
|
538
|
+
sw = i_f_to_s(sv.bounds.size.width.round(2))
|
539
|
+
sh = i_f_to_s(sv.bounds.size.height.round(2))
|
540
|
+
end
|
541
|
+
|
542
|
+
out = %(
|
543
|
+
*****************---*******---**************************
|
544
|
+
* | | * window
|
545
|
+
* #{ t} top | * {w: #{ww}, h: #{wh}}
|
546
|
+
* | | *
|
547
|
+
* --- | * superview
|
548
|
+
* ***************|***** --- * {w: #{sw}, h: #{sh}}
|
549
|
+
* * | * | *
|
550
|
+
* * | * | *
|
551
|
+
* * #{ b} bottom * | * view
|
552
|
+
* #{ l} * | * | * {l: #{l.strip}, t: #{t.strip},
|
553
|
+
*|-- left --|* | * | * w: #{w.strip}, h: #{h.strip}}
|
554
|
+
* * | * height #{ h} *
|
555
|
+
* * | * | * z_order: #{z_order}
|
556
|
+
* * #{ r} | * | * z_position: #{z_position}
|
557
|
+
*|------------------ right -+---|* | *
|
558
|
+
* * | * | #{fr} * Location in root view
|
559
|
+
* * | * |--+--from_right---|* {l: #{i_f_to_s(left_in_root_view)}, t: #{i_f_to_s(top_in_root_view)},
|
560
|
+
* * --- * | * w: #{w.strip}, h: #{h.strip}}
|
561
|
+
* ***************---*** --- *
|
562
|
+
* | *
|
563
|
+
* |------ width - + --| *
|
564
|
+
* #{ w} | *
|
565
|
+
* | *
|
566
|
+
* | *
|
567
|
+
* #{fb} from_bottom *
|
568
|
+
* | *
|
569
|
+
* --- *
|
570
|
+
********************************************************
|
571
|
+
)
|
572
|
+
puts out
|
573
|
+
end
|
574
|
+
|
575
|
+
end
|
576
|
+
|