feat(app-tray): config option for dnd

This commit is contained in:
Ashley Wulber 2024-05-17 12:39:12 -04:00 committed by Ashley Wulber
parent 6ede0fbe05
commit 2e9660f2a8
2 changed files with 45 additions and 24 deletions

View file

@ -34,6 +34,7 @@ use cosmic::iced::widget::dnd_listener;
use cosmic::iced::widget::vertical_rule; use cosmic::iced::widget::vertical_rule;
use cosmic::iced::widget::vertical_space; use cosmic::iced::widget::vertical_space;
use cosmic::iced::widget::{column, dnd_source, mouse_area, row, Column, Row}; use cosmic::iced::widget::{column, dnd_source, mouse_area, row, Column, Row};
use cosmic::iced::window::icon;
use cosmic::iced::Color; use cosmic::iced::Color;
use cosmic::iced::Vector; use cosmic::iced::Vector;
use cosmic::iced::{window, Subscription}; use cosmic::iced::{window, Subscription};
@ -194,6 +195,7 @@ impl DockItem {
applet: &Context, applet: &Context,
rectangle_tracker: Option<&RectangleTracker<u32>>, rectangle_tracker: Option<&RectangleTracker<u32>>,
interaction_enabled: bool, interaction_enabled: bool,
dnd_source_enabled: bool,
gpus: Option<&[Gpu]>, gpus: Option<&[Gpu]>,
is_focused: bool, is_focused: bool,
dot_border_radius: [f32; 4], dot_border_radius: [f32; 4],
@ -278,30 +280,35 @@ impl DockItem {
.selected(is_focused) .selected(is_focused)
.style(app_list_icon_style(is_focused)); .style(app_list_icon_style(is_focused));
let icon_button = if interaction_enabled { let icon_button: Element<_> = if interaction_enabled {
dnd_source( mouse_area(
mouse_area( icon_button
icon_button .on_press_maybe(if toplevels.is_empty() {
.on_press_maybe(if toplevels.is_empty() { launch_on_preferred_gpu(desktop_info, gpus)
launch_on_preferred_gpu(desktop_info, gpus) } else if toplevels.len() == 1 {
} else if toplevels.len() == 1 { toplevels.first().map(|t| Message::Toggle(t.0.clone()))
toplevels.first().map(|t| Message::Toggle(t.0.clone())) } else {
} else { Some(Message::TopLevelListPopup(desktop_info.id.clone()))
Some(Message::TopLevelListPopup(desktop_info.id.clone())) })
}) .width(Length::Shrink)
.width(Length::Shrink) .height(Length::Shrink),
.height(Length::Shrink),
)
.on_right_release(Message::Popup(desktop_info.id.clone()))
.on_middle_release({
launch_on_preferred_gpu(desktop_info, gpus)
.unwrap_or_else(|| Message::Popup(desktop_info.id.clone()))
}),
) )
.drag_threshold(16.) .on_right_release(Message::Popup(desktop_info.id.clone()))
.on_drag(|_, _| Message::StartDrag(desktop_info.id.clone())) .on_middle_release({
.on_cancelled(Message::DragFinished) launch_on_preferred_gpu(desktop_info, gpus)
.on_finished(Message::DragFinished) .unwrap_or_else(|| Message::Popup(desktop_info.id.clone()))
})
.into()
} else {
icon_button.into()
};
let icon_button = if dnd_source_enabled && interaction_enabled {
dnd_source(icon_button)
.drag_threshold(16.)
.on_drag(|_, _| Message::StartDrag(desktop_info.id.clone()))
.on_cancelled(Message::DragFinished)
.on_finished(Message::DragFinished)
} else { } else {
dnd_source(icon_button) dnd_source(icon_button)
}; };
@ -1247,6 +1254,7 @@ impl cosmic::Application for CosmicAppList {
&self.core.applet, &self.core.applet,
self.rectangle_tracker.as_ref(), self.rectangle_tracker.as_ref(),
self.popup.is_none(), self.popup.is_none(),
self.config.enable_drag_source,
self.gpus.as_deref(), self.gpus.as_deref(),
dock_item dock_item
.toplevels .toplevels
@ -1268,6 +1276,7 @@ impl cosmic::Application for CosmicAppList {
&self.core.applet, &self.core.applet,
None, None,
false, false,
self.config.enable_drag_source,
self.gpus.as_deref(), self.gpus.as_deref(),
item.toplevels.iter().any(|y| focused_item.contains(&y.0)), item.toplevels.iter().any(|y| focused_item.contains(&y.0)),
dot_radius, dot_radius,
@ -1293,6 +1302,7 @@ impl cosmic::Application for CosmicAppList {
&self.core.applet, &self.core.applet,
self.rectangle_tracker.as_ref(), self.rectangle_tracker.as_ref(),
self.popup.is_none(), self.popup.is_none(),
self.config.enable_drag_source,
self.gpus.as_deref(), self.gpus.as_deref(),
dock_item dock_item
.toplevels .toplevels

View file

@ -14,11 +14,22 @@ pub enum TopLevelFilter {
ConfiguredOutput, ConfiguredOutput,
} }
#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq, Eq, CosmicConfigEntry)] #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, CosmicConfigEntry)]
#[version = 1] #[version = 1]
pub struct AppListConfig { pub struct AppListConfig {
pub filter_top_levels: Option<TopLevelFilter>, pub filter_top_levels: Option<TopLevelFilter>,
pub favorites: Vec<String>, pub favorites: Vec<String>,
pub enable_drag_source: bool,
}
impl Default for AppListConfig {
fn default() -> Self {
Self {
filter_top_levels: None,
favorites: Vec::new(),
enable_drag_source: true,
}
}
} }
impl AppListConfig { impl AppListConfig {