ProMotion 0.6.5 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/README.md +79 -502
  2. data/Rakefile +30 -0
  3. data/app/app_delegate.rb +3 -1
  4. data/lib/ProMotion.rb +1 -1
  5. data/lib/ProMotion/cocoatouch/TableViewCell.rb +5 -1
  6. data/lib/ProMotion/delegate/delegate.rb +16 -0
  7. data/lib/ProMotion/delegate/delegate_helper.rb +88 -0
  8. data/lib/ProMotion/delegate/delegate_notifications.rb +61 -0
  9. data/lib/ProMotion/helpers/console.rb +3 -3
  10. data/lib/ProMotion/helpers/logger.rb +15 -15
  11. data/lib/ProMotion/helpers/view_helper.rb +7 -5
  12. data/lib/ProMotion/push_notifications/push_notification.rb +51 -0
  13. data/lib/ProMotion/screen_helpers/screen_elements.rb +2 -2
  14. data/lib/ProMotion/screen_helpers/screen_navigation.rb +5 -1
  15. data/lib/ProMotion/screen_helpers/screen_tabs.rb +2 -2
  16. data/lib/ProMotion/screens/_compatibility/formotion_screen.rb +65 -0
  17. data/lib/ProMotion/screens/_screen_module.rb +33 -20
  18. data/lib/ProMotion/screens/_table_screen_module.rb +4 -4
  19. data/lib/ProMotion/{screen_helpers → screens}/_tables/_refreshable_table.rb +2 -2
  20. data/lib/ProMotion/{screen_helpers → screens}/_tables/_searchable_table.rb +27 -34
  21. data/lib/ProMotion/screens/_tables/_sectioned_table.rb +5 -0
  22. data/lib/ProMotion/screens/_tables/_table.rb +149 -0
  23. data/lib/ProMotion/screens/_tables/grouped_table.rb +16 -0
  24. data/lib/ProMotion/screens/_tables/plain_table.rb +17 -0
  25. data/lib/ProMotion/screens/_tables/table_data.rb +148 -0
  26. data/lib/ProMotion/screens/_tables/table_view_cell_module.rb +156 -0
  27. data/lib/ProMotion/screens/table_screen.rb +3 -2
  28. data/lib/ProMotion/version.rb +1 -1
  29. data/spec/functional/func_screen_spec.rb +66 -0
  30. data/spec/functional/func_split_screen_spec.rb +66 -0
  31. data/spec/functional/func_table_screen_spec.rb +52 -0
  32. data/spec/helpers/functional_screen.rb +15 -0
  33. data/spec/helpers/table_screen.rb +32 -8
  34. data/spec/helpers/table_screen_refreshable.rb +1 -1
  35. data/spec/helpers/table_screen_searchable.rb +1 -1
  36. data/spec/helpers/test_delegate.rb +2 -0
  37. data/spec/unit/delegate_spec.rb +38 -0
  38. data/spec/{ios_version_spec.rb → unit/ios_version_spec.rb} +0 -0
  39. data/spec/{logger_spec.rb → unit/logger_spec.rb} +0 -0
  40. data/spec/{main_spec.rb → unit/main_spec.rb} +0 -0
  41. data/spec/{screen_helpers_spec.rb → unit/screen_helpers_spec.rb} +14 -6
  42. data/spec/{screen_module_spec.rb → unit/screen_module_spec.rb} +0 -0
  43. data/spec/{screen_spec.rb → unit/screen_spec.rb} +21 -3
  44. data/spec/{split_screen_in_tab_bar_spec.rb → unit/split_screen_in_tab_bar_spec.rb} +0 -0
  45. data/spec/{split_screen_open_screen_spec.rb → unit/split_screen_open_screen_spec.rb} +0 -0
  46. data/spec/{split_screen_spec.rb → unit/split_screen_spec.rb} +0 -0
  47. data/spec/unit/tables/table_module_spec.rb +108 -0
  48. data/spec/unit/tables/table_screen_spec.rb +92 -0
  49. data/spec/unit/tables/table_view_cell_spec.rb +106 -0
  50. data/spec/{view_helper_spec.rb → unit/view_helper_spec.rb} +0 -0
  51. metadata +50 -29
  52. data/lib/ProMotion/delegate.rb +0 -63
  53. data/lib/ProMotion/screen_helpers/_tables/_sectioned_table.rb +0 -270
  54. data/lib/ProMotion/screen_helpers/_tables/grouped_table.rb +0 -14
  55. data/lib/ProMotion/screen_helpers/_tables/plain_table.rb +0 -15
  56. data/spec/table_screen_spec.rb +0 -72
@@ -0,0 +1,106 @@
1
+ describe "PM::TableViewCellModule" do
2
+
3
+ def custom_cell
4
+ {
5
+ title: "Crazy Full Featured Cell",
6
+ subtitle: "This is way too huge...",
7
+ arguments: { data: [ "lots", "of", "data" ] },
8
+ action: :tapped_cell_1,
9
+ height: 50, # manually changes the cell's height
10
+ cell_style: UITableViewCellStyleSubtitle,
11
+ cell_identifier: "Cell",
12
+ cell_class: PM::TableViewCell,
13
+ layer: { masks_to_bounds: true },
14
+ background_color: UIColor.redColor,
15
+ selection_style: UITableViewCellSelectionStyleGray,
16
+ accessory: :switch, # currently only :switch is supported
17
+ accessory_checked: true, # whether it's "checked" or not
18
+ image: { image: UIImage.imageNamed("list"), radius: 15 },
19
+ subviews: [ UIView.alloc.initWithFrame(CGRectZero), UILabel.alloc.initWithFrame(CGRectZero) ] # arbitrary views added to the cell
20
+ }
21
+ end
22
+
23
+ before do
24
+ @screen = TestTableScreen.new
25
+ button = UIButton.buttonWithType(UIButtonTypeRoundedRect).tap{|b| b.titleLabel.text = "ACC" }
26
+ @screen.mock! :table_data do
27
+ [
28
+ { title: "", cells: [] },
29
+ { title: "", cells: [
30
+ {title: "Test 1", accessory_type: UITableViewCellStateShowingEditControlMask },
31
+ custom_cell,
32
+ { title: "Test2", accessory_view: button } ] }
33
+ ]
34
+ end
35
+
36
+ @screen.on_load
37
+
38
+ custom_ip = NSIndexPath.indexPathForRow(1, inSection: 1) # Cell "Crazy Full Featured Cell"
39
+
40
+ @screen.update_table_data
41
+
42
+ @subject = @screen.tableView(@screen.table_view, cellForRowAtIndexPath: custom_ip)
43
+ end
44
+
45
+ it "should be a PM::TableViewCell" do
46
+ @subject.should.be.kind_of(PM::TableViewCell)
47
+ end
48
+
49
+ it "should have the right title" do
50
+ @subject.textLabel.text.should == "Crazy Full Featured Cell"
51
+ end
52
+
53
+ it "should have the right subtitle" do
54
+ @subject.detailTextLabel.text.should == "This is way too huge..."
55
+ end
56
+
57
+ it "should have the right re-use identifier" do
58
+ @subject.reuseIdentifier.should == "Cell"
59
+ end
60
+
61
+ it "should set the layer.masksToBounds" do
62
+ @subject.layer.masksToBounds.should == true
63
+ end
64
+
65
+ it "should set the background color" do
66
+ @subject.backgroundView.backgroundColor.should == UIColor.redColor
67
+ end
68
+
69
+ it "should set the selection color style" do
70
+ @subject.selectionStyle.should == UITableViewCellSelectionStyleGray
71
+ end
72
+
73
+ it "should set the accessory view to a switch" do
74
+ @subject.accessoryView.should.be.kind_of(UISwitch)
75
+ end
76
+
77
+ it "should set the accessory view to a button" do
78
+ ip = NSIndexPath.indexPathForRow(2, inSection: 1)
79
+ subject = @screen.tableView(@screen.table_view, cellForRowAtIndexPath: ip)
80
+ subject.accessoryView.should.be.kind_of(UIRoundedRectButton)
81
+ end
82
+
83
+ it "should set the accessory type to edit" do
84
+ ip = NSIndexPath.indexPathForRow(0, inSection: 1)
85
+ subject = @screen.tableView(@screen.table_view, cellForRowAtIndexPath: ip)
86
+ subject.accessoryView.should.be.nil
87
+ subject.accessoryType.should == UITableViewCellStateShowingEditControlMask
88
+ end
89
+
90
+ it "should set an image with a radius" do
91
+ @subject.imageView.should.be.kind_of(UIImageView)
92
+ @subject.imageView.image.should == UIImage.imageNamed("list")
93
+ @subject.imageView.layer.cornerRadius.should == 15.0
94
+ end
95
+
96
+ it "should create two extra subviews" do
97
+ @subject.subviews.length.should == 4
98
+ @subject.subviews[2].class.should == UIView
99
+ @subject.subviews[3].class.should == UILabel
100
+ end
101
+
102
+
103
+
104
+ end
105
+
106
+
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: 0.6.5
4
+ version: 0.7.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -89,32 +89,43 @@ files:
89
89
  - lib/ProMotion/cocoatouch/TableViewCell.rb
90
90
  - lib/ProMotion/cocoatouch/TableViewController.rb
91
91
  - lib/ProMotion/cocoatouch/ViewController.rb
92
- - lib/ProMotion/delegate.rb
92
+ - lib/ProMotion/delegate/delegate.rb
93
+ - lib/ProMotion/delegate/delegate_helper.rb
94
+ - lib/ProMotion/delegate/delegate_notifications.rb
93
95
  - lib/ProMotion/helpers/console.rb
94
96
  - lib/ProMotion/helpers/logger.rb
95
97
  - lib/ProMotion/helpers/measure_helper.rb
96
98
  - lib/ProMotion/helpers/system_helper.rb
97
99
  - lib/ProMotion/helpers/view_helper.rb
98
100
  - lib/ProMotion/pro_motion.rb
99
- - lib/ProMotion/screen_helpers/_tables/_refreshable_table.rb
100
- - lib/ProMotion/screen_helpers/_tables/_searchable_table.rb
101
- - lib/ProMotion/screen_helpers/_tables/_sectioned_table.rb
102
- - lib/ProMotion/screen_helpers/_tables/grouped_table.rb
103
- - lib/ProMotion/screen_helpers/_tables/plain_table.rb
101
+ - lib/ProMotion/push_notifications/push_notification.rb
104
102
  - lib/ProMotion/screen_helpers/screen_elements.rb
105
103
  - lib/ProMotion/screen_helpers/screen_navigation.rb
106
104
  - lib/ProMotion/screen_helpers/screen_tabs.rb
107
105
  - lib/ProMotion/screen_helpers/split_screen.rb
106
+ - lib/ProMotion/screens/_compatibility/formotion_screen.rb
108
107
  - lib/ProMotion/screens/_screen_module.rb
109
108
  - lib/ProMotion/screens/_table_screen_module.rb
109
+ - lib/ProMotion/screens/_tables/_refreshable_table.rb
110
+ - lib/ProMotion/screens/_tables/_searchable_table.rb
111
+ - lib/ProMotion/screens/_tables/_sectioned_table.rb
112
+ - lib/ProMotion/screens/_tables/_table.rb
113
+ - lib/ProMotion/screens/_tables/grouped_table.rb
114
+ - lib/ProMotion/screens/_tables/plain_table.rb
115
+ - lib/ProMotion/screens/_tables/table_data.rb
116
+ - lib/ProMotion/screens/_tables/table_view_cell_module.rb
110
117
  - lib/ProMotion/screens/behaves_like_screen.rb
111
118
  - lib/ProMotion/screens/screen.rb
112
119
  - lib/ProMotion/screens/table_screen.rb
113
120
  - lib/ProMotion/version.rb
114
121
  - resources/list.png
122
+ - spec/functional/func_screen_spec.rb
123
+ - spec/functional/func_split_screen_spec.rb
124
+ - spec/functional/func_table_screen_spec.rb
115
125
  - spec/helpers/basic_screen.rb
116
126
  - spec/helpers/detail_screen.rb
117
127
  - spec/helpers/dummy_class.rb
128
+ - spec/helpers/functional_screen.rb
118
129
  - spec/helpers/home_screen.rb
119
130
  - spec/helpers/master_screen.rb
120
131
  - spec/helpers/screen_module_view_controller.rb
@@ -122,17 +133,20 @@ files:
122
133
  - spec/helpers/table_screen_refreshable.rb
123
134
  - spec/helpers/table_screen_searchable.rb
124
135
  - spec/helpers/test_delegate.rb
125
- - spec/ios_version_spec.rb
126
- - spec/logger_spec.rb
127
- - spec/main_spec.rb
128
- - spec/screen_helpers_spec.rb
129
- - spec/screen_module_spec.rb
130
- - spec/screen_spec.rb
131
- - spec/split_screen_in_tab_bar_spec.rb
132
- - spec/split_screen_open_screen_spec.rb
133
- - spec/split_screen_spec.rb
134
- - spec/table_screen_spec.rb
135
- - spec/view_helper_spec.rb
136
+ - spec/unit/delegate_spec.rb
137
+ - spec/unit/ios_version_spec.rb
138
+ - spec/unit/logger_spec.rb
139
+ - spec/unit/main_spec.rb
140
+ - spec/unit/screen_helpers_spec.rb
141
+ - spec/unit/screen_module_spec.rb
142
+ - spec/unit/screen_spec.rb
143
+ - spec/unit/split_screen_in_tab_bar_spec.rb
144
+ - spec/unit/split_screen_open_screen_spec.rb
145
+ - spec/unit/split_screen_spec.rb
146
+ - spec/unit/tables/table_module_spec.rb
147
+ - spec/unit/tables/table_screen_spec.rb
148
+ - spec/unit/tables/table_view_cell_spec.rb
149
+ - spec/unit/view_helper_spec.rb
136
150
  homepage: https://github.com/clearsightstudio/ProMotion
137
151
  licenses: []
138
152
  post_install_message:
@@ -161,9 +175,13 @@ summary: ProMotion is a new way to organize RubyMotion apps. Instead of dealing
161
175
  your app and include a ton of great utilities to make iOS development more like
162
176
  Ruby and less like Objective-C.
163
177
  test_files:
178
+ - spec/functional/func_screen_spec.rb
179
+ - spec/functional/func_split_screen_spec.rb
180
+ - spec/functional/func_table_screen_spec.rb
164
181
  - spec/helpers/basic_screen.rb
165
182
  - spec/helpers/detail_screen.rb
166
183
  - spec/helpers/dummy_class.rb
184
+ - spec/helpers/functional_screen.rb
167
185
  - spec/helpers/home_screen.rb
168
186
  - spec/helpers/master_screen.rb
169
187
  - spec/helpers/screen_module_view_controller.rb
@@ -171,14 +189,17 @@ test_files:
171
189
  - spec/helpers/table_screen_refreshable.rb
172
190
  - spec/helpers/table_screen_searchable.rb
173
191
  - spec/helpers/test_delegate.rb
174
- - spec/ios_version_spec.rb
175
- - spec/logger_spec.rb
176
- - spec/main_spec.rb
177
- - spec/screen_helpers_spec.rb
178
- - spec/screen_module_spec.rb
179
- - spec/screen_spec.rb
180
- - spec/split_screen_in_tab_bar_spec.rb
181
- - spec/split_screen_open_screen_spec.rb
182
- - spec/split_screen_spec.rb
183
- - spec/table_screen_spec.rb
184
- - spec/view_helper_spec.rb
192
+ - spec/unit/delegate_spec.rb
193
+ - spec/unit/ios_version_spec.rb
194
+ - spec/unit/logger_spec.rb
195
+ - spec/unit/main_spec.rb
196
+ - spec/unit/screen_helpers_spec.rb
197
+ - spec/unit/screen_module_spec.rb
198
+ - spec/unit/screen_spec.rb
199
+ - spec/unit/split_screen_in_tab_bar_spec.rb
200
+ - spec/unit/split_screen_open_screen_spec.rb
201
+ - spec/unit/split_screen_spec.rb
202
+ - spec/unit/tables/table_module_spec.rb
203
+ - spec/unit/tables/table_screen_spec.rb
204
+ - spec/unit/tables/table_view_cell_spec.rb
205
+ - spec/unit/view_helper_spec.rb
@@ -1,63 +0,0 @@
1
- module ProMotion
2
- class Delegate
3
- include ProMotion::ScreenTabs
4
- include ProMotion::SplitScreen if NSBundle.mainBundle.infoDictionary["UIDeviceFamily"].include?("2") # Only with iPad
5
- attr_accessor :window
6
-
7
- def application(application, didFinishLaunchingWithOptions:launch_options)
8
- unless self.respond_to?(:on_load)
9
- PM.logger.error "Your AppDelegate (usually in app_delegate.rb) needs an on_load(application, options) method."
10
- end
11
-
12
- on_load(application, launch_options)
13
-
14
- true
15
- end
16
-
17
- def app_delegate
18
- UIApplication.sharedApplication.delegate
19
- end
20
-
21
- def app_window
22
- self.app_delegate.window
23
- end
24
-
25
- def home(screen)
26
- screen = screen.new if screen.respond_to?(:new)
27
- @home_screen = screen
28
- end
29
-
30
- def load_root_screen(new_screen)
31
- new_screen = new_screen.pm_main_controller
32
-
33
- self.window ||= self.ui_window.alloc.initWithFrame(UIScreen.mainScreen.bounds)
34
- self.window.rootViewController = new_screen
35
- self.window.makeKeyAndVisible
36
- end
37
-
38
- def ui_window
39
- (defined?(Motion) && defined?(Motion::Xray) && defined?(Motion::Xray::XrayWindow)) ? Motion::Xray::XrayWindow : UIWindow
40
- end
41
-
42
- def open_screen(screen, args={})
43
- home(screen)
44
- open_home_screen
45
- end
46
- alias :open :open_screen
47
- alias :open_root_screen :open_screen
48
-
49
- def open_home_screen
50
- get_home_screen.send(:on_load) if get_home_screen.respond_to?(:on_load)
51
- load_root_screen get_home_screen
52
- end
53
-
54
- def get_home_screen
55
- @home_screen
56
- end
57
-
58
- def has_home_screen
59
- @home_screen.nil? == false
60
- end
61
- end
62
- class AppDelegateParent < Delegate; end # For backwards compatibility
63
- end
@@ -1,270 +0,0 @@
1
- module ProMotion::MotionTable
2
- module SectionedTable
3
- include ProMotion::ViewHelper
4
-
5
- def table_setup
6
- PM.logger.error "Missing #table_data method in TableScreen #{self.class.to_s}." unless self.respond_to?(:table_data)
7
-
8
- self.view = self.create_table_view_from_data(self.table_data)
9
-
10
- if self.class.respond_to?(:get_searchable) && self.class.get_searchable
11
- self.make_searchable(content_controller: self, search_bar: self.class.get_searchable_params)
12
- end
13
- if self.class.respond_to?(:get_refreshable) && self.class.get_refreshable
14
- if defined?(UIRefreshControl)
15
- self.make_refreshable(self.class.get_refreshable_params)
16
- else
17
- PM.logger.warn "To use the refresh control on < iOS 6, you need to include the CocoaPod 'CKRefreshControl'."
18
- end
19
- end
20
- end
21
-
22
- # @param [Array] Array of table data
23
- # @returns [UITableView] delegated to self
24
- def create_table_view_from_data(data)
25
- set_table_view_data data
26
- return table_view
27
- end
28
- alias :createTableViewFromData :create_table_view_from_data
29
-
30
- def update_table_view_data(data)
31
- set_table_view_data data
32
- self.table_view.reloadData
33
- end
34
- alias :updateTableViewData :update_table_view_data
35
-
36
- def set_table_view_data(data)
37
- @mt_table_view_groups = data
38
- end
39
- alias :setTableViewData :set_table_view_data
40
-
41
- def section_at_index(index)
42
- if @mt_filtered
43
- @mt_filtered_data.at(index)
44
- else
45
- @mt_table_view_groups.at(index)
46
- end
47
- end
48
-
49
- def cell_at_section_and_index(section, index)
50
- if section_at_index(section) && section_at_index(section)[:cells]
51
- return section_at_index(section)[:cells].at(index)
52
- end
53
- end
54
- alias :cellAtSectionAndIndex :cell_at_section_and_index
55
-
56
- def trigger_action(action, arguments)
57
- if self.respond_to?(action)
58
- expected_arguments = self.method(action).arity
59
- if expected_arguments == 0
60
- self.send(action)
61
- elsif expected_arguments == 1 || expected_arguments == -1
62
- self.send(action, arguments)
63
- else
64
- PM.logger.warn "#{action} expects #{expected_arguments} arguments. Maximum number of required arguments for an action is 1."
65
- end
66
- else
67
- PM.logger.info "Action not implemented: #{action.to_s}"
68
- end
69
- end
70
-
71
- def accessory_toggled_switch(switch)
72
- table_cell = switch.superview
73
- index_path = table_cell.superview.indexPathForCell(table_cell)
74
-
75
- data_cell = cell_at_section_and_index(index_path.section, index_path.row)
76
- data_cell[:arguments] = {} unless data_cell[:arguments]
77
- data_cell[:arguments][:value] = switch.isOn if data_cell[:arguments].is_a? Hash
78
- data_cell[:accessory_action] ||= data_cell[:accessoryAction] # For legacy support
79
-
80
- trigger_action(data_cell[:accessory_action], data_cell[:arguments]) if data_cell[:accessory_action]
81
- end
82
-
83
- ########## Cocoa touch methods, leave as-is #################
84
- def numberOfSectionsInTableView(table_view)
85
- if @mt_filtered
86
- return @mt_filtered_data.length if @mt_filtered_data
87
- else
88
- return @mt_table_view_groups.length if @mt_table_view_groups
89
- end
90
- 0
91
- end
92
-
93
- # Number of cells
94
- def tableView(table_view, numberOfRowsInSection:section)
95
- return section_at_index(section)[:cells].length if section_at_index(section) && section_at_index(section)[:cells]
96
- 0
97
- end
98
-
99
- def tableView(table_view, titleForHeaderInSection:section)
100
- return section_at_index(section)[:title] if section_at_index(section) && section_at_index(section)[:title]
101
- end
102
-
103
- # Set table_data_index if you want the right hand index column (jumplist)
104
- def sectionIndexTitlesForTableView(table_view)
105
- if self.respond_to?(:table_data_index)
106
- self.table_data_index
107
- end
108
- end
109
-
110
- def remap_data_cell(data_cell)
111
- # Re-maps legacy data cell calls
112
- mappings = {
113
- cell_style: :cellStyle,
114
- cell_identifier: :cellIdentifier,
115
- cell_class: :cellClass,
116
- masks_to_bounds: :masksToBounds,
117
- background_color: :backgroundColor,
118
- selection_style: :selectionStyle,
119
- cell_class_attributes: :cellClassAttributes,
120
- accessory_view: :accessoryView,
121
- accessory_type: :accessoryType,
122
- accessory_checked: :accessoryDefault,
123
- remote_image: :remoteImage,
124
- subviews: :subViews
125
- }
126
- mappings.each_pair do |n, old|
127
- if data_cell[old]
128
- warn "[DEPRECATION] `:#{old}` is deprecated in TableScreens. Use `:#{n}`"
129
- data_cell[n] = data_cell[old]
130
- end
131
- end
132
- if data_cell[:styles] && data_cell[:styles][:textLabel]
133
- warn "[DEPRECATION] `:textLabel` is deprecated in TableScreens. Use `:label`"
134
- data_cell[:styles][:label] = data_cell[:styles][:textLabel]
135
- end
136
- data_cell
137
- end
138
-
139
- def tableView(table_view, cellForRowAtIndexPath:index_path)
140
- data_cell = cell_at_section_and_index(index_path.section, index_path.row)
141
- return UITableViewCell.alloc.init unless data_cell
142
-
143
- data_cell = self.remap_data_cell(data_cell)
144
-
145
- data_cell[:cell_style] ||= UITableViewCellStyleDefault
146
- data_cell[:cell_identifier] ||= "Cell"
147
- cell_identifier = data_cell[:cell_identifier]
148
- data_cell[:cell_class] ||= ProMotion::TableViewCell
149
-
150
- table_cell = table_view.dequeueReusableCellWithIdentifier(cell_identifier)
151
- unless table_cell
152
- table_cell = data_cell[:cell_class].alloc.initWithStyle(data_cell[:cell_style], reuseIdentifier:cell_identifier)
153
-
154
- # Add optimizations here
155
- table_cell.layer.masksToBounds = true if data_cell[:masks_to_bounds]
156
- table_cell.backgroundColor = data_cell[:background_color] if data_cell[:background_color]
157
- table_cell.selectionStyle = data_cell[:selection_style] if data_cell[:selection_style]
158
- table_cell.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin
159
- end
160
-
161
- if data_cell[:cell_class_attributes]
162
- set_attributes table_cell, data_cell[:cell_class_attributes]
163
- end
164
-
165
- if data_cell[:accessory_view]
166
- table_cell.accessoryView = data_cell[:accessory_view]
167
- table_cell.accessoryView.autoresizingMask = UIViewAutoresizingFlexibleWidth
168
- end
169
-
170
- if data_cell[:accessory_type]
171
- table_cell.accessoryType = data_cell[:accessory_type]
172
- end
173
-
174
- if data_cell[:accessory] && data_cell[:accessory] == :switch
175
- switch_view = UISwitch.alloc.initWithFrame(CGRectZero)
176
- switch_view.addTarget(self, action: "accessory_toggled_switch:", forControlEvents:UIControlEventValueChanged)
177
- switch_view.on = true if data_cell[:accessory_checked]
178
- table_cell.accessoryView = switch_view
179
- end
180
-
181
- if data_cell[:subtitle] and table_cell.detailTextLabel
182
- table_cell.detailTextLabel.text = data_cell[:subtitle]
183
- table_cell.detailTextLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth
184
- end
185
-
186
- table_cell.selectionStyle = UITableViewCellSelectionStyleNone if data_cell[:no_select]
187
-
188
- if data_cell[:remote_image]
189
- if table_cell.imageView.respond_to?("setImageWithURL:placeholderImage:")
190
- url = data_cell[:remote_image][:url]
191
- url = NSURL.URLWithString(url) unless url.is_a?(NSURL)
192
- placeholder = data_cell[:remote_image][:placeholder]
193
- placeholder = UIImage.imageNamed(placeholder) if placeholder.is_a?(String)
194
-
195
- table_cell.image_size = data_cell[:remote_image][:size] if data_cell[:remote_image][:size] && table_cell.respond_to?("image_size=")
196
- table_cell.imageView.setImageWithURL(url, placeholderImage: placeholder)
197
- table_cell.imageView.layer.masksToBounds = true
198
- table_cell.imageView.layer.cornerRadius = data_cell[:remote_image][:radius] if data_cell[:remote_image].has_key?(:radius)
199
- else
200
- PM.logger.error "ProMotion Warning: to use remote_image with TableScreen you need to include the CocoaPod 'SDWebImage'."
201
- end
202
- elsif data_cell[:image]
203
- table_cell.imageView.layer.masksToBounds = true
204
- table_cell.imageView.image = data_cell[:image][:image]
205
- table_cell.imageView.layer.cornerRadius = data_cell[:image][:radius] if data_cell[:image][:radius]
206
- end
207
-
208
- if data_cell[:subviews]
209
- tag_number = 0
210
- data_cell[:subviews].each do |view|
211
- # Remove an existing view at that tag number
212
- tag_number += 1
213
- existing_view = table_cell.viewWithTag(tag_number)
214
- existing_view.removeFromSuperview if existing_view
215
-
216
- # Add the subview if it exists
217
- if view
218
- view.tag = tag_number
219
- table_cell.addSubview view
220
- end
221
- end
222
- end
223
-
224
- if data_cell[:details]
225
- table_cell.addSubview data_cell[:details][:image]
226
- end
227
-
228
- if data_cell[:styles] && data_cell[:styles][:label] && data_cell[:styles][:label][:frame]
229
- ui_label = false
230
- table_cell.contentView.subviews.each do |view|
231
- if view.is_a? UILabel
232
- ui_label = true
233
- view.text = data_cell[:styles][:label][:text]
234
- end
235
- end
236
-
237
- unless ui_label == true
238
- label ||= UILabel.alloc.initWithFrame(CGRectZero)
239
- set_attributes label, data_cell[:styles][:label]
240
- table_cell.contentView.addSubview label
241
- end
242
- # hackery
243
- table_cell.textLabel.textColor = UIColor.clearColor
244
- else
245
- cell_title = data_cell[:title]
246
- cell_title ||= ""
247
- table_cell.textLabel.text = cell_title
248
- end
249
-
250
- return table_cell
251
- end
252
-
253
- def tableView(tableView, heightForRowAtIndexPath:index_path)
254
- cell = cell_at_section_and_index(index_path.section, index_path.row)
255
- if cell[:height]
256
- cell[:height].to_f
257
- else
258
- tableView.rowHeight
259
- end
260
- end
261
-
262
- def tableView(table_view, didSelectRowAtIndexPath:index_path)
263
- cell = cell_at_section_and_index(index_path.section, index_path.row)
264
- table_view.deselectRowAtIndexPath(index_path, animated: true)
265
- cell[:arguments] ||= {}
266
- cell[:arguments][:cell] = cell if cell[:arguments].is_a?(Hash)
267
- trigger_action(cell[:action], cell[:arguments]) if cell[:action]
268
- end
269
- end
270
- end