ruby_motion_query 0.1.1 → 0.2.0
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 +8 -8
- data/README.md +28 -23
- data/motion/ruby_motion_query/actions.rb +21 -0
- data/motion/ruby_motion_query/animations.rb +11 -0
- data/motion/ruby_motion_query/app.rb +13 -10
- data/motion/ruby_motion_query/base.rb +118 -34
- data/motion/ruby_motion_query/color.rb +54 -0
- data/motion/ruby_motion_query/data.rb +9 -0
- data/motion/ruby_motion_query/device.rb +7 -0
- data/motion/ruby_motion_query/enumerablish.rb +15 -0
- data/motion/ruby_motion_query/events.rb +2 -0
- data/motion/ruby_motion_query/factory.rb +4 -0
- data/motion/ruby_motion_query/font.rb +33 -14
- data/motion/ruby_motion_query/format.rb +3 -0
- data/motion/ruby_motion_query/image.rb +9 -1
- data/motion/ruby_motion_query/position.rb +2 -6
- data/motion/ruby_motion_query/selectors.rb +9 -0
- data/motion/ruby_motion_query/stylesheet.rb +8 -1
- data/motion/ruby_motion_query/subviews.rb +20 -5
- data/motion/ruby_motion_query/tags.rb +1 -0
- data/motion/ruby_motion_query/traverse.rb +118 -10
- data/motion/ruby_motion_query/utils.rb +7 -3
- metadata +32 -3
@@ -1,14 +1,45 @@
|
|
1
1
|
module RubyMotionQuery
|
2
2
|
class RMQ
|
3
|
+
# @return [Color]
|
3
4
|
def self.color
|
4
5
|
Color
|
5
6
|
end
|
6
7
|
|
8
|
+
# @return [Color]
|
7
9
|
def color
|
8
10
|
Color
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
14
|
+
# @example
|
15
|
+
# # Standard colors:
|
16
|
+
#
|
17
|
+
# # In a stylesheet, you can just use color. Anywhere else these would be
|
18
|
+
# # rmq.color.clear, etc
|
19
|
+
#
|
20
|
+
# color.clear
|
21
|
+
# color.white
|
22
|
+
# color.light_gray
|
23
|
+
# color.gray
|
24
|
+
# color.dark_gray
|
25
|
+
# color.black
|
26
|
+
#
|
27
|
+
# color.red
|
28
|
+
# color.green
|
29
|
+
# color.blue
|
30
|
+
# color.yellow
|
31
|
+
# color.orange
|
32
|
+
# color.purple
|
33
|
+
# color.brown
|
34
|
+
# color.cyan
|
35
|
+
# color.magenta
|
36
|
+
#
|
37
|
+
# color.table_view
|
38
|
+
# color.scroll_view
|
39
|
+
# color.flipside
|
40
|
+
# color.under_page
|
41
|
+
# color.light_text
|
42
|
+
# color.dark_text
|
12
43
|
class Color < UIColor
|
13
44
|
|
14
45
|
class << self
|
@@ -36,6 +67,13 @@ module RubyMotionQuery
|
|
36
67
|
alias :light_text :lightTextColor
|
37
68
|
alias :dark_text :darkTextColor
|
38
69
|
|
70
|
+
# Add your own standard color
|
71
|
+
#
|
72
|
+
# @return [UIColor]
|
73
|
+
#
|
74
|
+
# @example
|
75
|
+
# rmq.color.add_named(:foo, '#ffffff')
|
76
|
+
# my_label.color = rmq.color.foo # or just color.foo in a stylesheet
|
39
77
|
def add_named(key, hex_or_color)
|
40
78
|
color = if hex_or_color.is_a?(String)
|
41
79
|
Color.from_hex(hex_or_color)
|
@@ -48,7 +86,15 @@ module RubyMotionQuery
|
|
48
86
|
end
|
49
87
|
end
|
50
88
|
|
89
|
+
# Creates a color from a hex triplet
|
90
|
+
#
|
51
91
|
# Thanks bubblewrap for this method
|
92
|
+
#
|
93
|
+
# @param hex with or without the #
|
94
|
+
# @return [UIColor]
|
95
|
+
# @example
|
96
|
+
# color.from_hex('#ffffff')
|
97
|
+
# color.from_hex('ffffff')
|
52
98
|
def from_hex(hex_color)
|
53
99
|
hex_color.gsub!("#", "")
|
54
100
|
case hex_color.size
|
@@ -66,10 +112,18 @@ module RubyMotionQuery
|
|
66
112
|
end
|
67
113
|
end
|
68
114
|
|
115
|
+
# @return [UIColor]
|
116
|
+
#
|
117
|
+
# @example
|
118
|
+
# rmq.color.from_rgba(255,255,255,0.5)
|
69
119
|
def from_rgba(r,g,b,a)
|
70
120
|
UIColor.colorWithRed((r/255.0), green: (g/255.0), blue: (b/255.0), alpha: a)
|
71
121
|
end
|
72
122
|
|
123
|
+
# @return [UIColor]
|
124
|
+
#
|
125
|
+
# @example
|
126
|
+
# rmq.color.from_hsva(100,140,80,1.0)
|
73
127
|
def from_hsva(h,s,v,a)
|
74
128
|
UIColor.alloc.initWithHue(h, saturation: s, brightness: v, alpha: a)
|
75
129
|
end
|
@@ -2,14 +2,19 @@ module RubyMotionQuery
|
|
2
2
|
class ViewData
|
3
3
|
attr_accessor :events, :style_name
|
4
4
|
|
5
|
+
# @return [Hash] Array of tag names assigned to to this view
|
5
6
|
def tags
|
6
7
|
@_tags ||= {}
|
7
8
|
end
|
8
9
|
|
10
|
+
# @return [Array] Array of tag names assigned to to this view
|
9
11
|
def tag_names
|
10
12
|
tags.keys
|
11
13
|
end
|
12
14
|
|
15
|
+
# *Do not* use this, use {RMQ#tag} instead:
|
16
|
+
# @example
|
17
|
+
# rmq(my_view).tag(:foo)
|
13
18
|
def tag(*tag_or_tags)
|
14
19
|
tag_or_tags.flatten!
|
15
20
|
tag_or_tags.each do |tag_name|
|
@@ -17,6 +22,10 @@ module RubyMotionQuery
|
|
17
22
|
end
|
18
23
|
end
|
19
24
|
|
25
|
+
# Check if this view contains a specific tag
|
26
|
+
#
|
27
|
+
# @param tag_name name of tag to check
|
28
|
+
# @return [Boolean] true if this view has the tag provided
|
20
29
|
def has_tag?(tag_name = nil)
|
21
30
|
if tag_name
|
22
31
|
tags.include?(tag_name)
|
@@ -1,8 +1,11 @@
|
|
1
1
|
module RubyMotionQuery
|
2
2
|
class RMQ
|
3
|
+
# @return [Device]
|
3
4
|
def device
|
4
5
|
Device
|
5
6
|
end
|
7
|
+
|
8
|
+
# @return [Device]
|
6
9
|
def self.device
|
7
10
|
Device
|
8
11
|
end
|
@@ -10,14 +13,17 @@ module RubyMotionQuery
|
|
10
13
|
|
11
14
|
class Device
|
12
15
|
class << self
|
16
|
+
# @return [UIScreen]
|
13
17
|
def screen
|
14
18
|
UIScreen.mainScreen
|
15
19
|
end
|
16
20
|
|
21
|
+
# @return [Numeric]
|
17
22
|
def width
|
18
23
|
@_width ||= Device.screen.bounds.size.width
|
19
24
|
end
|
20
25
|
|
26
|
+
# @return [Numeric]
|
21
27
|
def height
|
22
28
|
@_height ||= Device.screen.bounds.size.height
|
23
29
|
end
|
@@ -46,6 +52,7 @@ module RubyMotionQuery
|
|
46
52
|
@_retina
|
47
53
|
end
|
48
54
|
|
55
|
+
# @return :unknown or from ORIENTATIONS
|
49
56
|
def orientation
|
50
57
|
ORIENTATIONS[UIDevice.currentDevice.orientation] || :unknown
|
51
58
|
end
|
@@ -3,11 +3,15 @@ module RubyMotionQuery
|
|
3
3
|
# I'm purposly not including Enumerable,
|
4
4
|
# please use to_a if you want one
|
5
5
|
|
6
|
+
|
7
|
+
# @return [RMQ]
|
6
8
|
def <<(value)
|
7
9
|
selected << value if value.is_a?(UIView)
|
8
10
|
self
|
9
11
|
end
|
10
12
|
|
13
|
+
# @return [RMQ]
|
14
|
+
#
|
11
15
|
# @example
|
12
16
|
# rmq(UILabel)[3]
|
13
17
|
# or
|
@@ -17,54 +21,65 @@ module RubyMotionQuery
|
|
17
21
|
end
|
18
22
|
alias :eq :[]
|
19
23
|
|
24
|
+
# @return [RMQ]
|
20
25
|
def each(&block)
|
21
26
|
return self unless block
|
22
27
|
RMQ.create_with_array_and_selectors(selected.each(&block), @selectors, @context)
|
23
28
|
end
|
24
29
|
|
30
|
+
# @return [RMQ]
|
25
31
|
def map(&block)
|
26
32
|
return self unless block
|
27
33
|
RMQ.create_with_array_and_selectors(selected.map(&block), @selectors, @context)
|
28
34
|
end
|
29
35
|
alias :collect :map
|
30
36
|
|
37
|
+
# @return [RMQ]
|
31
38
|
def select(&block)
|
32
39
|
return self unless block
|
33
40
|
RMQ.create_with_array_and_selectors(selected.select(&block), @selectors, @context)
|
34
41
|
end
|
35
42
|
|
43
|
+
# @return [RMQ]
|
36
44
|
def detect(&block) # Unlike enumerable, detect and find are not the same. See find in transverse
|
37
45
|
return self unless block
|
38
46
|
RMQ.create_with_array_and_selectors(selected.select(&block), @selectors, @context)
|
39
47
|
end
|
40
48
|
|
49
|
+
# @return [RMQ]
|
41
50
|
def grep(&block)
|
42
51
|
return self unless block
|
43
52
|
RMQ.create_with_array_and_selectors(selected.grep(&block), @selectors, @context)
|
44
53
|
end
|
45
54
|
|
55
|
+
# @return [RMQ]
|
46
56
|
def reject(&block)
|
47
57
|
return self unless block
|
48
58
|
RMQ.create_with_array_and_selectors(selected.reject(&block), @selectors, @context)
|
49
59
|
end
|
50
60
|
|
61
|
+
# @return [RMQ]
|
51
62
|
def inject(o, &block)
|
52
63
|
return self unless block
|
53
64
|
RMQ.create_with_array_and_selectors(selected.inject(o, &block), @selectors, @context)
|
54
65
|
end
|
55
66
|
alias :reduce :inject
|
56
67
|
|
68
|
+
# @return [RMQ]
|
57
69
|
def first
|
58
70
|
RMQ.create_with_array_and_selectors([selected.first], @selectors, @context)
|
59
71
|
end
|
72
|
+
# @return [RMQ]
|
60
73
|
def last
|
61
74
|
RMQ.create_with_array_and_selectors([selected.last], @selectors, @context)
|
62
75
|
end
|
63
76
|
|
77
|
+
# @return [Array]
|
64
78
|
def to_a
|
65
79
|
selected
|
66
80
|
end
|
67
81
|
|
82
|
+
# @return [Integer] number of views selected
|
68
83
|
def length
|
69
84
|
selected.length
|
70
85
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module RubyMotionQuery
|
2
2
|
class RMQ
|
3
|
+
# @return [RMQ]
|
3
4
|
def on(event, args = {}, &block)
|
4
5
|
selected.each do |view|
|
5
6
|
events(view).on(view, event, args, &block)
|
@@ -8,6 +9,7 @@ module RubyMotionQuery
|
|
8
9
|
self
|
9
10
|
end
|
10
11
|
|
12
|
+
# @return [RMQ]
|
11
13
|
def off(*events)
|
12
14
|
selected.each do |view|
|
13
15
|
events(view).off(events)
|
@@ -2,16 +2,19 @@ module RubyMotionQuery
|
|
2
2
|
class RMQ
|
3
3
|
# TODO question, should there be a rmq pool to reuse?
|
4
4
|
|
5
|
+
# @return [RMQ]
|
5
6
|
def create_blank_rmq
|
6
7
|
RMQ.create_with_array_and_selectors([], self.selectors, @context)
|
7
8
|
end
|
8
9
|
|
10
|
+
# @return [RMQ]
|
9
11
|
def create_rmq_in_context(*selectors)
|
10
12
|
RMQ.create_with_selectors(selectors, @context)
|
11
13
|
end
|
12
14
|
|
13
15
|
class << self
|
14
16
|
|
17
|
+
# @return [RMQ]
|
15
18
|
def create_with_selectors(selectors, context)
|
16
19
|
RMQ.new.tap do |o|
|
17
20
|
o.context = context
|
@@ -19,6 +22,7 @@ module RubyMotionQuery
|
|
19
22
|
end
|
20
23
|
end
|
21
24
|
|
25
|
+
# @return [RMQ]
|
22
26
|
def create_with_array_and_selectors(array, selectors, context)
|
23
27
|
RMQ.new.tap do |o|
|
24
28
|
o.context = context
|
@@ -1,10 +1,11 @@
|
|
1
|
-
# Add custome app-wide fonts here
|
2
1
|
module RubyMotionQuery
|
3
2
|
class RMQ
|
3
|
+
# @return [Font]
|
4
4
|
def self.font
|
5
5
|
Font
|
6
6
|
end
|
7
7
|
|
8
|
+
# @return [Font]
|
8
9
|
def font
|
9
10
|
Font
|
10
11
|
end
|
@@ -12,24 +13,28 @@ module RubyMotionQuery
|
|
12
13
|
|
13
14
|
class Font
|
14
15
|
class << self
|
15
|
-
# One way to add your own fonts it to open up the Font class and add your
|
16
|
-
# own message.
|
17
|
-
#
|
18
|
-
# STANDARD_FONT = 'Helvetica Neue'
|
19
|
-
# def standard_at_size(size);
|
20
|
-
# UIFont.fontWithName(STANDARD_NAME, size: size)
|
21
|
-
# end
|
22
|
-
# def standard_large ; @standard_large ||= standard_at_size(18) ; end
|
23
|
-
# def standard_medium ; @standard_medium ||= standard_at_size(12) ; end
|
24
16
|
|
25
|
-
|
26
|
-
#
|
17
|
+
# @example
|
18
|
+
# # One way to add your own fonts it to open up the Font class and add your own
|
19
|
+
# STANDARD_FONT = 'Helvetica Neue'
|
20
|
+
# def standard_at_size(size);
|
21
|
+
# UIFont.fontWithName(STANDARD_NAME, size: size)
|
22
|
+
# end
|
23
|
+
# def standard_large ; @standard_large ||= standard_at_size(18) ; end
|
24
|
+
# def standard_medium ; @standard_medium ||= standard_at_size(12) ; end
|
25
|
+
#
|
27
26
|
#
|
28
|
-
#
|
27
|
+
# # Another way is to add named fonts:
|
29
28
|
# RubyMotionQuery::Font.add_named_font :large, STANDARD_FONT, 44
|
30
29
|
#
|
30
|
+
# # In a stylesheet you can just do
|
31
|
+
# font.add_named_font :large, STANDARD_FONT, 44
|
32
|
+
#
|
31
33
|
# # The use like so in your stylesheet:
|
32
|
-
#
|
34
|
+
# font = font.large
|
35
|
+
#
|
36
|
+
# # The use like so anywhere else:
|
37
|
+
# font = rmq.font.large
|
33
38
|
def add_named(key, font_name_or_font, size = nil)
|
34
39
|
font = if font_name_or_font.is_a?(UIFont)
|
35
40
|
font_name_or_font
|
@@ -42,20 +47,34 @@ module RubyMotionQuery
|
|
42
47
|
end
|
43
48
|
end
|
44
49
|
|
50
|
+
# @param name [String] Name of font
|
51
|
+
# @param size [Float] Size of font
|
52
|
+
# @return [UIFont]
|
53
|
+
#
|
54
|
+
# @example
|
55
|
+
# font = rmq.font.font_with_name('Helvetica Neue', 18)
|
45
56
|
def font_with_name(name, size)
|
57
|
+
# TODO, should rename this to just with_name, so it's rmq.font.with_name
|
46
58
|
UIFont.fontWithName(name, size: size)
|
47
59
|
end
|
48
60
|
alias :with_name :font_with_name
|
49
61
|
|
50
62
|
# Use this in the console to get a list of font families
|
63
|
+
# @return [Array]
|
51
64
|
def family_list
|
52
65
|
UIFont.familyNames.sort
|
53
66
|
end
|
54
67
|
|
68
|
+
# @return [Array]
|
55
69
|
def for_family(family)
|
56
70
|
UIFont.fontNamesForFamilyName(family)
|
57
71
|
end
|
58
72
|
|
73
|
+
# @param size (Float)
|
74
|
+
# @return [UIFont] System font given size
|
75
|
+
#
|
76
|
+
# @example
|
77
|
+
# font = rmq.font.system(18)
|
59
78
|
def system(size = nil)
|
60
79
|
UIFont.systemFontOfSize(size)
|
61
80
|
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
module RubyMotionQuery
|
2
2
|
class RMQ
|
3
|
+
# @return [ImageUtils]
|
3
4
|
def self.image
|
4
5
|
ImageUtils
|
5
6
|
end
|
6
7
|
|
8
|
+
# @return [ImageUtils]
|
7
9
|
def image
|
8
10
|
ImageUtils
|
9
11
|
end
|
@@ -12,10 +14,13 @@ module RubyMotionQuery
|
|
12
14
|
class ImageUtils
|
13
15
|
class << self
|
14
16
|
DEFAULT_IMAGE_EXT = 'png'
|
17
|
+
|
18
|
+
# @return [UIImage]
|
15
19
|
def resource_for_device(file_base_name, opts = {})
|
16
20
|
resource( RMQ.device.four_inch? ? "#{file_base_name}-568h" : file_base_name, opts)
|
17
21
|
end
|
18
22
|
|
23
|
+
# @return [UIImage]
|
19
24
|
def resource(file_base_name, opts = {})
|
20
25
|
ext = opts[:ext] || DEFAULT_IMAGE_EXT
|
21
26
|
cached = opts[:cached]
|
@@ -30,6 +35,7 @@ module RubyMotionQuery
|
|
30
35
|
end
|
31
36
|
end
|
32
37
|
|
38
|
+
# @return [UIImage]
|
33
39
|
def resource_resizable(file_base_name, opts)
|
34
40
|
# TODO, also alloow short syntax, t: instead of top: etc
|
35
41
|
ext = opts[:ext] || DEFAULT_IMAGE_EXT
|
@@ -37,7 +43,7 @@ module RubyMotionQuery
|
|
37
43
|
image.resizableImageWithCapInsets([opts[:top], opts[:left], opts[:bottom], opts[:right]], resizingMode: UIImageResizingModeStretch)
|
38
44
|
end
|
39
45
|
|
40
|
-
#
|
46
|
+
# Note: FROM Sugarcube, thanks Sugarcube
|
41
47
|
#
|
42
48
|
# Easily take a snapshot of a `UIView`.
|
43
49
|
#
|
@@ -53,6 +59,8 @@ module RubyMotionQuery
|
|
53
59
|
# It is guaranteed that `true` and `:all` will always have this behavior. In
|
54
60
|
# the future, if this argument becomes something that accepts multiple values,
|
55
61
|
# those two are sacred.
|
62
|
+
#
|
63
|
+
# @return [UIImage]
|
56
64
|
def from_view(view, use_content_size = false)
|
57
65
|
scale = UIScreen.mainScreen.scale
|
58
66
|
if use_content_size
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module RubyMotionQuery
|
2
2
|
class RMQ
|
3
3
|
|
4
|
+
# @return [RMQ]
|
4
5
|
def move(opts)
|
5
6
|
# TODO, add centered and from_bottom and from_top, and bottom and top
|
6
7
|
# TODO, add animate option
|
@@ -20,12 +21,7 @@ module RubyMotionQuery
|
|
20
21
|
end
|
21
22
|
alias :resize :move
|
22
23
|
|
23
|
-
|
24
|
-
# TODO
|
25
|
-
# rmq(UILabel).align(:left)
|
26
|
-
# rmq(UILabel).align(:left, :top)
|
27
|
-
end
|
28
|
-
|
24
|
+
# @return [RMQ]
|
29
25
|
def nudge(opts)
|
30
26
|
left = opts[:left] || opts[:l] || 0
|
31
27
|
right = opts[:right] || opts[:r] || 0
|