applet: Add icon_button_from_handle (#368)

`StatusNotifierItem` can use either named icons, or pixmap data. So to
support the latter, it needs a way to show a non-named icon with the
same button styling as any other planel applet icon.

The `StatusNotifierItem` protocol actually supports sending different
icons with different sizes, so ideally we'd want a `icon::Data` variant
that contains multiple sizes? But just using the largest and scaling
works for now.
This commit is contained in:
Ian Douglas Scott 2024-03-27 09:10:41 -07:00 committed by GitHub
parent cc439b2cea
commit 61a14a953d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -118,31 +118,39 @@ impl Context {
} }
#[must_use] #[must_use]
pub fn icon_button<'a, Message: 'static>( pub fn icon_button_from_handle<'a, Message: 'static>(
&self, &self,
icon_name: &'a str, icon: widget::icon::Handle,
) -> crate::widget::Button<'a, Message, crate::Theme, Renderer> { ) -> crate::widget::Button<'a, Message, crate::Theme, Renderer> {
let suggested = self.suggested_size(); let suggested = self.suggested_size();
let applet_padding = self.suggested_padding(); let applet_padding = self.suggested_padding();
crate::widget::button( crate::widget::button(
widget::icon( widget::icon(icon)
widget::icon::from_name(icon_name) .style(theme::Svg::Custom(Rc::new(|theme| {
.symbolic(true) crate::iced_style::svg::Appearance {
.size(self.suggested_size().0) color: Some(theme.cosmic().background.on.into()),
.into(), }
) })))
.style(theme::Svg::Custom(Rc::new(|theme| { .width(Length::Fixed(suggested.0 as f32))
crate::iced_style::svg::Appearance { .height(Length::Fixed(suggested.1 as f32)),
color: Some(theme.cosmic().background.on.into()),
}
})))
.width(Length::Fixed(suggested.0 as f32))
.height(Length::Fixed(suggested.1 as f32)),
) )
.padding(applet_padding) .padding(applet_padding)
.style(Button::AppletIcon) .style(Button::AppletIcon)
} }
#[must_use]
pub fn icon_button<'a, Message: 'static>(
&self,
icon_name: &'a str,
) -> crate::widget::Button<'a, Message, crate::Theme, Renderer> {
self.icon_button_from_handle(
widget::icon::from_name(icon_name)
.symbolic(true)
.size(self.suggested_size().0)
.into(),
)
}
// TODO popup container which tracks the size of itself and requests the popup to resize to match // TODO popup container which tracks the size of itself and requests the popup to resize to match
pub fn popup_container<'a, Message: 'static>( pub fn popup_container<'a, Message: 'static>(
&self, &self,