drink-menu 0.1.0 → 0.1.1
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/Rakefile +4 -0
- data/examples/basic_main_menu/app_delegate.rb +24 -0
- data/examples/basic_main_menu/main_menu.rb +32 -0
- data/lib/drink-menu/menu.rb +24 -0
- data/lib/drink-menu/menu_builder.rb +16 -1
- data/lib/drink-menu/version.rb +1 -1
- data/spec/menu_builder_spec.rb +40 -9
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a271cb84ff5bcafdc557d9413b0d4a12a7f5860
|
4
|
+
data.tar.gz: 341c7658bf3bf5699a169b83217da897f7ede78c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 579a9cfc385fddb960177447ffe87a968f01c0991c905163d0bc6edba0a4357c917759f223ae00fdb89e5f295c60eea99b80336a21731d5ac114bafce84e22b7
|
7
|
+
data.tar.gz: c6c7198e649ae76722ea91ec76825be29a44a0a853545516002718379896527eaafc7232136ff07bbeb8555dec9f726f233239d83ddbfeb40e9ff84490ec24f5
|
data/Rakefile
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
class AppDelegate
|
2
|
+
|
3
|
+
def applicationDidFinishLaunching(notification)
|
4
|
+
MainMenu.build!
|
5
|
+
|
6
|
+
MainMenu[:app].subscribe :quit do |_|
|
7
|
+
NSApp.terminate(self)
|
8
|
+
end
|
9
|
+
|
10
|
+
MainMenu[:file].subscribe :new do |_|
|
11
|
+
puts "new"
|
12
|
+
end
|
13
|
+
|
14
|
+
MainMenu[:file].subscribe :close do |_|
|
15
|
+
puts "close"
|
16
|
+
end
|
17
|
+
|
18
|
+
MainMenu[:file].subscribe :open do |_|
|
19
|
+
puts "open"
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class MainMenu
|
2
|
+
extend DrinkMenu::MenuBuilder
|
3
|
+
|
4
|
+
menuItem :quit do |item|
|
5
|
+
item.title = 'Quit'
|
6
|
+
item.keyEquivalent = 'q'
|
7
|
+
end
|
8
|
+
|
9
|
+
menuItem :open do |item|
|
10
|
+
item.title = 'Open'
|
11
|
+
item.keyEquivalent = 'o'
|
12
|
+
end
|
13
|
+
|
14
|
+
menuItem :new, title: 'New'
|
15
|
+
|
16
|
+
menuItem :close do |item|
|
17
|
+
item.title = 'Close'
|
18
|
+
item.keyEquivalent = 'w'
|
19
|
+
end
|
20
|
+
|
21
|
+
mainMenu :app, title: 'Blah' do
|
22
|
+
quit
|
23
|
+
end
|
24
|
+
|
25
|
+
mainMenu :file, title: 'File' do
|
26
|
+
new
|
27
|
+
open
|
28
|
+
___
|
29
|
+
close
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
data/lib/drink-menu/menu.rb
CHANGED
@@ -36,6 +36,14 @@ module DrinkMenu
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
+
def self.menuWithLabel(label, title: title, menuItem: needsMenuItem, &block)
|
40
|
+
new(label, &block).tap do |menu|
|
41
|
+
menu.title = title
|
42
|
+
menu.createMenuItemWithTitle title if needsMenuItem
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
39
47
|
def self.menuWithLabel(label, title: title, &block)
|
40
48
|
new(label, &block).tap do |menu|
|
41
49
|
menu.title = title
|
@@ -72,6 +80,8 @@ module DrinkMenu
|
|
72
80
|
@label = label
|
73
81
|
@builder = block
|
74
82
|
@menu = NSMenu.alloc.init
|
83
|
+
@needsStatusItem = false
|
84
|
+
@needsMenuItem = false
|
75
85
|
end
|
76
86
|
|
77
87
|
def <<(item)
|
@@ -81,6 +91,10 @@ module DrinkMenu
|
|
81
91
|
@menu.addItem item.menuItem
|
82
92
|
end
|
83
93
|
|
94
|
+
def menuItemFromMenu!
|
95
|
+
@mainMenuItem ||= MenuItem.itemWithLabel(label, title: title, submenu: self)
|
96
|
+
end
|
97
|
+
|
84
98
|
def addMenuItemForMember(member)
|
85
99
|
item = MenuItem.itemWithLabel(member.hash.to_s, title: member.send(memberTitleProperty))
|
86
100
|
item.representedObject = member
|
@@ -101,6 +115,7 @@ module DrinkMenu
|
|
101
115
|
end
|
102
116
|
end
|
103
117
|
|
118
|
+
# Only works when built with menuWithLabel:itemsFromCollection:titleProperty
|
104
119
|
def subscribeToMembers(&block)
|
105
120
|
memberCommand.signal.subscribeNext(block)
|
106
121
|
end
|
@@ -109,6 +124,11 @@ module DrinkMenu
|
|
109
124
|
self[itemLabel].subscribe(&block)
|
110
125
|
end
|
111
126
|
|
127
|
+
def createMenuItemWithTitle(title)
|
128
|
+
@needsMenuItem = true
|
129
|
+
@statusItemTitle = title
|
130
|
+
end
|
131
|
+
|
112
132
|
def createStatusItemWithTitle(title)
|
113
133
|
@needsStatusItem = true
|
114
134
|
@statusItemTitle = title
|
@@ -151,6 +171,10 @@ module DrinkMenu
|
|
151
171
|
@needsStatusItem
|
152
172
|
end
|
153
173
|
|
174
|
+
def needsMenuItem?
|
175
|
+
@needsMenuItem
|
176
|
+
end
|
177
|
+
|
154
178
|
def createStatusItem!
|
155
179
|
statusBar = NSStatusBar.systemStatusBar
|
156
180
|
@statusItem = statusBar.statusItemWithLength(NSSquareStatusItemLength)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module DrinkMenu
|
2
2
|
module MenuBuilder
|
3
3
|
|
4
|
-
class Context
|
4
|
+
class Context < BasicObject
|
5
5
|
def initialize(menu, menuItems={})
|
6
6
|
@menu = menu
|
7
7
|
@menuItems = menuItems
|
@@ -55,6 +55,11 @@ module DrinkMenu
|
|
55
55
|
@menus[label] = Menu.statusMenuWithLabel label, icon: image, &block
|
56
56
|
end
|
57
57
|
|
58
|
+
def mainMenu(label, title: title, &block)
|
59
|
+
@menus ||= {}
|
60
|
+
@menus[label] = Menu.menuWithLabel label, title: title, menuItem: true, &block
|
61
|
+
end
|
62
|
+
|
58
63
|
def menu(label, title: title, &block)
|
59
64
|
@menus ||= {}
|
60
65
|
@menus[label] = Menu.menuWithLabel label, title: title, &block
|
@@ -75,8 +80,18 @@ module DrinkMenu
|
|
75
80
|
context.instance_eval(&menu.builder) if menu.builder
|
76
81
|
if menu.needsStatusItem?
|
77
82
|
menu.createStatusItem!
|
83
|
+
elsif menu.needsMenuItem?
|
84
|
+
@mainMenu ||= NSMenu.new
|
85
|
+
@mainMenu.addItem menu.menuItemFromMenu!.menuItem
|
78
86
|
end
|
79
87
|
end
|
88
|
+
setupMainMenu if @mainMenu
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def setupMainMenu
|
94
|
+
NSApp.mainMenu = @mainMenu
|
80
95
|
end
|
81
96
|
|
82
97
|
end
|
data/lib/drink-menu/version.rb
CHANGED
data/spec/menu_builder_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
class TestMenu; extend DrinkMenu::MenuBuilder; end
|
2
|
+
class TestMenu2; include DrinkMenu::MenuBuilder; end
|
2
3
|
|
3
4
|
describe "sugar for creating menus" do
|
4
5
|
|
@@ -39,21 +40,52 @@ describe "sugar for creating menus" do
|
|
39
40
|
end
|
40
41
|
|
41
42
|
it "evaluates menu's block to add items to menu" do
|
42
|
-
|
43
|
-
|
43
|
+
builder = TestMenu2.new
|
44
|
+
item1 = builder.menuItem :test_item1, title: "Blah"
|
45
|
+
item2 = builder.menuItem :test_item2, title: "Blah"
|
44
46
|
|
45
|
-
|
47
|
+
builder.menu :main_menu, title: "Main" do
|
46
48
|
test_item1
|
47
49
|
___
|
48
50
|
test_item2
|
49
51
|
end
|
50
52
|
|
51
|
-
|
53
|
+
builder.build!
|
52
54
|
|
53
|
-
|
54
|
-
|
55
|
+
builder[:main_menu][:test_item1].should.equal item1
|
56
|
+
builder[:main_menu][:test_item2].should.equal item2
|
55
57
|
|
56
|
-
|
58
|
+
builder[:main_menu][2].isSeparatorItem.should.be.true
|
59
|
+
end
|
60
|
+
|
61
|
+
it "supports generating an NSApp's mainMenu items" do
|
62
|
+
builder = TestMenu2.new
|
63
|
+
testItem1 = builder.menuItem :test_item1, title: "Blah 1"
|
64
|
+
testItem2 = builder.menuItem :test_item2, title: "Blah 2"
|
65
|
+
|
66
|
+
menu1 = builder.mainMenu :menu1, title: "Menu 1" do
|
67
|
+
test_item1
|
68
|
+
end
|
69
|
+
|
70
|
+
menu2 = builder.mainMenu :menu2, title: "Menu 2" do
|
71
|
+
test_item2
|
72
|
+
end
|
73
|
+
|
74
|
+
builder.build!
|
75
|
+
|
76
|
+
mainMenu = NSApp.mainMenu
|
77
|
+
|
78
|
+
menuItem = mainMenu.itemArray[0]
|
79
|
+
puts "menu1 title: #{menu1.title.inspect}"
|
80
|
+
puts "menuItem title: #{menuItem.title.inspect}"
|
81
|
+
menuItem.title.should.equal menu1.title
|
82
|
+
menuItem.submenu.title.should.equal menu1.title
|
83
|
+
menuItem.submenu.itemArray[0].title.should.equal("Blah 1")
|
84
|
+
|
85
|
+
menuItem = mainMenu.itemArray[1]
|
86
|
+
menuItem.title.should.equal(menu2.title)
|
87
|
+
menuItem.submenu.title.should.equal menu2.title
|
88
|
+
menuItem.submenu.itemArray[0].title.should.equal("Blah 2")
|
57
89
|
end
|
58
90
|
|
59
91
|
describe "builder's context class" do
|
@@ -77,9 +109,8 @@ describe "sugar for creating menus" do
|
|
77
109
|
|
78
110
|
menu[1].should.be.nil
|
79
111
|
|
80
|
-
Context.new(menu).
|
112
|
+
Context.new(menu).__send__ :"___"
|
81
113
|
|
82
|
-
puts menu.menuItems.inspect
|
83
114
|
menu[1].isSeparatorItem.should.be.true
|
84
115
|
end
|
85
116
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: drink-menu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe Fiorini
|
@@ -82,6 +82,8 @@ files:
|
|
82
82
|
- README.md
|
83
83
|
- Rakefile
|
84
84
|
- drink-menu.gemspec
|
85
|
+
- examples/basic_main_menu/app_delegate.rb
|
86
|
+
- examples/basic_main_menu/main_menu.rb
|
85
87
|
- lib/drink-menu.rb
|
86
88
|
- lib/drink-menu/ext/forwardable.rb
|
87
89
|
- lib/drink-menu/ext/ns_menu_item.rb
|