ProMotion 0.6.0 → 0.6.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.
- data/README.md +51 -34
- data/Rakefile +1 -1
- data/lib/ProMotion/screen_helpers/screen_navigation.rb +12 -9
- data/lib/ProMotion/screens/_screen_module.rb +17 -12
- data/lib/ProMotion/version.rb +1 -1
- data/resources/list.png +0 -0
- data/spec/helpers/basic_screen.rb +1 -0
- data/spec/helpers/detail_screen.rb +3 -0
- data/spec/helpers/home_screen.rb +2 -2
- data/spec/helpers/master_screen.rb +3 -0
- data/spec/helpers/screen_module_view_controller.rb +55 -0
- data/spec/helpers/test_delegate.rb +0 -5
- data/spec/screen_helpers_spec.rb +21 -17
- data/spec/screen_module_spec.rb +13 -0
- data/spec/screen_spec.rb +63 -4
- data/spec/split_screen_in_tab_bar_spec.rb +5 -1
- data/spec/split_screen_open_screen_spec.rb +5 -1
- data/spec/split_screen_spec.rb +37 -5
- metadata +11 -2
data/README.md
CHANGED
@@ -39,7 +39,7 @@ ProMotion is a RubyMotion gem that makes iOS development more like Ruby and less
|
|
39
39
|
- [Working on Features](#working-on-features)
|
40
40
|
- [Submitting a Pull Request](#submitting-a-pull-request)
|
41
41
|
- [Primary Contributors](#primary-contributors)
|
42
|
-
|
42
|
+
|
43
43
|
# Tutorials
|
44
44
|
|
45
45
|
http://www.clearsightstudio.com/insights/ruby-motion-promotion-tutorial
|
@@ -50,20 +50,25 @@ http://www.clearsightstudio.com/insights/tutorial-make-youtube-video-app-rubymot
|
|
50
50
|
|
51
51
|
## Sample Apps
|
52
52
|
|
53
|
-
|
53
|
+
This is pretty bare-bones, but we'll be building it out as we go along.
|
54
|
+
|
55
|
+
[https://github.com/jamonholmgren/promotion-demo](https://github.com/jamonholmgren/promotion-demo)
|
54
56
|
|
55
57
|
## Apps Built With ProMotion
|
56
58
|
|
57
59
|
### BigDay! Reminder App
|
58
|
-
Check out the free [BigDay! Reminder app](https://itunes.apple.com/us/app/bigday!/id571756685?ls=1&mt=8) on the
|
60
|
+
Check out the free [BigDay! Reminder app](https://itunes.apple.com/us/app/bigday!/id571756685?ls=1&mt=8) on the
|
59
61
|
App Store to see what's possible. ClearSight Studio built the app for Kijome Software, a small app investment company.
|
60
62
|
|
61
63
|
### TipCounter App
|
62
64
|
[TipCounter](http://www.tipcounterapp.com) was built by [Matt Brewer](https://github.com/macfanatic/) for bartenders and servers to easily track their tips. Used ProMotion and the development was a lot of fun!
|
63
65
|
|
66
|
+
### Winston-Salem Crime Map
|
67
|
+
Have an interest in crime statistics and locations? Live in Winston-Salem, NC? This hyper-local and [open source](https://github.com/markrickert/WSCrime) RubyMotion app uses a mixture custom UIViewControllers and ProMotion for ease of attribute setting and adding views. Check it out [on the App Store](http://www.mohawkapps.com/winston-salem-crime-map/download/) or [fork it and contribute](https://github.com/markrickert/WSCrime)!
|
68
|
+
|
64
69
|
# Getting Started
|
65
70
|
|
66
|
-
ProMotion is designed to be as intuitive and Ruby-like as possible. For example, here is a
|
71
|
+
ProMotion is designed to be as intuitive and Ruby-like as possible. For example, here is a
|
67
72
|
typical app folder structure:
|
68
73
|
|
69
74
|
app/
|
@@ -108,7 +113,7 @@ gem "ProMotion", "~> 0.6.0"
|
|
108
113
|
|
109
114
|
Run `bundle install` in Terminal to install ProMotion.
|
110
115
|
|
111
|
-
Go into your app/app_delegate.rb file and
|
116
|
+
Go into your app/app_delegate.rb file and replace everything with the following:
|
112
117
|
|
113
118
|
```ruby
|
114
119
|
class AppDelegate < ProMotion::Delegate
|
@@ -118,6 +123,9 @@ class AppDelegate < ProMotion::Delegate
|
|
118
123
|
end
|
119
124
|
```
|
120
125
|
|
126
|
+
Make sure you remove the `didFinishLoadingWithOptions` method or call `super` in it. Otherwise
|
127
|
+
ProMotion won't get set up and `on_load` won't be called.
|
128
|
+
|
121
129
|
Create a folder in `/app` named `screens`. Create a file in that folder named `home_screen.rb`.
|
122
130
|
|
123
131
|
Now drop in this code:
|
@@ -125,7 +133,7 @@ Now drop in this code:
|
|
125
133
|
```ruby
|
126
134
|
class HomeScreen < ProMotion::Screen
|
127
135
|
title "Home"
|
128
|
-
|
136
|
+
|
129
137
|
def will_appear
|
130
138
|
set_attributes self.view, {
|
131
139
|
backgroundColor: UIColor.whiteColor
|
@@ -165,12 +173,12 @@ class HomeScreen < ProMotion::Screen
|
|
165
173
|
def on_load
|
166
174
|
# Load data
|
167
175
|
end
|
168
|
-
|
176
|
+
|
169
177
|
def will_appear
|
170
178
|
# Set up the elements in your view with add
|
171
179
|
@label ||= add UILabel.alloc.initWithFrame(CGRectMake(5, 5, 20, 20))
|
172
180
|
end
|
173
|
-
|
181
|
+
|
174
182
|
def on_appear
|
175
183
|
# Everything's loaded and visible
|
176
184
|
end
|
@@ -209,18 +217,18 @@ def on_load(app, options)
|
|
209
217
|
@home = MyHomeScreen.new(nav_bar: true)
|
210
218
|
@settings = SettingsScreen.new
|
211
219
|
@contact = ContactScreen.new(nav_bar: true)
|
212
|
-
|
220
|
+
|
213
221
|
open_tab_bar @home, @settings, @contact
|
214
222
|
end
|
215
223
|
```
|
216
224
|
|
217
|
-
For each screen that belongs to the tab bar, you need to set the tab name and icon in the files.
|
225
|
+
For each screen that belongs to the tab bar, you need to set the tab name and icon in the files.
|
218
226
|
In this example, we would need add the following to the three files (my_home_screen.rb, settings_screen.rb, contact_screen.rb):
|
219
227
|
|
220
228
|
```ruby
|
221
229
|
def on_load
|
222
230
|
set_tab_bar_item title: "Tab Name Goes Here", icon: "icons/tab_icon.png" # in resources/icons folder
|
223
|
-
|
231
|
+
|
224
232
|
# or...
|
225
233
|
set_tab_bar_item system_icon: UITabBarSystemItemContacts
|
226
234
|
end
|
@@ -244,6 +252,14 @@ set_nav_bar_right_button "Save", action: :save_something, type: UIBarButtonItemS
|
|
244
252
|
set_nav_bar_left_button "Cancel", action: :return_to_some_other_screen, type: UIBarButtonItemStylePlain
|
245
253
|
```
|
246
254
|
|
255
|
+
If you pass an instance of a `UIImage`, the `UIBarButton` will automatically display with that image instead of text. *Don't forget retina and landscape versions of your image!*
|
256
|
+
|
257
|
+
If you pass `:system` for the title, then you can get a system item. E.g.:
|
258
|
+
|
259
|
+
```ruby
|
260
|
+
set_nav_bar_right_button nil, action: :add_something, system_icon: UIBarButtonSystemItemAdd
|
261
|
+
```
|
262
|
+
|
247
263
|
## Opening and closing screens
|
248
264
|
|
249
265
|
If the user taps something and you want to open a new screen, it's easy. Just use `open` and pass in the screen class
|
@@ -284,7 +300,6 @@ class ProfileScreen < ProMotion::Screen
|
|
284
300
|
self.user # => some_user instance
|
285
301
|
end
|
286
302
|
end
|
287
|
-
|
288
303
|
```
|
289
304
|
|
290
305
|
Closing a screen is as easy as can be.
|
@@ -394,7 +409,7 @@ class SettingsScreen < ProMotion::GroupedTableScreen
|
|
394
409
|
add_right_nav_button(label: "Save", action: :save)
|
395
410
|
set_tab_bar_item(title: "Settings", icon: "settings.png")
|
396
411
|
end
|
397
|
-
|
412
|
+
|
398
413
|
# table_data is automatically called. Use this format in the return value.
|
399
414
|
# It's an array of cell groups, each cell group consisting of a title and an array of cells.
|
400
415
|
def table_data
|
@@ -418,10 +433,10 @@ class SettingsScreen < ProMotion::GroupedTableScreen
|
|
418
433
|
def table_data_index
|
419
434
|
# Ruby magic to make an alphabetical array of letters.
|
420
435
|
# Try this in Objective-C and tell me you want to go back.
|
421
|
-
return ("A".."Z").to_a
|
436
|
+
return ("A".."Z").to_a
|
422
437
|
end
|
423
|
-
|
424
|
-
# Your table cells, when tapped, will execute the corresponding actions
|
438
|
+
|
439
|
+
# Your table cells, when tapped, will execute the corresponding actions
|
425
440
|
# and pass in the specified arguments.
|
426
441
|
def edit_profile(args={})
|
427
442
|
puts args[:id] # => 3
|
@@ -429,7 +444,7 @@ class SettingsScreen < ProMotion::GroupedTableScreen
|
|
429
444
|
end
|
430
445
|
```
|
431
446
|
|
432
|
-
You can provide remotely downloaded images for cells by including the CocoaPod "SDWebImage" in
|
447
|
+
You can provide remotely downloaded images for cells by including the CocoaPod "SDWebImage" in
|
433
448
|
your Rakefile and doing this:
|
434
449
|
|
435
450
|
```ruby
|
@@ -444,9 +459,9 @@ your Rakefile and doing this:
|
|
444
459
|
## Using your own UIViewController
|
445
460
|
|
446
461
|
Sometimes you want to inherit from a different UIViewController other than that provided by ProMotion,
|
447
|
-
such as when using [Formotion](https://github.com/clayallsopp/formotion). **RubyMotion doesn't currently
|
448
|
-
allow us to override built-in methods when including them as a module.** And we really need to override
|
449
|
-
`viewDidLoad` and others.
|
462
|
+
such as when using [Formotion](https://github.com/clayallsopp/formotion). **RubyMotion doesn't currently
|
463
|
+
allow us to override built-in methods when including them as a module.** And we really need to override
|
464
|
+
`viewDidLoad` and others.
|
450
465
|
|
451
466
|
Fortunately, there's a workaround for that.
|
452
467
|
|
@@ -470,15 +485,15 @@ class EventsScreen < Formotion::FormController # Can also be < UIViewController
|
|
470
485
|
super
|
471
486
|
self.view_did_appear(animated) if self.respond_to?("view_did_appear:")
|
472
487
|
end
|
473
|
-
|
488
|
+
|
474
489
|
def viewWillDisappear(animated)
|
475
490
|
self.view_will_disappear(animated) if self.respond_to?("view_will_disappear:")
|
476
491
|
super
|
477
492
|
end
|
478
|
-
|
493
|
+
|
479
494
|
def viewDidDisappear(animated)
|
480
495
|
self.view_did_disappear(animated) if self.respond_to?("view_did_disappear:")
|
481
|
-
super
|
496
|
+
super
|
482
497
|
end
|
483
498
|
|
484
499
|
def shouldAutorotateToInterfaceOrientation(orientation)
|
@@ -492,7 +507,7 @@ class EventsScreen < Formotion::FormController # Can also be < UIViewController
|
|
492
507
|
def willRotateToInterfaceOrientation(orientation, duration:duration)
|
493
508
|
self.will_rotate(orientation, duration)
|
494
509
|
end
|
495
|
-
|
510
|
+
|
496
511
|
def didRotateFromInterfaceOrientation(orientation)
|
497
512
|
self.on_rotate
|
498
513
|
end
|
@@ -526,13 +541,13 @@ end
|
|
526
541
|
Creates the tab that is shown in a tab bar item.<br />
|
527
542
|
Arguments: <code>{ icon: "imagename", systemIcon: UISystemIconContacts, title: "tabtitle" }</code>
|
528
543
|
</td>
|
529
|
-
</tr>
|
544
|
+
</tr>
|
530
545
|
<tr>
|
531
546
|
<td>on_appear</td>
|
532
547
|
<td>
|
533
548
|
Callback for when the screen appears.<br />
|
534
549
|
</td>
|
535
|
-
</tr>
|
550
|
+
</tr>
|
536
551
|
<tr>
|
537
552
|
<td>will_appear</td>
|
538
553
|
<td>
|
@@ -564,12 +579,14 @@ end
|
|
564
579
|
<td>set_nav_bar_left_button(title, args = {})</td>
|
565
580
|
<td>
|
566
581
|
Set a left nav bar button.<br />
|
582
|
+
`title` can be a `String` or a `UIImage`.
|
567
583
|
</td>
|
568
584
|
</tr>
|
569
585
|
<tr>
|
570
586
|
<td>set_nav_bar_right_button(title, args = {})</td>
|
571
587
|
<td>
|
572
588
|
Set a right nav bar button.<br />
|
589
|
+
`title` can be a `String` or a `UIImage`.<br />
|
573
590
|
<img src="http://i.imgur.com/whbkc.png" />
|
574
591
|
</td>
|
575
592
|
</tr>
|
@@ -600,7 +617,7 @@ end
|
|
600
617
|
<pre><code>
|
601
618
|
class SomeScreen
|
602
619
|
title "Some screen"
|
603
|
-
|
620
|
+
|
604
621
|
def on_load
|
605
622
|
# ...
|
606
623
|
end
|
@@ -721,9 +738,9 @@ end
|
|
721
738
|
<tr>
|
722
739
|
<td><pre><code>refreshable(
|
723
740
|
callback: :on_refresh,
|
724
|
-
pull_message: "Pull to refresh",
|
725
|
-
refreshing: "Refreshing data…",
|
726
|
-
updated_format: "Last updated at %s",
|
741
|
+
pull_message: "Pull to refresh",
|
742
|
+
refreshing: "Refreshing data…",
|
743
|
+
updated_format: "Last updated at %s",
|
727
744
|
updated_time_format: "%l:%M %p"
|
728
745
|
)</code></pre></td>
|
729
746
|
<td>Class method to make the current table refreshable.
|
@@ -745,7 +762,7 @@ end</code></pre>
|
|
745
762
|
<strong>Performance note...</strong> It's best to build this array in a different method
|
746
763
|
and store it in something like <code>@table_data</code>. Then your <code>table_data</code>
|
747
764
|
method just returns that.
|
748
|
-
|
765
|
+
|
749
766
|
<pre><code>
|
750
767
|
def table_data
|
751
768
|
[{
|
@@ -760,7 +777,7 @@ def table_data
|
|
760
777
|
arguments: { data: [ "lots", "of", "data" ] },
|
761
778
|
action: :tapped_cell_1,
|
762
779
|
height: 50, # manually changes the cell's height
|
763
|
-
cell_style: UITableViewCellStyleSubtitle,
|
780
|
+
cell_style: UITableViewCellStyleSubtitle,
|
764
781
|
cell_identifier: "Cell",
|
765
782
|
cell_class: ProMotion::TableViewCell,
|
766
783
|
masks_to_bounds: true,
|
@@ -776,7 +793,7 @@ def table_data
|
|
776
793
|
accessory_checked: true, # whether it's "checked" or not
|
777
794
|
image: { image: UIImage.imageNamed("something"), radius: 15 },
|
778
795
|
remote_image: { # remote image, requires SDWebImage CocoaPod
|
779
|
-
url: "http://placekitten.com/200/300", placeholder: "some-local-image",
|
796
|
+
url: "http://placekitten.com/200/300", placeholder: "some-local-image",
|
780
797
|
size: 50, radius: 15
|
781
798
|
},
|
782
799
|
subviews: [ @some_view, @some_other_view ] # arbitrary views added to the cell
|
@@ -880,7 +897,7 @@ Opening a ticket is usually the best and we respond to those pretty quickly.
|
|
880
897
|
|
881
898
|
# Contributing
|
882
899
|
|
883
|
-
I'm very open to ideas. Tweet me with your ideas or open a ticket (I don't mind!)
|
900
|
+
I'm very open to ideas. Tweet me with your ideas or open a ticket (I don't mind!)
|
884
901
|
and let's discuss.
|
885
902
|
|
886
903
|
## Working on Features
|
data/Rakefile
CHANGED
@@ -10,10 +10,13 @@ module ProMotion
|
|
10
10
|
screen.send(:on_load) if screen.respond_to?(:on_load)
|
11
11
|
animated = args[:animated] || true
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
if args[:in_detail] && self.split_screen
|
14
|
+
self.split_screen.detail_screen = screen
|
15
15
|
|
16
|
-
|
16
|
+
elsif args[:in_master] && self.split_screen
|
17
|
+
self.split_screen.master_screen = screen
|
18
|
+
|
19
|
+
elsif args[:close_all]
|
17
20
|
open_root_screen screen
|
18
21
|
|
19
22
|
elsif args[:modal]
|
@@ -25,11 +28,8 @@ module ProMotion
|
|
25
28
|
elsif self.navigation_controller
|
26
29
|
push_view_controller screen
|
27
30
|
|
28
|
-
elsif screen.respond_to?(:main_controller)
|
29
|
-
open_view_controller screen.main_controller
|
30
|
-
|
31
31
|
else
|
32
|
-
|
32
|
+
open_root_screen screen
|
33
33
|
|
34
34
|
end
|
35
35
|
|
@@ -72,8 +72,9 @@ module ProMotion
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
-
def open_view_controller(
|
76
|
-
|
75
|
+
def open_view_controller(screen)
|
76
|
+
PM.logger.deprecated "Use `open_root_screen` instead of the more ambiguous `open_view_controller`."
|
77
|
+
open_root_screen screen
|
77
78
|
end
|
78
79
|
|
79
80
|
def push_view_controller(vc, nav_controller=nil)
|
@@ -129,6 +130,8 @@ module ProMotion
|
|
129
130
|
screen.navigation_controller = vc if screen.respond_to?("navigation_controller=")
|
130
131
|
push_view_controller(screen, vc)
|
131
132
|
else
|
133
|
+
# TODO: This should probably open the vc, shouldn't it?
|
134
|
+
# This isn't well tested and needs to work better.
|
132
135
|
self.tab_bar.selectedIndex = vc.tabBarItem.tag
|
133
136
|
end
|
134
137
|
|
@@ -6,13 +6,16 @@ module ProMotion
|
|
6
6
|
include ProMotion::ScreenTabs
|
7
7
|
include ProMotion::SplitScreen if NSBundle.mainBundle.infoDictionary["UIDeviceFamily"].include?("2")
|
8
8
|
|
9
|
-
attr_accessor :parent_screen, :first_screen, :tab_bar_item, :tab_bar, :modal, :split_screen
|
9
|
+
attr_accessor :parent_screen, :first_screen, :tab_bar_item, :tab_bar, :modal, :split_screen, :title
|
10
10
|
|
11
11
|
def on_create(args = {})
|
12
12
|
unless self.is_a?(UIViewController)
|
13
13
|
raise StandardError.new("ERROR: Screens must extend UIViewController or a subclass of UIViewController.")
|
14
14
|
end
|
15
15
|
|
16
|
+
|
17
|
+
self.title = self.class.send(:get_title)
|
18
|
+
|
16
19
|
args.each do |k, v|
|
17
20
|
self.send("#{k}=", v) if self.respond_to?("#{k}=")
|
18
21
|
end
|
@@ -70,13 +73,24 @@ module ProMotion
|
|
70
73
|
args[:title] = title
|
71
74
|
set_nav_bar_button :left, args
|
72
75
|
end
|
73
|
-
|
76
|
+
|
77
|
+
# If you call set_nav_bar_button with a nil title and system_icon: UIBarButtonSystemItemAdd (or any other
|
78
|
+
# system icon), the button is initialized with a barButtonSystemItem instead of a title.
|
74
79
|
def set_nav_bar_button(side, args={})
|
75
80
|
args[:style] ||= UIBarButtonItemStyleBordered
|
76
81
|
args[:target] ||= self
|
77
82
|
args[:action] ||= nil
|
78
83
|
|
79
|
-
button =
|
84
|
+
button = case args[:title]
|
85
|
+
when String
|
86
|
+
UIBarButtonItem.alloc.initWithTitle(args[:title], style: args[:style], target: args[:target], action: args[:action])
|
87
|
+
when UIImage
|
88
|
+
UIBarButtonItem.alloc.initWithImage(args[:title], style: args[:style], target: args[:target], action: args[:action])
|
89
|
+
when Symbol, NilClass
|
90
|
+
UIBarButtonItem.alloc.initWithBarButtonSystemItem(args[:system_icon], target: args[:target], action: args[:action]) if args[:system_icon]
|
91
|
+
else
|
92
|
+
PM.logger.error("Please supply a title string, a UIImage or :system.")
|
93
|
+
end
|
80
94
|
|
81
95
|
self.navigationItem.leftBarButtonItem = button if side == :left
|
82
96
|
self.navigationItem.rightBarButtonItem = button if side == :right
|
@@ -124,15 +138,6 @@ module ProMotion
|
|
124
138
|
end
|
125
139
|
def on_disappear; end
|
126
140
|
|
127
|
-
def title
|
128
|
-
self.class.send(:get_title)
|
129
|
-
end
|
130
|
-
|
131
|
-
def title=(new_title)
|
132
|
-
self.class.title = new_title
|
133
|
-
super
|
134
|
-
end
|
135
|
-
|
136
141
|
def main_controller
|
137
142
|
self.navigation_controller || self
|
138
143
|
end
|
data/lib/ProMotion/version.rb
CHANGED
data/resources/list.png
ADDED
Binary file
|
data/spec/helpers/home_screen.rb
CHANGED
@@ -4,10 +4,10 @@ class HomeScreen < ProMotion::Screen
|
|
4
4
|
|
5
5
|
def on_load
|
6
6
|
set_nav_bar_right_button "Save", action: :save_something, type: UIBarButtonItemStyleDone
|
7
|
-
set_nav_bar_left_button "
|
7
|
+
set_nav_bar_left_button UIImage.imageNamed("list.png"), action: :return_to_some_other_screen, type: UIBarButtonItemStylePlain
|
8
8
|
end
|
9
9
|
|
10
10
|
def on_return(args={})
|
11
11
|
end
|
12
12
|
|
13
|
-
end
|
13
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class ScreenModuleViewController < UIViewController
|
2
|
+
include PM::ScreenModule
|
3
|
+
title 'Test Title'
|
4
|
+
|
5
|
+
# Get rid of such hackiness when RubyMotion bug is fixed...
|
6
|
+
|
7
|
+
def self.new(args = {})
|
8
|
+
s = self.alloc.initWithNibName(nil, bundle:nil)
|
9
|
+
s.on_create(args) if s.respond_to?(:on_create)
|
10
|
+
s
|
11
|
+
end
|
12
|
+
|
13
|
+
def viewDidLoad
|
14
|
+
super
|
15
|
+
self.view_did_load if self.respond_to?(:view_did_load)
|
16
|
+
end
|
17
|
+
|
18
|
+
def viewWillAppear(animated)
|
19
|
+
super
|
20
|
+
self.view_will_appear(animated) if self.respond_to?("view_will_appear:")
|
21
|
+
end
|
22
|
+
|
23
|
+
def viewDidAppear(animated)
|
24
|
+
super
|
25
|
+
self.view_did_appear(animated) if self.respond_to?("view_did_appear:")
|
26
|
+
end
|
27
|
+
|
28
|
+
def viewWillDisappear(animated)
|
29
|
+
self.view_will_disappear(animated) if self.respond_to?("view_will_disappear:")
|
30
|
+
super
|
31
|
+
end
|
32
|
+
|
33
|
+
def viewDidDisappear(animated)
|
34
|
+
if self.respond_to?("view_did_disappear:")
|
35
|
+
self.view_did_disappear(animated)
|
36
|
+
end
|
37
|
+
super
|
38
|
+
end
|
39
|
+
|
40
|
+
def shouldAutorotateToInterfaceOrientation(orientation)
|
41
|
+
self.should_rotate(orientation)
|
42
|
+
end
|
43
|
+
|
44
|
+
def shouldAutorotate
|
45
|
+
self.should_autorotate
|
46
|
+
end
|
47
|
+
|
48
|
+
def willRotateToInterfaceOrientation(orientation, duration:duration)
|
49
|
+
self.will_rotate(orientation, duration)
|
50
|
+
end
|
51
|
+
|
52
|
+
def didRotateFromInterfaceOrientation(orientation)
|
53
|
+
self.on_rotate
|
54
|
+
end
|
55
|
+
end
|
data/spec/screen_helpers_spec.rb
CHANGED
@@ -35,25 +35,39 @@ describe "screen helpers" do
|
|
35
35
|
@screen.add_to @subview, sub_subview, { backgroundColor: UIColor.redColor }
|
36
36
|
@subview.subviews.last.backgroundColor.should == UIColor.redColor
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
end
|
40
40
|
|
41
41
|
describe "nav bar buttons" do
|
42
|
-
|
42
|
+
|
43
43
|
before do
|
44
44
|
@screen = HomeScreen.new(nav_bar: true)
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
it "should add a left nav bar button" do
|
48
48
|
@screen.set_nav_bar_left_button "Save", action: :save_something, type: UIBarButtonItemStyleDone
|
49
49
|
@screen.navigationItem.leftBarButtonItem.class.should == UIBarButtonItem
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
it "should add a right nav bar button" do
|
53
53
|
@screen.set_nav_bar_right_button "Cancel", action: :return_to_some_other_screen, type: UIBarButtonItemStylePlain
|
54
54
|
@screen.navigationItem.rightBarButtonItem.class.should == UIBarButtonItem
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
|
+
it "should add an image right nav bar button" do
|
58
|
+
image = UIImage.imageNamed("list.png")
|
59
|
+
@screen.set_nav_bar_right_button image, action: :return_to_some_other_screen, type: UIBarButtonItemStylePlain
|
60
|
+
@screen.navigationItem.rightBarButtonItem.image.class.should == UIImage
|
61
|
+
@screen.navigationItem.rightBarButtonItem.image.should == image
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should add an image left nav bar button" do
|
65
|
+
image = UIImage.imageNamed("list.png")
|
66
|
+
@screen.set_nav_bar_left_button image, action: :return_to_some_other_screen, type: UIBarButtonItemStylePlain
|
67
|
+
@screen.navigationItem.leftBarButtonItem.image.class.should == UIImage
|
68
|
+
@screen.navigationItem.leftBarButtonItem.image.should == image
|
69
|
+
end
|
70
|
+
|
57
71
|
end
|
58
72
|
|
59
73
|
describe "screen navigation" do
|
@@ -143,20 +157,10 @@ describe "screen helpers" do
|
|
143
157
|
@screen.open_screen BasicScreen
|
144
158
|
end
|
145
159
|
|
146
|
-
it "should open the
|
147
|
-
parent_screen = HomeScreen.new
|
148
|
-
nav_controller = ProMotion::NavigationController.new
|
149
|
-
new_screen = BasicScreen.new
|
150
|
-
new_screen.stub! :main_controller, return: nav_controller
|
151
|
-
|
152
|
-
parent_screen.mock!(:open_view_controller) { |vc| vc.should.be == nav_controller }
|
153
|
-
parent_screen.open_screen new_screen
|
154
|
-
end
|
155
|
-
|
156
|
-
it "should open the provided view controller if no other conditions are met" do
|
160
|
+
it "should open the provided view controller as root view if no other conditions are met" do
|
157
161
|
parent_screen = HomeScreen.new
|
158
162
|
new_screen = BasicScreen.new
|
159
|
-
parent_screen.mock!(:
|
163
|
+
parent_screen.mock!(:open_root_screen) { |vc| vc.should.be == new_screen }
|
160
164
|
parent_screen.open_screen new_screen
|
161
165
|
end
|
162
166
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
describe "PM::ScreenModule" do
|
2
|
+
|
3
|
+
before { @subject = ScreenModuleViewController.new }
|
4
|
+
|
5
|
+
it 'should have PM::ScreenModule in ancestors' do
|
6
|
+
@subject.class.ancestors.include?(PM::ScreenModule).should == true
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should have a title from class method #title' do
|
10
|
+
@subject.title.should == 'Test Title'
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
data/spec/screen_spec.rb
CHANGED
@@ -12,9 +12,18 @@ describe "screen properties" do
|
|
12
12
|
HomeScreen.get_title.should == 'Home'
|
13
13
|
end
|
14
14
|
|
15
|
-
it "should
|
15
|
+
it "should set default title on new instances" do
|
16
|
+
@screen.title.should == "Home"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should let the instance set its title" do
|
20
|
+
@screen.title = "instance method"
|
21
|
+
@screen.title.should == 'instance method'
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should not let the instance reset the default title" do
|
16
25
|
@screen.title = "instance method"
|
17
|
-
HomeScreen.get_title.should
|
26
|
+
HomeScreen.get_title.should != 'instance method'
|
18
27
|
end
|
19
28
|
|
20
29
|
it "should store debug mode" do
|
@@ -73,10 +82,10 @@ describe "screen properties" do
|
|
73
82
|
end
|
74
83
|
|
75
84
|
it "-willRotateToInterfaceOrientation" do
|
76
|
-
@screen.mock! :will_rotate do |orientation, duration|
|
85
|
+
@screen.mock! :will_rotate do |orientation, duration|
|
77
86
|
orientation.should == UIInterfaceOrientationPortrait
|
78
87
|
duration.should == 0.5
|
79
|
-
end
|
88
|
+
end
|
80
89
|
@screen.willRotateToInterfaceOrientation(UIInterfaceOrientationPortrait, duration: 0.5)
|
81
90
|
end
|
82
91
|
|
@@ -108,4 +117,54 @@ describe "screen properties" do
|
|
108
117
|
|
109
118
|
end
|
110
119
|
|
120
|
+
describe "bar button behavior" do
|
121
|
+
describe "system bar buttons" do
|
122
|
+
before do
|
123
|
+
@screen.set_nav_bar_right_button nil, action: :add_something, system_icon: UIBarButtonSystemItemAdd
|
124
|
+
end
|
125
|
+
|
126
|
+
it "has a right bar button item of the correct type" do
|
127
|
+
@screen.navigationItem.rightBarButtonItem.should.be.instance_of UIBarButtonItem
|
128
|
+
end
|
129
|
+
|
130
|
+
it "is an add button" do
|
131
|
+
@screen.navigationItem.rightBarButtonItem.action.should == :add_something
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe 'titled bar buttons' do
|
136
|
+
before do
|
137
|
+
@screen.set_nav_bar_right_button "Save", action: :save_something, style: UIBarButtonItemStyleDone
|
138
|
+
end
|
139
|
+
|
140
|
+
it "has a right bar button item of the correct type" do
|
141
|
+
@screen.navigationItem.rightBarButtonItem.should.be.instance_of UIBarButtonItem
|
142
|
+
end
|
143
|
+
|
144
|
+
it "has a right bar button item of the correct style" do
|
145
|
+
@screen.navigationItem.rightBarButtonItem.style.should == UIBarButtonItemStyleDone
|
146
|
+
end
|
147
|
+
|
148
|
+
it "is titled correctly" do
|
149
|
+
@screen.navigationItem.rightBarButtonItem.title.should == 'Save'
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
describe 'image bar buttons' do
|
154
|
+
before do
|
155
|
+
@image = UIImage.alloc.init
|
156
|
+
@screen.set_nav_bar_right_button @image, action: :save_something, style: UIBarButtonItemStyleDone
|
157
|
+
end
|
158
|
+
|
159
|
+
it "has a right bar button item of the correct type" do
|
160
|
+
@screen.navigationItem.rightBarButtonItem.should.be.instance_of UIBarButtonItem
|
161
|
+
end
|
162
|
+
|
163
|
+
it "is has the right image" do
|
164
|
+
@screen.navigationItem.rightBarButtonItem.title.should == nil
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
169
|
+
|
111
170
|
end
|
@@ -10,6 +10,10 @@ describe "split screen in tab bar functionality" do
|
|
10
10
|
@tab = @app.open_tab_bar @split_screen, HomeScreen, BasicScreen
|
11
11
|
end
|
12
12
|
|
13
|
+
after do
|
14
|
+
@split_screen.delegate = nil # dereference to avoid memory issue
|
15
|
+
end
|
16
|
+
|
13
17
|
it "should create a UISplitViewController" do
|
14
18
|
@split_screen.is_a?(UISplitViewController).should == true
|
15
19
|
end
|
@@ -46,4 +50,4 @@ describe "split screen in tab bar functionality" do
|
|
46
50
|
@tab.viewControllers.first.should == @split_screen
|
47
51
|
end
|
48
52
|
|
49
|
-
end
|
53
|
+
end
|
@@ -10,6 +10,10 @@ describe "split screen `open` functionality" do
|
|
10
10
|
@split_screen = @app.open_split_screen @master_screen, @detail_screen_1
|
11
11
|
end
|
12
12
|
|
13
|
+
after do
|
14
|
+
@split_screen.delegate = nil # dereference to avoid memory issue
|
15
|
+
end
|
16
|
+
|
13
17
|
it "should open a new screen in the detail view" do
|
14
18
|
@master_screen.open @detail_screen_2, in_detail: true
|
15
19
|
@split_screen.detail_screen.should == @detail_screen_2
|
@@ -43,4 +47,4 @@ describe "split screen `open` functionality" do
|
|
43
47
|
home.navigation_controller.topViewController.should == child
|
44
48
|
end
|
45
49
|
|
46
|
-
end
|
50
|
+
end
|
data/spec/split_screen_spec.rb
CHANGED
@@ -3,12 +3,16 @@ describe "split screen functionality" do
|
|
3
3
|
before do
|
4
4
|
@app = TestDelegate.new
|
5
5
|
|
6
|
-
@master_screen =
|
7
|
-
@detail_screen =
|
6
|
+
@master_screen = MasterScreen.new nav_bar: true
|
7
|
+
@detail_screen = DetailScreen.new # no nav_bar on this one
|
8
8
|
|
9
9
|
@split_screen = @app.open_split_screen @master_screen, @detail_screen
|
10
10
|
end
|
11
11
|
|
12
|
+
after do
|
13
|
+
@split_screen.delegate = nil # dereference to avoid memory issue
|
14
|
+
end
|
15
|
+
|
12
16
|
it "should have created a split screen" do
|
13
17
|
@split_screen.should != nil
|
14
18
|
@split_screen.is_a?(UISplitViewController).should == true
|
@@ -22,14 +26,42 @@ describe "split screen functionality" do
|
|
22
26
|
@app.window.rootViewController.should == @split_screen
|
23
27
|
end
|
24
28
|
|
25
|
-
it "should set the first viewController to
|
29
|
+
it "should set the first viewController to MasterScreen" do
|
26
30
|
@split_screen.master_screen.should == @master_screen
|
27
31
|
@split_screen.viewControllers.first.should == @master_screen.main_controller
|
28
32
|
end
|
29
33
|
|
30
|
-
it "should set the second viewController to
|
34
|
+
it "should set the second viewController to DetailScreen" do
|
31
35
|
@split_screen.detail_screen.should == @detail_screen
|
32
36
|
@split_screen.viewControllers.last.should == @detail_screen.main_controller
|
33
37
|
end
|
34
38
|
|
35
|
-
|
39
|
+
it "should set the title on both screens" do
|
40
|
+
@master_screen.class.send(:get_title).should == "Master"
|
41
|
+
@master_screen.title.should == "Master"
|
42
|
+
@detail_screen.class.send(:get_title).should == "Detail"
|
43
|
+
@detail_screen.title.should == "Detail"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Regression test for https://github.com/clearsightstudio/ProMotion/issues/74
|
48
|
+
describe "split screen with UIViewControllers with ScreenModule" do
|
49
|
+
|
50
|
+
before do
|
51
|
+
@app = TestDelegate.new
|
52
|
+
|
53
|
+
@master_screen = ScreenModuleViewController.new
|
54
|
+
@detail_screen = DetailScreen.new(nav_bar: true)
|
55
|
+
|
56
|
+
@split_screen = @app.open_split_screen @master_screen, @detail_screen
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should set the title on both screens" do
|
60
|
+
@master_screen.class.send(:get_title).should == "Test Title"
|
61
|
+
@master_screen.title.should == "Test Title"
|
62
|
+
@detail_screen.class.send(:get_title).should == "Detail"
|
63
|
+
@detail_screen.title.should == "Detail"
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
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.
|
4
|
+
version: 0.6.1
|
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-05-
|
14
|
+
date: 2013-05-17 00:00:00.000000000 Z
|
15
15
|
dependencies: []
|
16
16
|
description: ProMotion is a new way to easily build RubyMotion iOS apps.
|
17
17
|
email:
|
@@ -62,9 +62,13 @@ files:
|
|
62
62
|
- lib/ProMotion/screens/screen.rb
|
63
63
|
- lib/ProMotion/screens/table_screen.rb
|
64
64
|
- lib/ProMotion/version.rb
|
65
|
+
- resources/list.png
|
65
66
|
- spec/helpers/basic_screen.rb
|
67
|
+
- spec/helpers/detail_screen.rb
|
66
68
|
- spec/helpers/dummy_class.rb
|
67
69
|
- spec/helpers/home_screen.rb
|
70
|
+
- spec/helpers/master_screen.rb
|
71
|
+
- spec/helpers/screen_module_view_controller.rb
|
68
72
|
- spec/helpers/table_screen.rb
|
69
73
|
- spec/helpers/table_screen_refreshable.rb
|
70
74
|
- spec/helpers/table_screen_searchable.rb
|
@@ -73,6 +77,7 @@ files:
|
|
73
77
|
- spec/logger_spec.rb
|
74
78
|
- spec/main_spec.rb
|
75
79
|
- spec/screen_helpers_spec.rb
|
80
|
+
- spec/screen_module_spec.rb
|
76
81
|
- spec/screen_spec.rb
|
77
82
|
- spec/split_screen_in_tab_bar_spec.rb
|
78
83
|
- spec/split_screen_open_screen_spec.rb
|
@@ -108,8 +113,11 @@ summary: ProMotion is a new way to organize RubyMotion apps. Instead of dealing
|
|
108
113
|
Ruby and less like Objective-C.
|
109
114
|
test_files:
|
110
115
|
- spec/helpers/basic_screen.rb
|
116
|
+
- spec/helpers/detail_screen.rb
|
111
117
|
- spec/helpers/dummy_class.rb
|
112
118
|
- spec/helpers/home_screen.rb
|
119
|
+
- spec/helpers/master_screen.rb
|
120
|
+
- spec/helpers/screen_module_view_controller.rb
|
113
121
|
- spec/helpers/table_screen.rb
|
114
122
|
- spec/helpers/table_screen_refreshable.rb
|
115
123
|
- spec/helpers/table_screen_searchable.rb
|
@@ -118,6 +126,7 @@ test_files:
|
|
118
126
|
- spec/logger_spec.rb
|
119
127
|
- spec/main_spec.rb
|
120
128
|
- spec/screen_helpers_spec.rb
|
129
|
+
- spec/screen_module_spec.rb
|
121
130
|
- spec/screen_spec.rb
|
122
131
|
- spec/split_screen_in_tab_bar_spec.rb
|
123
132
|
- spec/split_screen_open_screen_spec.rb
|