代码之家  ›  专栏  ›  技术社区  ›  buhtz

取消Gtk.TreeView中某些特定项目的拖放

  •  4
  • buhtz  · 技术社区  · 7 年前

    我有一个 Gtk.TreeView 在这里。大多数(但不是所有)项目都应该能够拖放。在本例中,第一项应该 可以拖放,但应该是可选的。

    我怎么知道?也许我得用 drag-begin 发出信号,停止那里的拖拽。但我不知道怎么做。

    #!/usr/bin/env python3
    import gi
    gi.require_version('Gtk', '3.0')
    from gi.repository import Gtk
    from gi.repository import Gdk
    
    class MainWindow(Gtk.Window):
        def __init__(self):
            Gtk.Window.__init__(self, title="TreeView Drag and Drop")
            self.connect("delete-event", Gtk.main_quit)
            self.set_default_size(400, 300)
    
            # "model" with dummy data
            self.store = Gtk.TreeStore(str)
            self.store.append(None, ['do not drag this'])
            self.store.append(None, ['drag this'])
            self.view = Gtk.TreeView(model=self.store)
            self.add(self.view)
    
            # build columsn
            colA = Gtk.TreeViewColumn('Col A', Gtk.CellRendererText(), text=0)
            self.view.append_column(colA)
    
            # DnD events
            self.view.connect("drag-data-received", self.drag_data_received)
            self.view.connect("drag-data-get", self.drag_data_get)
            self.view.connect("drag-begin", self.drag_begin)
    
            target_entry = Gtk.TargetEntry.new('text/plain', 2, 0)
            self.view.enable_model_drag_source(
                    Gdk.ModifierType.BUTTON1_MASK,[target_entry], 
                    Gdk.DragAction.DEFAULT|Gdk.DragAction.MOVE
            )
            self.view.enable_model_drag_dest(
                    [target_entry],
                    Gdk.DragAction.DEFAULT|Gdk.DragAction.MOVE
            )
    
        def drag_data_get (self, treeview, drag_context, data, info, time):
            model, path = treeview.get_selection().get_selected_rows()
            print('dd-get\tpath: {}'.format(path))
            data.set_text(str(path[0]), -1)
    
        def drag_data_received (self, treeview, drag_context, x,y, data,info, time):
            print('dd-received')
            store = treeview.get_model()
            source_iter = store.get_iter(data.get_text())
            dest_path, drop_pos = self.view.get_dest_row_at_pos(x, y)
            print('path: {} pos: {}'.format(dest_path, drop_pos))
    
        def drag_begin(self, widget, context):
            print(widget)
            print(context)
    
    win = MainWindow()
    win.show_all()
    Gtk.main()
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   buhtz    7 年前

    你必须超载 Gtk.TreeDragSource.do_row_draggable() .

    class MyTreeStore (Gtk.TreeStore):
        # ...
        def do_row_draggable(self, path):
            # do your decision here
    
            return True # draggable
            return False # NOT draggable
    
    推荐文章