From 3420346fa3e2796b80b9eba0473149538af38fdc Mon Sep 17 00:00:00 2001 From: Nate Weaver Date: Fri, 7 Oct 2022 17:57:08 -0500 Subject: [PATCH] Support opening multiple articles in the browser --- ...melineViewController+ContextualMenus.swift | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/Mac/MainWindow/Timeline/TimelineViewController+ContextualMenus.swift b/Mac/MainWindow/Timeline/TimelineViewController+ContextualMenus.swift index 7a4020456..04b5ea554 100644 --- a/Mac/MainWindow/Timeline/TimelineViewController+ContextualMenus.swift +++ b/Mac/MainWindow/Timeline/TimelineViewController+ContextualMenus.swift @@ -90,10 +90,33 @@ extension TimelineViewController { @objc func openInBrowserFromContextualMenu(_ sender: Any?) { - guard let menuItem = sender as? NSMenuItem, let urlString = menuItem.representedObject as? String else { + guard let menuItem = sender as? NSMenuItem, let urlStrings = menuItem.representedObject as? [String] else { return } - Browser.open(urlString, inBackground: false) + + func doOpenURLs() { + for urlString in urlStrings { + Browser.open(urlString, inBackground: false) + } + } + + if urlStrings.count > 20 { + let alert = NSAlert() + let messageFormat = NSLocalizedString("Are you sure you want to open %ld articles in your browser?", comment: "") + alert.messageText = String.localizedStringWithFormat(messageFormat, urlStrings.count) + alert.addButton(withTitle: NSLocalizedString("Open", comment: "")) + alert.addButton(withTitle: NSLocalizedString("Cancel", comment: "")) + + guard let window = self.view.window else { return } + + alert.beginSheetModal(for: window) { response in + if response == .alertFirstButtonReturn { + doOpenURLs() + } + } + } else { + doOpenURLs() + } } @objc func copyURLFromContextualMenu(_ sender: Any?) { @@ -176,15 +199,13 @@ private extension TimelineViewController { menu.addItem(markAllMenuItem) } } - - if articles.count == 1, let link = articles.first!.preferredLink { - menu.addSeparatorIfNeeded() - menu.addItem(openInBrowserMenuItem(link)) - } let links = articles.compactMap { $0.preferredLink } if links.count > 0 { + menu.addSeparatorIfNeeded() + menu.addItem(openInBrowserMenuItem(links)) + menu.addSeparatorIfNeeded() menu.addItem(copyArticleURLsMenuItem(links)) @@ -279,9 +300,9 @@ private extension TimelineViewController { return menuItem(menuText, #selector(markAllInFeedAsRead(_:)), articles) } - func openInBrowserMenuItem(_ urlString: String) -> NSMenuItem { + func openInBrowserMenuItem(_ urlStrings: [String]) -> NSMenuItem { - return menuItem(NSLocalizedString("Open in Browser", comment: "Command"), #selector(openInBrowserFromContextualMenu(_:)), urlString) + return menuItem(NSLocalizedString("Open in Browser", comment: "Command"), #selector(openInBrowserFromContextualMenu(_:)), urlStrings) } func copyArticleURLsMenuItem(_ urlStrings: [String]) -> NSMenuItem {