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,14 @@
|
|
1
|
+
# RM-733
|
2
|
+
#module ProMotion
|
3
|
+
class PMHomeActivity < PMSingleFragmentActivity
|
4
|
+
def on_create(saved_instance_state)
|
5
|
+
super
|
6
|
+
|
7
|
+
mp "PMHomeActivity on_create", debugging_only: true
|
8
|
+
|
9
|
+
home_screen_class = PMApplication.current_application.home_screen_class
|
10
|
+
set_fragment home_screen_class.new if home_screen_class
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
#end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# http://hipbyte.myjetbrains.com/youtrack/issue/RM-773 - can't put this in a module yet :(
|
2
|
+
#module ProMotion
|
3
|
+
|
4
|
+
class PMScreen < Android::App::Fragment
|
5
|
+
include PMScreenModule
|
6
|
+
|
7
|
+
attr_accessor :view
|
8
|
+
|
9
|
+
def onCreateView(inflater, parent, saved_instance_state)
|
10
|
+
super
|
11
|
+
|
12
|
+
if self.class.xml_resource
|
13
|
+
@view = inflater.inflate(r(:layout, self.class.xml_resource), parent, false)
|
14
|
+
else
|
15
|
+
@view = load_view
|
16
|
+
@view.setId Potion::ViewIdGenerator.generate
|
17
|
+
end
|
18
|
+
|
19
|
+
action_bar.hide if hide_action_bar?
|
20
|
+
setup_xml_widgets
|
21
|
+
|
22
|
+
# TODO: how will we pass this back if we don't use XML?
|
23
|
+
@view
|
24
|
+
end
|
25
|
+
|
26
|
+
def load_view
|
27
|
+
Potion::FrameLayout.new(self.activity)
|
28
|
+
end
|
29
|
+
|
30
|
+
def onActivityCreated(saved_instance_state)
|
31
|
+
mp "PMScreen onActivityCreated" if RMQ.debugging?
|
32
|
+
|
33
|
+
super
|
34
|
+
|
35
|
+
@view.rmq_data.is_screen_root_view = true
|
36
|
+
|
37
|
+
self.rmq.build(@view)
|
38
|
+
|
39
|
+
if self.class.rmq_style_sheet_class
|
40
|
+
self.rmq.stylesheet = self.class.rmq_style_sheet_class
|
41
|
+
@view.rmq.apply_style(:root_view) #if @view.rmq.stylesheet.respond_to?(:root_view)
|
42
|
+
end
|
43
|
+
|
44
|
+
self.action_bar.title = self.class.bars_title
|
45
|
+
self.activity.title = self.class.bars_title
|
46
|
+
|
47
|
+
on_load
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def setup_xml_widgets
|
54
|
+
return unless (xml_widget_ids = self.class.xml_widget_ids)
|
55
|
+
xml_widget_ids.each do |id|
|
56
|
+
instance_variable_set("@#{id.to_s}".to_sym, find(id))
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def hide_action_bar?
|
61
|
+
# RM-???: comparing nil to false causes ART crash
|
62
|
+
!self.class.show_action_bar.nil? && self.class.show_action_bar == false
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
#end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
# http://hipbyte.myjetbrains.com/youtrack/issue/RM-773 - can't put this in a module yet :(
|
2
|
+
# module ProMotion
|
3
|
+
module PMScreenModule
|
4
|
+
def self.included(base)
|
5
|
+
base.extend(ClassMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
attr_reader :xml_resource, :xml_widget_ids, :show_action_bar, :bars_title
|
10
|
+
|
11
|
+
@show_action_bar = true
|
12
|
+
|
13
|
+
def stylesheet(style_sheet_class)
|
14
|
+
@rmq_style_sheet_class = style_sheet_class
|
15
|
+
end
|
16
|
+
|
17
|
+
def rmq_style_sheet_class
|
18
|
+
@rmq_style_sheet_class
|
19
|
+
end
|
20
|
+
|
21
|
+
def uses_xml(xml_resource=nil)
|
22
|
+
@xml_resource = xml_resource ||= deduce_resource_id
|
23
|
+
end
|
24
|
+
|
25
|
+
def xml_widgets(*widget_ids)
|
26
|
+
@xml_widget_ids = widget_ids || []
|
27
|
+
@xml_widget_ids.each do |id|
|
28
|
+
attr_accessor id
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def uses_action_bar(show_action_bar)
|
33
|
+
@show_action_bar = show_action_bar
|
34
|
+
end
|
35
|
+
|
36
|
+
def title(new_title)
|
37
|
+
@bars_title = new_title
|
38
|
+
#self.activity.title = new_title
|
39
|
+
#getActivity().getActionBar().setTitle("abc")
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def deduce_resource_id
|
45
|
+
resource = self.name.split(".").last
|
46
|
+
resource.underscore.to_sym
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def rmq_data
|
51
|
+
@_rmq_data ||= RMQScreenData.new
|
52
|
+
end
|
53
|
+
|
54
|
+
def stylesheet
|
55
|
+
self.rmq.stylesheet
|
56
|
+
end
|
57
|
+
|
58
|
+
def stylesheet=(value)
|
59
|
+
self.rmq.stylesheet = value
|
60
|
+
end
|
61
|
+
|
62
|
+
def rmq(*working_selectors)
|
63
|
+
crmq = (rmq_data.cached_rmq ||= RMQ.create_with_selectors([], self))
|
64
|
+
|
65
|
+
if working_selectors.length == 0
|
66
|
+
crmq
|
67
|
+
else
|
68
|
+
RMQ.create_with_selectors(working_selectors, self, crmq)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def root_view
|
73
|
+
self.getView
|
74
|
+
end
|
75
|
+
|
76
|
+
def on_load
|
77
|
+
# abstract
|
78
|
+
end
|
79
|
+
|
80
|
+
def color(*params)
|
81
|
+
RMQ.color(*params)
|
82
|
+
end
|
83
|
+
|
84
|
+
def font
|
85
|
+
rmq.font
|
86
|
+
end
|
87
|
+
|
88
|
+
def image
|
89
|
+
rmq.image
|
90
|
+
end
|
91
|
+
|
92
|
+
def append_view(view_or_class, style=nil, opts={})
|
93
|
+
self.rmq.append_view(view_or_class, style, opts)
|
94
|
+
end
|
95
|
+
|
96
|
+
def append_view!(view_or_class, style=nil, opts={})
|
97
|
+
self.rmq.append_view(view_or_class, style, opts).get
|
98
|
+
end
|
99
|
+
|
100
|
+
# TODO add create and build
|
101
|
+
|
102
|
+
|
103
|
+
# temporary stand-in for Java's R class
|
104
|
+
def r(resource_type, resource_name)
|
105
|
+
resources.getIdentifier(resource_name.to_s, resource_type.to_s,
|
106
|
+
activity.getApplicationInfo.packageName)
|
107
|
+
end
|
108
|
+
|
109
|
+
def show_toast(message)
|
110
|
+
Android::Widget::Toast.makeText(activity, message, Android::Widget::Toast::LENGTH_SHORT).show
|
111
|
+
end
|
112
|
+
|
113
|
+
def open(screen_class, options={})
|
114
|
+
mp "ScreenModule open", debugging_only: true
|
115
|
+
activity_class = options[:activity] || PMSingleFragmentActivity
|
116
|
+
|
117
|
+
# TODO: replace the fragment in the activity when possible
|
118
|
+
# replace the fragment if we can; otherwise launch a new activity
|
119
|
+
# we're taking a conservative approach for now - eventually we'll want to allow
|
120
|
+
# replacing fragments for any kind of activity, but I'm not sure of the best way
|
121
|
+
# to implement that yet
|
122
|
+
intent = Android::Content::Intent.new(self.activity, activity_class)
|
123
|
+
intent.putExtra PMSingleFragmentActivity::EXTRA_FRAGMENT_CLASS, screen_class.to_s
|
124
|
+
|
125
|
+
## TODO: limited support for extras for now - should reimplement with fragment arguments
|
126
|
+
if options[:extras]
|
127
|
+
options[:extras].keys.each do |key|
|
128
|
+
intent.putExtra key.to_s, options[:extras][key].toString
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
self.activity.startActivity intent
|
133
|
+
end
|
134
|
+
|
135
|
+
def start_activity(activity_class)
|
136
|
+
intent = Android::Content::Intent.new(self.activity, activity_class)
|
137
|
+
#intent.putExtra("key", value); # Optional parameters
|
138
|
+
self.activity.startActivity(intent)
|
139
|
+
end
|
140
|
+
|
141
|
+
def soft_input_mode(mode)
|
142
|
+
mode_const =
|
143
|
+
case mode
|
144
|
+
when :adjust_resize
|
145
|
+
Android::View::WindowManager::LayoutParams::SOFT_INPUT_ADJUST_RESIZE
|
146
|
+
end
|
147
|
+
activity.getWindow().setSoftInputMode(mode_const)
|
148
|
+
end
|
149
|
+
|
150
|
+
def hide_keyboard
|
151
|
+
input_manager = activity.getSystemService(Android::Content::Context::INPUT_METHOD_SERVICE)
|
152
|
+
input_manager.hideSoftInputFromWindow(view.getWindowToken(), 0);
|
153
|
+
end
|
154
|
+
|
155
|
+
|
156
|
+
def activity
|
157
|
+
getActivity()
|
158
|
+
end
|
159
|
+
|
160
|
+
def action_bar
|
161
|
+
activity.getActionBar()
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
#end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# An abstract Activity designed to host a single fragment.
|
2
|
+
# RM-733
|
3
|
+
#module ProMotion
|
4
|
+
class PMSingleFragmentActivity < PMActivity
|
5
|
+
attr_accessor :fragment_container, :fragment
|
6
|
+
|
7
|
+
EXTRA_FRAGMENT_CLASS = "fragment_class"
|
8
|
+
|
9
|
+
def on_create(saved_instance_state)
|
10
|
+
super
|
11
|
+
|
12
|
+
mp "PMSingleFragmentActivity on_create", debugging_only: true
|
13
|
+
|
14
|
+
@fragment_container = Potion::FrameLayout.new(self)
|
15
|
+
@fragment_container.setId Potion::ViewIdGenerator.generate
|
16
|
+
self.contentView = @fragment_container
|
17
|
+
|
18
|
+
if (fragment_class = intent.getStringExtra(EXTRA_FRAGMENT_CLASS))
|
19
|
+
# TODO weird way to create this intance, look at this later
|
20
|
+
set_fragment Kernel.const_get(fragment_class.to_s).new
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def set_fragment(fragment)
|
25
|
+
mp "PMSingleFragmentActivity set_fragment", debugging_only: true
|
26
|
+
@fragment = fragment # useful for the REPL
|
27
|
+
fragmentManager.beginTransaction.add(@fragment_container.getId, fragment, fragment.class.to_s).commit
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
#end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class RMQ
|
2
|
+
|
3
|
+
# @return [RMQ]
|
4
|
+
def attr(new_settings)
|
5
|
+
selected.each do |view|
|
6
|
+
new_settings.each do |k,v|
|
7
|
+
view.send "#{k}=", v
|
8
|
+
end
|
9
|
+
end
|
10
|
+
self
|
11
|
+
end
|
12
|
+
|
13
|
+
def send(method, args = nil)
|
14
|
+
selected.each do |view|
|
15
|
+
if view.respond_to?(method)
|
16
|
+
if args
|
17
|
+
view.__send__ method, args
|
18
|
+
else
|
19
|
+
view.__send__ method
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def focus
|
27
|
+
unless RMQ.is_blank?(selected)
|
28
|
+
selected.last.requestFocus
|
29
|
+
end
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def hide
|
34
|
+
selected.each { |view| view.setVisibility(Potion::View::INVISIBLE) }
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
def show
|
39
|
+
selected.each { |view| view.setVisibility(Potion::View::VISIBLE) }
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
#def toggle
|
44
|
+
#selected.each { |view| view.hidden = !view.hidden? }
|
45
|
+
#self
|
46
|
+
#end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,260 @@
|
|
1
|
+
class RMQ
|
2
|
+
def initialize
|
3
|
+
@selected_dirty = true
|
4
|
+
end
|
5
|
+
|
6
|
+
def originated_from=(value)
|
7
|
+
if value
|
8
|
+
if value.is_a?(Potion::Activity)
|
9
|
+
@originated_from = value
|
10
|
+
@activity = value
|
11
|
+
elsif value.is_a?(PMScreen)
|
12
|
+
@originated_from = value
|
13
|
+
elsif value.is_a?(Potion::View)
|
14
|
+
@originated_from = value
|
15
|
+
elsif value.is_a?(RMQStylesheet)
|
16
|
+
@originated_from = value.controller
|
17
|
+
else
|
18
|
+
#debug.log_detailed('Invalid originated_from', objects: {value: value})
|
19
|
+
mp "Invalid originated_from: #{value.inspect}"
|
20
|
+
end
|
21
|
+
else
|
22
|
+
@originated_from = nil
|
23
|
+
end
|
24
|
+
@originated_from
|
25
|
+
end
|
26
|
+
|
27
|
+
def originated_from
|
28
|
+
@originated_from
|
29
|
+
end
|
30
|
+
|
31
|
+
def parent_rmq
|
32
|
+
@_parent_rmq
|
33
|
+
end
|
34
|
+
def parent_rmq=(value)
|
35
|
+
#debug.assert(value.is_a?(RMQ) || value.nil?, 'Invalid parent_rmq', { value: value })
|
36
|
+
@_parent_rmq = value
|
37
|
+
end
|
38
|
+
|
39
|
+
def root?
|
40
|
+
# TODO broken
|
41
|
+
(selected.length == 1) && (selected.first == @originated_from)
|
42
|
+
end
|
43
|
+
|
44
|
+
def originated_from_or_its_view
|
45
|
+
if @originated_from.is_a?(Potion::Activity) || @originated_from.is_a?(PMScreen)
|
46
|
+
@originated_from.root_view
|
47
|
+
else
|
48
|
+
@originated_from
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def get
|
53
|
+
sel = self.selected
|
54
|
+
if sel.length == 1
|
55
|
+
sel.first
|
56
|
+
else
|
57
|
+
sel
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def origin_views
|
62
|
+
if pq = self.parent_rmq
|
63
|
+
pq.selected
|
64
|
+
else
|
65
|
+
root_view
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def wrap(*views)
|
70
|
+
views = [views] unless views.is_a?(Potion::ArrayList) # TODO, WTF, RM bug?
|
71
|
+
views.flatten!
|
72
|
+
|
73
|
+
views.select!{ |v| v.is_a?(Potion::View) }
|
74
|
+
RMQ.create_with_array_and_selectors(views, views, @originated_from, self)
|
75
|
+
end
|
76
|
+
|
77
|
+
def log(opt = nil)
|
78
|
+
if opt == :tree
|
79
|
+
mp tree_to_s(selected)
|
80
|
+
sleep 0.1 # Hack, TODO, fix async problem
|
81
|
+
return
|
82
|
+
end
|
83
|
+
|
84
|
+
wide = (opt == :wide)
|
85
|
+
out = "\n id |scr| class | style_name | frame |"
|
86
|
+
out << "\n" unless wide
|
87
|
+
out << " sv id |een| superview | subviews count | tags |"
|
88
|
+
line = " ––––––––––––|–––|–––––––––––––––––––––––|–––––––––––––––––––––––––|–––––––––––––––––––––––––––––––––––––––|\n"
|
89
|
+
out << "\n"
|
90
|
+
out << line.chop if wide
|
91
|
+
out << line
|
92
|
+
|
93
|
+
selected.each do |view|
|
94
|
+
out << " #{view.id.to_s.ljust(12)}|"
|
95
|
+
out << (view.rmq_data.screen_root_view? ? " √ |" : " |")
|
96
|
+
|
97
|
+
name = view.short_class_name
|
98
|
+
name = name[(name.length - 21)..name.length] if name.length > 21
|
99
|
+
out << " #{name.ljust(22)}|"
|
100
|
+
|
101
|
+
#out << " #{""[0..23].ljust(24)}|" # TODO change to real stylname
|
102
|
+
out << " #{(view.rmq_data.style_name.to_s || '')[0..23].ljust(24)}|" # TODO change to real stylname
|
103
|
+
s = ""
|
104
|
+
#if view.origin
|
105
|
+
#format = '#0.#'
|
106
|
+
s = " {l: #{view.x}"
|
107
|
+
s << ", t: #{view.y}"
|
108
|
+
s << ", w: #{view.width}"
|
109
|
+
s << ", h: #{view.height}}"
|
110
|
+
#end
|
111
|
+
out << s.ljust(36)
|
112
|
+
out << " |"
|
113
|
+
out << "\n" unless wide
|
114
|
+
out << " #{view.superview.id.to_s.ljust(12)}|"
|
115
|
+
out << " |"
|
116
|
+
out << " #{(view.superview ? view.superview.short_class_name : '')[0..21].ljust(22)}|"
|
117
|
+
out << " #{view.subviews.length.to_s.ljust(23)} |"
|
118
|
+
#out << " #{view.subviews.length.to_s.rjust(8)} #{view.superview.short_class_name.ljust(20)} #{view.superview.object_id.to_s.rjust(10)}"
|
119
|
+
out << " #{view.rmq_data.tag_names.join(',').ljust(38)}|"
|
120
|
+
out << "\n"
|
121
|
+
out << line unless wide
|
122
|
+
end
|
123
|
+
|
124
|
+
mp out
|
125
|
+
sleep 0.1 # Hack, TODO, fix async problem
|
126
|
+
end
|
127
|
+
|
128
|
+
def log_tree
|
129
|
+
self.log :tree
|
130
|
+
end
|
131
|
+
|
132
|
+
def tree_to_s(selected_views, depth = 0)
|
133
|
+
out = ""
|
134
|
+
|
135
|
+
selected_views.each do |view|
|
136
|
+
if depth == 0
|
137
|
+
out << "\n"
|
138
|
+
else
|
139
|
+
0.upto(depth - 1) do |i|
|
140
|
+
out << (i == (depth - 1) ? " ├" : " │")
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
out << '───'
|
145
|
+
|
146
|
+
out << "#{view.id} "
|
147
|
+
out << "SCREEN ROOT/" if view.rmq_data.screen_root_view?
|
148
|
+
out << "#{view.short_class_name[0..21]}"
|
149
|
+
out << " ( :#{view.rmq_data.style_name.to_s[0..23]} )" if view.rmq_data.style_name
|
150
|
+
out << " [ #{view.rmq_data.tag_names.join(',')} ]" if view.rmq_data.tag_names.length > 0
|
151
|
+
|
152
|
+
#if view.origin
|
153
|
+
#format = '#0.#'
|
154
|
+
s = " {l: #{view.x}"
|
155
|
+
s << ", t: #{view.y}"
|
156
|
+
s << ", w: #{view.width}"
|
157
|
+
s << ", h: #{view.height}}"
|
158
|
+
out << s
|
159
|
+
#end
|
160
|
+
|
161
|
+
out << "\n"
|
162
|
+
out << tree_to_s(view.subviews, depth + 1)
|
163
|
+
end
|
164
|
+
|
165
|
+
out
|
166
|
+
end
|
167
|
+
|
168
|
+
def inspect
|
169
|
+
out = "RMQ #{self.object_id}. #{self.count} selected. selectors: #{self.selectors}. .log for more info"
|
170
|
+
out << "\n[#{selected.first.inspect}]" if self.count == 1
|
171
|
+
out
|
172
|
+
end
|
173
|
+
|
174
|
+
# Do not use
|
175
|
+
def selected=(value)
|
176
|
+
@_selected = value
|
177
|
+
@selected_dirty = false
|
178
|
+
end
|
179
|
+
|
180
|
+
def selected
|
181
|
+
if @selected_dirty
|
182
|
+
@_selected = []
|
183
|
+
|
184
|
+
if RMQ.is_blank?(self.selectors)
|
185
|
+
@_selected << originated_from_or_its_view
|
186
|
+
#elsif self.selectors.length == 1 and self.selectors.first.is_a?(Java::Lang::Integer)
|
187
|
+
### Special case where we find by id
|
188
|
+
#@_selected << self.root_view.findViewById(self.selectors.first)
|
189
|
+
else
|
190
|
+
working_selectors = self.selectors.dup
|
191
|
+
extract_views_from_selectors(@_selected, working_selectors)
|
192
|
+
|
193
|
+
unless RMQ.is_blank?(working_selectors)
|
194
|
+
subviews = all_subviews_for(root_view)
|
195
|
+
subviews.each do |subview|
|
196
|
+
@_selected << subview if match(subview, working_selectors)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
201
|
+
|
202
|
+
@selected_dirty = false
|
203
|
+
else
|
204
|
+
@_selected ||= []
|
205
|
+
end
|
206
|
+
|
207
|
+
@_selected
|
208
|
+
end
|
209
|
+
|
210
|
+
def extract_views_from_selectors(view_container, working_selectors)
|
211
|
+
unless RMQ.is_blank?(working_selectors)
|
212
|
+
working_selectors.delete_if do |selector|
|
213
|
+
if selector.is_a?(Potion::View)
|
214
|
+
view_container << selector
|
215
|
+
true
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
def all_subviews_for(view)
|
222
|
+
out = []
|
223
|
+
|
224
|
+
view.subviews.each do |subview|
|
225
|
+
out << subview
|
226
|
+
out << all_subviews_for(subview)
|
227
|
+
end
|
228
|
+
out.flatten!
|
229
|
+
out
|
230
|
+
end
|
231
|
+
|
232
|
+
def all_superviews_for(view, out = [])
|
233
|
+
if (sv = view.superview)
|
234
|
+
out << sv
|
235
|
+
|
236
|
+
# Stop at root_view of screen or activity
|
237
|
+
unless (sv.rmq_data.screen_root_view?) || (sv == self.activity.root_view) # TODO speed this up if needed
|
238
|
+
all_superviews_for(sv, out)
|
239
|
+
end
|
240
|
+
end
|
241
|
+
out
|
242
|
+
end
|
243
|
+
|
244
|
+
end # RMQ
|
245
|
+
|
246
|
+
__END__
|
247
|
+
|
248
|
+
findViewById(android.R.id.content) returns the View that hosts the content you supplied in setContentView().
|
249
|
+
Beyond that, try getRootView() (called on any View) to retrieve "the topmost view in the current view hierarchy".
|
250
|
+
|
251
|
+
|
252
|
+
|
253
|
+
we_care_about_this = getWindow.getDecorView.findViewById(Android::R::Id::Content)`
|
254
|
+
now we can traverse:
|
255
|
+
`we_care_about_this.getChildCount` and `we_care_about_this.getChildAt(0)`
|
256
|
+
|
257
|
+
|
258
|
+
Activity host = (Activity) view.getContext()
|
259
|
+
|
260
|
+
2. view.isFocused()
|