Nucleus
Tao backend

Drag and drop

Recevez les fichiers déposés sur le backend Tao via l'API standard dragAndDropTarget de Compose.

Le backend Tao achemine le drag-and-drop natif vers Compose via l'API standard Modifier.dragAndDropTarget. Quand un élément est déposé sur votre fenêtre, DragAndDropEvent.nativeEvent est un TaoDragAndDropPayload qui porte les chemins des fichiers déposés, et event.awtTransferable donne accès aux mêmes données par le chemin habituel des DataFlavor — sans initialiser la boîte à outils AWT.

Les dépôts entrants ne portent que des fichiers. Le texte, le HTML et les URL ne sont pas encore livrés.

Ajouter la dépendance

Le drag-and-drop est fourni avec le backend Tao. Ajoutez l'artifact du backend à votre build :

build.gradle.kts
dependencies {
    implementation("dev.nucleusframework:nucleus.decorated-window-tao:2.0.5")
}

Aucune configuration supplémentaire n'est nécessaire. Dès qu'une fenêtre tourne sur le backend Tao, les cibles de dépôt reçoivent les événements.

Recevoir des fichiers déposés

Attachez un DragAndDropTarget à un composable avec Modifier.dragAndDropTarget et lisez les fichiers depuis le payload Tao dans onDrop :

import androidx.compose.foundation.draganddrop.dragAndDropTarget
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.draganddrop.DragAndDropEvent
import androidx.compose.ui.draganddrop.DragAndDropTarget
import dev.nucleusframework.window.tao.TaoDragAndDropPayload

@Composable
fun DropZone() {
    val target = remember {
        object : DragAndDropTarget {
            override fun onDrop(event: DragAndDropEvent): Boolean {
                val payload = event.nativeEvent as? TaoDragAndDropPayload
                val files = payload?.files ?: emptyList()
                files.forEach { path -> println("déposé : $path") }
                return files.isNotEmpty()
            }
        }
    }

    Box(
        Modifier
            .fillMaxSize()
            .dragAndDropTarget(
                shouldStartDragAndDrop = { true },
                target = target,
            ),
    )
}

TaoDragAndDropPayload.files est une List<String> de chemins absolus. onDrop renvoie true quand votre cible accepte les données.

Si vous consommez déjà les dépôts par le chemin portable de Compose Desktop, continuez d'utiliser event.awtTransferable et DataFlavor.javaFileListFlavor — le backend Tao l'alimente avec les mêmes chemins, donc ce code fonctionne sans modification.

Fonctionnement

Il n'y a pas de DropTarget AWT sur le chemin d'entrée. La fenêtre native signale un dépôt via le pont JNI en Rust, et le scene host Compose de Tao en construit un DragAndDropEvent. Le nativeEvent de l'événement est un TaoDragAndDropPayload, et le host enveloppe aussi les chemins dans un Transferable interne pour que event.awtTransferable continue de fonctionner. Cet adaptateur vit dans la couche java.datatransfer et ne démarre jamais la boîte à outils AWT.

L'acheminement entrant (un dépôt dans votre fenêtre) est câblé sur chaque host de plateforme. L'acheminement sortant (un glisser qui quitte votre fenêtre) est géré par un PlatformDragAndDropManager interne et est opt-in par host : là où une plateforme n'a pas encore de lanceur sortant, le geste est signalé comme non démarré. Les deux chemins incrémentent des compteurs sur TaoDnDDiagnostics.

Référence de l'API

Lire un payload déposé

TaoDragAndDropPayload est la valeur que vous obtenez depuis DragAndDropEvent.nativeEvent sur le backend Tao. Vous ne le construisez jamais vous-même.

MembreTypeDescription
filesList<String>Chemins absolus des fichiers déposés.

Inspecter la tuyauterie DnD

TaoDnDDiagnostics est un objet qui expose des compteurs d'état Compose et un journal du dernier message. Lisez les compteurs dans un composable pour observer la tuyauterie ; ils se mettent à jour au fil des événements.

MembreTypeDescription
constructedMutableIntStateNombre de gestionnaires de drag-and-drop construits.
isRequiredQueriesMutableIntStateFois où Compose a demandé si un transfert sortant est requis.
requestsMutableIntStateDemandes de transfert sortant reçues.
transfersMutableIntStateTransferts sortants démarrés.
lastMessageMutableState<String?>Dernier message de diagnostic, ou null.
log(msg: String)UnitEnregistre un message de diagnostic.
import androidx.compose.material.Text
import dev.nucleusframework.window.tao.TaoDnDDiagnostics

@Composable
fun DnDStatus() {
    Text("transferts : ${TaoDnDDiagnostics.transfers.intValue}")
    TaoDnDDiagnostics.lastMessage.value?.let { Text(it) }
}

Et ensuite