rendered paste body#! /usr/bin/env pythonimport gtkclass TreeViewMultidrag(gtk.TreeView): def __init__(self, *args, **kwargs): super(TreeViewMultidrag, self).__init__(*args, **kwargs) self.connect('button-press-event', self.__press) self.connect('button-release-event', self.__release) self.connect('drag-begin', self.__drag) self.get_selection().set_mode(gtk.SELECTION_MULTIPLE) self.__select = None def __press(self, view, event): # only handle non-ctrl/shift left clicks if event.get_state() & (gtk.gdk.SHIFT_MASK | gtk.gdk.CONTROL_MASK): return False x = int(event.x) y = int(event.y) try: path, col, cellx, celly = view.get_path_at_pos(x, y) except TypeError: return False # only override if clicked path is selected sel = view.get_selection() if not sel.path_is_selected(path): return False # save path, and override selection change self.__select = path return True def __drag(self, *args): self.__select = None def __release(self, view, event): if self.__select is not None: sel = view.get_selection() sel.unselect_all() sel.select_path(self.__select) self.__select = Noneif __name__ == '__main__': win = gtk.Window() mod = gtk.ListStore(str) for s in 'abcdefg': mod.append([s]) tv = TreeViewMultidrag(mod) tv.append_column(gtk.TreeViewColumn('test', gtk.CellRendererText(), text=0)) tv.enable_model_drag_source(gtk.gdk.MODIFIER_MASK, [('a', 0, 0)], gtk.gdk.ACTION_DEFAULT) win.add(tv) win.show_all() win.connect('delete-event', gtk.main_quit) gtk.main()