Add sort control for macOS

This commit is contained in:
Maurice Parker
2020-07-12 19:43:25 -05:00
parent 3a67f2cd8e
commit 17e1247ff0
7 changed files with 109 additions and 34 deletions

View File

@@ -70,6 +70,10 @@ struct AppAssets {
return Image("ArticleExtractorOn")
}()
static var checkmarkImage: Image = {
return Image(systemName: "checkmark")
}()
static var copyImage: Image = {
return Image(systemName: "doc.on.doc")
}()

View File

@@ -170,7 +170,11 @@ final class AppDefaults: ObservableObject {
}
// MARK: Timeline
@AppStorage(wrappedValue: false, Key.timelineGroupByFeed, store: store) var timelineGroupByFeed: Bool
@AppStorage(wrappedValue: false, Key.timelineGroupByFeed, store: store) var timelineGroupByFeed: Bool {
didSet {
objectWillChange.send()
}
}
@AppStorage(wrappedValue: 2.0, Key.timelineNumberOfLines, store: store) var timelineNumberOfLines: Double {
didSet {
@@ -185,7 +189,11 @@ final class AppDefaults: ObservableObject {
}
/// Set to `true` to sort oldest to newest, `false` for newest to oldest. Default is `false`.
@AppStorage(wrappedValue: false, Key.timelineSortDirection, store: store) var timelineSortDirection: Bool
@AppStorage(wrappedValue: false, Key.timelineSortDirection, store: store) var timelineSortDirection: Bool {
didSet {
objectWillChange.send()
}
}
// MARK: Refresh
@AppStorage(wrappedValue: false, Key.refreshClearsReadArticles, store: store) var refreshClearsReadArticles: Bool

View File

@@ -55,25 +55,18 @@ class TimelineModel: ObservableObject, UndoableCommandRunner {
return _idToArticleDictionary
}
private var sortDirection = AppDefaults.shared.timelineSortDirection {
didSet {
if sortDirection != oldValue {
sortParametersDidChange()
}
}
private var sortDirection: Bool {
AppDefaults.shared.timelineSortDirection
}
private var groupByFeed = AppDefaults.shared.timelineGroupByFeed {
didSet {
if groupByFeed != oldValue {
sortParametersDidChange()
}
}
private var groupByFeed: Bool {
AppDefaults.shared.timelineGroupByFeed
}
init() {
NotificationCenter.default.addObserver(self, selector: #selector(statusesDidChange(_:)), name: .StatusesDidChange, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(userDefaultsDidChange(_:)), name: UserDefaults.didChangeNotification, object: nil)
// TODO: This should be rewritten to use Combine correctly
selectedArticleIDsCancellable = $selectedArticleIDs.sink { [weak self] articleIDs in
guard let self = self else { return }
@@ -213,6 +206,13 @@ private extension TimelineModel {
}
}
@objc func userDefaultsDidChange(_ note: Notification) {
performBlockAndRestoreSelection {
articles = articles.sortedByDate(sortDirection ? .orderedDescending : .orderedAscending, groupByFeed: groupByFeed)
rebuildTimelineItems()
}
}
// MARK: Timeline Management
func resetReadFilter() {
@@ -233,13 +233,6 @@ private extension TimelineModel {
}
}
func sortParametersDidChange() {
performBlockAndRestoreSelection {
let unsortedArticles = Set(articles)
replaceArticles(with: unsortedArticles)
}
}
func performBlockAndRestoreSelection(_ block: (() -> Void)) {
// let savedSelection = selectedArticleIDs()
block()

View File

@@ -0,0 +1,64 @@
//
// TimelineSortOrderView.swift
// Multiplatform macOS
//
// Created by Maurice Parker on 7/12/20.
// Copyright © 2020 Ranchero Software. All rights reserved.
//
import SwiftUI
struct TimelineSortOrderView: View {
@EnvironmentObject var settings: AppDefaults
@State var selection: Int = 1
var body: some View {
Menu {
Button {
settings.timelineSortDirection = true
} label: {
HStack {
Text("Newest to Oldest")
if settings.timelineSortDirection {
Spacer()
AppAssets.checkmarkImage
}
}
}
Button {
settings.timelineSortDirection = false
} label: {
HStack {
Text("Oldest to Newest")
if !settings.timelineSortDirection {
Spacer()
AppAssets.checkmarkImage
}
}
}
Divider()
Button {
settings.timelineGroupByFeed.toggle()
} label: {
HStack {
Text("Group by Feed")
if settings.timelineGroupByFeed {
Spacer()
AppAssets.checkmarkImage
}
}
}
} label : {
if settings.timelineSortDirection {
Text("Sort Newest to Oldest")
} else {
Text("Sort Oldest to Newest")
}
}
.font(.subheadline)
.frame(width: 150)
.padding(.top, 8).padding(.leading)
.menuStyle(BorderlessButtonMenuStyle())
}
}

View File

@@ -17,6 +17,7 @@ struct TimelineView: View {
#if os(macOS)
VStack {
HStack {
TimelineSortOrderView()
Spacer()
Button (action: {
withAnimation {