]> git.wh0rd.org Git - 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 });