RedAlert 0.1 → 0.2
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 +4 -4
- data/README.md +76 -32
- data/lib/project/alert_constants.rb +16 -0
- data/lib/project/button_templates.rb +27 -0
- data/lib/project/classic_alert.rb +42 -0
- data/lib/project/core_alert.rb +44 -0
- data/lib/project/red_alert.rb +41 -117
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 24b9cea163ecc89a14bd430541cce2ef68d1b481
|
4
|
+
data.tar.gz: 523230fefd756501194b7fbce9f70543facacbf4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 99ce20158fa93775969ec3b5aa88691cf30ca7f489b128821bbef3c819532b8acd126a2b8fbedd40ee5222557503bacba711be40697cb17df212cc26e6c912be
|
7
|
+
data.tar.gz: c95f987cdaa2c52662007c2fe942692d88475190179a8fbaa9f5e3f887878ba0d1c5cf0ec7aa8aaeb1392e3742c29050a0f975e42aaedb53dead289e5520e63f
|
data/README.md
CHANGED
@@ -1,64 +1,108 @@
|
|
1
|
-
|
1
|
+
<img src="./_art/logo.png" alt="RedAlert Logo" width="100" />
|
2
|
+
[](http://rubymotionquery.com)
|
2
3
|
|
3
4
|
# RedAlert
|
5
|
+
[](http://badge.fury.io/rb/RedAlert) [](https://travis-ci.org/GantMan/RedAlert) _Alerts and ActionSheets with ease_
|
4
6
|
|
5
|
-
|
7
|
+
### Did you know that UIAlertView and UIActionSheet (as well as their respective delegate protocols) are deprecated in iOS 8?
|
6
8
|
|
7
|
-
`UIAlertController
|
9
|
+
Apple requests you start using the new `UIAlertController`. This gem is built on `UIAlertController` and RMQ, along with support for antiquated `UIAlertView`s for the gnostalgic.
|
10
|
+
|
11
|
+
With an emphasis on ease of use, this gem allows you to quickly implement Alerts and Actionsheets in your RMQ RubyMotion applications.
|
12
|
+
|
13
|
+
## Screenshot
|
14
|
+
|
15
|
+
<img src="./_art/screen.png" alt="Screen Shot" width="500" />
|
8
16
|
|
9
17
|
## Installation
|
10
18
|
|
11
|
-
**Requires RMQ
|
19
|
+
**Requires RMQ 1.2.0 or later, and iOS 8 or later**
|
12
20
|
|
13
|
-
|
21
|
+
Add the **RedAlert** gem to your Gemfile.
|
22
|
+
```ruby
|
23
|
+
gem 'RedAlert'
|
24
|
+
```
|
14
25
|
|
15
26
|
## Usage
|
27
|
+
**Note: If you're using [RedPotion](https://github.com/infinitered/redpotion) then `rmq.app` can be accessed by simply typing `app`, so `rmq.app.alert` would be simply `app.alert`. The following examples are verbose and assume only [RMQ](https://github.com/infinitered/rmq).**
|
16
28
|
|
17
|
-
TODO: Write usage instructions here
|
18
29
|
```ruby
|
19
30
|
|
20
|
-
|
21
|
-
|
22
|
-
|
31
|
+
# Simply do an alert
|
32
|
+
rmq.app.alert("Minimal Alert")
|
33
|
+
|
34
|
+
# Alert with callback
|
35
|
+
rmq.app.alert("Alert with Block") {
|
36
|
+
puts "Alert with Block worked!"
|
37
|
+
}
|
23
38
|
|
24
|
-
|
25
|
-
|
39
|
+
# Modify some snazzy options
|
40
|
+
rmq.app.alert(title: "New Title", message: "Great message", animated: false)
|
41
|
+
|
42
|
+
# Switch it to look like an ActionSheet by setting the style
|
43
|
+
rmq.app.alert(title: "Hey there!", message: "My style is :sheet", style: :sheet) do |action_type|
|
44
|
+
puts "You clicked #{action_type}"
|
26
45
|
end
|
27
46
|
|
28
|
-
|
47
|
+
# Utilize common templates
|
48
|
+
rmq.app.alert(message: "Would you like a sandwich?", actions: :yes_no_cancel, style: :sheet) do |action_type|
|
29
49
|
case action_type
|
30
50
|
when :yes
|
31
|
-
|
51
|
+
puts "Here's your Sandwich!"
|
32
52
|
when :no
|
33
|
-
|
53
|
+
puts "FINE!"
|
34
54
|
end
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
rmq.alert(title: "foo", message: "Would you like a sandwich?", actions: []
|
39
|
-
}
|
40
|
-
|
55
|
+
end
|
56
|
+
```
|
41
57
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
58
|
+
You can even use the `make_button` helper to create custom UIAction buttons to add:
|
59
|
+
```ruby
|
60
|
+
# Use custom UIAction buttons and add them
|
61
|
+
taco = rmq.app.make_button("Taco") {
|
62
|
+
puts "Taco pressed"
|
63
|
+
}
|
64
|
+
nacho = rmq.app.make_button(title: "Nacho", style: :destructive) {
|
65
|
+
puts "Nacho pressed"
|
66
|
+
}
|
67
|
+
button_list = [taco, nacho]
|
68
|
+
rmq.app.alert(title: "Actions!", message: "Actions created with `make_button` helper.", actions: button_list)
|
48
69
|
```
|
49
70
|
|
71
|
+
## Available Templates
|
72
|
+
|
73
|
+
Templates are provided [HERE](https://github.com/GantMan/RedAlert/blob/master/lib/project/button_templates.rb)
|
74
|
+
* `:yes_no` = Simple yes and no buttons.
|
75
|
+
* `:yes_no_cancel` = Yes/no buttons with a separated cancel button.
|
76
|
+
* `:ok_cancel` = OK button with a separated cancel button.
|
77
|
+
* `:delete_cancel` = Delete button (red) with a separated cancel button.
|
50
78
|
|
51
|
-
|
79
|
+
_More to come:_ be sure to submit a pull-request with your button template needs.
|
52
80
|
|
53
|
-
|
81
|
+
## More info
|
54
82
|
|
55
|
-
|
83
|
+
Feel free to read up on UIAlertController to see what all is wrapped up in this gem.
|
84
|
+
* [Hayageek](http://hayageek.com/uialertcontroller-example-ios/)
|
85
|
+
* [NSHipster](http://nshipster.com/uialertcontroller/)
|
56
86
|
|
57
|
-
|
87
|
+
## Classic UIAlertView Helpers
|
58
88
|
|
59
|
-
|
89
|
+
If you'd like to still support pre-iOS8, you can easily use `rmq.app.alert_view` with a similar syntax, and instead of actions you'll used the predefined delegates.
|
60
90
|
|
61
|
-
|
91
|
+
**`UIAlertView` Classic:**
|
92
|
+
```ruby
|
93
|
+
# support the elderly
|
94
|
+
rmq.app.alert_view("Hey look at this old trick")
|
95
|
+
|
96
|
+
# Still feels like magic!
|
97
|
+
rmq.app.alert_view({
|
98
|
+
title: "Hey There",
|
99
|
+
message: "Check out this complex alert!",
|
100
|
+
cancel_button: 'Nevermind',
|
101
|
+
other_buttons: ['Log In'],
|
102
|
+
delegate: nil,
|
103
|
+
view_style: UIAlertViewStyleLoginAndPasswordInput
|
104
|
+
})
|
105
|
+
```
|
62
106
|
|
63
107
|
## Contributing
|
64
108
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module RubyMotionQuery
|
2
|
+
module AlertConstants
|
3
|
+
|
4
|
+
ALERT_TYPES = {
|
5
|
+
alert: UIAlertControllerStyleAlert,
|
6
|
+
sheet: UIAlertControllerStyleActionSheet
|
7
|
+
}
|
8
|
+
|
9
|
+
ALERT_ACTION_STYLE = {
|
10
|
+
default: UIAlertActionStyleDefault,
|
11
|
+
cancel: UIAlertActionStyleCancel,
|
12
|
+
destructive: UIAlertActionStyleDestructive
|
13
|
+
}
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module RubyMotionQuery
|
2
|
+
class App
|
3
|
+
|
4
|
+
# When adding a new template do the following:
|
5
|
+
# 1 - Add it here
|
6
|
+
# 2 - Add the test
|
7
|
+
# 3 - Add symbol to the README.md list
|
8
|
+
def self.add_template_actions(uiac, template, &block)
|
9
|
+
case template
|
10
|
+
when :yes_no
|
11
|
+
uiac.addAction(rmq.app.make_button("Yes", &block))
|
12
|
+
uiac.addAction(rmq.app.make_button("No", &block))
|
13
|
+
when :yes_no_cancel
|
14
|
+
uiac.addAction(rmq.app.make_button("Yes", &block))
|
15
|
+
uiac.addAction(rmq.app.make_button("No", &block))
|
16
|
+
uiac.addAction(rmq.app.make_button({title: "Cancel", style: :cancel}, &block))
|
17
|
+
when :ok_cancel
|
18
|
+
uiac.addAction(rmq.app.make_button("OK", &block))
|
19
|
+
uiac.addAction(rmq.app.make_button({title: "Cancel", style: :cancel}, &block))
|
20
|
+
when :delete_cancel
|
21
|
+
uiac.addAction(rmq.app.make_button({title: "Delete", style: :destructive}, &block))
|
22
|
+
uiac.addAction(rmq.app.make_button({title: "Cancel", style: :cancel}, &block))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module RubyMotionQuery
|
2
|
+
class App
|
3
|
+
|
4
|
+
# Creates and shows the old UIAlertView. Added here for use in fallback.
|
5
|
+
# Fallback won't run actions, but the old system needed delegates anyhow.
|
6
|
+
# Usage Example:
|
7
|
+
# rmq.app.alert_view("This is a test")
|
8
|
+
# rmq.app.alert_view(title: "Hey there", message: "Enjoying this?")
|
9
|
+
# @return [UIAlertView]
|
10
|
+
def self.alert_view(opts = {})
|
11
|
+
|
12
|
+
# shortcut sending a string
|
13
|
+
opts = {message: opts} if opts.is_a? String
|
14
|
+
# An alert is nothing without a message
|
15
|
+
raise(ArgumentError, "RedAlert requires a message") if opts[:message].nil? || opts[:message].empty?
|
16
|
+
|
17
|
+
opts = {
|
18
|
+
title: "Alert!",
|
19
|
+
cancel_button: "OK",
|
20
|
+
other_buttons: [],
|
21
|
+
delegate: nil,
|
22
|
+
view_style: UIAlertViewStyleDefault,
|
23
|
+
show_now: true,
|
24
|
+
}.merge(opts)
|
25
|
+
|
26
|
+
alert_view = UIAlertView.alloc.initWithTitle(
|
27
|
+
opts[:title],
|
28
|
+
message: opts[:message],
|
29
|
+
delegate: opts[:delegate],
|
30
|
+
cancelButtonTitle: opts[:cancel_button],
|
31
|
+
otherButtonTitles: nil
|
32
|
+
)
|
33
|
+
Array(opts[:other_buttons]).each { |button| alert_view.addButtonWithTitle(button) }
|
34
|
+
|
35
|
+
alert_view.alertViewStyle = opts[:view_style]
|
36
|
+
|
37
|
+
alert_view.show if opts[:show_now]
|
38
|
+
alert_view
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module RubyMotionQuery
|
2
|
+
class App
|
3
|
+
|
4
|
+
class << self
|
5
|
+
# UIAlertController Magic
|
6
|
+
def core_alert(opts = {}, &block)
|
7
|
+
|
8
|
+
opts = {
|
9
|
+
title: "Alert!",
|
10
|
+
style: :alert,
|
11
|
+
actions: [make_button(&block)],
|
12
|
+
animated: true,
|
13
|
+
show_now: true,
|
14
|
+
}.merge(opts)
|
15
|
+
style = RubyMotionQuery::AlertConstants::ALERT_TYPES[opts[:style]] || opts[:style]
|
16
|
+
|
17
|
+
ac = UIAlertController.alertControllerWithTitle(opts[:title], message:opts[:message], preferredStyle: style)
|
18
|
+
|
19
|
+
# Add correct actions (buttons) to the UIAC
|
20
|
+
if opts[:actions].is_a? Symbol
|
21
|
+
template_symbol = opts[:actions]
|
22
|
+
add_template_actions(ac, template_symbol, &block)
|
23
|
+
elsif opts[:actions].is_a? Array
|
24
|
+
opts[:actions].each do |action|
|
25
|
+
if action.is_a? UIAlertAction
|
26
|
+
ac.addAction(action)
|
27
|
+
else
|
28
|
+
raise ArgumentError, "RedAlert actions array must contain UIAlertAction objects"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
else
|
32
|
+
raise ArgumentError, "RedAlert actions parameter must be an Array or a Template symbol"
|
33
|
+
end
|
34
|
+
|
35
|
+
# Present it, if that's what we want
|
36
|
+
rmq.view_controller.presentViewController(ac, animated: opts[:animated], completion: nil) if opts[:show_now]
|
37
|
+
|
38
|
+
# return controller (should I wrap it in RMQ?)
|
39
|
+
ac
|
40
|
+
end
|
41
|
+
end # close eigenclass
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
data/lib/project/red_alert.rb
CHANGED
@@ -1,124 +1,48 @@
|
|
1
1
|
module RubyMotionQuery
|
2
|
-
class
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
# rmq.alert(title: "Hey there", message: "Are you happy?")
|
20
|
-
# @return [RMQ]
|
21
|
-
def alert(opts = {}, &block)
|
22
|
-
|
23
|
-
if opts.is_a? String
|
24
|
-
ok = make_button(&block)
|
25
|
-
core_alert(message: opts, actions: [ok])
|
26
|
-
else
|
27
|
-
core_alert(opts)
|
2
|
+
class App
|
3
|
+
class << self
|
4
|
+
|
5
|
+
# Creates and shows the UIAlertController.
|
6
|
+
# Usage Example:
|
7
|
+
# rmq.app.alert(message: "This is a test")
|
8
|
+
# rmq.app.alert(title: "Hey there", message: "Are you happy?")
|
9
|
+
# @return [UIAlertController]
|
10
|
+
def alert(opts = {}, &block)
|
11
|
+
# Shortcut: assume a string is the message
|
12
|
+
opts = {message: opts} if opts.is_a? String
|
13
|
+
|
14
|
+
# An alert is nothing without a message
|
15
|
+
raise(ArgumentError, "RedAlert alert requires a message") if RubyMotionQuery::RMQ.is_blank?(opts[:message])
|
16
|
+
# iOS8 and above only for UIAlertController
|
17
|
+
raise "RedAlert requires iOS8 for alerts. Please try `rmq.app.alert_view`" unless rmq.device.ios_at_least? 8
|
18
|
+
core_alert(opts, &block)
|
28
19
|
end
|
29
20
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
#
|
35
|
-
|
36
|
-
|
37
|
-
opts = {
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
opts[:actions].each do |action|
|
53
|
-
if action.is_a? UIAlertAction
|
54
|
-
ac.addAction(action)
|
55
|
-
elsif action.is_a? Hash
|
56
|
-
p "Parse and use hash as action"
|
57
|
-
else
|
58
|
-
raise ArgumentError, "RedAlert actions must be of type UIAlertAction or Hash"
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
# Present it, if that's what we want
|
63
|
-
rmq.view_controller.presentViewController(ac, animated: opts[:animated], completion: nil) if opts[:show_now]
|
64
|
-
|
65
|
-
# return it wrapped in RMQ
|
66
|
-
rmq(ac)
|
67
|
-
else
|
68
|
-
alert_view(opts)
|
21
|
+
# Returns a UIAlertAction from given parameters
|
22
|
+
# Usage Example:
|
23
|
+
# yes = rmq.make_button("Yes")
|
24
|
+
# cancel = rmq.make_button(title: "Cancel", style: :cancel) {
|
25
|
+
# puts "Cancel pressed"
|
26
|
+
# }
|
27
|
+
# @return [UIAlertAction]
|
28
|
+
def make_button (opts = {}, &block)
|
29
|
+
# shortcut sending a string
|
30
|
+
opts = {title: opts} if opts.is_a? String
|
31
|
+
|
32
|
+
opts = {
|
33
|
+
title: "OK",
|
34
|
+
style: :default,
|
35
|
+
}.merge(opts)
|
36
|
+
|
37
|
+
style = RubyMotionQuery::AlertConstants::ALERT_ACTION_STYLE[opts[:style]] || opts[:style]
|
38
|
+
|
39
|
+
UIAlertAction.actionWithTitle(opts[:title], style: style, handler: -> (action) {
|
40
|
+
title_symbol = action.title.gsub(/\s+/,"_").downcase.to_sym
|
41
|
+
block.call(title_symbol) unless block.nil?
|
42
|
+
})
|
69
43
|
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def make_button (opts = {}, &block)
|
73
|
-
opts = {
|
74
|
-
title: "OK",
|
75
|
-
style: :default,
|
76
|
-
}.merge(opts)
|
77
|
-
|
78
|
-
style = ALERT_ACTION_STYLE[opts[:style]] || opts[:style]
|
79
|
-
|
80
|
-
UIAlertAction.actionWithTitle(opts[:title], style: style, handler: -> (action) {
|
81
|
-
block.call unless block.nil?
|
82
|
-
})
|
83
|
-
end
|
84
|
-
|
85
|
-
|
86
|
-
# Creates and shows the old UIAlertView. Added here for use in fallback.
|
87
|
-
# Fallback won't run actions, but the old system needed delegates anyhow.
|
88
|
-
# Usage Example:
|
89
|
-
# rmq.alert_view(message: "This is a test")
|
90
|
-
# rmq.alert_view(title: "Hey there", message: "Are you happy?")
|
91
|
-
# @return [RMQ]
|
92
|
-
def alert_view(opts = {})
|
93
|
-
|
94
|
-
# shortcut sending a string
|
95
|
-
opts = {message: opts} if opts.is_a? String
|
96
|
-
# An alert is nothing without a message
|
97
|
-
raise(ArgumentError, "RedAlert requires a message") if opts[:message].nil? || opts[:message].empty?
|
98
|
-
|
99
|
-
opts = {
|
100
|
-
title: "Alert!",
|
101
|
-
cancel_button: "OK",
|
102
|
-
other_buttons: [],
|
103
|
-
delegate: nil,
|
104
|
-
view_style: UIAlertViewStyleDefault,
|
105
|
-
show_now: true,
|
106
|
-
}.merge(opts)
|
107
|
-
|
108
|
-
alert_view = UIAlertView.alloc.initWithTitle(
|
109
|
-
opts[:title],
|
110
|
-
message: opts[:message],
|
111
|
-
delegate: opts[:delegate],
|
112
|
-
cancelButtonTitle: opts[:cancel_button],
|
113
|
-
otherButtonTitles: nil
|
114
|
-
)
|
115
|
-
Array(opts[:other_buttons]).each { |button| alert_view.addButtonWithTitle(button) }
|
116
|
-
|
117
|
-
alert_view.alertViewStyle = opts[:view_style]
|
118
44
|
|
119
|
-
|
120
|
-
rmq(alert_view)
|
121
|
-
end
|
45
|
+
end # close eigenclass
|
122
46
|
|
123
|
-
end
|
47
|
+
end # close App
|
124
48
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: RedAlert
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gant
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby_motion_query
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.2.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.2.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,7 +38,7 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
description: Plugin adds efficient and dynamic alerts/sheets for
|
41
|
+
description: RMQ Plugin adds efficient and dynamic alerts/sheets for RubyMotion
|
42
42
|
email:
|
43
43
|
- GantMan@gmail.com
|
44
44
|
executables: []
|
@@ -46,6 +46,10 @@ extensions: []
|
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
48
|
- README.md
|
49
|
+
- lib/project/alert_constants.rb
|
50
|
+
- lib/project/button_templates.rb
|
51
|
+
- lib/project/classic_alert.rb
|
52
|
+
- lib/project/core_alert.rb
|
49
53
|
- lib/project/red_alert.rb
|
50
54
|
- lib/red_alert.rb
|
51
55
|
homepage: https://github.com/GantMan/RedAlert
|
@@ -71,5 +75,5 @@ rubyforge_project:
|
|
71
75
|
rubygems_version: 2.4.5
|
72
76
|
signing_key:
|
73
77
|
specification_version: 4
|
74
|
-
summary: Plugin adds efficient and dynamic alerts/sheets for
|
78
|
+
summary: RMQ Plugin adds efficient and dynamic alerts/sheets for RubyMotion.
|
75
79
|
test_files: []
|