diff options
Diffstat (limited to 'examples/pygtk-demo/demos/editable_cells.py')
-rw-r--r-- | examples/pygtk-demo/demos/editable_cells.py | 268 |
1 files changed, 145 insertions, 123 deletions
diff --git a/examples/pygtk-demo/demos/editable_cells.py b/examples/pygtk-demo/demos/editable_cells.py index 07d198d9..a8acb5c3 100644 --- a/examples/pygtk-demo/demos/editable_cells.py +++ b/examples/pygtk-demo/demos/editable_cells.py @@ -1,144 +1,166 @@ -"""Tree View/Editable Cells +#!/usr/bin/env python +'''Tree View/Editable Cells -This demo demonstrates the use of editable cells in a GtkTreeView. If -you're new to the GtkTreeView widgets and associates, look into -the GtkListStore example first. - -""" - -description = 'Editable cells' +This demo demonstrates the use of editable cells in a GtkTreeView. +If you're new to the GtkTreeView widgets and associates, look into the +GtkListStore example first.''' +# pygtk version: Maik Hertha <maik.hertha@berlin.de> import gobject import gtk -from gtk import TRUE, FALSE - -COLUMN_NUMBER = 0 -COLUMN_PRODUCT = 1 -COLUMN_EDITABLE = 2 - -ARTICLES = [ - [3, "bottles of coke", TRUE], - [5, "packages of noodles", TRUE], - [2, "packages of chocolate chip cookies", TRUE], - [1, "can vanilla ice cream", TRUE], - [6, "eggs", TRUE] + +# columns +( + COLUMN_NUMBER, + COLUMN_PRODUCT, + COLUMN_EDITABLE +) = range(3) + +# data +articles = [ + [ 3, "bottles of coke", True ], + [ 5, "packages of noodles", True ], + [ 2, "packages of chocolate chip cookies", True ], + [ 1, "can vanilla ice cream", True ], + [ 6, "eggs", True ] ] -def create_model(): - # create model - model = gtk.ListStore(gobject.TYPE_INT, - gobject.TYPE_STRING, - gobject.TYPE_BOOLEAN) +class EditableCellsDemo(gtk.Window): + def __init__(self, parent=None): + gtk.Window.__init__(self) + try: + self.set_screen(parent.get_screen()) + except AttributeError: + self.connect('destroy', lambda *w: gtk.main_quit()) + self.set_title(self.__class__.__name__) + self.set_border_width(5) + self.set_default_size(320, 200) + + vbox = gtk.VBox(False, 5) + self.add(vbox) + + label = gtk.Label("Shopping list (you can edit the cells!)") + vbox.pack_start(label, False, False) + + sw = gtk.ScrolledWindow() + sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) + sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + vbox.pack_start(sw) + + # create model + model = self.__create_model() + + # create tree view + treeview = gtk.TreeView(model) + treeview.set_rules_hint(True) + treeview.get_selection().set_mode(gtk.SELECTION_SINGLE) + + self.__add_columns(treeview) + + sw.add(treeview) + + # some buttons + hbox = gtk.HBox(True, 4) + vbox.pack_start(hbox, False, False) + + button = gtk.Button("Add item") + button.connect("clicked", self.on_add_item_clicked, model) + hbox.pack_start(button) + + button = gtk.Button("Remove item") + button.connect("clicked", self.on_remove_item_clicked, treeview) + hbox.pack_start(button) + + self.show_all() + + def __create_model(self): + + # create list store + model = gtk.ListStore( + gobject.TYPE_INT, + gobject.TYPE_STRING, + gobject.TYPE_BOOLEAN + ) + + # add items + for item in articles: + iter = model.append() + + model.set (iter, + COLUMN_NUMBER, item[COLUMN_NUMBER], + COLUMN_PRODUCT, item[COLUMN_PRODUCT], + COLUMN_EDITABLE, item[COLUMN_EDITABLE] + ) + return model + + + def __add_columns(self, treeview): + + model = treeview.get_model() + + # number column + renderer = gtk.CellRendererText() + renderer.connect("edited", self.on_cell_edited, model) + renderer.set_data("column", COLUMN_NUMBER) + + column = gtk.TreeViewColumn("Number", renderer, text=COLUMN_NUMBER, + editable=COLUMN_EDITABLE) + treeview.append_column(column) + + # product column + renderer = gtk.CellRendererText() + renderer.connect("edited", self.on_cell_edited, model) + renderer.set_data("column", COLUMN_PRODUCT) + + column = gtk.TreeViewColumn("Product", renderer, text=COLUMN_PRODUCT, + editable=COLUMN_EDITABLE) + treeview.append_column(column) + + + def on_add_item_clicked(self, button, model): + new_item = [0, "Description here", True] + articles.append(new_item) - # insert articles - for article in ARTICLES: iter = model.append() - model.set(iter, - COLUMN_NUMBER, article[0], - COLUMN_PRODUCT, article[1], - COLUMN_EDITABLE, article[2]) - return model - -def add_item(button, model): - item = [0, "Description here", TRUE] - - ARTICLES.append(item) - - iter = model.append() - model.set(iter, - COLUMN_NUMBER, item[0], - COLUMN_PRODUCT, item[1], - COLUMN_EDITABLE, item[2]) - -def remove_item(button, treeview): - selection = treeview.get_selection() - selected = selection.get_selected() - if selected: - model, iter = selected - i = model.get_path(iter)[0] - model.remove(iter) - ARTICLES.pop(i) - -def cell_edited (cell, row, new_text, model): - article = ARTICLES[int(row)] - iter = model.get_iter_from_string(row) - - column = cell.get_data("column") - if column == COLUMN_NUMBER: - article[column] = int(new_text) - model.set(iter, column, article[column]) - elif column == COLUMN_PRODUCT: - article[column] = new_text - model.set(iter, column, article[column]) - -def add_columns(treeview): - model = treeview.get_model() - - # number column - renderer = gtk.CellRendererText() - renderer.connect('edited', cell_edited, model) - renderer.set_data('column', COLUMN_NUMBER) - treeview.insert_column_with_attributes(-1, 'Number', renderer, - text=COLUMN_NUMBER, - editable=COLUMN_EDITABLE) - # product column - renderer = gtk.CellRendererText() - renderer.connect('edited', cell_edited, model) - renderer.set_data('column', COLUMN_PRODUCT) - - treeview.insert_column_with_attributes(-1, 'Number', renderer, - text=COLUMN_PRODUCT, - editable=COLUMN_EDITABLE) - -def main(): - # create window, etc - window = gtk.Window() - window.set_title('Shopping list') - window.set_border_width(5) - window.connect('destroy', lambda win: gtk.mainquit()) + model.set (iter, + COLUMN_NUMBER, new_item[COLUMN_NUMBER], + COLUMN_PRODUCT, new_item[COLUMN_PRODUCT], + COLUMN_EDITABLE, new_item[COLUMN_EDITABLE] + ) - vbox = gtk.VBox() - window.add(vbox) - label = gtk.Label("Shopping list (you can edit the cells!)") - vbox.pack_start(label, FALSE, FALSE) + def on_remove_item_clicked(self, button, treeview): - sw = gtk.ScrolledWindow() - sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) - sw.set_policy(gtk.POLICY_AUTOMATIC, - gtk.POLICY_AUTOMATIC) - vbox.pack_start(sw) + selection = treeview.get_selection() + model, iter = selection.get_selected() - # create model - model = create_model() + if iter: + path = model.get_path(iter)[0] + model.remove(iter) - # create tree view - treeview = gtk.TreeView(model) - treeview.set_rules_hint(TRUE) - treeview.set_headers_visible(TRUE) - selection = treeview.get_selection() - selection.set_mode(gtk.SELECTION_SINGLE) + del articles[ path ] - add_columns(treeview) - sw.add(treeview) + def on_cell_edited(self, cell, path_string, new_text, model): - # some buttons - hbox = gtk.HBox() - vbox.pack_start(hbox, FALSE, FALSE) + iter = model.get_iter_from_string(path_string) + path = model.get_path(iter)[0] + column = cell.get_data("column") - button = gtk.Button('Add item') - button.connect('clicked', add_item, model) - hbox.pack_start(button) - - button = gtk.Button('Remove item') - button.connect('clicked', remove_item, treeview) - hbox.pack_start(button) + if column == COLUMN_NUMBER: + articles[path][COLUMN_NUMBER] = int(new_text) - window.set_default_size(330, 220) - window.show_all() + model.set(iter, column, articles[path][COLUMN_NUMBER]) + elif column == COLUMN_PRODUCT: + old_text = model.get_value(iter, column) + articles[path][COLUMN_PRODUCT] = new_text + + model.set(iter, column, articles[path][COLUMN_PRODUCT]) + +def main(): + EditableCellsDemo() gtk.main() - -if __name__=="__main__": + +if __name__ == '__main__': main() |