From 172721e3247d0b04b2e8b39ab7406baa6e2ad88b Mon Sep 17 00:00:00 2001 From: coe Date: Tue, 19 Sep 2023 01:29:19 +0900 Subject: [PATCH 1/3] create let for commonality --- .../Modules/Sources/Navigation/RootView.swift | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/app-ios/Modules/Sources/Navigation/RootView.swift b/app-ios/Modules/Sources/Navigation/RootView.swift index d0cacf99d..56948728c 100644 --- a/app-ios/Modules/Sources/Navigation/RootView.swift +++ b/app-ios/Modules/Sources/Navigation/RootView.swift @@ -33,12 +33,24 @@ public struct RootView: View { case .failed: EmptyView() case .loaded(let isAchivementEnabled): + let timetableView = TimetableView( + sessionViewBuilder: { timetableItem in + SessionView(timetableItem: timetableItem) + } + ) + let aboutView = AboutView( + contributorViewProvider: { _ in + ContributorView() + }, + staffViewProvider: { _ in + StaffView() + }, + sponsorViewProvider: { _ in + SponsorView() + } + ) TabView(selection: $selection) { - TimetableView( - sessionViewBuilder: { timetableItem in - SessionView(timetableItem: timetableItem) - } - ) + timetableView .tag(Tab.timeline) .tabItem { Label { @@ -85,17 +97,7 @@ public struct RootView: View { } } // } - AboutView( - contributorViewProvider: { _ in - ContributorView() - }, - staffViewProvider: { _ in - StaffView() - }, - sponsorViewProvider: { _ in - SponsorView() - } - ) + aboutView .tag(Tab.about) .tabItem { Label { From 78eab5bba1d801114ddfd838494e0508710ee717 Mon Sep 17 00:00:00 2001 From: coe Date: Tue, 19 Sep 2023 01:37:11 +0900 Subject: [PATCH 2/3] Create private label for commonality --- .../Modules/Sources/Navigation/RootView.swift | 116 +++++++++++------- 1 file changed, 72 insertions(+), 44 deletions(-) diff --git a/app-ios/Modules/Sources/Navigation/RootView.swift b/app-ios/Modules/Sources/Navigation/RootView.swift index 56948728c..1eca36743 100644 --- a/app-ios/Modules/Sources/Navigation/RootView.swift +++ b/app-ios/Modules/Sources/Navigation/RootView.swift @@ -53,64 +53,24 @@ public struct RootView: View { timetableView .tag(Tab.timeline) .tabItem { - Label { - Text("Timetable") - } icon: { - if selection == .timeline { - Assets.Icons.timetable.swiftUIImage - .renderingMode(.template) - } else { - Assets.Icons.timetableFillOff.swiftUIImage - .renderingMode(.template) - } - } + TimetableViewLabel(selected: selection == .timeline) } FloorMapView() .tag(Tab.floorMap) .tabItem { - Label { - Text("Floor Map") - } icon: { - if selection == .floorMap { - Assets.Icons.floorMap.swiftUIImage - .renderingMode(.template) - } else { - Assets.Icons.floorMapFillOff.swiftUIImage - .renderingMode(.template) - } - } + FloorMapViewLabel(selected: selection == .floorMap) } // if isAchivementEnabled { AchievementsView() .tag(Tab.achievements) .tabItem { - Label { - Text("Achievements") - } icon: { - if selection == .achievements { - Assets.Icons.achievements.swiftUIImage - .renderingMode(.template) - } else { - Assets.Icons.achievementsFillOff.swiftUIImage - .renderingMode(.template) - } - } + AchievementsViewLabel(selected: selection == .achievements) } // } aboutView .tag(Tab.about) .tabItem { - Label { - Text("About") - } icon: { - if selection == .about { - Assets.Icons.info.swiftUIImage - .renderingMode(.template) - } else { - Assets.Icons.infoFillOff.swiftUIImage - .renderingMode(.template) - } - } + AboutViewLabel(selected: selection == .about) } } .tint(AssetColors.Secondary.onSecondaryContainer.swiftUIColor) @@ -118,6 +78,74 @@ public struct RootView: View { } } +private struct TimetableViewLabel: View { + let selected: Bool + var body: some View { + Label { + Text("Timetable") + } icon: { + if selected { + Assets.Icons.timetable.swiftUIImage + .renderingMode(.template) + } else { + Assets.Icons.timetableFillOff.swiftUIImage + .renderingMode(.template) + } + } + } +} + +private struct FloorMapViewLabel: View { + let selected: Bool + var body: some View { + Label { + Text("Floor Map") + } icon: { + if selected { + Assets.Icons.floorMap.swiftUIImage + .renderingMode(.template) + } else { + Assets.Icons.floorMapFillOff.swiftUIImage + .renderingMode(.template) + } + } + } +} + +private struct AchievementsViewLabel: View { + let selected: Bool + var body: some View { + Label { + Text("Achievements") + } icon: { + if selected { + Assets.Icons.achievements.swiftUIImage + .renderingMode(.template) + } else { + Assets.Icons.achievementsFillOff.swiftUIImage + .renderingMode(.template) + } + } + } +} + +private struct AboutViewLabel: View { + let selected: Bool + var body: some View { + Label { + Text("About") + } icon: { + if selected { + Assets.Icons.info.swiftUIImage + .renderingMode(.template) + } else { + Assets.Icons.infoFillOff.swiftUIImage + .renderingMode(.template) + } + } + } +} + // #Preview { // RootView() // } From d81b373d22cb53810ec92115c538ac70e444ad44 Mon Sep 17 00:00:00 2001 From: coe Date: Tue, 19 Sep 2023 02:20:37 +0900 Subject: [PATCH 3/3] Change to Sidebar style only iPad --- .../Modules/Sources/Navigation/RootView.swift | 87 ++++++++++++++----- 1 file changed, 65 insertions(+), 22 deletions(-) diff --git a/app-ios/Modules/Sources/Navigation/RootView.swift b/app-ios/Modules/Sources/Navigation/RootView.swift index 1eca36743..4f111b51d 100644 --- a/app-ios/Modules/Sources/Navigation/RootView.swift +++ b/app-ios/Modules/Sources/Navigation/RootView.swift @@ -10,7 +10,11 @@ import SwiftUI import Theme import Timetable -enum Tab { +enum Tab: Int, CaseIterable, Identifiable { + var id: Int { + rawValue + } + case timeline case floorMap case achievements @@ -18,8 +22,11 @@ enum Tab { } public struct RootView: View { + @Environment(\.horizontalSizeClass) var horizontalSizeClass + @Environment(\.verticalSizeClass) var verticalSizeClass @StateObject var viewModel: RootViewModel = .init() @State var selection = Tab.timeline + @State var selectionForSidebar: Tab.ID? = Tab.timeline.id public init() {} @@ -49,29 +56,65 @@ public struct RootView: View { SponsorView() } ) - TabView(selection: $selection) { - timetableView - .tag(Tab.timeline) - .tabItem { - TimetableViewLabel(selected: selection == .timeline) - } - FloorMapView() - .tag(Tab.floorMap) - .tabItem { - FloorMapViewLabel(selected: selection == .floorMap) - } -// if isAchivementEnabled { - AchievementsView() - .tag(Tab.achievements) - .tabItem { - AchievementsViewLabel(selected: selection == .achievements) + Group { + if horizontalSizeClass == .regular && verticalSizeClass == .regular { + NavigationSplitView(columnVisibility: .constant(.doubleColumn)) { + List(Tab.allCases, selection: $selectionForSidebar) { + let selected = $0.id == selectionForSidebar + switch $0 { + case .timeline: + TimetableViewLabel(selected: selected) + case .floorMap: + FloorMapViewLabel(selected: selected) + case .achievements: + AchievementsViewLabel(selected: selected) + case .about: + AboutViewLabel(selected: selected) + } } -// } - aboutView - .tag(Tab.about) - .tabItem { - AboutViewLabel(selected: selection == .about) + } detail: { + if let selectionForSidebar, let tab = Tab(rawValue: selectionForSidebar) { + switch tab { + case .timeline: + timetableView + case .floorMap: + FloorMapView() + case .achievements: + AchievementsView() + case .about: + aboutView + } + } else { + fatalError() + } + } + .navigationSplitViewStyle(.balanced) + } else { + TabView(selection: $selection) { + timetableView + .tag(Tab.timeline) + .tabItem { + TimetableViewLabel(selected: selection == .timeline) + } + FloorMapView() + .tag(Tab.floorMap) + .tabItem { + FloorMapViewLabel(selected: selection == .floorMap) + } + // if isAchivementEnabled { + AchievementsView() + .tag(Tab.achievements) + .tabItem { + AchievementsViewLabel(selected: selection == .achievements) + } + // } + aboutView + .tag(Tab.about) + .tabItem { + AboutViewLabel(selected: selection == .about) + } } + } } .tint(AssetColors.Secondary.onSecondaryContainer.swiftUIColor) }