GTK에서 트리 뷰에서 드래그 앤 드롭을 사용할 때 행 사이에 떨어지지 않도록하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/2209650

문제

나는 다음과 같은 것처럼 보이는 창을 테스트하고 있습니다.

alt text

태그를 카드로 드래그하면 태그를 카드에 연결합니다. 카드를 태그로 드래그합니다.

두 카드 또는 두 개의 태그 사이의 카드 사이에 태그를 떨어 뜨리는 것은 의미가 없습니다. 나는 이러한 결과를 무시할 수있다 Handle...DataReceived 다음과 같은 기능 :

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

그러나 드래그 할 때 사용자는 여전히 삽입 옵션을 봅니다.

alt text

이런 일이 발생하지 않도록하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

당신은 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);

이론적으로, 내가 올바르게 이해하면 작동해야합니다. 그러나 나는 그것을 화재 모션 이벤트로 만들 수 없었다 :(

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top