geomotion 0.0.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.
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ .repl_history
2
+ build
3
+ resources/*.nib
4
+ resources/*.momd
5
+ resources/*.storyboardc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in Routable.gemspec
4
+ gemspec
data/Geomotion.gemspec ADDED
@@ -0,0 +1,18 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/geomotion/version', __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "geomotion"
6
+ s.version = Geomotion::VERSION
7
+ s.authors = ["Clay Allsopp"]
8
+ s.email = ["clay.allsopp@gmail.com"]
9
+ s.homepage = "https://github.com/clayallsopp/geomotion"
10
+ s.summary = "A RubyMotion Geometry Wrapper"
11
+ s.description = "A RubyMotion Geometry Wrapper"
12
+
13
+ s.files = `git ls-files`.split($\)
14
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
15
+ s.require_paths = ["lib"]
16
+
17
+ s.add_development_dependency 'rake'
18
+ end
data/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # Geomotion
2
+
3
+ iOS geometry is too verbose for Ruby. Geomotion tries to fix that.
4
+
5
+ ## Usage
6
+
7
+ ```ruby
8
+ # More idiomatic initializer
9
+ rect = CGRect.make(x: 10, y: 100, width: 50, height: 20)
10
+
11
+ # These do what you think
12
+ [rect.x, rect.y, rect.width, rect.height]
13
+ => [10, 100, 50, 20]
14
+
15
+ # Chainable methods for adjusting frames
16
+ view = UIView.alloc.initWithFrame rect.below.width(100).height(10)
17
+ view.frame
18
+ => #<CGRect origin=#<CGPoint x=10.0 y=120.0> size=#<CGSize width=100.0 height=10.0>>
19
+
20
+ view2 = UIView.alloc.initWithFrame rect.beside(10)
21
+ view2.frame
22
+ => #<CGRect origin=#<CGPoint x=70.0 y=100.0> size=#<CGSize width=50.0 height=20.0>>
23
+
24
+ [rect.right(20).x, rect.left(20).x, rect.up(20).y, rect.down(20).y]
25
+ => [30, -10, 80, 120]
26
+
27
+ # Layout a rect relative to others
28
+ rect2 = CGRect.new [50, 50], [100, 100]
29
+ rect3 = CGRect.new [100, 200], [20, 20]
30
+
31
+ CGRect.layout(rect, above: rect2, right_of: rect3)
32
+ => #<CGRect origin=#<CGPoint x=120.0 y=30.0> size=#<CGSize width=50.0 height=20.0>>
33
+
34
+ # Also supports margins
35
+ CGRect.layout(rect, above: rect2, right_of: rect3, margins: [0, 0, 10, 15])
36
+ => #<CGRect origin=#<CGPoint x=135.0 y=20.0> size=#<CGSize width=50.0 height=20.0>>
37
+ ```
38
+
39
+ ## Install
40
+
41
+ 1. `gem install geomotion`
42
+
43
+ 2. Add `require geomotion` in your `Rakefile`.
44
+
45
+
46
+ ## Forking
47
+
48
+ If you have cool/better ideas, pull-request away!
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ $:.unshift("/Library/RubyMotion/lib")
2
+ require 'motion/project'
3
+ require "bundler/gem_tasks"
4
+
5
+ $:.unshift("./lib/")
6
+ require './lib/geomotion'
7
+
8
+ Motion::Project::App.setup do |app|
9
+ # Use `rake config' to see complete project settings.
10
+ app.name = 'Geomotion'
11
+ end
@@ -0,0 +1,5 @@
1
+ class AppDelegate
2
+ def application(application, didFinishLaunchingWithOptions:launchOptions)
3
+ true
4
+ end
5
+ end
data/lib/geomotion.rb ADDED
@@ -0,0 +1,11 @@
1
+ require "geomotion/version"
2
+
3
+ unless defined?(Motion::Project::Config)
4
+ raise "This file must be required within a RubyMotion project Rakefile."
5
+ end
6
+
7
+ Motion::Project::App.setup do |app|
8
+ Dir.glob(File.join(File.dirname(__FILE__), 'geomotion/*.rb')).each do |file|
9
+ app.files.unshift(file)
10
+ end
11
+ end
@@ -0,0 +1,118 @@
1
+ class CGRect
2
+ # CGRect.make(x: 10, y: 30)
3
+ def self.make(options = {})
4
+ CGRect.new([options[:x] || 0, options[:y] || 0], [options[:width] || 0, options[:height] || 0])
5
+ end
6
+
7
+ # OPTIONS: [:above, :below, :left_of, :right_of, :margins]
8
+ # :margins is array of [top, right, bottom, left]
9
+ # EX CGRect.layout(rect1, above: rect2, left_of: rect3, margins: [0, 10, 20, 0])
10
+ def self.layout(rect1, options)
11
+ if options.empty?
12
+ p "No options provided in CGRect.layout"
13
+ return rect1
14
+ end
15
+
16
+ rect = CGRect.new
17
+ rect.size = rect1.size
18
+
19
+ options[:margins] ||= []
20
+ margins = {}
21
+ [:top, :right, :bottom, :left].each_with_index do |margin, index|
22
+ margins[margin] = options[:margins][index] || 0
23
+ end
24
+
25
+ rect.y = options[:above].up(rect.height + margins[:bottom]).y if options[:above]
26
+ rect.y = options[:below].below(margins[:top]).y if options[:below]
27
+
28
+ rect.x = options[:left_of].left(rect.width + margins[:right]).x if options[:left_of]
29
+ rect.x = options[:right_of].beside(margins[:left]).x if options[:right_of]
30
+
31
+ rect
32
+ end
33
+
34
+ def x(setter = nil)
35
+ if setter
36
+ return CGRect.new([setter, self.y], self.size)
37
+ end
38
+ self.origin.x
39
+ end
40
+
41
+ def x=(_x)
42
+ self.origin.x = _x
43
+ end
44
+
45
+ def y(setter = nil)
46
+ if setter
47
+ return CGRect.new([self.x, setter], self.size)
48
+ end
49
+ self.origin.y
50
+ end
51
+
52
+ def y=(_y)
53
+ self.origin.y = _y
54
+ end
55
+
56
+ def width(setter = nil)
57
+ if setter
58
+ return CGRect.new(self.origin, [setter, self.height])
59
+ end
60
+ self.size.width
61
+ end
62
+
63
+ def width=(_width)
64
+ self.size.width = _width
65
+ end
66
+
67
+ def height(setter = nil)
68
+ if setter
69
+ return CGRect.new(self.origin, [self.width, setter])
70
+ end
71
+ self.size.height
72
+ end
73
+
74
+ def height=(_height)
75
+ self.size.height = _height
76
+ end
77
+
78
+ def left(dist = 0)
79
+ CGRect.new([self.x - dist, self.y], self.size)
80
+ end
81
+
82
+ def right(dist = 0)
83
+ CGRect.new([self.x + dist, self.y], self.size)
84
+ end
85
+
86
+ def up(dist = 0)
87
+ CGRect.new([self.x, self.y - dist], self.size)
88
+ end
89
+
90
+ def down(dist = 0)
91
+ CGRect.new([self.x, self.y + dist], self.size)
92
+ end
93
+
94
+ def below(margin = 0)
95
+ CGRect.new([self.x, self.y + self.height + margin], self.size)
96
+ end
97
+
98
+ def beside(margin = 0)
99
+ CGRect.new([self.x + self.width + margin, self.y], self.size)
100
+ end
101
+
102
+ def center(relative = false)
103
+ offset_x = relative ? self.x : 0
104
+ offset_y = relative ? self.y : 0
105
+ CGPoint.new(offset_x + self.width / 2, offset_y = self.height / 2)
106
+ end
107
+
108
+ def round
109
+ CGRect.new([self.x.round, self.y.round], [self.width.round, self.height.round])
110
+ end
111
+
112
+ def centered_in(rect, relative = false)
113
+ offset_x = relative ? rect.x : 0
114
+ offset_y = relative ? rect.y : 0
115
+ CGRect.new([offset_x + ((rect.width - self.width) / 2),
116
+ offset_y + ((rect.height - self.height) / 2)], self.size)
117
+ end
118
+ end
@@ -0,0 +1,3 @@
1
+ module Geomotion
2
+ VERSION = "0.0.1"
3
+ end
data/spec/main_spec.rb ADDED
@@ -0,0 +1,36 @@
1
+ describe "CGRect" do
2
+ before do
3
+ @rect = CGRect.make(x: 10, y: 100, width: 50, height: 20)
4
+ end
5
+
6
+ it ".x, etc work" do
7
+ [@rect.x, @rect.y, @rect.width, @rect.height].should == [10, 100, 50, 20]
8
+ end
9
+
10
+ it "chaining works" do
11
+ rect = @rect.below(10).width(100).height(10)
12
+ [rect.x, rect.y, rect.width, rect.height].should == [10, 130, 100, 10]
13
+
14
+ [@rect.right(20).x, @rect.left(20).x, @rect.up(20).y, @rect.down(20).y].should == [30, -10, 80, 120]
15
+ end
16
+
17
+ it ".beside works" do
18
+ rect = @rect.beside(10)
19
+ [rect.x, rect.y, rect.width, rect.height].should == [70, 100, 50, 20]
20
+ end
21
+
22
+ it ".below works" do
23
+ @rect.below(10).y.should == 130
24
+ end
25
+
26
+ it "layout works" do
27
+ rect2 = CGRect.new [50, 50], [100, 100]
28
+ rect3 = CGRect.new [100, 200], [20, 20]
29
+
30
+ no_margins = CGRect.layout(@rect, above: rect2, right_of: rect3)
31
+ [no_margins.x, no_margins.y, no_margins.width, no_margins.height].should == [120, 30, 50, 20]
32
+
33
+ margins = CGRect.layout(@rect, above: rect2, right_of: rect3, margins: [0, 0, 10, 15])
34
+ [margins.x, margins.y, margins.width, margins.height].should == [135, 20, 50, 20]
35
+ end
36
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: geomotion
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Clay Allsopp
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ description: A RubyMotion Geometry Wrapper
31
+ email:
32
+ - clay.allsopp@gmail.com
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - .gitignore
38
+ - Gemfile
39
+ - Geomotion.gemspec
40
+ - README.md
41
+ - Rakefile
42
+ - app/app_delegate.rb
43
+ - lib/geomotion.rb
44
+ - lib/geomotion/cg_rect.rb
45
+ - lib/geomotion/version.rb
46
+ - spec/main_spec.rb
47
+ homepage: https://github.com/clayallsopp/geomotion
48
+ licenses: []
49
+ post_install_message:
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubyforge_project:
67
+ rubygems_version: 1.8.23
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: A RubyMotion Geometry Wrapper
71
+ test_files:
72
+ - spec/main_spec.rb