motion-pixate-layout 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- motion-pixate-layout (0.0.3)
4
+ motion-pixate-layout (0.0.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -14,6 +14,9 @@ class MyViewController < UIViewController
14
14
  pixate_layout '#my-view.fancy' do
15
15
  UILabel '#title-label.small.green', text: 'My Title'
16
16
  UIButton '#ok-button.call-to-action'
17
+ UIView '#parent' do
18
+ UILabel '#child'
19
+ end
17
20
  end
18
21
  end
19
22
  ````
@@ -29,6 +32,7 @@ This code hooks into UIViewController's `viewDidLoad` mode and:
29
32
  1. Adds a UIButton with these attributes as a subview of the controller's view:
30
33
  * styleId: 'ok-button'
31
34
  * styleClass: 'call-to-action'
35
+ 1. Adds a UIView with styleId of 'parent' to the controllers view with a child subview with styleId 'child'
32
36
 
33
37
  ## Accessing subviews
34
38
 
@@ -14,40 +14,21 @@ module MotionPixateLayout
14
14
  controller.pixate_layout
15
15
  end
16
16
 
17
- def method_missing(method_name, *args)
18
- if Kernel.constants.include?(method_name.to_sym)
19
- view_class = Kernel.const_get(method_name.to_s)
20
- raise "#{view_class.name} is not a known UIView subclass" unless view_class <= UIView
21
- return subview(view_class, *args)
22
- else
23
- raise "#{method_name} is not defined. Should be a subclass of UIView."
24
- end
25
- end
26
-
27
- def subview(subview_class, selector, attributes = {})
28
- selector = MotionPixateLayout::Selector.new(selector)
29
-
30
- subview_class.new.tap do |subview|
31
- subview.styleId = selector.style_id
32
- subview.styleClass = selector.style_classes.join(" ")
33
-
34
- attributes.each do |key, value|
35
- subview.send "#{key}=", value
36
- end
37
-
38
- view.addSubview subview
39
- end
40
- end
41
-
42
17
  def run
43
18
  apply_selector
44
19
  apply_attributes
45
20
  run_blocks controller, layout.before
46
- run_blocks self, layout.blocks
21
+ view_proxy.run_blocks
47
22
  run_blocks controller, layout.after
48
23
  controller.view.updateStyles
49
24
  end
50
25
 
26
+ def view_proxy
27
+ @view_proxy ||= ViewProxy.new(self.view).tap do |proxy|
28
+ proxy.blocks = layout.blocks
29
+ end
30
+ end
31
+
51
32
  def apply_selector
52
33
  if layout.selector
53
34
  view.styleId = layout.selector.style_id
@@ -55,15 +36,61 @@ module MotionPixateLayout
55
36
  end
56
37
  end
57
38
 
39
+ def run_blocks(context, blocks)
40
+ blocks.each { |block| context.instance_eval &block }
41
+ end
42
+
58
43
  def apply_attributes
59
44
  layout.view_attributes ||= []
60
45
  layout.view_attributes.each do |key, value|
61
46
  view.public_send "#{key}=", value
62
47
  end
63
48
  end
49
+ end
64
50
 
65
- def run_blocks(context, blocks)
66
- blocks.each { |block| context.instance_eval &block }
51
+ class ViewProxy
52
+ attr_accessor :blocks
53
+ attr_reader :view
54
+
55
+ def initialize(view)
56
+ @view = view
57
+ self.blocks = []
67
58
  end
59
+
60
+ def subview(subview_class, selector, attributes = {}, &block)
61
+ selector = MotionPixateLayout::Selector.new(selector)
62
+
63
+ subview_class.new.tap do |subview|
64
+ subview.styleId = selector.style_id
65
+ subview.styleClass = selector.style_classes.join(" ")
66
+
67
+ attributes.each do |key, value|
68
+ subview.send "#{key}=", value
69
+ end
70
+
71
+ view.addSubview subview
72
+ if block_given?
73
+ ViewProxy.new(subview).tap do |proxy|
74
+ proxy.blocks << block
75
+ proxy.run_blocks
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ def method_missing(method_name, *args, &block)
82
+ if Kernel.constants.include?(method_name.to_sym)
83
+ view_class = Kernel.const_get(method_name.to_s)
84
+ raise "#{view_class.name} is not a known UIView subclass" unless view_class <= UIView
85
+ return subview(view_class, *args, &block)
86
+ else
87
+ raise "#{method_name} is not defined. Should be a subclass of UIView."
88
+ end
89
+ end
90
+
91
+ def run_blocks
92
+ blocks.each { |block| self.instance_eval &block }
93
+ end
94
+
68
95
  end
69
96
  end
@@ -1,3 +1,3 @@
1
1
  module MotionPixateLayout
2
- Version = '0.0.4'
2
+ Version = '0.0.5'
3
3
  end
@@ -2,8 +2,8 @@
2
2
  require File.expand_path('../lib/motion-pixate-layout/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
- gem.authors = ["Joe Lind"]
6
- gem.email = ["joe@terriblelabs.com"]
5
+ gem.authors = ["Joe Lind", "Nick Pachulski"]
6
+ gem.email = ["joe@terriblelabs.com", "hello@nickpachulski.com"]
7
7
  gem.description = "A RubyMotion DSL to add subviews that are styled with Pixate"
8
8
  gem.summary = "A RubyMotion DSL to add subviews that are styled with Pixate"
9
9
  gem.homepage = 'http://github.com/terriblelabs/motion-pixate-layout'
@@ -10,7 +10,11 @@ describe "MotionPixateLayout::Layout" do
10
10
 
11
11
  pixate_layout '#view-id.view-class.view-class-2', accessibilityLabel: 'main view' do
12
12
  UILabel '#style-id.class1.class2', text: 'Test Label'
13
- UIView '#subview'
13
+ UIView '#subview' do
14
+ UILabel '#grandchild' do
15
+ UIButton '#great_grandchild'
16
+ end
17
+ end
14
18
  end
15
19
 
16
20
  after_pixate_layout do
@@ -20,6 +24,17 @@ describe "MotionPixateLayout::Layout" do
20
24
 
21
25
  tests TestViewController
22
26
 
27
+ it 'recursively adds subviews supplied in blocks' do
28
+
29
+ controller.subviews['subview'].subviews.size.should == 1
30
+ controller.subviews['subview'].subviews.first.tap do |grandchild|
31
+ grandchild.styleId.should == 'grandchild'
32
+ grandchild.should.be.kind_of UILabel
33
+ grandchild.subviews.size.should == 1
34
+ grandchild.subviews.first.styleId.should == 'great_grandchild'
35
+ end
36
+ end
37
+
23
38
  it "is added to UIViewController" do
24
39
  UIViewController.should.respond_to :pixate_layout
25
40
  end
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: motion-pixate-layout
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Joe Lind
9
+ - Nick Pachulski
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2013-06-10 00:00:00.000000000 Z
13
+ date: 2013-06-11 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: motion-pixate
@@ -62,6 +63,7 @@ dependencies:
62
63
  description: A RubyMotion DSL to add subviews that are styled with Pixate
63
64
  email:
64
65
  - joe@terriblelabs.com
66
+ - hello@nickpachulski.com
65
67
  executables: []
66
68
  extensions: []
67
69
  extra_rdoc_files: []