]> git.wh0rd.org - tt-rss.git/blob - FeedTree.js
add experimental support for feedlist popup menu
[tt-rss.git] / FeedTree.js
1 dojo.provide("fox.FeedTree");
2 dojo.provide("fox.FeedStoreModel");
3
4 dojo.require("dijit.Tree");
5 dojo.require("dijit.Menu");
6
7 dojo.declare("fox.FeedStoreModel", dijit.tree.ForestStoreModel, {
8 getItemById: function(id) {
9 return this.store._itemsByIdentity[id];
10 },
11 getFeedValue: function(feed, is_cat, key) {
12 if (!this.store._itemsByIdentity) return undefined;
13
14 if (is_cat)
15 treeItem = this.store._itemsByIdentity['CAT:' + feed];
16 else
17 treeItem = this.store._itemsByIdentity['FEED:' + feed];
18
19 if (treeItem)
20 return this.store.getValue(treeItem, key);
21 },
22 getFeedName: function(feed, is_cat) {
23 return this.getFeedValue(feed, is_cat, 'name');
24 },
25 getFeedUnread: function(feed, is_cat) {
26 var unread = parseInt(this.getFeedValue(feed, is_cat, 'unread'));
27 return (isNaN(unread)) ? 0 : unread;
28 },
29 setFeedUnread: function(feed, is_cat, unread) {
30 return this.setFeedValue(feed, is_cat, 'unread', parseInt(unread));
31 },
32 setFeedValue: function(feed, is_cat, key, value) {
33 if (!value) value = '';
34 if (!this.store._itemsByIdentity) return undefined;
35
36 if (is_cat)
37 treeItem = this.store._itemsByIdentity['CAT:' + feed];
38 else
39 treeItem = this.store._itemsByIdentity['FEED:' + feed];
40
41 if (treeItem)
42 return this.store.setValue(treeItem, key, value);
43 },
44 });
45
46 dojo.declare("fox.FeedTree", dijit.Tree, {
47 _createTreeNode: function(args) {
48 var tnode = new dijit._TreeNode(args);
49
50 if (args.item.icon)
51 tnode.iconNode.src = args.item.icon[0];
52
53 var id = args.item.id[0];
54 var bare_id = parseInt(id.substr(id.indexOf(':')+1));
55
56 if (id.match("FEED:") && bare_id > 0) {
57 var menu = new dijit.Menu();
58 menu.row_id = bare_id;
59
60 menu.addChild(new dijit.MenuItem({
61 label: __("Edit feed"),
62 onClick: function() {
63 editFeedDlg(this.getParent().row_id);
64 }}));
65
66 menu.addChild(new dijit.MenuItem({
67 label: __("Update feed"),
68 onClick: function() {
69 scheduleFeedUpdate(this.getParent().row_id, false);
70 }}));
71
72 menu.bindDomNode(tnode.domNode);
73 tnode._menu = menu;
74 }
75
76 //tnode.labelNode.innerHTML = args.label;
77 return tnode;
78 },
79 getIconClass: function (item, opened) {
80 return (!item || this.model.mayHaveChildren(item)) ? (opened ? "dijitFolderOpened" : "dijitFolderClosed") : "feedIcon";
81 },
82 getLabelClass: function (item, opened) {
83 return (item.unread == 0) ? "dijitTreeLabel" : "dijitTreeLabel Unread";
84 },
85 getRowClass: function (item, opened) {
86 return (!item.error || item.error == '') ? "dijitTreeRow" :
87 "dijitTreeRow Error";
88 },
89 getLabel: function(item) {
90 if (item.unread > 0) {
91 return item.name + " (" + item.unread + ")";
92 } else {
93 return item.name;
94 }
95 },
96 selectFeed: function(feed, is_cat) {
97 if (is_cat)
98 treeNode = this._itemNodesMap['CAT:' + feed];
99 else
100 treeNode = this._itemNodesMap['FEED:' + feed];
101
102 if (treeNode) {
103 treeNode = treeNode[0];
104 if (!is_cat) this._expandNode(treeNode);
105 this._selectNode(treeNode);
106 }
107 },
108 setFeedIcon: function(feed, is_cat, src) {
109 if (is_cat)
110 treeNode = this._itemNodesMap['CAT:' + feed];
111 else
112 treeNode = this._itemNodesMap['FEED:' + feed];
113
114 if (treeNode) {
115 treeNode = treeNode[0];
116 treeNode.iconNode.src = src;
117 return true;
118 }
119 return false;
120 },
121 setFeedExpandoIcon: function(feed, is_cat, src) {
122 if (is_cat)
123 treeNode = this._itemNodesMap['CAT:' + feed];
124 else
125 treeNode = this._itemNodesMap['FEED:' + feed];
126
127 if (treeNode) {
128 treeNode = treeNode[0];
129 treeNode.expandoNode.src = src;
130 return true;
131 }
132
133 return false;
134 },
135 hasCats: function() {
136 if (this.model.store && this.model.store._itemsByIdentity)
137 return this.model.store._itemsByIdentity['CAT:-1'] != undefined;
138 else
139 return false;
140 },
141 hideRead: function (hide, show_special) {
142 if (this.hasCats()) {
143
144 var tree = this;
145 var cats = this.model.store._arrayOfTopLevelItems;
146
147 cats.each(function(cat) {
148 var cat_unread = tree.hideReadFeeds(cat.items, hide, show_special);
149
150 var id = String(cat.id);
151 var node = tree._itemNodesMap[id];
152 var bare_id = parseInt(id.substr(id.indexOf(":")+1));
153
154 if (node) {
155 var check_unread = tree.model.getFeedUnread(bare_id, true);
156
157 if (hide && cat_unread == 0 && check_unread == 0) {
158 Effect.Fade(node[0].rowNode, {duration : 0.3,
159 queue: { position: 'end', scope: 'FFADE-' + id, limit: 1 }});
160 } else {
161 Element.show(node[0].rowNode);
162 ++cat_unread;
163 }
164 }
165 });
166
167 } else {
168 this.hideReadFeeds(this.model.store._arrayOfTopLevelItems, hide,
169 show_special);
170 }
171 },
172 hideReadFeeds: function (items, hide, show_special) {
173 var tree = this;
174 var cat_unread = 0;
175
176 items.each(function(feed) {
177 var id = String(feed.id);
178 var bare_id = parseInt(feed.bare_id);;
179
180 var unread = feed.unread[0];
181 var node = tree._itemNodesMap[id];
182
183 if (node) {
184 if (hide && unread == 0 && (bare_id > 0 || !show_special)) {
185 Effect.Fade(node[0].rowNode, {duration : 0.3,
186 queue: { position: 'end', scope: 'FFADE-' + id, limit: 1 }});
187 } else {
188 Element.show(node[0].rowNode);
189 ++cat_unread;
190 }
191 }
192 });
193
194 return cat_unread;
195 },
196 });