Commit 8d9516a5 authored by John (J5) Palmieri's avatar John (J5) Palmieri

add ListStore, TreeStore and TreeViewColumn APIs

* this is enough to support the gtk-demo.py shell
* TreeStore and ListStore allow passing in as an argument list
  of either python or GLib types to the constructor as a description
  of the columns in the model
* TreeStore and ListStore override the append method, allowing
  the application developer to send in a list of column values
  for one row in the model.  Unlike the append in C which
  just returns an iter that you can then add data to,
  this append actualy appends data in one step
* TreeViewColumn overrides the constructor to allow the adding
  of attributes and a cell renderer when constructing the
  column

https://bugzilla.gnome.org/show_bug.cgi?id=620405
parent c305fbeb
......@@ -340,6 +340,65 @@ class TextBuffer(Gtk.TextBuffer):
TextBuffer = override(TextBuffer)
__all__.append('TextBuffer')
class ListStore(Gtk.ListStore):
def __init__(self, *column_types):
Gtk.ListStore.__init__(self)
self.set_column_types(column_types)
def append(self, row):
treeiter = Gtk.TreeIter()
Gtk.ListStore.append(self, treeiter)
n_columns = self.get_n_columns();
if len(row) != n_columns:
raise ValueError('row sequence has the incorrect number of elements')
for i in range(n_columns):
if row[i] is not None:
self.set_value(treeiter, i, row[i])
return treeiter
ListStore = override(ListStore)
__all__.append('ListStore')
class TreeStore(Gtk.TreeStore):
def __init__(self, *column_types):
Gtk.TreeStore.__init__(self)
self.set_column_types(column_types)
def append(self, parent, row):
treeiter = Gtk.TreeIter()
Gtk.TreeStore.append(self, treeiter, parent)
n_columns = self.get_n_columns();
if len(row) != n_columns:
raise ValueError('row sequence has the incorrect number of elements')
for i in xrange(n_columns):
if row[i] is not None:
self.set_value(treeiter, i, row[i])
return treeiter
TreeStore = override(TreeStore)
__all__.append('TreeStore')
class TreeViewColumn(Gtk.TreeViewColumn):
def __init__(self, title='',
cell_renderer=None,
**attributes):
Gtk.TreeViewColumn.__init__(self, title=title)
if cell_renderer:
self.pack_start(cell_renderer, True)
for (name, value) in attributes.iteritems():
self.add_attribute(cell_renderer, name, value)
TreeViewColumn = override(TreeViewColumn)
__all__.append('TreeViewColumn')
import sys
initialized, argv = Gtk.init_check(sys.argv)
......
......@@ -156,6 +156,75 @@ class TestGtk(unittest.TestCase):
button = dialog.get_widget_for_response (Gtk.ResponseType.CLOSE)
self.assertEquals(Gtk.STOCK_CLOSE, button.get_label())
def test_tree_api(self):
self.assertEquals(Gtk.TreeStore, overrides.Gtk.TreeStore)
self.assertEquals(Gtk.ListStore, overrides.Gtk.ListStore)
self.assertEquals(Gtk.TreeViewColumn, overrides.Gtk.TreeViewColumn)
class TestClass(GObject.GObject):
__gtype_name__ = "GIOverrideTreeAPITest"
def __init__(self, tester, int_value, string_value):
super(TestClass, self).__init__()
self.tester = tester
self.int_value = int_value
self.string_value = string_value
def check(self, int_value, string_value):
self.tester.assertEquals(int_value, self.int_value)
self.tester.assertEquals(string_value, self.string_value)
# check TreeStore
# FIXME: we should be able to pass strings like 'TestClass'
tree_store = Gtk.TreeStore(int, str, TestClass)
parent = None
for i in xrange(100):
label = 'this is child #%d' % i
testobj = TestClass(self, i, label)
parent = tree_store.append(parent, (i, label, testobj))
# walk the tree to see if the values were stored correctly
iter = Gtk.TreeIter()
parent = None
i = 0
while tree_store.iter_children(iter, parent):
i = tree_store.get_value(iter, 0)
s = tree_store.get_value(iter, 1)
obj = tree_store.get_value(iter, 2)
obj.check(i, s)
parent = iter
iter = Gtk.TreeIter()
self.assertEquals(i, 99)
# check ListStore
# FIXME: we should be able to pass strings like 'TestClass'
list_store = Gtk.ListStore(int, str, TestClass)
for i in xrange(100):
label = 'this is row #%d' % i
testobj = TestClass(self, i, label)
parent = list_store.append((i, label, testobj))
# walk the list to see if the values were stored correctly
iter = Gtk.TreeIter()
i = 0
has_more = list_store.get_iter_first(iter)
while has_more:
i = list_store.get_value(iter, 0)
s = list_store.get_value(iter, 1)
obj = list_store.get_value(iter, 2)
obj.check(i, s)
has_more = list_store.iter_next(iter)
self.assertEquals(i, 99)
# check to see that we can instantiate a TreeViewColumn
cell = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(title='This is just a test',
cell_renderer=cell,
text=0,
style=2)
def test_text_buffer(self):
self.assertEquals(Gtk.TextBuffer, overrides.Gtk.TextBuffer)
buffer = Gtk.TextBuffer()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment