fix(appearance): color picker resize and drag, fixed size, and re-use color picker window if it exists

This commit is contained in:
Ashley Wulber 2023-11-06 14:31:02 -05:00 committed by Ashley Wulber
parent a549e8bb5f
commit e4c47058e0
5 changed files with 389 additions and 232 deletions

501
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -27,7 +27,7 @@ git = "https://github.com/pop-os/cosmic-panel"
# cosmic-config = { path = "../libcosmic/cosmic-config" } # cosmic-config = { path = "../libcosmic/cosmic-config" }
[patch."https://github.com/Smithay/client-toolkit"] [patch."https://github.com/Smithay/client-toolkit"]
sctk = { git = "https://github.com/smithay/client-toolkit//", package = "smithay-client-toolkit", rev = "dc8c4a0"} sctk = { git = "https://github.com/smithay/client-toolkit//", package = "smithay-client-toolkit", rev = "e63ab5f"}
[profile.release] [profile.release]
opt-level = 3 opt-level = 3

View file

@ -18,6 +18,7 @@ use cosmic_settings_page::{self as page, section};
use crate::config::Config; use crate::config::Config;
use crate::pages::desktop::appearance::COLOR_PICKER_DIALOG_ID;
use crate::pages::desktop::{ use crate::pages::desktop::{
self, appearance, self, appearance,
dock::{self, applets::ADD_DOCK_APPLET_DIALOGUE_ID}, dock::{self, applets::ADD_DOCK_APPLET_DIALOGUE_ID},
@ -114,6 +115,10 @@ impl cosmic::Application for SettingsApp {
Message::PageMessage(crate::pages::Message::DockApplet(dock::applets::Message( Message::PageMessage(crate::pages::Message::DockApplet(dock::applets::Message(
applets_inner::Message::ClosedAppletDialogue, applets_inner::Message::ClosedAppletDialogue,
))) )))
} else if id == COLOR_PICKER_DIALOG_ID {
Message::PageMessage(crate::pages::Message::Appearance(
appearance::Message::CloseRequested,
))
} else { } else {
return None; return None;
}; };
@ -293,7 +298,7 @@ impl cosmic::Application for SettingsApp {
.filter_map(|p| applets_inner::Applet::try_from(Cow::from(p)).ok()) .filter_map(|p| applets_inner::Applet::try_from(Cow::from(p)).ok())
.collect(); .collect();
_ = page::update!( page::update!(
self.pages, self.pages,
dock::applets::Message(applets_inner::Message::Applets(info_list.clone())), dock::applets::Message(applets_inner::Message::Applets(info_list.clone())),
dock::applets::Page dock::applets::Page

View file

@ -197,6 +197,7 @@ impl From<(Option<Config>, ThemeMode)> for Page {
pub enum Message { pub enum Message {
Entered, Entered,
DarkMode(bool), DarkMode(bool),
DragColorPicker,
Autoswitch(bool), Autoswitch(bool),
Frosted(bool), Frosted(bool),
WindowHintSize(spin_button::Message), WindowHintSize(spin_button::Message),
@ -208,7 +209,7 @@ pub enum Message {
CustomAccent(ColorPickerUpdate), CustomAccent(ColorPickerUpdate),
InterfaceText(ColorPickerUpdate), InterfaceText(ColorPickerUpdate),
ControlComponent(ColorPickerUpdate), ControlComponent(ColorPickerUpdate),
CloseRequested(window::Id), CloseRequested,
Roundness(Roundness), Roundness(Roundness),
StartImport, StartImport,
StartExport, StartExport,
@ -311,6 +312,7 @@ impl Page {
// close the color picker dialog // close the color picker dialog
// apply changes // apply changes
theme_builder_needs_update = true; theme_builder_needs_update = true;
self.active_dialog = None;
close_window::<app::Message>(COLOR_PICKER_DIALOG_ID) close_window::<app::Message>(COLOR_PICKER_DIALOG_ID)
} }
// TODO apply changes // TODO apply changes
@ -323,13 +325,18 @@ impl Page {
} }
ColorPickerUpdate::Cancel => { ColorPickerUpdate::Cancel => {
// close the color picker dialog // close the color picker dialog
self.active_dialog = None;
close_window(COLOR_PICKER_DIALOG_ID) close_window(COLOR_PICKER_DIALOG_ID)
} }
ColorPickerUpdate::ToggleColorPicker => { ColorPickerUpdate::ToggleColorPicker => {
// create the color picker dialog let prev = self
// set the active picker .active_dialog
self.active_dialog = Some(NamedColorPicker::AccentWindowHint); .replace(NamedColorPicker::AccentWindowHint);
get_window(color_picker_window_settings()) if prev.is_none() {
get_window(color_picker_window_settings())
} else {
Command::none()
}
} }
_ => Command::none(), _ => Command::none(),
}; };
@ -366,6 +373,7 @@ impl Page {
// close the color picker dialog // close the color picker dialog
// apply changes // apply changes
theme_builder_needs_update = true; theme_builder_needs_update = true;
self.active_dialog = None;
close_window::<app::Message>(COLOR_PICKER_DIALOG_ID) close_window::<app::Message>(COLOR_PICKER_DIALOG_ID)
} }
// TODO apply changes // TODO apply changes
@ -378,13 +386,18 @@ impl Page {
} }
ColorPickerUpdate::Cancel => { ColorPickerUpdate::Cancel => {
// close the color picker dialog // close the color picker dialog
self.active_dialog = None;
close_window(COLOR_PICKER_DIALOG_ID) close_window(COLOR_PICKER_DIALOG_ID)
} }
ColorPickerUpdate::ToggleColorPicker => { ColorPickerUpdate::ToggleColorPicker => {
// create the color picker dialog let prev = self
// set the active picker .active_dialog
self.active_dialog = Some(NamedColorPicker::ApplicationBackground); .replace(NamedColorPicker::ApplicationBackground);
get_window(color_picker_window_settings()) if prev.is_none() {
get_window(color_picker_window_settings())
} else {
Command::none()
}
} }
_ => Command::none(), _ => Command::none(),
}; };
@ -425,6 +438,7 @@ impl Page {
// close the color picker dialog // close the color picker dialog
// apply changes // apply changes
theme_builder_needs_update = true; theme_builder_needs_update = true;
self.active_dialog = None;
close_window::<app::Message>(COLOR_PICKER_DIALOG_ID) close_window::<app::Message>(COLOR_PICKER_DIALOG_ID)
} }
// TODO apply changes // TODO apply changes
@ -437,13 +451,16 @@ impl Page {
} }
ColorPickerUpdate::Cancel => { ColorPickerUpdate::Cancel => {
// close the color picker dialog // close the color picker dialog
self.active_dialog = None;
close_window(COLOR_PICKER_DIALOG_ID) close_window(COLOR_PICKER_DIALOG_ID)
} }
ColorPickerUpdate::ToggleColorPicker => { ColorPickerUpdate::ToggleColorPicker => {
// create the color picker dialog let prev = self.active_dialog.replace(NamedColorPicker::CustomAccent);
// set the active picker if prev.is_none() {
self.active_dialog = Some(NamedColorPicker::CustomAccent); get_window(color_picker_window_settings())
get_window(color_picker_window_settings()) } else {
Command::none()
}
} }
_ => Command::none(), _ => Command::none(),
}; };
@ -458,6 +475,7 @@ impl Page {
// close the color picker dialog // close the color picker dialog
// apply changes // apply changes
theme_builder_needs_update = true; theme_builder_needs_update = true;
self.active_dialog = None;
close_window::<app::Message>(COLOR_PICKER_DIALOG_ID) close_window::<app::Message>(COLOR_PICKER_DIALOG_ID)
} }
// TODO apply changes // TODO apply changes
@ -470,13 +488,16 @@ impl Page {
} }
ColorPickerUpdate::Cancel => { ColorPickerUpdate::Cancel => {
// close the color picker dialog // close the color picker dialog
self.active_dialog = None;
close_window(COLOR_PICKER_DIALOG_ID) close_window(COLOR_PICKER_DIALOG_ID)
} }
ColorPickerUpdate::ToggleColorPicker => { ColorPickerUpdate::ToggleColorPicker => {
// create the color picker dialog let prev = self.active_dialog.replace(NamedColorPicker::InterfaceText);
// set the active picker if prev.is_none() {
self.active_dialog = Some(NamedColorPicker::InterfaceText); get_window(color_picker_window_settings())
get_window(color_picker_window_settings()) } else {
Command::none()
}
} }
_ => Command::none(), _ => Command::none(),
}; };
@ -488,6 +509,7 @@ impl Page {
// close the color picker dialog // close the color picker dialog
// apply changes // apply changes
theme_builder_needs_update = true; theme_builder_needs_update = true;
self.active_dialog = None;
close_window::<app::Message>(COLOR_PICKER_DIALOG_ID) close_window::<app::Message>(COLOR_PICKER_DIALOG_ID)
} }
// TODO apply changes // TODO apply changes
@ -500,19 +522,24 @@ impl Page {
} }
ColorPickerUpdate::Cancel => { ColorPickerUpdate::Cancel => {
// close the color picker dialog // close the color picker dialog
self.active_dialog = None;
close_window(COLOR_PICKER_DIALOG_ID) close_window(COLOR_PICKER_DIALOG_ID)
} }
ColorPickerUpdate::ToggleColorPicker => { ColorPickerUpdate::ToggleColorPicker => {
// create the color picker dialog let prev = self
// set the active picker .active_dialog
self.active_dialog = Some(NamedColorPicker::ControlComponent); .replace(NamedColorPicker::ControlComponent);
get_window(color_picker_window_settings()) if prev.is_none() {
get_window(color_picker_window_settings())
} else {
Command::none()
}
} }
_ => Command::none(), _ => Command::none(),
}; };
Command::batch(vec![cmd, self.control_component.update::<app::Message>(u)]) Command::batch(vec![cmd, self.control_component.update::<app::Message>(u)])
} }
Message::CloseRequested(_) => { Message::CloseRequested => {
match self.active_dialog.take() { match self.active_dialog.take() {
Some(NamedColorPicker::ApplicationBackground) => { Some(NamedColorPicker::ApplicationBackground) => {
_ = self _ = self
@ -775,6 +802,9 @@ impl Page {
}; };
Command::none() Command::none()
} }
Message::DragColorPicker => {
cosmic::iced_sctk::commands::window::start_drag_window(COLOR_PICKER_DIALOG_ID)
}
}; };
if theme_builder_needs_update { if theme_builder_needs_update {
@ -851,17 +881,24 @@ impl Page {
column![ column![
header_bar() header_bar()
.title(fl!("color-picker")) .title(fl!("color-picker"))
.on_close(msg(ColorPickerUpdate::AppliedColor)), .on_close(msg(ColorPickerUpdate::AppliedColor))
picker .on_drag(Message::DragColorPicker),
.builder(msg) container(
.width(Length::Fixed(254.0)) picker
.height(Length::Fixed(174.0)) .builder(msg)
.reset_label(fl!("reset-to-default")) .width(Length::Fixed(254.0))
.build( .height(Length::Fixed(174.0))
fl!("recent-colors"), .reset_label(fl!("reset-to-default"))
fl!("copy-to-clipboard"), .build(
fl!("copied-to-clipboard"), fl!("recent-colors"),
) fl!("copy-to-clipboard"),
fl!("copied-to-clipboard"),
)
)
.width(Length::Fill)
.height(Length::Fill)
.align_x(cosmic::iced_core::alignment::Horizontal::Center)
.style(cosmic::theme::style::Container::Background)
] ]
.width(Length::Fill) .width(Length::Fill)
.height(Length::Fill) .height(Length::Fill)
@ -1333,10 +1370,10 @@ fn color_picker_window_settings() -> SctkWindowSettings {
size_limits: layout::Limits::NONE size_limits: layout::Limits::NONE
.min_width(300.0) .min_width(300.0)
.max_width(800.0) .max_width(800.0)
.min_height(200.0) .min_height(520.0)
.max_height(1080.0), .max_height(1080.0),
size: (286, 424), size: (300, 520),
resizable: None, resizable: Some(8.0),
client_decorations: true, client_decorations: true,
transparent: true, transparent: true,
} }

View file

@ -404,7 +404,7 @@ impl PageInner {
.iter() .iter()
.find(|b| b.to_string() == self.backgrounds[a]) .find(|b| b.to_string() == self.backgrounds[a])
{ {
panel_config.background = b.clone().into(); panel_config.background = (*b).into();
} }
} }
Message::ExtendToEdge(enabled) => { Message::ExtendToEdge(enabled) => {