You've already forked AstralRinth
fix: files tab drag and drop (#6325)
* fix: files drag drop * fix: standardize drag and drop + fix files tab permissions
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import type { AbstractPopupNotificationManager, AbstractWebNotificationManager } from '@modrinth/ui'
|
||||
|
||||
import { setupCreationModal } from './setup/creation-modal'
|
||||
import { setupFileDropProvider } from './setup/file-drop'
|
||||
import { setupFilePickerProvider } from './setup/file-picker'
|
||||
import { setupInstanceImportProvider } from './setup/instance-import'
|
||||
import { setupTagsProvider } from './setup/tags'
|
||||
@@ -10,6 +11,7 @@ export function setupProviders(
|
||||
popupNotificationManager: AbstractPopupNotificationManager,
|
||||
) {
|
||||
setupTagsProvider(notificationManager)
|
||||
setupFileDropProvider()
|
||||
setupFilePickerProvider()
|
||||
setupInstanceImportProvider(notificationManager)
|
||||
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
import { provideFileDrop } from '@modrinth/ui'
|
||||
import { invoke } from '@tauri-apps/api/core'
|
||||
import type { DragDropEvent } from '@tauri-apps/api/webview'
|
||||
import { getCurrentWebview } from '@tauri-apps/api/webview'
|
||||
|
||||
function getFileName(path: string) {
|
||||
return path.split(/[\\/]/).pop() || 'file'
|
||||
}
|
||||
|
||||
function toLogicalPosition(position: { x: number; y: number }) {
|
||||
const scale = window.devicePixelRatio || 1
|
||||
return {
|
||||
x: position.x / scale,
|
||||
y: position.y / scale,
|
||||
}
|
||||
}
|
||||
|
||||
async function readDraggedFile(path: string) {
|
||||
const data = await invoke<number[]>('plugin:files|file_read_dragged_file', { path })
|
||||
return new Uint8Array(data)
|
||||
}
|
||||
|
||||
export function setupFileDropProvider() {
|
||||
let nativeFileDropPaths: string[] = []
|
||||
|
||||
provideFileDrop({
|
||||
async listenNativeFileDrop(handler) {
|
||||
return await getCurrentWebview().onDragDropEvent((event: { payload: DragDropEvent }) => {
|
||||
const payload = event.payload
|
||||
|
||||
if (payload.type === 'leave') {
|
||||
nativeFileDropPaths = []
|
||||
void handler({
|
||||
type: 'leave',
|
||||
paths: [],
|
||||
position: { x: 0, y: 0 },
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if (payload.type === 'enter' || payload.type === 'drop') {
|
||||
nativeFileDropPaths = payload.paths
|
||||
}
|
||||
|
||||
void handler({
|
||||
type: payload.type,
|
||||
paths: nativeFileDropPaths,
|
||||
position: toLogicalPosition(payload.position),
|
||||
})
|
||||
|
||||
if (payload.type === 'drop') {
|
||||
nativeFileDropPaths = []
|
||||
}
|
||||
})
|
||||
},
|
||||
async createFilesFromNativePaths(paths) {
|
||||
return await Promise.all(
|
||||
paths.map(async (path) => new File([await readDraggedFile(path)], getFileName(path))),
|
||||
)
|
||||
},
|
||||
})
|
||||
}
|
||||
+5
-1
@@ -270,7 +270,11 @@ fn main() {
|
||||
.plugin(
|
||||
"files",
|
||||
InlinedPlugin::new()
|
||||
.commands(&["file_extract_zip", "file_save_as"])
|
||||
.commands(&[
|
||||
"file_extract_zip",
|
||||
"file_save_as",
|
||||
"file_read_dragged_file",
|
||||
])
|
||||
.default_permission(
|
||||
DefaultPermissionRule::AllowAllCommands,
|
||||
),
|
||||
|
||||
@@ -11,6 +11,7 @@ pub fn init<R: Runtime>() -> tauri::plugin::TauriPlugin<R> {
|
||||
.invoke_handler(tauri::generate_handler![
|
||||
file_extract_zip,
|
||||
file_save_as,
|
||||
file_read_dragged_file,
|
||||
])
|
||||
.build()
|
||||
}
|
||||
@@ -21,6 +22,19 @@ pub struct ExtractDryRunResult {
|
||||
conflicting_files: Vec<String>,
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn file_read_dragged_file(path: String) -> Result<Vec<u8>> {
|
||||
let metadata = tokio::fs::metadata(&path).await?;
|
||||
if !metadata.is_file() {
|
||||
return Err(theseus::Error::from(theseus::ErrorKind::OtherError(
|
||||
"Dropped path is not a file".to_string(),
|
||||
))
|
||||
.into());
|
||||
}
|
||||
|
||||
Ok(tokio::fs::read(path).await?)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn file_extract_zip(
|
||||
instance_path: &str,
|
||||
|
||||
Reference in New Issue
Block a user