From 236955900ea0982ec7e264f288d3ec95ec5f4c46 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sat, 29 Jun 2024 16:19:56 -0700 Subject: [PATCH] Role filters --- Localizable.xcstrings | 3 --- Meshtastic/Views/Messages/UserList.swift | 18 ++++++++++------- .../Views/Nodes/Helpers/NodeListFilter.swift | 20 ++----------------- Meshtastic/Views/Nodes/NodeList.swift | 16 +++++++++------ 4 files changed, 23 insertions(+), 34 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 2423c914..d382e186 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -668,9 +668,6 @@ }, "All device and app data will be deleted. You will also need to forget your devices under Settings > Bluetooth." : { - }, - "All Roles" : { - }, "Allow Position Requests" : { diff --git a/Meshtastic/Views/Messages/UserList.swift b/Meshtastic/Views/Messages/UserList.swift index 0f068c29..393458df 100644 --- a/Meshtastic/Views/Messages/UserList.swift +++ b/Meshtastic/Views/Messages/UserList.swift @@ -25,7 +25,6 @@ struct UserList: View { @State private var distanceFilter = false @State private var maxDistance: Double = 800000 @State private var hopsAway: Int = -1 - @State private var deviceRole: Int = -1 @State private var roleFilter = false @State private var deviceRoles: Set = [] @State var isEditingFilters = false @@ -172,7 +171,7 @@ struct UserList: View { .listStyle(.plain) .navigationTitle(String.localizedStringWithFormat("contacts %@".localized, String(users.count == 0 ? 0 : users.count - 1))) .sheet(isPresented: $isEditingFilters) { - NodeListFilter(filterTitle: "Contact Filters", viaLora: $viaLora, viaMqtt: $viaMqtt, isOnline: $isOnline, isFavorite: $isFavorite, distanceFilter: $distanceFilter, maximumDistance: $maxDistance, hopsAway: $hopsAway, deviceRole: $deviceRole, roleFilter: $roleFilter, deviceRoles: $deviceRoles) + NodeListFilter(filterTitle: "Contact Filters", viaLora: $viaLora, viaMqtt: $viaMqtt, isOnline: $isOnline, isFavorite: $isFavorite, distanceFilter: $distanceFilter, maximumDistance: $maxDistance, hopsAway: $hopsAway, roleFilter: $roleFilter, deviceRoles: $deviceRoles) } .onChange(of: searchText) { _ in searchUserList() @@ -189,7 +188,7 @@ struct UserList: View { } searchUserList() } - .onChange(of: deviceRole) { _ in + .onChange(of: [deviceRoles]) { _ in searchUserList() } .onChange(of: hopsAway) { _ in @@ -261,10 +260,15 @@ struct UserList: View { predicates.append(mqttPredicate) } } - /// Role - if deviceRole > -1 { - let rolePredicate = NSPredicate(format: "role == %i", Int32(deviceRole)) - predicates.append(rolePredicate) + /// Roles + if roleFilter && deviceRoles.count > 0 { + var rolesArray: [NSPredicate] = [] + for dr in deviceRoles { + let deviceRolePredicate = NSPredicate(format: "user.role == %i", Int32(dr)) + rolesArray.append(deviceRolePredicate) + } + let compoundPredicate = NSCompoundPredicate(type: .or, subpredicates: rolesArray) + predicates.append(compoundPredicate) } /// Hops Away if hopsAway > 0 { diff --git a/Meshtastic/Views/Nodes/Helpers/NodeListFilter.swift b/Meshtastic/Views/Nodes/Helpers/NodeListFilter.swift index ba4b64e7..eb126638 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeListFilter.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeListFilter.swift @@ -20,7 +20,6 @@ struct NodeListFilter: View { @Binding var distanceFilter: Bool @Binding var maximumDistance: Double @Binding var hopsAway: Int - @Binding var deviceRole: Int @Binding var roleFilter: Bool @Binding var deviceRoles: Set @@ -114,21 +113,6 @@ struct NodeListFilter: View { } .pickerStyle(DefaultPickerStyle()) } - HStack { - Label("Device Role", systemImage: "apps.iphone") - Picker("", selection: $deviceRole) { - Text("All Roles") - .tag(-1) - ForEach(DeviceRoles.allCases) { dr in - Label { - Text(" \(dr.name)") - } icon: { - Image(systemName: dr.systemName) - } - } - } - .pickerStyle(DefaultPickerStyle()) - } Toggle(isOn: $roleFilter) { Label { @@ -151,7 +135,7 @@ struct NodeListFilter: View { } .listStyle(.plain) .environment(\.editMode, $editMode) /// bind it here! - .frame(minHeight: 210, maxHeight: .infinity) + .frame(minHeight: 490, maxHeight: .infinity) } } } @@ -169,7 +153,7 @@ struct NodeListFilter: View { .padding(.bottom) #endif } - .presentationDetents([.fraction(0.6), .fraction(0.75)]) + .presentationDetents([.fraction(1.0)]) .presentationDragIndicator(.visible) } } diff --git a/Meshtastic/Views/Nodes/NodeList.swift b/Meshtastic/Views/Nodes/NodeList.swift index 18ac320a..0f8c8683 100644 --- a/Meshtastic/Views/Nodes/NodeList.swift +++ b/Meshtastic/Views/Nodes/NodeList.swift @@ -26,7 +26,6 @@ struct NodeList: View { @State private var distanceFilter = false @State private var maxDistance: Double = 800000 @State private var hopsAway: Int = -1 - @State private var nodeRole: Int = -1 @State private var roleFilter = false @State private var deviceRoles: Set = [] @@ -190,7 +189,7 @@ struct NodeList: View { } } .sheet(isPresented: $isEditingFilters) { - NodeListFilter(viaLora: $viaLora, viaMqtt: $viaMqtt, isOnline: $isOnline, isFavorite: $isFavorite, distanceFilter: $distanceFilter, maximumDistance: $maxDistance, hopsAway: $hopsAway, deviceRole: $nodeRole, roleFilter: $roleFilter, deviceRoles: $deviceRoles) + NodeListFilter(viaLora: $viaLora, viaMqtt: $viaMqtt, isOnline: $isOnline, isFavorite: $isFavorite, distanceFilter: $distanceFilter, maximumDistance: $maxDistance, hopsAway: $hopsAway, roleFilter: $roleFilter, deviceRoles: $deviceRoles) } .safeAreaInset(edge: .bottom, alignment: .trailing) { HStack { @@ -299,7 +298,7 @@ struct NodeList: View { } searchNodeList() } - .onChange(of: nodeRole) { _ in + .onChange(of: [deviceRoles]) { _ in searchNodeList() } .onChange(of: hopsAway) { _ in @@ -364,9 +363,14 @@ struct NodeList: View { } } /// Role - if nodeRole > -1 { - let rolePredicate = NSPredicate(format: "user.role == %i", Int32(nodeRole)) - predicates.append(rolePredicate) + if roleFilter && deviceRoles.count > 0 { + var rolesArray: [NSPredicate] = [] + for dr in deviceRoles { + let deviceRolePredicate = NSPredicate(format: "user.role == %i", Int32(dr)) + rolesArray.append(deviceRolePredicate) + } + let compoundPredicate = NSCompoundPredicate(type: .or, subpredicates: rolesArray) + predicates.append(compoundPredicate) } /// Hops Away if hopsAway > 0 {