-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathExamples.swift
More file actions
111 lines (103 loc) · 4.35 KB
/
Copy pathExamples.swift
File metadata and controls
111 lines (103 loc) · 4.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// Copyright 2021 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
//
// https://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.
import SwiftUI
struct Examples: View {
/// The list items to display.
let listItems = makeListItems()
/// The visibility of the navigation split view's column.
@State private var columnVisibility: NavigationSplitViewVisibility = .all
/// The example selected by the user.
@State private var selectedExample: Example?
var body: some View {
NavigationSplitView(columnVisibility: $columnVisibility) {
List(listItems, id: \.name, selection: $selectedExample) { item in
switch item {
case .category(let name, let examples):
DisclosureGroup(name) {
ForEach(examples, id: \.name) { example in
Text(example.name)
.tag(example)
}
}
case .example(let example):
Text(example.name)
.tag(example)
}
}
.navigationTitle("Toolkit Examples")
} detail: {
// Workaround for https://github.com/Esri/arcgis-maps-sdk-swift-toolkit/issues/1249 with
// Apple Feedback #FB19470509 "Inconsistent task(priority:_:) behavior on views shown in NavigationSplitView detail column".
NavigationStack {
if let selectedExample {
selectedExample.view
.navigationTitle(selectedExample.name)
.navigationBarTitleDisplayMode(.inline)
} else {
Text("Select an example")
}
}
}
// visionOS doesn't provide the column visibility toggle like
// iPadOS and Mac Catalyst so conditionally hide the column.
#if !os(visionOS)
.onChange(of: selectedExample) {
columnVisibility = .detailOnly
}
#endif
}
static func makeCategories() -> [ListItem] {
#if os(iOS) && !targetEnvironment(macCatalyst)
return [.augmentedRealityCategory]
#else
return []
#endif
}
static func makeListItems() -> [ListItem] {
(makeCategories() + makeUncategorizedExamples())
.sorted(by: { $0.name < $1.name })
}
static func makeUncategorizedExamples() -> [ListItem] {
return [
.example("Basemap Gallery", content: BasemapGalleryExampleView()),
.example("Bookmarks", content: BookmarksExampleView()),
.example("Building Explorer", content: BuildingExplorerExampleView()),
.example("Compass", content: CompassExampleView()),
.example("Feature Form", content: FeatureFormExampleView()),
.example("Floating Panel", content: FloatingPanelExampleView()),
.example("Floor Filter", content: FloorFilterExampleView()),
.example("Geometry Editor Toolbar", content: GeometryEditorToolbarExampleView()),
.example("Location Button", content: LocationButtonExampleView()),
.example("Overview Map", content: OverviewMapExampleView()),
.example("Popup", content: PopupExampleView()),
.example("Scalebar", content: ScalebarExampleView()),
.example("Search", content: SearchExampleView()),
.example("Utility Network Trace", content: UtilityNetworkTraceExampleView())
]
}
}
#if os(iOS) && !targetEnvironment(macCatalyst)
extension Examples.ListItem {
static var augmentedRealityCategory: Self {
.category(
"Augmented Reality",
examples: [
Example("Flyover", content: FlyoverExampleView()),
Example("Tabletop", content: TableTopExampleView()),
Example("World Scale", content: WorldScaleExampleView())
]
)
}
}
#endif