Deliver each drop to the zone under the cursor (#953)

This commit is contained in:
Thorsten Sommer authored and GitHub committed 2026-09-10 15:28:08 +02:00
1 parent c7b42bee96
commit eb65b16851
63 files changed
+1300 -554

No files matched your search

@@ -0,0 +1,13 @@
namespace AIStudio.Tools.Rust;
/// <summary>
/// The cursor position of a drag and drop event.
/// </summary>
/// <remarks>
/// The coordinates are viewport-relative CSS pixels, on every platform. The Rust runtime has already
/// dealt with the platform differences -- device pixels on Windows, logical points on macOS and Linux --
/// so these numbers can be handed to the browser for a hit test without any further conversion.
/// </remarks>
/// <param name="X">The distance from the left edge of the viewport, in CSS pixels.</param>
/// <param name="Y">The distance from the top edge of the viewport, in CSS pixels.</param>
public readonly record struct DropPosition(double X, double Y);
@@ -5,7 +5,8 @@ namespace AIStudio.Tools.Rust;
/// </summary>
/// <param name="EventType">The type of the Tauri event.</param>
/// <param name="Payload">The payload of the Tauri event.</param>
public readonly record struct TauriEvent(TauriEventType EventType, List<string> Payload)
/// <param name="Position">Where the cursor was, for the drag and drop events which know it.</param>
public readonly record struct TauriEvent(TauriEventType EventType, List<string> Payload, DropPosition? Position = null)
{
/// <summary>
/// Attempts to parse the first payload element as a shortcut.
@@ -29,6 +30,28 @@ public readonly record struct TauriEvent(TauriEventType EventType, List<string>
return TryParseSnakeCase(this.Payload[0], out shortcut);
}
/// <summary>
/// Reads the cursor position of a drag and drop event.
/// </summary>
/// <remarks>
/// The coordinates are viewport-relative CSS pixels, ready for a hit test in the browser. Only the
/// drag and drop events carry them, which is why the caller has to ask instead of assuming.
/// </remarks>
/// <param name="x">The distance from the left edge of the viewport, in CSS pixels.</param>
/// <param name="y">The distance from the top edge of the viewport, in CSS pixels.</param>
/// <returns>True if the event carried a position, false otherwise.</returns>
public bool TryGetDropPosition(out double x, out double y)
{
x = 0.0;
y = 0.0;
if (this.Position is not { } position)
return false;
x = position.X;
y = position.Y;
return true;
}
/// <summary>
/// Reads a portal shortcut change and its effective display name.
/// </summary>
@@ -13,6 +13,7 @@ public enum TauriEventType
WINDOW_NOT_FOCUSED,
FILE_DROP_HOVERED,
FILE_DROP_OVER,
FILE_DROP_DROPPED,
FILE_DROP_CANCELED,