feat(app-tray): config option for dnd
This commit is contained in:
parent
6ede0fbe05
commit
2e9660f2a8
2 changed files with 45 additions and 24 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue