# For editing personalities of mailboxes
import gtk
import gobject
import ptk.misc_widgets
from ptk.big_edit_box import *
import personality
import utils
import string
import copy
class personalitybox(gtk.VBox):
def apply_changes(self):
self.user.personalities = self.userpersonalities
self.msgbox.personalities = self.ourpersonalities
self.msgbox.default_personality = self.default_personality
def __init__(self, msgbox, user, parent_win):
self.parent_win = parent_win
gtk.VBox.__init__(self, spacing=5)
self.set_border_width(5)
self.msgbox = msgbox
self.user = user
# Copies of stuff we are changing
self.default_personality = msgbox.default_personality
self.ourpersonalities = copy.deepcopy(msgbox.personalities)
self.userpersonalities = copy.deepcopy(user.personalities)
box1 = gtk.HBox(spacing=5)
self.pack_start(box1, expand=False)
box1.show()
label = gtk.Label(_("Default personality"))
box1.pack_start(label, expand=False)
label.show()
# Menu to select default personality
self.optmenu = gtk.combo_box_new_text ()
self.optmenu.connect("changed", self._change_default_personality)
self.update_optmenu()
box1.pack_start(self.optmenu)
self.optmenu.show()
box2 = gtk.HBox(spacing=5)
box2.set_size_request(-1, 100)
self.pack_start(box2)
box2.show()
self.selected = None
def _ourperson_clicked(_button, event, self=self):
selected = self.ourperson_list.get_path_at_pos (int (event.x), int (event.y))
if selected == None:
self.selected = None
self.edit_button.set_sensitive(False)
return
model = self.ourperson_list.get_model ()
iter = model.get_iter (selected[0])
self.ourperson_list_selected = model.get_value (iter, 1)
self.selected = self.ourperson_list_selected
# double-click opens edit box thingy
if event.type == gtk.gdk._2BUTTON_PRESS:
self.userpersonalities[self.ourperson_list_selected].edit_box(user, self)
if selected and (len(self.ourpersonalities) > 1):
self.edit_button.set_sensitive(True)
self.moveback_button.set_sensitive(True)
else:
self.moveback_button.set_sensitive(False)
def _userperson_clicked(_button, event, self=self):
selected = self.userperson_list.get_path_at_pos (int (event.x), int (event.y))
if selected == None:
self.selected = None
self.edit_button.set_sensitive(False)
return
model = self.userperson_list.get_model ()
iter = model.get_iter (selected[0])
self.userperson_list_selected = model.get_value (iter, 1)
self.selected = self.userperson_list_selected
# double-click opens edit box thingy
if event.type == gtk.gdk._2BUTTON_PRESS:
self.userpersonalities[self.userperson_list_selected].edit_box(user, self)
if selected:
self.move_button.set_sensitive(True)
self.delete_button.set_sensitive(True)
self.edit_button.set_sensitive(True)
self.copy_button.set_sensitive(True)
else:
self.move_button.set_sensitive(False)
self.delete_button.set_sensitive(False)
self.edit_button.set_sensitive(False)
self.copy_button.set_sensitive(False)
# List of our personalities
self.ourperson_list = gtk.TreeView ()
cell = gtk.CellRendererText ()
col = gtk.TreeViewColumn (_("Personalities"), cell, text=0)
self.ourperson_list.append_column (col)
model = gtk.ListStore (gobject.TYPE_STRING, gobject.TYPE_STRING)
self.ourperson_list.set_model (model)
self.ourperson_list_selected = None
self.ourperson_list.connect("button_press_event", _ourperson_clicked)
swin = gtk.ScrolledWindow()
swin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
swin.show()
swin.add(self.ourperson_list)
self.ourperson_list.show()
box2.pack_start(swin)
movebox = gtk.VBox()
box2.pack_start(movebox, expand=False)
movebox.show()
button = gtk.Button("<-")
button.connect("clicked", self.add_to_ourpersons)
movebox.pack_start(button)
button.set_sensitive(False)
button.show()
self.move_button = button
button = gtk.Button(_("->"))
button.connect("clicked", self.moveback_personality)
movebox.pack_start(button)
button.set_sensitive(False)
button.show()
self.moveback_button = button
# List of global personalities
self.userperson_list = gtk.TreeView ()
cell = gtk.CellRendererText ()
col = gtk.TreeViewColumn (_("Global personalities"), cell, text=0)
self.userperson_list.append_column (col)
model = gtk.ListStore (gobject.TYPE_STRING, gobject.TYPE_STRING)
self.userperson_list.set_model (model)
self.userperson_list_selected = None
self.userperson_list.connect("button_press_event", _userperson_clicked)
swin = gtk.ScrolledWindow()
swin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
swin.show()
swin.add(self.userperson_list)
self.userperson_list.show()
box2.pack_start(swin)
buttonbox = gtk.HBox(spacing=5)
self.pack_start(buttonbox, expand=False)
buttonbox.show()
button = gtk.Button(stock="gtk-delete")
button.connect("clicked", self.delete_global)
buttonbox.pack_end(button, expand=False)
button.set_sensitive(False)
button.show()
self.delete_button = button
button = gtk.Button(stock="gtk-copy")
button.connect("clicked", self.copy_personality)
buttonbox.pack_end(button, expand=False)
button.set_sensitive(False)
button.show()
self.copy_button = button
button = gtk.Button(" "+_("Edit")+" ")
button.connect("clicked", self.edit_global)
buttonbox.pack_end(button, expand=False)
button.set_sensitive(False)
button.show()
self.edit_button = button
button = gtk.Button(stock="gtk-new")
button.connect("clicked", self.new_personality)
buttonbox.pack_end(button, expand=False)
button.show()
self.update_personlist()
def get_personality_uid(self):
"""
Get a new unique personality ID (uid).
"""
i = 0
ids = self.userpersonalities.keys()
while 1:
if not str(i) in ids:
return str(i)
i = i + 1
def edit_global (self, _button=None):
self.userpersonalities[self.selected].edit_box(self.user, self)
def delete_global(self, _button):
"""
Delete a personality globally.
"""
uid = self.userperson_list_selected
def _find_personality(folder, uid=uid, ourfolder=self.msgbox):
if folder is ourfolder:
return
if folder.__dict__.has_key("personalities"):
if uid in folder.personalities:
return folder.name
if uid in self.ourpersonalities:
ptk.misc_widgets.InfoBox (_("Error"), _("You cannot delete the selected personality\nbecause this folders is using it."), gtk.STOCK_CANCEL, parent_win=self.parent_win)
return
# Are other folders using it?
others = utils.recurse_apply(self.user.contents, _find_personality)
if len(others) != 0:
ptk.misc_widgets.InfoBox (_("Error"), _("You cannot delete the selected personality\nbecause one or more folders are using it:\n%s") % string.join(others, ","), gtk.STOCK_CANCEL, parent_win=self.parent_win)
return
# Do it
del self.userpersonalities[uid]
self.update_personlist()
def add_to_ourpersons(self, _button):
"""
Add the selected global personality to our local ones.
"""
uid = self.userperson_list_selected
if not (uid in self.ourpersonalities):
self.ourpersonalities.append(uid)
self.update_personlist()
self.update_optmenu()
def copy_personality(self, _button):
"""
Add the selected global personality to our local ones.
"""
uid = self.userperson_list_selected
old = self.userpersonalities[uid]
new = copy.copy(old)
new.pname = "Copy of "+new.pname
new.uid = self.get_personality_uid()
self.userpersonalities[new.uid] = new
self.ourpersonalities.append(new.uid)
self.update_personlist()
self.update_optmenu()
def new_personality(self, _button):
p = personality.personality(_("New personality"))
p.uid = self.get_personality_uid()
self.userpersonalities[p.uid] = p
self.ourpersonalities.append(p.uid)
self.update_personlist()
self.update_optmenu()
def moveback_personality(self, _button):
uid = self.ourperson_list_selected
self.ourpersonalities.remove (uid)
self.update_personlist()
self.update_optmenu()
def update_personlist(self):
model = self.ourperson_list.get_model ()
model.clear ()
for i in self.ourpersonalities:
iter = model.append ()
model.set (iter, 0, self.userpersonalities[i].pname, 1, i)
if self.ourperson_list_selected == None:
self.moveback_button.set_sensitive(False)
if self.userperson_list_selected == None:
self.delete_button.set_sensitive(False)
self.edit_button.set_sensitive(False)
self.move_button.set_sensitive(False)
self.copy_button.set_sensitive(False)
model = self.userperson_list.get_model ()
model.clear ()
for i in self.userpersonalities.keys():
iter = model.append ()
model.set (iter, 0, self.userpersonalities[i].pname, 1, i)
def _change_default_personality(self, item):
index = self.optmenu.get_active ()
uid = self.userpersonalities[self.ourpersonalities[index]].uid
self.default_personality = uid
def update_optmenu(self):
self.optmenu.get_model ().clear ()
# Default personality menu
for i in range (0, len (self.ourpersonalities)):
p = self.userpersonalities[self.ourpersonalities[i]]
self.optmenu.append_text (p.pname)
try:
self.optmenu.set_active (self.ourpersonalities.index(self.default_personality))
except ValueError:
# Eek. We deleted our default. Just set default to first in list
self.optmenu.set_active (0)
uid = self.ourpersonalities[0]
self.default_personality = uid
syntax highlighted by Code2HTML, v. 0.9.1