On Sat, 2009-03-14 at 03:20 -0500, alex goretoy wrote:

> I would track certain evens and recreate the tree view with the list
> after drop or after press, code is good
> -Alex Goretoy
> http://www.goretoy.com


Any way, here is the full code involved:



        def setup_maps_treeview(self):
                self.maps_treeview = self.wtree.get_widget("maps_treeview")
                self.maps_list = gtk.ListStore(gobject.TYPE_STRING,
gobject.TYPE_STRING)
                cell_0 = gtk.CellRendererText()
                cell_0.set_property("markup", True)
                col_0 = gtk.TreeViewColumn("Order")
                col_0.pack_start(cell_0, True)
                #col_0.add_attribute( cell_0,  "active", 0)
                self.maps_treeview.append_column(col_0)
                cell_1 = gtk.CellRendererText()
                cell_1.set_property("markup", True)
                col_1 = gtk.TreeViewColumn("Map Image", cell_1, markup=1)
                col_1.pack_start(cell_1, True)
                self.maps_treeview.append_column(col_1) 
                self.maps_treeview.set_model(self.maps_list)
                self.maps_treeview.drag_source_set(gtk.DEST_DEFAULT_ALL,
target[:-1],gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
                self.maps_treeview.drag_dest_set(gtk.DEST_DEFAULT_ALL,
target[:-1],gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
                NO_SUCH_WIDGET = None
                NO_SUCH_WIDGET.enable_model_drag_source(gtk.gdk.BUTTON1_MASK,
[("Reorder", gtk.TARGET_SAME_WIDGET, 0)], gtk.gdk.ACTION_COPY)
                self.maps_treeview.enable_model_drag_dest([("Reorder",
gtk.TARGET_SAME_WIDGET, 0)], gtk.gdk.ACTION_COPY)

        def add_map(self, path):
                #incase it's needed elsewhere and not just for drag and drop
                iter = self.maps_list.append()
                self.maps_list.set(iter, 0, "A", 1, path)
        
        #
        # Drag and Drop
        #
        
        def on_maps_treeview_drag_drop(self, widget, drag_context, data1,
data2, timestamp):
                "Pretty much does nothing - dnd in treeviews is strange"
                if drag_context.get_source_widget() == self.maps_treeview:  
                        # drag and drop within widget to re-order 
                        self.internal_drag_data_received(widget, drag_context, 
data1,
data2,None,1,timestamp)
                # if signal is not stopped here weirdnes will happen, double 
dropping
from external apps etc.
                gobject.GObject.emit_stop_by_name(widget, "drag_drop")
                
        def  on_maps_treeview_drag_data_received(self, widget, drag_context,
data1,  data2, selection, data3, timestamp):
                "get info on dropped object and check to see if it is an image"
                dropped = selection.get_text()[:-2]  # seems to have \r\n 
appended to
text
                if dropped[:7] == "file://":
                        try:
                                mime_type = gnomevfs.get_mime_type(dropped)
                                if mime_type[:6] == "image/":
                                        self.add_map(dropped[7:])
                        except:
                                pass
                
        def internal_drag_data_received(self, treeview, drag_context, x, y,
selection, info, eventtime):
                "Handle the drag and drop reordering of map images."
                model, iter_to_move = treeview.get_selection().get_selected()
                temp = treeview.get_dest_row_at_pos(x, y)
                if temp != None:
                        path, pos = temp
                else:
                        path, pos = (len(model)-1,), gtk.TREE_VIEW_DROP_AFTER
                destination_iter = model.get_iter(path)
                if self.check_row_path(model, iter_to_move, destination_iter):
                        self.move_row(model, iter_to_move, destination_iter, 
pos)
                        drag_context.finish(True, True, eventtime)
                else:
                        drag_context.finish(False, False, eventtime)
                self.output_tree()
                
        def check_row_path(self, model, iter_to_move, destination):
                path_to_move = model.get_path(iter_to_move)
                path_of_destination = model.get_path(destination)
                if path_of_destination[0:len(path_to_move)] == path_to_move:
                        return False
                else:
                        return True

        def move_row(self, model, iter_to_move, destination_iter, pos):
                order = model.get_value(iter_to_move, 0)
                path = model.get_value(iter_to_move, 1)
                row = (order, path)
                try:
                        if (pos == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE) or (pos ==
gtk.TREE_VIEW_DROP_INTO_OR_AFTER):
                                iter = model.prepend(row)
                        elif pos == gtk.TREE_VIEW_DROP_BEFORE:
                                iter = model.insert_before(destination_iter, 
row)
                        elif pos == gtk.TREE_VIEW_DROP_AFTER:
                                iter = model.insert_after(destination_iter, row)
                except:
                        pass
                model.remove(iter_to_move)              
                
        def output_tree(self):
                n_rows = len(self.maps_list)
                #print n_rows
                for row in self.maps_list:
                        print row.path[0]
                        print row[1]    

-- 
Rob Brown-Bayliss <[email protected]>
_______________________________________________
pygtk mailing list   [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/

Reply via email to