bluepotion 0.0.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.
- 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
|
+
|