From fe801d85ebdc06dcdac5427abd6fc1d921e71325 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Wed, 12 Feb 2025 21:49:58 -0800 Subject: [PATCH] Continue progress on modern look. --- Shared/AppColor.swift | 2 +- iOS/MainWindow/MainWindowController.swift | 20 +++- iOS/MainWindow/RootSplitViewController.swift | 6 +- .../Sidebar/RefreshProgressView.xib | 13 +-- .../Sidebar/SidebarViewController.swift | 95 +++++++++++-------- .../TimelineCollectionViewController.swift | 15 ++- 6 files changed, 94 insertions(+), 57 deletions(-) diff --git a/Shared/AppColor.swift b/Shared/AppColor.swift index da9271c60..fa2548482 100644 --- a/Shared/AppColor.swift +++ b/Shared/AppColor.swift @@ -35,7 +35,7 @@ extension AppColor { extension AppColor { #if os(iOS) - static var barColor = UIColor(hex: "#708090") + static var barColor = UIColor(hex: "#7080A0") static var controlBackground = color("controlBackgroundColor") static var fullScreenBackground = color("fullScreenBackgroundColor") static var iconBackground = color("iconBackgroundColor") diff --git a/iOS/MainWindow/MainWindowController.swift b/iOS/MainWindow/MainWindowController.swift index 38eb5cd45..3bdada5a2 100644 --- a/iOS/MainWindow/MainWindowController.swift +++ b/iOS/MainWindow/MainWindowController.swift @@ -15,7 +15,7 @@ final class MainWindowController { let rootSplitViewController: RootSplitViewController let sidebarViewController = SidebarViewController() - let timelineViewController = TimelineViewController() + let timelineViewController = TimelineCollectionViewController() let articleViewController = ArticleViewController() let coordinator: SceneCoordinator @@ -35,11 +35,12 @@ final class MainWindowController { rootSplitViewController.delegate = coordinator self.rootSplitViewController = rootSplitViewController + sidebarViewController.delegate = self + window.rootViewController = rootSplitViewController window.tintColor = AppColor.accent updateUserInterfaceStyle() - UINavigationBar.appearance().scrollEdgeAppearance = UINavigationBarAppearance() window.makeKeyAndVisible() @@ -74,6 +75,21 @@ final class MainWindowController { } } +// MARK: - SidebarViewControllerDelegate + +extension MainWindowController: SidebarViewControllerDelegate { + + func sidebarViewController(_: SidebarViewController, didSelect items: [any Item]) { + timelineViewController.items = items + rootSplitViewController.show(.supplementary) + } +} + +// MARK: - UISplitViewControllerDelegate + + +// MARK: - Private + private extension MainWindowController { func updateUserInterfaceStyle() { diff --git a/iOS/MainWindow/RootSplitViewController.swift b/iOS/MainWindow/RootSplitViewController.swift index 14bef72ff..72bda93e6 100644 --- a/iOS/MainWindow/RootSplitViewController.swift +++ b/iOS/MainWindow/RootSplitViewController.swift @@ -14,17 +14,17 @@ final class RootSplitViewController: UISplitViewController { var coordinator: SceneCoordinator! { didSet { // sidebarViewController.coordinator = coordinator - timelineViewController.coordinator = coordinator +// timelineViewController.coordinator = coordinator articleViewController.coordinator = coordinator } } private let sidebarViewController: SidebarViewController - private let timelineViewController: TimelineViewController + private let timelineViewController: TimelineCollectionViewController private let articleViewController: ArticleViewController init(sidebarViewController: SidebarViewController, - timelineViewController: TimelineViewController, + timelineViewController: TimelineCollectionViewController, articleViewController: ArticleViewController) { self.sidebarViewController = sidebarViewController diff --git a/iOS/MainWindow/Sidebar/RefreshProgressView.xib b/iOS/MainWindow/Sidebar/RefreshProgressView.xib index bab0971af..50ef0ab41 100644 --- a/iOS/MainWindow/Sidebar/RefreshProgressView.xib +++ b/iOS/MainWindow/Sidebar/RefreshProgressView.xib @@ -1,11 +1,9 @@ - + - - + - @@ -26,7 +24,7 @@ @@ -53,9 +51,4 @@ - - - - - diff --git a/iOS/MainWindow/Sidebar/SidebarViewController.swift b/iOS/MainWindow/Sidebar/SidebarViewController.swift index 75d05c538..ef15233b6 100644 --- a/iOS/MainWindow/Sidebar/SidebarViewController.swift +++ b/iOS/MainWindow/Sidebar/SidebarViewController.swift @@ -10,8 +10,15 @@ import Foundation import UIKit import Account +protocol SidebarViewControllerDelegate: AnyObject { + + func sidebarViewController(_: SidebarViewController, didSelect: [any Item]) +} + final class SidebarViewController: UICollectionViewController { + weak var delegate: SidebarViewControllerDelegate? + private let tree = SidebarTree() typealias DataSource = UICollectionViewDiffableDataSource @@ -63,20 +70,7 @@ final class SidebarViewController: UICollectionViewController { title = "Feeds" navigationController?.navigationBar.prefersLargeTitles = true - - let appearance = UINavigationBarAppearance() - appearance.configureWithOpaqueBackground() // Ensures solid background - appearance.backgroundColor = AppColor.navigationBarBackground // Set your desired color - appearance.titleTextAttributes = [.foregroundColor: UIColor.white] // Regular title text - appearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white] // Large title text - appearance.shadowColor = .clear - - // Apply the appearance settings - navigationController?.navigationBar.standardAppearance = appearance - navigationController?.navigationBar.scrollEdgeAppearance = appearance - navigationController?.navigationBar.compactAppearance = appearance // Optional - navigationController?.navigationBar.compactScrollEdgeAppearance = appearance - + navigationController?.navigationBar.tintColor = .white navigationController?.navigationBar.isTranslucent = false if let subviews = navigationController?.navigationBar.subviews { @@ -88,8 +82,10 @@ final class SidebarViewController: UICollectionViewController { } navigationItem.rightBarButtonItem = filterButton - + navigationItem.largeTitleDisplayMode = .always + toolbar.barTintColor = AppColor.toolbarBackground + toolbar.tintColor = .white toolbar.isTranslucent = false toolbar.translatesAutoresizingMaskIntoConstraints = false @@ -124,24 +120,37 @@ final class SidebarViewController: UICollectionViewController { collectionView.verticalScrollIndicatorInsets.bottom = toolbarHeight } - func updateVisibleRows() { + override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - var itemIDsToReload = [ItemID]() - - for indexPath in collectionView.indexPathsForVisibleItems { - if let itemID = dataSource.itemIdentifier(for: indexPath) { - itemIDsToReload.append(itemID) - } + guard let itemID = dataSource.itemIdentifier(for: indexPath) else { + assertionFailure("Expected itemID for indexPath \(indexPath).") + return + } + guard let item = tree.item(with: itemID) else { + assertionFailure("Expected item for itemID \(itemID).") + return } - if !itemIDsToReload.isEmpty { - var snapshot = dataSource.snapshot() - snapshot.reloadItems(itemIDsToReload) - dataSource.apply(snapshot, animatingDifferences: false) - } + delegate?.sidebarViewController(self, didSelect: [item]) + } +} + +// MARK: - Actions + +// TODO: Implement actions + +extension SidebarViewController { + + @objc func toggleFilter(_ sender: Any) { } - // MARK: - Notifications + @objc func showSettings(_ sender: Any?) { + } +} + +// MARK: - Notifications + +private extension SidebarViewController { @objc func faviconDidBecomeAvailable(_ note: Notification) { updateVisibleRows() @@ -160,18 +169,7 @@ final class SidebarViewController: UICollectionViewController { } } -// MARK: - Actions - -// TODO: Implement actions - -extension SidebarViewController { - - @objc func toggleFilter(_ sender: Any) { - } - - @objc func showSettings(_ sender: Any?) { - } -} +// MARK: - Private private extension SidebarViewController { @@ -252,4 +250,21 @@ private extension SidebarViewController { dataSource.apply(snapshot, animatingDifferences: true) } + + func updateVisibleRows() { + + var itemIDsToReload = [ItemID]() + + for indexPath in collectionView.indexPathsForVisibleItems { + if let itemID = dataSource.itemIdentifier(for: indexPath) { + itemIDsToReload.append(itemID) + } + } + + if !itemIDsToReload.isEmpty { + var snapshot = dataSource.snapshot() + snapshot.reloadItems(itemIDsToReload) + dataSource.apply(snapshot, animatingDifferences: false) + } + } } diff --git a/iOS/MainWindow/Timeline/TimelineCollectionViewController.swift b/iOS/MainWindow/Timeline/TimelineCollectionViewController.swift index 986617f80..77cfcd748 100644 --- a/iOS/MainWindow/Timeline/TimelineCollectionViewController.swift +++ b/iOS/MainWindow/Timeline/TimelineCollectionViewController.swift @@ -70,6 +70,14 @@ final class TimelineArticlesManager { final class TimelineCollectionViewController: UICollectionViewController { + var items = [any Item]() { + didSet { + updateTitle() + } + } + + private static var defaultTitle = "Articles" // ToDo: localize + private let timelineArticlesManager = TimelineArticlesManager() typealias DataSource = UICollectionViewDiffableDataSource @@ -90,7 +98,8 @@ final class TimelineCollectionViewController: UICollectionViewController { override func viewDidLoad() { super.viewDidLoad() - title = "Articles" + navigationItem.largeTitleDisplayMode = .never + updateTitle() collectionView.register(TimelineCell.self, forCellWithReuseIdentifier: TimelineCell.reuseIdentifier) @@ -122,4 +131,8 @@ private extension TimelineCollectionViewController { dataSource.apply(snapshot, animatingDifferences: true) } + + func updateTitle() { + title = items.first?.title ?? Self.defaultTitle + } }