From 37e5cec4a8208b7bfdf963716db52c2cf2092bac Mon Sep 17 00:00:00 2001 From: Gian Mario Tagliaretti Date: Sun, 29 Jul 2007 21:17:54 +0000 Subject: add wrapping/unwrapping of GtkTreeItermethods to gtk.GenericTreeModel, fix #388754. by Paul Pogonyshev svn path=/trunk/; revision=2868 --- examples/Makefile.am | 1 + examples/gtk/customtreemodel.py | 177 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 examples/gtk/customtreemodel.py (limited to 'examples') diff --git a/examples/Makefile.am b/examples/Makefile.am index 2407b296..e53dbbd3 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -20,6 +20,7 @@ EXTRA_DIST = \ gobject/properties.py \ gobject/signal.py \ gtk/bin.py \ + gtk/customtreemodel.py \ gtk/filechooser.py \ gtk/scrollable.py \ gtk/sizegroup.py \ diff --git a/examples/gtk/customtreemodel.py b/examples/gtk/customtreemodel.py new file mode 100644 index 00000000..27335dce --- /dev/null +++ b/examples/gtk/customtreemodel.py @@ -0,0 +1,177 @@ +#! /usr/bin/env python + +import sys +import weakref + +import pango +import gtk + + +class SimpleListTreeModel(gtk.GenericTreeModel): + + def on_get_flags(self): + return gtk.TREE_MODEL_LIST_ONLY + + def __init__(self, *values): + gtk.GenericTreeModel.__init__(self) + self.__values = list(values) + + self.props.leak_references = False + + # This is only needed to make the model gc-safe, since + # leak_references is False. + self.__iters = range(0, len(values)) + + def on_get_n_columns(self): + return 0 + + def on_get_column_type(self, index): + raise NotImplementedError + + def on_get_value(self, row, column): + raise NotImplementedError + + def on_get_iter(self, path): + return self.__iters[path[0]] + + def on_get_path(self, row): + return(row,) + + def on_iter_parent(self, row): + return None + + def on_iter_next(self, row): + if row + 1 < len(self.__values): + return self.__iters[row + 1] + else: + return None + + def on_iter_has_child(self, row): + return False + + def on_iter_children(self, row): + if row is None: + return self.__iters[0] + else: + return None + + def on_iter_n_children(self, row): + if row is None: + return len(self.__values) + else: + return 0 + + def on_iter_nth_child(self, parent, n): + if parent: + return None + else: + return self.__iters[n] + + + def __len__ (self): + return len(self.__values) + + def __getitem__ (self, key): + return self.__values[self.get_user_data(key)] + + def __iter__ (self): + return iter(self.__values) + + def __contains__ (self, value): + return value in self.__values + + + def insert(self, index_or_iter, new_value): + if isinstance(index_or_iter, gtk.TreeIter): + index_or_iter = self.get_user_data(index_or_iter) + + self.__values.insert(index_or_iter, new_value) + self.__iters.append(len(self.__iters)) + + titer = self.create_tree_iter(self.__iters[index_or_iter]) + self.row_inserted(self.get_path(titer), titer) + + +class Food(object): + + def __init__(self, name, description=None): + self.name = name + self.description = description + + def set_to_text_renderer(column, cell, model, iter): + value = model[iter] + + cell.props.text = value.name + + if value.description is None: + cell.props.weight = pango.WEIGHT_BOLD + else: + cell.props.weight = pango.WEIGHT_NORMAL + + set_to_text_renderer = staticmethod(set_to_text_renderer) + + +def generate_values(): + yield Food('Fruits') + yield Food('Apple', 'Round and red. Or green. Or yellow.') + yield Food('Orange', 'Juicy') + yield Food('Vegetables') + yield Food('Tomato', 'Red and juicy.') + yield Food('Cucumber', 'Long and hard.') + +def insert_item(*ignored): + model, titer = tree_view.get_selection().get_selected() + + if titer is None or model[titer].description is None: + dialog = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK, + message_format='Please select something. And not a header!') + dialog.run() + dialog.destroy() + else: + model.insert(titer, Food('Random name', 'Some random, but useful description.')) + +def show_description(*ignored): + model, titer = tree_view.get_selection().get_selected() + + if titer is None or model[titer].description is None: + dialog = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK, + message_format='Please select something. And not a header!') + else: + dialog = gtk.MessageDialog(buttons=gtk.BUTTONS_OK, + message_format=model[titer].description) + + dialog.run() + dialog.destroy() + +window = gtk.Window() +tree_model = SimpleListTreeModel(*generate_values()) +tree_view = gtk.TreeView(tree_model) +scrolled_window = gtk.ScrolledWindow() +vertical_box = gtk.VBox(False, 6) +button_box = gtk.HButtonBox() +insert = gtk.Button('Insert') +description = gtk.Button('Show Description') + +scrolled_window.add(tree_view) +vertical_box.pack_start(scrolled_window) +vertical_box.pack_start(button_box, False, False) +button_box.pack_start(insert) +button_box.pack_start(description) +window.add(vertical_box) + +tree_view.set_headers_visible(False) + +text_renderer = gtk.CellRendererText() +column = gtk.TreeViewColumn(None, text_renderer) + +column.set_cell_data_func(text_renderer, Food.set_to_text_renderer) +tree_view.append_column(column) + +insert.connect('clicked', insert_item) +description.connect('clicked', show_description) +window.connect('destroy', lambda window: gtk.main_quit()) + +window.resize(400, 500) +window.show_all() + +gtk.main() -- cgit v1.2.1