sugarcube 1.5.8 → 1.5.9

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: b8dbbc1d4e5f7c49ce2780738d89a4ba64350ac2
4
- data.tar.gz: 0afa5689aad18f713f60ad58ac6148950d56c5bf
3
+ metadata.gz: 095bfec455df3479380c6c660fc39317b97129a8
4
+ data.tar.gz: 14ec967daf20d6b0ea2090abd8098cab5c8c67d7
5
5
  SHA512:
6
- metadata.gz: d04fcfd788daaafb0684826016f0112933b94d94d2d234961c4c0a0673b5594dc87a5e4474ac3219b615e7f896372dced9f029db11948585d54e5162a6875a68
7
- data.tar.gz: 857c8b05d77e56b62faf0ea07212e8fbf9e836249f425f1dbff80a7d433b47467f9a63f381d7d93afd9f2ff5cdd4a4dd3a858b9619db8df12a1eca93cc65be61
6
+ metadata.gz: 718f2a93953af262d767e716c69ac2f824a639c9a5835590666b023082573fb0a4df6a2f02cbfe30055db44f573b7af79734fae1b6ef5ac8b7e37d14e799cc96
7
+ data.tar.gz: 65c9bab6c3b42c9de6c2ec3b977a5a685b7787080591e2883b1d754278bd228654ca73c8056d5f51c252eab2eaafda99e56c0667ed19b9586af6b9ab2d3e2f09
data/.travis.yml CHANGED
@@ -1,4 +1,7 @@
1
1
  language: objective-c
2
2
  before_install:
3
- - (ruby --version)
3
+ - brew update
4
+ - brew upgrade xctool
4
5
  - sudo motion update
6
+ - sudo chown -R travis ~/Library/RubyMotion
7
+ - mkdir -p ~/Library/RubyMotion/build
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sugarcube (1.5.8)
4
+ sugarcube (1.5.9)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -607,28 +607,62 @@ Factories
607
607
  ###### UIAlertView
608
608
 
609
609
  Accepts multiple buttons and handlers. In its simplest form, you can pass just
610
- a title and block.
610
+ a title and block. An optional `:message` can either be passed in as an option,
611
+ or as the 2nd positional arg.
612
+
613
+ Options:
614
+
615
+ UIAlertView.alert(options)
616
+ UIAlertView.alert(title, options)
617
+ UIAlertView.alert(title, message, options)
618
+ 0 => title => String - title of the alert. optional positional arg.
619
+ 1 => message => String - message of the alert. optional positional arg.
620
+ :title => String - title of the alert.
621
+ :message => String - message of the alert.
622
+ :success => Proc - the success handler
623
+ :cancel => Proc - the cancel handler
624
+ :buttons => [] - List of buttons ([cancel, others...])
625
+ :buttons => {} - Hash of buttons ({cancel:, others: ...}) in any order of course
626
+ :style => Symbol | Fixnum - A symbol (uialertstyle) or constant (UIAlertViewStyle*)
627
+ :show => Boolean - Whether to show the action sheet (default: true)
611
628
 
612
629
  ```ruby
613
- # simple
614
- UIAlertView.alert "This is happening, OK?" { self.happened! }
630
+ # simple title/message alert
631
+ UIAlertView.alert('This is happening, OK?', 'An optional message') do
632
+ self.it_happened!
633
+ end
615
634
 
616
635
  # a little more complex - the cancel button should be first, and the block will
617
- # receive a string, not an index
618
- UIAlertView.alert("This is happening, OK?", buttons: ["Nevermind", "OK"],
619
- message: "Don't worry, it'll be fine.") { |button|
620
- if button == "OK"
636
+ # receive a string and an index
637
+ UIAlertView.alert('This is happening, OK?',
638
+ message: 'Don't worry, it'll be fine.',
639
+ buttons: ['Nevermind', 'OK'],
640
+ ) do |button, button_index|
641
+ if button == 'OK' # or: button_index == 1
621
642
  self.happened!
622
643
  end
623
- }
644
+ end
624
645
 
625
646
  # Full on whiz-bangery. The cancel button should be the first entry in
626
647
  # `buttons:`. When you specify the success and cancel button handlers this way,
627
648
  # you need not assign both.
628
- UIAlertView.alert "I mean, is this cool?", buttons: %w[No! Sure! Hmmmm],
629
- message: "No going back now",
649
+ UIAlertView.alert('I mean, is this cool?',
650
+ buttons: ['No!', 'Sure!', 'Hmmmm'],
651
+ message: 'No going back now',
630
652
  cancel: proc { self.cancel },
631
- success: proc { |pressed| self.proceed if pressed == "Sure!" }
653
+ success: proc { |pressed| self.proceed if pressed == 'Sure!' }
654
+ )
655
+
656
+ # To keep up with BubbleWrap's awesome BW::ActionSheet and BW::AlertView
657
+ # helpers, SugarCube provides a similar interface.
658
+ UIAlertView.alert('Confirm action!', 'Are you sure you want to do this?',
659
+ buttons: {
660
+ cancel: 'No!',
661
+ success: 'Sure!',
662
+ unsure: 'Hmmm',
663
+ }) do |button|
664
+ # button will be :cancel, :success or :unsure
665
+ end
632
666
  ```
633
667
 
634
668
  ###### UIActionSheet
@@ -641,23 +675,54 @@ If you use an array of buttons (which you probably *should*), the order of
641
675
  arguments is `[:cancel, :destructive, :others, ...]`. If you *dont* want a
642
676
  cancel or destructive button, pass `nil` in place.
643
677
 
678
+ Options:
679
+
680
+ UIActionSheet.alert(options)
681
+ UIActionSheet.alert(title, options)
682
+ 0 => title => String - title of the action sheet
683
+ :title => Proc - title of the action sheet
684
+ :success => Proc - the success handler
685
+ :cancel => Proc - the cancel handler
686
+ :destructive => Proc - the destructive handler
687
+ :buttons => [] - List of buttons ([cancel, destructive, others...])
688
+ :buttons => {} - Hash of buttons ({cancel:, destructive:, others: ...}) in any order of course
689
+ :style => Symbol | Fixnum - A symbol (uiactionstyle) or constant (UIActionSheetStyle*)
690
+ :show => Boolean - Whether to show the action sheet (default: true)
691
+ :from => CGRect | UIBarButtonItem | UIToolbar | UITabBar | UIView (default: first window)
692
+ Where to display the alert. Mostly relevant on iPad.
693
+
644
694
  ```ruby
645
695
  # simple
646
- UIActionSheet.alert 'This is happening, OK?' { self.happened! }
647
- # a little more complex, with cancel and destructive buttons
648
- UIActionSheet.alert('This is happening, OK?', buttons: ['Sure!', 'OK']
649
- ) {
696
+ UIActionSheet.alert 'This is happening, OK?' do
650
697
  self.happened!
651
- }
698
+ end
699
+
700
+ # a little more complex, with cancel and destructive buttons
701
+ UIActionSheet.alert('This is happening, OK?', buttons: ['Cancel', 'Kill it!', 'Uh, what?']
702
+ ) do |button|
703
+ # button is 'Cancel', 'Kill it!' or 'Uh, what?'
704
+ end
652
705
 
653
- UIActionSheet.alert('Should I?', buttons: [nil, nil, 'OK', 'Nevermind']) { |pressed|
706
+ # skip cancel and destructive buttons:
707
+ UIActionSheet.alert('Should I?', buttons: [nil, nil, 'OK', 'Nevermind']) [ |pressed|
654
708
  self.do_it if pressed == 'OK'
655
- }
709
+ ]
656
710
 
657
711
  UIActionSheet.alert 'I mean, is this cool?', buttons: ['Nah', 'With fire!', 'Sure', 'whatever'],
658
712
  cancel: proc { self.cancel },
659
713
  destructive: proc { self.kill_it_with_fire }
660
714
  success: proc { |pressed| self.proceed if pressed == 'Sure' }
715
+
716
+ # By passing a Hash to buttons you can get this improved interface, similar to
717
+ # BubbleWrap's awesome interface.
718
+ UIActionSheet.alert('Well, how bout it?',
719
+ buttons: {
720
+ cancel: 'Cancel',
721
+ destructive: 'Kill it with fire!',
722
+ help: 'Tell me more'
723
+ }) do |button|
724
+ # button is :cancel, :destructive or :help
725
+ end
661
726
  ```
662
727
 
663
728
  ###### UIButton
@@ -1,3 +1,3 @@
1
1
  module SugarCube
2
- Version = '1.5.8'
2
+ Version = '1.5.9'
3
3
  end
@@ -35,21 +35,21 @@ class Symbol
35
35
  }
36
36
 
37
37
  @uicolors = {
38
- black: :blackColor,
39
- blue: :blueColor,
40
- brown: :brownColor,
41
- cyan: :cyanColor,
38
+ black: :blackColor,
39
+ blue: :blueColor,
40
+ brown: :brownColor,
41
+ cyan: :cyanColor,
42
42
  dark_gray: :darkGrayColor,
43
- gray: :grayColor,
44
- green: :greenColor,
43
+ gray: :grayColor,
44
+ green: :greenColor,
45
45
  light_gray: :lightGrayColor,
46
- magenta: :magentaColor,
47
- orange: :orangeColor,
48
- purple: :purpleColor,
49
- red: :redColor,
50
- yellow: :yellowColor,
51
- white: :whiteColor,
52
- clear: :clearColor,
46
+ magenta: :magentaColor,
47
+ orange: :orangeColor,
48
+ purple: :purpleColor,
49
+ red: :redColor,
50
+ yellow: :yellowColor,
51
+ white: :whiteColor,
52
+ clear: :clearColor,
53
53
 
54
54
  light_text: :lightTextColor,
55
55
  dark_text: :darkTextColor,
@@ -17,6 +17,11 @@ class UIActionSheet
17
17
  # # use one handler for all buttons
18
18
  # UIActionSheet.alert("title", buttons: [...]) { |button| }
19
19
  def self.alert(title, options={}, &block)
20
+ if title.is_a?(Hash)
21
+ options = title
22
+ title = options[:title]
23
+ end
24
+
20
25
  # create the delegate
21
26
  delegate = SugarCube::ActionSheetDelegate.new
22
27
  delegate.on_default = block
@@ -28,10 +33,10 @@ class UIActionSheet
28
33
  args = [title] # initWithTitle:
29
34
  args << delegate # delegate:
30
35
 
31
- buttons = []
32
- buttons.concat(options[:buttons]) if options[:buttons]
33
-
36
+ buttons = (options[:buttons] || []).freeze
34
37
  if buttons.empty?
38
+ buttons = [] # an empty Hash becomes an Array
39
+
35
40
  # cancelButtonTitle:
36
41
  buttons << nil
37
42
 
@@ -45,32 +50,53 @@ class UIActionSheet
45
50
  end
46
51
 
47
52
  # cancelButtonTitle:destructiveButtonTitle:otherButtonTitles:
48
- args.concat(buttons.map{ |s| s ? s.localized : nil })
53
+ # uses localized buttons in the actual alert
54
+ if buttons.is_a?(Hash)
55
+ if buttons.key?(:cancel)
56
+ args << (buttons[:cancel] && buttons[:cancel].localized)
57
+ else
58
+ args << nil
59
+ end
60
+ if buttons.key?(:destructive)
61
+ args << (buttons[:destructive] && buttons[:destructive].localized)
62
+ else
63
+ args << nil
64
+ end
65
+ args.concat(buttons.select { |k, m| k != :cancel && k != :destructive }.map { |k, m| m && m.localized })
66
+ else
67
+ args.concat(buttons.map { |m| m && m.localized })
68
+ end
49
69
  args << nil # otherButtonTitles:..., nil
50
70
 
51
71
  # the button titles, mapped to how UIActionSheet orders them. These are
52
72
  # passed to the success handler.
53
73
  buttons_mapped = {}
74
+ if buttons.is_a?(Hash)
75
+ button_titles = buttons.keys
76
+ else
77
+ button_titles = buttons
78
+ end
79
+
54
80
  if args[2] && args[3] # cancel && destructive buttons
55
- buttons_mapped[0] = buttons[1] # destructiveIndex == 0, button == 1
56
- buttons_mapped[buttons.length - 1] = buttons[0] # cancelIndex == last, button == 0
81
+ buttons_mapped[0] = button_titles[1] # destructiveIndex == 0, button == 1
82
+ buttons_mapped[button_titles.length - 1] = button_titles[0] # cancelIndex == last, button == 0
57
83
  # from first+1 to last-1
58
- buttons[2..-1].each_with_index do |button,index|
84
+ button_titles[2..-1].each_with_index do |button,index|
59
85
  buttons_mapped[index + 1] = button
60
86
  end
61
87
  elsif args[3] # destructive button
62
- buttons_mapped[0] = buttons[1] # destructiveIndex == 0, button == 1
88
+ buttons_mapped[0] = button_titles[1] # destructiveIndex == 0, button == 1
63
89
  # from first+1 to last-1
64
90
  buttons[2..-1].each_with_index do |button,index|
65
91
  buttons_mapped[index + 1] = button
66
92
  end
67
93
  elsif args[2] # cancel button
68
- buttons_mapped[buttons.length - 2] = buttons[0] # cancelIndex == last, button == 0
69
- buttons[2..-1].each_with_index do |button,index|
94
+ buttons_mapped[buttons.length - 2] = button_titles[0] # cancelIndex == last, button == 0
95
+ button_titles[2..-1].each_with_index do |button,index|
70
96
  buttons_mapped[index] = button
71
97
  end
72
98
  else
73
- buttons[2..-1].each_with_index do |button,index|
99
+ button_titles[2..-1].each_with_index do |button,index|
74
100
  buttons_mapped[index] = button
75
101
  end
76
102
  end
@@ -134,7 +160,7 @@ module SugarCube
134
160
  attr_accessor :on_destructive
135
161
  attr_accessor :on_success
136
162
 
137
- def actionSheet(alert, didDismissWithButtonIndex:index)
163
+ def actionSheet(alert, didDismissWithButtonIndex: index)
138
164
  handler = nil
139
165
  if index == alert.destructiveButtonIndex && on_destructive
140
166
  handler = on_destructive
@@ -148,12 +174,14 @@ module SugarCube
148
174
  if handler
149
175
  if handler.arity == 0
150
176
  handler.call
151
- elsif handler.arity == 1
152
- button = buttons[index]
153
- handler.call(button)
154
177
  else
155
178
  button = buttons[index]
156
- handler.call(button, index)
179
+
180
+ if handler.arity == 1
181
+ handler.call(button)
182
+ else
183
+ handler.call(button, index)
184
+ end
157
185
  end
158
186
  end
159
187
 
@@ -1,22 +1,38 @@
1
1
  class UIAlertView
2
2
 
3
- # UIAlertView.alert("title",
4
- # message: "help!",
5
- # # The first button is considered the 'cancel' button, for the purposes of
6
- # # whether the cancel or success handler gets called
7
- # buttons: %w"Cancel OK No-way",
8
- # cancel: proc{ puts "nevermind" },
9
- # success: proc{ |pressed| puts "pressed: #{pressed}" },
10
- # )
11
- #
12
- # If you choose
3
+ # @example
4
+ # UIAlertView.alert("title",
5
+ # message: "help!",
6
+ # # The first button is considered the 'cancel' button, for the purposes of
7
+ # # whether the cancel or success handler gets called
8
+ # buttons: %w"Cancel OK No-way",
9
+ # cancel: proc{ puts "nevermind" },
10
+ # success: proc{ |pressed| puts "pressed: #{pressed}" },
11
+ # )
12
+ # # you can explicitly set the cancel button by using a Hash for the :buttons option
13
+ # UIAlertView.alert("title",
14
+ # message: "help!",
15
+ # # The first button is considered the 'cancel' button, for the purposes of
16
+ # # whether the cancel or success handler gets called
17
+ # buttons: { cancel: 'Cancel', ok: 'OK', no_way: 'No-way' },
18
+ # cancel: proc{ puts "nevermind" },
19
+ # success: proc{ |pressed| puts "pressed: #{pressed.inspect}" },
20
+ # ) # pressed will be :ok or :no_way
13
21
  def self.alert(title, options={}, more_options={}, &block)
14
- if options.is_a? String
15
- more_options[:message] = options
22
+ if title.is_a?(Hash)
23
+ options = title
24
+ title = options[:title]
25
+ message = options[:message]
26
+ elsif options.is_a? String
27
+ message = options
16
28
  options = more_options
29
+ else
30
+ message = options[:message]
17
31
  end
18
32
 
19
- # create the delegate
33
+ # The delegate gets retained here because UIAlertView#delegate is a weak
34
+ # reference. It's released in the delegate method
35
+ # `#didDismissWithButtonIndex(index)`
20
36
  delegate = SugarCube::AlertViewDelegate.new
21
37
  delegate.on_success = options[:success]
22
38
  delegate.on_cancel = options[:cancel]
@@ -24,11 +40,13 @@ class UIAlertView
24
40
  delegate.send(:retain)
25
41
 
26
42
  args = [title] # initWithTitle:
27
- args << options[:message] # message:
43
+ args << message # message:
28
44
  args << delegate # delegate:
29
45
 
30
- buttons = options[:buttons] || []
46
+ buttons = (options[:buttons] || []).freeze
31
47
  if buttons.empty?
48
+ buttons = [] # an empty Hash becomes an Array
49
+
32
50
  # cancelButtonTitle: is first, so check for cancel
33
51
  if options[:cancel]
34
52
  buttons << "Cancel"
@@ -41,19 +59,35 @@ class UIAlertView
41
59
  elsif options[:success]
42
60
  buttons << "OK"
43
61
  end
62
+ elsif buttons.is_a?(Hash)
63
+
44
64
  elsif buttons.length == 1 && options[:cancel]
45
65
  raise "If you only have one button, use a :success handler, not :cancel (and definitely not BOTH)"
46
66
  end
47
67
 
48
68
  # the button titles. These are passed to the success handler.
49
- delegate.buttons = buttons
69
+ if buttons.is_a?(Hash)
70
+ button_titles = buttons.keys
71
+ else
72
+ button_titles = buttons
73
+ end
74
+ delegate.buttons = button_titles
50
75
 
51
76
  # uses localized buttons in the actual alert
52
- args.concat(buttons.map { |m| m && m.localized })
77
+ if buttons.is_a?(Hash)
78
+ if buttons.key?(:cancel)
79
+ args << (buttons[:cancel] && buttons[:cancel].localized)
80
+ else
81
+ args << nil
82
+ end
83
+ args.concat(buttons.select { |k, m| k != :cancel }.map { |k, m| m && m.localized })
84
+ else
85
+ args.concat(buttons.map { |m| m && m.localized })
86
+ end
53
87
  args << nil # otherButtonTitles:..., nil
54
88
 
55
89
  alert = self.alloc
56
- alert.send(:"initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:", *args)
90
+ alert.send("initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:", *args)
57
91
  if options.key?(:style)
58
92
  style = options[:style]
59
93
  style = style.uialertstyle if style.respond_to?(:uialertstyle)
@@ -115,6 +149,7 @@ module SugarCube
115
149
  # but only send the ones they asked for
116
150
  args = args[0...handler.arity]
117
151
  end
152
+
118
153
  handler.call(*args)
119
154
  end
120
155
 
data/runtests CHANGED
@@ -1 +1,3 @@
1
- rake spec && rake spec retina=3.5 output=tap && rake spec retina=4 output=tap
1
+ rake spec output=tap && \
2
+ rake spec retina=3.5 output=tap && \
3
+ rake spec retina=4 output=tap