everyday-menu 0.3.0 → 0.4.0

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: 4c86edc8a146c2c3b4de839336fa419abef9a406
4
- data.tar.gz: c2c7ed2317237e3d80915daa45ceee890e5f17b8
3
+ metadata.gz: 4519240679e0389183ed2e8dba773a4ed67c970a
4
+ data.tar.gz: 9ed56ec79c9022bc2bdeff2f6603363567b3f17b
5
5
  SHA512:
6
- metadata.gz: fe680c8e891ee03cab8aa1a5e2a931426da4f587d46e2e6bc7e4c5741d8e16f69ce46d6e51789966ac4bc2eadfd4086d7b517eea8afc5c78aeac065c8dbaad74
7
- data.tar.gz: 5ce81bad9ca66feb8c8626a7e02955e4800ef58d851d7cf82fe1d68d67b18b973085400bdb023d64dbbd5a47eda079bf3fa753a8916bc7e2ebc9a962dfc762d2
6
+ metadata.gz: 96ac26b404b7f1bcd0dc78fa3118041e77fdb995084961e0c1e877b8f72fe76c1f86e3419438ae83ee930b30445bdec8e74c919ca8d8fbd8f7c755749a9daf8e
7
+ data.tar.gz: 7a4ce75150edbe04fb1b8cb7ea985459265625a31e2d17ab5317cd81fdd159a79b42ed151a4cd52eaca07356f3affd5515109d7cbc17f606ce772d98f6a5b9c1
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # EverydayMenu
2
2
 
3
+ ## Updates
4
+ Please see the "Introducing Presets!" section below for an awesome new feature!
5
+
3
6
  ## Issue Tracking
4
7
  Please use <https://everydayprogramminggenius.atlassian.net/browse/EM> for issue tracking.
5
8
 
@@ -94,6 +97,87 @@ class AppDelegate
94
97
  end
95
98
  end
96
99
  ```
100
+
101
+ You can even put multiple actions on a single item by calling subscribe multiple times.
102
+
103
+ ## Introducing Presets!
104
+ With version 0.4.0, I have added the capability to use some presets. Here is the above example with presets:
105
+
106
+ ```ruby
107
+ class MainMenu
108
+ extend EverydayMenu::MenuBuilder
109
+
110
+ menuItem :hide_others, 'Hide Others', preset: :hide_others
111
+ menuItem :show_all, 'Show All', preset: :show_all
112
+ menuItem :quit, 'Quit', preset: :quit
113
+
114
+ menuItem :services_item, 'Services', preset: :services
115
+
116
+ menuItem :open, 'Open', key_equivalent: 'o'
117
+ menuItem :new, 'New'
118
+ menuItem :close, 'Close', key_equivalent: 'w'
119
+ end
120
+ ```
121
+
122
+ with actions defined as:
123
+
124
+ ```ruby
125
+ class AppDelegate
126
+ def applicationDidFinishLaunching(notification)
127
+ @has_open = false
128
+ MainMenu.build!
129
+
130
+ MainMenu[:file].subscribe(:new) { |_, _|
131
+ @has_open = true
132
+ puts 'new'
133
+ }
134
+ MainMenu[:file].subscribe(:close) { |_, _|
135
+ @has_open = false
136
+ puts 'close'
137
+ }.canExecuteBlock { |_| @has_open }
138
+ MainMenu[:file].subscribe(:open) { |_, _|
139
+ @has_open = true
140
+ puts 'open'
141
+ }
142
+ end
143
+ end
144
+ ```
145
+
146
+ I didn't use a preset for close because there was special handling. Here are the presets and what they do:
147
+
148
+ Preset | Settings | Action
149
+ --------|-----------------------|------------------------------
150
+ `:hide` | `key_equivalent: 'h'` | <code>{ &#124;_, _&#124; NSApp.hide(self) }</code>
151
+ `:hide_others` | `key_equivalent: 'H'` <br> and <br> <code>:key\_equivalent\_modifier_mask: NSCommandKeyMask&#124;NSAlternateKeyMask</code> | <code>{ &#124;_, _&#124; NSApp.hideOtherApplications(self) }</code>
152
+ `:show_all` | none | <code>{ &#124;_, _&#124; NSApp.unhideAllApplications(self) }</code>
153
+ `:quit` | `key_equivalent: 'q'` | <code>{ &#124;_, _&#124; NSApp.terminate(self) }</code>
154
+ `:close` | `key_equivalent: 'w'` | <code>{ &#124;_, _&#124; NSApp.keyWindow.performClose(self) }</code>
155
+ `:services` | `submenu: (menu :services, <item-title>, services_menu: true)` | none
156
+
157
+ Let me know if you have any others you think I should add. If you want to add one of your own, I have included the ability to define presets. You will want to do this at the top of the file where you setup your menu items. Here is an example:
158
+
159
+ ```ruby
160
+ EverydayMenu::MenuItem.definePreset(:hide_others) { |item|
161
+ item[:key_equivalent] = 'H'
162
+ item[:key_equivalent_modifier_mask] = NSCommandKeyMask|NSAlternateKeyMask
163
+ item.subscribe { |_, _| NSApp.hideOtherApplications(item) }
164
+ }
165
+ ```
166
+
167
+ Since the block is being run after the item instance is created, you have to use the other syntax, `item[<key>]=` in order to set the values. If you want to create a submenu in this, you can use `EverydayMenu::Menu.create(label, title, options = {})`, which accepts the same parameters as the `menu` method when building the menu normally.
168
+
169
+ If you set some application property (like `NSApp.servicesMenu`) in your method, you should probably have that delayed until the whole menu setup is built. You can do that like this:
170
+
171
+ ```ruby
172
+ EverydayMenu::MenuItem.definePreset(:services) { |item|
173
+ item[:submenu] = Menu.create(:services_menu, item[:title], services_menu: true)
174
+ item.registerOnBuild { NSApp.servicesMenu = item[:submenu] }
175
+ }
176
+ ```
177
+
178
+ Any block you pass to `item.registerOnBuild(&block)` will be added to a list of blocks to be run when the menu setup is built.
179
+
180
+
97
181
  ## Known Issues
98
182
 
99
183
  Here are known issues. If you encounter one, please log a bug ticket in the issue tracker (link above)
@@ -3,19 +3,14 @@ class AppDelegate
3
3
  @has_open = false
4
4
  MainMenu.build!
5
5
 
6
- MainMenu[:app].subscribe(:hide_others) { |_, _| NSApp.hideOtherApplications(self) }
7
- MainMenu[:app].subscribe(:quit) { |_, _| NSApp.terminate(self) }
8
-
9
6
  MainMenu[:file].subscribe(:new) { |_, _|
10
7
  @has_open = true
11
8
  puts 'new'
12
9
  }
13
-
14
10
  MainMenu[:file].subscribe(:close) { |_, _|
15
11
  @has_open = false
16
12
  puts 'close'
17
13
  }.canExecuteBlock { |_| @has_open }
18
-
19
14
  MainMenu[:file].subscribe(:open) { |_, _|
20
15
  @has_open = true
21
16
  puts 'open'
@@ -1,11 +1,11 @@
1
1
  class MainMenu
2
2
  extend EverydayMenu::MenuBuilder
3
3
 
4
- menuItem :hide_others, 'Hide Others', key_equivalent: 'H', key_equivalent_modifier_mask: NSCommandKeyMask|NSAlternateKeyMask
5
- menuItem :quit, 'Quit', key_equivalent: 'q'
4
+ menuItem :hide_others, 'Hide Others', preset: :hide_others
5
+ menuItem :show_all, 'Show All', preset: :show_all
6
+ menuItem :quit, 'Quit', preset: :quit
6
7
 
7
- menu :services, 'Services', services_menu: true
8
- menuItem :services_item, 'Services', submenu: :services
8
+ menuItem :services_item, 'Services', preset: :services
9
9
 
10
10
  menuItem :open, 'Open', key_equivalent: 'o'
11
11
  menuItem :new, 'New'
@@ -13,6 +13,7 @@ class MainMenu
13
13
 
14
14
  mainMenu(:app, 'Blah') {
15
15
  hide_others
16
+ show_all
16
17
  ___
17
18
  services_item
18
19
  ___
@@ -83,6 +83,19 @@ module EverydayMenu
83
83
  prefix.nil? ? rval : "#{prefix}#{rval[0].upcase}#{rval[1..-1]}"
84
84
  end
85
85
 
86
+ def runOnBuild
87
+ if self.is :services_menu
88
+ NSApp.servicesMenu = self.menu
89
+ end
90
+ if self.is :windows_menu
91
+ NSApp.windowsMenu = self.menu
92
+ end
93
+ if self.is :help_menu
94
+ NSApp.helpMenu = self.menu
95
+ end
96
+ @menuItems.each { |item| item.runOnBuild }
97
+ end
98
+
86
99
  def label
87
100
  @label ||= nil
88
101
  end
@@ -193,5 +206,9 @@ module EverydayMenu
193
206
  end
194
207
 
195
208
  alias :select_item_by_member :selectItemByMember
209
+
210
+ def each(&block)
211
+ @menuItems.values.each(&block)
212
+ end
196
213
  end
197
214
  end
@@ -57,15 +57,7 @@ module EverydayMenu
57
57
  @mainMenu ||= NSMenu.new
58
58
  @mainMenu.addItem menu.menuItemFromMenu!.menuItem
59
59
  end
60
- if menu.is :services_menu
61
- NSApp.servicesMenu = menu.menu
62
- end
63
- if menu.is :windows_menu
64
- NSApp.windowsMenu = menu.menu
65
- end
66
- if menu.is :help_menu
67
- NSApp.helpMenu = menu.menu
68
- end
60
+ menu.runOnBuild
69
61
  end
70
62
  setupMainMenu if @mainMenu
71
63
  end
@@ -108,6 +108,61 @@ module EverydayMenu
108
108
  alias :keyEquivalentModifierMask= :setKeyEquivalentModifierMask
109
109
  alias :key_equivalent_modifier_mask= :setKeyEquivalentModifierMask
110
110
 
111
+ def setPreset(action)
112
+ @@presets ||= {}
113
+ if @@presets.has_key?(action)
114
+ @@presets[action].call(self)
115
+ end
116
+ end
117
+
118
+ def self.definePreset(label, &block)
119
+ @@presets ||= {}
120
+ @@presets[label] = block
121
+ end
122
+
123
+ definePreset(:hide) { |item|
124
+ item[:key_equivalent] = 'h'
125
+ item.subscribe { |_, _| NSApp.hide(item) }
126
+ }
127
+
128
+ definePreset(:hide_others) { |item|
129
+ item[:key_equivalent] = 'H'
130
+ item[:key_equivalent_modifier_mask] = NSCommandKeyMask|NSAlternateKeyMask
131
+ item.subscribe { |_, _| NSApp.hideOtherApplications(item) }
132
+ }
133
+
134
+ definePreset(:show_all) { |item|
135
+ item.subscribe { |_, _| NSApp.unhideAllApplications(item) }
136
+ }
137
+
138
+ definePreset(:quit) { |item|
139
+ item[:key_equivalent] = 'q'
140
+ item.subscribe { |_, _| NSApp.terminate(item) }
141
+ }
142
+
143
+ definePreset(:close) { |item|
144
+ item[:key_equivalent] = 'w'
145
+ item.subscribe { |_, _| NSApp.keyWindow.performClose(item) }
146
+ }
147
+
148
+ definePreset(:services) { |item|
149
+ item[:submenu] = Menu.create(:services_menu, item[:title], services_menu: true)
150
+ item.registerOnBuild { NSApp.servicesMenu = item[:submenu] }
151
+ }
152
+
153
+ def runOnBuild
154
+ onBuild.each { |block| block.call }
155
+ end
156
+
157
+ def onBuild
158
+ @onBuild ||= []
159
+ end
160
+
161
+ def registerOnBuild(&block)
162
+ @onBuild ||= []
163
+ @onBuild << block
164
+ end
165
+
111
166
  def subscribe(&block)
112
167
  @menuItem.subscribe(self.label, &block)
113
168
  end
@@ -1,3 +1,3 @@
1
1
  module EverydayMenu
2
- VERSION = '0.3.0'
2
+ VERSION = '0.4.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.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Henderson