This commit is contained in:
Brent Simmons 2017-12-24 10:28:44 -08:00
commit 1cb2a32b5a
15 changed files with 221 additions and 35 deletions

View File

@ -162,25 +162,41 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations {
openArticleInBrowser(sender) openArticleInBrowser(sender)
} }
func makeTimelineViewFirstResponder() {
guard let window = window, let timelineViewController = timelineViewController else {
return
}
window.makeFirstResponderUnlessDescendantIsFirstResponder(timelineViewController.tableView)
}
@IBAction func nextUnread(_ sender: Any?) { @IBAction func nextUnread(_ sender: Any?) {
guard let timelineViewController = timelineViewController, let sidebarViewController = sidebarViewController else { guard let timelineViewController = timelineViewController, let sidebarViewController = sidebarViewController else {
return return
} }
func makeTimelineViewFirstResponder() { if timelineViewController.canGoToNextUnread() {
goToNextUnreadInTimeline()
}
else if sidebarViewController.canGoToNextUnread() {
sidebarViewController.goToNextUnread()
if timelineViewController.canGoToNextUnread() {
goToNextUnreadInTimeline()
}
}
}
window!.makeFirstResponderUnlessDescendantIsFirstResponder(timelineViewController.tableView) func goToNextUnreadInTimeline() {
guard let timelineViewController = timelineViewController else {
return
} }
if timelineViewController.canGoToNextUnread() { if timelineViewController.canGoToNextUnread() {
timelineViewController.goToNextUnread() timelineViewController.goToNextUnread()
makeTimelineViewFirstResponder() makeTimelineViewFirstResponder()
} }
else if sidebarViewController.canGoToNextUnread() {
sidebarViewController.goToNextUnread()
makeTimelineViewFirstResponder()
}
} }
@IBAction func markAllAsRead(_ sender: Any?) { @IBAction func markAllAsRead(_ sender: Any?) {

View File

@ -151,8 +151,6 @@ import RSCore
} }
outlineView.selectRowIndexes(IndexSet([row]), byExtendingSelection: false) outlineView.selectRowIndexes(IndexSet([row]), byExtendingSelection: false)
NSApplication.shared.sendAction(NSSelectorFromString("nextUnread:"), to: nil, from: self)
} }
func focus() { func focus() {

View File

@ -7,3 +7,15 @@ It supports [RSS](http://cyber.harvard.edu/rss/rss.html), [Atom](https://tools.i
Its barely usable at this point. Barely. Probably not even. A whole bunch of things havent been done yet. (See the [bug tracker](https://github.com/brentsimmons/Evergreen/milestone/1)). Its barely usable at this point. Barely. Probably not even. A whole bunch of things havent been done yet. (See the [bug tracker](https://github.com/brentsimmons/Evergreen/milestone/1)).
More info: [https://ranchero.com/evergreen/](https://ranchero.com/evergreen/) 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
Its pretty early still, and we have strong opinions about how we want to do things, so were 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.
Its probably a good idea to let us know first what youd 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.

View File

@ -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:
* Its 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 its ready to ship. It works as designed, has no known bugs, doesnt crash, and is fast.
(Note: “no known bugs” is meant extremely seriously. That said, sometimes there are ambiguous weird cases that cant be reproduced, and so there are exceptions to this rule. But we pretend most strenuously that that isnt true. In fact, pretend you never read this paragraph, and well pretend we never wrote it.)

View File

@ -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 dont have enough time to run and test on older versions of macOS. Most of the time it will require the most recent macOS.

View File

@ -1,9 +1,15 @@
# TechNotes # TechNotes
[Roadmap](Roadmap.md)
## How To ## How To
[How to Restore to Factory Settings](RestoreToFactory.md) [How to Restore to Factory Settings](RestoreToFactory.md)
## Notes ## Notes
[What Development, Alpha, Beta, and Final Mean for Evergreen](DevelopmentAlphaBeta.md)
[Hidden Preferences](HiddenPrefs.md) [Hidden Preferences](HiddenPrefs.md)
[Questions Answered](QuestionsAnswered.md)

65
Technotes/Roadmap.md Normal file
View File

@ -0,0 +1,65 @@
# Roadmap
<i>Updated Dec. 23, 2017</i>
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)<br />
[Evergreen 1.0 beta](https://github.com/brentsimmons/Evergreen/milestone/2)<br />
[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)<br />
[Evergreen 2.0 beta](https://github.com/brentsimmons/Evergreen/milestone/5)<br />
[Evergreen 2.0](https://github.com/brentsimmons/Evergreen/milestone/6)

View File

@ -1,18 +1,17 @@
@title Evergreen @title Evergreen
Evergreen is an open source, productivity-style feed reader for Macs. Evergreen is a free and open source feed reader for macOS.
Its at a very early stage — we use it, but we dont expect other people to use it yet. Its at a very early stage — we use it, but we dont expect other people to use it yet.
Nevertheless, you can: Nevertheless, you can:
<a href="https://ranchero.com/downloads/Evergreen-latest.zip">Download the latest build</a> <ul><li><a href="https://ranchero.com/downloads/Evergreen-latest.zip">Download the latest build</a></li>
<li><a href="https://github.com/brentsimmons/Evergreen/issues">Report bugs and make feature requests</a></li>
<a href="https://github.com/brentsimmons/Evergreen/issues">Report bugs and make feature requests</a> <li><a href="https://github.com/brentsimmons/Evergreen">Checkout the code</a></li>
<li><a href="https://ranchero.com/evergreen/blog/">Read the blog</a></li>
<a href="https://github.com/brentsimmons/Evergreen">Checkout the code</a> <li><a href="https://github.com/brentsimmons/Evergreen/blob/master/Technotes/Roadmap.md">Read the roadmap</a>
<li><a href="https://twitter.com/evergreen_mac">Follow Evergreen on Twitter</a></li></ul>
Also note: [Evergreen has its own blog](https://ranchero.com/evergreen/blog/). (The blog is one of the default feeds in Evergreen.)
#### To Do #### To Do
@ -25,4 +24,23 @@ However, a few notes about the future:
* We dont plan on doing an iOS version ever. We might change our minds, but we doubt it. (Update Dec. 5, 2017: Well, maaaaaybe…) * We dont plan on doing an iOS version ever. We might change our minds, but we doubt it. (Update Dec. 5, 2017: Well, maaaaaybe…)
* We dont plan on making a for-pay version ever, either. We might change our minds, but its massively unlikely. [This app is written for love](http://inessential.com/2015/06/30/love), not money. * We dont plan on making a for-pay version ever, either. We might change our minds, but its 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.) * 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.)
* Youre free to use the code and make your own feed reader, even on iOS. Its MIT-licensed. Just give us credit and call it something besides Evergreen.
#### Technical Notes
Evergreen supports <a href="http://cyber.harvard.edu/rss/rss.html">RSS</a>, <a href="https://tools.ietf.org/html/rfc4287">Atom</a>, <a href="https://jsonfeed.org/">JSON Feed</a>, and <a href="https://github.com/scripting/Scripting-News/blob/master/rss-in-json/README.md">RSS-in-JSON</a>.
Evergreen requires macOS 10.13.
#### About Using the Code
Youre free to use the code and make your own app, even on iOS. Its MIT-licensed. Just give us credit and call it something besides Evergreen.
In fact, <i>please do</i> 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.

View File

@ -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?

View File

@ -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 were just 36% of the way (at this writing) toward completing the <a href="https://github.com/brentsimmons/Evergreen/milestone/1">1.0 alpha milestone</a> 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 <a href="http://inessential.com/2017/12/20/wkwebview_workarounds">how we got this to work</a>.) 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 <a href="https://github.com/brentsimmons/Evergreen/issues">Evergreens bug tracker on GitHub</a>.)

View File

@ -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 <a href="https://github.com/brentsimmons/Evergreen/blob/master/Technotes/Roadmap.md">Evergreen roadmap</a> today — it covers 1.0 and 2.0.
(Whats beyond 2.0? We havent even thought about it much yet.)
If theres anything missing, or if you have questions, post to the <a href="https://github.com/brentsimmons/Evergreen/issues">bug tracker</a> or <a href="https://twitter.com/evergreen_mac">ask on Twitter</a>.

View File

@ -1,9 +1,24 @@
</div> <!-- content --> </div> <!-- content -->
<div id="footer"> <div id="footer">
<p>© 1995-2017 Ranchero Software, LLC</p>
<p>Made in Seattle.</p> <div id="sidebar">
<p class="sidebarText"><a href="https://ranchero.com/evergreen/"><img src="https://ranchero.com/evergreen/images/evergreenAvatar.png" width="100" height="100" alt="Evergreen avatar" /></a></p>
<p class="sidebarText"><a href="https://ranchero.com/downloads/Evergreen-latest.zip">Latest Build</a><br />
<a href="https://github.com/brentsimmons/Evergreen/tree/master/Technotes">Technotes</a><a href="https://twitter.com/evergreen_mac">Twitter</a><a href="https://ranchero.com/evergreen/blog/">Blog</a><br />
<a href="https://github.com/brentsimmons/Evergreen">Repository</a><a href="https://github.com/brentsimmons/Evergreen/issues">Bug Tracker</a><a href="https://github.com/brentsimmons/Evergreen/blob/master/Technotes/Roadmap.md">Roadmap</a><br />
<a href="https://ranchero.com/evergreen/xml/rss.xml">RSS</a><a href="https://ranchero.com/evergreen/feed.json">JSON Feed</a></p>
<p class="sidebarText">Open Web Friends<br />
<a href="https://www.red-sweater.com/marsedit/">MarsEdit</a><a href="https://micro.blog/">Micro.blog</a><a href="https://overcast.fm/">Overcast</a></p>
</div> <!-- sidebar -->
<p>© 1995-2017 <a href="https://ranchero.com/">Ranchero Software, LLC</a><br />
Made in Seattle.</p>
</div> </div>
</body> </body>
</html> </html>

View File

@ -12,6 +12,6 @@
<script type="text/javascript"> </script> <!-- FOUC hack: http://www.bluerobot.com/web/css/fouc.asp --> <script type="text/javascript"> </script> <!-- FOUC hack: http://www.bluerobot.com/web/css/fouc.asp -->
</head> </head>
<body> <body>
<div id="banner"><div id="innerbanner"><h1><a href="https://ranchero.com/">Ranchero Software</a></span></h1></div></div> <div id="banner"><div id="innerbanner"><h1><a href="https://ranchero.com/evergreen/">Evergreen</a></span></h1>by <a href="https://ranchero.com/">Ranchero Software</a></div></div>
<div id="content"> <div id="content">

View File

@ -15,16 +15,17 @@ a {
} }
#banner { #banner {
line-height: 2em; line-height: 2em;
padding-top: 17px; padding-top: 1px;
padding-bottom: 1px; padding-bottom: 7px;
background-color: #445088; background-color: #333333;
text-align: center; text-align: center;
} }
#innerbanner { #innerbanner {
max-width: 30em; max-width: 30em;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
text-align: left; text-align: center;
color: white;
} }
#content { #content {
padding-bottom: 2em; padding-bottom: 2em;
@ -33,9 +34,11 @@ a {
margin-right: auto; margin-right: auto;
margin-top: 3.5em; margin-top: 3.5em;
} }
h1 a:link, h1 a:visited { #innerbanner a:link, #innerbanner a:visited {
color: white; color: white;
text-decoration: none; text-decoration: none;
}
#innerbanner h1 {
font-size: 48px; font-size: 48px;
font-weight: normal; font-weight: normal;
} }
@ -45,7 +48,6 @@ h1 {
h2 { h2 {
color: #666; color: #666;
margin-top: 2em; margin-top: 2em;
font-weight: normal;
} }
a:link { a:link {
color: #437C95; color: #437C95;
@ -60,13 +62,13 @@ a:visited {
color: #999; color: #999;
font-size: 0.9em; font-size: 0.9em;
text-align: center; text-align: center;
border-toxp: 1px solid #ddd; border-top: 1px solid #ddd;
backgrxound-color: #6A7DD4;
} }
code, pre { code, pre {
font-family: "SF Mono", Menlo, "Courier", monospace; font-family: "SF Mono", Menlo, "Courier", monospace;
font-size: 14px; font-size: 16px;
color: #666; color: #666;
white-space: pre-wrap;
} }
@media (max-width: 700px) { @media (max-width: 700px) {
#innerbanner { #innerbanner {

View File

@ -1,5 +1,4 @@
[[=header.html]] [[=header.html]]
<h1>[[@title]]</h1>
[[@bodytext]] [[@bodytext]]
[[=footer.html]] [[=footer.html]]
</body> </body>