mirror of
https://github.com/Ranchero-Software/NetNewsWire
synced 2025-08-12 06:26:36 +00:00
Stub out mark as read and star functionality
This commit is contained in:
@@ -8,6 +8,16 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
enum ArticleReadButtonState {
|
||||
case on
|
||||
case off
|
||||
}
|
||||
|
||||
enum ArticleStarButtonState {
|
||||
case on
|
||||
case off
|
||||
}
|
||||
|
||||
enum ArticleExtractorButtonState {
|
||||
case error
|
||||
case animated
|
||||
@@ -20,14 +20,23 @@ protocol ArticleModelDelegate: class {
|
||||
func selectArticle(_: ArticleModel, article: Article)
|
||||
}
|
||||
|
||||
protocol ArticleManager: class {
|
||||
var currentArticle: Article? { get }
|
||||
}
|
||||
|
||||
class ArticleModel: ObservableObject {
|
||||
|
||||
weak var articleManager: ArticleManager?
|
||||
weak var delegate: ArticleModelDelegate?
|
||||
|
||||
var webViewProvider: WebViewProvider? {
|
||||
return delegate?.articleModelWebViewProvider
|
||||
}
|
||||
|
||||
var currentArticle: Article? {
|
||||
return articleManager?.currentArticle
|
||||
}
|
||||
|
||||
// MARK: API
|
||||
|
||||
func findPrevArticle(_ article: Article) -> Article? {
|
||||
@@ -41,6 +50,19 @@ class ArticleModel: ObservableObject {
|
||||
func selectArticle(_ article: Article) {
|
||||
delegate?.selectArticle(self, article: article)
|
||||
}
|
||||
|
||||
func toggleReadForCurrentArticle() {
|
||||
if let article = currentArticle {
|
||||
markArticles([article], statusKey: .starred, flag: !article.status.starred)
|
||||
}
|
||||
}
|
||||
|
||||
func toggleStarForCurrentArticle() {
|
||||
if let article = currentArticle {
|
||||
markArticles([article], statusKey: .starred, flag: !article.status.starred)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -9,11 +9,15 @@
|
||||
import Foundation
|
||||
import Account
|
||||
import Articles
|
||||
import RSCore
|
||||
|
||||
final class SceneModel: ObservableObject {
|
||||
|
||||
@Published var refreshProgressState = RefreshProgressModel.State.none
|
||||
|
||||
var undoManager: UndoManager?
|
||||
var undoableCommands = [UndoableCommand]()
|
||||
|
||||
var sidebarModel: SidebarModel?
|
||||
var timelineModel: TimelineModel?
|
||||
var articleModel: ArticleModel?
|
||||
@@ -22,7 +26,7 @@ final class SceneModel: ObservableObject {
|
||||
private var articleIconSchemeHandler: ArticleIconSchemeHandler? = nil
|
||||
private var webViewProvider: WebViewProvider? = nil
|
||||
|
||||
// MARK: API
|
||||
// MARK: Initialization API
|
||||
|
||||
func startup() {
|
||||
self.refreshProgressModel = RefreshProgressModel()
|
||||
@@ -31,7 +35,28 @@ final class SceneModel: ObservableObject {
|
||||
self.articleIconSchemeHandler = ArticleIconSchemeHandler(sceneModel: self)
|
||||
self.webViewProvider = WebViewProvider(articleIconSchemeHandler: self.articleIconSchemeHandler!)
|
||||
}
|
||||
|
||||
// MARK: Article Status Change API
|
||||
|
||||
func toggleReadForCurrentArticle() {
|
||||
articleModel?.toggleReadForCurrentArticle()
|
||||
}
|
||||
|
||||
func toggleRead(_ article: Article) {
|
||||
guard !article.status.read || article.isAvailableToMarkUnread else { return }
|
||||
markArticles([article], statusKey: .read, flag: !article.status.read)
|
||||
}
|
||||
|
||||
func toggleStarForCurrentArticle() {
|
||||
articleModel?.toggleStarForCurrentArticle()
|
||||
}
|
||||
|
||||
func toggleStar(_ article: Article) {
|
||||
markArticles([article], statusKey: .starred, flag: !article.status.starred)
|
||||
}
|
||||
|
||||
// MARK: Resource lookup API
|
||||
|
||||
func articleFor(_ articleID: String) -> Article? {
|
||||
return timelineModel?.articleFor(articleID)
|
||||
}
|
||||
@@ -80,8 +105,22 @@ extension SceneModel: ArticleModelDelegate {
|
||||
|
||||
}
|
||||
|
||||
// MARK: UndoableCommandRunner
|
||||
|
||||
extension SceneModel: UndoableCommandRunner {
|
||||
|
||||
func markArticlesWithUndo(_ articles: [Article], statusKey: ArticleStatus.Key, flag: Bool) {
|
||||
guard let undoManager = undoManager, let markReadCommand = MarkStatusCommand(initialArticles: articles, statusKey: statusKey, flag: flag, undoManager: undoManager) else {
|
||||
return
|
||||
}
|
||||
runCommand(markReadCommand)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: Private
|
||||
|
||||
private extension SceneModel {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import SwiftUI
|
||||
|
||||
struct SceneNavigationView: View {
|
||||
|
||||
@Environment(\.undoManager) var undoManager
|
||||
@StateObject private var sceneModel = SceneModel()
|
||||
@State private var showSheet: Bool = false
|
||||
@State private var sheetToShow: ToolbarSheets = .none
|
||||
@@ -48,6 +49,7 @@ struct SceneNavigationView: View {
|
||||
}
|
||||
.environmentObject(sceneModel)
|
||||
.onAppear {
|
||||
sceneModel.undoManager = undoManager
|
||||
sceneModel.startup()
|
||||
}
|
||||
.sheet(isPresented: $showSheet, onDismiss: { sheetToShow = .none }) {
|
||||
|
||||
Reference in New Issue
Block a user