Class: DrinkMenu::Menu

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/drink-menu/menu.rb

Constant Summary

Constants included from Forwardable

Forwardable::FORWARDABLE_VERSION

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Forwardable

def_instance_delegator, def_instance_delegators, instance_delegate

Constructor Details

#initialize(label, &block) ⇒ Menu

Returns a new instance of Menu.



78
79
80
81
82
83
84
85
# File 'lib/drink-menu/menu.rb', line 78

def initialize(label, &block)
  @menuItems = {}
  @label = label
  @builder = block
  @menu = NSMenu.alloc.init
  @needsStatusItem = false
  @needsMenuItem = false
end

Instance Attribute Details

#builderObject (readonly)

Returns the value of attribute builder.



18
19
20
# File 'lib/drink-menu/menu.rb', line 18

def builder
  @builder
end

#itemAddedSubjectObject

Returns the value of attribute itemAddedSubject.



19
20
21
# File 'lib/drink-menu/menu.rb', line 19

def itemAddedSubject
  @itemAddedSubject
end

#labelObject (readonly)

Returns the value of attribute label.



18
19
20
# File 'lib/drink-menu/menu.rb', line 18

def label
  @label
end

#memberCommandObject

Returns the value of attribute memberCommand.



19
20
21
# File 'lib/drink-menu/menu.rb', line 19

def memberCommand
  @memberCommand
end

#memberTitlePropertyObject

Returns the value of attribute memberTitleProperty.



19
20
21
# File 'lib/drink-menu/menu.rb', line 19

def memberTitleProperty
  @memberTitleProperty
end

Returns the value of attribute menu.



18
19
20
# File 'lib/drink-menu/menu.rb', line 18

def menu
  @menu
end

Returns the value of attribute menuItems.



18
19
20
# File 'lib/drink-menu/menu.rb', line 18

def menuItems
  @menuItems
end

#statusItemObject

Returns the value of attribute statusItem.



19
20
21
# File 'lib/drink-menu/menu.rb', line 19

def statusItem
  @statusItem
end

#statusItemIconObject

Returns the value of attribute statusItemIcon.



19
20
21
# File 'lib/drink-menu/menu.rb', line 19

def statusItemIcon
  @statusItemIcon
end

#statusItemTitleObject

Returns the value of attribute statusItemTitle.



19
20
21
# File 'lib/drink-menu/menu.rb', line 19

def statusItemTitle
  @statusItemTitle
end

Class Method Details



39
40
41
42
43
44
# File 'lib/drink-menu/menu.rb', line 39

def self.menuWithLabel(label, title: title, menuItem: needsMenuItem, &block)
  new(label, &block).tap do |menu|
    menu.title = title
    menu.createMenuItemWithTitle title if needsMenuItem
  end
end

.statusMenuWithLabel(label, title: title, &block) ⇒ Object



21
22
23
24
25
# File 'lib/drink-menu/menu.rb', line 21

def self.statusMenuWithLabel(label, icon: image, statusItemViewClass: statusItemViewClass, &block)
  new(label, &block).tap do |menu|
    menu.createStatusItemWithIcon image, viewClass: statusItemViewClass
  end
end

Instance Method Details

#<<(item) ⇒ Object



87
88
89
90
91
92
# File 'lib/drink-menu/menu.rb', line 87

def <<(item)
  previousItemTag = @menuItems.keys.last || 0
  item.tag = previousItemTag + 1
  @menuItems[item.tag] = item
  @menu.addItem item.menuItem
end

#[](labelOrTag) ⇒ Object



160
161
162
163
164
165
166
167
168
# File 'lib/drink-menu/menu.rb', line 160

def [](labelOrTag)
  if labelOrTag.is_a? Fixnum
    @menuItems[labelOrTag]
  else
    @menuItems.values.find do |item|
      item.label == labelOrTag
    end
  end
end

#addMenuItemForMember(member) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
# File 'lib/drink-menu/menu.rb', line 98

def addMenuItemForMember(member)
  item = MenuItem.itemWithLabel(member.hash.to_s, title: member.send(memberTitleProperty))
  item.representedObject = member
  item.rac_stateSignal = memberCommand.signal.map ->((_,value)){
    value.representedObject == item.representedObject
  }

  self << item
  itemAddedSubject.sendNext(item)

end

#createMenuItemWithTitle(title) ⇒ Object



127
128
129
130
# File 'lib/drink-menu/menu.rb', line 127

def createMenuItemWithTitle(title)
  @needsMenuItem = true
  @statusItemTitle = title
end

#createStatusItem!Object



178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/drink-menu/menu.rb', line 178

def createStatusItem!
  statusBar = NSStatusBar.systemStatusBar
  @statusItem = statusBar.statusItemWithLength(NSSquareStatusItemLength)
  @statusItem.highlightMode = true

  @statusItem.menu = menu

  if @statusItemViewClass
    statusItemView = @statusItemViewClass.viewWithStatusItem(@statusItem)
    @statusItem.menu.delegate = @statusItemView
    @statusItem.view = statusItemView
  end

  @statusItem.title = @statusItemTitle
  @statusItem.image = @statusItemIcon

  @statusItem
end

#createStatusItemWithIcon(image, viewClass: viewClass) ⇒ Object



137
138
139
140
# File 'lib/drink-menu/menu.rb', line 137

def createStatusItemWithIcon(image)
  @needsStatusItem = true
  @statusItemIcon = image
end

#createStatusItemWithTitle(title) ⇒ Object



132
133
134
135
# File 'lib/drink-menu/menu.rb', line 132

def createStatusItemWithTitle(title)
  @needsStatusItem = true
  @statusItemTitle = title
end


94
95
96
# File 'lib/drink-menu/menu.rb', line 94

def menuItemFromMenu!
  @mainMenuItem ||= MenuItem.itemWithLabel(label, title: title, submenu: self)
end

#needsMenuItem?Boolean

Returns:

  • (Boolean)


174
175
176
# File 'lib/drink-menu/menu.rb', line 174

def needsMenuItem?
  @needsMenuItem
end

#needsStatusItem?Boolean

Returns:

  • (Boolean)


170
171
172
# File 'lib/drink-menu/menu.rb', line 170

def needsStatusItem?
  @needsStatusItem
end

#observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) ⇒ Object



110
111
112
113
114
115
116
# File 'lib/drink-menu/menu.rb', line 110

def observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
  return unless keyPath == "arrangedObjects"
  if itemArray.length < object.arrangedObjects.length
    member = object.arrangedObjects.lastObject
    addMenuItemForMember(member)
  end
end

#selectItem(label) ⇒ Object



148
149
150
151
# File 'lib/drink-menu/menu.rb', line 148

def selectItem(label)
  item = self[label]
  item.command.execute(item)
end

#selectItemByMember(member) ⇒ Object



153
154
155
156
157
158
# File 'lib/drink-menu/menu.rb', line 153

def selectItemByMember(member)
  item = @menuItems.values.find do |i|
    i.representedObject == member
  end
  item.command.execute(item)
end

#subscribe(itemLabel, &block) ⇒ Object



123
124
125
# File 'lib/drink-menu/menu.rb', line 123

def subscribe(itemLabel, &block)
  self[itemLabel].subscribe(&block)
end

#subscribeToMembers(&block) ⇒ Object

Only works when built with menuWithLabel:itemsFromCollection:titleProperty



119
120
121
# File 'lib/drink-menu/menu.rb', line 119

def subscribeToMembers(&block)
  memberCommand.signal.subscribeNext(block)
end