From aabe950b2bc5ee5c72fc7f1e005fea9ebd375d6a Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Fri, 16 Aug 2019 13:19:06 -0500 Subject: [PATCH] Add initial support for timeline context menus --- .../MasterTimelineViewController.swift | 73 ++++++++++++++++--- 1 file changed, 63 insertions(+), 10 deletions(-) diff --git a/iOS/MasterTimeline/MasterTimelineViewController.swift b/iOS/MasterTimeline/MasterTimelineViewController.swift index 99de292db..eb23fe225 100644 --- a/iOS/MasterTimeline/MasterTimelineViewController.swift +++ b/iOS/MasterTimeline/MasterTimelineViewController.swift @@ -130,11 +130,7 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner NSLocalizedString("Read", comment: "Read") let readAction = UIContextualAction(style: .normal, title: readTitle) { [weak self] (action, view, completionHandler) in - guard let undoManager = self?.undoManager, - let markReadCommand = MarkStatusCommand(initialArticles: [article], markingRead: !article.status.read, undoManager: undoManager) else { - return - } - self?.runCommand(markReadCommand) + self?.toggleArticleReadStatus(article) completionHandler(true) } @@ -147,11 +143,7 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner NSLocalizedString("Star", comment: "Star") let starAction = UIContextualAction(style: .normal, title: starTitle) { [weak self] (action, view, completionHandler) in - guard let undoManager = self?.undoManager, - let markReadCommand = MarkStatusCommand(initialArticles: [article], markingStarred: !article.status.starred, undoManager: undoManager) else { - return - } - self?.runCommand(markReadCommand) + self?.toggleArticleStarStatus(article) completionHandler(true) } @@ -163,6 +155,21 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner } + override func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? { + + return UIContextMenuConfiguration(identifier: nil, previewProvider: nil, actionProvider: { suggestedActions in + + var actions = [UIAction]() + actions.append(self.toggleArticleReadStatusAction(indexPath: indexPath)) + actions.append(self.toggleArticleStarStatusAction(indexPath: indexPath)) + + let title = NSLocalizedString("Timeline Menu", comment: "Timeline Menu") + return UIMenu(title: title, children: actions) + + }) + + } + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! MasterTimelineTableViewCell let article = coordinator.articles[indexPath.row] @@ -446,4 +453,50 @@ private extension MasterTimelineViewController { } } + func toggleArticleReadStatus(_ article: Article) { + guard let undoManager = undoManager, + let markReadCommand = MarkStatusCommand(initialArticles: [article], markingRead: !article.status.read, undoManager: undoManager) else { + return + } + runCommand(markReadCommand) + } + + func toggleArticleStarStatus(_ article: Article) { + guard let undoManager = undoManager, + let markReadCommand = MarkStatusCommand(initialArticles: [article], markingStarred: !article.status.starred, undoManager: undoManager) else { + return + } + runCommand(markReadCommand) + } + + func toggleArticleReadStatusAction(indexPath: IndexPath) -> UIAction { + let article = coordinator.articles[indexPath.row] + + let title = article.status.read ? + NSLocalizedString("Mark as Unread", comment: "Mark as Unread") : + NSLocalizedString("Mark as Read", comment: "Mark as Read") + let image = article.status.read ? AppAssets.circleClosedImage : AppAssets.circleOpenImage + + let action = UIAction(title: title, image: image) { [unowned self] action in + self.toggleArticleReadStatus(article) + } + + return action + } + + func toggleArticleStarStatusAction(indexPath: IndexPath) -> UIAction { + let article = coordinator.articles[indexPath.row] + + let title = article.status.starred ? + NSLocalizedString("Mark as Unstarred", comment: "Mark as Unstarred") : + NSLocalizedString("Mark as Starred", comment: "Mark as Starred") + let image = article.status.starred ? AppAssets.starOpenImage : AppAssets.starClosedImage + + let action = UIAction(title: title, image: image) { [unowned self] action in + self.toggleArticleStarStatus(article) + } + + return action + } + }