From 49c7bd7bef3e219336bc19594f6f6037cfe900bc Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Mon, 16 Dec 2024 14:43:59 -0800 Subject: [PATCH] Add ignore node functionality to the node and user list --- Localizable.xcstrings | 3 +++ .../Extensions/CoreData/UserEntityExtension.swift | 8 ++++---- Meshtastic/Views/Messages/UserList.swift | 5 +++-- .../Nodes/Helpers/Actions/IgnoreNodeButton.swift | 4 ++-- Meshtastic/Views/Nodes/Helpers/NodeListFilter.swift | 13 +++++++++++++ Meshtastic/Views/Nodes/MeshMap.swift | 2 ++ Meshtastic/Views/Nodes/NodeList.swift | 12 ++++++++++++ 7 files changed, 39 insertions(+), 8 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index caa1ef6e..6a2bfdca 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -8957,6 +8957,9 @@ }, "Ignore Node" : { + }, + "Ignored" : { + }, "Import Route" : { diff --git a/Meshtastic/Extensions/CoreData/UserEntityExtension.swift b/Meshtastic/Extensions/CoreData/UserEntityExtension.swift index b0700423..52399f38 100644 --- a/Meshtastic/Extensions/CoreData/UserEntityExtension.swift +++ b/Meshtastic/Extensions/CoreData/UserEntityExtension.swift @@ -77,13 +77,13 @@ extension UserEntity { return "TLORAV2118" /// Seeed Studio case "SENSECAPINDICATOR": - return "SENSECAPINDICATOR" + return "UNSET" case "TRACKERT1000E": - return "TRACKERT1000E" + return "UNSET" case "SEEEDXIAOS3": - return "SEEEDXIAOS3" + return "UNSET" case "WIOWM1110": - return "WIOWM1110" + return "UNSET" /// RAK Wireless case "RAK4631": return "UNSET" diff --git a/Meshtastic/Views/Messages/UserList.swift b/Meshtastic/Views/Messages/UserList.swift index 14c826ed..0496a51e 100644 --- a/Meshtastic/Views/Messages/UserList.swift +++ b/Meshtastic/Views/Messages/UserList.swift @@ -20,6 +20,7 @@ struct UserList: View { @State private var isOnline = false @State private var isPkiEncrypted = false @State private var isFavorite = false + @State private var isIgnored = false @State private var isEnvironment = false @State private var distanceFilter = false @State private var maxDistance: Double = 800000 @@ -44,7 +45,7 @@ struct UserList: View { NSSortDescriptor(key: "pkiEncrypted", ascending: false), NSSortDescriptor(key: "userNode.lastHeard", ascending: false), NSSortDescriptor(key: "longName", ascending: true)], - predicate: NSPredicate(format: "longName != ''"), + predicate: NSPredicate(format: "userNode.ignored == false && longName != ''"), animation: .default ) var users: FetchedResults @@ -194,7 +195,7 @@ struct UserList: View { .listStyle(.plain) .navigationTitle(String.localizedStringWithFormat("contacts %@".localized, String(users.count == 0 ? 0 : users.count))) .sheet(isPresented: $editingFilters) { - NodeListFilter(filterTitle: "Contact Filters", viaLora: $viaLora, viaMqtt: $viaMqtt, isOnline: $isOnline, isPkiEncrypted: $isPkiEncrypted, isFavorite: $isFavorite, isEnvironment: $isEnvironment, distanceFilter: $distanceFilter, maximumDistance: $maxDistance, hopsAway: $hopsAway, roleFilter: $roleFilter, deviceRoles: $deviceRoles) + NodeListFilter(filterTitle: "Contact Filters", viaLora: $viaLora, viaMqtt: $viaMqtt, isOnline: $isOnline, isPkiEncrypted: $isPkiEncrypted, isFavorite: $isFavorite, isIgnored: $isIgnored, isEnvironment: $isEnvironment, distanceFilter: $distanceFilter, maximumDistance: $maxDistance, hopsAway: $hopsAway, roleFilter: $roleFilter, deviceRoles: $deviceRoles) } .sheet(isPresented: $showingHelp) { DirectMessagesHelp() diff --git a/Meshtastic/Views/Nodes/Helpers/Actions/IgnoreNodeButton.swift b/Meshtastic/Views/Nodes/Helpers/Actions/IgnoreNodeButton.swift index ad6eb156..0ec05164 100644 --- a/Meshtastic/Views/Nodes/Helpers/Actions/IgnoreNodeButton.swift +++ b/Meshtastic/Views/Nodes/Helpers/Actions/IgnoreNodeButton.swift @@ -35,9 +35,9 @@ struct IgnoreNodeButton: View { } } label: { Label { - Text(node.favorite ? "Remove from ignored" : "Ignore Node") + Text(node.ignored ? "Remove from ignored" : "Ignore Node") } icon: { - Image(systemName: node.favorite ? "minus.circle.fill" : "minus.circle") + Image(systemName: node.ignored ? "minus.circle.fill" : "minus.circle") .symbolRenderingMode(.multicolor) } } diff --git a/Meshtastic/Views/Nodes/Helpers/NodeListFilter.swift b/Meshtastic/Views/Nodes/Helpers/NodeListFilter.swift index 210e58d1..454b3607 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeListFilter.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeListFilter.swift @@ -17,6 +17,7 @@ struct NodeListFilter: View { @Binding var isOnline: Bool @Binding var isPkiEncrypted: Bool @Binding var isFavorite: Bool + @Binding var isIgnored: Bool @Binding var isEnvironment: Bool @Binding var distanceFilter: Bool @Binding var maximumDistance: Double @@ -90,6 +91,18 @@ struct NodeListFilter: View { } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) .listRowSeparator(.visible) + Toggle(isOn: $isIgnored) { + + Label { + Text("Ignored") + } icon: { + + Image(systemName: "minus.circle.fill") + .symbolRenderingMode(.multicolor) + } + } + .toggleStyle(SwitchToggleStyle(tint: .accentColor)) + .listRowSeparator(.visible) if filterTitle == "Node Filters" { Toggle(isOn: $isEnvironment) { diff --git a/Meshtastic/Views/Nodes/MeshMap.swift b/Meshtastic/Views/Nodes/MeshMap.swift index 447f6fdd..65928ba3 100644 --- a/Meshtastic/Views/Nodes/MeshMap.swift +++ b/Meshtastic/Views/Nodes/MeshMap.swift @@ -46,6 +46,7 @@ struct MeshMap: View { @State private var isOnline = false @State private var isPkiEncrypted = false @State private var isFavorite = false + @State private var isIgnored = false @State private var isEnvironment = false @State private var distanceFilter = false @State private var maxDistance: Double = 800000 @@ -161,6 +162,7 @@ struct MeshMap: View { isOnline: $isOnline, isPkiEncrypted: $isPkiEncrypted, isFavorite: $isFavorite, + isIgnored: $isIgnored, isEnvironment: $isEnvironment, distanceFilter: $distanceFilter, maximumDistance: $maxDistance, diff --git a/Meshtastic/Views/Nodes/NodeList.swift b/Meshtastic/Views/Nodes/NodeList.swift index 7af36d4b..6f031018 100644 --- a/Meshtastic/Views/Nodes/NodeList.swift +++ b/Meshtastic/Views/Nodes/NodeList.swift @@ -26,6 +26,7 @@ struct NodeList: View { @State private var isOnline = false @State private var isPkiEncrypted = false @State private var isFavorite = false + @State private var isIgnored = false @State private var isEnvironment = false @State private var distanceFilter = false @State private var maxDistance: Double = 800000 @@ -40,6 +41,7 @@ struct NodeList: View { var boolFilters: [Bool] {[ isFavorite, + isIgnored, isOnline, isPkiEncrypted, isEnvironment, @@ -53,6 +55,7 @@ struct NodeList: View { @FetchRequest( sortDescriptors: [ + NSSortDescriptor(key: "ignored", ascending: true), NSSortDescriptor(key: "favorite", ascending: false), NSSortDescriptor(key: "lastHeard", ascending: false), NSSortDescriptor(key: "user.longName", ascending: true) @@ -169,6 +172,7 @@ struct NodeList: View { isOnline: $isOnline, isPkiEncrypted: $isPkiEncrypted, isFavorite: $isFavorite, + isIgnored: $isIgnored, isEnvironment: $isEnvironment, distanceFilter: $distanceFilter, maximumDistance: $maxDistance, @@ -397,6 +401,14 @@ struct NodeList: View { let isFavoritePredicate = NSPredicate(format: "favorite == YES") predicates.append(isFavoritePredicate) } + /// Ignored + if isIgnored { + let isIgnoredPredicate = NSPredicate(format: "ignored == YES") + predicates.append(isIgnoredPredicate) + } else if !isIgnored { + let isIgnoredPredicate = NSPredicate(format: "ignored == NO") + predicates.append(isIgnoredPredicate) + } /// Environment if isEnvironment { let environmentPredicate = NSPredicate(format: "SUBQUERY(telemetries, $tel, $tel.metricsType == 1).@count > 0")