purplish-layout 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 71e95201b9da629250ed3a65d578f119b9cbafe9
4
+ data.tar.gz: c15def4fd40a8016509cfc919b79a948a5a295c5
5
+ SHA512:
6
+ metadata.gz: c31fc8b5ceee87292c9e509cd3ae5d84bbabfbd15e7208cd575e4d0076d0380ef2bef0d1b83dae52063db658ad20e04a018a715f9ae1baf50f008f0eb161205d
7
+ data.tar.gz: 300ecb78c82e7a0dfcaee0aa2917000a0e9d6e28400736352811b7ee92ce9d92cfb03de6bb3e80dc8d7aa7ad748600fd86ad029ac58dd50ef26c13818219f85f
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ .rake_tasks~
2
+ pkg/*
3
+ build/
4
+ .DS_Store
5
+ .repl_history
6
+ 0
data/LICENSE ADDED
@@ -0,0 +1,10 @@
1
+ Copyright (c) 2014, Hwee-Boon Yar
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
5
+
6
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7
+
8
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
9
+
10
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,77 @@
1
+ #purplish\_layout – a [RubyMotion](http://rubymotion.com) wrapper for Auto Layout on iOS and OS X
2
+
3
+ About
4
+ ---
5
+ Ruby lends itself to creating a nice DSL for Auto Layout, so why not? I have been using this for both iOS and OS X apps since mid-2014.
6
+
7
+ Usage
8
+ ---
9
+ Use it with visual format strings:
10
+
11
+ ```ruby
12
+ ['celf', inner_view, 'l', post_count_label].constraints do |celf, l, _|
13
+ celf.h '|[l]|'
14
+ celf.v '|-m-[l]-m-|', {'m' => 7}
15
+ end
16
+ ```
17
+
18
+ You can also create constraint objects yourself. This is equivalent to the previous example:
19
+
20
+ ```ruby
21
+ ['celf', inner_view, 'l', post_count_label].constraints do |celf, l, _|
22
+ celf.left = l.left
23
+ celf.right = l.right
24
+ l.top = celf.top + 7
25
+ l.bottom = celf.bottom - 7
26
+ end
27
+ ```
28
+
29
+ Send `#constraints` with a block to an array with an even number of elements. They should be pairs – the name (a `String`) to be used in the format strings in the block, followed by the view it represents.
30
+
31
+ If there are n views involved, there should be n*2 elements in the array. The block takes n+1 arguments, and the last object is the dictionary mapping generated from the array (usually unused) and the rest of the elements are constraint proxy objects representing each view, in the order specified in the array.
32
+
33
+ To avoid confusion, it's best to keep the variable names in the block the same as the string names in the array. This syntax can be improved when Proc#parameters is available.
34
+
35
+ With the exception of the first view listed in the array, `translatesAutoresizingMaskIntoConstraints` is automatically set to `false` for every view, so you'll want to specify the outermost view as the first pair.
36
+
37
+ A multipler can be supplied:
38
+
39
+ ```ruby
40
+ l.width = celf.width * 0.5
41
+ ```
42
+
43
+ The attributes are available as `:left`, `:right`, `:top`, `:bottom`, `:leading`, `:trailing`, `:width`, `:height`, `:center_x`, `:center_y` and `:baseline`.
44
+
45
+ You can mix the 2 creation methods:
46
+
47
+ ```ruby
48
+ ['celf', inner_view, 'l', post_count_label].constraints do |celf, l, _|
49
+ celf.left = l.left
50
+ celf.right = l.right
51
+ celf.v '|-m-[l]-m-|', {'m' => 7}
52
+ end
53
+ ```
54
+
55
+ There are 2 attributes in the constraint proxies that you would occasionally find useful:
56
+
57
+ * `last_constraint` returns the last `NSLayoutConstraint` created. It's useful if you want to hold on to a `NSLayoutConstraint` and modify it in an animation.
58
+ * `next_priority` sets the priority for the next `NSLayoutConstraint` you create.
59
+
60
+ Installation
61
+ ---
62
+ 1. Add this to your `Gemfile`: `gem 'purplish-layout'`
63
+ 2. Run `bundle install`
64
+
65
+ Dependencies
66
+ ---
67
+ * [weak\_attr\_accessor](https://github.com/hboon/weak_attr_accessor)
68
+
69
+ License
70
+ ---
71
+ BSD. See LICENSE file.
72
+
73
+ Questions
74
+ ---
75
+ * Email: [hboon@motionobj.com](mailto:hboon@motionobj.com)
76
+ * Web: [http://hboon.com/purplish-layout](http://hboon.com/purplish-layout)
77
+ * Twitter: [http://twitter.com/hboon](http://twitter.com/hboon)
@@ -0,0 +1,11 @@
1
+ unless defined?(Motion::Project::Config)
2
+ raise "This file must be required within a RubyMotion project Rakefile."
3
+ end
4
+
5
+ Motion::Project::App.setup do |app|
6
+ Dir.glob(File.join(File.dirname(__FILE__), 'purplish-layout/**/*.rb')).each do |file|
7
+ app.files.unshift(file)
8
+ end
9
+ end
10
+
11
+ require 'weak_attr_accessor'
@@ -0,0 +1,31 @@
1
+ module CanBeConstrained
2
+ def constraint
3
+ #Don't bother storing it, and most importantly, don't reuse it because things like multipler and constant must always be reset
4
+ PurplishLayout::ConstraintProxy.new(self)
5
+ end
6
+
7
+ def constrained_views(*views, &block)
8
+ block.call(*(views.map {|e| e.constraint}))
9
+ end
10
+
11
+ def common_superview(v)
12
+ if v.superview == self
13
+ self
14
+ elsif superview == v
15
+ v
16
+ else
17
+ (superviews & v.superviews)[0]
18
+ end
19
+ end
20
+
21
+ def superviews
22
+ v = self
23
+ result = []
24
+ loop do
25
+ v = v.superview
26
+ break unless v
27
+ result << v
28
+ end
29
+ result
30
+ end
31
+ end
@@ -0,0 +1,16 @@
1
+ class NSArray
2
+ def constraints(&block)
3
+ mapping = Hash[*self]
4
+ view_constraint_proxies = each_slice(2).to_a.transpose[1].map do |e|
5
+ if e.nil?
6
+ c = nil
7
+ else
8
+ e.translatesAutoresizingMaskIntoConstraints = false if e != self[1]
9
+ c = e.constraint
10
+ c.views_mapping = mapping
11
+ end
12
+ c
13
+ end
14
+ block.call(*(view_constraint_proxies + [mapping]))
15
+ end
16
+ end
@@ -0,0 +1,27 @@
1
+ class NSLayoutConstraint
2
+ def inspect
3
+ s = super
4
+ op = case relation
5
+ when NSLayoutRelationEqual
6
+ '=='
7
+ when NSLayoutRelationLessThanOrEqual
8
+ '<='
9
+ when NSLayoutRelationGreaterThanOrEqual
10
+ '>='
11
+ end
12
+ if secondAttribute == NSLayoutAttributeNotAnAttribute
13
+ "#{s} #{firstItem}.#{firstAttribute.to_layout_attribute} #{op} #{constant}"
14
+ else
15
+ if constant == 0
16
+ const_s = ''
17
+ else
18
+ const_s = " + #{constant}"
19
+ end
20
+ if multiplier == 1
21
+ "#{s} #{firstItem}.#{firstAttribute.to_layout_attribute} #{op} #{secondItem}.#{secondAttribute.to_layout_attribute}#{const_s}"
22
+ else
23
+ "#{s} #{firstItem}.#{firstAttribute.to_layout_attribute} #{op} #{secondItem}.#{secondAttribute.to_layout_attribute} * #{multiplier}#{const_s}"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,28 @@
1
+ class NSNumber
2
+ def to_layout_attribute
3
+ case self
4
+ when NSLayoutAttributeLeft
5
+ 'left'
6
+ when NSLayoutAttributeRight
7
+ 'right'
8
+ when NSLayoutAttributeTop
9
+ 'top'
10
+ when NSLayoutAttributeBottom
11
+ 'bottom'
12
+ when NSLayoutAttributeLeading
13
+ 'leading'
14
+ when NSLayoutAttributeTrailing
15
+ 'trailing'
16
+ when NSLayoutAttributeWidth
17
+ 'width'
18
+ when NSLayoutAttributeHeight
19
+ 'height'
20
+ when NSLayoutAttributeCenterX
21
+ 'center_x'
22
+ when NSLayoutAttributeCenterY
23
+ 'center_y'
24
+ when NSLayoutAttributeBaseline
25
+ 'baseline'
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,135 @@
1
+ module PurplishLayout
2
+ class ConstraintProxy
3
+ weak_attr_accessor :view
4
+ weak_attr_accessor :views_mapping
5
+ attr_accessor :attribute, :multiplier, :constant
6
+ attr_accessor :last_constraint
7
+ attr_accessor :next_priority
8
+
9
+ def initialize(view, attribute=nil, multiplier=1, constant=0)
10
+ @view = view
11
+ @attribute = attribute
12
+ @multiplier = multiplier
13
+ @constant = constant
14
+ end
15
+
16
+ def *(aNumber)
17
+ ConstraintProxy.new(view, attribute, aNumber, constant)
18
+ end
19
+
20
+ def +(aNumber)
21
+ ConstraintProxy.new(view, attribute, multiplier, aNumber)
22
+ end
23
+
24
+ def -(aNumber)
25
+ ConstraintProxy.new(view, attribute, multiplier, -aNumber)
26
+ end
27
+
28
+ def next_priority=(v)
29
+ @next_priority = v
30
+ end
31
+
32
+ def create_constraint_with_rhs(rhs)
33
+ if rhs.kind_of? self.class
34
+ owner = rhs.view.common_superview(view)
35
+ c = NSLayoutConstraint.constraintWithItem(view, attribute:attribute.to_layout_attribute, relatedBy:@operator, toItem:rhs.view, attribute:rhs.attribute.to_layout_attribute, multiplier:rhs.multiplier, constant:rhs.constant)
36
+ if next_priority
37
+ c.priority = next_priority
38
+ self.next_priority = nil
39
+ end
40
+ #puts "addConstraint: #{c.inspect}"
41
+ owner.addConstraint(c)
42
+ c
43
+ else
44
+ c = NSLayoutConstraint.constraintWithItem(view, attribute:attribute.to_layout_attribute, relatedBy:@operator, toItem:nil, attribute:NSLayoutAttributeNotAnAttribute, multiplier:0, constant:rhs)
45
+ if next_priority
46
+ c.priority = next_priority
47
+ self.next_priority = nil
48
+ end
49
+ #puts "addConstraint: #{c.inspect}"
50
+ view.superview.addConstraint(c)
51
+ c
52
+ end
53
+ end
54
+
55
+ def h(s, metrics=nil, options=0, views=nil)
56
+ if (s.start_with? 'H:') || (s.start_with? 'V:')
57
+ layout(s, metrics, options, views)
58
+ else
59
+ layout("H:#{s}", metrics, options, views)
60
+ end
61
+ end
62
+
63
+ def v(s, metrics=nil, options=0, views=nil)
64
+ if (s.start_with? 'H:') || (s.start_with? 'V:')
65
+ layout(s, metrics, options, views)
66
+ else
67
+ layout("V:#{s}", metrics, options, views)
68
+ end
69
+ end
70
+
71
+ def layout(s, metrics=nil, options=0, views=nil)
72
+ views ||= views_mapping
73
+ #Workaround, must wrap views with NSDictionary, otherwise doesn't work for RubyMotion
74
+ c = NSLayoutConstraint.constraintsWithVisualFormat(s, options:options, metrics:metrics, views:NSDictionary.dictionaryWithDictionary(views))
75
+ self.last_constraint = c
76
+ if next_priority
77
+ c.each {|e|e.priority = next_priority}
78
+ self.next_priority = nil
79
+ end
80
+ #puts "addConstraints:"
81
+ #c.each {|e| puts " #{e.inspect}"}
82
+ view.addConstraints(c)
83
+ end
84
+
85
+ ##Attributes
86
+
87
+ def attr
88
+ @attribute = __method__
89
+ self
90
+ end
91
+
92
+ def attr=(rhs)
93
+ #Derive reader name from writer
94
+ @attribute = __method__[0..-3].to_sym
95
+ @operator = NSLayoutRelationEqual
96
+ self.last_constraint = create_constraint_with_rhs(rhs)
97
+ self
98
+ end
99
+
100
+ def <=(rhs)
101
+ @operator = NSLayoutRelationLessThanOrEqual
102
+ create_constraint_with_rhs(rhs)
103
+ self
104
+ end
105
+
106
+ def >=(rhs)
107
+ @operator = NSLayoutRelationGreaterThanOrEqual
108
+ create_constraint_with_rhs(rhs)
109
+ self
110
+ end
111
+
112
+ alias :left :attr
113
+ alias :left= :attr=
114
+ alias :right :attr
115
+ alias :right= :attr=
116
+ alias :top :attr
117
+ alias :top= :attr=
118
+ alias :bottom :attr
119
+ alias :bottom= :attr=
120
+ alias :leading :attr
121
+ alias :leading= :attr=
122
+ alias :trailing :attr
123
+ alias :trailing= :attr=
124
+ alias :width :attr
125
+ alias :width= :attr=
126
+ alias :height :attr
127
+ alias :height= :attr=
128
+ alias :center_x :attr
129
+ alias :center_x= :attr=
130
+ alias :center_y :attr
131
+ alias :center_y= :attr=
132
+ alias :baseline :attr
133
+ alias :baseline= :attr=
134
+ end
135
+ end
@@ -0,0 +1,28 @@
1
+ class Symbol
2
+ def to_layout_attribute
3
+ case self
4
+ when :left
5
+ NSLayoutAttributeLeft
6
+ when :right
7
+ NSLayoutAttributeRight
8
+ when :top
9
+ NSLayoutAttributeTop
10
+ when :bottom
11
+ NSLayoutAttributeBottom
12
+ when :leading
13
+ NSLayoutAttributeLeading
14
+ when :trailing
15
+ NSLayoutAttributeTrailing
16
+ when :width
17
+ NSLayoutAttributeWidth
18
+ when :height
19
+ NSLayoutAttributeHeight
20
+ when :center_x
21
+ NSLayoutAttributeCenterX
22
+ when :center_y
23
+ NSLayoutAttributeCenterY
24
+ when :baseline
25
+ NSLayoutAttributeBaseline
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,3 @@
1
+ module PurplishLayout
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,7 @@
1
+ class NSView
2
+ include CanBeConstrained
3
+ end
4
+
5
+ class UIView
6
+ include CanBeConstrained
7
+ end
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/purplish-layout/version.rb', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = 'purplish-layout'
6
+ gem.version = PurplishLayout::VERSION
7
+ gem.licenses = ['BSD']
8
+
9
+ gem.authors = ['Hwee-Boon Yar']
10
+
11
+ gem.description = 'A RubyMotion wrapper for Auto Layout on iOS and OS X'
12
+ gem.summary = 'A RubyMotion wrapper for Auto Layout on iOS and OS X'
13
+ gem.homepage = 'http://hboon.com/purplish-layout/'
14
+ gem.email = 'hboon@motionobj.com'
15
+
16
+ gem.add_dependency "weak_attr_accessor", "~> 0.0.2"
17
+ gem.files = `git ls-files`.split($\)
18
+ gem.require_paths = ['lib']
19
+ #gem.test_files = gem.files.grep(%r{^spec/})
20
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: purplish-layout
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Hwee-Boon Yar
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: weak_attr_accessor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.2
27
+ description: A RubyMotion wrapper for Auto Layout on iOS and OS X
28
+ email: hboon@motionobj.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - ".gitignore"
34
+ - LICENSE
35
+ - README.md
36
+ - lib/purplish-layout.rb
37
+ - lib/purplish-layout/can_be_constrained.rb
38
+ - lib/purplish-layout/ns_array.rb
39
+ - lib/purplish-layout/ns_layout_constraint.rb
40
+ - lib/purplish-layout/ns_number.rb
41
+ - lib/purplish-layout/purplish-layout.rb
42
+ - lib/purplish-layout/symbol.rb
43
+ - lib/purplish-layout/version.rb
44
+ - lib/purplish-layout/view.rb
45
+ - purplish-layout.gemspec
46
+ homepage: http://hboon.com/purplish-layout/
47
+ licenses:
48
+ - BSD
49
+ metadata: {}
50
+ post_install_message:
51
+ rdoc_options: []
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ requirements: []
65
+ rubyforge_project:
66
+ rubygems_version: 2.4.2
67
+ signing_key:
68
+ specification_version: 4
69
+ summary: A RubyMotion wrapper for Auto Layout on iOS and OS X
70
+ test_files: []