GTKでは、ツリービューでドラッグアンドドロップを使用する場合、どうすれば列の間にドロップしないようにしますか?

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

質問

私はこのようなものに見えるウィンドウをテストしています:

alt text

タグをカードにドラッグすると、タグをカードにリンクします。カードをタグにドラッグすることもできます。

2枚のカード間でタグをドロップするか、2つのタグ間のカードをドロップすることは意味がありません。私はこれらの結果を無視することができます 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