GTK에서 트리 뷰에서 드래그 앤 드롭을 사용할 때 행 사이에 떨어지지 않도록하려면 어떻게해야합니까?
-
18-09-2019 - |
문제
나는 다음과 같은 것처럼 보이는 창을 테스트하고 있습니다.
태그를 카드로 드래그하면 태그를 카드에 연결합니다. 카드를 태그로 드래그합니다.
두 카드 또는 두 개의 태그 사이의 카드 사이에 태그를 떨어 뜨리는 것은 의미가 없습니다. 나는 이러한 결과를 무시할 수있다 Handle...DataReceived
다음과 같은 기능 :
if (dropPos != TreeViewDropPosition.IntoOrAfter &&
dropPos != TreeViewDropPosition.IntoOrBefore)
return;
그러나 드래그 할 때 사용자는 여전히 삽입 옵션을 봅니다.
이런 일이 발생하지 않도록하려면 어떻게해야합니까?
해결책
당신은 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
다른 팁
태그와 카드에 대한 다른 대상을 정의 할 수 있으며 왼쪽 위젯에서 태그를 나타내는 대상 만 허용합니다. 사용 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);
이론적으로, 내가 올바르게 이해하면 작동해야합니다. 그러나 나는 그것을 화재 모션 이벤트로 만들 수 없었다 :(
제휴하지 않습니다 StackOverflow