Fix previous commit
[debian/pino.git] / src / account_action.vala
1 /* account_action.vala
2  *
3  * Copyright (C) 2009-2010  troorl
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  *
18  * Author:
19  *      troorl <troorl@gmail.com>
20  */
21
22 using Gtk;
23 using Gee;
24 using Auth;
25 using RestAPI;
26
27 public class AccountAction : Action {
28         
29         private Accounts accounts;
30         private MenuItem menu_item;
31         private ToolButton tool_item;
32         private Icon default_icon;
33         private Menu menu;
34         
35         private RestAPIAcc api;
36         private Cache cache;
37         
38         weak Thread thread_1;
39         
40         public AccountAction() {
41                 name = "AccountAct";
42                 label = _("Accounts");
43                 tooltip = null;
44                 stock_id = null;
45                 
46                 default_icon = Icon.new_for_string(Config.USERPIC_PATH);
47                 set_gicon(default_icon);
48         }
49         
50         /* set item linked with this action */
51         public void set_ui(UIManager ui, Cache _cache) {
52                 menu_item = (MenuItem)ui.get_widget("/MenuBar/EditMenu/AccountAct");
53                 tool_item = (ToolButton)ui.get_widget("/ToolBar/AccountAct");
54                 
55                 cache = _cache;
56                 
57                 setup();
58                 
59                 
60                 tool_item.clicked.connect(() => {
61                         menu.popup(null, null, null, 1, 0);
62                 });
63         }
64         
65         /* setup accounts in submenu */
66         private void setup() {
67                 menu = new Menu();
68                 
69                 unowned SList<RadioMenuItem> group = null;
70                 
71                 foreach(Account acc in accounts.accounts) {
72                         RadioMenuItem item = new RadioMenuItem.with_label(group,
73                                 "%s (%s)".printf(acc.login, acc.service));
74                         group = item.get_group();
75                         item.active = acc.active;
76                         
77                         item.toggled.connect(() => {
78                                 if(item.active) {
79                                         accounts.set_active_account(acc.login + acc.service + acc.proxy);
80                                         accounts.write();
81                                 }
82                         });
83                         
84                         menu.append(item);
85                 }
86                 
87                 menu_item.set_submenu(menu);
88                 menu.show_all();
89         }
90         
91         private void icon_setup() {
92         
93         }
94         
95         public void set_accounts(Accounts _accounts) {
96                 accounts = _accounts;
97                 var acc = accounts.get_current_account();
98                 api = new RestAPIAcc(acc);
99                 accounts.changed.connect(() => {
100                         setup();
101                 });
102                 
103                 accounts.active_changed.connect(() => {
104                         var accc = accounts.get_current_account();
105                         api.set_auth(accc);
106                         update_icon();
107                         tooltip = "%s (%s)".printf(accc.login, accc.service);
108                 });
109                 
110                 update_icon();
111                 tooltip = "%s (%s)".printf(acc.login, acc.service);
112         }
113         
114         public void update_icon() {
115                 if (!Thread.supported()) {
116                         error("Cannot run without threads.");
117                         return;
118                 }
119                 
120                 try {
121                         thread_1 = Thread.create(get_userpic, false);
122                 } catch(ThreadError e) {
123                         warning("Error: %s", e.message);
124                         return;
125         }
126         }
127         
128         private void *get_userpic() {
129                 string? url = null;
130                 
131                 try {
132                         url = api.get_userpic_url();
133                 } catch(RestError e) {
134                         return null;
135                 } catch(ParseError e) {
136                         return null;
137                 }
138                 
139                 if(url == null) {
140                         set_gicon(default_icon);
141                         return null;
142                 }
143                 
144                 string path = cache.get_or_download(url, Cache.Method.SYNC, true);
145                 
146                 Icon icon = Icon.new_for_string(path);
147                 set_gicon(icon);
148                 
149                 return null;
150         }
151 }