feat(open): drag & drop files onto the window (#344)

Dropping a supported file (dwg / dxf / bak / sv$, case-insensitive)
opens it through the existing open flow: an already-open drawing
switches to its tab, a load in progress queues the drop behind it
(multi-file drops arrive one event each), anything unsupported reports
on the command line instead of failing silently in the parser.

Platform support follows winit 0.30: Windows, macOS and Linux/X11
(incl. XWayland) deliver FileDropped; the Wayland backend does not
implement file drag & drop yet, so drops are inert there until winit
gains it.

Closes #344

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Hakan SevenandClaude Fable 5 committed 2026-07-22 11:58:39 +03:00
1 parent 4c99a5c70d
commit 95fcabaacb
3 files changed
+33

No files matched your search

+28
View File
@@ -292,6 +292,34 @@ impl OpenCADStudio {
}
}
Message::FileDropped(path) => {
// Desktop drag & drop (#344): accept the formats the Open
// dialog accepts — a drop has no picker filter, so anything
// else reports instead of failing silently in the parser.
let ext = path
.extension()
.map(|e| e.to_string_lossy().to_lowercase())
.unwrap_or_default();
if !matches!(ext.as_str(), "dwg" | "dxf" | "bak" | "sv$") {
self.command_line.push_error(&format!(
"Unsupported file type: {}",
path.display()
));
return Task::none();
}
// Already open → switch to its tab; a load in progress →
// queue behind it (multi-file drops arrive one event each).
if let Some(idx) = self.tab_showing(&path) {
return self.update(Message::TabSwitch(idx));
}
if self.opening.is_some() {
self.pending_opens.push_back(path);
Task::none()
} else {
self.update(Message::OpenRecent(path))
}
}
Message::RecentRemove(path) => {
self.remove_recent(&path);
Task::none()