[Xojo 2025r1] Arrastrar a más destinos

A continuación encontrarás traducido al Castellano el artículo escrito por William Yu y publicado originalmente en el Blog oficial de Xojo.

Ha sido una queja común el hecho de que en macOS no se pudiese obtener el destino (o ruta de destino) durante la operación de arrastrar un FolderItem. Eso era antes pero, a partir de Xojo 2025r1, la operación de arrastrar por fun conoce su destino, ¡y de hecho te puede informar de ello!

Un poco de historia

Si bien hemos ofrecido una API mediante la cual obtener el destino de un DragItem, esta devolvía Nil como valor en macOS. De hecho, puede decirse que no funcionaba correctamente desde que hicimos nuestra transición desde Carbon a Cocoa hace ya mucho, mucho tiempo. Independientemente de todos los cambios asociados con dicha transición, DragItem.Destination se quedó atrás desafortunadamente.

Una nueva forma de arrastrar un FolderItem

Con el objeto de evitar introducir incompatibilidades con versiones anteriores, hemos decidido no revisar todo nuestro sistema de arrastrar y soltar sólo para soportar esta característica. En vez de ello, hemos introducido unos simples añadidos que son necesarios para que las operaciones de arrastrar los FolderItem devuelvan un DragItem.Destination válido.

Este es un ejemplo de cómo se podía configurar hasta ahora la operación de arrastrar (por ejemplo en el evento DesktopWindow.MouseDown):

Var fileToCopy As FolderItem = SpecialFolder.Temporary.Child("Test")
Var item As New DragItem(Self, 0, 0, 100, 100)
item.FolderItem = fileToCopy
item.Drag

Tras soltar el item en su destino, la comprobación de item.Destination siempre devolvería el valor Nil:

If item.Destination = Nil Then
    MessageBox "Not a happy destination. 😔"
End If

Con la incorporación de un simple añadido mediante la API RawData, ahora podemos inicializar las operaciones de arrastrar un FolderItem de forma que devuelva correctamente un FolderItem.Destination válido.

Var fileToCopy As FolderItem = SpecialFolder.Temporary.Child("Test")
Var item As New DragItem(Self, 0, 0, 100, 100)
item.FolderItem = fileToCopy
item.RawData("public.file-url") = ""
item.Drag

Ahora, cuando compruebas la propiedad Destination una vez se ha completado la operación de arrastrar, recibirás algo mucho más significativo:

If item.Destination <> Nil And item.Destination IsA FolderItem Then
    MessageBox(FolderItem(item.Destination).NativePath)
End If

Una ventaja añadida

Si bien este cambio es una mejora significativa, ¿por qué detenernos aquí? En el pasado sólo podías arrastrar FolderItems a su destino, y todo el contenido de dicho FolderItem se copiaría en consecuencia. Con el añadido de este nuevo método de arrastrar, ahora puedes asignar contenido a RawData(“public.file-url”). En vez de copiar todo el FolderItem a su destino, podemos copiar el contenido de RawData en su lugar.

Este es un ejemplo de cómo puedes configurarlo:

// No es necesario que fileToCopy exista, simplemente
// tomaremos su nombre de archivo y crearemos un archivo
// en la ruta de destino con los contenidos que se hayan
// asignado a RawData.
Var fileToCopy As FolderItem = SpecialFolder.Temporary.Child("DummyFile.txt")
Var item As New DragItem(Self, 0, 0, 100, 100)
item.FolderItem = fileToCopy
item.RawData("public.file-url") = "Content that will be written to the destination file."
item.Drag

Conclusión

Con estas mejoras, la operación de arrastrar instancias de FolderItem en macOS son ahora más flexibles y potentes que nunca. No sólo podrás recuperar fácilmente una ruta de destino válida, sino que también tienes la capacidad de controlar los contenidos que se copiarán, gracias a la integración de la API RowData.

De modo que… adelante, ¡arrastra ese FolderItem y muéstranos tu destino!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *