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.






Seria muito abuso eu pedir seu e-mail? Gostaria de algumas orientações com o Cairo.
Que nada. Ei-lo: setanta arrouba gê-mêil ponto com
Também tou começando agora com Cairo, mas ajudo no que puder.