diff --git a/data/gtk/window.ui b/data/gtk/window.ui index 51db83d..b987339 100644 --- a/data/gtk/window.ui +++ b/data/gtk/window.ui @@ -169,12 +169,9 @@ + drop_target - 24 - 24 - 24 - 24 false copy diff --git a/data/resources/style.css b/data/resources/style.css index 4a339da..7833aa6 100644 --- a/data/resources/style.css +++ b/data/resources/style.css @@ -31,17 +31,21 @@ row.property label.subtitle { box-shadow: 0 0 10px rgba(0, 0, 0, 200); } -.custom-drag-n-drop-highlight { +/* Remove default adwaita style */ +.drop-widget:drop(active):focus, +.drop-widget:drop(active) { box-shadow: none; } +/* Drag overlay */ .lp-dragging-area-highlight { border-radius: 8px; background-color: alpha(@blue_2, 0.35); + margin: 24px; } lpprintpreview { background-color: rgb(240, 240, 240); border-radius: 4px; box-shadow: 0 0 14px 1px black; -} \ No newline at end of file +} diff --git a/src/widgets/drag_overlay.rs b/src/widgets/drag_overlay.rs index cd622f8..1d41909 100644 --- a/src/widgets/drag_overlay.rs +++ b/src/widgets/drag_overlay.rs @@ -16,10 +16,11 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -use gtk::{glib, prelude::*}; +use crate::deps::*; +use adw::prelude::*; mod imp { - use std::cell::RefCell; + use once_cell::sync::OnceCell; use adw::subclass::prelude::*; use glib::{ParamSpec, Properties, Value}; @@ -37,9 +38,8 @@ mod imp { pub overlayed: Option, pub overlay: gtk::Overlay, pub revealer: gtk::Revealer, - #[property(set = Self::set_drop_target, get, explicit_notify)] - pub drop_target: RefCell>, - pub handler_id: RefCell>, + #[property(set = Self::set_drop_target, get, explicit_notify, construct_only)] + pub drop_target: OnceCell, } #[glib::object_subclass] @@ -47,6 +47,10 @@ mod imp { const NAME: &'static str = "LpDragOverlay"; type Type = super::LpDragOverlay; type ParentType = adw::Bin; + + fn class_init(klass: &mut Self::Class) { + klass.set_css_name("lpdragoverlay"); + } } impl ObjectImpl for LpDragOverlay { @@ -88,29 +92,17 @@ mod imp { self.revealer.set_child(overlayed.as_ref()); } - pub fn set_drop_target(&self, drop_target: >k::DropTarget) { - if let Some(target) = self.drop_target.borrow_mut().take() { - self.obj().remove_controller(&target); - - if let Some(handler_id) = self.handler_id.borrow_mut().take() { - target.disconnect(handler_id); - } - } - - let handler_id = drop_target.connect_current_drop_notify( + pub fn set_drop_target(&self, drop_target: gtk::DropTarget) { + drop_target.connect_current_drop_notify( glib::clone!(@weak self.revealer as revealer => move |target| { let reveal = target.current_drop().is_some(); revealer.set_reveal_child(reveal); }), ); - self.handler_id.replace(Some(handler_id)); - // avoid `gtk_event_controller_get_widget (controller) == NULL` failing - if drop_target.widget().is_visible() { - self.obj().add_controller(drop_target.clone()); - self.drop_target.replace(Some(drop_target.clone())); - self.obj().notify("drop-target"); - } + self.drop_target.set(drop_target).unwrap(); + + self.obj().notify("drop-target"); } } } diff --git a/src/window.rs b/src/window.rs index 3444220..5e8cee2 100644 --- a/src/window.rs +++ b/src/window.rs @@ -419,7 +419,6 @@ mod imp { true }), ); - self.drag_overlay.set_drop_target(&*self.drop_target); } }