Progress on keyboard shortcuts. Add link to Technotes in Help menu. Fix #266.
This commit is contained in:
parent
ac3947b164
commit
70000c1d31
|
@ -25,6 +25,7 @@
|
||||||
844B5B691FEA20DF00C7C76A /* SidebarKeyboardShortcuts.plist in Resources */ = {isa = PBXBuildFile; fileRef = 844B5B681FEA20DF00C7C76A /* SidebarKeyboardShortcuts.plist */; };
|
844B5B691FEA20DF00C7C76A /* SidebarKeyboardShortcuts.plist in Resources */ = {isa = PBXBuildFile; fileRef = 844B5B681FEA20DF00C7C76A /* SidebarKeyboardShortcuts.plist */; };
|
||||||
84513F901FAA63950023A1A9 /* FeedListControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84513F8F1FAA63950023A1A9 /* FeedListControlsView.swift */; };
|
84513F901FAA63950023A1A9 /* FeedListControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84513F8F1FAA63950023A1A9 /* FeedListControlsView.swift */; };
|
||||||
845213231FCA5B11003B6E93 /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845213221FCA5B10003B6E93 /* ImageDownloader.swift */; };
|
845213231FCA5B11003B6E93 /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845213221FCA5B10003B6E93 /* ImageDownloader.swift */; };
|
||||||
|
845479881FEB77C000AD8B59 /* TimelineKeyboardShortcuts.plist in Resources */ = {isa = PBXBuildFile; fileRef = 845479871FEB77C000AD8B59 /* TimelineKeyboardShortcuts.plist */; };
|
||||||
845A29091FC74B8E007B49E3 /* SingleFaviconDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845A29081FC74B8E007B49E3 /* SingleFaviconDownloader.swift */; };
|
845A29091FC74B8E007B49E3 /* SingleFaviconDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845A29081FC74B8E007B49E3 /* SingleFaviconDownloader.swift */; };
|
||||||
845A29221FC9251E007B49E3 /* SidebarCellLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845A29211FC9251E007B49E3 /* SidebarCellLayout.swift */; };
|
845A29221FC9251E007B49E3 /* SidebarCellLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845A29211FC9251E007B49E3 /* SidebarCellLayout.swift */; };
|
||||||
845A29241FC9255E007B49E3 /* SidebarCellAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845A29231FC9255E007B49E3 /* SidebarCellAppearance.swift */; };
|
845A29241FC9255E007B49E3 /* SidebarCellAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 845A29231FC9255E007B49E3 /* SidebarCellAppearance.swift */; };
|
||||||
|
@ -431,6 +432,7 @@
|
||||||
844B5B681FEA20DF00C7C76A /* SidebarKeyboardShortcuts.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = SidebarKeyboardShortcuts.plist; sourceTree = "<group>"; };
|
844B5B681FEA20DF00C7C76A /* SidebarKeyboardShortcuts.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = SidebarKeyboardShortcuts.plist; sourceTree = "<group>"; };
|
||||||
84513F8F1FAA63950023A1A9 /* FeedListControlsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListControlsView.swift; sourceTree = "<group>"; };
|
84513F8F1FAA63950023A1A9 /* FeedListControlsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListControlsView.swift; sourceTree = "<group>"; };
|
||||||
845213221FCA5B10003B6E93 /* ImageDownloader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageDownloader.swift; sourceTree = "<group>"; };
|
845213221FCA5B10003B6E93 /* ImageDownloader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageDownloader.swift; sourceTree = "<group>"; };
|
||||||
|
845479871FEB77C000AD8B59 /* TimelineKeyboardShortcuts.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = TimelineKeyboardShortcuts.plist; sourceTree = "<group>"; };
|
||||||
845A29081FC74B8E007B49E3 /* SingleFaviconDownloader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingleFaviconDownloader.swift; sourceTree = "<group>"; };
|
845A29081FC74B8E007B49E3 /* SingleFaviconDownloader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingleFaviconDownloader.swift; sourceTree = "<group>"; };
|
||||||
845A29211FC9251E007B49E3 /* SidebarCellLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarCellLayout.swift; sourceTree = "<group>"; };
|
845A29211FC9251E007B49E3 /* SidebarCellLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarCellLayout.swift; sourceTree = "<group>"; };
|
||||||
845A29231FC9255E007B49E3 /* SidebarCellAppearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarCellAppearance.swift; sourceTree = "<group>"; };
|
845A29231FC9255E007B49E3 /* SidebarCellAppearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarCellAppearance.swift; sourceTree = "<group>"; };
|
||||||
|
@ -616,6 +618,7 @@
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
844B5B5A1FEA00FB00C7C76A /* TimelineKeyboardDelegate.swift */,
|
844B5B5A1FEA00FB00C7C76A /* TimelineKeyboardDelegate.swift */,
|
||||||
|
845479871FEB77C000AD8B59 /* TimelineKeyboardShortcuts.plist */,
|
||||||
);
|
);
|
||||||
path = Keyboard;
|
path = Keyboard;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -1357,6 +1360,7 @@
|
||||||
849A97951ED9EF7A007D329B /* IndeterminateProgressWindow.xib in Resources */,
|
849A97951ED9EF7A007D329B /* IndeterminateProgressWindow.xib in Resources */,
|
||||||
844B5B651FEA11F200C7C76A /* GlobalKeyboardShortcuts.plist in Resources */,
|
844B5B651FEA11F200C7C76A /* GlobalKeyboardShortcuts.plist in Resources */,
|
||||||
849A978F1ED9EE72007D329B /* DefaultFeeds.plist in Resources */,
|
849A978F1ED9EE72007D329B /* DefaultFeeds.plist in Resources */,
|
||||||
|
845479881FEB77C000AD8B59 /* TimelineKeyboardShortcuts.plist in Resources */,
|
||||||
849A979D1ED9EFEB007D329B /* template.html in Resources */,
|
849A979D1ED9EFEB007D329B /* template.html in Resources */,
|
||||||
849A97A91ED9F9AA007D329B /* AddFeedSheet.xib in Resources */,
|
849A97A91ED9F9AA007D329B /* AddFeedSheet.xib in Resources */,
|
||||||
84AFBB3E1FBE770200BA41CF /* PanicButtonWindow.xib in Resources */,
|
84AFBB3E1FBE770200BA41CF /* PanicButtonWindow.xib in Resources */,
|
||||||
|
|
|
@ -409,7 +409,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations,
|
||||||
|
|
||||||
@IBAction func openWebsite(_ sender: AnyObject) {
|
@IBAction func openWebsite(_ sender: AnyObject) {
|
||||||
|
|
||||||
Browser.open("//ranchero.com/evergreen/", inBackground: false)
|
Browser.open("https://ranchero.com/evergreen/", inBackground: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func openRepository(_ sender: AnyObject) {
|
@IBAction func openRepository(_ sender: AnyObject) {
|
||||||
|
@ -422,6 +422,11 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations,
|
||||||
Browser.open("https://github.com/brentsimmons/Evergreen/issues", inBackground: false)
|
Browser.open("https://github.com/brentsimmons/Evergreen/issues", inBackground: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@IBAction func openTechnotes(_ sender: Any?) {
|
||||||
|
|
||||||
|
Browser.open("https://github.com/brentsimmons/Evergreen/tree/master/Technotes", inBackground: false)
|
||||||
|
}
|
||||||
|
|
||||||
@IBAction func showHelp(_ sender: AnyObject) {
|
@IBAction func showHelp(_ sender: AnyObject) {
|
||||||
|
|
||||||
Browser.open("https://ranchero.com/evergreen/help/1.0/", inBackground: false)
|
Browser.open("https://ranchero.com/evergreen/help/1.0/", inBackground: false)
|
||||||
|
|
|
@ -522,6 +522,12 @@
|
||||||
<action selector="openBugTracker:" target="Ady-hI-5gd" id="fZQ-ng-gIm"/>
|
<action selector="openBugTracker:" target="Ady-hI-5gd" id="fZQ-ng-gIm"/>
|
||||||
</connections>
|
</connections>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
|
<menuItem title="Technotes" id="Ou5-Cc-iCb">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="openTechnotes:" target="Ady-hI-5gd" id="M7A-Qg-mH8"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
</items>
|
</items>
|
||||||
</menu>
|
</menu>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
|
|
|
@ -58,7 +58,7 @@
|
||||||
<key>key</key>
|
<key>key</key>
|
||||||
<string>l</string>
|
<string>l</string>
|
||||||
<key>action</key>
|
<key>action</key>
|
||||||
<string>markReadAndGoToNextUnread:</string>
|
<string>markAllAsReadAndGoToNextUnread:</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>key</key>
|
<key>key</key>
|
||||||
|
|
|
@ -186,6 +186,12 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations {
|
||||||
timelineViewController?.markSelectedArticlesAsUnread(sender)
|
timelineViewController?.markSelectedArticlesAsUnread(sender)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@IBAction func markAllAsReadAndGoToNextUnread(_ sender: Any?) {
|
||||||
|
|
||||||
|
markAllAsRead(sender)
|
||||||
|
nextUnread(sender)
|
||||||
|
}
|
||||||
|
|
||||||
@IBAction func markUnreadAndGoToNextUnread(_ sender: Any?) {
|
@IBAction func markUnreadAndGoToNextUnread(_ sender: Any?) {
|
||||||
|
|
||||||
markUnread(sender)
|
markUnread(sender)
|
||||||
|
@ -212,6 +218,16 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations {
|
||||||
|
|
||||||
appDelegate.markEverywhereAsRead(with: window!)
|
appDelegate.markEverywhereAsRead(with: window!)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@IBAction func navigateToTimeline(_ sender: Any?) {
|
||||||
|
|
||||||
|
timelineViewController?.focus()
|
||||||
|
}
|
||||||
|
|
||||||
|
@IBAction func navigateToSidebar(_ sender: Any?) {
|
||||||
|
|
||||||
|
sidebarViewController?.focus()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Private
|
// MARK: - Private
|
||||||
|
|
|
@ -14,13 +14,30 @@ import RSCore
|
||||||
@objc final class TimelineKeyboardDelegate: NSObject, KeyboardDelegate {
|
@objc final class TimelineKeyboardDelegate: NSObject, KeyboardDelegate {
|
||||||
|
|
||||||
@IBOutlet weak var timelineViewController: TimelineViewController?
|
@IBOutlet weak var timelineViewController: TimelineViewController?
|
||||||
|
let shortcuts: Set<KeyboardShortcut>
|
||||||
|
|
||||||
override init() {
|
override init() {
|
||||||
|
|
||||||
|
let f = Bundle.main.path(forResource: "TimelineKeyboardShortcuts", ofType: "plist")!
|
||||||
|
let rawShortcuts = NSArray(contentsOfFile: f)! as! [[String: Any]]
|
||||||
|
|
||||||
|
self.shortcuts = Set(rawShortcuts.flatMap { KeyboardShortcut(dictionary: $0) })
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
}
|
}
|
||||||
|
|
||||||
func keydown(_ event: NSEvent, in view: NSView) -> Bool {
|
func keydown(_ event: NSEvent, in view: NSView) -> Bool {
|
||||||
|
|
||||||
return MainWindowKeyboardHandler.shared.keydown(event, in: view)
|
if MainWindowKeyboardHandler.shared.keydown(event, in: view) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
let key = KeyboardKey(with: event)
|
||||||
|
guard let matchingShortcut = KeyboardShortcut.findMatchingShortcut(in: shortcuts, key: key) else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
matchingShortcut.perform(with: view)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>key</key>
|
||||||
|
<string>[leftarrow]</string>
|
||||||
|
<key>action</key>
|
||||||
|
<string>navigateToSidebar:</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</plist>
|
|
@ -45,7 +45,7 @@
|
||||||
<tr class="backgroundColorRow"><td>Mark all as read, go to next unread</td><td>l (lowercase L)</td></tr>
|
<tr class="backgroundColorRow"><td>Mark all as read, go to next unread</td><td>l (lowercase L)</td></tr>
|
||||||
<tr><td>Mark as unread, go to next unread</td><td>m</td></tr>
|
<tr><td>Mark as unread, go to next unread</td><td>m</td></tr>
|
||||||
<tr class="backgroundColorRow"><td>Mark as unread</td><td>u</td></tr>
|
<tr class="backgroundColorRow"><td>Mark as unread</td><td>u</td></tr>
|
||||||
<tr><td>Open in browser</td><td>b or rightArrow or return or enter</td></tr>
|
<tr><td>Open in browser</td><td>b or return or enter</td></tr>
|
||||||
<tr class="backgroundColorRow"><td>Move focus to Subscriptions</td><td>leftArrow</td></tr>
|
<tr class="backgroundColorRow"><td>Move focus to Subscriptions</td><td>leftArrow</td></tr>
|
||||||
<tr><td>Previous subscription</td><td>a</td></tr>
|
<tr><td>Previous subscription</td><td>a</td></tr>
|
||||||
<tr class="backgroundColorRow"><td>Next subscription</td><td>z</td></tr>
|
<tr class="backgroundColorRow"><td>Next subscription</td><td>z</td></tr>
|
||||||
|
|
|
@ -20,7 +20,7 @@ public struct KeyboardConstant {
|
||||||
public extension String {
|
public extension String {
|
||||||
|
|
||||||
public var keyboardIntegerValue: Int {
|
public var keyboardIntegerValue: Int {
|
||||||
return Int(utf8[utf8.startIndex])
|
return Int(utf16[utf16.startIndex])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue