Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

df/FloorFilter_III #36

Merged
merged 189 commits into from
Jun 10, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
189 commits
Select commit Hold shift + click to select a range
221bf4d
Match commented line spacing
dfeinzimer Mar 4, 2022
b31ba21
Merge branch 'mhd/FloorFilter_II' into df/FloorFilter_III
dfeinzimer Mar 4, 2022
12265f7
Implement nav view
dfeinzimer Mar 5, 2022
9126832
site / facility selection, all sitea
dfeinzimer Mar 7, 2022
903c356
Add text filtering
dfeinzimer Mar 8, 2022
9ec2086
Update FloorFilter.swift
dfeinzimer Mar 8, 2022
82ed6c6
Define `AutomaticSelectionMode.AlwaysNotClearing`
dfeinzimer Mar 10, 2022
5af3b81
Lowercase enum values
dfeinzimer Mar 10, 2022
1e87212
Get viewpoint changes, default to Redlands
dfeinzimer Mar 11, 2022
a33aa62
Initial automaticSelectionMode implementation
dfeinzimer Mar 11, 2022
91a6e24
Initial automaticSelectionMode implementation pt 2
dfeinzimer Mar 11, 2022
52e9196
Improve selection clarity
dfeinzimer Mar 11, 2022
22201df
Hides sites browser if only 1 site defined
dfeinzimer Mar 11, 2022
3ee9f36
Remove unneeded
dfeinzimer Mar 11, 2022
2feae74
Scroll to selected facility
dfeinzimer Mar 12, 2022
5adc781
Refactor
dfeinzimer Mar 12, 2022
9bc4d29
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 14, 2022
a745772
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 14, 2022
38cc046
Update FloorFilterExampleView.swift
dfeinzimer Mar 15, 2022
46be9e8
Update FloorFilterExampleView.swift
dfeinzimer Mar 15, 2022
094c6db
Update FloorFilter.swift
dfeinzimer Mar 15, 2022
ca295f2
Update FloorFilter.swift
dfeinzimer Mar 15, 2022
a72d7d3
Update FloorFilter.swift
dfeinzimer Mar 15, 2022
e7b380c
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 15, 2022
64e6819
Update FloorFilter.swift
dfeinzimer Mar 15, 2022
9521456
Update FloorFilter.swift
dfeinzimer Mar 15, 2022
3230f0f
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 15, 2022
8356a6c
Update FloorFilter.swift
dfeinzimer Mar 15, 2022
4f7ac69
Update FloorFilter.swift
dfeinzimer Mar 16, 2022
ebc8cad
Update FloorFilterViewModel.swift
dfeinzimer Mar 16, 2022
848bd85
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 16, 2022
47a8c77
Update Button.swift
dfeinzimer Mar 16, 2022
168a8fc
Update Result.swift
dfeinzimer Mar 16, 2022
56113a4
Update View.swift
dfeinzimer Mar 16, 2022
8e63062
Patch breaking changes
dfeinzimer Mar 16, 2022
94315c6
Update FloorFilterExampleView.swift
dfeinzimer Mar 16, 2022
cca6a48
Update FloorFilterExampleView.swift
dfeinzimer Mar 16, 2022
8789c8c
Update FloorFilterExampleView.swift
dfeinzimer Mar 16, 2022
a58c8ea
Update FloorFilterViewModel.swift
dfeinzimer Mar 16, 2022
3d93fcd
Create FloorFilterTests.swift
dfeinzimer Mar 16, 2022
9d4d44d
Update FloorFilterTests.swift
dfeinzimer Mar 17, 2022
c5d5234
Update FloorFilterTests.swift
dfeinzimer Mar 17, 2022
0639797
Update FloorFilterTests.swift
dfeinzimer Mar 17, 2022
ff26552
Update FloorFilterTests.swift
dfeinzimer Mar 17, 2022
f337fb0
Update FloorFilterViewModelTests.swift
dfeinzimer Mar 17, 2022
0ec71ef
Update FloorFilterViewModel.swift
dfeinzimer Mar 17, 2022
30a47b8
Update FloorFilter.swift
dfeinzimer Mar 17, 2022
e9addf7
Update FloorFilter.swift
dfeinzimer Mar 17, 2022
d437deb
Update FloorFilterExampleView.swift
dfeinzimer Mar 17, 2022
7ab012d
Update FloorFilterViewModel.swift
dfeinzimer Mar 17, 2022
2524084
Update FloorFilterViewModel.swift
dfeinzimer Mar 17, 2022
cd71307
Update FloorFilter.swift
dfeinzimer Mar 17, 2022
c5a9a53
Update FloorFilterExampleView.swift
dfeinzimer Mar 17, 2022
745208b
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 17, 2022
a6753de
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 17, 2022
601548e
Update FloorFilterExampleView.swift
dfeinzimer Mar 17, 2022
5d8f0bf
Update FloorFilter.swift
dfeinzimer Mar 17, 2022
85fcec9
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 17, 2022
2585a3e
Update FloorFilter.swift
dfeinzimer Mar 17, 2022
8a33f79
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 18, 2022
aa879b4
Update FloorFilter.swift
dfeinzimer Mar 18, 2022
96f17bc
Update FloorFilter.swift
dfeinzimer Mar 18, 2022
b417fb6
Update FloorFilterViewModel.swift
dfeinzimer Mar 18, 2022
e88a7ca
Update FloorFilterExampleView.swift
dfeinzimer Mar 18, 2022
13b7232
Update FloorFilterExampleView.swift
dfeinzimer Mar 19, 2022
161bbac
Update FloorFilter.swift
dfeinzimer Mar 19, 2022
a1946aa
Update FloorFilter.swift
dfeinzimer Mar 19, 2022
1d81aec
Update FloorFilterExampleView.swift
dfeinzimer Mar 19, 2022
ebd6e30
Update FloorFilterViewModel.swift
dfeinzimer Mar 19, 2022
7b63abc
Update FloorFilterExampleView.swift
dfeinzimer Mar 19, 2022
8207895
Update FloorFilterViewModel.swift
dfeinzimer Mar 19, 2022
9c97f80
Update FloorFilterViewModel.swift
dfeinzimer Mar 19, 2022
94dcf82
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 19, 2022
add59cf
Update FloorFilter.swift
dfeinzimer Mar 19, 2022
fbccab0
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 19, 2022
e92717b
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 19, 2022
a3e4ad8
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 19, 2022
fc8f7fb
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 19, 2022
9c3e34c
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 19, 2022
dc469a5
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 19, 2022
f859408
Update SiteAndFacilitySelector.swift
dfeinzimer Mar 19, 2022
602f5a9
Create LevelSelector.swift
dfeinzimer Mar 19, 2022
b7985f3
Update FloorFilter.swift
dfeinzimer Mar 19, 2022
46185a4
Update FloorFilter.swift
dfeinzimer Mar 19, 2022
452216d
Update FloorFilterViewModel.swift
dfeinzimer Mar 19, 2022
57c6755
Update LevelSelector.swift
dfeinzimer Mar 19, 2022
8e9fe31
Update FloorFilter.swift
dfeinzimer Mar 19, 2022
81b77ac
Update LevelSelector.swift
dfeinzimer Mar 19, 2022
e4f15a5
Update FloorFilterViewModel.swift
dfeinzimer Mar 19, 2022
e13fd4b
Update FloorFilterViewModelTests.swift
dfeinzimer Mar 19, 2022
6cbdad3
Update FloorFilterViewModelTests.swift
dfeinzimer Mar 19, 2022
189dc9a
Update Result.swift
dfeinzimer Mar 22, 2022
6ea4743
Update View.swift
dfeinzimer Mar 22, 2022
9a40a7a
Update View.swift
dfeinzimer Mar 22, 2022
f304d7f
Update SearchViewModel.swift
dfeinzimer Mar 29, 2022
62a4764
Fix build to compile with latest SwiftSDK updates
dfeinzimer Mar 29, 2022
1182f2e
Revert unintended change
dfeinzimer Mar 29, 2022
705cec4
Revert to a single point of selection
dfeinzimer Apr 7, 2022
f886552
PR feedback
dfeinzimer Apr 12, 2022
b973dba
PR feedback
dfeinzimer Apr 12, 2022
b5ac588
PR feedback
dfeinzimer Apr 12, 2022
7df6a0a
PR feedback
dfeinzimer Apr 12, 2022
b27e088
Small doc update
dfeinzimer Apr 12, 2022
c5771fa
Merge in v.next
dfeinzimer Apr 12, 2022
5d0013c
`Button` -> `Toggle`
dfeinzimer Apr 13, 2022
eddb575
`AutomaticSelectionMode` -> `FloorFilterAutomaticSelectionMode`
dfeinzimer Apr 13, 2022
4b7ad56
Fix site selection
dfeinzimer Apr 14, 2022
8638d04
Updates
dfeinzimer Apr 15, 2022
d4f6744
Updates
dfeinzimer Apr 18, 2022
f7f6910
Merge branch 'v.next' into df/FloorFilter_III
dfeinzimer Apr 18, 2022
0d06be1
Update SiteAndFacilitySelector.swift
dfeinzimer Apr 18, 2022
4e96960
Update SiteAndFacilitySelector.swift
dfeinzimer Apr 18, 2022
85ffa8a
Update FloorFilter.swift
dfeinzimer Apr 18, 2022
878681e
"Select a site" -> "Sites"
dfeinzimer Apr 19, 2022
b0a68e6
Update Sources/ArcGISToolkit/Components/FloorFilter/FloorFilter.swift
dfeinzimer Apr 19, 2022
42313f9
Add `EdgeInsets.esriInsets`
dfeinzimer Apr 19, 2022
01fb074
Merge branch 'df/FloorFilter_III' of https://github.com/ArcGIS/arcgis…
dfeinzimer Apr 19, 2022
a5a0e00
Add toggle styles
dfeinzimer Apr 19, 2022
fe4fbbc
Fix new build errors
dfeinzimer Apr 28, 2022
767403f
Introduce/implement `filterWidth` modifier
dfeinzimer Apr 30, 2022
4ca3b5d
`filterAlignment` -> `floorFilterAlignment`
dfeinzimer May 5, 2022
c12af2d
Simplify usage of viewModel.hasLevelsToDisplay
dfeinzimer May 5, 2022
533c866
Revert use of `MapScale`
dfeinzimer May 5, 2022
4fff4a6
Refactor width handling
dfeinzimer May 7, 2022
597fb82
Merge branch 'v.next' into df/FloorFilter_III
dfeinzimer May 12, 2022
d369bf9
Merge branch 'v.next' into df/FloorFilter_III
dfeinzimer May 13, 2022
6a8b13f
Modify viewpoint handling
dfeinzimer May 18, 2022
8974e03
An alternative viewpoint implementation.
mhdostal May 18, 2022
b3339fb
Merge pull request #62 from ArcGIS/mhd/FFIII_Viewpoint
dfeinzimer May 19, 2022
defd8bb
Update FloorFilterViewModelTests.swift
dfeinzimer May 19, 2022
ad8e688
Update FloorFilterViewModelTests.swift
dfeinzimer May 19, 2022
d5829fb
Improve tests
dfeinzimer May 19, 2022
b5c8c77
Merge branch 'v.next' into df/FloorFilter_III
dfeinzimer May 19, 2022
07d0507
Merge branch 'v.next' into df/FloorFilter_III
dfeinzimer May 20, 2022
ccfa7b5
Reorder FloorFilter initializer parameter documentation
dfeinzimer May 31, 2022
f15cb83
Change `filterWidth` to constant and CGFloat
dfeinzimer May 31, 2022
23a19bc
Update FloorFilter.swift
dfeinzimer May 31, 2022
35a603c
Merge branch 'v.next' into df/FloorFilter_III
dfeinzimer May 31, 2022
7ab03f7
`topAligned` -> `isTopAligned`
dfeinzimer May 31, 2022
8b6a106
Update Sources/ArcGISToolkit/Components/FloorFilter/FloorFilterAutoma…
dfeinzimer May 31, 2022
ff29c5d
Update FloorFilterViewModel.swift
dfeinzimer May 31, 2022
37fd0d8
Update LevelSelector.swift
dfeinzimer May 31, 2022
26e47ca
Update Sources/ArcGISToolkit/Components/FloorFilter/LevelSelector.swift
dfeinzimer May 31, 2022
dbaaabe
Introduce `LevelNameFormat`
dfeinzimer May 31, 2022
1b51405
Update LevelSelector.swift
dfeinzimer May 31, 2022
9ba81e6
Update Sources/ArcGISToolkit/Components/FloorFilter/LevelSelector.swift
dfeinzimer May 31, 2022
14440af
Update Sources/ArcGISToolkit/Components/FloorFilter/SiteAndFacilitySe…
dfeinzimer May 31, 2022
cdbd745
`updateViewModel` -> `shouldUpdateViewModel`
dfeinzimer May 31, 2022
117ca38
Merge branch 'df/FloorFilter_III' of https://github.com/ArcGIS/arcgis…
dfeinzimer May 31, 2022
7c6e7a3
`keyboardAnimating` -> `isKeyboardAnimating`
dfeinzimer May 31, 2022
f67ae19
`searchPhrase` -> `query`
dfeinzimer May 31, 2022
5c0abdd
Update SiteAndFacilitySelector.swift
dfeinzimer May 31, 2022
30b6b91
Update Sources/ArcGISToolkit/Components/FloorFilter/SiteAndFacilitySe…
dfeinzimer May 31, 2022
1e19e5e
`searchPhrase` -> `query`
dfeinzimer May 31, 2022
5c85681
Update SiteAndFacilitySelector.swift
dfeinzimer May 31, 2022
33b8003
Fix indentation
dfeinzimer May 31, 2022
0e34713
Update SiteAndFacilitySelector.swift
dfeinzimer May 31, 2022
66ba036
Update SiteAndFacilitySelector.swift
dfeinzimer May 31, 2022
a540ac5
Update SiteAndFacilitySelector.swift
dfeinzimer May 31, 2022
b38c845
`esriInsets` -> `toolkitDefault`
dfeinzimer May 31, 2022
078b1aa
Update LevelSelector.swift
dfeinzimer May 31, 2022
b832106
Update Sources/ArcGISToolkit/Extensions/FloorFacility.swift
dfeinzimer May 31, 2022
03ad060
Update Sources/ArcGISToolkit/Extensions/FloorLevel.swift
dfeinzimer May 31, 2022
943a066
Update FloorSite.swift
dfeinzimer May 31, 2022
a5170c2
Revert to simple button style
dfeinzimer May 31, 2022
8d4f449
Update View.swift
dfeinzimer May 31, 2022
d219faf
Update View.swift
dfeinzimer May 31, 2022
975b315
Update View.swift
dfeinzimer May 31, 2022
6d8b712
Update View.swift
dfeinzimer May 31, 2022
1698c17
Restore button styling
dfeinzimer May 31, 2022
cbd972b
Update FloorFilterViewModelTests.swift
dfeinzimer May 31, 2022
2104101
Update FloorFilterViewModelTests.swift
dfeinzimer May 31, 2022
7643f7e
Update FloorFilterViewModelTests.swift
dfeinzimer May 31, 2022
e6ce514
Update FloorFilterViewModelTests.swift
dfeinzimer May 31, 2022
1a0bf0f
Update FloorFilterViewModelTests.swift
dfeinzimer May 31, 2022
a107815
Update FloorFilterViewModelTests.swift
dfeinzimer May 31, 2022
6d9cd52
Update FloorFilterViewModelTests.swift
dfeinzimer May 31, 2022
3d7e840
Update FloorFilterViewModelTests.swift
dfeinzimer May 31, 2022
2e15a5f
Update FloorFilterViewModelTests.swift
dfeinzimer May 31, 2022
e16bcee
Update FloorFilterViewModelTests.swift
dfeinzimer May 31, 2022
74762af
Update SiteAndFacilitySelector.swift
dfeinzimer Jun 1, 2022
632da93
Update FloorFilterViewModelTests.swift
dfeinzimer Jun 1, 2022
5ff89ec
Update SiteAndFacilitySelector.swift
dfeinzimer Jun 1, 2022
0d81624
Bind site selection to view model selection
dfeinzimer Jun 2, 2022
e941e9f
Update SiteAndFacilitySelector.swift
dfeinzimer Jun 2, 2022
194e7e4
Apply latest PR feedback
dfeinzimer Jun 7, 2022
48f1d34
Remove `UIResponder` workaround
dfeinzimer Jun 7, 2022
e4ad6db
Add esriBorder back to the new background
dfeinzimer Jun 8, 2022
ca77f58
Update SiteAndFacilitySelector.swift
dfeinzimer Jun 9, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 18 additions & 7 deletions Examples/Examples/FloorFilterExampleView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,30 @@ struct FloorFilterExampleView: View {
/// Make a map from a portal item.
static func makeMap() -> Map {
// Multiple sites/facilities: Esri IST map with all buildings.
// let portal = Portal(url: URL(string: "https://indoors.maps.arcgis.com/")!, isLoginRequired: false)
// let portalItem = PortalItem(portal: portal, id: Item.ID(rawValue: "49520a67773842f1858602735ef538b5")!)
// let portal = Portal(url: URL(string: "https://indoors.maps.arcgis.com/")!, isLoginRequired: false)
// let portalItem = PortalItem(portal: portal, id: Item.ID(rawValue: "49520a67773842f1858602735ef538b5")!)

// Redlands Campus map.
let portal = Portal(url: URL(string: "https://runtimecoretest.maps.arcgis.com/")!, isLoginRequired: false)
let portalItem = PortalItem(portal: portal, id: Item.ID(rawValue: "7687805bd42549f5ba41237443d0c60a")!) //<= another multiple sites/facilities

// Single site (ESRI Redlands Main) and facility (Building L).
// let portal = Portal(url: URL(string: "https://indoors.maps.arcgis.com/")!, isLoginRequired: false)
// let portalItem = PortalItem(portal: portal, id: Item.ID(rawValue: "f133a698536f44c8884ad81f80b6cfc7")!)
// let portal = Portal(url: URL(string: "https://indoors.maps.arcgis.com/")!, isLoginRequired: false)
// let portalItem = PortalItem(portal: portal, id: Item.ID(rawValue: "f133a698536f44c8884ad81f80b6cfc7")!)

return Map(item: portalItem)
}

/// Determines the arrangement of the inner `FloorFilter` UI componenets.
private let floorFilterAlignment = Alignment.bottomLeading

/// Determines the appropriate time to initialize the `FloorFilter`.
@State private var isMapLoaded: Bool = false

@State private var mapLoadError: Bool = false

@State private var viewpoint = Viewpoint(
/// The initial viewpoint of the map.
@State private var viewpoint: Viewpoint? = Viewpoint(
center: Point(
x: -117.19496,
y: 34.05713,
Expand All @@ -56,14 +61,20 @@ struct FloorFilterExampleView: View {
.onViewpointChanged(kind: .centerAndScale) {
viewpoint = $0
}
.overlay(alignment: .bottomLeading) {
/// Preserve the current viewpoint when a keyboard is presented in landscape.
.ignoresSafeArea(.keyboard, edges: .bottom)
.overlay(alignment: floorFilterAlignment) {
if isMapLoaded,
let floorManager = map.floorManager {
FloorFilter(
floorManager: floorManager,
alignment: floorFilterAlignment,
viewpoint: $viewpoint
)
.frame(height: 300)
.frame(
maxWidth: 300,
maxHeight: 300
)
.padding(36)
} else if mapLoadError {
Label(
Expand Down
210 changes: 82 additions & 128 deletions Sources/ArcGISToolkit/Components/FloorFilter/FloorFilter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,166 +21,120 @@ public struct FloorFilter: View {
/// Creates a `FloorFilter`.
/// - Parameters:
/// - floorManager: The floor manager used by the `FloorFilter`.
/// - alignment: Determines the display configuration of Floor Filter elements.
/// - automaticSelectionMode: The selection behavior of the floor filter.
/// - viewpoint: Viewpoint updated when the selected site or facility changes.
public init(
floorManager: FloorManager,
viewpoint: Binding<Viewpoint>? = nil
alignment: Alignment,
automaticSelectionMode: FloorFilterAutomaticSelectionMode = .always,
philium marked this conversation as resolved.
Show resolved Hide resolved
viewpoint: Binding<Viewpoint?> = .constant(nil)
) {
_viewModel = StateObject(wrappedValue: FloorFilterViewModel(
automaticSelectionMode: automaticSelectionMode,
floorManager: floorManager,
viewpoint: viewpoint
))
self.alignment = alignment
self.viewpoint = viewpoint
}

/// The view model used by the `FloorFilter`.
@StateObject private var viewModel: FloorFilterViewModel

/// A Boolean value that indicates whether the site or facility selector is hidden.
@State private var isSelectorHidden: Bool = true
/// A Boolean value that indicates whether the site and facility selector is hidden.
@State private var isSitesAndFacilitiesHidden: Bool = true

/// A Boolean value that indicates whether the levels view is currently collapsed.
@State private var isLevelsViewCollapsed: Bool = false
/// The alignment configuration.
private let alignment: Alignment

/// The selected facility's levels, sorted by `level.verticalOrder`.
private var sortedLevels: [FloorLevel] {
viewModel.selectedFacility?.levels.sorted() {
$0.verticalOrder > $1.verticalOrder
} ?? []
}
/// The width of the level selector.
private let filterWidth: CGFloat = 60

public var body: some View {
Group {
if viewModel.isLoading {
VStack {
Spacer()
ProgressView()
.padding(12)
}
} else {
HStack(alignment: .bottom) {
VStack {
Spacer()
VStack {
if viewModel.hasLevelsToDisplay {
LevelsView(
levels: sortedLevels,
isCollapsed: $isLevelsViewCollapsed
)
Divider()
.frame(width: 30)
}
// Site button.
Button {
isSelectorHidden.toggle()
} label: {
Image(systemName: "building.2")
}
.padding(4)
}
.esriBorder()
}
if !isSelectorHidden {
SiteAndFacilitySelector(isHidden: $isSelectorHidden)
.esriBorder()
}
}
}
/// Button to open and close the site and facility selector.
private var sitesAndFacilitiesButton: some View {
Button {
isSitesAndFacilitiesHidden.toggle()
} label: {
Image(systemName: "building.2")
.padding(.toolkitDefault)
}
.environmentObject(viewModel)
.frame(maxWidth: .infinity)
}
}

/// A view displaying the levels in the selected facility.
struct LevelsView: View {
/// The levels to display.
let levels: [FloorLevel]

/// A Boolean value that indicates whether the view shows only the selected level or all levels.
/// If the value is `false`, the view will display all levels. Otherwise, display only the
/// selected level.
@Binding var isCollapsed: Bool

/// The view model used by the `LevelsView`.
@EnvironmentObject var viewModel: FloorFilterViewModel

/// The height of the scroll view's content.
@State private var scrollViewContentHeight: CGFloat = .zero
/// Displays the available levels.
@ViewBuilder private var levelSelector: some View {
LevelSelector(
levels: viewModel.sortedLevels,
isTopAligned: isTopAligned
)
}

public var body: some View {
/// A view that allows selecting between levels.
private var floorFilter: some View {
VStack {
if !isCollapsed,
levels.count > 1 {
CollapseButton(isCollapsed: $isCollapsed)
Divider()
.frame(width: 30)
ScrollView {
LevelsStack(levels: levels)
.background(
GeometryReader { geometry -> Color in
DispatchQueue.main.async {
scrollViewContentHeight = geometry.size.height
}
return .clear
}
)
if isTopAligned {
sitesAndFacilitiesButton
if viewModel.hasLevelsToDisplay {
Divider()
levelSelector
}
.frame(maxHeight: scrollViewContentHeight)
} else {
// Button for the selected level.
Button {
if levels.count > 1 {
isCollapsed.toggle()
}
} label: {
Text(viewModel.selectedLevel?.shortName ?? (levels.first?.shortName ?? "None"))
if viewModel.hasLevelsToDisplay {
levelSelector
Divider()
}
.selected(true)
.padding(4)
sitesAndFacilitiesButton
}
}
.frame(width: filterWidth)
.esriBorder()
.frame(maxHeight: .infinity, alignment: alignment)
}
}

/// A vertical list of floor levels.
struct LevelsStack: View {
let levels: [FloorLevel]

/// The view model used by the `LevelsView`.
@EnvironmentObject
var viewModel: FloorFilterViewModel

var body: some View {
VStack {
ForEach(levels) { level in
Button {
viewModel.selection = .level(level)
} label: {
Text(level.shortName)
/// A configured `SiteAndFacilitySelector` view.
///
/// The layering of the `SiteAndFacilitySelector` over a `RoundedRectangle` is needed to
/// produce a rounded corners effect. We can not simply use `.esriBorder()` here because
/// applying the `cornerRadius()` modifier on `SiteAndFacilitySelector`'s underlying
/// `NavigationView` causes a rendering bug. This bug remains in iOS 16 with
/// `NavigationStack` and has been reported to Apple as FB10034457.
private var siteAndFacilitySelector: some View {
ZStack {
RoundedRectangle(cornerRadius: 8)
.fill(Color(uiColor: .systemBackground))
.esriBorder()
SiteAndFacilitySelector(isHidden: $isSitesAndFacilitiesHidden)
.onChange(of: viewpoint.wrappedValue) {
viewModel.onViewpointChanged($0)
}
.selected(level == viewModel.selectedLevel)
.padding(4)
}
.padding()
}
.opacity(isSitesAndFacilitiesHidden ? .zero : 1)
philium marked this conversation as resolved.
Show resolved Hide resolved
}
}

/// A button used to collapse the floor level list.
struct CollapseButton: View {
/// Allows the user to toggle the visibility of the site and facility selector.
@Binding
var isCollapsed: Bool

var body: some View {
Button {
isCollapsed.toggle()
} label: {
Image(systemName: "xmark")
/// Indicates that the selector should be presented with a top oriented aligment configuration.
private var isTopAligned: Bool {
alignment.vertical == .top
}

/// The `Viewpoint` used to pan/zoom to the selected site/facilty.
/// If `nil`, there will be no automatic pan/zoom operations or automatic selection support.
private var viewpoint: Binding<Viewpoint?>

public var body: some View {
HStack(alignment: .bottom) {
if alignment.horizontal == .trailing {
siteAndFacilitySelector
floorFilter
} else {
floorFilter
siteAndFacilitySelector
}
}
.padding(EdgeInsets(
top: 2,
leading: 4,
bottom: 2,
trailing: 4
))
// Ensure space for filter text field on small screens in landscape
.frame(minHeight: 100)
.environmentObject(viewModel)
.disabled(viewModel.isLoading)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Copyright 2022 Esri.

// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0

// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/// Defines automatic selection behavior.
public enum FloorFilterAutomaticSelectionMode {
/// Always update selection based on the current viewpoint; clear the selection when the user
/// navigates away.
case always
/// Only update the selection when there is a new site or facility in the current viewpoint; don't clear
/// selection when the user navigates away.
case alwaysNotClearing
/// Never update selection based on the map or scene view's current viewpoint.
case never
}
Loading