Skip to content

Instantly share code, notes, and snippets.

@BlakeBarrett
Created January 6, 2024 02:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BlakeBarrett/7aca6152a00d63186613aa3ed0d842c7 to your computer and use it in GitHub Desktop.
Save BlakeBarrett/7aca6152a00d63186613aa3ed0d842c7 to your computer and use it in GitHub Desktop.
How to handle files dropped into a KMP/KMM Compose Desktop project. Tested on Win/macOS/Linux.
/*
* BSD 3-Clause License
*
* Copyright (c) 2023, Blake Barrett
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of [Your Organization] nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
// Originally from: https://github.com/BlakeBarrett/Lore/blob/KMP-Project/composeApp/src/desktopMain/kotlin/com/blakebarrett/extensions/FileDrop.desktop.kt
package com.blakebarrett.extensions
import androidx.compose.runtime.Composable
import androidx.compose.ui.DragData
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.onExternalDrag
import java.io.File
interface DropDataResult {
val droppedData: String
val file: File? get() = File(droppedData.replaceFirst("file:", "")).takeIf { it.exists() }
}
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun Modifier.onFileDrop(enabled: Boolean, onDrop: (result: List<DropDataResult>) -> Unit): Modifier {
return this.onExternalDrag(
enabled = enabled
) { externalDragValue ->
val result = ArrayList<DropDataResult>()
(externalDragValue.dragData as? DragData.FilesList).also { filesList ->
filesList?.let { list ->
result.addAll( list.readFiles().map { object : DropDataResult {
override val droppedData: String
get() = it
}})
}
}
onDrop(result)
}
}
@BlakeBarrett
Copy link
Author

An example of this in practice can be found here: main.kt#L74

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment