Skip to content

Commit c844e46

Browse files
Change menubar to use new json prefs
1 parent 11d7c34 commit c844e46

File tree

5 files changed

+145
-123
lines changed

5 files changed

+145
-123
lines changed

HA Menu.xcodeproj/project.pbxproj

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -615,15 +615,15 @@
615615
CODE_SIGN_IDENTITY = "Apple Development";
616616
CODE_SIGN_STYLE = Automatic;
617617
COMBINE_HIDPI_IMAGES = YES;
618-
CURRENT_PROJECT_VERSION = 18;
618+
CURRENT_PROJECT_VERSION = 19;
619619
DEVELOPMENT_TEAM = VZ3Z8BPWPW;
620620
ENABLE_HARDENED_RUNTIME = YES;
621621
INFOPLIST_FILE = "HA Menu/Info.plist";
622622
LD_RUNPATH_SEARCH_PATHS = (
623623
"$(inherited)",
624624
"@executable_path/../Frameworks",
625625
);
626-
MARKETING_VERSION = 2.1.1;
626+
MARKETING_VERSION = 2.2.0;
627627
PRODUCT_BUNDLE_IDENTIFIER = "org.codechimp.HA-Menu";
628628
PRODUCT_NAME = "$(TARGET_NAME)";
629629
SWIFT_VERSION = 5.0;
@@ -638,15 +638,15 @@
638638
CODE_SIGN_IDENTITY = "Apple Development";
639639
CODE_SIGN_STYLE = Automatic;
640640
COMBINE_HIDPI_IMAGES = YES;
641-
CURRENT_PROJECT_VERSION = 18;
641+
CURRENT_PROJECT_VERSION = 19;
642642
DEVELOPMENT_TEAM = VZ3Z8BPWPW;
643643
ENABLE_HARDENED_RUNTIME = YES;
644644
INFOPLIST_FILE = "HA Menu/Info.plist";
645645
LD_RUNPATH_SEARCH_PATHS = (
646646
"$(inherited)",
647647
"@executable_path/../Frameworks",
648648
);
649-
MARKETING_VERSION = 2.1.1;
649+
MARKETING_VERSION = 2.2.0;
650650
PRODUCT_BUNDLE_IDENTIFIER = "org.codechimp.HA-Menu";
651651
PRODUCT_NAME = "$(TARGET_NAME)";
652652
SWIFT_VERSION = 5.0;
@@ -743,15 +743,15 @@
743743
CODE_SIGN_IDENTITY = "Apple Development";
744744
CODE_SIGN_STYLE = Automatic;
745745
COMBINE_HIDPI_IMAGES = YES;
746-
CURRENT_PROJECT_VERSION = 18;
746+
CURRENT_PROJECT_VERSION = 19;
747747
DEVELOPMENT_TEAM = VZ3Z8BPWPW;
748748
ENABLE_HARDENED_RUNTIME = YES;
749749
INFOPLIST_FILE = "HA Menu Launcher/Info.plist";
750750
LD_RUNPATH_SEARCH_PATHS = (
751751
"$(inherited)",
752752
"@executable_path/../Frameworks",
753753
);
754-
MARKETING_VERSION = 2.1.1;
754+
MARKETING_VERSION = 2.2.0;
755755
PRODUCT_BUNDLE_IDENTIFIER = "org.codechimp.HA-Menu-Launcher";
756756
PRODUCT_NAME = "$(TARGET_NAME)";
757757
SKIP_INSTALL = YES;
@@ -767,15 +767,15 @@
767767
CODE_SIGN_IDENTITY = "Apple Development";
768768
CODE_SIGN_STYLE = Automatic;
769769
COMBINE_HIDPI_IMAGES = YES;
770-
CURRENT_PROJECT_VERSION = 18;
770+
CURRENT_PROJECT_VERSION = 19;
771771
DEVELOPMENT_TEAM = VZ3Z8BPWPW;
772772
ENABLE_HARDENED_RUNTIME = YES;
773773
INFOPLIST_FILE = "HA Menu Launcher/Info.plist";
774774
LD_RUNPATH_SEARCH_PATHS = (
775775
"$(inherited)",
776776
"@executable_path/../Frameworks",
777777
);
778-
MARKETING_VERSION = 2.1.1;
778+
MARKETING_VERSION = 2.2.0;
779779
PRODUCT_BUNDLE_IDENTIFIER = "org.codechimp.HA-Menu-Launcher";
780780
PRODUCT_NAME = "$(TARGET_NAME)";
781781
SKIP_INSTALL = YES;

HA Menu/AppDelegate.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,7 @@ extension AppDelegate {
6464
}
6565

6666
func updateFromPrefs() {
67-
print("Prefs Updated")
68-
6967
SMLoginItemSetEnabled(launcherAppId as CFString, prefs.launch)
70-
7168
}
7269

7370
}

HA Menu/MenuItemController.swift

Lines changed: 106 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@ final class MenuItemController: NSObject, NSMenuDelegate {
1515
var haService = HaService.shared
1616
var prefs = Preferences()
1717
var haStates : [HaState]?
18+
var groups = [HaEntity]()
19+
var menuItems = [PrefMenuItem]()
1820

1921
let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)
2022
let menu = NSMenu()
2123

2224
var preferences: Preferences
2325

26+
let menuItemTypeTopLevel = 996
2427
let menuItemTypeInfo = 997
2528
let menuItemTypeError = 999
2629

@@ -109,8 +112,25 @@ final class MenuItemController: NSObject, NSMenuDelegate {
109112
result in
110113
switch result {
111114
case .success( _):
112-
self.addDomains()
113-
self.addGroups()
115+
116+
self.menuItems.removeAll()
117+
118+
self.groups = self.haService.filterEntities(entityDomain: EntityDomains.groupDomain.rawValue).reversed()
119+
120+
let menuItemsWithFriendlyNames = self.prefs.menuItemsWithFriendlyNames(groups: self.groups)
121+
122+
let sortedMenuItemsWithFriendlyNames = menuItemsWithFriendlyNames.sorted { $0.value.index < $1.value.index }
123+
124+
for (_, value) in sortedMenuItemsWithFriendlyNames {
125+
self.menuItems.insert(value, at: 0)
126+
}
127+
128+
// Add Menu Items
129+
for menuItem in self.menuItems {
130+
if menuItem.enabled {
131+
self.addMenuItem(menuItem: menuItem)
132+
}
133+
}
114134

115135
case .failure(let haServiceApiError):
116136
switch haServiceApiError {
@@ -134,137 +154,118 @@ final class MenuItemController: NSObject, NSMenuDelegate {
134154
}
135155
}
136156

137-
func addDomains() {
138-
if (self.prefs.domainInputSelects) {
139-
let inputSelects = self.haService.filterEntities(entityDomain: EntityDomains.inputSelectDomain.rawValue)
140-
if inputSelects.count > 0 {
141-
self.addEntitiesToMenu(entities: inputSelects)
142-
}
143-
}
144-
145-
if (self.prefs.domainInputBooleans) {
146-
let inputBooleans = self.haService.filterEntities(entityDomain: EntityDomains.inputBooleanDomain.rawValue)
147-
if inputBooleans.count > 0 {
148-
self.addEntitiesToMenu(entities: inputBooleans)
149-
}
150-
}
151-
152-
if (self.prefs.domainAutomations) {
153-
let automations = self.haService.filterEntities(entityDomain: EntityDomains.automationDomain.rawValue)
154-
if automations.count > 0 {
155-
self.addEntitiesToMenu(entities: automations)
156-
}
157-
}
158-
159-
if (self.prefs.domainSwitches) {
160-
let switches = self.haService.filterEntities(entityDomain: EntityDomains.switchDomain.rawValue)
161-
if switches.count > 0 {
162-
self.addEntitiesToMenu(entities: switches)
163-
}
164-
}
165-
166-
if (self.prefs.domainLights) {
167-
let lights = self.haService.filterEntities(entityDomain: EntityDomains.lightDomain.rawValue)
168-
if lights.count > 0 {
169-
self.addEntitiesToMenu(entities: lights)
170-
}
171-
}
172-
}
157+
func addMenuItem(menuItem: PrefMenuItem) {
158+
switch menuItem.itemType {
159+
case itemTypes.Domain:
160+
let domainItems = self.haService.filterEntities(entityDomain: menuItem.entityId)
161+
self.addEntitiesToMenu(menuItem: menuItem, entities: domainItems)
162+
case itemTypes.Group:
163+
self.haService.getState(entityId: "group.\(menuItem.entityId)") { result in
164+
switch result {
165+
case .success(let group):
166+
// For each entity, get it's attributes and if available add to array
167+
var entities = [HaEntity]()
168+
169+
for entityId in (group.attributes.entityIds) {
170+
171+
let entityType = entityId.components(separatedBy: ".")[0]
172+
var itemType: EntityTypes?
173+
174+
switch entityType {
175+
case "switch":
176+
itemType = EntityTypes.switchType
177+
case "light":
178+
itemType = EntityTypes.lightType
179+
case "input_boolean":
180+
itemType = EntityTypes.inputBooleanType
181+
case "input_select":
182+
itemType = EntityTypes.inputSelectType
183+
case "automation":
184+
itemType = EntityTypes.automationType
185+
default:
186+
itemType = nil
187+
}
173188

174-
func addGroups() {
175-
// Iterate groups in preferences
176-
for groupId in (self.prefs.groups) {
177-
if groupId.count > 0 {
178-
179-
self.haService.getState(entityId: "group.\(groupId)") { result in
180-
switch result {
181-
case .success(let group):
182-
// For each entity, get it's attributes and if available add to array
183-
var entities = [HaEntity]()
184-
185-
for entityId in (group.attributes.entityIds) {
186-
187-
let entityType = entityId.components(separatedBy: ".")[0]
188-
var itemType: EntityTypes?
189-
190-
switch entityType {
191-
case "switch":
192-
itemType = EntityTypes.switchType
193-
case "light":
194-
itemType = EntityTypes.lightType
195-
case "input_boolean":
196-
itemType = EntityTypes.inputBooleanType
197-
case "input_select":
198-
itemType = EntityTypes.inputSelectType
199-
case "automation":
200-
itemType = EntityTypes.automationType
201-
default:
202-
itemType = nil
203-
}
189+
if itemType != nil {
204190

205-
if itemType != nil {
191+
self.haService.getState(entityId: entityId) { result in
192+
switch result {
193+
case .success(let entity):
194+
var options = [String]()
206195

207-
self.haService.getState(entityId: entityId) { result in
208-
switch result {
209-
case .success(let entity):
210-
let options = [String]()
196+
if itemType == EntityTypes.inputSelectType {
197+
options = entity.attributes.options
198+
}
211199

212-
// Do not add unavailable state entities
213-
if (entity.state != "unavailable") {
200+
// Do not add unavailable state entities
201+
if (entity.state != "unavailable") {
214202

215-
let haEntity: HaEntity = HaEntity(entityId: entityId, friendlyName: (entity.attributes.friendlyName), state: (entity.state), options: options)
203+
let haEntity: HaEntity = HaEntity(entityId: entityId, friendlyName: (entity.attributes.friendlyName), state: (entity.state), options: options)
216204

217-
entities.append(haEntity)
218-
}
219-
case .failure( _):
220-
break
205+
entities.append(haEntity)
221206
}
207+
case .failure( _):
208+
break
222209
}
223210
}
224211
}
212+
}
225213

226-
entities = entities.reversed()
214+
entities = entities.reversed()
227215

228-
self.addEntitiesToMenu(entities: entities)
216+
self.addEntitiesToMenu(menuItem: menuItem, entities: entities)
229217

230-
break
231-
case .failure( _):
232-
self.addErrorMenuItem(message: "Group not found")
233-
}
218+
break
219+
case .failure( _):
220+
self.addErrorMenuItem(message: "Group not found")
234221
}
235222
}
236223
}
224+
237225
}
238226

239-
func addEntitiesToMenu(entities: [HaEntity]) {
227+
func addEntitiesToMenu(menuItem: PrefMenuItem, entities: [HaEntity]) {
240228
DispatchQueue.main.async {
241229

230+
if entities.count == 0 {
231+
return
232+
}
233+
242234
// Add a seperator before static menu items/previous group
243235
self.menu.insertItem(NSMenuItem.separator(), at: 0)
244236

245-
if (entities.count == 0) {
246-
self.addErrorMenuItem(message: "No Entities")
247-
return
237+
var parent = self.menu
238+
239+
240+
if menuItem.subMenu {
241+
let topMenuItem = NSMenuItem()
242+
topMenuItem.title = menuItem.friendlyName
243+
topMenuItem.tag = self.menuItemTypeTopLevel
244+
self.menu.insertItem(topMenuItem, at: 0)
245+
246+
let subMenu = NSMenu()
247+
parent = subMenu
248+
self.menu.setSubmenu(subMenu, for: topMenuItem)
248249
}
249250

250-
// Populate menu items for switches
251+
// Populate menu items
251252
for haEntity in entities {
252-
self.addEntityMenuItem(haEntity: haEntity)
253+
self.addEntityMenuItem(parent: parent, haEntity: haEntity)
253254
}
254255

255256
}
256257
}
257258

258-
func addEntityMenuItem(haEntity: HaEntity) {
259+
func addEntityMenuItem(parent: NSMenu, haEntity: HaEntity) {
259260

260-
if haEntity.domain.rawValue == "inputselect" {
261+
if haEntity.domain == EntityDomains.inputSelectDomain {
261262
let inputSelectMenuItem = NSMenuItem()
262263
inputSelectMenuItem.title = haEntity.friendlyName
263264
inputSelectMenuItem.tag = haEntity.type.rawValue
264-
self.menu.insertItem(inputSelectMenuItem, at: 0)
265+
parent.insertItem(inputSelectMenuItem, at: 0)
265266

266267
let subMenu = NSMenu()
267-
self.menu.setSubmenu(subMenu, for: inputSelectMenuItem)
268+
parent.setSubmenu(subMenu, for: inputSelectMenuItem)
268269

269270
for option in haEntity.options {
270271
let optionMenuItem = NSMenuItem()
@@ -289,7 +290,7 @@ final class MenuItemController: NSObject, NSMenuDelegate {
289290
// menuItem.image = NSImage(named: "StatusBarButtonImage")
290291
// menuItem.offStateImage = NSImage(named: "NSMenuOnStateTemplate")
291292

292-
self.menu.insertItem(menuItem, at: 0)
293+
parent.insertItem(menuItem, at: 0)
293294
}
294295
}
295296

@@ -321,6 +322,14 @@ final class MenuItemController: NSObject, NSMenuDelegate {
321322
} while dynamicItem != nil
322323
}
323324

325+
// Top Level Menu
326+
repeat {
327+
dynamicItem = self.menu.item(withTag: self.menuItemTypeTopLevel)
328+
if (dynamicItem != nil) {
329+
self.menu.removeItem(dynamicItem!)
330+
}
331+
} while dynamicItem != nil
332+
324333
// Info
325334
repeat {
326335
dynamicItem = self.menu.item(withTag: self.menuItemTypeInfo)

0 commit comments

Comments
 (0)