import gtk
import gobject
from time import strftime
from pyneheaders import *
import pynei18n
COL_NAME = 0
COL_STATS = 1
COL_UID = 2
class folder_tree(gtk.TreeView):
"""
A TreeView specifically for showing user.contents
mailboxes.
"""
def __init__(self, user):
gtk.TreeView.__init__(self)
cell = gtk.CellRendererText()
self.append_column(gtk.TreeViewColumn(_("Boxes"), cell, text=COL_NAME))
self.append_column(gtk.TreeViewColumn(_("Items"), cell, text=COL_STATS))
#self.set_column_width(0, 150)
#self.set_expander_style(gtk.CTREE_EXPANDER_SQUARE)
#self.set_line_style(gtk.CTREE_LINES_DOTTED)
# Last user clicked folder (used in DND to determine source)
self.user_selected = None
self.button_press_function = None
self.cur_contents = None # remember last contents shown
# currently unused
self.set_model(gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING))
#self.open_folder_uid = None
#self.open_folder = None
self.user = user
# setup DND
targets = [ ("pyne_boxid", 0, -1) ]
def dnd_drag_data_get(w, context, selection_data, info, time, self=self):
# give folder.uid
selected = str(self.user_selected)
selection_data.set(selection_data.target, 8, selected)
self.connect("drag_data_get", dnd_drag_data_get)
self.drag_source_set(gtk.gdk.BUTTON1_MASK|gtk.gdk.BUTTON3_MASK, targets, gtk.gdk.ACTION_MOVE)
def click_tree_item(w, event, self=self):
"""
Update self.user_selected if anything was clicked on.
"""
mousebutton = event.button
# Absolute coords of click in the tree view
x, y = event.x, event.y# - w.get_vadjustment().get_value()
# Ignore right mouse button
path = w.get_path_at_pos(int(x), int(y))
if path == None:
# Didn't click on a folder
return
iter = self.get_model().get_iter(path[0])
uid = self.get_model().get_value(iter, 2)
selected_folder = self.user.get_folder_by_uid(uid)
if selected_folder == None:
return
# remember selected item
self.user_selected = selected_folder.uid
# Call secondary event handler
if self.button_press_function != None:
self.button_press_function(w, event, self)
self.connect("button_press_event", click_tree_item)
def get_selected_folder_uids(self):
"""
Return list of selected folder uids.
"""
uids = []
def _get_uids(w, path, iter):
uid = self.get_model().get_value(iter, COL_UID)
uids.append(uid)
self.get_selection().selected_foreach(_get_uids)
return uids
def connect_button_press_event(self, function):
"""
Allow "button_press_event"s to be passed to a secondary
function for things like right click menus and doing more
than just remembering what is selected :-)
"""
self.button_press_function = function
def update(self, contents, update_all=0):
"""
Update view of mailboxes... :-/
contents=None if just update currently shown.
"""
if contents == None and self.cur_contents != None:
contents = self.cur_contents
# remember expanded nodes
expanded = []
expand_paths = []
def _addexpanded(liststore, path, iter):
# Add uid if it is an expanded node
if self.row_expanded(path):
expanded.append(self.get_model().get_value(iter, 2))
# Redrawing same folder. Remember what nodes are expanded.
self.get_model().foreach(_addexpanded)
# remember selected nodes
selected = []
select_paths = []
def _addselected(liststore, path, iter):
selected.append(self.get_model().get_value(iter, 2))
self.get_selection().selected_foreach(_addselected)
# remember last contents shown
self.cur_contents = contents
def build_tree(tree_store, folder, parent):
if parent == None:
# 'user' node is root
iter = tree_store.append(None)
tree_store.set(iter, 0, "User", 1, "")
else:
iter = tree_store.append(parent)
tree_store.set(iter, COL_NAME, folder.name, COL_STATS, str(folder.getstats()[0]), COL_UID, folder.uid)
if folder.uid in expanded:
expand_paths.append(tree_store.get_path(iter))
if folder.uid in selected:
select_paths.append(tree_store.get_path(iter))
# Recurse into children
if folder.__dict__.has_key("contents"):
for kid in folder.contents:
build_tree(tree_store, kid, iter)
tree_store = self.get_model()
tree_store.clear()
build_tree(tree_store, contents, None)
self.expand_row((0,), False)
# Expand previously expanded nodes
for path in expand_paths:
self.expand_row(path, False)
# select previously selected folder(s)
for path in select_paths:
self.get_selection().select_path(path)
syntax highlighted by Code2HTML, v. 0.9.1