| Apptag/DataLayer.swift | ●●●●● patch | view | raw | blame | history | |
| Apptag/TagEditorView.swift | ●●●●● patch | view | raw | blame | history | |
| X-screencap/SCR-20260505-qwvz.png | patch | view | raw | blame | history | |
| X-screencap/SCR-20260505-shyg.png | patch | view | raw | blame | history | |
| X-screencap/SCR-20260505-tmjo.png | patch | view | raw | blame | history | |
| X-screencap/SCR-20260506-ohtf.jpeg | patch | view | raw | blame | history | |
| X-screencap/SCR-20260506-okgg.jpeg | patch | view | raw | blame | history |
Apptag/DataLayer.swift
@@ -299,6 +299,15 @@ TagDatabase.save(store) } /// Create a new tag definition (no app assignments yet). static func createTag(_ name: String, color: Int) { var store = TagDatabase.load() guard store.tags[name] == nil else { return } store.tags[name] = TagDatabase.TagDef(color: color) if !store.tagOrder.contains(name) { store.tagOrder.append(name) } TagDatabase.save(store) } /// Annotate scanned apps with tags from the database. static func annotate(apps: [AppInfo]) -> [AppInfo] { let store = TagDatabase.load() Apptag/TagEditorView.swift
@@ -147,13 +147,12 @@ // SIP-protected apps where xattr write silently fails. } /// Add a new tag name+color to the local registry only (no xattr write until /// the tag is assigned to apps via "Edit App Categories"). /// Does NOT call onRefresh — would overwrite tagColors with scan results. /// Add a new tag name+color and persist to the database. private func addNewTag() { let name = newTagNameText.trimmingCharacters(in: .whitespaces) guard !name.isEmpty else { return } tagColors[name] = newTagColorIndex TagEditor.createTag(name, color: newTagColorIndex) addingNewTag = false newTagNameText = "" } X-screencap/SCR-20260505-qwvz.png
X-screencap/SCR-20260505-shyg.png
X-screencap/SCR-20260505-tmjo.png
X-screencap/SCR-20260506-ohtf.jpeg
X-screencap/SCR-20260506-okgg.jpeg