Re: [pygtk] GtkWidgets in a GtkListStore - a bug?

2002-01-26 Thread Edgar Denny

On Thu, 2002-01-24 at 20:36, James Henstridge wrote:
> Edgar Denny wrote:
> 
> >I can't figure out if its possible to add a GtkWidget to a GtkListStore
> >and render it.
> >
> >Is it possible, and if so how?
> >
> It is not possible to put a GtkWidget into a treestore/liststore.  It is 
> possible to overlay a entry on top of the tree view (there is a demo in 
> gtk-demo doing it), but I don't have python code to do it off hand.
> 
> James.
> 

I guess you mean editable_cells.c. I'm attaching a Python version of
this code.

The problem is that there seems to be a bug in it, and the same bug
exists in the C version as well. The bug is that when you remove a row
with the Remove Item button, the item is not properly deleted - the
Number column is deleted, but Product column is not. Its most obvious
when you try to delete the last row.

I'm using gtk+-1.3.12 on Debian unstable.

Edgar



#!/usr/bin/python2.2

import gobject
import gtk

item_list = ((3, 'bottles of coke'), 
(5, 'packages of noodles'),
(2, 'packages of chocolate chip cookies'), 
(1, 'can vanilla ice cream'),
(6, 'eggs'))

class Item:
pass

articles = []

COLUMN_NUMBER = 0
COLUMN_PRODUCT = 1
COLUMN_EDITABLE = 2

def add_items():
for number, product in item_list:
foo = Item()
foo.number = number
foo.product = product
foo.editable = gtk.TRUE
articles.append( foo)

def create_model():
add_items()
model = gtk.ListStore( gobject.TYPE_INT, gobject.TYPE_STRING,
gobject.TYPE_BOOLEAN)

for item in articles:
iter = model.append()
model.set_value( iter, 0, item.number)
model.set_value( iter, 1, item.product)
model.set_value( iter, 2, item.editable)

return model

def add_item( widget, model):
foo = Item()
foo.number = 0
foo.product = 'Description Here'
foo.editable = gtk.TRUE
articles.append( foo)

iter = model.append()
model.set_value( iter, COLUMN_NUMBER, foo.number)
model.set_value( iter, COLUMN_PRODUCT, foo.product)
model.set_value( iter, COLUMN_EDITABLE, foo.editable)

def remove_item( widget, treeview):
selection = treeview.get_selection()
s = selection.get_selected()
if s:
model, iter = s
path = model.get_path( iter)
model.remove( iter)
del articles[path[0]]

def cell_edited( cell, path_string, text, data):
model, column = data
iter = model.get_iter_root()
if not model.get_iter_from_string( iter, path_string):
return
path = model.get_path( iter)

if column == COLUMN_NUMBER:
articles[path[0]].number = int( text)
model.set_value( iter, column, int( text))
elif column == COLUMN_PRODUCT:
articles[path[0]].product = text
model.set_value( iter, column, text)

def add_columns( treeview):
model = treeview.get_model()

renderer = gtk.CellRendererText()
renderer.connect( 'edited', cell_edited, ( model, COLUMN_NUMBER))
column = gtk.TreeViewColumn( 'Number', renderer, text=COLUMN_NUMBER, 
editable=COLUMN_EDITABLE)
treeview.append_column( column)

renderer = gtk.CellRendererText()
renderer.connect( 'edited', cell_edited, ( model, COLUMN_PRODUCT))
column = gtk.TreeViewColumn( 'Product', renderer, text=COLUMN_PRODUCT, 
editable=COLUMN_EDITABLE)
treeview.append_column( column)

def do_editable_cells():
window = gtk.Window( gtk.WINDOW_TOPLEVEL)
window.set_title( 'Shopping List')
window.set_border_width( 5)
window.connect( 'destroy', lambda w: gtk.main_quit( ))

vbox = gtk.VBox( gtk.FALSE, 5)
window.add( vbox)
vbox.pack_start( gtk.Label( 'Shopping list ( you can edit cells!)'),
gtk.FALSE, gtk.FALSE, 0)

sw = gtk.ScrolledWindow()
sw.set_shadow_type( gtk.SHADOW_ETCHED_IN)
sw.set_policy( gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
vbox.pack_start( sw, gtk.TRUE, gtk.TRUE, 0)

model = create_model()

treeview = gtk.TreeView( model)
treeview.set_rules_hint( gtk.TRUE)
selection = treeview.get_selection()
selection.set_mode( gtk.SELECTION_SINGLE)

add_columns( treeview)

sw.add( treeview)

hbox = gtk.HBox( gtk.TRUE, 4)
vbox.pack_start( hbox, gtk.FALSE, gtk.FALSE, 0)

button = gtk.Button( label='Add Item')
button.connect( 'clicked', add_item, model)
hbox.pack_start( button, gtk.TRUE, gtk.TRUE, 0)

button = gtk.Button( label='Remove Item')
button.connect( 'clicked', remove_item, treeview)
hbox.pack_start( button, gtk.TRUE, gtk.TRUE, 0)

window.set_default_size( 320, 200)

window.show_all()
gtk.mainloop()

if __name__ == '__main__': do_editable_cells()



Re: [pygtk] GtkWidgets in a GtkListStore

2002-01-24 Thread James Henstridge

Edgar Denny wrote:

>I can't figure out if its possible to add a GtkWidget to a GtkListStore
>and render it.
>
>Is it possible, and if so how?
>
It is not possible to put a GtkWidget into a treestore/liststore.  It is 
possible to overlay a entry on top of the tree view (there is a demo in 
gtk-demo doing it), but I don't have python code to do it off hand.

James.

-- 
Email: [EMAIL PROTECTED]
WWW:   http://www.daa.com.au/~james/



___
pygtk mailing list   [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk



[pygtk] GtkWidgets in a GtkListStore

2002-01-24 Thread Edgar Denny

I can't figure out if its possible to add a GtkWidget to a GtkListStore
and render it.

Is it possible, and if so how?

Thanks,

Edgar



___
pygtk mailing list   [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk