sugarcube 1.5.8 → 1.5.9

Sign up to get free protection for your applications and to get access to all the features.
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