Dragando e Dropando com PyGTK

Liberei mais uma versão (0.7, “O Domo de Arminus”, e o instalador para windows só depois do carnaval quando poderei usar os windows da escola) de TagMap, com algumas funcionalidades novas: salvar/carregar trilhas desenhadas no mapa; exportar trilhas para html (exemplo); e arrastar itens da lista de locais para o mapa muda o foco para o local largado.

Sobre o drag-n-drop, trata-se de arrastar um item de TreeView para um Viewport (veja foto), e isso precisou de mais cuidados do que eu esperava. Primeiro é preciso definir a fonte e alvo do arrastar e soltar, além dos tipos de dados que poderão ser enviados:

treeview.drag_source_set(gtk.gdk.BUTTON1_MASK,

[('text/plain', gtk.TARGET_SAME_APP, 1)],
gtk.gdk.ACTION_COPY)

viewport.drag_dest_set(gtk.DEST_DEFAULT_MOTION |

gtk.DEST_DEFAULT_HIGHLIGHT | gtk.DEST_DEFAULT_DROP,
[('text/plain', gtk.TARGET_SAME_APP, 1)],
gtk.gdk.ACTION_DEFAULT | gtk.gdk.ACTION_COPY)

Um callback é definido para o treeview preparar os dados:

treeview.connect('drag-data-get', self.drag_data_get_cb)

(...)

def drag_data_get_cb(self, treeview, context, selection, info, timestamp):

treeselection = treeview.get_selection()
model, iter = treeselection.get_selected()
selection.set('text/plain', 8, model.get_value(iter, 2))

E outro para o quando o destinatário recebê-los:

viewport.connect('drag-data-received', self.place_data_received)

(...)

def place_data_received(self, widget, ct, x, y, selection, info, timestamp):

self.processa_dados(selection.data)

Falei por alto só pra mostrar (inclusive pra mim mesmo depois que esquecer) um quadro geral de drag-n-drop dentro de uma mesma aplicação. Essas coisas estão bem melhor explicadas em:

Além do código do TagMap.

2 pensamentos sobre “Dragando e Dropando com PyGTK

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s