2010-02-05 65 views
6

我測試,看起來像這樣的窗口:在Gtk中,當在TreeView中使用拖放操作時,如何避免在行間拖放?

alt text

拖動標籤的卡鏈接標籤的卡。因此,將卡片拖放到標籤。

在兩張卡之間放置一個標籤或在兩個標籤之間放置一張卡是沒有意義的。我可以在這樣的Handle...DataReceived函數忽略這些成果:

if (dropPos != TreeViewDropPosition.IntoOrAfter && 
    dropPos != TreeViewDropPosition.IntoOrBefore) 
    return; 

然而,在拖曳時,用戶仍然可以看到插入選項:

alt text

如何防止這種情況的發生?

回答

3

您需要連接到drag-motion信號,並更改默認行爲運動事件,以便它從未指示前/下降後:

def _drag_motion(self, widget, context, x, y, etime): 
    drag_info = widget.get_dest_row_at_pos(x, y) 
    if not drag_info: 
     return False 
    path, pos = drag_info 
    if pos == gtk.TREE_VIEW_DROP_BEFORE: 
     widget.set_drag_dest_row(path, gtk.TREE_VIEW_DROP_INTO_OR_BEFORE) 
    elif pos == gtk.TREE_VIEW_DROP_AFTER: 
     widget.set_drag_dest_row(path, gtk.TREE_VIEW_DROP_INTO_OR_AFTER) 
    context.drag_status(context.suggested_action, etime) 
    return True 
+0

謝謝 - 我已經移植了大部分,但是我在找到一個相當於pygtk的DragContext.drag_status的Gtk#時遇到了困難。以下是文檔:http://www.go-mono.org/docs/index .aspx?link = T:Gdk.DragContext/* – 2010-02-06 20:09:12

+0

該鏈接是bro肯 - *應該是它的一部分。 – 2010-02-06 20:17:04

+1

花了我一段時間找到它:顯然它是Gtk#中的Gdk.Drag.Status(C中的gdk_drag_status)。 – 2010-02-06 22:14:14

1

您可以爲標籤和卡片定義不同的目標,在左側的小部件上只接受表示標籤的目標。使用Gtk.Drag.DestSet方法。也許是這樣的:

 Gtk.Drag.DestSet (widget, DestDefaults.All, 
         new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) }, 
         DragAction.Default); 

我試圖使目標發射與運動事件:

 Gtk.Drag.DestSet (widget, DestDefaults.Motion, 
         new TargetEntry[1] { new TargetEntry ("MYAPP_TAGS", TargetFlags.App, 1) }, 
         DragAction.Default); 

從理論上說,如果我理解正確的話,它應該工作。但我不能讓它火:(

+0

謝謝 - 我可能會不是很清楚:我的問題不是我不希望左側接受卡片和標籤(我已經使用不同的目標),而是我只想直接放在標籤上,而不是在兩者之間 – 2010-02-06 00:57:35