]> git.wh0rd.org - tt-rss.git/blame - FeedTree.js
experimental display of labelColorIndicators in FeedTree
[tt-rss.git] / FeedTree.js
CommitLineData
05f224a3
AD
1dojo.provide("fox.FeedTree");
2dojo.provide("fox.FeedStoreModel");
3
4dojo.require("dijit.Tree");
997429c2 5dojo.require("dijit.Menu");
05f224a3
AD
6
7dojo.declare("fox.FeedStoreModel", dijit.tree.ForestStoreModel, {
1beea800
AD
8 getItemsInCategory: function (id) {
9 if (!this.store._itemsByIdentity) return undefined;
10
11 cat = this.store._itemsByIdentity['CAT:' + id];
12
13 if (cat && cat.items)
14 return cat.items;
15 else
16 return undefined;
17
18 },
05f224a3
AD
19 getItemById: function(id) {
20 return this.store._itemsByIdentity[id];
21 },
22 getFeedValue: function(feed, is_cat, key) {
b8aa9ca7
AD
23 if (!this.store._itemsByIdentity) return undefined;
24
05f224a3
AD
25 if (is_cat)
26 treeItem = this.store._itemsByIdentity['CAT:' + feed];
27 else
28 treeItem = this.store._itemsByIdentity['FEED:' + feed];
29
30 if (treeItem)
31 return this.store.getValue(treeItem, key);
32 },
33 getFeedName: function(feed, is_cat) {
34 return this.getFeedValue(feed, is_cat, 'name');
35 },
36 getFeedUnread: function(feed, is_cat) {
37 var unread = parseInt(this.getFeedValue(feed, is_cat, 'unread'));
38 return (isNaN(unread)) ? 0 : unread;
39 },
40 setFeedUnread: function(feed, is_cat, unread) {
41 return this.setFeedValue(feed, is_cat, 'unread', parseInt(unread));
42 },
43 setFeedValue: function(feed, is_cat, key, value) {
44 if (!value) value = '';
b8aa9ca7 45 if (!this.store._itemsByIdentity) return undefined;
05f224a3
AD
46
47 if (is_cat)
48 treeItem = this.store._itemsByIdentity['CAT:' + feed];
49 else
50 treeItem = this.store._itemsByIdentity['FEED:' + feed];
51
52 if (treeItem)
53 return this.store.setValue(treeItem, key, value);
54 },
692de159
AD
55 getNextUnreadFeed: function (feed, is_cat) {
56 if (is_cat) {
57 treeItem = this.store._itemsByIdentity['CAT:' + feed];
58 items = this.store._arrayOfTopLevelItems;
59 } else {
60 treeItem = this.store._itemsByIdentity['FEED:' + feed];
61 items = this.store._arrayOfAllItems;
62 }
63
64 for (var i = 0; i < items.length; i++) {
65 if (items[i] == treeItem) {
66
67 for (j = i+1; j < items.length; j++) {
68 var unread = this.store.getValue(items[j], 'unread');
69 var id = this.store.getValue(items[j], 'id');
70
71 if (unread > 0 && (is_cat || id.match("FEED:"))) return items[j];
72 }
73
74 for (j = 0; j < i; j++) {
75 var unread = this.store.getValue(items[j], 'unread');
76 var id = this.store.getValue(items[j], 'id');
77
78 if (unread > 0 && (is_cat || id.match("FEED:"))) return items[j];
79 }
80 }
81 }
82
83 return null;
84 },
85 hasCats: function() {
86 if (this.store && this.store._itemsByIdentity)
87 return this.store._itemsByIdentity['CAT:-1'] != undefined;
88 else
89 return false;
90 },
05f224a3
AD
91});
92
93dojo.declare("fox.FeedTree", dijit.Tree, {
94 _createTreeNode: function(args) {
95 var tnode = new dijit._TreeNode(args);
997429c2 96
05f224a3
AD
97 if (args.item.icon)
98 tnode.iconNode.src = args.item.icon[0];
99
997429c2
AD
100 var id = args.item.id[0];
101 var bare_id = parseInt(id.substr(id.indexOf(':')+1));
102
9fe80bcd
AD
103 if (bare_id < -10) {
104 var span = dojo.doc.createElement('span');
105 var fg_color = args.item.fg_color[0];
106 var bg_color = args.item.bg_color[0];
107
108 span.innerHTML = "&alpha;";
109 span.className = 'labelColorIndicator';
110 span.setStyle({
111 color: fg_color,
112 backgroundColor: bg_color});
113
114 dojo.place(span, tnode.iconNode, 'replace');
115 }
116
997429c2
AD
117 if (id.match("FEED:") && bare_id > 0) {
118 var menu = new dijit.Menu();
119 menu.row_id = bare_id;
120
121 menu.addChild(new dijit.MenuItem({
122 label: __("Edit feed"),
123 onClick: function() {
f9c388f5 124 editFeed(this.getParent().row_id);
997429c2
AD
125 }}));
126
127 menu.addChild(new dijit.MenuItem({
128 label: __("Update feed"),
129 onClick: function() {
130 scheduleFeedUpdate(this.getParent().row_id, false);
131 }}));
132
133 menu.bindDomNode(tnode.domNode);
134 tnode._menu = menu;
135 }
136
05f224a3
AD
137 //tnode.labelNode.innerHTML = args.label;
138 return tnode;
139 },
140 getIconClass: function (item, opened) {
141 return (!item || this.model.mayHaveChildren(item)) ? (opened ? "dijitFolderOpened" : "dijitFolderClosed") : "feedIcon";
142 },
143 getLabelClass: function (item, opened) {
144 return (item.unread == 0) ? "dijitTreeLabel" : "dijitTreeLabel Unread";
145 },
146 getRowClass: function (item, opened) {
147 return (!item.error || item.error == '') ? "dijitTreeRow" :
148 "dijitTreeRow Error";
149 },
150 getLabel: function(item) {
151 if (item.unread > 0) {
152 return item.name + " (" + item.unread + ")";
153 } else {
154 return item.name;
155 }
156 },
157 selectFeed: function(feed, is_cat) {
158 if (is_cat)
159 treeNode = this._itemNodesMap['CAT:' + feed];
160 else
161 treeNode = this._itemNodesMap['FEED:' + feed];
162
163 if (treeNode) {
164 treeNode = treeNode[0];
165 if (!is_cat) this._expandNode(treeNode);
166 this._selectNode(treeNode);
167 }
168 },
169 setFeedIcon: function(feed, is_cat, src) {
170 if (is_cat)
171 treeNode = this._itemNodesMap['CAT:' + feed];
172 else
173 treeNode = this._itemNodesMap['FEED:' + feed];
174
175 if (treeNode) {
176 treeNode = treeNode[0];
177 treeNode.iconNode.src = src;
178 return true;
179 }
180 return false;
181 },
182 setFeedExpandoIcon: function(feed, is_cat, src) {
183 if (is_cat)
184 treeNode = this._itemNodesMap['CAT:' + feed];
185 else
186 treeNode = this._itemNodesMap['FEED:' + feed];
187
188 if (treeNode) {
189 treeNode = treeNode[0];
190 treeNode.expandoNode.src = src;
191 return true;
192 }
193
194 return false;
195 },
196 hasCats: function() {
692de159 197 return this.model.hasCats();
05f224a3
AD
198 },
199 hideRead: function (hide, show_special) {
200 if (this.hasCats()) {
201
202 var tree = this;
203 var cats = this.model.store._arrayOfTopLevelItems;
204
205 cats.each(function(cat) {
206 var cat_unread = tree.hideReadFeeds(cat.items, hide, show_special);
207
208 var id = String(cat.id);
209 var node = tree._itemNodesMap[id];
210 var bare_id = parseInt(id.substr(id.indexOf(":")+1));
211
212 if (node) {
213 var check_unread = tree.model.getFeedUnread(bare_id, true);
214
215 if (hide && cat_unread == 0 && check_unread == 0) {
216 Effect.Fade(node[0].rowNode, {duration : 0.3,
217 queue: { position: 'end', scope: 'FFADE-' + id, limit: 1 }});
218 } else {
219 Element.show(node[0].rowNode);
220 ++cat_unread;
221 }
222 }
223 });
05f224a3
AD
224
225 } else {
226 this.hideReadFeeds(this.model.store._arrayOfTopLevelItems, hide,
227 show_special);
228 }
229 },
230 hideReadFeeds: function (items, hide, show_special) {
231 var tree = this;
232 var cat_unread = 0;
233
234 items.each(function(feed) {
235 var id = String(feed.id);
236 var bare_id = parseInt(feed.bare_id);;
237
238 var unread = feed.unread[0];
239 var node = tree._itemNodesMap[id];
240
241 if (node) {
242 if (hide && unread == 0 && (bare_id > 0 || !show_special)) {
243 Effect.Fade(node[0].rowNode, {duration : 0.3,
244 queue: { position: 'end', scope: 'FFADE-' + id, limit: 1 }});
245 } else {
246 Element.show(node[0].rowNode);
247 ++cat_unread;
248 }
249 }
250 });
251
252 return cat_unread;
253 },
1a709d21
AD
254 collapseHiddenCats: function() {
255 if (!this.model.hasCats()) return;
256
257 var cats = this.model.store._arrayOfTopLevelItems;
258 var tree = this;
259
260 dojo.forEach(cats, function(cat) {
261 var hidden = tree.model.store.getValue(cat, 'hidden');
262 var id = tree.model.store.getValue(cat, 'id');
263 var node = tree._itemNodesMap[id][0];
264
265 if (hidden)
266 tree._collapseNode(node);
267 else
268 tree._expandNode(node);
269
270 });
271 },
05f224a3 272});