From 3e2236896219804cdf4b9cfb79eb186f371feddc Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 12 Apr 2021 16:04:45 +0300 Subject: getPreviousFeed/getNextFeed: implement wrap around --- js/FeedTree.js | 102 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 55 insertions(+), 47 deletions(-) (limited to 'js') diff --git a/js/FeedTree.js b/js/FeedTree.js index 185135ec6..b81638c39 100755 --- a/js/FeedTree.js +++ b/js/FeedTree.js @@ -388,6 +388,24 @@ define(["dojo/_base/declare", "dojo/dom-construct", "dojo/_base/array", "dojo/co getNextUnread: function(feed, is_cat) { return this.getNextFeed(feed, is_cat, true); }, + _nextTreeItemFromIndex: function (start, unread_only) { + const items = this.model.store._arrayOfAllItems; + + for (let i = start+1; i < items.length; i++) { + const id = String(items[i].id); + const box = this._itemNodesMap[id]; + const unread = parseInt(items[i].unread); + + if (box && (!unread_only || unread > 0)) { + const row = box[0].rowNode; + const cat = box[0].rowNode.parentNode.parentNode; + + if (Element.visible(cat) && Element.visible(row)) { + return items[i]; + } + } + } + }, getNextFeed: function (feed, is_cat, unread_only = false) { let treeItem; @@ -398,36 +416,40 @@ define(["dojo/_base/declare", "dojo/dom-construct", "dojo/_base/array", "dojo/co } const items = this.model.store._arrayOfAllItems; - let item = false; + const start = items.indexOf(treeItem); - for (let i = 0; i < items.length; i++) { - if (items[i] == treeItem) { + if (start != -1) { + let item = this._nextTreeItemFromIndex(start, unread_only); - for (let j = i+1; j < items.length; j++) { - const id = String(items[j].id); - const box = this._itemNodesMap[id]; - const unread = parseInt(items[j].unread); + // let's try again from the top + // 0 (instead of -1) to skip Special category + if (!item) { + item = this._nextTreeItemFromIndex(0, unread_only); + } - if (box && (!unread_only || unread > 0)) { - const row = box[0].rowNode; - const cat = box[0].rowNode.parentNode.parentNode; + if (item) + return [this.model.store.getValue(item, 'bare_id'), + !this.model.store.getValue(item, 'id').match('FEED:')]; + } - if (Element.visible(cat) && Element.visible(row)) { - item = items[j]; - break; - } - } + return [false, false]; + }, + _prevTreeItemFromIndex: function (start) { + const items = this.model.store._arrayOfAllItems; + + for (let i = start-1; i > 0; i--) { + const id = String(items[i].id); + const box = this._itemNodesMap[id]; + + if (box) { + const row = box[0].rowNode; + const cat = box[0].rowNode.parentNode.parentNode; + + if (Element.visible(cat) && Element.visible(row)) { + return items[i]; } - break; } } - - if (item) { - return [this.model.store.getValue(item, 'bare_id'), - !this.model.store.getValue(item, 'id').match('FEED:')]; - } else { - return [false, false]; - } }, getPreviousFeed: function (feed, is_cat) { let treeItem; @@ -439,36 +461,22 @@ define(["dojo/_base/declare", "dojo/dom-construct", "dojo/_base/array", "dojo/co } const items = this.model.store._arrayOfAllItems; - let item = false; - - for (let i = 0; i < items.length; i++) { - if (items[i] == treeItem) { + const start = items.indexOf(treeItem); - for (let j = i-1; j > 0; j--) { - const id = String(items[j].id); - const box = this._itemNodesMap[id]; + if (start != -1) { + let item = this._prevTreeItemFromIndex(start); - if (box) { - const row = box[0].rowNode; - const cat = box[0].rowNode.parentNode.parentNode; - - if (Element.visible(cat) && Element.visible(row)) { - item = items[j]; - break; - } - } - } - break; + // wrap from the bottom + if (!item) { + item = this._prevTreeItemFromIndex(items.length); } - } - if (item) { - return [this.model.store.getValue(item, 'bare_id'), - !this.model.store.getValue(item, 'id').match('FEED:')]; - } else { - return [false, false]; + if (item) + return [this.model.store.getValue(item, 'bare_id'), + !this.model.store.getValue(item, 'id').match('FEED:')]; } + return [false, false]; }, getFeedCategory: function(feed) { try { -- cgit v1.2.3