From da46175abef6adf69710a5ac37d20bc3ae79ec21 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Thu, 16 Dec 2021 12:01:04 -0500 Subject: [PATCH] DnD from app library prototype into dock intyo correct index --- examples/dock/dock_item/mod.rs | 8 ++++++-- examples/dock/window/mod.rs | 23 +++++++++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/examples/dock/dock_item/mod.rs b/examples/dock/dock_item/mod.rs index 22e82c57..a3e7e857 100644 --- a/examples/dock/dock_item/mod.rs +++ b/examples/dock/dock_item/mod.rs @@ -62,12 +62,16 @@ impl DockItem { if let Some(drag_controller) = self_.drag_controller.get() { // if let Some(file) = app_info.filename() { // let file = File::for_path(file); - let provider = ContentProvider::for_value(&app_info.to_value()); - drag_controller.set_content(Some(&provider)); + if let Some(file) = app_info.filename() { + let file = File::for_path(file); + let provider = ContentProvider::for_value(&file.to_value()); + drag_controller.set_content(Some(&provider)); + } // } drag_controller.connect_drag_end(move |_self, _drag, delete_data| { dbg!("removing", delete_data); }); + //TODO investigate X11 errors when reordering dock items drag_controller.connect_drag_cancel( glib::clone!(@weak saved_app_model => @default-return true, move |_self, _drag, _delete_data| { dbg!("removing {}", i); diff --git a/examples/dock/window/mod.rs b/examples/dock/window/mod.rs index 68a6d93c..663b3f55 100644 --- a/examples/dock/window/mod.rs +++ b/examples/dock/window/mod.rs @@ -223,15 +223,34 @@ impl Window { // None => drag.actions(), // } // }); + + let saved_app_list_view = saved_app_list_view.get(); drop_controller.connect_drop( - glib::clone!(@weak saved_app_model => @default-return true, move |_self, drop_value, x, y| { + glib::clone!(@weak saved_app_model, @weak saved_app_list_view => @default-return true, move |_self, drop_value, x, y| { + dbg!(x); + dbg!(y); + let max_y = saved_app_list_view.allocated_height(); + let max_x = saved_app_list_view.allocated_width(); + dbg!(max_x); + dbg!(max_y); + let n_buckets = saved_app_model.n_items() * 2; + + let drop_bucket = (x * n_buckets as f64 / (max_x as f64 + 0.1)) as u32; + let index = if drop_bucket == 0 { + 0 + } else if drop_bucket == n_buckets - 1 { + saved_app_model.n_items() + } else { + (drop_bucket + 1) / 2 + }; + dbg!(index); dbg!("dropped it!"); if let Ok(Some(path)) = drop_value.get::>() { dbg!(&path); if let Some(path) = &Path::new(&path).file_name() { if let Some(app_info) = gio::DesktopAppInfo::new(&path.to_string_lossy()) { dbg!(app_info.name()); - saved_app_model.append(&app_info); + saved_app_model.insert(index, &app_info); } } }