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)