Skip to content

Commit 11d7c34

Browse files
Sorting & savings of menu items
1 parent ab3db37 commit 11d7c34

File tree

5 files changed

+64
-69
lines changed

5 files changed

+64
-69
lines changed

HA Menu/Base.lproj/Main.storyboard

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,7 @@
775775
<tableColumns>
776776
<tableColumn identifier="GroupName" width="40" minWidth="40" maxWidth="1000" id="Pvw-9e-w2v">
777777
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Show">
778-
<font key="font" metaFont="controlContent" size="11"/>
778+
<font key="font" metaFont="menu" size="11"/>
779779
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
780780
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
781781
</tableHeaderCell>
@@ -787,7 +787,7 @@
787787
</tableColumn>
788788
<tableColumn editable="NO" width="250" minWidth="10" maxWidth="3.4028234663852886e+38" id="afV-N7-js5">
789789
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Domains/Groups">
790-
<font key="font" metaFont="controlContent" size="11"/>
790+
<font key="font" metaFont="menu" size="11"/>
791791
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
792792
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
793793
</tableHeaderCell>
@@ -800,7 +800,7 @@
800800
</tableColumn>
801801
<tableColumn width="60" minWidth="40" maxWidth="1000" id="Tjs-hf-rmo">
802802
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Submenu">
803-
<font key="font" metaFont="controlContent" size="11"/>
803+
<font key="font" metaFont="menu" size="11"/>
804804
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
805805
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
806806
</tableHeaderCell>
@@ -828,11 +828,11 @@
828828
</tableHeaderView>
829829
</scrollView>
830830
<button verticalHuggingPriority="750" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bzu-iR-vUe">
831-
<rect key="frame" x="259" y="237" width="152" height="32"/>
831+
<rect key="frame" x="299" y="237" width="112" height="32"/>
832832
<constraints>
833-
<constraint firstAttribute="width" constant="140" id="wVt-oi-xmo"/>
833+
<constraint firstAttribute="width" constant="100" id="wVt-oi-xmo"/>
834834
</constraints>
835-
<buttonCell key="cell" type="push" title="Check Connection" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="bZm-aG-Ral">
835+
<buttonCell key="cell" type="push" title="Connect" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="bZm-aG-Ral">
836836
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
837837
<font key="font" metaFont="system"/>
838838
</buttonCell>
@@ -841,7 +841,7 @@
841841
</connections>
842842
</button>
843843
<textField identifier="LabelStatus" horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="0wc-Hy-MC4">
844-
<rect key="frame" x="18" y="242" width="241" height="21"/>
844+
<rect key="frame" x="18" y="242" width="281" height="21"/>
845845
<textFieldCell key="cell" lineBreakMode="clipping" title="OK" id="2fl-Mt-VYj">
846846
<font key="font" metaFont="system"/>
847847
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>

HA Menu/MenuItemController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ final class MenuItemController: NSObject, NSMenuDelegate {
207207
self.haService.getState(entityId: entityId) { result in
208208
switch result {
209209
case .success(let entity):
210-
var options = [String]()
210+
let options = [String]()
211211

212212
// Do not add unavailable state entities
213213
if (entity.state != "unavailable") {

HA Menu/Models/PrefMenuItem.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ struct PrefMenuItem : Codable {
1818
var itemType: itemTypes
1919
var subMenu: Bool
2020
var enabled: Bool
21-
var friendlyName: String?
21+
var friendlyName: String
2222
var index: Int = 0
2323

2424
private enum CodingKeys: String, CodingKey {
25-
case entityId, itemType, subMenu, enabled
25+
case entityId, friendlyName, itemType, subMenu, enabled
2626
}
2727
}

HA Menu/Models/Preferences.swift

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ struct Preferences {
133133
get {
134134
var decodedResponse = [PrefMenuItem]()
135135

136-
guard let jsonData = UserDefaults.standard.data(forKey: "menu_items") else {
136+
guard let jsonString = UserDefaults.standard.string(forKey: "menu_items") else {
137137
// Init Domains
138138
decodedResponse.append(PrefMenuItem(entityId: "lights", itemType: itemTypes.Domain, subMenu: false, enabled: domainLights, friendlyName: "Lights"))
139139

@@ -145,26 +145,25 @@ struct Preferences {
145145

146146
decodedResponse.append(PrefMenuItem(entityId: "inputselects", itemType: itemTypes.Domain, subMenu: false, enabled: domainInputSelects, friendlyName: "Input Selects"))
147147

148-
// Init Groups
148+
// Init Groups from old setting
149149
for group in groups {
150-
decodedResponse.append(PrefMenuItem(entityId: group, itemType: itemTypes.Group, subMenu: false, enabled: true))
150+
decodedResponse.append(PrefMenuItem(entityId: group, itemType: itemTypes.Group, subMenu: false, enabled: true, friendlyName: ""))
151151
}
152152

153153
return decodedResponse
154154
}
155155
do {
156-
decodedResponse = try JSONDecoder().decode([PrefMenuItem].self, from: jsonData)
156+
let jsonData = jsonString.data(using: String.Encoding.utf8, allowLossyConversion: false)
157+
decodedResponse = try JSONDecoder().decode([PrefMenuItem].self, from: jsonData!)
157158
}
158159
catch {
159160
// Something odd with json, blank it out
160161
}
161162
return decodedResponse
162163
}
163164
set {
164-
165-
let encoder = JSONEncoder()
166165
do {
167-
let data = try encoder.encode(newValue)
166+
let data = try JSONEncoder().encode(newValue)
168167
let dataString = String(data: data, encoding: .utf8)!
169168
UserDefaults.standard.set(dataString, forKey: "menu_items")
170169
UserDefaults.standard.synchronize()
@@ -175,7 +174,7 @@ struct Preferences {
175174
}
176175
}
177176

178-
func menuItemsWithFriendlyNames(groups: [String: HaEntity]) -> [String: PrefMenuItem] {
177+
func menuItemsWithFriendlyNames(groups: [HaEntity]) -> [String: PrefMenuItem] {
179178
var completedItems = [String: PrefMenuItem]()
180179

181180
var index = 0
@@ -184,7 +183,7 @@ struct Preferences {
184183

185184
if item.itemType == itemTypes.Group {
186185
// Check if still a group
187-
if let group = groups["group." + item.entityId] {
186+
if let group = getGroup(groups: groups, entityId: "group." + item.entityId) {
188187
index+=1
189188

190189
let completedItem = PrefMenuItem(entityId: item.entityId, itemType: item.itemType, subMenu: item.subMenu, enabled: item.enabled, friendlyName: group.friendlyName, index: index)
@@ -202,15 +201,24 @@ struct Preferences {
202201

203202
// Add missing groups
204203
for group in groups {
205-
if completedItems[group.value.entityIdNoPrefix] == nil {
204+
if completedItems[group.entityIdNoPrefix] == nil {
206205
index+=1
207-
let completedItem = PrefMenuItem(entityId: group.value.entityIdNoPrefix, itemType: itemTypes.Group, subMenu: false, enabled: false, friendlyName: group.value.friendlyName, index: index)
206+
let completedItem = PrefMenuItem(entityId: group.entityIdNoPrefix, itemType: itemTypes.Group, subMenu: false, enabled: false, friendlyName: group.friendlyName, index: index)
208207

209-
completedItems[group.value.entityIdNoPrefix] = completedItem
208+
completedItems[group.entityIdNoPrefix] = completedItem
210209
}
211210
}
212211

213212
return completedItems
214213
}
215214

215+
private func getGroup(groups: [HaEntity], entityId: String) -> HaEntity? {
216+
for g in groups {
217+
if g.entityId == entityId {
218+
return g
219+
}
220+
}
221+
return nil
222+
}
223+
216224
}

HA Menu/ViewControllers/PrefsViewController.swift

Lines changed: 34 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ class PrefsViewController: NSViewController {
1919
@IBOutlet weak var tableViewGroups: NSTableView!
2020

2121
@IBAction func buttonCheckConnection(_ sender: NSButton) {
22-
checkConnection()
22+
connect()
2323
}
2424

2525
var prefs = Preferences()
26-
var groups = [String: HaEntity]()
26+
var groups = [HaEntity]()
2727
var menuItems = [PrefMenuItem]()
2828
private var dragDropType = NSPasteboard.PasteboardType(rawValue: "private.table-row")
2929

@@ -36,18 +36,19 @@ class PrefsViewController: NSViewController {
3636
tableViewGroups.dataSource = self
3737
tableViewGroups.registerForDraggedTypes([dragDropType])
3838
tableViewGroups.target = self
39-
tableViewGroups.doubleAction = #selector(tableViewGroupsDoubleClick(_:))
39+
// tableViewGroups.doubleAction = #selector(tableViewGroupsDoubleClick(_:))
4040

41-
checkConnection()
41+
connect()
4242
}
4343

4444
override func viewWillDisappear() {
4545
saveNewPrefs()
46+
saveNewMenuItems()
4647
NSApp.stopModal()
4748
super.viewWillDisappear()
4849
}
4950

50-
func checkConnection() {
51+
func connect() {
5152
saveNewPrefs()
5253

5354
self.menuItems.removeAll()
@@ -59,11 +60,7 @@ class PrefsViewController: NSViewController {
5960
DispatchQueue.main.async {
6061
self.textfieldStatus.stringValue = "OK"
6162

62-
let groupEntities = self.haService.filterEntities(entityDomain: EntityDomains.groupDomain.rawValue)
63-
64-
for groupEntity in groupEntities {
65-
self.groups[groupEntity.entityId] = groupEntity
66-
}
63+
self.groups = self.haService.filterEntities(entityDomain: EntityDomains.groupDomain.rawValue).reversed()
6764

6865
let menuItemsWithFriendlyNames = self.prefs.menuItemsWithFriendlyNames(groups: self.groups)
6966

@@ -78,6 +75,9 @@ class PrefsViewController: NSViewController {
7875

7976
case .failure(let haServiceApiError):
8077
DispatchQueue.main.async {
78+
self.menuItems.removeAll()
79+
self.tableViewGroups.reloadData()
80+
8181
switch haServiceApiError {
8282
case .URLMissing:
8383
self.textfieldStatus.stringValue = "Server URL missing"
@@ -103,39 +103,31 @@ class PrefsViewController: NSViewController {
103103
func showExistingPrefs() {
104104
textfieldServer.stringValue = prefs.server
105105
textfieldToken.stringValue = prefs.token
106-
// buttonLights.state = (prefs.domainLights == true ? .on : .off)
107-
// buttonSwitches.state = (prefs.domainSwitches == true ? .on : .off)
108-
// buttonAutomations.state = (prefs.domainAutomations == true ? .on : .off)
109-
// buttonInputBooleans.state = (prefs.domainInputBooleans == true ? .on : .off)
110-
// buttonInputSelects.state = (prefs.domainInputSelects == true ? .on : .off)
111-
// textfieldGroup.stringValue = prefs.groupList
112106
buttonLogin.state = (prefs.launch == true ? .on : .off)
113107
}
114108

115109
func saveNewPrefs() {
116110
prefs.server = textfieldServer.stringValue
117111
prefs.token = textfieldToken.stringValue
118-
// prefs.domainLights = (buttonLights.state == .on)
119-
// prefs.domainSwitches = (buttonSwitches.state == .on)
120-
// prefs.domainAutomations = (buttonAutomations.state == .on)
121-
// prefs.domainInputBooleans = (buttonInputBooleans.state == .on)
122-
// prefs.domainInputSelects = (buttonInputSelects.state == .on)
123-
// prefs.groupList = textfieldGroup.stringValue
124112
prefs.launch = (buttonLogin.state == .on)
125113

126114
NotificationCenter.default.post(name: Notification.Name(rawValue: "PrefsChanged"),
127115
object: nil)
128116
}
129117

130-
@objc func tableViewGroupsDoubleClick(_ sender:AnyObject) {
131-
132-
guard tableViewGroups.selectedRow >= 0 else {
133-
return
134-
}
135-
136-
let item = self.menuItems[tableViewGroups.selectedRow]
118+
func saveNewMenuItems() {
119+
prefs.menuItems = menuItems
137120
}
138121

122+
// @objc func tableViewGroupsDoubleClick(_ sender:AnyObject) {
123+
//
124+
// guard tableViewGroups.selectedRow >= 0 else {
125+
// return
126+
// }
127+
//
128+
// let item = self.menuItems[tableViewGroups.selectedRow]
129+
// }
130+
139131
}
140132

141133
extension PrefsViewController: NSTableViewDelegate, NSTableViewDataSource {
@@ -144,9 +136,9 @@ extension PrefsViewController: NSTableViewDelegate, NSTableViewDataSource {
144136
return self.menuItems.count
145137
}
146138

147-
// fileprivate enum TableColumns {
148-
// static let GroupName = NSUserInterfaceItemIdentifier("GroupName")
149-
// }
139+
// fileprivate enum TableColumns {
140+
// static let GroupName = NSUserInterfaceItemIdentifier("GroupName")
141+
// }
150142

151143
private func tableView(_ tableView: NSTableView, typeSelectStringFor tableColumn: NSTableColumn?, row: Int) -> PrefMenuItem? {
152144
return self.menuItems[row]
@@ -166,7 +158,7 @@ extension PrefsViewController: NSTableViewDelegate, NSTableViewDataSource {
166158

167159
if tableColumn == tableView.tableColumns[1] {
168160
let item = self.menuItems[row]
169-
return item.friendlyName!
161+
return item.friendlyName
170162
}
171163

172164
if tableColumn == tableView.tableColumns[2] {
@@ -225,23 +217,18 @@ extension PrefsViewController: NSTableViewDelegate, NSTableViewDataSource {
225217
}
226218
}
227219

228-
var oldIndexOffset = 0
229-
var newIndexOffset = 0
230220

231-
// For simplicity, the code below uses `tableView.moveRowAtIndex` to move rows around directly.
232-
// You may want to move rows in your content array and then call `tableView.reloadData()` instead.
233-
tableView.beginUpdates()
234-
for oldIndex in oldIndexes {
235-
if oldIndex < row {
236-
tableView.moveRow(at: oldIndex + oldIndexOffset, to: row - 1)
237-
oldIndexOffset -= 1
238-
} else {
239-
tableView.moveRow(at: oldIndex, to: row + newIndexOffset)
240-
newIndexOffset += 1
241-
}
221+
let oldIndex = oldIndexes[0]
222+
let element = menuItems.remove(at: oldIndexes[0])
223+
224+
if oldIndex < row {
225+
self.menuItems.insert(element, at: row - 1)
226+
}
227+
else {
228+
self.menuItems.insert(element, at: row)
242229
}
243-
tableView.endUpdates()
244230

231+
tableView.reloadData()
245232
return true
246233
}
247234

0 commit comments

Comments
 (0)