Improve SidebarView

This commit is contained in:
世界
2025-11-26 22:25:53 +08:00
parent c5fd6a6b4e
commit 8855e0eef9
2 changed files with 45 additions and 87 deletions
+1 -2
View File
@@ -18,7 +18,7 @@ public struct MainView: View {
public var body: some View {
NavigationSplitView {
SidebarView()
SidebarView(selection: $viewModel.selection)
.navigationSplitViewColumnWidth(150)
} detail: {
NavigationStack {
@@ -60,7 +60,6 @@ public struct MainView: View {
.onReceive(environments.openSettings) {
viewModel.openSettings()
}
.environment(\.selection, $viewModel.selection)
.environment(\.importProfile, $viewModel.importProfile)
.environment(\.importRemoteProfile, $viewModel.importRemoteProfile)
.environment(\.profileEditor, profileEditor)
+20 -61
View File
@@ -3,33 +3,36 @@ import Library
import SwiftUI
public struct SidebarView: View {
@Environment(\.selection) private var selection
@Binding var selection: NavigationPage
@EnvironmentObject private var environments: ExtensionEnvironments
public init() {}
public init(selection: Binding<NavigationPage>) {
_selection = selection
}
public var body: some View {
VStack {
if ApplicationLibrary.inPreview {
SidebarViewPreview()
sidebarContent(isConnected: true, profile: nil)
} else if environments.extensionProfileLoading {
ProgressView()
} else if let profile = environments.extensionProfile {
SidebarView0().environmentObject(profile)
sidebarContent(isConnected: profile.status.isConnectedStrict, profile: profile)
.onChangeCompat(of: profile.status) {
if !selection.visible(profile) {
DispatchQueue.main.async {
selection = .dashboard
}
}
}
} else {
SidebarView1()
}
sidebarContent(isConnected: false, profile: nil)
}
}
struct SidebarView0: View {
@Environment(\.selection) private var selection
@EnvironmentObject private var extensionProfile: ExtensionProfile
var body: some View {
VStack {
viewBuilder {
if extensionProfile.status.isConnectedStrict {
List(selection: selection) {
@ViewBuilder
private func sidebarContent(isConnected: Bool, profile: ExtensionProfile?) -> some View {
List(selection: $selection) {
if isConnected {
Section(NavigationPage.dashboard.title) {
Label("Overview", systemImage: "text.and.command.macwindow")
.tint(.textColor)
@@ -43,11 +46,8 @@ public struct SidebarView: View {
ForEach(NavigationPage.macosDefaultPages, id: \.self) { it in
it.label
}
}
} else {
List(NavigationPage.allCases.filter { it in
it.visible(extensionProfile)
}, selection: selection) { it in
ForEach(NavigationPage.allCases.filter { $0.visible(profile) }, id: \.self) { it in
it.label
}
}
@@ -55,45 +55,4 @@ public struct SidebarView: View {
.listStyle(.sidebar)
.scrollDisabled(true)
}
.onChangeCompat(of: extensionProfile.status) {
if !selection.wrappedValue.visible(extensionProfile) {
selection.wrappedValue = NavigationPage.dashboard
}
}
}
}
struct SidebarView1: View {
@Environment(\.selection) private var selection
var body: some View {
List(NavigationPage.allCases.filter { it in
it.visible(nil)
}, selection: selection) { it in
it.label
}
}
}
struct SidebarViewPreview: View {
@Environment(\.selection) private var selection
var body: some View {
VStack {
List(selection: selection) {
Section(NavigationPage.dashboard.title) {
Label("Overview", systemImage: "text.and.command.macwindow")
.tint(.textColor)
.tag(NavigationPage.dashboard)
NavigationPage.groups.label.tag(NavigationPage.groups)
}
Divider()
ForEach(NavigationPage.macosDefaultPages, id: \.self) { it in
it.label
}
}
.listStyle(.sidebar)
.scrollDisabled(true)
}
}
}
}