ProMotion 0.7.5 → 0.7.6
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/.travis.yml +1 -1
- data/README.md +34 -3
- data/lib/ProMotion/helpers/view_helper.rb +2 -2
- data/lib/ProMotion/screen_helpers/screen_navigation.rb +19 -13
- data/lib/ProMotion/screens/_screen_module.rb +12 -11
- data/lib/ProMotion/screens/_tables/_searchable_table.rb +4 -4
- data/lib/ProMotion/screens/_tables/_table.rb +9 -3
- data/lib/ProMotion/version.rb +1 -1
- data/spec/functional/func_table_screen_spec.rb +6 -6
- data/spec/unit/screen_helpers_spec.rb +34 -4
- metadata +2 -2
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,38 @@
|
|
1
|
-
# ProMotion [](https://travis-ci.org/clearsightstudio/ProMotion)
|
1
|
+
# ProMotion [](https://travis-ci.org/clearsightstudio/ProMotion) [](https://codeclimate.com/github/clearsightstudio/ProMotion)
|
2
2
|
|
3
3
|
## A new way to easily build RubyMotion apps.
|
4
4
|
|
5
|
-
ProMotion is a RubyMotion gem that makes iOS development more like Ruby and less like Objective-C.
|
5
|
+
ProMotion is a RubyMotion gem that makes iOS development more like Ruby and less like Objective-C. It introduces a clean, Ruby-style syntax for building screens that is easy to learn and remember.
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
class AppDelegate < PM::Delegate
|
9
|
+
def on_load(app, options)
|
10
|
+
open RootScreen.new(nav_bar: true)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class RootScreen < PM::Screen
|
15
|
+
title "Root Screen"
|
16
|
+
|
17
|
+
def push_new_screen
|
18
|
+
open NewScreen
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class NewScreen < PM::TableScreen
|
23
|
+
title "Table Screen"
|
24
|
+
|
25
|
+
def table_data
|
26
|
+
[{
|
27
|
+
cells: [
|
28
|
+
{ title: "About this app", action: :tapped_about },
|
29
|
+
{ title: "Log out", action: :log_out }
|
30
|
+
]
|
31
|
+
}]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
6
36
|
|
7
37
|
Featured on the RubyMotion blog: [http://blog.rubymotion.com/post/50523137515/introducing-promotion-a-full-featured-rubymotion](http://blog.rubymotion.com/post/50523137515/introducing-promotion-a-full-featured-rubymotion)
|
8
38
|
|
@@ -506,6 +536,7 @@ incorporated.
|
|
506
536
|
* Jamon Holmgren: [@jamonholmgren](https://twitter.com/jamonholmgren)
|
507
537
|
* Silas Matson: [@silasjmatson](https://twitter.com/silasjmatson)
|
508
538
|
* Matt Brewer: [@macfanatic](https://twitter.com/macfanatic)
|
539
|
+
* Mark Rickert: [@markrickert](https://twitter.com/markrickert)
|
509
540
|
* [Many others](https://github.com/clearsightstudio/ProMotion/graphs/contributors)
|
510
|
-
*
|
541
|
+
* Run `git shortlog -s -n -e` to see everyone who has contributed.
|
511
542
|
|
@@ -69,9 +69,9 @@ module ProMotion
|
|
69
69
|
height
|
70
70
|
end
|
71
71
|
|
72
|
-
def closest_parent(type)
|
72
|
+
def closest_parent(type, this_view = nil)
|
73
73
|
# iterate up the view hierarchy to find the parent element of "type" containing this view
|
74
|
-
this_view
|
74
|
+
this_view ||= self.superview
|
75
75
|
while this_view != nil do
|
76
76
|
return this_view if this_view.is_a? type
|
77
77
|
this_view = this_view.superview
|
@@ -2,13 +2,13 @@ module ProMotion
|
|
2
2
|
module ScreenNavigation
|
3
3
|
|
4
4
|
def open_screen(screen, args = {})
|
5
|
+
args = { in_detail: false, in_master: false, close_all: false, modal: false, in_tab: false, animated: true }.merge args
|
5
6
|
|
6
7
|
# Apply properties to instance
|
7
|
-
screen =
|
8
|
+
screen = set_up_screen_for_open(screen, args)
|
8
9
|
ensure_wrapper_controller_in_place(screen, args)
|
9
10
|
|
10
11
|
screen.send(:on_load) if screen.respond_to?(:on_load)
|
11
|
-
animated = args[:animated] || true
|
12
12
|
|
13
13
|
if args[:in_detail] && self.split_screen
|
14
14
|
self.split_screen.detail_screen = screen
|
@@ -20,7 +20,7 @@ module ProMotion
|
|
20
20
|
open_root_screen screen
|
21
21
|
|
22
22
|
elsif args[:modal]
|
23
|
-
present_modal_view_controller screen, animated
|
23
|
+
present_modal_view_controller screen, args[:animated]
|
24
24
|
|
25
25
|
elsif args[:in_tab] && self.tab_bar
|
26
26
|
present_view_controller_in_tab_bar_controller screen, args[:in_tab]
|
@@ -51,7 +51,7 @@ module ProMotion
|
|
51
51
|
def close_screen(args = {})
|
52
52
|
args ||= {}
|
53
53
|
args = { sender: args } unless args.is_a?(Hash)
|
54
|
-
args[:animated]
|
54
|
+
args[:animated] = true unless args.has_key?(:animated)
|
55
55
|
|
56
56
|
if self.modal?
|
57
57
|
close_modal_screen args
|
@@ -69,7 +69,7 @@ module ProMotion
|
|
69
69
|
|
70
70
|
def send_on_return(args = {})
|
71
71
|
if self.parent_screen && self.parent_screen.respond_to?(:on_return)
|
72
|
-
if args
|
72
|
+
if args && self.parent_screen.method(:on_return).arity != 0
|
73
73
|
self.parent_screen.send(:on_return, args)
|
74
74
|
else
|
75
75
|
self.parent_screen.send(:on_return)
|
@@ -88,20 +88,23 @@ module ProMotion
|
|
88
88
|
end
|
89
89
|
nav_controller ||= self.navigation_controller
|
90
90
|
vc.first_screen = false if vc.respond_to?(:first_screen=)
|
91
|
+
vc.navigation_controller = nav_controller if vc.respond_to?(:navigation_controller=)
|
91
92
|
nav_controller.pushViewController(vc, animated: true)
|
92
93
|
end
|
93
94
|
|
94
95
|
protected
|
95
96
|
|
96
|
-
def
|
97
|
+
def set_up_screen_for_open(screen, args={})
|
97
98
|
|
98
99
|
# Instantiate screen if given a class
|
99
100
|
screen = screen.new if screen.respond_to?(:new)
|
101
|
+
|
102
|
+
# Set parent
|
103
|
+
screen.parent_screen = self if screen.respond_to?(:parent_screen=)
|
100
104
|
|
101
|
-
# Set
|
102
|
-
screen.
|
103
|
-
screen.
|
104
|
-
screen.modal = args[:modal] if args[:modal] && screen.respond_to?("modal=")
|
105
|
+
# Set title & modal properties
|
106
|
+
screen.title = args[:title] if args[:title] && screen.respond_to?(:title=)
|
107
|
+
screen.modal = args[:modal] if args[:modal] && screen.respond_to?(:modal=)
|
105
108
|
|
106
109
|
# Hide bottom bar?
|
107
110
|
screen.hidesBottomBarWhenPushed = args[:hide_tab_bar] == true
|
@@ -115,7 +118,7 @@ module ProMotion
|
|
115
118
|
end
|
116
119
|
|
117
120
|
def ensure_wrapper_controller_in_place(screen, args={})
|
118
|
-
unless args[:close_all] || args[:modal]
|
121
|
+
unless args[:close_all] || args[:modal] || args[:in_detail] || args[:in_master]
|
119
122
|
screen.navigation_controller ||= self.navigation_controller if screen.respond_to?("navigation_controller=")
|
120
123
|
screen.tab_bar ||= self.tab_bar if screen.respond_to?("tab_bar=")
|
121
124
|
end
|
@@ -144,14 +147,14 @@ module ProMotion
|
|
144
147
|
end
|
145
148
|
|
146
149
|
def close_modal_screen(args={})
|
147
|
-
args[:animated]
|
150
|
+
args[:animated] = true unless args.has_key?(:animated)
|
148
151
|
self.parent_screen.dismissViewControllerAnimated(args[:animated], completion: lambda {
|
149
152
|
send_on_return(args)
|
150
153
|
})
|
151
154
|
end
|
152
155
|
|
153
156
|
def close_nav_screen(args={})
|
154
|
-
args[:animated]
|
157
|
+
args[:animated] = true unless args.has_key?(:animated)
|
155
158
|
if args[:to_screen] && args[:to_screen].is_a?(UIViewController)
|
156
159
|
self.parent_screen = args[:to_screen]
|
157
160
|
self.navigation_controller.popToViewController(args[:to_screen], animated: args[:animated])
|
@@ -162,3 +165,6 @@ module ProMotion
|
|
162
165
|
|
163
166
|
end
|
164
167
|
end
|
168
|
+
|
169
|
+
|
170
|
+
|
@@ -103,18 +103,19 @@ module ProMotion
|
|
103
103
|
|
104
104
|
def bar_button_item(button_type, args)
|
105
105
|
case button_type
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
106
|
+
when UIBarButtonItem
|
107
|
+
button_type
|
108
|
+
when UIImage
|
109
|
+
UIBarButtonItem.alloc.initWithImage(button_type, style: args[:style], target: args[:target], action: args[:action])
|
110
|
+
when String
|
111
|
+
UIBarButtonItem.alloc.initWithTitle(button_type, style: args[:style], target: args[:target], action: args[:action])
|
112
|
+
else
|
113
|
+
if args[:system_icon]
|
114
|
+
UIBarButtonItem.alloc.initWithBarButtonSystemItem(args[:system_icon], target: args[:target], action: args[:action])
|
112
115
|
else
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
PM.logger.error("Please supply a title string, a UIImage or :system.")
|
117
|
-
end
|
116
|
+
PM.logger.error("Please supply a title string, a UIImage or :system.")
|
117
|
+
nil
|
118
|
+
end
|
118
119
|
end
|
119
120
|
end
|
120
121
|
|
@@ -10,10 +10,10 @@ module ProMotion
|
|
10
10
|
search_bar.placeholder = params[:search_bar][:placeholder]
|
11
11
|
end
|
12
12
|
|
13
|
-
@
|
14
|
-
@
|
15
|
-
@
|
16
|
-
@
|
13
|
+
@table_search_display_controller = UISearchDisplayController.alloc.initWithSearchBar(search_bar, contentsController: params[:content_controller])
|
14
|
+
@table_search_display_controller.delegate = params[:delegate]
|
15
|
+
@table_search_display_controller.searchResultsDataSource = params[:data_source]
|
16
|
+
@table_search_display_controller.searchResultsDelegate = params[:search_results_delegate]
|
17
17
|
|
18
18
|
self.table_view.tableHeaderView = search_bar
|
19
19
|
end
|
@@ -69,8 +69,10 @@ module ProMotion
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def accessory_toggled_switch(switch)
|
72
|
-
table_cell = switch.superview
|
73
|
-
|
72
|
+
# table_cell = switch.superview
|
73
|
+
table_cell = closest_parent(UITableViewCell, switch)
|
74
|
+
# index_path = table_cell.superview.indexPathForCell(table_cell)
|
75
|
+
index_path = closest_parent(UITableView, table_cell).indexPathForCell(table_cell)
|
74
76
|
|
75
77
|
data_cell = cell_at_section_and_index(index_path.section, index_path.row)
|
76
78
|
data_cell[:accessory][:arguments] = {} unless data_cell[:accessory][:arguments]
|
@@ -106,7 +108,11 @@ module ProMotion
|
|
106
108
|
|
107
109
|
# Set table_data_index if you want the right hand index column (jumplist)
|
108
110
|
def sectionIndexTitlesForTableView(table_view)
|
109
|
-
|
111
|
+
if @promotion_table_data.filtered
|
112
|
+
nil
|
113
|
+
else
|
114
|
+
self.table_data_index if self.respond_to?(:table_data_index)
|
115
|
+
end
|
110
116
|
end
|
111
117
|
|
112
118
|
def tableView(table_view, cellForRowAtIndexPath:index_path)
|
data/lib/ProMotion/version.rb
CHANGED
@@ -55,12 +55,6 @@ describe "ProMotion::TestTableScreen functionality" do
|
|
55
55
|
@controller.tap_counter.should == 1
|
56
56
|
end
|
57
57
|
|
58
|
-
it "should call the method with arguments when the switch is flipped" do
|
59
|
-
@controller.scroll_to_bottom
|
60
|
-
tap "switch_2"
|
61
|
-
@controller.tap_counter.should == 3
|
62
|
-
end
|
63
|
-
|
64
58
|
it "should call the method with arguments when the switch is flipped and when the cell is tapped" do
|
65
59
|
@controller.scroll_to_bottom
|
66
60
|
tap "switch_3"
|
@@ -70,4 +64,10 @@ describe "ProMotion::TestTableScreen functionality" do
|
|
70
64
|
@controller.tap_counter.should == 13
|
71
65
|
end
|
72
66
|
|
67
|
+
it "should call the method with arguments when the switch is flipped" do
|
68
|
+
@controller.scroll_to_bottom
|
69
|
+
tap "switch_2"
|
70
|
+
@controller.tap_counter.should == 3
|
71
|
+
end
|
72
|
+
|
73
73
|
end
|
@@ -108,11 +108,11 @@ describe "screen helpers" do
|
|
108
108
|
describe "opening a screen" do
|
109
109
|
|
110
110
|
it "should create an instance from class when opening a new screen" do
|
111
|
-
@screen.send(:
|
111
|
+
@screen.send(:set_up_screen_for_open, BasicScreen).should.be.instance_of BasicScreen
|
112
112
|
end
|
113
113
|
|
114
114
|
it "should apply properties when opening a new screen" do
|
115
|
-
new_screen = @screen.send(:
|
115
|
+
new_screen = @screen.send(:set_up_screen_for_open, BasicScreen, title: 'Some Title', modal: true, hide_tab_bar: true, nav_bar: true)
|
116
116
|
|
117
117
|
new_screen.parent_screen.should == @screen
|
118
118
|
new_screen.title.should == 'Some Title'
|
@@ -122,7 +122,7 @@ describe "screen helpers" do
|
|
122
122
|
end
|
123
123
|
|
124
124
|
it "should present the #main_controller when showing a modal screen" do
|
125
|
-
new_screen = @screen.send(:
|
125
|
+
new_screen = @screen.send(:set_up_screen_for_open, BasicScreen, modal: true)
|
126
126
|
|
127
127
|
@screen.mock!('presentModalViewController:animated:') do |vc, animated|
|
128
128
|
vc.should == new_screen.main_controller
|
@@ -151,7 +151,7 @@ describe "screen helpers" do
|
|
151
151
|
end
|
152
152
|
@screen.open BasicScreen, modal: true
|
153
153
|
end
|
154
|
-
|
154
|
+
|
155
155
|
it "should present a modal screen if open_modal is used" do
|
156
156
|
@screen.mock!(:present_modal_view_controller) do |screen, animated|
|
157
157
|
screen.should.be.instance_of BasicScreen
|
@@ -160,6 +160,16 @@ describe "screen helpers" do
|
|
160
160
|
@screen.open_modal BasicScreen
|
161
161
|
end
|
162
162
|
|
163
|
+
it "should respect animated property of opening modal screens" do
|
164
|
+
new_screen = @screen.send(:set_up_screen_for_open, BasicScreen)
|
165
|
+
|
166
|
+
@screen.mock!('presentModalViewController:animated:') do |vc, animated|
|
167
|
+
animated.should == false
|
168
|
+
end
|
169
|
+
|
170
|
+
@screen.send(:open, new_screen, animated: false, modal: true)
|
171
|
+
end
|
172
|
+
|
163
173
|
it "should open screen in tab bar if :in_tab is provided" do
|
164
174
|
@screen.stub!(:tab_bar, return: true)
|
165
175
|
@screen.mock!(:present_view_controller_in_tab_bar_controller) do |screen, tab_name|
|
@@ -173,6 +183,14 @@ describe "screen helpers" do
|
|
173
183
|
@screen.mock!(:push_view_controller) { |vc| vc.should.be.instance_of BasicScreen }
|
174
184
|
@screen.open BasicScreen
|
175
185
|
end
|
186
|
+
|
187
|
+
it "should ignore its own navigation controller if current screen has a navigation controller" do
|
188
|
+
basic = BasicScreen.new(nav_bar: true) # creates a dangling nav_bar that will be discarded.
|
189
|
+
@screen.open basic
|
190
|
+
basic.navigationController.should == @screen.navigationController
|
191
|
+
basic.navigation_controller.should == @screen.navigationController
|
192
|
+
@screen.navigation_controller.should == @screen.navigationController
|
193
|
+
end
|
176
194
|
|
177
195
|
it "should open the provided view controller as root view if no other conditions are met" do
|
178
196
|
parent_screen = HomeScreen.new
|
@@ -213,6 +231,18 @@ describe "screen helpers" do
|
|
213
231
|
@screen.close
|
214
232
|
end
|
215
233
|
|
234
|
+
it "should respect animated value for closing modal screens" do
|
235
|
+
parent_screen = HomeScreen.new
|
236
|
+
@screen.parent_screen = parent_screen
|
237
|
+
@screen.modal = true
|
238
|
+
|
239
|
+
parent_screen.mock!('dismissViewControllerAnimated:completion:') do |animated, completion|
|
240
|
+
animated.should == false
|
241
|
+
end
|
242
|
+
|
243
|
+
@screen.send(:close, animated: false)
|
244
|
+
end
|
245
|
+
|
216
246
|
it "#close should pop from the navigation controller" do
|
217
247
|
@screen.navigation_controller.mock!(:popViewControllerAnimated) { |animated| animated.should == true }
|
218
248
|
@screen.close
|
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.7.
|
4
|
+
version: 0.7.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-06-
|
14
|
+
date: 2013-06-14 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: motion-stump
|