ruby_motion_query 0.1.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 +15 -0
- data/LICENSE +21 -0
- data/README.md +964 -0
- data/lib/ruby_motion_query.rb +8 -0
- data/motion/ext.rb +34 -0
- data/motion/ruby_motion_query/actions.rb +44 -0
- data/motion/ruby_motion_query/animations.rb +125 -0
- data/motion/ruby_motion_query/app.rb +71 -0
- data/motion/ruby_motion_query/base.rb +161 -0
- data/motion/ruby_motion_query/color.rb +80 -0
- data/motion/ruby_motion_query/data.rb +32 -0
- data/motion/ruby_motion_query/device.rb +73 -0
- data/motion/ruby_motion_query/enumerablish.rb +74 -0
- data/motion/ruby_motion_query/event.rb +125 -0
- data/motion/ruby_motion_query/events.rb +65 -0
- data/motion/ruby_motion_query/factory.rb +32 -0
- data/motion/ruby_motion_query/font.rb +66 -0
- data/motion/ruby_motion_query/format.rb +54 -0
- data/motion/ruby_motion_query/image.rb +79 -0
- data/motion/ruby_motion_query/position.rb +45 -0
- data/motion/ruby_motion_query/selectors.rb +56 -0
- data/motion/ruby_motion_query/stylers/ui_button_styler.rb +32 -0
- data/motion/ruby_motion_query/stylers/ui_control_styler.rb +8 -0
- data/motion/ruby_motion_query/stylers/ui_date_picker_styler.rb +8 -0
- data/motion/ruby_motion_query/stylers/ui_image_view_styler.rb +14 -0
- data/motion/ruby_motion_query/stylers/ui_label_styler.rb +36 -0
- data/motion/ruby_motion_query/stylers/ui_navigation_bar_styler.rb +8 -0
- data/motion/ruby_motion_query/stylers/ui_page_control_styler.rb +8 -0
- data/motion/ruby_motion_query/stylers/ui_refresh_control_styler.rb +8 -0
- data/motion/ruby_motion_query/stylers/ui_scroll_view_styler.rb +10 -0
- data/motion/ruby_motion_query/stylers/ui_segmented_control_styler.rb +8 -0
- data/motion/ruby_motion_query/stylers/ui_slider_styler.rb +8 -0
- data/motion/ruby_motion_query/stylers/ui_stepper_styler.rb +8 -0
- data/motion/ruby_motion_query/stylers/ui_switch_styler.rb +10 -0
- data/motion/ruby_motion_query/stylers/ui_tab_bar_styler.rb +8 -0
- data/motion/ruby_motion_query/stylers/ui_table_view_cell_styler.rb +8 -0
- data/motion/ruby_motion_query/stylers/ui_table_view_styler.rb +8 -0
- data/motion/ruby_motion_query/stylers/ui_text_field_styler.rb +8 -0
- data/motion/ruby_motion_query/stylers/ui_text_view_styler.rb +8 -0
- data/motion/ruby_motion_query/stylers/ui_view_styler.rb +243 -0
- data/motion/ruby_motion_query/stylesheet.rb +185 -0
- data/motion/ruby_motion_query/subviews.rb +52 -0
- data/motion/ruby_motion_query/tags.rb +14 -0
- data/motion/ruby_motion_query/traverse.rb +183 -0
- data/motion/ruby_motion_query/utils.rb +53 -0
- metadata +89 -0
@@ -0,0 +1,243 @@
|
|
1
|
+
module RubyMotionQuery
|
2
|
+
module Stylers
|
3
|
+
|
4
|
+
# When you create a styler, always inherit UIViewStyler
|
5
|
+
class UIViewStyler
|
6
|
+
def initialize(view)
|
7
|
+
@view = view
|
8
|
+
end
|
9
|
+
|
10
|
+
# If a view is reset, all state should be reset as well
|
11
|
+
def view=(value)
|
12
|
+
@view = value
|
13
|
+
end
|
14
|
+
def view
|
15
|
+
@view
|
16
|
+
end
|
17
|
+
|
18
|
+
def view_has_been_styled?
|
19
|
+
!@view.rmq_data.style_name.nil?
|
20
|
+
end
|
21
|
+
|
22
|
+
def superview
|
23
|
+
@view.superview || rmq(@view).view_controller.view || rmq.window
|
24
|
+
end
|
25
|
+
alias :parent :superview
|
26
|
+
|
27
|
+
def tag(tags)
|
28
|
+
rmq(@view).tag(tags)
|
29
|
+
end
|
30
|
+
|
31
|
+
def frame=(value)
|
32
|
+
if value == :full # Thanks teacup for the name
|
33
|
+
value = self.superview.bounds
|
34
|
+
elsif value.is_a?(Hash)
|
35
|
+
h = value
|
36
|
+
h[:l] ||= (h[:left] || 0)
|
37
|
+
h[:t] ||= (h[:top] || 0)
|
38
|
+
h[:w] ||= (h[:width] || 0)
|
39
|
+
h[:h] ||= (h[:height] || 0)
|
40
|
+
|
41
|
+
value = [[h[:l], h[:t]], [h[:w], h[:h]]]
|
42
|
+
end
|
43
|
+
|
44
|
+
@view.frame = value
|
45
|
+
end
|
46
|
+
def frame
|
47
|
+
@view.frame
|
48
|
+
end
|
49
|
+
|
50
|
+
def padded=(value)
|
51
|
+
#st.padded = {l: 10, t: 10, b:10, r: 10}
|
52
|
+
|
53
|
+
if value.is_a?(Hash)
|
54
|
+
h = value
|
55
|
+
h[:l] ||= (h[:left] || 0)
|
56
|
+
h[:t] ||= (h[:top] || 0)
|
57
|
+
h[:r] ||= (h[:right] || 0)
|
58
|
+
h[:b] ||= (h[:bottom] || 0)
|
59
|
+
|
60
|
+
sbounds = self.superview.bounds
|
61
|
+
|
62
|
+
value = [
|
63
|
+
[h[:l], h[:t]],
|
64
|
+
[
|
65
|
+
sbounds.size.width - h[:l] - h[:r],
|
66
|
+
sbounds.size.height - h[:t] - h[:b]
|
67
|
+
]]
|
68
|
+
|
69
|
+
@view.frame = value
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
def left=(value)
|
75
|
+
f = @view.frame
|
76
|
+
f.origin.x = value
|
77
|
+
@view.frame = f
|
78
|
+
end
|
79
|
+
def left
|
80
|
+
@view.origin.x
|
81
|
+
end
|
82
|
+
alias :x :left
|
83
|
+
|
84
|
+
def top=(value)
|
85
|
+
f = @view.frame
|
86
|
+
f.origin.y = value
|
87
|
+
@view.frame = f
|
88
|
+
end
|
89
|
+
def top
|
90
|
+
@view.origin.y
|
91
|
+
end
|
92
|
+
alias :y :top
|
93
|
+
|
94
|
+
def width=(value)
|
95
|
+
f = @view.frame
|
96
|
+
f.size.width = value
|
97
|
+
@view.frame = f
|
98
|
+
end
|
99
|
+
def width
|
100
|
+
@view.size.width
|
101
|
+
end
|
102
|
+
|
103
|
+
def height=(value)
|
104
|
+
f = @view.frame
|
105
|
+
f.size.height = value
|
106
|
+
@view.frame = f
|
107
|
+
end
|
108
|
+
def height
|
109
|
+
@view.size.height
|
110
|
+
end
|
111
|
+
|
112
|
+
def bottom=(value)
|
113
|
+
self.top = value - self.height
|
114
|
+
end
|
115
|
+
def bottom
|
116
|
+
self.top + self.height
|
117
|
+
end
|
118
|
+
|
119
|
+
def from_bottom=(value)
|
120
|
+
if superview = @view.superview
|
121
|
+
self.top = superview.bounds.size.height - self.height - value
|
122
|
+
end
|
123
|
+
end
|
124
|
+
def from_bottom
|
125
|
+
if superview = @view.superview
|
126
|
+
superview.bounds.size.height - self.top
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def right=(value)
|
131
|
+
self.left = value - self.width
|
132
|
+
end
|
133
|
+
def right
|
134
|
+
self.left + self.width
|
135
|
+
end
|
136
|
+
|
137
|
+
def from_right=(value)
|
138
|
+
if superview = @view.superview
|
139
|
+
self.left = superview.bounds.size.width - self.width - value
|
140
|
+
end
|
141
|
+
end
|
142
|
+
def from_right
|
143
|
+
if superview = @view.superview
|
144
|
+
superview.bounds.size.width - self.left
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def center=(value)
|
149
|
+
@view.center = value
|
150
|
+
end
|
151
|
+
def center
|
152
|
+
@view.center
|
153
|
+
end
|
154
|
+
|
155
|
+
def center_x=(value)
|
156
|
+
c = @view.center
|
157
|
+
c.x = value
|
158
|
+
@view.center = c
|
159
|
+
end
|
160
|
+
def center_x
|
161
|
+
@view.center.x
|
162
|
+
end
|
163
|
+
|
164
|
+
def center_y=(value)
|
165
|
+
c = @view.center
|
166
|
+
c.y = value
|
167
|
+
@view.center = c
|
168
|
+
end
|
169
|
+
def center_y
|
170
|
+
@view.center.y
|
171
|
+
end
|
172
|
+
|
173
|
+
# param can be :horizontal, :vertical, :both
|
174
|
+
def centered=(option)
|
175
|
+
if parent = @view.superview
|
176
|
+
case option
|
177
|
+
when :horizontal
|
178
|
+
# Not using parent.center.x here for orientation
|
179
|
+
self.center_x = parent.bounds.size.width / 2
|
180
|
+
when :vertical
|
181
|
+
self.center_y = parent.bounds.size.height / 2
|
182
|
+
else
|
183
|
+
@view.center = [parent.bounds.size.width / 2, parent.bounds.size.height / 2]
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def background_color=(value)
|
189
|
+
@view.backgroundColor = value
|
190
|
+
end
|
191
|
+
def background_color
|
192
|
+
@view.backgroundColor
|
193
|
+
end
|
194
|
+
|
195
|
+
# TODO add background_image_tiled
|
196
|
+
|
197
|
+
def z_position=(index)
|
198
|
+
@view.layer.zPosition = index
|
199
|
+
end
|
200
|
+
def z_position
|
201
|
+
@view.layer.zPosition
|
202
|
+
end
|
203
|
+
|
204
|
+
def opaque=(value)
|
205
|
+
@view.layer.opaque = value
|
206
|
+
end
|
207
|
+
def opaque
|
208
|
+
@view.layer.opaque
|
209
|
+
end
|
210
|
+
|
211
|
+
def hidden=(value)
|
212
|
+
@view.hidden = value
|
213
|
+
end
|
214
|
+
def hidden
|
215
|
+
@view.hidden
|
216
|
+
end
|
217
|
+
|
218
|
+
def enabled=(value)
|
219
|
+
@view.enabled = value
|
220
|
+
end
|
221
|
+
def enabled
|
222
|
+
@view.enabled
|
223
|
+
end
|
224
|
+
|
225
|
+
def scale=(amount)
|
226
|
+
if amount == 1.0
|
227
|
+
@view.transform = CGAffineTransformIdentity
|
228
|
+
else
|
229
|
+
if amount.is_a?(NSArray)
|
230
|
+
width = amount[0]
|
231
|
+
height = amount[1]
|
232
|
+
else
|
233
|
+
height = amount
|
234
|
+
width = amount
|
235
|
+
end
|
236
|
+
|
237
|
+
@view.transform = CGAffineTransformMakeScale(width, height)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
@@ -0,0 +1,185 @@
|
|
1
|
+
module RubyMotionQuery
|
2
|
+
class RMQ
|
3
|
+
def stylesheet=(value)
|
4
|
+
controller = view_controller
|
5
|
+
unless value.is_a?(RubyMotionQuery::Stylesheet)
|
6
|
+
value = value.new(controller)
|
7
|
+
end
|
8
|
+
controller.rmq_data.stylesheet = value
|
9
|
+
self
|
10
|
+
end
|
11
|
+
def stylesheet
|
12
|
+
@_stylesheet ||= begin
|
13
|
+
self.view_controller.rmq_data.stylesheet if self.view_controller
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def apply_style(style_name)
|
18
|
+
selected.each do |selected_view|
|
19
|
+
apply_style_to_view selected_view, style_name
|
20
|
+
end
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def style()
|
25
|
+
selected.each do |view|
|
26
|
+
yield(styler_for(view))
|
27
|
+
end
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
def reapply_styles
|
32
|
+
selected.each do |selected_view|
|
33
|
+
if style_name = selected_view.rmq_data.style_name
|
34
|
+
apply_style_to_view selected_view, style_name
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def styler_for(view)
|
40
|
+
# TODO should have a pool of stylers to reuse, or just assume single threaded and
|
41
|
+
# memoize this, however if you do that, make sure the dev doesn't retain them in a var
|
42
|
+
custom_stylers(view) || begin
|
43
|
+
case view
|
44
|
+
# TODO, rename all the stylers to Styler::UILabel, etc
|
45
|
+
when UILabel then Stylers::UILabelStyler.new(view)
|
46
|
+
when UIButton then Stylers::UIButtonStyler.new(view)
|
47
|
+
when UIImageView then Stylers::UIImageViewStyler.new(view)
|
48
|
+
when UIScrollView then Stylers::UIScrollViewStyler.new(view)
|
49
|
+
when UISwitch then Stylers::UISwitchStyler.new(view)
|
50
|
+
when UIDatePicker then Stylers::UIDatePickerStyler.new(view)
|
51
|
+
when UISegmentedControl then Stylers::UISegmentedControlStyler.new(view)
|
52
|
+
when UIRefreshControl then Stylers::UIRefreshControlStyler.new(view)
|
53
|
+
when UIPageControl then Stylers::UIPageControlStyler.new(view)
|
54
|
+
when UISlider then Stylers::UISliderStyler.new(view)
|
55
|
+
when UIStepper then Stylers::UIStepperStyler.new(view)
|
56
|
+
when UITabBar then Stylers::UITabBarStyler.new(view)
|
57
|
+
when UITableView then Stylers::UITableViewStyler.new(view)
|
58
|
+
when UITableViewCell then Stylers::UITableViewCellStyler.new(view)
|
59
|
+
when UITextView then Stylers::UITextViewStyler.new(view)
|
60
|
+
when UITextField then Stylers::UITextFieldStyler.new(view)
|
61
|
+
when UINavigationBar then Stylers::UINavigationBarStyler.new(view)
|
62
|
+
# TODO, all the controls are done, but missing some views, add
|
63
|
+
when UIControl then Stylers::UIControlStyler.new(view)
|
64
|
+
else
|
65
|
+
Stylers::UIViewStyler.new(view)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
protected
|
71
|
+
|
72
|
+
# Override to set your own stylers, or just open up the styler classes
|
73
|
+
def custom_stylers(view)
|
74
|
+
end
|
75
|
+
|
76
|
+
def apply_style_to_view(view, style_name)
|
77
|
+
begin
|
78
|
+
stylesheet.__send__(style_name, styler_for(view))
|
79
|
+
view.rmq_data.style_name = style_name
|
80
|
+
rescue NoMethodError => e
|
81
|
+
if e.message =~ /.*#{style_name.to_s}.*/
|
82
|
+
puts "\n[RMQ ERROR] style_name :#{style_name} doesn't exist for a #{view.class.name}. Add 'def #{style_name}(sv)' to #{stylesheet.class.name} class\n\n"
|
83
|
+
else
|
84
|
+
raise e
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
class Stylesheet
|
92
|
+
attr_reader :controller
|
93
|
+
|
94
|
+
def initialize(controller)
|
95
|
+
@controller = WeakRef.new(controller)
|
96
|
+
|
97
|
+
unless Stylesheet.application_was_setup
|
98
|
+
Stylesheet.application_was_setup = true
|
99
|
+
application_setup
|
100
|
+
end
|
101
|
+
setup
|
102
|
+
end
|
103
|
+
|
104
|
+
def application_setup
|
105
|
+
# Override to do your overall setup for your applications. This
|
106
|
+
# is where you want to add your custom fonts and colors
|
107
|
+
# This only gets called once
|
108
|
+
end
|
109
|
+
|
110
|
+
def setup
|
111
|
+
# Override if you need to do setup in your specific stylesheet
|
112
|
+
end
|
113
|
+
|
114
|
+
class << self
|
115
|
+
attr_accessor :application_was_setup
|
116
|
+
end
|
117
|
+
|
118
|
+
# Convenience methods -------------------
|
119
|
+
def rmq
|
120
|
+
if @controller
|
121
|
+
@controller.rmq
|
122
|
+
else
|
123
|
+
RMQ
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def device
|
128
|
+
RMQ.device
|
129
|
+
end
|
130
|
+
|
131
|
+
def landscape?
|
132
|
+
device.landscape?
|
133
|
+
end
|
134
|
+
def portrait?
|
135
|
+
device.portrait?
|
136
|
+
end
|
137
|
+
|
138
|
+
def iphone?
|
139
|
+
device.iphone?
|
140
|
+
end
|
141
|
+
def ipad?
|
142
|
+
device.ipad?
|
143
|
+
end
|
144
|
+
|
145
|
+
def four_inch?
|
146
|
+
RMQ.device.four_inch?
|
147
|
+
end
|
148
|
+
|
149
|
+
def retina?
|
150
|
+
RMQ.device.retina?
|
151
|
+
end
|
152
|
+
|
153
|
+
def window
|
154
|
+
RMQ.app.window
|
155
|
+
end
|
156
|
+
|
157
|
+
def app_width
|
158
|
+
app_size.width
|
159
|
+
end
|
160
|
+
|
161
|
+
def app_height
|
162
|
+
app_size.height
|
163
|
+
end
|
164
|
+
|
165
|
+
def app_size
|
166
|
+
device.screen.applicationFrame.size
|
167
|
+
end
|
168
|
+
|
169
|
+
def screen_size
|
170
|
+
device.screen.bounds.size
|
171
|
+
end
|
172
|
+
|
173
|
+
def image
|
174
|
+
RMQ.image
|
175
|
+
end
|
176
|
+
|
177
|
+
def color
|
178
|
+
RMQ.color
|
179
|
+
end
|
180
|
+
|
181
|
+
def font
|
182
|
+
RMQ.font
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# See traversing.rb and selectors.rb for finding and traversing subviews
|
2
|
+
module RubyMotionQuery
|
3
|
+
class RMQ
|
4
|
+
|
5
|
+
def remove
|
6
|
+
selected.each { |view| view.removeFromSuperview }
|
7
|
+
self
|
8
|
+
end
|
9
|
+
|
10
|
+
def append(view_or_constant, style = nil)
|
11
|
+
subviews_added = []
|
12
|
+
selected.each do |selected_view|
|
13
|
+
if view_or_constant.is_a?(UIView)
|
14
|
+
new_view = view_or_constant
|
15
|
+
else
|
16
|
+
new_view = create_view(view_or_constant)
|
17
|
+
end
|
18
|
+
|
19
|
+
subviews_added << new_view
|
20
|
+
selected_view.addSubview(new_view)
|
21
|
+
|
22
|
+
if self.stylesheet
|
23
|
+
apply_style_to_view(new_view, style) if style
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
RMQ.create_with_array_and_selectors(subviews_added, selectors, @context)
|
28
|
+
end
|
29
|
+
alias :add_subview :append
|
30
|
+
|
31
|
+
def insert(view, at_index, style = nil)
|
32
|
+
# TODO
|
33
|
+
end
|
34
|
+
|
35
|
+
protected
|
36
|
+
|
37
|
+
def create_view(klass)
|
38
|
+
if klass == UIButton
|
39
|
+
klass.buttonWithType(UIButtonTypeCustom).tap do |o|
|
40
|
+
o.hidden = false
|
41
|
+
o.opaque = true
|
42
|
+
end
|
43
|
+
else
|
44
|
+
klass.alloc.initWithFrame(CGRectZero).tap do |o|
|
45
|
+
o.hidden = false
|
46
|
+
o.opaque = true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|