ProMotion 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. data/.gitignore +0 -1
  2. data/Gemfile +1 -1
  3. data/README.md +336 -92
  4. data/Rakefile +1 -1
  5. data/lib/ProMotion.rb +14 -0
  6. data/lib/ProMotion/app_delegate.rb +63 -0
  7. data/lib/ProMotion/cocoatouch/NavigationController.rb +4 -0
  8. data/lib/ProMotion/cocoatouch/TableViewCell.rb +16 -0
  9. data/lib/ProMotion/cocoatouch/TableViewController.rb +50 -0
  10. data/lib/ProMotion/cocoatouch/ViewController.rb +52 -0
  11. data/lib/ProMotion/helpers/console.rb +24 -0
  12. data/lib/ProMotion/helpers/measure_helper.rb +20 -0
  13. data/lib/ProMotion/helpers/system_helper.rb +29 -0
  14. data/lib/ProMotion/helpers/tab_bar.rb +115 -0
  15. data/lib/ProMotion/helpers/view_helper.rb +39 -0
  16. data/lib/ProMotion/pro_motion.rb +3 -0
  17. data/lib/ProMotion/screen_helpers/_tables/_searchable_table.rb +66 -0
  18. data/lib/ProMotion/screen_helpers/_tables/_sectioned_table.rb +265 -0
  19. data/lib/ProMotion/screen_helpers/_tables/grouped_table.rb +13 -0
  20. data/lib/ProMotion/screen_helpers/_tables/plain_table.rb +14 -0
  21. data/lib/ProMotion/screen_helpers/screen_elements.rb +43 -0
  22. data/lib/ProMotion/screen_helpers/screen_navigation.rb +106 -0
  23. data/lib/ProMotion/screen_helpers/screen_tabs.rb +92 -0
  24. data/lib/ProMotion/screens/_screen_module.rb +222 -0
  25. data/lib/ProMotion/screens/_table_screen_module.rb +30 -0
  26. data/lib/ProMotion/screens/screen.rb +7 -0
  27. data/lib/ProMotion/screens/table_screen.rb +15 -0
  28. data/lib/ProMotion/version.rb +3 -0
  29. metadata +43 -63
  30. data/app/app_delegate.rb +0 -5
  31. data/app/screens/home_screen.rb +0 -21
  32. data/app/screens/test_screen.rb +0 -26
data/Rakefile CHANGED
@@ -15,7 +15,7 @@ Motion::Project::App.setup do |app|
15
15
  app.deployment_target = "5.0"
16
16
  app.device_family = [:iphone, :ipad]
17
17
 
18
- app.detect_dependencies = false
18
+ app.detect_dependencies = true
19
19
 
20
20
  # Preload screens
21
21
  # app.files = Dir.glob(File.join(app.project_dir, 'lib/**/*.rb')) | app.files
data/lib/ProMotion.rb ADDED
@@ -0,0 +1,14 @@
1
+ unless defined?(Motion::Project::Config)
2
+ raise "This file must be required within a RubyMotion project Rakefile."
3
+ end
4
+
5
+ require "ProMotion/version"
6
+
7
+ Motion::Project::App.setup do |app|
8
+ # app_delegate = Dir.glob(File.join(File.dirname(__FILE__), 'ProMotion/app_delegate.rb'))
9
+ # app.files = Dir.glob(File.join(File.dirname(__FILE__), 'ProMotion/**/*.rb')) | app_delegate | app.files
10
+
11
+ original_files = app.files
12
+ app.files = FileList[File.join(File.dirname(__FILE__), 'ProMotion/**/*.rb')].exclude(File.join(File.dirname(__FILE__), 'ProMotion/app_delegate.rb'))
13
+ app.files = app.files | Dir.glob(File.join(File.dirname(__FILE__), 'ProMotion/app_delegate.rb')) | original_files
14
+ end
@@ -0,0 +1,63 @@
1
+ module ProMotion
2
+ class AppDelegateParent
3
+ include ProMotion::ScreenTabs
4
+ attr_accessor :window
5
+
6
+ def application(application, didFinishLaunchingWithOptions:launch_options)
7
+ return true if RUBYMOTION_ENV == "test"
8
+
9
+ Console.log(" Your AppDelegate (usually in app_delegate.rb) needs an on_load(options) method.", with_color: Console::RED_COLOR) unless self.respond_to?("on_load:")
10
+
11
+ on_load(application, launch_options)
12
+
13
+ open_home_screen if has_home_screen
14
+
15
+ true
16
+ end
17
+
18
+ def app_delegate
19
+ UIApplication.sharedApplication.delegate
20
+ end
21
+
22
+ def app_window
23
+ self.app_delegate.window
24
+ end
25
+
26
+ def load_root_screen(new_screen)
27
+ new_screen = new_screen.main_controller if new_screen.respond_to?(:main_controller)
28
+
29
+ self.window ||= UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
30
+ self.window.rootViewController = new_screen
31
+ self.window.makeKeyAndVisible
32
+ end
33
+
34
+ def open_screen(screen)
35
+ home(screen)
36
+ end
37
+ alias :open :open_screen
38
+
39
+ def home(screen)
40
+ screen = screen.new if screen.respond_to?(:new)
41
+ @home_screen = screen
42
+ end
43
+
44
+ def open_root_screen(new_screen)
45
+ home(new_screen)
46
+ open_home_screen
47
+ end
48
+ alias :fresh_start :open_root_screen
49
+
50
+ def open_home_screen
51
+ get_home_screen.send(:on_load) if get_home_screen.respond_to?(:on_load)
52
+ load_root_screen get_home_screen
53
+ end
54
+
55
+ def get_home_screen
56
+ @home_screen
57
+ end
58
+
59
+ def has_home_screen
60
+ @home_screen.nil? == false
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,4 @@
1
+ module ProMotion
2
+ class NavigationController < UINavigationController
3
+ end
4
+ end
@@ -0,0 +1,16 @@
1
+ module ProMotion
2
+ class TableViewCell < UITableViewCell
3
+ attr_accessor :image_size
4
+
5
+ def layoutSubviews
6
+ super
7
+
8
+ if self.image_size && self.imageView.image && self.imageView.image.size && self.imageView.image.size.width > 0
9
+ f = self.imageView.frame
10
+ size_inset_x = (self.imageView.size.width - self.image_size) / 2
11
+ size_inset_y = (self.imageView.size.height - self.image_size) / 2
12
+ self.imageView.frame = CGRectInset(f, size_inset_x, size_inset_y)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,50 @@
1
+ module ProMotion
2
+ class TableViewController < UITableViewController
3
+ def self.new(args = {})
4
+ s = self.alloc.initWithNibName(nil, bundle:nil)
5
+ s.on_create(args) if s.respond_to?(:on_create)
6
+ s
7
+ end
8
+
9
+ def viewDidLoad
10
+ super
11
+ self.view_did_load if self.respond_to?(:view_did_load)
12
+ end
13
+
14
+ def viewWillAppear(animated)
15
+ super
16
+ self.view_will_appear(animated) if self.respond_to?("view_will_appear:")
17
+ end
18
+
19
+ def viewDidAppear(animated)
20
+ super
21
+ self.view_did_appear(animated) if self.respond_to?("view_did_appear:")
22
+ end
23
+
24
+ def viewWillDisappear(animated)
25
+ self.view_will_disappear(animated) if self.respond_to?("view_will_disappear:")
26
+ super
27
+ end
28
+
29
+ def viewDidDisappear(animated)
30
+ self.view_did_disappear(animated) if self.respond_to?("view_did_disappear:")
31
+ super
32
+ end
33
+
34
+ def shouldAutorotateToInterfaceOrientation(orientation)
35
+ self.should_rotate(orientation)
36
+ end
37
+
38
+ def shouldAutorotate
39
+ self.should_autorotate
40
+ end
41
+
42
+ def willRotateToInterfaceOrientation(orientation, duration:duration)
43
+ self.will_rotate(orientation, duration)
44
+ end
45
+
46
+ def didRotateFromInterfaceOrientation(orientation)
47
+ self.on_rotate
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,52 @@
1
+ module ProMotion
2
+ class ViewController < UIViewController
3
+ def self.new(args = {})
4
+ s = self.alloc.initWithNibName(nil, bundle:nil)
5
+ s.on_create(args) if s.respond_to?(:on_create)
6
+ s
7
+ end
8
+
9
+ def viewDidLoad
10
+ super
11
+ self.view_did_load if self.respond_to?(:view_did_load)
12
+ end
13
+
14
+ def viewWillAppear(animated)
15
+ super
16
+ self.view_will_appear(animated) if self.respond_to?("view_will_appear:")
17
+ end
18
+
19
+ def viewDidAppear(animated)
20
+ super
21
+ self.view_did_appear(animated) if self.respond_to?("view_did_appear:")
22
+ end
23
+
24
+ def viewWillDisappear(animated)
25
+ self.view_will_disappear(animated) if self.respond_to?("view_will_disappear:")
26
+ super
27
+ end
28
+
29
+ def viewDidDisappear(animated)
30
+ if self.respond_to?("view_did_disappear:")
31
+ self.view_did_disappear(animated)
32
+ end
33
+ super
34
+ end
35
+
36
+ def shouldAutorotateToInterfaceOrientation(orientation)
37
+ self.should_rotate(orientation)
38
+ end
39
+
40
+ def shouldAutorotate
41
+ self.should_autorotate
42
+ end
43
+
44
+ def willRotateToInterfaceOrientation(orientation, duration:duration)
45
+ self.will_rotate(orientation, duration)
46
+ end
47
+
48
+ def didRotateFromInterfaceOrientation(orientation)
49
+ self.on_rotate
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,24 @@
1
+ module ProMotion
2
+ class Console
3
+ NAME = "RubyMotion::Console: "
4
+ DEFAULT_COLOR = [ '', '' ]
5
+ RED_COLOR = [ "\e[0;31m", "\e[0m" ] # Must be in double quotes
6
+ GREEN_COLOR = [ "\e[0;32m", "\e[0m" ]
7
+ PURPLE_COLOR = [ "\e[0;35m", "\e[0m" ]
8
+
9
+ class << self
10
+ def log(log, with_color:color)
11
+ puts color[0] + NAME + log + color[1]
12
+ end
13
+
14
+ def log(log, withColor:color)
15
+ warn "[DEPRECATION] `log(log, withColor:color)` is deprecated. Use `log(log, with_color:color)`"
16
+ self.log(log, with_color:color)
17
+ end
18
+
19
+ def log(log)
20
+ log(log, with_color: DEFAULT_COLOR)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,20 @@
1
+ module ProMotion
2
+ class MeasureHelper
3
+ class << self
4
+ def content_height(view)
5
+ warn "[DEPRECATION] `MeasureHelper.content_height` is deprecated. Include the module `ScreenElements` to get access to this method (already included in Screen)."
6
+
7
+ height = 0
8
+ view.subviews.each do |subview|
9
+ next if subview.isHidden
10
+ y = subview.frame.origin.y
11
+ h = subview.frame.size.height
12
+ if (y + h) > height
13
+ height = y + h
14
+ end
15
+ end
16
+ height
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,29 @@
1
+ module ProMotion
2
+ module SystemHelper
3
+ module_function
4
+
5
+ def ios_version
6
+ UIDevice.currentDevice.systemVersion
7
+ end
8
+
9
+ def ios_version_is?(version)
10
+ ios_version == version
11
+ end
12
+
13
+ def ios_version_greater?(version)
14
+ ios_version > version
15
+ end
16
+
17
+ def ios_version_greater_eq?(version)
18
+ ios_version >= version
19
+ end
20
+
21
+ def ios_version_less?(version)
22
+ ios_version < version
23
+ end
24
+
25
+ def ios_version_less_eq?(version)
26
+ ios_version <= version
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,115 @@
1
+ # [DEPRECATED]
2
+ # Replaced by ScreenTabs module.
3
+ module ProMotion
4
+ class TabBar
5
+ class << self
6
+ def create_tab_bar_controller_from_data(data)
7
+ warn "[DEPRECATION] `create_tab_bar_controller_from_data` is deprecated. Use `open_tab_bar` instead."
8
+
9
+ data = self.set_tags(data)
10
+
11
+ tab_bar_controller = UITabBarController.alloc.init
12
+ tab_bar_controller.viewControllers = self.tab_controllers_from_data(data)
13
+
14
+ return tab_bar_controller
15
+ end
16
+
17
+ def set_tags(data)
18
+ warn "[DEPRECATION] `set_tags` is deprecated."
19
+ tag_number = 0
20
+
21
+ data.each do |d|
22
+ d[:tag] = tag_number
23
+ tag_number += 1
24
+ end
25
+
26
+ return data
27
+ end
28
+
29
+ def tab_bar_icon(icon, tag)
30
+ warn "[DEPRECATION] `TabBar.tab_bar_icon` is deprecated. Use `create_tab_bar_icon` in ScreenTabs instead."
31
+ return UITabBarItem.alloc.initWithTabBarSystemItem(icon, tag: tag)
32
+ end
33
+
34
+ def tab_bar_icon_custom(title, image_name, tag)
35
+ warn "[DEPRECATION] `TabBar.tab_bar_icon_custom` is deprecated. Use `create_tab_bar_icon_custom` in ScreenTabs instead."
36
+ icon_image = UIImage.imageNamed(image_name)
37
+ return UITabBarItem.alloc.initWithTitle(title, image:icon_image, tag:tag)
38
+ end
39
+
40
+ def tab_controllers_from_data(data)
41
+ warn "[DEPRECATION] `tab_controllers_from_data` is deprecated. Use `open_tab_bar` instead."
42
+ tab_controllers = []
43
+
44
+ data.each do |tab|
45
+ tab_controllers << self.controller_from_tab_data(tab)
46
+ end
47
+
48
+ return tab_controllers
49
+ end
50
+
51
+ def controller_from_tab_data(tab)
52
+ warn "[DEPRECATION] `controller_from_tab_data` is deprecated. Use `open_tab_bar` instead."
53
+ tab[:badge_number] ||= tab[:badgeNumber]
54
+ tab[:navigation_controller] ||= tab[:navigationController]
55
+
56
+ tab[:badge_number] = 0 unless tab[:badge_number]
57
+ tab[:tag] = 0 unless tab[:tag]
58
+
59
+ view_controller = tab[:view_controller]
60
+ view_controller = tab[:view_controller].alloc.init if tab[:view_controller].respond_to?(:alloc)
61
+
62
+ if tab[:navigation_controller]
63
+ controller = UINavigationController.alloc.initWithRootViewController(view_controller)
64
+ else
65
+ controller = view_controller
66
+ end
67
+
68
+ view_controller.tabBarItem = self.tabBarItem(tab)
69
+ view_controller.tabBarItem.title = view_controller.title unless tab[:title]
70
+
71
+ return controller
72
+ end
73
+
74
+ def tab_bar_item(tab)
75
+ warn "[DEPRECATION] `TabBar.tab_bar_item` is deprecated. Use `tab_bar_item` in ScreenTabs instead."
76
+ title = "Untitled"
77
+ title = tab[:title] if tab[:title]
78
+ tab[:tag] ||= @current_tag ||= 0
79
+ @current_tag = tab[:tag] + 1
80
+
81
+ tab_bar_item = tab_bar_icon(tab[:system_icon], tab[:tag]) if tab[:system_icon]
82
+ tab_bar_item = tab_bar_icon_custom(title, tab[:icon], tab[:tag]) if tab[:icon]
83
+
84
+ tab_bar_item.badgeValue = tab[:badge_number].to_s unless tab[:badge_number].nil? || tab[:badge_number] <= 0
85
+
86
+ return tab_bar_item
87
+ end
88
+
89
+ def select(tab_bar_controller, title: title)
90
+ warn "[DEPRECATION] `TabBar.select` is deprecated. Use `open_tab` in ScreenTabs instead."
91
+ root_controller = nil
92
+ tab_bar_controller.viewControllers.each do |vc|
93
+ if vc.tabBarItem.title == title
94
+ tab_bar_controller.selectedViewController = vc
95
+ root_controller = vc
96
+ break
97
+ end
98
+ end
99
+ root_controller
100
+ end
101
+
102
+ def select(tab_bar_controller, tag: tag)
103
+ warn "[DEPRECATION] `TabBar.select:tag:` is deprecated. Use `open_tab` in ScreenTabs instead."
104
+ tab_bar_controller.selectedIndex = tag
105
+ end
106
+
107
+ def replace_current_item(tab_bar_controller, view_controller: vc)
108
+ warn "[DEPRECATION] `TabBar.replace_current_item` is deprecated. Use `replace_current_item` in ScreenTabs instead."
109
+ controllers = NSMutableArray.arrayWithArray(tab_bar_controller.viewControllers)
110
+ controllers.replaceObjectAtIndex(tab_bar_controller.selectedIndex, withObject: vc)
111
+ tab_bar_controller.viewControllers = controllers
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,39 @@
1
+ module ProMotion
2
+ module ViewHelper
3
+ def set_attributes(element, args = {})
4
+ args.each do |k, v|
5
+ if v.is_a? Hash
6
+ # TODO: Do this recursively
7
+ v.each do |k2, v2|
8
+ sub_element = element.send("#{k}")
9
+ sub_element.send("#{k2}=", v2) if sub_element.respond_to?("#{k2}=")
10
+ end
11
+ elsif v.is_a? Array
12
+ element.send("#{k}", *v) if element.respond_to?("#{k}")
13
+ else
14
+ element.send("#{k}=", v) if element.respond_to?("#{k}=")
15
+ end
16
+ end
17
+ element
18
+ end
19
+
20
+ def frame_from_array(array)
21
+ return CGRectMake(array[0], array[1], array[2], array[3]) if array.length == 4
22
+ Console.log(" - frame_from_array expects an array with four elements: [x, y, width, height]", withColor: Console::RED_COLOR)
23
+ CGRectZero
24
+ end
25
+
26
+ def content_height(view)
27
+ height = 0
28
+ view.subviews.each do |sub_view|
29
+ next if sub_view.isHidden
30
+ y = sub_view.frame.origin.y
31
+ h = sub_view.frame.size.height
32
+ if (y + h) > height
33
+ height = y + h
34
+ end
35
+ end
36
+ height
37
+ end
38
+ end
39
+ end