From 716b3dee560d92cb4b651de10daeee5c1b64818e Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Tue, 30 Jul 2024 18:29:01 +0200 Subject: [PATCH] feat: use cached window control icons on other OSes --- res/icons/window-close-symbolic.svg | 3 +++ res/icons/window-maximize-symbolic.svg | 4 +++ res/icons/window-minimize-symbolic.svg | 3 +++ src/widget/header_bar.rs | 34 +++++++++++++++++--------- 4 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 res/icons/window-close-symbolic.svg create mode 100644 res/icons/window-maximize-symbolic.svg create mode 100644 res/icons/window-minimize-symbolic.svg diff --git a/res/icons/window-close-symbolic.svg b/res/icons/window-close-symbolic.svg new file mode 100644 index 0000000..2533639 --- /dev/null +++ b/res/icons/window-close-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/res/icons/window-maximize-symbolic.svg b/res/icons/window-maximize-symbolic.svg new file mode 100644 index 0000000..ef66334 --- /dev/null +++ b/res/icons/window-maximize-symbolic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/res/icons/window-minimize-symbolic.svg b/res/icons/window-minimize-symbolic.svg new file mode 100644 index 0000000..fdcf99b --- /dev/null +++ b/res/icons/window-minimize-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/widget/header_bar.rs b/src/widget/header_bar.rs index 4975215..0b21030 100644 --- a/src/widget/header_bar.rs +++ b/src/widget/header_bar.rs @@ -5,7 +5,7 @@ use crate::config::Density; use crate::{ext::CollectionWidget, widget, Element}; use apply::Apply; use derive_setters::Setters; -use iced::{Length, Padding}; +use iced::Length; use iced_core::{widget::tree, Widget}; use std::borrow::Cow; @@ -358,15 +358,27 @@ impl<'a, Message: Clone + 'static> HeaderBar<'a, Message> { /// Creates the widget for window controls. fn window_controls(&mut self) -> Element<'a, Message> { - let icon = |name, size, on_press| { - widget::icon::from_name(name) - .symbolic(true) - .apply(widget::button::icon) + macro_rules! icon { + ($name:expr, $size:expr, $on_press:expr) => {{ + #[cfg(target_os = "linux")] + { + widget::icon::from_name($name).apply(widget::button::icon) + } + #[cfg(not(target_os = "linux"))] + { + widget::icon::from_svg_bytes(include_bytes!(concat!( + "../../res/icons/", + $name, + ".svg" + ))) + .apply(widget::button::icon) + } .style(crate::theme::Button::HeaderBar) .selected(self.focused) - .icon_size(size) - .on_press(on_press) - }; + .icon_size($size) + .on_press($on_press) + }}; + } let density = self.density.unwrap_or_else(crate::config::header_size); let spacing = if matches!(density, Density::Compact) { @@ -379,17 +391,17 @@ impl<'a, Message: Clone + 'static> HeaderBar<'a, Message> { .push_maybe( self.on_minimize .take() - .map(|m| icon("window-minimize-symbolic", 16, m)), + .map(|m| icon!("window-minimize-symbolic", 16, m)), ) .push_maybe( self.on_maximize .take() - .map(|m| icon("window-maximize-symbolic", 16, m)), + .map(|m| icon!("window-maximize-symbolic", 16, m)), ) .push_maybe( self.on_close .take() - .map(|m| icon("window-close-symbolic", 16, m)), + .map(|m| icon!("window-close-symbolic", 16, m)), ) .spacing(spacing) .apply(widget::container)