On Tue, 18 Jul 2000 09:29:47 +0200, MOULET Xavier FTRD/DMR/ISS 
<[EMAIL PROTECTED]> wrote:
> Hello everybody. As I told in my last email, I spennt another night on this
> and could not find what was causing any trouble. The following program
> should let me drag a node over another, and then the dragged node becomes a
> child of the other one. drag_data_set were methods of my node object, which
> led to many segfaults. Now, I placed them away but I still have problems.
> 
> I pass a string to look up at which node is passed, as you can only pass
> strings in a drag data I think. My problem is, the dragged data disappears,
> the other ones remain as they were and a gtk warning appears. What do I
> wrong ? can someone cast some light on me ?
> 
> -- Beginning of the "program"
> 
> 
> # Sample gnome-python prog
> 
> # Imports
> from gtk import *
> import GDK
> import GTK
> 
>       
> def drag_data_get (widget,context,data,info,time,user) :
>       data.set(data.target,123,user)
> 
> def drag_data_rec (widget,context,x,y,data,info,time,user) :
>       if user == data.data :
>               # drags over myself : do nothing
>               widget.drag_finish(context,FALSE,FALSE,time)
>       else :  
>               noeud = app.nodes[data.data]       # Look up the dragged
> (incoming) node
>               noeud.gtknode.drag_finish(context,TRUE,TRUE,time)
> 
>               me = app.nodes[user] # who has it been dragged to ? (whoami
> ?)
>               
>               # if no tree, create one                
>               if me.subtree==None :
>                       me.subtree = GtkTree()
>                       me.subtree.show()
>                       noeud.gtknode.set_subtree(me.subtree)
>                       
>               noeud.gtknode.reparent(me.subtree)
>               noeud.gtknode.show()

I think you might have the source and destination mixed up.

try ->
                # if no tree, create one
                if me.subtree == None:
                        me.subtree = GtkTree ()
                        me.subtree.show ()
                        #noeud.gtknode.set_subtree(me.subtree)
                        widget.set_subtree (me.subtree) # widget is where you are
                                                                                       
 # dragging to

                #noeud.gtknode.reparent(me.subtree)
                #noeud.gtknode.show()
                
                # remember to remove the item you drag, that caused the
                # gtk warning.
                # noeud.gtknode is the item you are dragging, and 'tree' is
                # the original tree you created in App.__init__()
                global tree
                tree.remove_item (noeud.gtknode)        
                me.subtree.append (noeud.gtknode)


there's also some changes to class App ->

> # my main node class.
> class UI_Node :
> 
>        def __init__ (self, label="Unknown") :
>               self.label = label
> 
>               self.subtree = None
> 
>               self.gtknode = GtkTreeItem(self.label)
>               self.gtknode.show()
>                               
>               # Drag interface
>               target = [('GLOOPNODE',0,-1)]
>       
> self.gtknode.drag_source_set(GDK.BUTTON1_MASK,target,GDK.ACTION_COPY)
>       
> self.gtknode.connect("drag_data_get",drag_data_get,self.label)
>               
>               # Drop interface
>       
> self.gtknode.connect("drag_data_received",drag_data_rec,self.label)
>       
> self.gtknode.drag_dest_set(GTK.DEST_DEFAULT_ALL,target,GDK.ACTION_COPY)
>               
> class App :
>       def __init__(self):
>               self.window = GtkWindow();
>               self.window.connect("destroy",mainquit)
> 
                
                global tree

                
>               self.tree = GtkTree()

                tree = self.tree


>               self.window.add(self.tree)
>               self.window.show_all()          
> 
>               self.nodes = {} # Nodes : a dictonnary, keys are names of
> nodes, then node is given
> 
> 
>       def append(self,node) :
>                       self.nodes[node.label] = node 
>               self.tree.append(node.gtknode)          
> 
>       def main (self) :
>               self.append(UI_Node("foo1"))
>               self.append(UI_Node("foo2"))
>               self.append(UI_Node("foo3"))
>               self.append(UI_Node("foo4"))
>               
>               
> if __name__ == '__main__' :
>       global app
>       app = App()
>       app.main()
> 
>       mainloop()
>       
> # dragging a node to another makes : 
> # Gtk-CRITICAL **: file gtkwidget.c: line 2933
> (gtk_widget_reparent_container_child): assertion `client_data != NULL'
> failed.
> # and the dragged widget disappears.
> 
> _______________________________________________
> pygtk mailing list   [EMAIL PROTECTED]
> http://www.daa.com.au/mailman/listinfo/pygtk
> 



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

Reply via email to