Added ability for ListModel to hold treeview, using new dictionary-based dlist, with new visible_col support
svn: r16237
This commit is contained in:
parent
b5f121436b
commit
2b43bf1046
@ -75,27 +75,35 @@ class ListModel(object):
|
||||
select_func: Function called when the TreeView selection changes.
|
||||
event_func: Function called when the user double-clicks on a row.
|
||||
mode: Selection mode for TreeView. See Gtk documentation.
|
||||
list_mode: "list" or "tree"
|
||||
"""
|
||||
|
||||
def __init__(self, tree, dlist, select_func=None, event_func=None,
|
||||
mode=gtk.SELECTION_SINGLE):
|
||||
mode=gtk.SELECTION_SINGLE, list_mode="list"):
|
||||
|
||||
self.tree = tree
|
||||
self.tree.set_fixed_height_mode(True)
|
||||
self.mylist = []
|
||||
self.data_index = 0
|
||||
self.sel_iter = None
|
||||
self.list_mode = list_mode # "list", or "tree"
|
||||
|
||||
for info in dlist:
|
||||
if len(info) > 3:
|
||||
if info[3] == TOGGLE:
|
||||
self.mylist.append(bool)
|
||||
elif info[3] == IMAGE:
|
||||
self.mylist.append(gtk.gdk.Pixbuf)
|
||||
elif info[3] == INTEGER:
|
||||
self.mylist.append(int)
|
||||
elif info[3] == COLOR:
|
||||
self.mylist.append(str)
|
||||
col_type = TEXT
|
||||
if isinstance(info, (list, tuple)):
|
||||
if len(info) > 3:
|
||||
col_type = info[3]
|
||||
elif isinstance(info, dict):
|
||||
col_type = info.get("type", TEXT)
|
||||
# Now, add columns:
|
||||
if col_type == TOGGLE:
|
||||
self.mylist.append(bool)
|
||||
elif col_type == IMAGE:
|
||||
self.mylist.append(gtk.gdk.Pixbuf)
|
||||
elif col_type == INTEGER:
|
||||
self.mylist.append(int)
|
||||
elif col_type == COLOR:
|
||||
self.mylist.append(str)
|
||||
else:
|
||||
self.mylist.append(str)
|
||||
self.data_index += 1
|
||||
@ -128,15 +136,25 @@ class ListModel(object):
|
||||
renderer.set_property('height', const.THUMBSCALE / 2)
|
||||
return renderer, column
|
||||
|
||||
|
||||
def __build_columns(self, dlist):
|
||||
"""
|
||||
Builds the columns based of the data in dlist
|
||||
"""
|
||||
cnum = 0
|
||||
|
||||
for name in [item for item in dlist if item[2]]:
|
||||
|
||||
for item in dlist:
|
||||
visible_col = None
|
||||
if isinstance(item, (list, tuple)):
|
||||
if not item[2]:
|
||||
continue
|
||||
else:
|
||||
# [name, sort_id, width, [type, [editable, [callback]]]
|
||||
name = item
|
||||
elif isinstance(item, dict):
|
||||
# valid fields: name, sort_id, width, type, editable, callback, visible_col
|
||||
name = [item.get("name", " "), item.get("sort_id", NOSORT), item.get("width", 10),
|
||||
item.get("type", TEXT), item.get("editable", False), item.get("callback", None)]
|
||||
visible_col = item.get("visible_col", None)
|
||||
if len(name) == 3:
|
||||
name = (name[0], name[1], name[2], TEXT, False, None)
|
||||
elif len(name) == 4:
|
||||
@ -146,7 +164,10 @@ class ListModel(object):
|
||||
|
||||
if name[0] and name[3] == TOGGLE:
|
||||
renderer = gtk.CellRendererToggle()
|
||||
column = gtk.TreeViewColumn(name[0], renderer)
|
||||
if visible_col is not None:
|
||||
column = gtk.TreeViewColumn(name[0], renderer, visible=visible_col)
|
||||
else:
|
||||
column = gtk.TreeViewColumn(name[0], renderer)
|
||||
column.add_attribute(renderer, 'active', cnum)
|
||||
if name[4]:
|
||||
renderer.set_property('activatable', True)
|
||||
@ -159,7 +180,11 @@ class ListModel(object):
|
||||
renderer, column = self.__build_image_column(cnum, name, renderer, column)
|
||||
elif name[0] and name[3] == COLOR:
|
||||
renderer = gtk.CellRendererText()
|
||||
column = gtk.TreeViewColumn(name[0], renderer, background=cnum)
|
||||
if visible_col is not None:
|
||||
column = gtk.TreeViewColumn(name[0], renderer, background=cnum,
|
||||
visible=visible_col)
|
||||
else:
|
||||
column = gtk.TreeViewColumn(name[0], renderer, background=cnum)
|
||||
else:
|
||||
renderer = gtk.CellRendererText()
|
||||
renderer.set_fixed_height_from_font(True)
|
||||
@ -171,7 +196,10 @@ class ListModel(object):
|
||||
self.function[cnum] = name[5]
|
||||
else:
|
||||
renderer.set_property('editable', False)
|
||||
column = gtk.TreeViewColumn(name[0], renderer, text=cnum)
|
||||
if visible_col is not None:
|
||||
column = gtk.TreeViewColumn(name[0], renderer, text=cnum, visible=visible_col)
|
||||
else:
|
||||
column = gtk.TreeViewColumn(name[0], renderer, text=cnum)
|
||||
column.set_reorderable(True)
|
||||
column.set_min_width(name[2])
|
||||
|
||||
@ -232,8 +260,10 @@ class ListModel(object):
|
||||
del self.model
|
||||
del self.selection
|
||||
self.count = 0
|
||||
|
||||
self.model = gtk.ListStore(*self.mylist)
|
||||
if self.list_mode == "list":
|
||||
self.model = gtk.ListStore(*self.mylist)
|
||||
elif self.list_mode == "tree":
|
||||
self.model = gtk.TreeStore(*self.mylist)
|
||||
self.selection = self.tree.get_selection()
|
||||
self.selection.set_mode(self.mode)
|
||||
self.sel_iter = None
|
||||
@ -394,23 +424,35 @@ class ListModel(object):
|
||||
"""
|
||||
return [ self.model.get_value(node, c) for c in cols ]
|
||||
|
||||
def add(self, data, info=None, select=0):
|
||||
def add(self, data, info=None, select=0, node=None):
|
||||
"""
|
||||
Add the data to the model at the end of the model
|
||||
"""
|
||||
self.count += 1
|
||||
node = self.model.append()
|
||||
col = 0
|
||||
for obj in data:
|
||||
self.model.set_value(node, col, obj)
|
||||
col += 1
|
||||
self.model.set_value(node, col, info)
|
||||
|
||||
need_to_set = True
|
||||
# Create the node:
|
||||
if self.list_mode == "list":
|
||||
node = self.model.append()
|
||||
elif self.list_mode == "tree":
|
||||
if node is None: # new node
|
||||
node = self.model.append(None, data + [None])
|
||||
need_to_set = False
|
||||
else: # use a previous node, passed in
|
||||
node = self.model.append(node)
|
||||
# Add data:
|
||||
if need_to_set:
|
||||
col = 0
|
||||
for obj in data:
|
||||
self.model.set_value(node, col, obj)
|
||||
col += 1
|
||||
self.model.set_value(node, col, info)
|
||||
# Set info and select:
|
||||
if info is not None:
|
||||
self.idmap[str(info)] = node
|
||||
if select:
|
||||
self.sel_iter = node
|
||||
self.selection.select_iter(self.sel_iter)
|
||||
# Return created node
|
||||
return node
|
||||
|
||||
def set(self, node, data, info=None, select=0):
|
||||
|
Loading…
Reference in New Issue
Block a user