summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README2
-rw-r--r--functions.js129
-rw-r--r--tt-rss.js15
3 files changed, 145 insertions, 1 deletions
diff --git a/README b/README
index 5aa84c53b..55ce000e6 100644
--- a/README
+++ b/README
@@ -30,6 +30,8 @@ Interface:
"r" refreshes feed list;
"u" refreshes currently selected feed;
"a" hides or shows only unread feeds in the feedlist;
+ "j" move to previous feed
+ "k" move to next feed
Requirements:
diff --git a/functions.js b/functions.js
index 3aef7befa..c696ae3e8 100644
--- a/functions.js
+++ b/functions.js
@@ -130,7 +130,11 @@ function hotkey_handler(e) {
}
if (typeof localHotkeyHandler != 'undefined') {
- localHotkeyHandler(keycode);
+ try {
+ localHotkeyHandler(keycode);
+ } catch (e) {
+ exception_error(e);
+ }
}
}
@@ -545,3 +549,126 @@ function openExternalUrl(url) {
var w = window.open(url);
}
+
+function getRelativeFeedId(list, id, direction) {
+ if (!id) {
+ if (direction == "next") {
+ for (i = 0; i < list.childNodes.length; i++) {
+ var child = list.childNodes[i];
+ if (child.id == "feedCatHolder") {
+ if (child.firstChild) {
+ var cr = getRelativeFeedId(child.firstChild, id, direction);
+ if (cr) return cr;
+ }
+ } else if (child.id.match("FEEDR-")) {
+ return child.id.replace('FEEDR-', '');
+ }
+ }
+ }
+
+ // FIXME select last feed doesn't work when only unread feeds are visible
+
+ if (direction == "prev") {
+ for (i = list.childNodes.length-1; i >= 0; i--) {
+ var child = list.childNodes[i];
+ if (child.id == "feedCatHolder") {
+ if (child.firstChild) {
+ var cr = getRelativeFeedId(child.firstChild, id, direction);
+ if (cr) return cr;
+ }
+ } else if (child.id.match("FEEDR-")) {
+
+ if (getCookie("ttrss_vf_hreadf") == 1) {
+ if (child.className != "feed") {
+ alert(child.className);
+ return child.id.replace('FEEDR-', '');
+ }
+ } else {
+ return child.id.replace('FEEDR-', '');
+ }
+ }
+ }
+ }
+ } else {
+
+ var feed = list.ownerDocument.getElementById("FEEDR-" + getActiveFeedId());
+
+ if (direction == "next") {
+
+ if (feed.nextSibling) {
+
+ var next_feed = feed.nextSibling;
+
+ while (!next_feed.id && next_feed.nextSibling) {
+ next_feed = next_feed.nextSibling;
+ }
+
+ if (getCookie("ttrss_vf_hreadf") == 1) {
+ while (next_feed && next_feed.className == "feed") {
+ next_feed = next_feed.nextSibling;
+ }
+ }
+
+ if (next_feed && next_feed.id.match("FEEDR-")) {
+ return next_feed.id.replace("FEEDR-", "");
+ }
+ }
+
+ var this_cat = feed.parentNode.parentNode;
+
+ if (this_cat && this_cat.nextSibling) {
+ while (this_cat = this_cat.nextSibling) {
+ if (this_cat.firstChild && this_cat.firstChild.firstChild) {
+ var next_feed = this_cat.firstChild.firstChild;
+ if (getCookie("ttrss_vf_hreadf") == 1) {
+ while (next_feed && next_feed.className == "feed") {
+ next_feed = next_feed.nextSibling;
+ }
+ }
+ if (next_feed && next_feed.id.match("FEEDR-")) {
+ return next_feed.id.replace("FEEDR-", "");
+ }
+ }
+ }
+ }
+ } else if (direction == "prev") {
+
+ if (feed.previousSibling) {
+
+ var prev_feed = feed.previousSibling;
+
+ if (getCookie("ttrss_vf_hreadf") == 1) {
+ while (prev_feed && prev_feed.className == "feed") {
+ prev_feed = prev_feed.previousSibling;
+ }
+ }
+
+ while (!prev_feed.id && prev_feed.previousSibling) {
+ prev_feed = prev_feed.previousSibling;
+ }
+
+ if (prev_feed && prev_feed.id.match("FEEDR-")) {
+ return prev_feed.id.replace("FEEDR-", "");
+ }
+ }
+
+ var this_cat = feed.parentNode.parentNode;
+
+ if (this_cat && this_cat.previousSibling) {
+ while (this_cat = this_cat.previousSibling) {
+ if (this_cat.lastChild && this_cat.firstChild.lastChild) {
+ var prev_feed = this_cat.firstChild.lastChild;
+ if (getCookie("ttrss_vf_hreadf") == 1) {
+ while (prev_feed && prev_feed.className == "feed") {
+ prev_feed = prev_feed.previousSibling;
+ }
+ }
+ if (prev_feed && prev_feed.id.match("FEEDR-")) {
+ return prev_feed.id.replace("FEEDR-", "");
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/tt-rss.js b/tt-rss.js
index 795c16453..a2910451e 100644
--- a/tt-rss.js
+++ b/tt-rss.js
@@ -299,6 +299,21 @@ function localHotkeyHandler(keycode) {
return toggleDispRead();
}
+ var f_doc = window.frames["feeds-frame"].document;
+ var feedlist = f_doc.getElementById('feedList');
+
+ if (keycode == 74) { // j
+ var feed = getActiveFeedId();
+ var new_feed = getRelativeFeedId(feedlist, feed, 'prev');
+ if (new_feed) viewfeed(new_feed, 0, '');
+ }
+
+ if (keycode == 75) { // k
+ var feed = getActiveFeedId();
+ var new_feed = getRelativeFeedId(feedlist, feed, 'next');
+ if (new_feed) viewfeed(new_feed, 0, '');
+ }
+
// notify("KC: " + keycode);
}