mirror of
https://github.com/Ranchero-Software/NetNewsWire
synced 2025-08-12 06:26:36 +00:00
Add sort control for macOS
This commit is contained in:
@@ -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")
|
||||
}()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
64
Multiplatform/Shared/Timeline/TimelineSortOrderView.swift
Normal file
64
Multiplatform/Shared/Timeline/TimelineSortOrderView.swift
Normal 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())
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,7 @@ struct TimelineView: View {
|
||||
#if os(macOS)
|
||||
VStack {
|
||||
HStack {
|
||||
TimelineSortOrderView()
|
||||
Spacer()
|
||||
Button (action: {
|
||||
withAnimation {
|
||||
|
||||
Reference in New Issue
Block a user