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,58 @@
|
|
1
|
+
class RMQ
|
2
|
+
|
3
|
+
# Add tags
|
4
|
+
# @example
|
5
|
+
# rmq(my_view).tag(:your_tag)
|
6
|
+
# rmq(my_view).clear_tags.tag(:your_new_tag)
|
7
|
+
# rmq(my_view).find(UILabel).tag(:selected, :customer)
|
8
|
+
#
|
9
|
+
# You can optionally store a value in the tag, which can be super useful in some rare situations
|
10
|
+
# @example
|
11
|
+
# rmq(my_view).tag(your_tag: 22)
|
12
|
+
# rmq(my_view).tag(your_tag: 22, your_other_tag: 'Hello world')
|
13
|
+
#
|
14
|
+
# @return [RMQ]
|
15
|
+
def tag(*tag_or_tags)
|
16
|
+
selected.each do |view|
|
17
|
+
view.rmq_data.tag(tag_or_tags)
|
18
|
+
end
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
22
|
+
def untag(*tag_or_tags)
|
23
|
+
selected.each do |view|
|
24
|
+
view.rmq_data.untag(tag_or_tags)
|
25
|
+
end
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [RMQ]
|
30
|
+
def clear_tags
|
31
|
+
selected.each do |view|
|
32
|
+
view.rmq_data.tags.clear
|
33
|
+
end
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
# Check if any of the selected has a given tag
|
38
|
+
# @example
|
39
|
+
# rmq(my_view).has_tag?(:your_tag) #false
|
40
|
+
# rmq(my_view).tag(:your_tag)
|
41
|
+
# rmq(my_view).has_tag?(:your_tag) #true
|
42
|
+
#
|
43
|
+
# @return [Boolean] true if any selection views have tag provided
|
44
|
+
def has_tag? tag
|
45
|
+
out = false
|
46
|
+
selected.each do |view|
|
47
|
+
if view.rmq_data.has_tag?(tag)
|
48
|
+
out = true # This is weird because of RM android bug
|
49
|
+
break
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
out
|
54
|
+
end
|
55
|
+
# See data.rb for the rest of the tag stuff
|
56
|
+
|
57
|
+
end
|
58
|
+
|
@@ -0,0 +1,287 @@
|
|
1
|
+
class RMQ
|
2
|
+
def activity
|
3
|
+
# TODO we can get the activity in better ways, and in more
|
4
|
+
# situations
|
5
|
+
if @originated_from.is_a?(PMScreen)
|
6
|
+
@originated_from.activity
|
7
|
+
elsif @originated_from.is_a?(Potion::Activity)
|
8
|
+
@originated_from
|
9
|
+
elsif @originated_from.is_a?(Potion::View)
|
10
|
+
if @originated_from.rmq_data
|
11
|
+
@originated_from.rmq_data.activity
|
12
|
+
else
|
13
|
+
RMQ.app.current_activity
|
14
|
+
end
|
15
|
+
else
|
16
|
+
RMQ.app.current_activity
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def screen
|
21
|
+
# TODO we can get the screen in better ways, and in more
|
22
|
+
# situations
|
23
|
+
if @originated_from.is_a?(PMScreen)
|
24
|
+
@originated_from
|
25
|
+
elsif @originated_from.is_a?(Potion::View)
|
26
|
+
if @originated_from.rmq_data
|
27
|
+
@originated_from.rmq_data.screen
|
28
|
+
else
|
29
|
+
RMQ.app.current_screen
|
30
|
+
end
|
31
|
+
else
|
32
|
+
RMQ.app.current_screen
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def controller
|
37
|
+
self.screen || self.activity
|
38
|
+
end
|
39
|
+
|
40
|
+
def root_view
|
41
|
+
if @originated_from.is_a?(Android::App::Activity)
|
42
|
+
@originated_from.root_view
|
43
|
+
else
|
44
|
+
self.controller.root_view
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def filter(opts = {}, &block)
|
49
|
+
out = []
|
50
|
+
limit = opts[:limit]
|
51
|
+
|
52
|
+
selected.each do |view|
|
53
|
+
results = yield(view)
|
54
|
+
unless RMQ.is_blank?(results)
|
55
|
+
out << results
|
56
|
+
break if limit && (out.length >= limit)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
out.flatten!
|
60
|
+
out = out.uniq if opts[:uniq]
|
61
|
+
|
62
|
+
if opts[:return_array]
|
63
|
+
out
|
64
|
+
else
|
65
|
+
RMQ.create_with_array_and_selectors(out, selectors, @originated_from, self)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def all
|
70
|
+
wrap(root_view).find
|
71
|
+
end
|
72
|
+
|
73
|
+
def children(*working_selectors)
|
74
|
+
normalize_selectors(working_selectors)
|
75
|
+
|
76
|
+
filter do |view|
|
77
|
+
sbvws = view.subviews
|
78
|
+
|
79
|
+
if RMQ.is_blank?(working_selectors)
|
80
|
+
sbvws
|
81
|
+
else
|
82
|
+
sbvws.inject([]) do |out, subview|
|
83
|
+
out << subview if match(subview, working_selectors)
|
84
|
+
out
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
alias :subviews :children
|
90
|
+
|
91
|
+
def find(*working_selectors)
|
92
|
+
normalize_selectors(working_selectors)
|
93
|
+
|
94
|
+
#if working_selectors.length == 1 && self.selected.length == 1 && working_selectors.first.is_a?(Java::Lang::Integer)
|
95
|
+
#return selected_first.findViewById(r(:id, working_selectors.first))
|
96
|
+
#end
|
97
|
+
|
98
|
+
filter(uniq: true) do |view|
|
99
|
+
sbvws = all_subviews_for(view)
|
100
|
+
|
101
|
+
if RMQ.is_blank?(working_selectors)
|
102
|
+
sbvws
|
103
|
+
else
|
104
|
+
sbvws.inject([]) do |out, subview|
|
105
|
+
out << subview if match(subview, working_selectors)
|
106
|
+
out
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end # filter
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
# @return [RMQ] A new rmq instance reducing selected views to those that match selectors provided
|
114
|
+
#
|
115
|
+
# @param selectors your selector
|
116
|
+
#
|
117
|
+
# @example
|
118
|
+
# rmq(UIImage).and(:some_tag).attr(image: nil)
|
119
|
+
def and(*working_selectors)
|
120
|
+
return self unless working_selectors
|
121
|
+
normalize_selectors(working_selectors)
|
122
|
+
|
123
|
+
self.select do |view|
|
124
|
+
match(view, working_selectors)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# @return [RMQ] A new rmq instance removing selected views that match selectors provided
|
129
|
+
#
|
130
|
+
# @param selectors
|
131
|
+
#
|
132
|
+
# @example
|
133
|
+
# # Entire family of labels from siblings on down
|
134
|
+
# rmq(my_label).parent.find(UILabel).not(my_label).move(left: 10)
|
135
|
+
def not(*working_selectors)
|
136
|
+
return self unless working_selectors
|
137
|
+
normalize_selectors(working_selectors)
|
138
|
+
|
139
|
+
self.reject do |view|
|
140
|
+
match(view, working_selectors)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# @return [RMQ] A new rmq instance adding the context to the selected views
|
145
|
+
#
|
146
|
+
# @example
|
147
|
+
# rmq(my_view).children.and_self
|
148
|
+
def and_self
|
149
|
+
if self.parent_rmq
|
150
|
+
out = self.parent_rmq.selected.dup
|
151
|
+
out << selected
|
152
|
+
out.flatten!
|
153
|
+
RMQ.create_with_array_and_selectors(out, selectors, @context, self)
|
154
|
+
else
|
155
|
+
self
|
156
|
+
end
|
157
|
+
end
|
158
|
+
alias :add_self :and_self
|
159
|
+
|
160
|
+
# @return [RMQ] The parent rmq instance. This is useful when you want to go down
|
161
|
+
# into the tree, then move back up to do more work. Like jQuery's "end"
|
162
|
+
#
|
163
|
+
# @example
|
164
|
+
# rmq(test_view).find(Potion::Button).tag(:foo).back.find(UILabel).tag(:bar)
|
165
|
+
def back
|
166
|
+
self.parent_rmq || self
|
167
|
+
end
|
168
|
+
|
169
|
+
# @return [RMQ] rmq instance selecting the parent of the selected view(s)
|
170
|
+
#
|
171
|
+
# @example
|
172
|
+
# rmq(my_view).parent.find(:delete_button).toggle_enabled
|
173
|
+
def parent
|
174
|
+
closest(Potion::View)
|
175
|
+
end
|
176
|
+
alias :superview :parent
|
177
|
+
|
178
|
+
# @return [RMQ] Instance selecting the parents, grandparents, etc, all the way up the tree
|
179
|
+
# of the selected view(s)
|
180
|
+
#
|
181
|
+
# @param selectors
|
182
|
+
#
|
183
|
+
# @example
|
184
|
+
# rmq(my_view).parents.log
|
185
|
+
def parents(*working_selectors)
|
186
|
+
normalize_selectors(working_selectors)
|
187
|
+
|
188
|
+
filter(uniq: true) do |view|
|
189
|
+
superviews = all_superviews_for(view)
|
190
|
+
|
191
|
+
if RMQ.is_blank?(working_selectors)
|
192
|
+
superviews
|
193
|
+
else
|
194
|
+
superviews.inject([]) do |subview, out|
|
195
|
+
out << subview if match(subview, working_selectors)
|
196
|
+
out
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
alias :superviews :parents
|
202
|
+
|
203
|
+
# @return [RMQ] Siblings of the selected view(s)
|
204
|
+
#
|
205
|
+
# @param selectors
|
206
|
+
#
|
207
|
+
# @example
|
208
|
+
# rmq(my_view).siblings.send(:poke)
|
209
|
+
def siblings(*working_selectors)
|
210
|
+
normalize_selectors(working_selectors)
|
211
|
+
|
212
|
+
self.parent.children.not(selected)
|
213
|
+
end
|
214
|
+
|
215
|
+
# @return [RMQ] Sibling below the selected view(s) (in the subview array)
|
216
|
+
#
|
217
|
+
# @param selectors
|
218
|
+
#
|
219
|
+
# @example
|
220
|
+
# rmq(my_view).next.hide
|
221
|
+
# rmq(my_view).next(UITextField).focus
|
222
|
+
def next(*working_selectors)
|
223
|
+
normalize_selectors(working_selectors)
|
224
|
+
|
225
|
+
filter do |view|
|
226
|
+
subs = view.superview.subviews
|
227
|
+
location = subs.index(view)
|
228
|
+
if location < subs.length - 1
|
229
|
+
subs[location + 1]
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
# @return [RMQ] Sibling above the selected view(s) (in the subview array)
|
235
|
+
#
|
236
|
+
# @param selectors
|
237
|
+
#
|
238
|
+
# @example
|
239
|
+
# rmq(my_view).prev.hid
|
240
|
+
# rmq(my_view).prev(UITextField).focus
|
241
|
+
def prev(*working_selectors)
|
242
|
+
normalize_selectors(working_selectors)
|
243
|
+
|
244
|
+
filter do |view|
|
245
|
+
if sv = view.superview
|
246
|
+
subs = sv.subviews
|
247
|
+
location = subs.index(view)
|
248
|
+
if location > 0
|
249
|
+
subs[location - 1]
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
# For each selected view, get the first view that matches the selector(s) by testing the view's parent and
|
256
|
+
# traversing up through its ancestors in the tree
|
257
|
+
#
|
258
|
+
# @return [RMQ] Instance selecting the first parent or grandparent or ancestor up the tree of the selected view(s)
|
259
|
+
#
|
260
|
+
# @param selectors
|
261
|
+
#
|
262
|
+
# @example
|
263
|
+
# rmq.closest(Potion::View).get.setContentOffset([0,0])
|
264
|
+
def closest(*working_selectors)
|
265
|
+
normalize_selectors(working_selectors)
|
266
|
+
|
267
|
+
filter do |view|
|
268
|
+
closest_view(view, working_selectors)
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
|
273
|
+
protected
|
274
|
+
|
275
|
+
def closest_view(view, working_selectors)
|
276
|
+
if nr = view.superview
|
277
|
+
if match(nr, working_selectors)
|
278
|
+
nr
|
279
|
+
else
|
280
|
+
closest_view(nr,working_selectors)
|
281
|
+
end
|
282
|
+
else
|
283
|
+
nil
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class RMQ
|
2
|
+
class << self
|
3
|
+
|
4
|
+
def is_class?(o)
|
5
|
+
o.class == Java::Lang::Class
|
6
|
+
end
|
7
|
+
|
8
|
+
def is_blank?(o)
|
9
|
+
if o.is_a?(RMQ)
|
10
|
+
RMQ.is_blank?(o.to_a)
|
11
|
+
else
|
12
|
+
o.respond_to?(:empty?) ? o.empty? : !o
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def weak_ref(o)
|
17
|
+
o
|
18
|
+
end
|
19
|
+
|
20
|
+
def weak_ref_to_strong_ref(weak_ref)
|
21
|
+
weak_ref
|
22
|
+
end
|
23
|
+
|
24
|
+
def is_object_weak_ref?(o)
|
25
|
+
false
|
26
|
+
end
|
27
|
+
|
28
|
+
def weak_ref_value(o)
|
29
|
+
o
|
30
|
+
end
|
31
|
+
|
32
|
+
def symbolize(s)
|
33
|
+
s.to_s.gsub(/\s+/,"_").gsub(/\W+/,"").downcase.to_sym
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
# many hacks in this: we can't duplicate the iOS implementation because
|
2
|
+
# define_singleton_method isn't implemented in Android :'(
|
3
|
+
class RMQ
|
4
|
+
|
5
|
+
def self.color(*params)
|
6
|
+
if params.empty?
|
7
|
+
RMQColor
|
8
|
+
else
|
9
|
+
RMQColorFactory.build(params)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def color(*params)
|
14
|
+
self.class.color(*params)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
class RMQColor < Android::Graphics::Color
|
20
|
+
class << self
|
21
|
+
def clear ; self::TRANSPARENT ; end
|
22
|
+
def transparent ; self::TRANSPARENT ; end
|
23
|
+
|
24
|
+
def white ; self::WHITE ; end
|
25
|
+
def light_gray ; self::LTGRAY ; end
|
26
|
+
def gray ; self::GRAY ; end
|
27
|
+
def dark_gray ; self::DKGRAY ; end
|
28
|
+
def black ; self::BLACK ; end
|
29
|
+
|
30
|
+
#def cyan ; self::CYAN ; end
|
31
|
+
#def magenta ; self::MAGENTA ; end
|
32
|
+
#def yellow ; self::YELLOW ; end
|
33
|
+
|
34
|
+
# These are special as the methods already exist
|
35
|
+
#def blue ; self::BLUE ; end
|
36
|
+
#def green ; self::GREEN ; end
|
37
|
+
#def red ; self::RED ; end
|
38
|
+
#def blue_color ; self::BLUE ; end
|
39
|
+
#def green_color ; self::GREEN ; end
|
40
|
+
#def red_color ; self::RED ; end
|
41
|
+
|
42
|
+
# Maybe we should change this to: color(:white) rather than color.white, TOL
|
43
|
+
|
44
|
+
|
45
|
+
def add_named(key, hex_or_color)
|
46
|
+
c = if hex_or_color.is_a?(String)
|
47
|
+
RMQColor.parseColor(hex_or_color)
|
48
|
+
else
|
49
|
+
hex_or_color
|
50
|
+
end
|
51
|
+
|
52
|
+
rmq_color_cache[key] = c
|
53
|
+
end
|
54
|
+
|
55
|
+
def method_missing(color_key)
|
56
|
+
# define_singleton_method isn't implemented in Android :'(
|
57
|
+
rmq_color_cache[color_key]
|
58
|
+
end
|
59
|
+
|
60
|
+
# Creates a color from a hex triplet (rgb) or quartet (rgba)
|
61
|
+
#
|
62
|
+
# @param hex with or without the #
|
63
|
+
# @return [UIColor]
|
64
|
+
# @example
|
65
|
+
# color.from_hex('#ffffff')
|
66
|
+
# color.from_hex('ffffff')
|
67
|
+
# color.from_hex('#336699cc')
|
68
|
+
# color.from_hex('369c')
|
69
|
+
def from_hex(str)
|
70
|
+
RMQColorFactory.from_hex(str)
|
71
|
+
end
|
72
|
+
|
73
|
+
# @return [UIColor]
|
74
|
+
#
|
75
|
+
# @example
|
76
|
+
# rmq.color.from_rgba(255,255,255,0.5)
|
77
|
+
def from_rgba(r,g,b,a)
|
78
|
+
RMQColorFactory.from_rgba(r,g,b,a)
|
79
|
+
end
|
80
|
+
|
81
|
+
def random
|
82
|
+
RMQColorFactory.from_rgba(rand(255), rand(255), rand(255), 1.0)
|
83
|
+
end
|
84
|
+
|
85
|
+
def rmq_color_cache
|
86
|
+
@_rmq_color_cache ||= {}
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
class RMQColorFactory
|
93
|
+
|
94
|
+
class << self
|
95
|
+
def build(params)
|
96
|
+
return RMQColor if params.empty?
|
97
|
+
return from_rgba(*params) if params.count > 1
|
98
|
+
|
99
|
+
param = params.first
|
100
|
+
return from_hex(params.join) if param.is_a?(String)
|
101
|
+
|
102
|
+
#return from_base_color(param) if base_values(param)
|
103
|
+
#return try_rgba(param) if rgba_values(param)
|
104
|
+
#return try_hsva(param) if hsva_values(param)
|
105
|
+
#return try_hex(param) if hex_values(param)
|
106
|
+
end
|
107
|
+
|
108
|
+
def from_hex(hex_string)
|
109
|
+
if hex_string.length == 7
|
110
|
+
# this is #RRGGBB format - we need to add the alpha
|
111
|
+
color_str = "#FF#{hex_string[1..hex_string.length]}"
|
112
|
+
end
|
113
|
+
RMQColor.parseColor(hex_string)
|
114
|
+
end
|
115
|
+
|
116
|
+
def from_rgba(r, g, b, a)
|
117
|
+
RMQColor.argb(a, r, b, g)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|