summaryrefslogtreecommitdiff
path: root/examples/pygtk-demo/demos/editable_cells.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/pygtk-demo/demos/editable_cells.py')
-rw-r--r--examples/pygtk-demo/demos/editable_cells.py268
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()