On Fri, 2006-17-11 at 18:28 +0100, Pipen wrote:
Hi.
Each row in my TreeView contains a column with: toggle, pixbuf and
text renderer respectively. If need to maintain the following
situations:
- user clicks on the toggle - toggle receives 'toggled' event;
treeview row cursor should not change.
- user clicks on the rest of the row (pixbuf, text) - treeview row
cursor should change, toggle should not receive 'toggled' event.
The program does not work as I expected. I receive 'toggled' and
'cursor-changed' events no matter what part the user clicks. If the user
clicks on the toggle, the treeview row cursor changes to the row clicked
toggle is in.
The following code sets up the TreeView (SETS_COL_TOGGLE is 0,
SETS_COL_ICON is 1, SETS_COL_NAME is 2).
store = gtk.TreeStore( bool, gtk.gdk.Pixbuf, str, int )
col = gtk.TreeViewColumn( 'Sets' )
# Toggle.
cell = gtk.CellRendererToggle()
cell.set_property( 'activatable', True )
cell.connect_object( 'toggled', self.on_set_toggled, store )
col.pack_start( cell, False )
col.add_attribute( cell, 'active', SETS_COL_TOGGLE )
# Pixbuf.
cell = gtk.CellRendererPixbuf()
col.pack_start( cell, False )
col.add_attribute( cell, 'pixbuf', SETS_COL_ICON )
# Text.
cell = gtk.CellRendererText()
col.pack_start( cell, True )
col.add_attribute( cell, 'text', SETS_COL_NAME )
self.treesets.append_column( col )
self.treesets.set_model( store )
I successfuly set up this kind of tree behavior using Qt, I'm fighting
Gtk right now.
Any kind of suggestion would be appreciated.
you need to check the path in the toggled callback to see if it is on
the toggle.
Here is some code from our app that uses several columns in a treeview,
one of which is a toggle (not always shown/used for some views). Sorry,
I wasn't the one that originated this code and I have not worked on it
lately. You should be able to figure out what you need from it and the
embedded comments.
class PackageView(CommonTreeView):
# Note! this is a gtk.TreeView type class and swap out the treeview
models
# dependending on what we need to display at the time.
# connect to clicked event
self.connect(cursor_changed, self._clicked)
self.connect(button_press_event, self.on_button_press)
def on_button_press(self, treeview, event):
utils.debug.dprint(VIEWS: Handling PackageView button press event)
self.event = event # save the event so we can access it in _clicked()
if event.type != gtk.gdk.BUTTON_PRESS:
utils.debug.dprint(VIEWS: Strange event type got passed to
on_button_press() callback...)
utils.debug.dprint(VIEWS: event.type = %s %str(event.type))
if event.button == 3: # secondary mouse button
self.dopopup = True # indicate that the popup menu should be
displayed.
else:
self.dopopup = False
# Test to make sure something was clicked on:
pathinfo = treeview.get_path_at_pos(int(event.x), int(event.y))
if pathinfo == None:
self.dopopup = False
return True
else:
path, col, cellx, celly = pathinfo
utils.debug.dprint(VIEWS: pathinfo = %s %str(pathinfo))
#treeview.set_cursor(path, col, 0) # Note: sets off _clicked again
return False
def on_toggled(self, widget, path):
self.toggle = path
utils.debug.dprint(VIEWS: Toggle activated at path '%s' % path)
self.set_cursor(path) # sets off _clicked
return True
def _clicked(self, treeview, *args):
Handles treeview clicks
utils.debug.dprint(VIEWS: Package view _clicked() signal caught)
# get the selection
package = get_treeview_selection(treeview, 2)
#utils.debug.dprint(VIEWS: package = %s % package.full_name)
if (not package and not self.toggle) or package.full_name == None:
self.mainwindow_callback(package changed, None)
return False
if self.toggle != None : # for upgrade view
iter = self.get_model().get_iter(self.toggle)
#if self.upgrade_model.get_value(iter, 0) != None:
check = self.upgrade_model.get_value(iter, 1)
check = not check
self.upgrade_model.set_value(iter, 1, check)
package.is_checked = check
self.dopopup = False # don't popup menu if clicked on checkbox
self.toggle = None
return True # we've got it sorted
else:
#utils.debug.dprint(VIEWS: full_name != _last_package = %d
%(package.full_name != self._last_selected))
self.mainwindow_callback(package changed, package)
self._last_selected = package.full_name
#pop up menu if was rmb-click
if self.dopopup:
[snip]
--
Brian [EMAIL