ProMotion 2.0.0 → 2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 14987f5aeab8920859f57503394853b2df7d89bb
4
- data.tar.gz: ecdd5d911f9642b4b2bebc68f2741bc21ea71e7f
3
+ metadata.gz: 26a3f842a22164f1646fa4c70c06717331c37b37
4
+ data.tar.gz: b71313bd4e58fd83a405e8741c264547b80e0f19
5
5
  SHA512:
6
- metadata.gz: 74a9842f7871a930fd367c216c6a54a131869c6ce2c8d8be355265f8a4af37347da4a887fa6977dbcaf2973ce843394bfa08c02e5ca09b293321fd5da22692ce
7
- data.tar.gz: 3d42d49c8f5993725fb564deb77d76a6bccf59d493c0c8c4c59427c86692afb330b63374419714db098b46029661ed42f16ed5829516136be920db06ae2b615d
6
+ metadata.gz: 309c74e1577110e7c0ab397fe120a367f77343b11f5cfb4813bd99e6f942f89d463eadc36fc143324c49b7fd428ba50191c896246a91dddb17f6d05048eac843
7
+ data.tar.gz: c0dbd687ecb04bdea39a131e9b8313da6b12ca5b3a83fc7ab8a6ee915b4efc8ead92fb10247c16613907167f83c877c441078b2da22408003ef5f0212f91ce62
@@ -1,5 +1,13 @@
1
1
  module ProMotion
2
2
  class NavigationController < UINavigationController
3
+
4
+ def popViewControllerAnimated(animated)
5
+ if self.viewControllers[-2].respond_to? :on_back
6
+ self.viewControllers[-2].send(:on_back)
7
+ end
8
+ super animated
9
+ end
10
+
3
11
  def shouldAutorotate
4
12
  visibleViewController.shouldAutorotate
5
13
  end
@@ -11,5 +19,6 @@ module ProMotion
11
19
  def preferredInterfaceOrientationForPresentation
12
20
  visibleViewController.preferredInterfaceOrientationForPresentation
13
21
  end
22
+
14
23
  end
15
24
  end
@@ -34,7 +34,31 @@ module ProMotion
34
34
  end
35
35
 
36
36
  def find_tab(tab_title)
37
- self.viewControllers.find { |vc| vc.tabBarItem.title == tab_title }
37
+ viewControllers.find { |vc| vc.tabBarItem.title == tab_title }
38
+ end
39
+
40
+ # Cocoa touch methods below
41
+
42
+ def shouldAutorotate
43
+ current_view_controller_try(:shouldAutorotate)
44
+ end
45
+
46
+ def supportedInterfaceOrientations
47
+ current_view_controller_try(:supportedInterfaceOrientations)
48
+ end
49
+
50
+ def preferredInterfaceOrientationForPresentation
51
+ current_view_controller_try(:preferredInterfaceOrientationForPresentation)
52
+ end
53
+
54
+ private
55
+
56
+ def current_view_controller
57
+ selectedViewController || viewControllers.first
58
+ end
59
+
60
+ def current_view_controller_try(method, *args)
61
+ current_view_controller.send(method, *args) if current_view_controller.respond_to?(method)
38
62
  end
39
63
 
40
64
  end
@@ -70,15 +70,21 @@ module ProMotion
70
70
  end
71
71
 
72
72
  def bar_button_item_image(img, args)
73
- UIBarButtonItem.alloc.initWithImage(img, style: map_bar_button_item_style(args[:style]), target: args[:target] || self, action: args[:action])
73
+ button = UIBarButtonItem.alloc.initWithImage(img, style: map_bar_button_item_style(args[:style]), target: args[:target] || self, action: args[:action])
74
+ button.setTintColor args[:tint_color] if args[:tint_color]
75
+ button
74
76
  end
75
77
 
76
78
  def bar_button_item_string(str, args)
77
- UIBarButtonItem.alloc.initWithTitle(str, style: map_bar_button_item_style(args[:style]), target: args[:target] || self, action: args[:action])
79
+ button = UIBarButtonItem.alloc.initWithTitle(str, style: map_bar_button_item_style(args[:style]), target: args[:target] || self, action: args[:action])
80
+ button.setTintColor args[:tint_color] if args[:tint_color]
81
+ button
78
82
  end
79
83
 
80
84
  def bar_button_item_system_item(args)
81
- UIBarButtonItem.alloc.initWithBarButtonSystemItem(map_bar_button_system_item(args[:system_item]), target: args[:target] || self, action: args[:action])
85
+ button = UIBarButtonItem.alloc.initWithBarButtonSystemItem(map_bar_button_system_item(args[:system_item]), target: args[:target] || self, action: args[:action])
86
+ button.setTintColor args[:tint_color] if args[:tint_color]
87
+ button
82
88
  end
83
89
 
84
90
  def bar_button_item_custom(custom_view)
@@ -27,7 +27,7 @@ module ProMotion
27
27
  case self.class.title_type
28
28
  when :text then self.title = self.class.title
29
29
  when :view then self.navigationItem.titleView = self.class.title
30
- when :image then self.navigationItem.titleView = UIImageView.alloc.initWithImage(UIImage.imageNamed(self.class.title))
30
+ when :image then self.navigationItem.titleView = UIImageView.alloc.initWithImage(self.class.title)
31
31
  else
32
32
  PM.logger.warn("title expects string, UIView, or UIImage, but #{self.class.title.class.to_s} given.")
33
33
  end
@@ -178,7 +178,7 @@ module ProMotion
178
178
  end
179
179
 
180
180
  def title_image(t)
181
- @title = t
181
+ @title = t.is_a?(UIImage) ? t : UIImage.imageNamed(t)
182
182
  @title_type = :image
183
183
  end
184
184
 
@@ -0,0 +1,7 @@
1
+ class DummyImageView < UIImageView
2
+ private
3
+
4
+ def dummy
5
+ imageForURL(nil, completionBlock:nil)
6
+ end
7
+ end
@@ -1,5 +1,7 @@
1
1
  module ProMotion
2
2
  class TableData
3
+ include ProMotion::Table::Utils
4
+
3
5
  attr_accessor :data, :filtered_data, :search_string, :original_search_string, :filtered, :table_view
4
6
 
5
7
  def initialize(data, table_view)
@@ -21,36 +23,23 @@ module ProMotion
21
23
  end
22
24
 
23
25
  def cell(params={})
24
- if params[:index_path]
25
- params[:section] = params[:index_path].section
26
- params[:index] = params[:index_path].row
27
- end
28
-
26
+ params = index_path_to_section_index(params)
29
27
  table_section = self.section(params[:section])
30
28
  c = table_section[:cells].at(params[:index].to_i)
31
29
  set_data_cell_defaults c
32
30
  end
33
31
 
34
32
  def delete_cell(params={})
35
- if params[:index_path]
36
- params[:section] = params[:index_path].section
37
- params[:index] = params[:index_path].row
38
- end
39
-
33
+ params = index_path_to_section_index(params)
40
34
  table_section = self.section(params[:section])
41
35
  table_section[:cells].delete_at(params[:index].to_i)
42
36
  end
43
37
 
44
38
  def search(search_string)
45
- self.filtered_data = []
46
- self.filtered = true
47
-
48
- self.original_search_string = search_string
49
- self.search_string = search_string.downcase.strip
39
+ start_searching(search_string)
50
40
 
51
41
  self.data.compact.each do |section|
52
42
  new_section = {}
53
- new_section[:cells] = []
54
43
 
55
44
  new_section[:cells] = section[:cells].map do |cell|
56
45
  cell[:searchable] != false && "#{cell[:title]}\n#{cell[:search_text]}".downcase.strip.include?(self.search_string) ? cell : nil
@@ -99,5 +88,13 @@ module ProMotion
99
88
  ident
100
89
  end
101
90
 
91
+ private
92
+
93
+ def start_searching(search_string)
94
+ self.filtered_data = []
95
+ self.filtered = true
96
+ self.search_string = search_string.downcase.strip
97
+ self.original_search_string = search_string
98
+ end
102
99
  end
103
100
  end
@@ -17,7 +17,7 @@ module ProMotion
17
17
  gesture_point = gesture.locationInView(table_view)
18
18
  index_path = table_view.indexPathForRowAtPoint(gesture_point)
19
19
  data_cell = self.promotion_table_data.cell(index_path: index_path)
20
- trigger_action(data_cell[:long_press_action], data_cell[:arguments]) if data_cell[:long_press_action]
20
+ trigger_action(data_cell[:long_press_action], data_cell[:arguments], index_path) if data_cell[:long_press_action]
21
21
  end
22
22
  end
23
23
  end
@@ -2,6 +2,7 @@ module ProMotion
2
2
  class GroupedTableScreen < TableViewController
3
3
  include ProMotion::ScreenModule
4
4
  include ProMotion::Table
5
+ include ProMotion::Table::Utils # Workaround until https://hipbyte.freshdesk.com/support/tickets/2086 is fixed.
5
6
  include ProMotion::GroupedTable
6
7
  end
7
8
  end
@@ -5,6 +5,7 @@ module ProMotion
5
5
  include ProMotion::Table::Refreshable
6
6
  include ProMotion::Table::Indexable
7
7
  include ProMotion::Table::Longpressable
8
+ include ProMotion::Table::Utils
8
9
 
9
10
  attr_reader :promotion_table_data
10
11
 
@@ -67,10 +68,14 @@ module ProMotion
67
68
  @table_search_display_controller.searchResultsTableView.reloadData if searching?
68
69
  end
69
70
 
70
- def trigger_action(action, arguments)
71
+ def trigger_action(action, arguments, index_path)
71
72
  return PM.logger.info "Action not implemented: #{action.to_s}" unless self.respond_to?(action)
72
- return self.send(action) if self.method(action).arity == 0
73
- self.send(action, arguments)
73
+
74
+ case self.method(action).arity
75
+ when 0 then self.send(action) # Just call the method
76
+ when 2 then self.send(action, arguments, index_path) # Send arguments and index path
77
+ else self.send(action, arguments) # Send arguments
78
+ end
74
79
  end
75
80
 
76
81
  def accessory_toggled_switch(switch)
@@ -79,9 +84,8 @@ module ProMotion
79
84
 
80
85
  if index_path
81
86
  data_cell = promotion_table_data.cell(section: index_path.section, index: index_path.row)
82
- data_cell[:accessory][:arguments] ||= {}
83
87
  data_cell[:accessory][:arguments][:value] = switch.isOn if data_cell[:accessory][:arguments].is_a?(Hash)
84
- trigger_action(data_cell[:accessory][:action], data_cell[:accessory][:arguments]) if data_cell[:accessory][:action]
88
+ trigger_action(data_cell[:accessory][:action], data_cell[:accessory][:arguments], index_path) if data_cell[:accessory][:action]
85
89
  end
86
90
  end
87
91
 
@@ -106,14 +110,6 @@ module ProMotion
106
110
  create_table_cell(data_cell)
107
111
  end
108
112
 
109
- def index_path_to_section_index(params)
110
- if params[:index_path]
111
- params[:section] = params[:index_path].section
112
- params[:index] = params[:index_path].row
113
- end
114
- params
115
- end
116
-
117
113
  def create_table_cell(data_cell)
118
114
  table_cell = table_view.dequeueReusableCellWithIdentifier(data_cell[:cell_identifier]) || begin
119
115
  table_cell = data_cell[:cell_class].alloc.initWithStyle(data_cell[:cell_style], reuseIdentifier:data_cell[:cell_identifier])
@@ -171,7 +167,7 @@ module ProMotion
171
167
  def tableView(table_view, didSelectRowAtIndexPath:index_path)
172
168
  data_cell = self.promotion_table_data.cell(index_path: index_path)
173
169
  table_view.deselectRowAtIndexPath(index_path, animated: true) unless data_cell[:keep_selection] == true
174
- trigger_action(data_cell[:action], data_cell[:arguments]) if data_cell[:action]
170
+ trigger_action(data_cell[:action], data_cell[:arguments], index_path) if data_cell[:action]
175
171
  end
176
172
 
177
173
  def tableView(table_view, editingStyleForRowAtIndexPath: index_path)
@@ -0,0 +1,13 @@
1
+ module ProMotion
2
+ module Table
3
+ module Utils
4
+ def index_path_to_section_index(params)
5
+ if params[:index_path]
6
+ params[:section] = params[:index_path].section
7
+ params[:index] = params[:index_path].row
8
+ end
9
+ params
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module ProMotion
2
- VERSION = "2.0.0" unless defined?(ProMotion::VERSION)
2
+ VERSION = "2.0.1" unless defined?(ProMotion::VERSION)
3
3
  end
@@ -68,6 +68,25 @@ describe "ProMotion::Screen functionality" do
68
68
  end
69
69
  end
70
70
 
71
+ it "should call the on_back method on the root controller when navigating back" do
72
+ @nav_screen = NavigationScreen.new nav_bar: true
73
+ @presented_screen = PresentScreen.new
74
+ @nav_screen.open @presented_screen
75
+ @presented_screen.close
76
+ @nav_screen.on_back_fired.should == true
77
+ end
78
+
79
+ it "should call the correct on_back method when nesting screens" do
80
+ @base_screen = NavigationScreen.new nav_bar: true
81
+ @child_screen = @base_screen.open NavigationScreen.new
82
+ @grandchild_screen = @child_screen.open NavigationScreen.new
83
+
84
+ # start closing
85
+ @grandchild_screen.close
86
+ @child_screen.on_back_fired.should == true
87
+ @child_screen.close
88
+ @base_screen.on_back_fired.should == true
89
+ end
71
90
 
72
91
  it "should allow opening and closing a modal screen" do
73
92
  @basic = BasicScreen.new(nav_bar: true)
@@ -99,27 +99,6 @@ describe "ProMotion::TableScreen functionality" do
99
99
  end
100
100
  end
101
101
 
102
- it "should call a method when the switch is flipped" do
103
- table_screen.scroll_to_bottom
104
- tap "switch_1"
105
- wait 0.3 do
106
- table_screen.tap_counter.should == 1
107
- end
108
- end
109
-
110
- it "should call the method with arguments when the switch is flipped and when the cell is tapped" do
111
- table_screen.scroll_to_bottom
112
- tap "switch_3"
113
- wait 0.3 do
114
- table_screen.tap_counter.should == 3
115
-
116
- tap "Switch With Cell Tap, Switch Action And Parameters"
117
- wait 0.3 do
118
- table_screen.tap_counter.should == 13
119
- end
120
- end
121
- end
122
-
123
102
  it "should not crash if cell with editing_style is swiped left" do
124
103
  Proc.new { flick("Just another deletable blank row", to: :left) }.should.not.raise(StandardError)
125
104
  end
@@ -1,9 +1,19 @@
1
- describe "ProMotion::Screen UIImage title" do
1
+ describe "ProMotion::Screen UIImage string title" do
2
2
  def controller
3
3
  @controller = ImageTitleScreen.new(nav_bar: true)
4
4
  end
5
5
 
6
- it "should allow an image title" do
6
+ it "should allow an image title as a String" do
7
+ controller.navigationItem.titleView.should.be.kind_of UIImageView
8
+ end
9
+ end
10
+
11
+ describe "ProMotion::Screen UIImage title" do
12
+ def controller
13
+ @controller = UIImageTitleScreen.new(nav_bar: true)
14
+ end
15
+
16
+ it "should allow an image title as a UIImage" do
7
17
  controller.navigationItem.titleView.should.be.kind_of UIImageView
8
18
  end
9
19
  end
@@ -268,3 +268,26 @@ describe "screen with toolbar" do
268
268
  end
269
269
 
270
270
  end
271
+
272
+ describe 'toolbar tinted buttons' do
273
+ before do
274
+ @screen = HomeScreen.new modal: true, nav_bar: true, toolbar: true
275
+ @screen.on_load
276
+ end
277
+
278
+ it "creates string toolbar buttons with tint colors" do
279
+ @screen.set_toolbar_button([{title: "Testing Toolbar", tint_color: UIColor.redColor}])
280
+ @screen.navigationController.toolbar.items.first.tintColor.should == UIColor.redColor
281
+ end
282
+
283
+ it "creates image toolbar buttons with tint colors" do
284
+ @screen.set_toolbar_button([{image: UIImage.imageNamed("list"), tint_color: UIColor.redColor}])
285
+ @screen.navigationController.toolbar.items.first.tintColor.should == UIColor.redColor
286
+ end
287
+
288
+ it "creates system item toolbar buttons with tint colors" do
289
+ @screen.set_toolbar_button([{system_item: :reply, tint_color: UIColor.redColor}])
290
+ @screen.navigationController.toolbar.items.first.tintColor.should == UIColor.redColor
291
+ end
292
+
293
+ end
@@ -74,6 +74,9 @@ describe "PM::Tabs" do
74
74
  tab_bar.selectedIndex.should == 0
75
75
  end
76
76
 
77
-
77
+ it "should recognize setting #should_autorotate in screen" do
78
+ @screen1.stub! :should_autorotate, return: false
79
+ @tab_bar.shouldAutorotate.should == false
80
+ end
78
81
 
79
82
  end
@@ -51,6 +51,8 @@ describe "PM::Table module" do
51
51
  title: "Custom section title 1", title_view: CustomTitleView, cells: [ ]
52
52
  },{
53
53
  title: "Custom section title 2", title_view: CustomTitleView.new, title_view_height: 50, cells: [ ]
54
+ },{
55
+ title: "Action WIth Index Path Group", cells: [ cell_factory(title: "IndexPath Group 1", action: :tests_index_path) ]
54
56
  }]
55
57
  end
56
58
 
@@ -63,7 +65,7 @@ describe "PM::Table module" do
63
65
  end
64
66
 
65
67
  it "should have the right number of sections" do
66
- @subject.numberOfSectionsInTableView(@subject.table_view).should == 6
68
+ @subject.numberOfSectionsInTableView(@subject.table_view).should == 7
67
69
  end
68
70
 
69
71
  it "should set the section titles" do
@@ -115,6 +117,17 @@ describe "PM::Table module" do
115
117
  @subject.tableView(@subject.table_view, didSelectRowAtIndexPath:@custom_ip)
116
118
  end
117
119
 
120
+ it "should return an NSIndexPath when the action has two parameters" do
121
+ ip = NSIndexPath.indexPathForRow(0, inSection: 6)
122
+
123
+ @subject.tableView(@subject.table_view, didSelectRowAtIndexPath:ip)
124
+
125
+ tapped_ip = @subject.got_index_path
126
+ tapped_ip.should.be.kind_of NSIndexPath
127
+ tapped_ip.section.should == 6
128
+ tapped_ip.row.should == 0
129
+ end
130
+
118
131
  # TODO - make this test work when MacBacon supports long press gestures
119
132
  # https://github.com/HipByte/RubyMotion/issues/160
120
133
  #
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ProMotion
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamon Holmgren
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-08-03 00:00:00.000000000 Z
13
+ date: 2014-09-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: methadone
@@ -113,6 +113,7 @@ files:
113
113
  - lib/ProMotion/screen/screen.rb
114
114
  - lib/ProMotion/screen/screen_module.rb
115
115
  - lib/ProMotion/screen/screen_navigation.rb
116
+ - lib/ProMotion/stubs/dummy_image_view.rb
116
117
  - lib/ProMotion/stubs/dummy_view.rb
117
118
  - lib/ProMotion/styling/styling.rb
118
119
  - lib/ProMotion/table/cell/table_view_cell_module.rb
@@ -125,6 +126,7 @@ files:
125
126
  - lib/ProMotion/table/grouped_table_screen.rb
126
127
  - lib/ProMotion/table/table.rb
127
128
  - lib/ProMotion/table/table_screen.rb
129
+ - lib/ProMotion/table/table_utils.rb
128
130
  - lib/ProMotion/tabs/tabs.rb
129
131
  - lib/ProMotion/version.rb
130
132
  - lib/ProMotion/web/web_screen.rb