rubymotionr 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. data/.gitignore +2 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +5 -0
  4. data/Gemfile.lock +24 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +31 -0
  7. data/Rakefile +1 -0
  8. data/lib/rubymotionr.rb +7 -0
  9. data/lib/rubymotionr/project.rb +18 -0
  10. data/lib/rubymotionr/repo.rb +18 -0
  11. data/lib/rubymotionr/version.rb +3 -0
  12. data/rubymotionr.gemspec +19 -0
  13. data/spec/.DS_Store +0 -0
  14. data/spec/multiple-rubymotion-apps/Beers/README +5 -0
  15. data/spec/multiple-rubymotion-apps/Beers/Rakefile +8 -0
  16. data/spec/multiple-rubymotion-apps/Beers/app/app_delegate.rb +16 -0
  17. data/spec/multiple-rubymotion-apps/Beers/app/beer.rb +22 -0
  18. data/spec/multiple-rubymotion-apps/Beers/app/beer_details_controller.rb +15 -0
  19. data/spec/multiple-rubymotion-apps/Beers/app/beer_list_controller.rb +40 -0
  20. data/spec/multiple-rubymotion-apps/Beers/app/beer_map_controller.rb +51 -0
  21. data/spec/multiple-rubymotion-apps/Beers/resources/.gitignore +0 -0
  22. data/spec/multiple-rubymotion-apps/Beers/resources/list.png +0 -0
  23. data/spec/multiple-rubymotion-apps/Beers/resources/map.png +0 -0
  24. data/spec/multiple-rubymotion-apps/CircleLayout/.gitignore +5 -0
  25. data/spec/multiple-rubymotion-apps/CircleLayout/README +5 -0
  26. data/spec/multiple-rubymotion-apps/CircleLayout/Rakefile +9 -0
  27. data/spec/multiple-rubymotion-apps/CircleLayout/app/app_delegate.rb +8 -0
  28. data/spec/multiple-rubymotion-apps/CircleLayout/app/cell.rb +13 -0
  29. data/spec/multiple-rubymotion-apps/CircleLayout/app/circle_layout.rb +41 -0
  30. data/spec/multiple-rubymotion-apps/CircleLayout/app/view_controller.rb +33 -0
  31. data/spec/multiple-rubymotion-apps/Fonts/README +7 -0
  32. data/spec/multiple-rubymotion-apps/Fonts/Rakefile +8 -0
  33. data/spec/multiple-rubymotion-apps/Fonts/app/app_delegate.rb +9 -0
  34. data/spec/multiple-rubymotion-apps/Fonts/app/detail_controller.rb +50 -0
  35. data/spec/multiple-rubymotion-apps/Fonts/app/root_controller.rb +65 -0
  36. data/spec/multiple-rubymotion-apps/Fonts/resources/.gitkeep +0 -0
  37. data/spec/multiple-rubymotion-apps/GestureTable/README +8 -0
  38. data/spec/multiple-rubymotion-apps/GestureTable/Rakefile +8 -0
  39. data/spec/multiple-rubymotion-apps/GestureTable/app/UIColor_extensions.rb +32 -0
  40. data/spec/multiple-rubymotion-apps/GestureTable/app/UITableView_extensions.rb +7 -0
  41. data/spec/multiple-rubymotion-apps/GestureTable/app/app_delegate.rb +9 -0
  42. data/spec/multiple-rubymotion-apps/GestureTable/app/gesture_recognizer.rb +361 -0
  43. data/spec/multiple-rubymotion-apps/GestureTable/app/transformable_cells.rb +92 -0
  44. data/spec/multiple-rubymotion-apps/GestureTable/app/view_controller.rb +173 -0
  45. data/spec/multiple-rubymotion-apps/GestureTable/resources/.gitignore +0 -0
  46. data/spec/multiple-rubymotion-apps/Hello/README +3 -0
  47. data/spec/multiple-rubymotion-apps/Hello/Rakefile +8 -0
  48. data/spec/multiple-rubymotion-apps/Hello/app/app_delegate.rb +9 -0
  49. data/spec/multiple-rubymotion-apps/Hello/app/hello_view.rb +33 -0
  50. data/spec/multiple-rubymotion-apps/Hello/app/hello_view_controller.rb +5 -0
  51. data/spec/multiple-rubymotion-apps/Hello/resources/.gitignore +0 -0
  52. data/spec/multiple-rubymotion-apps/Hello/resources/icon.png +0 -0
  53. data/spec/multiple-rubymotion-apps/HelloGL/README +9 -0
  54. data/spec/multiple-rubymotion-apps/HelloGL/Rakefile +11 -0
  55. data/spec/multiple-rubymotion-apps/HelloGL/app/app_delegate.rb +16 -0
  56. data/spec/multiple-rubymotion-apps/HelloGL/app/index_data.rb +19 -0
  57. data/spec/multiple-rubymotion-apps/HelloGL/app/motiongl_controller.rb +139 -0
  58. data/spec/multiple-rubymotion-apps/HelloGL/app/vertex_data.rb +22 -0
  59. data/spec/multiple-rubymotion-apps/HelloGL/resources/rubymotion.png +0 -0
  60. data/spec/multiple-rubymotion-apps/Locations/README +3 -0
  61. data/spec/multiple-rubymotion-apps/Locations/Rakefile +8 -0
  62. data/spec/multiple-rubymotion-apps/Locations/app/app_delegate.rb +11 -0
  63. data/spec/multiple-rubymotion-apps/Locations/app/location.rb +21 -0
  64. data/spec/multiple-rubymotion-apps/Locations/app/locations_controller.rb +66 -0
  65. data/spec/multiple-rubymotion-apps/Locations/app/locations_store.rb +61 -0
  66. data/spec/multiple-rubymotion-apps/Locations/resources/.gitignore +0 -0
  67. data/spec/multiple-rubymotion-apps/Mustache/README +5 -0
  68. data/spec/multiple-rubymotion-apps/Mustache/Rakefile +10 -0
  69. data/spec/multiple-rubymotion-apps/Mustache/app/app_delegate.rb +9 -0
  70. data/spec/multiple-rubymotion-apps/Mustache/app/mustache_view_controller.rb +99 -0
  71. data/spec/multiple-rubymotion-apps/Mustache/resources/.gitignore +0 -0
  72. data/spec/multiple-rubymotion-apps/Mustache/resources/guido.jpg +0 -0
  73. data/spec/multiple-rubymotion-apps/Mustache/resources/jmccolor.jpg +0 -0
  74. data/spec/multiple-rubymotion-apps/Mustache/resources/kay.jpg +0 -0
  75. data/spec/multiple-rubymotion-apps/Mustache/resources/matz.jpg +0 -0
  76. data/spec/multiple-rubymotion-apps/Mustache/resources/mustache.png +0 -0
  77. data/spec/multiple-rubymotion-apps/Paint/README +3 -0
  78. data/spec/multiple-rubymotion-apps/Paint/Rakefile +8 -0
  79. data/spec/multiple-rubymotion-apps/Paint/app/app_delegate.rb +9 -0
  80. data/spec/multiple-rubymotion-apps/Paint/app/paint_view.rb +57 -0
  81. data/spec/multiple-rubymotion-apps/Paint/app/paint_view_controller.rb +13 -0
  82. data/spec/multiple-rubymotion-apps/Paint/resources/.gitignore +0 -0
  83. data/spec/multiple-rubymotion-apps/Paint/resources/erase.caf +0 -0
  84. data/spec/multiple-rubymotion-apps/PaintHTML/README +8 -0
  85. data/spec/multiple-rubymotion-apps/PaintHTML/Rakefile +10 -0
  86. data/spec/multiple-rubymotion-apps/PaintHTML/app/app_delegate.rb +10 -0
  87. data/spec/multiple-rubymotion-apps/PaintHTML/app/web_view_controller.rb +48 -0
  88. data/spec/multiple-rubymotion-apps/PaintHTML/resources/index.html +211 -0
  89. data/spec/multiple-rubymotion-apps/PaintHTML/resources/index2.html +14 -0
  90. data/spec/multiple-rubymotion-apps/README.rdoc +47 -0
  91. data/spec/multiple-rubymotion-apps/StoryboardCustoms/README.md +42 -0
  92. data/spec/multiple-rubymotion-apps/StoryboardCustoms/Rakefile +7 -0
  93. data/spec/multiple-rubymotion-apps/StoryboardCustoms/app/app_delegate.rb +12 -0
  94. data/spec/multiple-rubymotion-apps/StoryboardCustoms/app/custom_view_controller1.rb +31 -0
  95. data/spec/multiple-rubymotion-apps/StoryboardCustoms/app/custom_view_controller2.rb +29 -0
  96. data/spec/multiple-rubymotion-apps/StoryboardCustoms/app/helpers.rb +4 -0
  97. data/spec/multiple-rubymotion-apps/StoryboardCustoms/resources/Master.storyboard +127 -0
  98. data/spec/multiple-rubymotion-apps/TicTacToe/.gitignore +5 -0
  99. data/spec/multiple-rubymotion-apps/TicTacToe/Rakefile +7 -0
  100. data/spec/multiple-rubymotion-apps/TicTacToe/app/app_delegate.rb +8 -0
  101. data/spec/multiple-rubymotion-apps/TicTacToe/app/board.rb +59 -0
  102. data/spec/multiple-rubymotion-apps/TicTacToe/app/board_view_controller.rb +86 -0
  103. data/spec/multiple-rubymotion-apps/Timer/README +3 -0
  104. data/spec/multiple-rubymotion-apps/Timer/Rakefile +7 -0
  105. data/spec/multiple-rubymotion-apps/Timer/app/app_delegate.rb +9 -0
  106. data/spec/multiple-rubymotion-apps/Timer/app/timer_controller.rb +38 -0
  107. data/spec/multiple-rubymotion-apps/Timer/resources/.gitignore +0 -0
  108. data/spec/multiple-rubymotion-apps/Trollify/README +6 -0
  109. data/spec/multiple-rubymotion-apps/Trollify/Rakefile +9 -0
  110. data/spec/multiple-rubymotion-apps/Trollify/app/app_delegate.rb +9 -0
  111. data/spec/multiple-rubymotion-apps/Trollify/app/image_composition_controller.rb +193 -0
  112. data/spec/multiple-rubymotion-apps/Trollify/app/uiimage_extension.rb +27 -0
  113. data/spec/multiple-rubymotion-apps/Trollify/resources/.gitignore +0 -0
  114. data/spec/multiple-rubymotion-apps/Trollify/resources/ballmer.jpg +0 -0
  115. data/spec/multiple-rubymotion-apps/Trollify/resources/icon.png +0 -0
  116. data/spec/multiple-rubymotion-apps/Trollify/resources/icon@2x.png +0 -0
  117. data/spec/multiple-rubymotion-apps/Trollify/resources/trollface.png +0 -0
  118. data/spec/multiple-rubymotion-apps/Tweets/README +3 -0
  119. data/spec/multiple-rubymotion-apps/Tweets/Rakefile +7 -0
  120. data/spec/multiple-rubymotion-apps/Tweets/app/app_delegate.rb +9 -0
  121. data/spec/multiple-rubymotion-apps/Tweets/app/data_parser.rb +10 -0
  122. data/spec/multiple-rubymotion-apps/Tweets/app/json_parser.rb +12 -0
  123. data/spec/multiple-rubymotion-apps/Tweets/app/tweet.rb +11 -0
  124. data/spec/multiple-rubymotion-apps/Tweets/app/tweet_cell.rb +51 -0
  125. data/spec/multiple-rubymotion-apps/Tweets/app/tweets_controller.rb +72 -0
  126. data/spec/multiple-rubymotion-apps/Tweets/resources/.gitignore +0 -0
  127. data/spec/repo_spec.rb +27 -0
  128. data/spec/rubymotion-example/.DS_Store +0 -0
  129. data/spec/rubymotion-example/README +3 -0
  130. data/spec/rubymotion-example/Rakefile +7 -0
  131. data/spec/rubymotion-example/app/app_delegate.rb +9 -0
  132. data/spec/rubymotion-example/app/data_parser.rb +10 -0
  133. data/spec/rubymotion-example/app/json_parser.rb +12 -0
  134. data/spec/rubymotion-example/app/tweet.rb +11 -0
  135. data/spec/rubymotion-example/app/tweet_cell.rb +51 -0
  136. data/spec/rubymotion-example/app/tweets_controller.rb +72 -0
  137. data/spec/rubymotion-example/resources/.gitignore +0 -0
  138. data/spec/spec_helper.rb +9 -0
  139. metadata +309 -0
@@ -0,0 +1,2 @@
1
+ .idea
2
+ .rvmrc
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rubymotionr.gemspec
4
+ gemspec
5
+ gem 'rspec'
@@ -0,0 +1,24 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rubymotionr (0.0.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.1.3)
10
+ rspec (2.12.0)
11
+ rspec-core (~> 2.12.0)
12
+ rspec-expectations (~> 2.12.0)
13
+ rspec-mocks (~> 2.12.0)
14
+ rspec-core (2.12.2)
15
+ rspec-expectations (2.12.1)
16
+ diff-lcs (~> 1.1.3)
17
+ rspec-mocks (2.12.1)
18
+
19
+ PLATFORMS
20
+ ruby
21
+
22
+ DEPENDENCIES
23
+ rspec
24
+ rubymotionr!
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Marko Iskander
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,31 @@
1
+ # Rubymotionr
2
+
3
+ ## Installation
4
+
5
+ Add this line to your application's Gemfile:
6
+
7
+ gem 'rubymotionr'
8
+
9
+ And then execute:
10
+
11
+ $ bundle
12
+
13
+ Or install it yourself as:
14
+
15
+ $ gem install rubymotionr
16
+
17
+ ## Usage
18
+
19
+ ``` ruby
20
+ repo = Rubymotionr::Rep.new("/absolute/path/to/repo")
21
+ ```
22
+
23
+ This will return the repo object with projects (repo.projects) within it. Each project has an attribute path (i.e repo.projects.path) which is a path to the root of a RubyMotion project.
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,7 @@
1
+ require "rubymotionr/repo"
2
+ require 'rubymotionr/project'
3
+ require "rubymotionr/version"
4
+
5
+ module Rubymotionr
6
+ # Your code goes here...
7
+ end
@@ -0,0 +1,18 @@
1
+ module Rubymotionr
2
+ class Project
3
+
4
+ attr_reader :gem_prereqs, :path
5
+
6
+ def initialize(path)
7
+ @path = path
8
+ #TODO: Find, parse and return gem prereqs
9
+ #TODO: Consider CocoPods
10
+ #@gem_prereqs = get_prereqs
11
+ end
12
+
13
+ def self.is_rubymotion_app?(path)
14
+ rakefile = File.read(path)
15
+ rakefile.include?(%{require 'motion/project'})
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Rubymotionr
2
+ class Repo
3
+
4
+ attr_reader :path, :projects
5
+
6
+ def initialize(path)
7
+ @path = path
8
+ @projects = find_projects(path)
9
+ end
10
+
11
+ private
12
+ def find_projects(path)
13
+ Dir.glob(File.join(path, "**/Rakefile")).collect { |loc|
14
+ Project.new(loc.gsub("Rakefile", "")) if Project.is_rubymotion_app?(loc)
15
+ }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module Rubymotionr
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rubymotionr/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "rubymotionr"
8
+ gem.version = Rubymotionr::VERSION
9
+ gem.authors = ["Marko Iskander"]
10
+ gem.email = ["markoiskander@gmail.com"]
11
+ gem.description = %q{Find rubymotion projects within a directory}
12
+ gem.summary = %q{Find rubymotion projects within a directory }
13
+ gem.homepage = "https://github.com/miskander/rubymotionr"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+ end
Binary file
@@ -0,0 +1,5 @@
1
+ Beers.app
2
+
3
+ This sample demonstrates the following concepts: Tabs Bar, Table View, Map View, Web View.
4
+
5
+ The icon files in the resources directory are from Glyphish. http://glyphish.com.
@@ -0,0 +1,8 @@
1
+ $:.unshift("/Library/RubyMotion/lib")
2
+ require 'motion/project'
3
+
4
+ Motion::Project::App.setup do |app|
5
+ # Use `rake config' to see complete project settings.
6
+ app.name = 'Beers'
7
+ app.frameworks += ['CoreLocation', 'MapKit', 'AddressBook']
8
+ end
@@ -0,0 +1,16 @@
1
+ class AppDelegate
2
+ def application(application, didFinishLaunchingWithOptions:launchOptions)
3
+ @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
4
+ tabbar = UITabBarController.alloc.init
5
+ tabbar.viewControllers = [BeerMapController.alloc.init, BeerListController.alloc.init]
6
+ tabbar.selectedIndex = 0
7
+ @window.rootViewController = UINavigationController.alloc.initWithRootViewController(tabbar)
8
+ @window.rootViewController.wantsFullScreenLayout = true
9
+ @window.makeKeyAndVisible
10
+ true
11
+ end
12
+
13
+ def beer_details_controller
14
+ @beer_details_controller ||= BeerDetailsController.alloc.init
15
+ end
16
+ end
@@ -0,0 +1,22 @@
1
+ class Beer
2
+ def initialize(lat, long, name, link)
3
+ @name = name
4
+ @coordinate = CLLocationCoordinate2D.new
5
+ @coordinate.latitude = lat
6
+ @coordinate.longitude = long
7
+ @url = NSURL.alloc.initWithString(link)
8
+ end
9
+
10
+ def title; @name; end
11
+ def coordinate; @coordinate; end
12
+ def url; @url; end
13
+
14
+ All = [
15
+ Beer.new(50.016667, 4.316667, 'Chimay', 'http://en.wikipedia.org/wiki/Chimay_Brewery'),
16
+ Beer.new(49.639722, 5.348889, 'Orval', 'http://en.wikipedia.org/wiki/Orval_Brewery'),
17
+ Beer.new(50.178162, 5.219879, 'Rochefort', 'http://en.wikipedia.org/wiki/Rochefort_Brewery'),
18
+ Beer.new(51.284720, 4.656670, 'Westmalle', 'http://en.wikipedia.org/wiki/Westmalle_Brewery'),
19
+ Beer.new(50.895942, 2.721262, 'Westvleteren', 'http://en.wikipedia.org/wiki/Westvleteren_Brewery'),
20
+ Beer.new(51.298800, 5.488570, 'Achel', 'http://en.wikipedia.org/wiki/Achel_Brewery')
21
+ ]
22
+ end
@@ -0,0 +1,15 @@
1
+ class BeerDetailsController < UIViewController
2
+ def loadView
3
+ self.view = UIWebView.alloc.init
4
+ end
5
+
6
+ def viewWillAppear(animated)
7
+ navigationController.setNavigationBarHidden(false, animated:true)
8
+ end
9
+
10
+ def showDetailsForBeer(beer)
11
+ navigationItem.title = beer.title
12
+ request = NSURLRequest.requestWithURL(beer.url)
13
+ view.loadRequest(request)
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ class BeerListController < UITableViewController
2
+ def init
3
+ if super
4
+ self.tabBarItem = UITabBarItem.alloc.initWithTitle('List', image:UIImage.imageNamed('list.png'), tag:1)
5
+ end
6
+ self
7
+ end
8
+
9
+ def viewDidLoad
10
+ view.dataSource = view.delegate = self
11
+ end
12
+
13
+ def viewWillAppear(animated)
14
+ navigationController.setNavigationBarHidden(true, animated:true)
15
+ end
16
+
17
+ def tableView(tableView, numberOfRowsInSection:section)
18
+ Beer::All.size
19
+ end
20
+
21
+ CELLID = 'CellIdentifier'
22
+ def tableView(tableView, cellForRowAtIndexPath:indexPath)
23
+ cell = tableView.dequeueReusableCellWithIdentifier(CELLID) || begin
24
+ cell = UITableViewCell.alloc.initWithStyle(UITableViewCellStyleDefault, reuseIdentifier:CELLID)
25
+ cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton
26
+ cell
27
+ end
28
+
29
+ beer = Beer::All[indexPath.row]
30
+ cell.textLabel.text = beer.title
31
+ cell
32
+ end
33
+
34
+ def tableView(tableView, accessoryButtonTappedForRowWithIndexPath:indexPath)
35
+ beer = Beer::All[indexPath.row]
36
+ controller = UIApplication.sharedApplication.delegate.beer_details_controller
37
+ navigationController.pushViewController(controller, animated:true)
38
+ controller.showDetailsForBeer(beer)
39
+ end
40
+ end
@@ -0,0 +1,51 @@
1
+ class BeerMapController < UIViewController
2
+ def init
3
+ if super
4
+ self.tabBarItem = UITabBarItem.alloc.initWithTitle('Map', image:UIImage.imageNamed('map.png'), tag:1)
5
+ end
6
+ self
7
+ end
8
+
9
+ def loadView
10
+ self.view = MKMapView.alloc.init
11
+ view.delegate = self
12
+ end
13
+
14
+ def viewDidLoad
15
+ view.frame = tabBarController.view.bounds
16
+
17
+ # Center on Brussels.
18
+ region = MKCoordinateRegionMake(CLLocationCoordinate2D.new(50.85, 4.35), MKCoordinateSpanMake(3.1, 3.1))
19
+ self.view.setRegion(region)
20
+
21
+ Beer::All.each { |beer| self.view.addAnnotation(beer) }
22
+ end
23
+
24
+ def viewWillAppear(animated)
25
+ navigationController.setNavigationBarHidden(true, animated:true)
26
+ end
27
+
28
+ ViewIdentifier = 'ViewIdentifier'
29
+ def mapView(mapView, viewForAnnotation:beer)
30
+ if view = mapView.dequeueReusableAnnotationViewWithIdentifier(ViewIdentifier)
31
+ view.annotation = beer
32
+ else
33
+ view = MKPinAnnotationView.alloc.initWithAnnotation(beer, reuseIdentifier:ViewIdentifier)
34
+ view.canShowCallout = true
35
+ view.animatesDrop = true
36
+ button = UIButton.buttonWithType(UIButtonTypeDetailDisclosure)
37
+ button.addTarget(self, action: :'showDetails:', forControlEvents:UIControlEventTouchUpInside)
38
+ view.rightCalloutAccessoryView = button
39
+ end
40
+ view
41
+ end
42
+
43
+ def showDetails(sender)
44
+ if view.selectedAnnotations.size == 1
45
+ beer = view.selectedAnnotations[0]
46
+ controller = UIApplication.sharedApplication.delegate.beer_details_controller
47
+ navigationController.pushViewController(controller, animated:true)
48
+ controller.showDetailsForBeer(beer)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,5 @@
1
+ .repl_history
2
+ build
3
+ resources/*.nib
4
+ resources/*.momd
5
+ resources/*.storyboardc
@@ -0,0 +1,5 @@
1
+ CircleLayout.app
2
+
3
+ This sample demonstrates the following concept: UICollectionView
4
+
5
+ This sample is a port of WWDC 2012's 219 session sample code.
@@ -0,0 +1,9 @@
1
+ # -*- coding: utf-8 -*-
2
+ $:.unshift("/Library/RubyMotion/lib")
3
+ require 'motion/project'
4
+
5
+ Motion::Project::App.setup do |app|
6
+ # Use `rake config' to see complete project settings.
7
+ app.name = 'CircleLayout'
8
+ app.deployment_target = '6.0'
9
+ end
@@ -0,0 +1,8 @@
1
+ class AppDelegate
2
+ def application(application, didFinishLaunchingWithOptions:launchOptions)
3
+ @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
4
+ @window.rootViewController = ViewController.alloc.initWithCollectionViewLayout(CircleLayout.new)
5
+ @window.makeKeyAndVisible
6
+ true
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ class Cell < UICollectionViewCell
2
+ def initWithFrame(frame)
3
+ if super
4
+ contentView.layer.tap do |obj|
5
+ obj.cornerRadius = 35.0
6
+ obj.borderWidth = 1.0
7
+ obj.borderColor = UIColor.whiteColor.CGColor
8
+ end
9
+ contentView.backgroundColor = UIColor.underPageBackgroundColor
10
+ end
11
+ self
12
+ end
13
+ end
@@ -0,0 +1,41 @@
1
+ class CircleLayout < UICollectionViewLayout
2
+ ItemSize = 70.0
3
+
4
+ def prepareLayout
5
+ super
6
+ size = collectionView.frame.size
7
+ @cell_count = collectionView.numberOfItemsInSection(0)
8
+ @center = CGPoint.new(size.width / 2.0, size.height / 2.0)
9
+ @radius = [size.width, size.height].min / 2.5
10
+ end
11
+
12
+ def collectionViewContentSize
13
+ collectionView.frame.size
14
+ end
15
+
16
+ def layoutAttributesForItemAtIndexPath(path)
17
+ UICollectionViewLayoutAttributes.layoutAttributesForCellWithIndexPath(path).tap do |obj|
18
+ obj.size = [ItemSize, ItemSize]
19
+ obj.center = [@center.x + @radius * Math.cos(2 * path.item * Math::PI / @cell_count), @center.y + @radius * Math.sin(2 * path.item * Math::PI / @cell_count)]
20
+ end
21
+ end
22
+
23
+ def layoutAttributesForElementsInRect(rect)
24
+ (0...@cell_count).map { |i| layoutAttributesForItemAtIndexPath(NSIndexPath.indexPathForItem(i, inSection:0)) }
25
+ end
26
+
27
+ def initialLayoutAttributesForInsertedItemAtIndexPath(path)
28
+ layoutAttributesForItemAtIndexPath(path).tap do |obj|
29
+ obj.alpha = 0.0
30
+ obj.center = @center
31
+ end
32
+ end
33
+
34
+ def finalLayoutAttributesForDeletedItemAtIndexPath(path)
35
+ layoutAttributesForItemAtIndexPath(path).tap do |obj|
36
+ obj.alpha = 0.0
37
+ obj.center = @center
38
+ obj.transform3D = CATransform3DMakeScale(0.1, 0.1, 1.0)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,33 @@
1
+ class ViewController < UICollectionViewController
2
+ CellIdentifier = 'MyCell'
3
+
4
+ def viewDidLoad
5
+ @cell_count = 20
6
+ tap = UITapGestureRecognizer.alloc.initWithTarget(self, action: :'handleTapGesture:')
7
+ collectionView.addGestureRecognizer(tap)
8
+ collectionView.registerClass(Cell, forCellWithReuseIdentifier:CellIdentifier)
9
+ collectionView.backgroundColor = UIColor.scrollViewTexturedBackgroundColor
10
+ end
11
+
12
+ def collectionView(view, numberOfItemsInSection:section)
13
+ @cell_count
14
+ end
15
+
16
+ def collectionView(view, cellForItemAtIndexPath:path)
17
+ view.dequeueReusableCellWithReuseIdentifier(CellIdentifier, forIndexPath:path)
18
+ end
19
+
20
+ def handleTapGesture(sender)
21
+ if sender.state == UIGestureRecognizerStateEnded
22
+ pinch_point = sender.locationInView(collectionView)
23
+ path = collectionView.indexPathForItemAtPoint(pinch_point)
24
+ if path
25
+ @cell_count -= 1
26
+ collectionView.performBatchUpdates(lambda { collectionView.deleteItemsAtIndexPaths([path]) }, completion:nil)
27
+ else
28
+ @cell_count += 1
29
+ collectionView.performBatchUpdates(lambda { collectionView.insertItemsAtIndexPaths([NSIndexPath.indexPathForItem(0, inSection:0)]) }, completion:nil)
30
+ end
31
+ end
32
+ end
33
+ end