[pygtk] Problem with CellRendererToggle

2006-11-17 Thread Pipen

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.

--
Artur M. Piwko
AMP29-RIPE
___
pygtk mailing list   pygtk@daa.com.au
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/


[pygtk] event timing precision question

2006-11-17 Thread Greg Steffensen

I'm working on a project for which I'd like to be able to detect the
exact moment at which keypress/keyrelease events occur, to within a
millisecond or so of accuracy.  Is it reasonable to do this with
pygtk, or would I be better served using c and gtk?  I know that
gtk.gdk.Event.get_time() has adequate precision; I'm wondering about
the accuracy.  Thanks,

Greg
___
pygtk mailing list   pygtk@daa.com.au
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/


Re: [pygtk] Problem with CellRendererToggle

2006-11-17 Thread Brian
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