4 个版本 (破坏性更新)

0.4.0 2024 年 1 月 31 日
0.3.0 2023 年 12 月 18 日
0.2.0 2023 年 12 月 7 日
0.1.0 2023 年 11 月 10 日

#596GUI

Download history 20/week @ 2024-03-13 30/week @ 2024-03-20 71/week @ 2024-03-27 84/week @ 2024-04-03 50/week @ 2024-04-10 57/week @ 2024-04-17 87/week @ 2024-04-24 19/week @ 2024-05-01 12/week @ 2024-05-08 23/week @ 2024-05-15 20/week @ 2024-05-22 103/week @ 2024-05-29 59/week @ 2024-06-05 99/week @ 2024-06-12 61/week @ 2024-06-19 32/week @ 2024-06-26

每月 262 次下载
用于 2 crates

Apache-2.0 OR MIT

43KB
854

在 macOS、Windows 和 Linux(通过 GTK)上启动窗口外的拖动操作。

已针对 tao(最新版),winit(最新版),wry(v0.24)和 tauri(v1)窗口进行测试。

由于基于 GTK 的实现,winit 目前还不能在 Linux 上利用此 crate。

  • 添加 drag 依赖项

$cargo add drag

  • 使用 drag::start_drag 函数。它需要一个 &T: raw_window_handle::HasRawWindowHandle 类型在 macOS 和 Windows 上,以及在 Linux 上的 &gtk::ApplicationWindow

  • tao

    let event_loop = tao::event_loop::EventLoop::new();
    let window = tao::window::WindowBuilder::new().build(&event_loop).unwrap();
    
    let item = drag::DragItem::Files(vec![std::fs::canonicalize("./examples/icon.png").unwrap()]);
    let preview_icon = drag::Image::File("./examples/icon.png".into());
    
    drag::start_drag(
      #[cfg(target_os = "linux")]
      {
        use tao::platform::unix::WindowExtUnix;
        window.gtk_window()
      },
      #[cfg(not(target_os = "linux"))]
      &window,
      item,
      preview_icon,
      |result, cursor_position| {
        println!("drag result: {result:?}");
      },
      drag::Options::default(),
    );
    
    • wry
    let event_loop = wry::application::event_loop::EventLoop::new();
    let window = wry::application::window::WindowBuilder::new().build(&event_loop).unwrap();
    let webview = wry::webview::WebViewBuilder::new(window).unwrap().build().unwrap();
    
    let item = drag::DragItem::Files(vec![std::fs::canonicalize("./examples/icon.png").unwrap()]);
    let preview_icon = drag::Image::File("./examples/icon.png".into());
    
    drag::start_drag(
      #[cfg(target_os = "linux")]
      {
        use wry::application::platform::unix::WindowExtUnix;
        webview.window().gtk_window()
      },
      #[cfg(not(target_os = "linux"))]
      &webview.window(),
      item,
      preview_icon,
      |result, cursor_position| {
        println!("drag result: {result:?}");
      },
      drag::Options::default(),
    );
    
    • winit
    let event_loop = winit::event_loop::EventLoop::new().unwrap();
    let window = winit::window::WindowBuilder::new().build(&event_loop).unwrap();
    
    let item = drag::DragItem::Files(vec![std::fs::canonicalize("./examples/icon.png").unwrap()]);
    let preview_icon = drag::Image::File("./examples/icon.png".into());
    
    let _ = drag::start_drag(&window, item, preview_icon, |result, cursor_position| {
      println!("drag result: {result:?}");
    }, Default::default());
    

依赖项

~0.4–40MB
~618K SLoC