Set 'error' icon when there are any account errors
[rox-postal.git] / accounts.py
blob34df241d89c336a9afc85f3cd8a4075bd409b0d1
1 import rox, gtk
2 from rox import Menu
4 ADD = 1
5 EDIT = 2
6 DELETE = 3
7 REVERT = 4
9 class AccountEditor(rox.Dialog):
10 last_row = 0
12 def __init__(self, account):
13 rox.Dialog.__init__(self)
14 self.set_title(_('Account Editor'))
15 self.set_size_request(300, -1)
16 self.account = account
17 self.table = gtk.Table(2, 4)
18 self.vbox.add(self.table)
19 self.add_str(_('Name: '), 'name', account.name)
20 self.add_num(_('Poll Time (minutes): '), 'polltime',
21 account.polltime, min = 0.1, max = 1440.0,
22 step = 0.1, page = 1, digits = 1)
23 self.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
24 self.set_default_response(gtk.RESPONSE_OK)
26 def add_row(self, label, widget):
27 n = self.last_row
28 self.table.attach(gtk.Label(label), 0, 1, n, n+1, 0, 0)
29 self.table.attach(widget, 1, 2, n, n+1, gtk.EXPAND|gtk.FILL, 0)
30 self.last_row += 1
32 def add_num(self, label, name, value, min=1, max=65535, step=1, page=10, digits=0):
33 entry = gtk.SpinButton()
34 entry.set_range(min, max)
35 entry.set_increments(step, page)
36 entry.set_digits(digits)
37 entry.set_value(value)
38 entry.connect('value-changed', self.set_num, name)
39 self.add_row(label, entry)
41 def set_num(self, widget, name):
42 if widget.get_digits() == 0:
43 self.account.__dict__[name] = widget.get_value_as_int()
44 else:
45 self.account.__dict__[name] = widget.get_value()
47 def add_str(self, label, name, value, visible=True):
48 entry = gtk.Entry()
49 entry.set_text(value)
50 entry.set_visibility(visible)
51 entry.connect('changed', self.set_str, name)
52 self.add_row(label, entry)
54 def set_str(self, widget, name):
55 self.account.__dict__[name] = widget.get_text()
57 def add_list(self, label, name, value):
58 string = ','.join(value)
59 entry = gtk.Entry()
60 entry.set_text(string)
61 entry.connect('changed', self.set_list, name)
62 self.add_row(label, entry)
64 def set_list(self, widget, name):
65 string = widget.get_text()
66 self.account.__dict__[name] = string.split(',')
68 def add_bool(self, label, name, value, text=None):
69 item = gtk.CheckButton(label=text)
70 item.set_active(value)
71 item.connect('toggled', self.set_bool, name)
72 self.add_row(label, item)
74 def set_bool(self, widget, name):
75 self.account.__dict__[name] = widget.get_active()
77 class MBOXEditor(AccountEditor):
78 def __init__(self, account):
79 AccountEditor.__init__(self, account)
80 self.set_title(_('MBOX Account Editor'))
81 self.add_str(_('Path: '), 'filename', account.filename)
82 self.show_all()
84 class IMAPEditor(AccountEditor):
85 def __init__(self, account):
86 AccountEditor.__init__(self, account)
87 self.set_title(_('IMAP Account Editor'))
88 self.add_str(_('Server: '), 'server', account.server)
89 self.add_num(_('Port: '), 'port', account.port, 1, 65535, 1, 100)
90 self.add_str(_('Username: '), 'username', account.username)
91 self.add_str(_('Password: '), 'password', account.password, False)
92 self.add_list(_('Folders: '), 'folders', account.folders)
93 self.add_bool(_('SSL: '), 'ssl', account.ssl)
94 self.show_all()
96 class POPEditor(AccountEditor):
97 def __init__(self, account):
98 AccountEditor.__init__(self, account)
99 self.set_title(_('POP Account Editor'))
100 self.add_str(_('Server: '), 'server', account.server)
101 self.add_num(_('Port: '), 'port', account.port, 1, 65535, 1, 100)
102 self.add_str(_('Username: '), 'username', account.username)
103 self.add_str(_('Password: '), 'password', account.password, False)
104 self.add_bool(_('SSL: '), 'ssl', account.ssl)
105 self.add_bool(_('APOP: '), 'apop', account.apop)
106 self.show_all()
109 class AccountList(rox.Dialog):
110 def __init__(self, accounts):
111 rox.Dialog.__init__(self)
112 self.set_title(_('Postal: Account Editor'))
114 hbox = gtk.HBox()
115 self.vbox.pack_start(hbox)
116 swin = gtk.ScrolledWindow()
117 swin.set_size_request(-1, 200)
118 hbox.pack_start(swin)
120 self.accts = gtk.ListStore(str, str, object)
121 if accounts != None:
122 for acct in accounts:
123 row = self.accts.append()
124 self.accts.set(row, 0, acct.name, 1, acct.protocol, 2, acct)
126 view = gtk.TreeView(self.accts)
127 view.append_column(gtk.TreeViewColumn(_('Name'), gtk.CellRendererText(), text=0))
128 view.append_column(gtk.TreeViewColumn(_('Type'), gtk.CellRendererText(), text=1))
129 view.connect('row-activated', self.select_row)
130 swin.add(view)
132 self.view = view
133 self.accounts = accounts
135 def response(self, resp):
136 if resp == EDIT:
137 self.edit()
138 elif resp == DELETE:
139 self.remove()
140 elif resp == ADD:
141 self.add()
142 else:
143 return False
144 self.emit_stop_by_name('response')
145 return True
147 self.connect('response', response)
148 self.add_button(gtk.STOCK_ADD, ADD)
149 self.add_button(gtk.STOCK_DELETE, DELETE)
150 self.add_button(gtk.STOCK_EDIT, EDIT)
151 self.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CANCEL)
152 self.set_default_response(gtk.RESPONSE_CANCEL)
154 self.vbox.show_all()
155 self.action_area.show_all()
157 def select_row(self, list, path, *stuff):
158 model = list.get_model()
159 row = model.get_iter(path)
160 account = model.get_value(row, 2)
161 self.edit_account(account)
163 def add(self):
164 items = []
165 items.append(Menu.Action(_('IMAP'), 'add_account', None, None, ('IMAP',)))
166 items.append(Menu.Action(_('POP'), 'add_account', None, None, ('POP',)))
167 items.append(Menu.Action(_('MBOX'), 'add_account', None, None, ('MBOX',)))
168 menu = Menu.Menu('choose', items)
169 menu.attach(self, self)
170 menu.popup(self, None)
172 def add_account(self, account_type):
173 if account_type == 'IMAP':
174 import imap_check
175 account = imap_check.IMAPChecker()
176 elif account_type == 'POP':
177 import pop_check
178 account = pop_check.POPChecker()
179 elif account_type == 'MBOX':
180 import mbox_check
181 account = mbox_check.MBOXChecker()
182 else:
183 return
184 self.edit_account(account)
185 self.accts.append([account.name, account.protocol, account])
186 self.accounts.append(account)
188 def remove(self):
189 model, row = self.view.get_selection().get_selected()
190 path = model.get_path(row)
191 model.remove(row)
192 del self.accounts[path[0]]
194 def edit(self):
195 model, row = self.view.get_selection().get_selected()
196 account = model.get_value(row, 2)
197 self.edit_account(account)
198 model.set(row, 0, account.name, 1, account.protocol, 2, account)
200 def edit_account(self, account):
201 if account.protocol == 'IMAP':
202 dlg = IMAPEditor(account)
203 elif account.protocol == 'MBOX':
204 dlg = MBOXEditor(account)
205 elif account.protocol == 'POP':
206 dlg = POPEditor(account)
207 else:
208 return
209 dlg.set_transient_for(self)
210 dlg.set_modal(True)
211 dlg.run()
212 dlg.destroy()