Prepare for selection of items

Update MainView.swift
This commit is contained in:
Christoph Hagen
2025-01-18 09:56:42 +01:00
parent e0787f991e
commit 1d4b3c266c
3 changed files with 66 additions and 52 deletions

View File

@ -45,23 +45,8 @@ struct MainView: App {
@State
private var language: ContentLanguage = .english
@State
private var selectedTab: MainViewTab = .posts
@State
private var selectedPost: Post?
@State
private var selectedPage: Page?
@State
private var selectedTag: Tag?
@State
private var selectedFile: FileResource?
@State
private var selectedSection: SettingsSection = .folders
@ObservedObject
private var selection: SelectedContent = .init()
@State
private var showAddSheet = false
@ -77,63 +62,63 @@ struct MainView: App {
@ViewBuilder
var sidebar: some View {
switch selectedTab {
switch selection.tab {
case .posts:
PostListView(selectedPost: $selectedPost)
PostListView(selectedPost: $selection.post)
case .pages:
PageListView(selectedPage: $selectedPage)
PageListView(selectedPage: $selection.page)
case .tags:
TagListView(selectedTag: $selectedTag)
TagListView(selectedTag: $selection.tag)
case .files:
FileListView(selectedFile: $selectedFile)
FileListView(selectedFile: $selection.file)
case .generation:
SettingsListView(selectedSection: $selectedSection)
SettingsListView(selectedSection: $selection.section)
}
}
@ViewBuilder
var viewContent: some View {
switch selectedTab {
switch selection.tab {
case .posts:
SelectedContentView<PostContentView>(selected: $selectedPost)
SelectedContentView<PostContentView>(selected: $selection.post)
case .pages:
SelectedContentView<PageContentView>(selected: $selectedPage)
SelectedContentView<PageContentView>(selected: $selection.page)
case .tags:
SelectedContentView<TagContentView>(selected: $selectedTag)
SelectedContentView<TagContentView>(selected: $selection.tag)
case .files:
SelectedContentView<FileContentView>(selected: $selectedFile)
SelectedContentView<FileContentView>(selected: $selection.file)
case .generation:
GenerationContentView(selected: $selectedSection)
GenerationContentView(selected: $selection.section)
}
}
@ViewBuilder
var detail: some View {
switch selectedTab {
switch selection.tab {
case .posts:
SelectedDetailView<PostDetailView>(selected: $selectedPost)
SelectedDetailView<PostDetailView>(selected: $selection.post)
case .pages:
SelectedDetailView<PageDetailView>(selected: $selectedPage)
SelectedDetailView<PageDetailView>(selected: $selection.page)
case .tags:
SelectedDetailView<TagDetailView>(selected: $selectedTag)
SelectedDetailView<TagDetailView>(selected: $selection.tag)
case .files:
SelectedDetailView<FileDetailView>(selected: $selectedFile)
SelectedDetailView<FileDetailView>(selected: $selection.file)
case .generation:
GenerationDetailView(section: selectedSection)
GenerationDetailView(section: selection.section)
}
}
@ViewBuilder
var addItemSheet: some View {
switch selectedTab {
switch selection.tab {
case .posts:
AddPostView(selected: $selectedPost)
AddPostView(selected: $selection.post)
case .pages:
AddPageView(selected: $selectedPage)
AddPageView(selected: $selection.page)
case .tags:
AddTagView(selected: $selectedTag)
AddTagView(selected: $selection.tag)
case .files:
AddFileView(selectedFile: $selectedFile)
AddFileView(selectedFile: $selection.file)
case .generation:
Text("Not implemented")
}
@ -145,7 +130,7 @@ struct MainView: App {
sidebar
.toolbar {
ToolbarItem(placement: .navigation) {
Picker("", selection: $selectedTab) {
Picker("", selection: $selection.tab) {
Text("Posts").tag(MainViewTab.posts)
Text("Pages").tag(MainViewTab.pages)
Text("Tags").tag(MainViewTab.tags)
@ -160,7 +145,7 @@ struct MainView: App {
Button(action: { showAddSheet = true }) {
Label("Add", systemSymbol: .plus)
}
.disabled(!selectedTab.canAddItems)
.disabled(!selection.tab.canAddItems)
}
}
} content: {
@ -194,6 +179,7 @@ struct MainView: App {
.navigationTitle("")
.environment(\.language, language)
.environmentObject(content)
.environmentObject(selection)
.onAppear(perform: loadContent)
.onReceive(Timer.publish(every: 60.0, on: .main, in: .common).autoconnect()) { _ in
save()
@ -202,11 +188,13 @@ struct MainView: App {
addItemSheet
.environment(\.language, language)
.environmentObject(content)
.environmentObject(selection)
}
.sheet(isPresented: $showInitialSetupSheet) {
InitialSetupView()
.environment(\.language, language)
.environmentObject(content)
.environmentObject(selection)
}
.sheet(isPresented: $showLoadErrorSheet) {
VStack {
@ -251,24 +239,24 @@ struct MainView: App {
}
private func prepareAfterLoad() {
if selectedPost == nil {
selectedPost = content.posts.first
if selection.post == nil {
selection.post = content.posts.first
}
if selectedPage == nil {
selectedPage = content.pages.first
if selection.page == nil {
selection.page = content.pages.first
}
if selectedTag == nil {
selectedTag = content.tags.first
if selection.tag == nil {
selection.tag = content.tags.first
}
if selectedFile == nil {
selectedFile = content.files.first
if selection.file == nil {
selection.file = content.files.first
}
}
private func showInitialSheet() {
DispatchQueue.main.async {
selectedSection = .folders
selectedTab = .generation
selection.section = .folders
selection.tab = .generation
showInitialSetupSheet = true
}
}

View File

@ -0,0 +1,22 @@
import Foundation
final class SelectedContent: ObservableObject {
@Published
var tab: MainViewTab = .posts
@Published
var post: Post?
@Published
var page: Page?
@Published
var tag: Tag?
@Published
var file: FileResource?
@Published
var section: SettingsSection = .folders
}