diff --git a/Evergreen/MainWindow/MainWindowController.swift b/Evergreen/MainWindow/MainWindowController.swift index 23abc1e58..f77b8427a 100644 --- a/Evergreen/MainWindow/MainWindowController.swift +++ b/Evergreen/MainWindow/MainWindowController.swift @@ -162,23 +162,39 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { openArticleInBrowser(sender) } + func makeTimelineViewFirstResponder() { + + guard let window = window, let timelineViewController = timelineViewController else { + return + } + window.makeFirstResponderUnlessDescendantIsFirstResponder(timelineViewController.tableView) + } + @IBAction func nextUnread(_ sender: Any?) { guard let timelineViewController = timelineViewController, let sidebarViewController = sidebarViewController else { return } - func makeTimelineViewFirstResponder() { - - window!.makeFirstResponderUnlessDescendantIsFirstResponder(timelineViewController.tableView) - } - if timelineViewController.canGoToNextUnread() { - timelineViewController.goToNextUnread() - makeTimelineViewFirstResponder() + goToNextUnreadInTimeline() } else if sidebarViewController.canGoToNextUnread() { sidebarViewController.goToNextUnread() + if timelineViewController.canGoToNextUnread() { + goToNextUnreadInTimeline() + } + } + } + + func goToNextUnreadInTimeline() { + + guard let timelineViewController = timelineViewController else { + return + } + + if timelineViewController.canGoToNextUnread() { + timelineViewController.goToNextUnread() makeTimelineViewFirstResponder() } } diff --git a/Evergreen/MainWindow/Sidebar/SidebarViewController.swift b/Evergreen/MainWindow/Sidebar/SidebarViewController.swift index f1fd30060..cf369440e 100644 --- a/Evergreen/MainWindow/Sidebar/SidebarViewController.swift +++ b/Evergreen/MainWindow/Sidebar/SidebarViewController.swift @@ -151,8 +151,6 @@ import RSCore } outlineView.selectRowIndexes(IndexSet([row]), byExtendingSelection: false) - - NSApplication.shared.sendAction(NSSelectorFromString("nextUnread:"), to: nil, from: self) } func focus() { diff --git a/README.md b/README.md index 86a8b8d70..58dfd88c0 100644 --- a/README.md +++ b/README.md @@ -7,3 +7,15 @@ It supports [RSS](http://cyber.harvard.edu/rss/rss.html), [Atom](https://tools.i It’s barely usable at this point. Barely. Probably not even. A whole bunch of things haven’t been done yet. (See the [bug tracker](https://github.com/brentsimmons/Evergreen/milestone/1)). More info: [https://ranchero.com/evergreen/](https://ranchero.com/evergreen/) + +Also see the [Technotes](Technotes/) and the [Roadmap](Technotes/Roadmap.md). + +#### On accepting pull requests + +It’s pretty early still, and we have strong opinions about how we want to do things, so we’re not seeking help just yet. + +That said, we will seriously consider any pull requests we do get. Just note that we may not accept them, or we may accept them and do a bunch of revision. + +It’s probably a good idea to let us know first what you’d like to do. ([Ask on Twitter](https://twitter.com/evergreen_mac), or email brent@ranchero.com, or post something to the [bug tracker](https://github.com/brentsimmons/Evergreen/issues).) + +In the future — some time after 1.0 ships — we expect to want contributions. The plan is *not* to make this a one-person show forever. diff --git a/Technotes/DevelopmentAlphaBeta.md b/Technotes/DevelopmentAlphaBeta.md new file mode 100644 index 000000000..d2298f53c --- /dev/null +++ b/Technotes/DevelopmentAlphaBeta.md @@ -0,0 +1,28 @@ +# What Development, Alpha, Beta, and Final Mean for Evergreen + +#### Development version + +Is not feature-complete, is full of bugs, may not be at all stable, and is liable to change wildly at any minute. + +#### Alpha + +The app reaches alpha when: + +* It’s feature-complete +* Has no known bugs + +During the alpha period, the app is tested thoroughly. More tests are written. As many people as possible use the app and report bugs. + +#### Beta + +The app reaches beta when all bugs found during alpha testing are fixed and there are no known bugs. The app is believed to be in ship-shape. + +More testing, however, is a good idea. + +The code is considered frozen except for bug fixes, and any bug fixes are done with extreme care and the lightest possible touch. + +#### Final + +The app reaches final when the developers are confident that it’s ready to ship. It works as designed, has no known bugs, doesn’t crash, and is fast. + +(Note: “no known bugs” is meant extremely seriously. That said, sometimes there are ambiguous weird cases that can’t be reproduced, and so there are exceptions to this rule. But we pretend most strenuously that that isn’t true. In fact, pretend you never read this paragraph, and we’ll pretend we never wrote it.) \ No newline at end of file diff --git a/Technotes/QuestionsAnswered.md b/Technotes/QuestionsAnswered.md new file mode 100644 index 000000000..6588642f4 --- /dev/null +++ b/Technotes/QuestionsAnswered.md @@ -0,0 +1,11 @@ +# Questions Answered + +#### How do I delete a feed? + +Select it in the sidebar, then hit the Delete key. Or choose Edit > Delete from the menubar. + +Note: you can delete multiple feeds, and you can delete folders. You can also undo if you change your mind. + +#### Why does Evergreen require the latest macOS? + +Since Evergreen is a nights-and-weekends project, we don’t have enough time to run and test on older versions of macOS. Most of the time it will require the most recent macOS. diff --git a/Technotes/README.md b/Technotes/README.md index 9d820511c..db70507e6 100644 --- a/Technotes/README.md +++ b/Technotes/README.md @@ -1,9 +1,15 @@ # TechNotes +[Roadmap](Roadmap.md) + ## How To [How to Restore to Factory Settings](RestoreToFactory.md) ## Notes +[What Development, Alpha, Beta, and Final Mean for Evergreen](DevelopmentAlphaBeta.md) + [Hidden Preferences](HiddenPrefs.md) + +[Questions Answered](QuestionsAnswered.md) diff --git a/Technotes/Roadmap.md b/Technotes/Roadmap.md new file mode 100644 index 000000000..4fb22f8b3 --- /dev/null +++ b/Technotes/Roadmap.md @@ -0,0 +1,65 @@ +# Roadmap + +Updated Dec. 23, 2017 + +This roadmap reflects thinking at the time of the last update. Anything can change at any time. + +## Evergreen 1.0 for macOS + +Ship: March 26, 2018 (we hope!) + +Features: + +* Standalone feed reading (unsynced) +* Syncing via FeedBin +* Built-in smart feeds (today, starred, all unread) +* Searching +* Starring +* Keyboard shortcuts +* Multiple windows +* Feed Directory +* AppleScript support +* Inspector +* Gestures +* Notifications +* Sharing +* Share extension +* Feed and user avatars +* Microblog full-post rendering in the timeline +* Thumbnail images in the timeline + +Milestones: + +[Evergreen 1.0 alpha](https://github.com/brentsimmons/Evergreen/milestone/1)
+[Evergreen 1.0 beta](https://github.com/brentsimmons/Evergreen/milestone/2)
+[Evergreen 1.0](https://github.com/brentsimmons/Evergreen/milestone/3) + +(See [What Development, Alpha, Beta, and Final Mean for Evergreen](DevelopmentAlphaBeta.md) for definitions.) + +## Evergreen 2.0 for macOS + +Ship: March 26, 2019 (seems unlikely) + +Features: + +* Syncing via Feedly and other similar systems — not yet decided which ones exactly +* Syncing via CloudKit (maaaaaybe, if feasible) +* Smart feeds — edit and create +* Filters that run during refresh +* Scripted feeds (AppleScript and shell/Ruby/etc.) +* Hiding read subscriptions +* Hiding read articles +* Deleting articles +* [Dark mode](https://github.com/brentsimmons/Evergreen/issues/97) +* Dinosaurs +* Dock menu items +* [Article themes](https://github.com/brentsimmons/Evergreen/issues/257) +* Back/forward commands +* [Article view zooming](https://github.com/brentsimmons/Evergreen/issues/38) +* [Import OPML from URL](https://github.com/brentsimmons/Evergreen/issues/136) + +Milestones: + +[Evergreen 2.0 alpha](https://github.com/brentsimmons/Evergreen/milestone/4)
+[Evergreen 2.0 beta](https://github.com/brentsimmons/Evergreen/milestone/5)
+[Evergreen 2.0](https://github.com/brentsimmons/Evergreen/milestone/6) diff --git a/website/pages/index.markdown b/website/pages/index.markdown index a893039e3..719a5b2e5 100644 --- a/website/pages/index.markdown +++ b/website/pages/index.markdown @@ -1,18 +1,17 @@ @title Evergreen -Evergreen is an open source, productivity-style feed reader for Macs. +Evergreen is a free and open source feed reader for macOS. It’s at a very early stage — we use it, but we don’t expect other people to use it yet. Nevertheless, you can: -Download the latest build - -Report bugs and make feature requests - -Checkout the code - -Also note: [Evergreen has its own blog](https://ranchero.com/evergreen/blog/). (The blog is one of the default feeds in Evergreen.) + #### To Do @@ -25,4 +24,23 @@ However, a few notes about the future: * We don’t plan on doing an iOS version ever. We might change our minds, but we doubt it. (Update Dec. 5, 2017: Well, maaaaaybe…) * We don’t plan on making a for-pay version ever, either. We might change our minds, but it’s massively unlikely. [This app is written for love](http://inessential.com/2015/06/30/love), not money. * Future versions will add syncing via existing services (such as [FeedBin](https://feedbin.com/), [Feedly](https://feedly.com/), [Feed Wrangler](https://feedwrangler.net/), and others), though we make no promises about which ones and when. (This means that, some time in the future, you could use Evergreen on your Mac and [Unread](http://supertop.co/unread/), [Reeder](http://reederapp.com/ios/), or other feed reader on your iPhone and iPad.) -* You’re free to use the code and make your own feed reader, even on iOS. It’s MIT-licensed. Just give us credit and call it something besides Evergreen. + +#### Technical Notes + +Evergreen supports RSS, Atom, JSON Feed, and RSS-in-JSON. + +Evergreen requires macOS 10.13. + +#### About Using the Code + +You’re free to use the code and make your own app, even on iOS. It’s MIT-licensed. Just give us credit and call it something besides Evergreen. + +In fact, please do use any or all of this code. If you can learn from it — things to do or things *not* to do — then great! Creating a full-featured example Mac app of use to other developers is one of our goals. + +Most of the code is written in Swift. Some older parts, particularly in the frameworks, are written in Objective-C. We think this is one of the largest open source Mac apps written mostly in Swift. + +#### About the name + +Evergreen is made in Seattle and is named for Washington, the Evergreen State. The author, who attended The Evergreen State College, has two evergreen trees in his yard. + +But the name is a prayer for the open web — may it remain evergreen. diff --git a/website/posts/2017/05/29/testing.markdown b/website/posts/2017/05/29/testing.markdown deleted file mode 100644 index c8aed6b04..000000000 --- a/website/posts/2017/05/29/testing.markdown +++ /dev/null @@ -1,4 +0,0 @@ -@title Testing -@pubDate Mon May 29 10:36:02 -0700 2017 -@modDate Mon May 29 10:36:02 -0700 2017 -This thing on? \ No newline at end of file diff --git a/website/posts/2017/12/22/inching_toward_usability.markdown b/website/posts/2017/12/22/inching_toward_usability.markdown new file mode 100644 index 000000000..0b21d667d --- /dev/null +++ b/website/posts/2017/12/22/inching_toward_usability.markdown @@ -0,0 +1,12 @@ +@title Inching Toward Usability +@pubDate 2017-12-22 15:17:07 -0800 +@modDate 2017-12-22 15:17:07 -0800 +While there is still so much to do — GitHub says we’re just 36% of the way (at this writing) toward completing the 1.0 alpha milestone — Evergreen is getting closer and closer to actually usable. + +The latest build (1.0d25) adds keyboard shortcuts, so you can (for instance) go through all your news via the space bar. (You can read about how we got this to work.) You can hit `k` to mark all as read, and so on. + +(For a complete list, open the Window menu and choose Keyboard Shortcuts.) + +If you want to try it out, you can [download the latest build](https://ranchero.com/downloads/Evergreen-latest.zip). + +Note: in the Help menu is a Bug Tracker item — use that to report bugs and make feature requests. (It goes to Evergreen’s bug tracker on GitHub.) diff --git a/website/posts/2017/12/23/roadmap.markdown b/website/posts/2017/12/23/roadmap.markdown new file mode 100644 index 000000000..3f8a6c4dc --- /dev/null +++ b/website/posts/2017/12/23/roadmap.markdown @@ -0,0 +1,8 @@ +@title Roadmap +@pubDate 2017-12-23 15:38:00 -0800 +@modDate 2017-12-23 15:38:00 -0800 +We published the Evergreen roadmap today — it covers 1.0 and 2.0. + +(What’s beyond 2.0? We haven’t even thought about it much yet.) + +If there’s anything missing, or if you have questions, post to the bug tracker or ask on Twitter. diff --git a/website/snippets/footer.html b/website/snippets/footer.html index 75b2573a6..716c38dfe 100644 --- a/website/snippets/footer.html +++ b/website/snippets/footer.html @@ -1,9 +1,24 @@ + diff --git a/website/snippets/header.html b/website/snippets/header.html index 2451120b1..6e8c71570 100644 --- a/website/snippets/header.html +++ b/website/snippets/header.html @@ -12,6 +12,6 @@ - +
diff --git a/website/styles/styleSheet.css b/website/styles/styleSheet.css index 88838b039..a7ecf4396 100644 --- a/website/styles/styleSheet.css +++ b/website/styles/styleSheet.css @@ -15,16 +15,17 @@ a { } #banner { line-height: 2em; - padding-top: 17px; - padding-bottom: 1px; - background-color: #445088; + padding-top: 1px; + padding-bottom: 7px; + background-color: #333333; text-align: center; } #innerbanner { max-width: 30em; margin-left: auto; margin-right: auto; - text-align: left; + text-align: center; + color: white; } #content { padding-bottom: 2em; @@ -33,9 +34,11 @@ a { margin-right: auto; margin-top: 3.5em; } -h1 a:link, h1 a:visited { +#innerbanner a:link, #innerbanner a:visited { color: white; text-decoration: none; +} +#innerbanner h1 { font-size: 48px; font-weight: normal; } @@ -45,7 +48,6 @@ h1 { h2 { color: #666; margin-top: 2em; - font-weight: normal; } a:link { color: #437C95; @@ -60,13 +62,13 @@ a:visited { color: #999; font-size: 0.9em; text-align: center; - border-toxp: 1px solid #ddd; - backgrxound-color: #6A7DD4; + border-top: 1px solid #ddd; } code, pre { font-family: "SF Mono", Menlo, "Courier", monospace; - font-size: 14px; + font-size: 16px; color: #666; + white-space: pre-wrap; } @media (max-width: 700px) { #innerbanner { diff --git a/website/templates/page.html b/website/templates/page.html index 68333c7fa..d89f9c7ca 100644 --- a/website/templates/page.html +++ b/website/templates/page.html @@ -1,5 +1,4 @@ [[=header.html]] -

[[@title]]

[[@bodytext]] [[=footer.html]]