Update libcosmic/iced

This commit is contained in:
Ian Douglas Scott 2024-02-09 16:48:03 -08:00 committed by Victoria Brekenfeld
parent 7234a81672
commit 39ebf39e4f
11 changed files with 547 additions and 461 deletions

560
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -10,7 +10,7 @@ use crate::{
use calloop::LoopHandle; use calloop::LoopHandle;
use cosmic::{ use cosmic::{
iced::widget::{column, container, horizontal_space, row, vertical_space}, iced::widget::{column, container, horizontal_space, row, vertical_space},
iced_core::{Background, Color, Length}, iced_core::{Background, Border, Color, Length},
theme, theme,
widget::{icon::from_name, text}, widget::{icon::from_name, text},
Apply, Apply,
@ -64,16 +64,19 @@ pub struct ResizeIndicatorInternal {
impl Program for ResizeIndicatorInternal { impl Program for ResizeIndicatorInternal {
type Message = (); type Message = ();
fn view(&self) -> crate::utils::iced::Element<'_, Self::Message> { fn view(&self) -> cosmic::Element<'_, Self::Message> {
let edges = self.edges.lock().unwrap(); let edges = self.edges.lock().unwrap();
let icon_container_style = || { let icon_container_style = || {
theme::Container::custom(|theme| container::Appearance { theme::Container::custom(|theme| container::Appearance {
icon_color: Some(Color::from(theme.cosmic().accent.on)), icon_color: Some(Color::from(theme.cosmic().accent.on)),
text_color: Some(Color::from(theme.cosmic().accent.on)), text_color: Some(Color::from(theme.cosmic().accent.on)),
background: Some(Background::Color(theme.cosmic().accent_color().into())), background: Some(Background::Color(theme.cosmic().accent_color().into())),
border_radius: 18.0.into(), border: Border {
border_width: 0.0, radius: 18.0.into(),
border_color: Color::TRANSPARENT, width: 0.0,
color: Color::TRANSPARENT,
},
shadow: Default::default(),
}) })
}; };

View file

@ -17,7 +17,7 @@ use crate::{
use calloop::LoopHandle; use calloop::LoopHandle;
use cosmic::{ use cosmic::{
iced::{id::Id, widget as iced_widget}, iced::{id::Id, widget as iced_widget},
iced_core::{Background, BorderRadius, Color, Length}, iced_core::{border::Radius, Background, Border, Color, Length},
iced_runtime::Command, iced_runtime::Command,
iced_widget::scrollable::AbsoluteOffset, iced_widget::scrollable::AbsoluteOffset,
theme, widget as cosmic_widget, Apply, Element as CosmicElement, theme, widget as cosmic_widget, Apply, Element as CosmicElement,
@ -866,9 +866,12 @@ impl Program for CosmicStackInternal {
icon_color: Some(Color::from(theme.cosmic().background.on)), icon_color: Some(Color::from(theme.cosmic().background.on)),
text_color: Some(Color::from(theme.cosmic().background.on)), text_color: Some(Color::from(theme.cosmic().background.on)),
background: Some(Background::Color(theme.cosmic().accent_color().into())), background: Some(Background::Color(theme.cosmic().accent_color().into())),
border_radius: BorderRadius::from([8.0, 8.0, 0.0, 0.0]), border: Border {
border_width: 0.0, radius: Radius::from([8.0, 8.0, 0.0, 0.0]),
border_color: Color::TRANSPARENT, width: 0.0,
color: Color::TRANSPARENT,
},
shadow: Default::default(),
}) })
} else { } else {
theme::Container::custom(|theme| iced_widget::container::Appearance { theme::Container::custom(|theme| iced_widget::container::Appearance {
@ -877,9 +880,12 @@ impl Program for CosmicStackInternal {
background: Some(Background::Color(tab::primary_container_color( background: Some(Background::Color(tab::primary_container_color(
theme.cosmic(), theme.cosmic(),
))), ))),
border_radius: BorderRadius::from([8.0, 8.0, 0.0, 0.0]), border: Border {
border_width: 0.0, radius: Radius::from([8.0, 8.0, 0.0, 0.0]),
border_color: Color::TRANSPARENT, width: 0.0,
color: Color::TRANSPARENT,
},
shadow: Default::default(),
}) })
}) })
.into() .into()

View file

@ -10,7 +10,7 @@ use cosmic::{
tree::Tree, tree::Tree,
Id, Widget, Id, Widget,
}, },
Clipboard, Color, Length, Rectangle, Shell, Size, Border, Clipboard, Color, Length, Rectangle, Shell, Size,
}, },
iced_widget::scrollable::AbsoluteOffset, iced_widget::scrollable::AbsoluteOffset,
theme, theme,
@ -104,9 +104,12 @@ impl From<TabBackgroundTheme> for theme::Container {
icon_color: Some(Color::from(theme.cosmic().accent_text_color())), icon_color: Some(Color::from(theme.cosmic().accent_text_color())),
text_color: Some(Color::from(theme.cosmic().accent_text_color())), text_color: Some(Color::from(theme.cosmic().accent_text_color())),
background: Some(background_theme.background_color(theme).into()), background: Some(background_theme.background_color(theme).into()),
border_radius: 0.0.into(), border: Border {
border_width: 0.0, radius: 0.0.into(),
border_color: Color::TRANSPARENT, width: 0.0,
color: Color::TRANSPARENT,
},
shadow: Default::default(),
}) })
} }
TabBackgroundTheme::ActiveDeactivated => { TabBackgroundTheme::ActiveDeactivated => {
@ -114,9 +117,12 @@ impl From<TabBackgroundTheme> for theme::Container {
icon_color: None, icon_color: None,
text_color: None, text_color: None,
background: Some(background_theme.background_color(theme).into()), background: Some(background_theme.background_color(theme).into()),
border_radius: 0.0.into(), border: Border {
border_width: 0.0, radius: 0.0.into(),
border_color: Color::TRANSPARENT, width: 0.0,
color: Color::TRANSPARENT,
},
shadow: Default::default(),
}) })
} }
TabBackgroundTheme::Default => Self::Transparent, TabBackgroundTheme::Default => Self::Transparent,
@ -203,7 +209,7 @@ impl<Message: TabMessage + 'static> Tab<Message> {
self self
} }
pub(super) fn internal(self, idx: usize) -> TabInternal<'static, Message> { pub(super) fn internal<'a>(self, idx: usize) -> TabInternal<'a, Message> {
let mut close_button = from_name("window-close-symbolic") let mut close_button = from_name("window-close-symbolic")
.size(16) .size(16)
.prefer_svg(true) .prefer_svg(true)
@ -270,7 +276,10 @@ pub(super) struct TabInternal<'a, Message: TabMessage> {
right_click_message: Option<Message>, right_click_message: Option<Message>,
} }
impl<'a, Message: TabMessage> Widget<Message, cosmic::Renderer> for TabInternal<'a, Message> { impl<'a, Message> Widget<Message, cosmic::Theme, cosmic::Renderer> for TabInternal<'a, Message>
where
Message: TabMessage,
{
fn id(&self) -> Option<Id> { fn id(&self) -> Option<Id> {
Some(self.id.clone()) Some(self.id.clone())
} }
@ -283,12 +292,8 @@ impl<'a, Message: TabMessage> Widget<Message, cosmic::Renderer> for TabInternal<
tree.diff_children(&mut self.elements); tree.diff_children(&mut self.elements);
} }
fn width(&self) -> Length { fn size(&self) -> Size<Length> {
Length::Fill Size::new(Length::Fill, Length::Fill)
}
fn height(&self) -> Length {
Length::Fill
} }
fn layout(&self, tree: &mut Tree, renderer: &cosmic::Renderer, limits: &Limits) -> Node { fn layout(&self, tree: &mut Tree, renderer: &cosmic::Renderer, limits: &Limits) -> Node {
@ -305,7 +310,9 @@ impl<'a, Message: TabMessage> Widget<Message, cosmic::Renderer> for TabInternal<
.min_height(min_size.height) .min_height(min_size.height)
.width(Length::Fill) .width(Length::Fill)
.height(Length::Fill); .height(Length::Fill);
let size = limits.resolve(min_size).max(min_size); let size = limits
.resolve(Length::Shrink, Length::Shrink, min_size)
.max(min_size);
let limits = Limits::new(size, size) let limits = Limits::new(size, size)
.min_width(size.width) .min_width(size.width)
@ -316,6 +323,8 @@ impl<'a, Message: TabMessage> Widget<Message, cosmic::Renderer> for TabInternal<
cosmic::iced_core::layout::flex::Axis::Horizontal, cosmic::iced_core::layout::flex::Axis::Horizontal,
renderer, renderer,
&limits, &limits,
Length::Fill,
Length::Fill,
0.into(), 0.into(),
8., 8.,
cosmic::iced::Alignment::Center, cosmic::iced::Alignment::Center,
@ -474,7 +483,7 @@ impl<'a, Message: TabMessage> Widget<Message, cosmic::Renderer> for TabInternal<
tree: &'b mut Tree, tree: &'b mut Tree,
layout: Layout<'_>, layout: Layout<'_>,
renderer: &cosmic::Renderer, renderer: &cosmic::Renderer,
) -> Option<overlay::Element<'b, Message, cosmic::Renderer>> { ) -> Option<overlay::Element<'b, Message, cosmic::Theme, cosmic::Renderer>> {
overlay::from_children(&mut self.elements, tree, layout, renderer) overlay::from_children(&mut self.elements, tree, layout, renderer)
} }
} }

View file

@ -9,7 +9,7 @@ use cosmic::{
renderer::{self, Renderer as IcedRenderer}, renderer::{self, Renderer as IcedRenderer},
text::{LineHeight, Paragraph, Renderer as TextRenderer, Shaping}, text::{LineHeight, Paragraph, Renderer as TextRenderer, Shaping},
widget::{tree, Tree, Widget}, widget::{tree, Tree, Widget},
Background, Color, Degrees, Gradient, Length, Rectangle, Size, Text, Background, Border, Color, Degrees, Gradient, Length, Rectangle, Size, Text,
}, },
}; };
@ -86,7 +86,7 @@ impl TabText {
} }
} }
impl<Message> Widget<Message, cosmic::Renderer> for TabText { impl<Message> Widget<Message, cosmic::Theme, cosmic::Renderer> for TabText {
fn tag(&self) -> tree::Tag { fn tag(&self) -> tree::Tag {
tree::Tag::of::<LocalState>() tree::Tag::of::<LocalState>()
} }
@ -99,20 +99,15 @@ impl<Message> Widget<Message, cosmic::Renderer> for TabText {
}) })
} }
fn width(&self) -> Length { fn size(&self) -> Size<Length> {
self.width Size::new(self.width, self.height)
}
fn height(&self) -> Length {
self.height
} }
fn layout(&self, tree: &mut Tree, _renderer: &cosmic::Renderer, limits: &Limits) -> Node { fn layout(&self, tree: &mut Tree, _renderer: &cosmic::Renderer, limits: &Limits) -> Node {
let limits = limits.width(self.width).height(self.height);
let state = tree.state.downcast_mut::<LocalState>(); let state = tree.state.downcast_mut::<LocalState>();
let text_bounds = state.paragraph.min_bounds(); let text_bounds = state.paragraph.min_bounds();
state.overflowed = limits.max().width < text_bounds.width; state.overflowed = limits.max().width < text_bounds.width;
let actual_size = limits.resolve(text_bounds); let actual_size = limits.resolve(self.width, self.height, text_bounds);
Node::new(actual_size) Node::new(actual_size)
} }
@ -163,9 +158,12 @@ impl<Message> Widget<Message, cosmic::Renderer> for TabText {
width: 24.0_f32.min(bounds.width), width: 24.0_f32.min(bounds.width),
..bounds ..bounds
}, },
border_radius: 0.0.into(), border: Border {
border_width: 0.0, radius: 0.0.into(),
border_color: Color::TRANSPARENT, width: 0.0,
color: Color::TRANSPARENT,
},
shadow: Default::default(),
}, },
Background::Gradient(Gradient::Linear( Background::Gradient(Gradient::Linear(
gradient::Linear::new(Degrees(90.)) gradient::Linear::new(Degrees(90.))

View file

@ -13,7 +13,8 @@ use cosmic::{
tree::{self, Tree}, tree::{self, Tree},
Widget, Widget,
}, },
Background, Clipboard, Color, Length, Point, Rectangle, Renderer, Shell, Size, Vector, Background, Border, Clipboard, Color, Length, Point, Rectangle, Renderer, Shell, Size,
Vector,
}, },
iced_style::container::StyleSheet as ContainerStyleSheet, iced_style::container::StyleSheet as ContainerStyleSheet,
iced_widget::container::draw_background, iced_widget::container::draw_background,
@ -291,15 +292,12 @@ impl State {
} }
} }
impl<'a, Message> Widget<Message, cosmic::Renderer> for Tabs<'a, Message> impl<'a, Message> Widget<Message, cosmic::Theme, cosmic::Renderer> for Tabs<'a, Message>
where where
Message: TabMessage, Message: TabMessage,
{ {
fn width(&self) -> Length { fn size(&self) -> Size<Length> {
self.width Size::new(self.width, self.height)
}
fn height(&self) -> Length {
self.height
} }
fn id(&self) -> Option<Id> { fn id(&self) -> Option<Id> {
@ -352,7 +350,7 @@ where
width: a.width + b.width, width: a.width + b.width,
height: a.height.max(b.height), height: a.height.max(b.height),
}); });
let size = limits.resolve(min_size); let size = limits.resolve(self.width, self.height, min_size);
if min_size.width <= size.width { if min_size.width <= size.width {
// we don't need to scroll // we don't need to scroll
@ -366,6 +364,8 @@ where
cosmic::iced_core::layout::flex::Axis::Horizontal, cosmic::iced_core::layout::flex::Axis::Horizontal,
renderer, renderer,
&limits, &limits,
self.width,
self.height,
0.into(), 0.into(),
0., 0.,
cosmic::iced::Alignment::Center, cosmic::iced::Alignment::Center,
@ -392,15 +392,14 @@ where
.height(Length::Shrink); .height(Length::Shrink);
let mut node = tab.as_widget().layout(tab_tree, renderer, &child_limits); let mut node = tab.as_widget().layout(tab_tree, renderer, &child_limits);
node.move_to(Point::new(offset, 0.)); node = node.move_to(Point::new(offset, 0.));
offset += node.bounds().width; offset += node.bounds().width;
node node
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
nodes.push({ nodes.push({
let mut node = Node::new(Size::new(4., limits.max().height)); let node = Node::new(Size::new(4., limits.max().height));
node.move_to(Point::new(offset, 0.)); node.move_to(Point::new(offset, 0.))
node
}); });
nodes nodes
}; };
@ -424,7 +423,7 @@ where
// we scroll, so use the computed min size, but add scroll buttons. // we scroll, so use the computed min size, but add scroll buttons.
let mut offset = 30.; let mut offset = 30.;
for node in &mut nodes { for node in &mut nodes {
node.move_to(Point::new(offset, 0.)); *node = node.clone().move_to(Point::new(offset, 0.));
offset += node.bounds().width; offset += node.bounds().width;
} }
let last_position = Point::new(size.width - 34., 0.); let last_position = Point::new(size.width - 34., 0.);
@ -437,7 +436,7 @@ where
Size::new(16., 16.), Size::new(16., 16.),
vec![Node::new(Size::new(16., 16.))], vec![Node::new(Size::new(16., 16.))],
); );
node.move_to(Point::new(9., (size.height - 16.) / 2.)); node = node.move_to(Point::new(9., (size.height - 16.) / 2.));
node node
}] }]
.into_iter() .into_iter()
@ -445,7 +444,7 @@ where
.chain(vec![ .chain(vec![
{ {
let mut node = Node::new(Size::new(4., size.height)); let mut node = Node::new(Size::new(4., size.height));
node.move_to(last_position); node = node.move_to(last_position);
node node
}, },
{ {
@ -453,12 +452,13 @@ where
Size::new(16., 16.), Size::new(16., 16.),
vec![Node::new(Size::new(16., 16.))], vec![Node::new(Size::new(16., 16.))],
); );
node.move_to(last_position + Vector::new(9., (size.height - 16.) / 2.)); node =
node.move_to(last_position + Vector::new(9., (size.height - 16.) / 2.));
node node
}, },
{ {
let mut node = Node::new(Size::new(4., size.height)); let mut node = Node::new(Size::new(4., size.height));
node.move_to(last_position + Vector::new(30., 0.)); node = node.move_to(last_position + Vector::new(30., 0.));
node node
}, },
]) ])
@ -498,9 +498,12 @@ where
background: Some(Background::Color(super::tab::primary_container_color( background: Some(Background::Color(super::tab::primary_container_color(
theme.cosmic(), theme.cosmic(),
))), ))),
border_radius: 0.0.into(), border: Border {
border_width: 0.0, radius: 0.0.into(),
border_color: Color::TRANSPARENT, width: 0.0,
color: Color::TRANSPARENT,
},
shadow: Default::default(),
}), }),
); );
draw_background(renderer, &background_style, bounds); draw_background(renderer, &background_style, bounds);
@ -990,7 +993,7 @@ where
tree: &'b mut Tree, tree: &'b mut Tree,
layout: Layout<'_>, layout: Layout<'_>,
renderer: &cosmic::Renderer, renderer: &cosmic::Renderer,
) -> Option<overlay::Element<'b, Message, cosmic::Renderer>> { ) -> Option<overlay::Element<'b, Message, cosmic::Theme, cosmic::Renderer>> {
overlay::from_children(&mut self.elements, tree, layout, renderer) overlay::from_children(&mut self.elements, tree, layout, renderer)
} }
} }

View file

@ -6,7 +6,7 @@ use crate::{
use calloop::LoopHandle; use calloop::LoopHandle;
use cosmic::{ use cosmic::{
iced::widget::{container, row}, iced::widget::{container, row},
iced_core::{Background, Color, Length}, iced_core::{Background, Border, Color, Length},
theme, theme,
widget::{icon::from_name, text}, widget::{icon::from_name, text},
Apply, Apply,
@ -28,7 +28,7 @@ pub struct StackHoverInternal;
impl Program for StackHoverInternal { impl Program for StackHoverInternal {
type Message = (); type Message = ();
fn view(&self) -> crate::utils::iced::Element<'_, Self::Message> { fn view(&self) -> cosmic::Element<'_, Self::Message> {
row(vec![ row(vec![
from_name("window-stack-symbolic") from_name("window-stack-symbolic")
.size(24) .size(24)
@ -60,9 +60,12 @@ impl Program for StackHoverInternal {
icon_color: Some(Color::from(theme.cosmic().accent.on)), icon_color: Some(Color::from(theme.cosmic().accent.on)),
text_color: Some(Color::from(theme.cosmic().accent.on)), text_color: Some(Color::from(theme.cosmic().accent.on)),
background: Some(Background::Color(theme.cosmic().accent_color().into())), background: Some(Background::Color(theme.cosmic().accent_color().into())),
border_radius: 24.0.into(), border: Border {
border_width: 0.0, radius: 24.0.into(),
border_color: Color::TRANSPARENT, width: 0.0,
color: Color::TRANSPARENT,
},
shadow: Default::default(),
})) }))
.width(Length::Shrink) .width(Length::Shrink)
.height(Length::Fixed(48.)) .height(Length::Fixed(48.))

View file

@ -6,7 +6,7 @@ use crate::{
use calloop::LoopHandle; use calloop::LoopHandle;
use cosmic::{ use cosmic::{
iced::widget::{container, horizontal_space, row}, iced::widget::{container, horizontal_space, row},
iced_core::{Alignment, Background, Color, Length}, iced_core::{Alignment, Background, Border, Color, Length},
theme, theme,
widget::{icon::from_name, text}, widget::{icon::from_name, text},
Apply, Apply,
@ -27,7 +27,7 @@ pub struct SwapIndicatorInternal;
impl Program for SwapIndicatorInternal { impl Program for SwapIndicatorInternal {
type Message = (); type Message = ();
fn view(&self) -> crate::utils::iced::Element<'_, Self::Message> { fn view(&self) -> cosmic::Element<'_, Self::Message> {
row(vec![ row(vec![
from_name("window-swap-symbolic") from_name("window-swap-symbolic")
.size(32) .size(32)
@ -50,9 +50,12 @@ impl Program for SwapIndicatorInternal {
icon_color: Some(Color::from(theme.cosmic().accent.on)), icon_color: Some(Color::from(theme.cosmic().accent.on)),
text_color: Some(Color::from(theme.cosmic().accent.on)), text_color: Some(Color::from(theme.cosmic().accent.on)),
background: Some(Background::Color(theme.cosmic().accent_color().into())), background: Some(Background::Color(theme.cosmic().accent_color().into())),
border_radius: 18.0.into(), border: Border {
border_width: 0.0, radius: 18.0.into(),
border_color: Color::TRANSPARENT, width: 0.0,
color: Color::TRANSPARENT,
},
shadow: Default::default(),
})) }))
.width(Length::Shrink) .width(Length::Shrink)
.height(Length::Shrink) .height(Length::Shrink)

View file

@ -4,28 +4,20 @@ use cosmic::{
event, layout, mouse, overlay, event, layout, mouse, overlay,
renderer::{Quad, Style}, renderer::{Quad, Style},
widget::{tree, Id, OperationOutputWrapper, Tree, Widget}, widget::{tree, Id, OperationOutputWrapper, Tree, Widget},
Background, Clipboard, Color, Event, Layout, Length, Rectangle, Renderer as IcedRenderer, Background, Border, Clipboard, Color, Event, Layout, Length, Rectangle,
Shell, Renderer as IcedRenderer, Shell, Size,
}, },
widget::button::StyleSheet, widget::button::StyleSheet,
}; };
pub struct SubmenuItem<'a, Message, Renderer> pub struct SubmenuItem<'a, Message> {
where elem: cosmic::Element<'a, Message>,
Renderer: IcedRenderer,
Renderer::Theme: StyleSheet,
{
elem: Element<'a, Message, Renderer>,
idx: usize, idx: usize,
styling: <Renderer::Theme as StyleSheet>::Style, styling: <cosmic::Theme as StyleSheet>::Style,
} }
impl<'a, Message, Renderer> SubmenuItem<'a, Message, Renderer> impl<'a, Message> SubmenuItem<'a, Message> {
where pub fn new(elem: impl Into<cosmic::Element<'a, Message>>, idx: usize) -> Self {
Renderer: IcedRenderer,
Renderer::Theme: StyleSheet,
{
pub fn new(elem: impl Into<Element<'a, Message, Renderer>>, idx: usize) -> Self {
Self { Self {
elem: elem.into(), elem: elem.into(),
idx, idx,
@ -33,7 +25,7 @@ where
} }
} }
pub fn style(mut self, style: <Renderer::Theme as StyleSheet>::Style) -> Self { pub fn style(mut self, style: <cosmic::Theme as StyleSheet>::Style) -> Self {
self.styling = style; self.styling = style;
self self
} }
@ -48,28 +40,22 @@ struct State {
cursor_over: bool, cursor_over: bool,
} }
impl<'a, Message, Renderer> Widget<Message, Renderer> for SubmenuItem<'a, Message, Renderer> impl<'a, Message> Widget<Message, cosmic::Theme, cosmic::Renderer> for SubmenuItem<'a, Message>
where where
Renderer: IcedRenderer,
Renderer::Theme: StyleSheet,
Message: CursorEvents, Message: CursorEvents,
{ {
fn id(&self) -> Option<Id> { fn id(&self) -> Option<Id> {
None None
} }
fn width(&self) -> Length { fn size(&self) -> Size<Length> {
self.elem.as_widget().width() self.elem.as_widget().size()
}
fn height(&self) -> Length {
self.elem.as_widget().height()
} }
fn layout( fn layout(
&self, &self,
state: &mut Tree, state: &mut Tree,
renderer: &Renderer, renderer: &cosmic::Renderer,
limits: &layout::Limits, limits: &layout::Limits,
) -> layout::Node { ) -> layout::Node {
let state = &mut state.children[0]; let state = &mut state.children[0];
@ -80,8 +66,8 @@ where
fn draw( fn draw(
&self, &self,
state: &Tree, state: &Tree,
renderer: &mut Renderer, renderer: &mut cosmic::Renderer,
theme: &<Renderer as IcedRenderer>::Theme, theme: &cosmic::Theme,
style: &Style, style: &Style,
layout: Layout<'_>, layout: Layout<'_>,
cursor: mouse::Cursor, cursor: mouse::Cursor,
@ -89,17 +75,20 @@ where
) { ) {
let widget_state = state.state.downcast_ref::<State>(); let widget_state = state.state.downcast_ref::<State>();
let styling = if widget_state.cursor_over { let styling = if widget_state.cursor_over {
theme.hovered(true, &self.styling) theme.hovered(true, false, &self.styling)
} else { } else {
theme.active(true, &self.styling) theme.active(true, false, &self.styling)
}; };
renderer.fill_quad( renderer.fill_quad(
Quad { Quad {
bounds: layout.bounds(), bounds: layout.bounds(),
border_radius: styling.border_radius, border: Border {
border_width: styling.border_width, radius: styling.border_radius,
border_color: styling.border_color, width: styling.border_width,
color: styling.border_color,
},
shadow: Default::default(),
}, },
styling styling
.background .background
@ -143,7 +132,7 @@ where
&self, &self,
state: &mut Tree, state: &mut Tree,
layout: Layout<'_>, layout: Layout<'_>,
renderer: &Renderer, renderer: &cosmic::Renderer,
operation: &mut dyn cosmic::widget::Operation<OperationOutputWrapper<Message>>, operation: &mut dyn cosmic::widget::Operation<OperationOutputWrapper<Message>>,
) { ) {
let state = &mut state.children[0]; let state = &mut state.children[0];
@ -159,7 +148,7 @@ where
event: Event, event: Event,
layout: Layout<'_>, layout: Layout<'_>,
cursor: mouse::Cursor, cursor: mouse::Cursor,
renderer: &Renderer, renderer: &cosmic::Renderer,
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle, viewport: &Rectangle,
@ -203,7 +192,7 @@ where
layout: Layout<'_>, layout: Layout<'_>,
cursor: mouse::Cursor, cursor: mouse::Cursor,
viewport: &Rectangle, viewport: &Rectangle,
renderer: &Renderer, renderer: &cosmic::Renderer,
) -> mouse::Interaction { ) -> mouse::Interaction {
let state = &state.children[0]; let state = &state.children[0];
let layout = layout.children().next().unwrap(); let layout = layout.children().next().unwrap();
@ -216,22 +205,19 @@ where
&'b mut self, &'b mut self,
state: &'b mut Tree, state: &'b mut Tree,
layout: Layout<'_>, layout: Layout<'_>,
renderer: &Renderer, renderer: &cosmic::Renderer,
) -> Option<overlay::Element<'b, Message, Renderer>> { ) -> Option<overlay::Element<'b, Message, cosmic::Theme, cosmic::Renderer>> {
let state = &mut state.children[0]; let state = &mut state.children[0];
let layout = layout.children().next().unwrap(); let layout = layout.children().next().unwrap();
self.elem.as_widget_mut().overlay(state, layout, renderer) self.elem.as_widget_mut().overlay(state, layout, renderer)
} }
} }
impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>> impl<'a, Message> Into<cosmic::Element<'a, Message>> for SubmenuItem<'a, Message>
for SubmenuItem<'a, Message, Renderer>
where where
Renderer: IcedRenderer + 'a,
Renderer::Theme: StyleSheet,
Message: CursorEvents + 'a, Message: CursorEvents + 'a,
{ {
fn into(self) -> Element<'a, Message, Renderer> { fn into(self) -> cosmic::Element<'a, Message> {
Element::new(self) Element::new(self)
} }
} }

View file

@ -9,7 +9,7 @@ use std::{
use calloop::LoopHandle; use calloop::LoopHandle;
use cosmic::{ use cosmic::{
iced::Background, iced::Background,
iced_core::{alignment::Horizontal, Length, Pixels, Rectangle as IcedRectangle}, iced_core::{alignment::Horizontal, Border, Length, Pixels, Rectangle as IcedRectangle},
iced_widget::{self, horizontal_rule, text::Appearance as TextAppearance, Column, Row}, iced_widget::{self, horizontal_rule, text::Appearance as TextAppearance, Column, Row},
theme, theme,
widget::{button, horizontal_space, icon::from_name, text}, widget::{button, horizontal_space, icon::from_name, text},
@ -319,7 +319,7 @@ impl Program for ContextMenu {
Command::none() Command::none()
} }
fn view(&self) -> crate::utils::iced::Element<'_, Self::Message> { fn view(&self) -> cosmic::Element<'_, Self::Message> {
let width = self let width = self
.row_width .row_width
.lock() .lock()
@ -331,99 +331,93 @@ impl Program for ContextMenu {
_ => Length::Fill, _ => Length::Fill,
}; };
Column::with_children( Column::with_children(self.items.iter().enumerate().map(|(idx, item)| {
self.items match item {
.iter() Item::Separator => horizontal_rule(1)
.enumerate() .style(theme::Rule::LightDivider)
.map(|(idx, item)| match item { .width(mode)
Item::Separator => horizontal_rule(1)
.style(theme::Rule::LightDivider)
.width(mode)
.into(),
Item::Submenu { title, .. } => Row::with_children(vec![
horizontal_space(16).into(),
text(title).width(mode).into(),
from_name("go-next-symbolic")
.size(16)
.prefer_svg(true)
.icon()
.into(),
])
.spacing(8)
.width(width)
.padding([8, 24])
.apply(|row| item::SubmenuItem::new(row, idx))
.style(theme::Button::MenuItem)
.into(), .into(),
Item::Entry { Item::Submenu { title, .. } => Row::with_children(vec![
title, horizontal_space(16).into(),
shortcut, text(title).width(mode).into(),
toggled, from_name("go-next-symbolic")
disabled, .size(16)
.. .prefer_svg(true)
} => { .icon()
let mut components = vec![ .into(),
if *toggled { ])
from_name("object-select-symbolic") .spacing(8)
.size(16) .width(width)
.prefer_svg(true) .padding([8, 24])
.icon() .apply(|row| item::SubmenuItem::new(row, idx))
.style(theme::Svg::custom(|theme| { .style(theme::Button::MenuItem)
iced_widget::svg::Appearance { .into(),
color: Some(theme.cosmic().accent.base.into()), Item::Entry {
} title,
})) shortcut,
.into() toggled,
} else { disabled,
horizontal_space(16).into() ..
}, } => {
text(title) let mut components = vec![
.width(mode) if *toggled {
.style(if *disabled { from_name("object-select-symbolic")
theme::Text::Custom(|theme| { .size(16)
let mut color = theme.cosmic().background.component.on; .prefer_svg(true)
color.alpha *= 0.5; .icon()
TextAppearance { .style(theme::Svg::custom(|theme| iced_widget::svg::Appearance {
color: Some(color.into()), color: Some(theme.cosmic().accent.base.into()),
} }))
}) .into()
} else { } else {
theme::Text::Default horizontal_space(16).into()
}) },
.into(), text(title)
];
if let Some(shortcut) = shortcut.as_ref() {
components.push(
text(shortcut)
.line_height(Pixels(20.))
.size(14)
.horizontal_alignment(Horizontal::Right)
.width(Length::Shrink)
.style(theme::Text::Custom(|theme| {
let mut color = theme.cosmic().background.component.on;
color.alpha *= 0.75;
TextAppearance {
color: Some(color.into()),
}
}))
.into(),
);
}
components.push(horizontal_space(16).into());
Row::with_children(components)
.spacing(8)
.width(mode) .width(mode)
.apply(button) .style(if *disabled {
.width(width) theme::Text::Custom(|theme| {
.padding([8, 24]) let mut color = theme.cosmic().background.component.on;
.on_press_maybe((!disabled).then_some(Message::ItemPressed(idx))) color.alpha *= 0.5;
.style(theme::Button::MenuItem) TextAppearance {
.into() color: Some(color.into()),
}
})
} else {
theme::Text::Default
})
.into(),
];
if let Some(shortcut) = shortcut.as_ref() {
components.push(
text(shortcut)
.line_height(Pixels(20.))
.size(14)
.horizontal_alignment(Horizontal::Right)
.width(Length::Shrink)
.style(theme::Text::Custom(|theme| {
let mut color = theme.cosmic().background.component.on;
color.alpha *= 0.75;
TextAppearance {
color: Some(color.into()),
}
}))
.into(),
);
} }
}) components.push(horizontal_space(16).into());
.collect(),
) Row::with_children(components)
.spacing(8)
.width(mode)
.apply(button)
.width(width)
.padding([8, 24])
.on_press_maybe((!disabled).then_some(Message::ItemPressed(idx)))
.style(theme::Button::MenuItem)
.into()
}
}
}))
.width(Length::Shrink) .width(Length::Shrink)
.apply(iced_widget::container) .apply(iced_widget::container)
.padding(1) .padding(1)
@ -434,9 +428,12 @@ impl Program for ContextMenu {
icon_color: Some(cosmic.accent.base.into()), icon_color: Some(cosmic.accent.base.into()),
text_color: Some(component.on.into()), text_color: Some(component.on.into()),
background: Some(Background::Color(component.base.into())), background: Some(Background::Color(component.base.into())),
border_radius: 8.0.into(), border: Border {
border_width: 1.0, radius: 8.0.into(),
border_color: component.divider.into(), width: 1.0,
color: component.divider.into(),
},
shadow: Default::default(),
} }
})) }))
.width(Length::Shrink) .width(Length::Shrink)

View file

@ -16,7 +16,7 @@ use cosmic::{
Command, Limits, Point as IcedPoint, Rectangle as IcedRectangle, Size as IcedSize, Command, Limits, Point as IcedPoint, Rectangle as IcedRectangle, Size as IcedSize,
}, },
iced_core::{clipboard::Null as NullClipboard, renderer::Style, Color, Font, Length, Pixels}, iced_core::{clipboard::Null as NullClipboard, renderer::Style, Color, Font, Length, Pixels},
iced_renderer::{graphics::Renderer as IcedGraphicsRenderer, Renderer as IcedRenderer}, iced_renderer::graphics::Renderer as IcedGraphicsRenderer,
iced_runtime::{ iced_runtime::{
command::Action, command::Action,
program::{Program as IcedProgram, State}, program::{Program as IcedProgram, State},
@ -28,7 +28,6 @@ use iced_tiny_skia::{
graphics::{damage, Viewport}, graphics::{damage, Viewport},
Backend, Primitive, Backend, Primitive,
}; };
pub type Element<'a, Message> = cosmic::iced::Element<'a, Message, IcedRenderer<Theme>>;
use ordered_float::OrderedFloat; use ordered_float::OrderedFloat;
use smithay::{ use smithay::{
@ -104,7 +103,7 @@ pub trait Program {
let _ = (message, loop_handle); let _ = (message, loop_handle);
Command::none() Command::none()
} }
fn view(&self) -> Element<'_, Self::Message>; fn view(&self) -> cosmic::Element<'_, Self::Message>;
fn background_color(&self) -> Color { fn background_color(&self) -> Color {
Color::TRANSPARENT Color::TRANSPARENT
@ -123,13 +122,14 @@ pub trait Program {
struct ProgramWrapper<P: Program>(P, LoopHandle<'static, crate::state::State>); struct ProgramWrapper<P: Program>(P, LoopHandle<'static, crate::state::State>);
impl<P: Program> IcedProgram for ProgramWrapper<P> { impl<P: Program> IcedProgram for ProgramWrapper<P> {
type Message = <P as Program>::Message; type Message = <P as Program>::Message;
type Renderer = IcedRenderer<Theme>; type Renderer = cosmic::Renderer;
type Theme = cosmic::Theme;
fn update(&mut self, message: Self::Message) -> Command<Self::Message> { fn update(&mut self, message: Self::Message) -> Command<Self::Message> {
self.0.update(message, &self.1) self.0.update(message, &self.1)
} }
fn view(&self) -> Element<'_, Self::Message> { fn view(&self) -> cosmic::Element<'_, Self::Message> {
self.0.view() self.0.view()
} }
} }
@ -146,7 +146,7 @@ struct IcedElementInternal<P: Program + Send + 'static> {
// iced // iced
theme: Theme, theme: Theme,
renderer: IcedRenderer<Theme>, renderer: cosmic::Renderer,
state: State<ProgramWrapper<P>>, state: State<ProgramWrapper<P>>,
debug: Debug, debug: Debug,
@ -171,7 +171,7 @@ impl<P: Program + Send + Clone + 'static> Clone for IcedElementInternal<P> {
if !self.state.is_queue_empty() { if !self.state.is_queue_empty() {
tracing::warn!("Missing force_update call"); tracing::warn!("Missing force_update call");
} }
let mut renderer = IcedRenderer::TinySkia(IcedGraphicsRenderer::new( let mut renderer = cosmic::Renderer::TinySkia(IcedGraphicsRenderer::new(
Backend::new(), Backend::new(),
Font::default(), Font::default(),
Pixels(16.0), Pixels(16.0),
@ -236,7 +236,7 @@ impl<P: Program + Send + 'static> IcedElement<P> {
theme: cosmic::Theme, theme: cosmic::Theme,
) -> IcedElement<P> { ) -> IcedElement<P> {
let size = size.into(); let size = size.into();
let mut renderer = IcedRenderer::TinySkia(IcedGraphicsRenderer::new( let mut renderer = cosmic::Renderer::TinySkia(IcedGraphicsRenderer::new(
Backend::new(), Backend::new(),
Font::default(), Font::default(),
Pixels(16.0), Pixels(16.0),
@ -772,7 +772,7 @@ where
.to_i32_round(); .to_i32_round();
if size.w > 0 && size.h > 0 { if size.w > 0 && size.h > 0 {
let IcedRenderer::TinySkia(renderer) = &mut internal_ref.renderer; let cosmic::Renderer::TinySkia(renderer) = &mut internal_ref.renderer;
let state_ref = &internal_ref.state; let state_ref = &internal_ref.state;
let mut clip_mask = tiny_skia::Mask::new(size.w as u32, size.h as u32).unwrap(); let mut clip_mask = tiny_skia::Mask::new(size.w as u32, size.h as u32).unwrap();
let overlay = internal_ref.debug.overlay(); let overlay = internal_ref.debug.overlay();