Pergunta

Estou testando uma janela que se parece mais disso:

alt text

Arrastar uma tag para um cartão vincula a tag ao cartão. O mesmo acontece com o arrastar um cartão para uma tag.

Não faz sentido soltar uma etiqueta entre dois cartões ou um cartão entre duas tags. Eu posso ignorar esses resultados no Handle...DataReceived função assim:

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

No entanto, ao arrastar, o usuário ainda vê a opção de inserir:

alt text

Como faço para impedir que isso aconteça?

Foi útil?

Solução

Você precisa se conectar ao drag-motion sinalize e altere o comportamento padrão para que nunca indique uma queda antes/depois:

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

Outras dicas

Você pode definir alvos diferentes para tags e cartões e, à esquerda, o widget aceita apenas o alvo que representa as tags. Usar Gtk.Drag.DestSet método. Talvez algo como:

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

Eu tentei fazer o destino emitir eventos de movimento com:

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

Teoricamente, se eu entender corretamente, deve funcionar. Mas eu não consegui fazer eventos de movimento de fogo :(

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top