everyday-menu 0.1.1 → 0.2.0

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: 8629e47d2c83c578b36c97f19929b19510a2f109
4
- data.tar.gz: 33d50f3c20d86ade4efb059ca5c540ec8fc3fd5e
3
+ metadata.gz: da6d30cd6c8e784123bf3c01669eb99c27c29b82
4
+ data.tar.gz: 351d736ce3c8d45269d1432ad0573641e9346786
5
5
  SHA512:
6
- metadata.gz: d52d5545f858e73378246066a05eb524fab4363eacc03cba1876d80e9c5b6f58a86342c2736884b9313a85d0a3ce49645da321bb7df7f1a45c3ae52199e8e2e3
7
- data.tar.gz: 4cfac1436396e77297c61d1745eab23bbb455baa64b184146fa73310b1c599de978887be0ed59f62ab10a7a04e05a8d5f9103ddc213440474019bba0aed4cdcc
6
+ metadata.gz: 4deb36dd997d2e87e0bdad716a60ea03b79f5a359ecc765e29353a04dcb011d4a2ccfb948a5ac4283c303fc57de7728dff3c7cb4453682169f8afabecd8d4046
7
+ data.tar.gz: 1b3401db78117dfedf598c2f48f6feae52c598da6c7a2b88e05ab8b6b61cdfa2edfb9114e7f1ca17aec716ddc9e8a17abe601e5b1a1d889735d2f9813324f9e2
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # EverydayMenu
2
2
 
3
+ ## Issue Tracking
4
+ Please use <https://everydayprogramminggenius.atlassian.net/browse/EM> for issue tracking.
5
+
3
6
  ## Credit
4
7
  Please note that this gem is strongly based off of Joe Fiorini's `drink-menu` gem (with a little code copy-paste and lots of test and readme copy-paste), which I couldn't get to work for me.
5
8
 
@@ -28,35 +31,62 @@ Everyday Menu separates menu layout from menu definition. Menu definition looks
28
31
  class MainMenu
29
32
  extend EverydayMenu::MenuBuilder
30
33
 
31
- menuItem :create_site, 'Create Site'
32
- menuItem :export, 'Export to Folder...'
33
- menuItem :import, 'Import Folder as Site...'
34
- menuItem :force_rebuild, 'Force Rebuild'
35
- menuItem :about, 'About Staticly'
36
34
  menuItem :quit, 'Quit', key_equivalent: 'q'
35
+
36
+ menuItem :open, 'Open', key_equivalent: 'o'
37
+ menuItem :new, 'New'
38
+ menuItem :close, 'Close', key_equivalent: 'w'
37
39
  end
40
+
38
41
  ```
39
42
 
40
- and then layout is as simple as:
43
+ Layout is as simple as:
41
44
 
42
45
  ```ruby
43
-
44
46
  class MainMenu
45
47
  extend EverydayMenu::MenuBuilder
46
48
 
47
- mainMenu :main_menu, 'Main Menu' do
48
- create_site
49
- ___
50
- export
51
- import
52
- force_rebuild
53
- ___
54
- about
49
+ mainMenu(:app, 'Blah') {
55
50
  quit
51
+ }
52
+
53
+ mainMenu(:file, 'File') {
54
+ new
55
+ open
56
+ ___
57
+ close
58
+ }
59
+ end
60
+ ```
61
+
62
+ And actions are as simple as:
63
+ ```ruby
64
+ class AppDelegate
65
+ def applicationDidFinishLaunching(notification)
66
+ @has_open = false
67
+ MainMenu.build!
68
+
69
+ MainMenu[:app].subscribe(:quit) { |_, _| NSApp.terminate(self) }
70
+
71
+ MainMenu[:file].subscribe(:new) { |_, _|
72
+ @has_open = true
73
+ puts 'new'
74
+ }
75
+
76
+ MainMenu[:file].subscribe(:close) { |_, _|
77
+ @has_open = false
78
+ puts 'close'
79
+ }.canExecuteBlock { |_| @has_open }
80
+
81
+ MainMenu[:file].subscribe(:open) { |_, _|
82
+ @has_open = true
83
+ puts 'open'
84
+ }
56
85
  end
57
86
  end
58
87
  ```
59
88
 
89
+
60
90
  ## Running the Examples
61
91
 
62
92
  To run our example apps:
@@ -1,24 +1,23 @@
1
1
  class AppDelegate
2
-
3
2
  def applicationDidFinishLaunching(notification)
3
+ @has_open = false
4
4
  MainMenu.build!
5
5
 
6
- MainMenu[:app].subscribe :quit do |_|
7
- NSApp.terminate(self)
8
- end
6
+ MainMenu[:app].subscribe(:quit) { |_, _| NSApp.terminate(self) }
9
7
 
10
- MainMenu[:file].subscribe :new do |_|
8
+ MainMenu[:file].subscribe(:new) { |_, _|
9
+ @has_open = true
11
10
  puts 'new'
12
- end
11
+ }
13
12
 
14
- MainMenu[:file].subscribe :close do |_|
13
+ MainMenu[:file].subscribe(:close) { |_, _|
14
+ @has_open = false
15
15
  puts 'close'
16
- end
16
+ }.canExecuteBlock { |_| @has_open }
17
17
 
18
- MainMenu[:file].subscribe :open do |_|
18
+ MainMenu[:file].subscribe(:open) { |_, _|
19
+ @has_open = true
19
20
  puts 'open'
20
- end
21
-
21
+ }
22
22
  end
23
-
24
23
  end
@@ -2,19 +2,19 @@ class MainMenu
2
2
  extend EverydayMenu::MenuBuilder
3
3
 
4
4
  menuItem :quit, 'Quit', key_equivalent: 'q'
5
+
5
6
  menuItem :open, 'Open', key_equivalent: 'o'
6
7
  menuItem :new, 'New'
7
-
8
8
  menuItem :close, 'Close', key_equivalent: 'w'
9
9
 
10
- mainMenu :app, 'Blah' do
10
+ mainMenu(:app, 'Blah') {
11
11
  quit
12
- end
12
+ }
13
13
 
14
- mainMenu :file, 'File' do
14
+ mainMenu(:file, 'File') {
15
15
  new
16
16
  open
17
17
  ___
18
18
  close
19
- end
19
+ }
20
20
  end
@@ -0,0 +1,50 @@
1
+ module EverydayMenu
2
+ class EverydayCommand
3
+ attr_reader :label
4
+ attr_writer :canExecute
5
+
6
+ def initialize(label, canExecute = true, &block)
7
+ @label = label
8
+ @block = block
9
+ @canExecute = canExecute
10
+ @canExecuteBlock = nil
11
+ end
12
+
13
+ def canExecuteBlock(&block)
14
+ @canExecuteBlock = block
15
+ end
16
+
17
+ def canExecute
18
+ @canExecuteBlock.nil? ? @canExecute : @canExecuteBlock.call(self)
19
+ end
20
+
21
+ def execute(sender)
22
+ @block.call(self, sender)
23
+ end
24
+ end
25
+
26
+ class CommandList
27
+ attr_accessor :label
28
+
29
+ def initialize(label)
30
+ @label = label
31
+ @items = []
32
+ end
33
+
34
+ def add(&block)
35
+ @items << EverydayCommand.new(@label, &block)
36
+ end
37
+
38
+ def last
39
+ @items.last
40
+ end
41
+
42
+ def execute(sender)
43
+ @items.each { |item| item.execute(sender) }
44
+ end
45
+
46
+ def canExecute
47
+ @items.any? { |item| item.canExecute }
48
+ end
49
+ end
50
+ end
@@ -98,7 +98,7 @@ module EverydayMenu
98
98
  alias :tag= :setTag
99
99
 
100
100
  def subscribe(&block)
101
- @menuItem.subscribe(&block)
101
+ @menuItem.subscribe(self.label, &block)
102
102
  end
103
103
 
104
104
  def execute
@@ -108,16 +108,25 @@ module EverydayMenu
108
108
  end
109
109
 
110
110
  class NSMenuItem
111
- def subscribe(&block)
112
- @blocks ||= []
113
- @blocks << block
114
- return if (self.target = self && self.action == :'runBlocks:')
111
+ attr_reader :commands
112
+
113
+ def subscribe(label, &block)
114
+ @commands ||= EverydayMenu::CommandList.new(label)
115
+ @commands.add &block
116
+ command = @commands.last
117
+ self.enabled = @commands.canExecute
118
+ unless @boundEnabled
119
+ @boundEnabled = true
120
+ self.bind(NSEnabledBinding, toObject: self.commands, withKeyPath: 'canExecute', options: nil)
121
+ end
122
+ return command if (self.target = self && self.action == :'runBlocks:')
115
123
  @original_target = self.target
116
124
  self.target = self
117
125
  self.action = :'runBlock:'
126
+ command
118
127
  end
119
128
 
120
129
  def runBlock(sender)
121
- @blocks.each { |block| block.call(sender) } unless @blocks.nil?
130
+ @commands.execute(sender) unless @commands.nil?
122
131
  end
123
132
  end
@@ -1,3 +1,3 @@
1
1
  module EverydayMenu
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: everyday-menu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Henderson
@@ -55,6 +55,7 @@ files:
55
55
  - examples/basic_main_menu/app_delegate.rb
56
56
  - examples/basic_main_menu/main_menu.rb
57
57
  - lib/everyday-menu.rb
58
+ - lib/everyday-menu/everyday_command.rb
58
59
  - lib/everyday-menu/menu.rb
59
60
  - lib/everyday-menu/menu_builder.rb
60
61
  - lib/everyday-menu/menu_item.rb