Update to latest libcosmic/iced

This commit is contained in:
Ian Douglas Scott 2023-12-14 15:02:45 -08:00 committed by Victoria Brekenfeld
parent 9b98c20da2
commit e569e14a99
9 changed files with 640 additions and 552 deletions

1113
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -40,7 +40,7 @@ cosmic-config = { git = "https://github.com/pop-os/libcosmic/", features = ["cal
cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols", branch = "main", default-features = false, features = ["server"] } cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols", branch = "main", default-features = false, features = ["server"] }
libcosmic = { git = "https://github.com/pop-os/libcosmic/", default-features = false } libcosmic = { git = "https://github.com/pop-os/libcosmic/", default-features = false }
iced_tiny_skia = { git = "https://github.com/pop-os/libcosmic/" } iced_tiny_skia = { git = "https://github.com/pop-os/libcosmic/" }
tiny-skia = "0.10" tiny-skia = "0.11"
ordered-float = "4.0" ordered-float = "4.0"
glow = "0.12.0" glow = "0.12.0"
tracing-subscriber = { version = "0.3.16", features = ["env-filter", "tracing-log"] } tracing-subscriber = { version = "0.3.16", features = ["env-filter", "tracing-log"] }

View file

@ -293,7 +293,7 @@ where
Length::Fill Length::Fill
} }
fn layout(&self, renderer: &Renderer, limits: &Limits) -> Node { fn layout(&self, tree: &mut Tree, renderer: &Renderer, limits: &Limits) -> Node {
let min_size = Size { let min_size = Size {
height: TAB_HEIGHT as f32, height: TAB_HEIGHT as f32,
width: if self.active { width: if self.active {
@ -328,6 +328,7 @@ where
} else { } else {
&self.elements[0..2] &self.elements[0..2]
}, },
&mut tree.children,
) )
} }

View file

@ -84,13 +84,16 @@ where
tree.diff_children(std::slice::from_mut(&mut self.text)) tree.diff_children(std::slice::from_mut(&mut self.text))
} }
fn layout(&self, renderer: &Renderer, limits: &Limits) -> Node { fn layout(&self, tree: &mut Tree, renderer: &Renderer, limits: &Limits) -> Node {
let limits = limits.width(self.width).height(self.height); let limits = limits.width(self.width).height(self.height);
let child_limits = Limits::new( let child_limits = Limits::new(
Size::new(limits.min().width, limits.min().height - 4.), Size::new(limits.min().width, limits.min().height - 4.),
Size::new(limits.max().width * 2., limits.max().height - 4.), Size::new(limits.max().width * 2., limits.max().height - 4.),
); );
let mut content = self.text.as_widget().layout(renderer, &child_limits); let mut content =
self.text
.as_widget()
.layout(&mut tree.children[0], renderer, &child_limits);
content.move_to(Point::new(0., 2.)); content.move_to(Point::new(0., 2.));
let size = limits.resolve(content.size()); let size = limits.resolve(content.size());

View file

@ -359,7 +359,7 @@ where
tree.diff_children(&mut self.elements) tree.diff_children(&mut self.elements)
} }
fn layout(&self, renderer: &Renderer, limits: &Limits) -> Node { fn layout(&self, tree: &mut Tree, renderer: &Renderer, limits: &Limits) -> Node {
let limits = limits.width(self.width).height(self.height); let limits = limits.width(self.width).height(self.height);
// calculate the smallest possible size // calculate the smallest possible size
@ -372,7 +372,8 @@ where
let mut nodes = self.elements[2..self.elements.len() - 2] let mut nodes = self.elements[2..self.elements.len() - 2]
.iter() .iter()
.map(|tab| tab.as_widget().layout(renderer, &child_limits)) .zip(tree.children.iter_mut())
.map(|(tab, tab_tree)| tab.as_widget().layout(tab_tree, renderer, &child_limits))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
// sum up // sum up
@ -401,6 +402,7 @@ where
0., 0.,
cosmic::iced::Alignment::Center, cosmic::iced::Alignment::Center,
&self.elements[2..self.elements.len() - 2], &self.elements[2..self.elements.len() - 2],
&mut tree.children[2..self.elements.len() - 2],
) )
.children() .children()
.to_vec() .to_vec()
@ -412,7 +414,8 @@ where
let mut nodes = self.elements[2..self.elements.len() - 3] let mut nodes = self.elements[2..self.elements.len() - 3]
.iter() .iter()
.map(|tab| { .zip(tree.children[2..].iter_mut())
.map(|(tab, tab_tree)| {
let child_limits = Limits::new( let child_limits = Limits::new(
Size::new(min_width, limits.min().height), Size::new(min_width, limits.min().height),
Size::new(f32::INFINITY, limits.max().height), Size::new(f32::INFINITY, limits.max().height),
@ -420,7 +423,7 @@ where
.width(Length::Shrink) .width(Length::Shrink)
.height(Length::Shrink); .height(Length::Shrink);
let mut node = tab.as_widget().layout(renderer, &child_limits); let mut node = tab.as_widget().layout(tab_tree, renderer, &child_limits);
node.move_to(Point::new(offset, 0.)); node.move_to(Point::new(offset, 0.));
offset += node.bounds().width; offset += node.bounds().width;
node node

View file

@ -66,8 +66,14 @@ where
self.elem.as_widget().height() self.elem.as_widget().height()
} }
fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> layout::Node { fn layout(
let node = self.elem.as_widget().layout(renderer, limits); &self,
state: &mut Tree,
renderer: &Renderer,
limits: &layout::Limits,
) -> layout::Node {
let state = &mut state.children[0];
let node = self.elem.as_widget().layout(state, renderer, limits);
layout::Node::with_children(node.size(), vec![node]) layout::Node::with_children(node.size(), vec![node])
} }

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, Rectangle as IcedRectangle}, iced_core::{alignment::Horizontal, 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},
@ -395,7 +395,7 @@ impl Program for ContextMenu {
if let Some(shortcut) = shortcut.as_ref() { if let Some(shortcut) = shortcut.as_ref() {
components.push( components.push(
text(shortcut) text(shortcut)
.line_height(20.) .line_height(Pixels(20.))
.size(14) .size(14)
.horizontal_alignment(Horizontal::Right) .horizontal_alignment(Horizontal::Right)
.width(Length::Shrink) .width(Length::Shrink)

View file

@ -3,19 +3,16 @@
// update a Arc<Mutex<Theme>> in the state on change of the theme and mark all interfaces for a redraw. // update a Arc<Mutex<Theme>> in the state on change of the theme and mark all interfaces for a redraw.
use calloop::LoopHandle; use calloop::LoopHandle;
use cosmic::cosmic_theme::{ use cosmic::cosmic_theme::{palette, Theme, ThemeMode};
palette::{self, Srgba},
Theme, ThemeMode,
};
use crate::state::State; use crate::state::State;
pub(crate) fn group_color(theme: &Theme<Srgba>) -> [f32; 3] { pub(crate) fn group_color(theme: &Theme) -> [f32; 3] {
let neutral_8 = theme.palette.neutral_8; let neutral_8 = theme.palette.neutral_8;
[neutral_8.red, neutral_8.green, neutral_8.blue] [neutral_8.red, neutral_8.green, neutral_8.blue]
} }
pub(crate) fn active_window_hint(theme: &Theme<Srgba>) -> palette::Srgba { pub(crate) fn active_window_hint(theme: &Theme) -> palette::Srgba {
if let Some(hint) = theme.window_hint { if let Some(hint) = theme.window_hint {
palette::Srgba::from(hint) palette::Srgba::from(hint)
} else { } else {
@ -26,8 +23,8 @@ pub(crate) fn active_window_hint(theme: &Theme<Srgba>) -> palette::Srgba {
pub fn watch_theme(handle: LoopHandle<'_, State>) -> Result<(), cosmic_config::Error> { pub fn watch_theme(handle: LoopHandle<'_, State>) -> Result<(), cosmic_config::Error> {
let (ping_tx, ping_rx) = calloop::ping::make_ping().unwrap(); let (ping_tx, ping_rx) = calloop::ping::make_ping().unwrap();
let config_mode_helper = ThemeMode::config()?; let config_mode_helper = ThemeMode::config()?;
let config_dark_helper = Theme::<palette::Srgba>::dark_config()?; let config_dark_helper = Theme::dark_config()?;
let config_light_helper = Theme::<palette::Srgba>::light_config()?; let config_light_helper = Theme::light_config()?;
if let Err(e) = handle.insert_source(ping_rx, move |_, _, state| { if let Err(e) = handle.insert_source(ping_rx, move |_, _, state| {
let new_theme = cosmic::theme::system_preference(); let new_theme = cosmic::theme::system_preference();

View file

@ -8,13 +8,14 @@ use std::{
use cosmic::{ use cosmic::{
iced::{ iced::{
advanced::widget::Tree,
event::Event, event::Event,
keyboard::{Event as KeyboardEvent, Modifiers as IcedModifiers}, keyboard::{Event as KeyboardEvent, Modifiers as IcedModifiers},
mouse::{Button as MouseButton, Cursor, Event as MouseEvent, ScrollDelta}, mouse::{Button as MouseButton, Cursor, Event as MouseEvent, ScrollDelta},
window::{Event as WindowEvent, Id}, window::{Event as WindowEvent, Id},
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, Length}, 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, Renderer as IcedRenderer},
iced_runtime::{ iced_runtime::{
command::Action, command::Action,
@ -128,7 +129,7 @@ impl<P: Program> IcedProgram for ProgramWrapper<P> {
self.0.update(message, &self.1) self.0.update(message, &self.1)
} }
fn view(&self, _id: Id) -> Element<'_, Self::Message> { fn view(&self) -> Element<'_, Self::Message> {
self.0.view() self.0.view()
} }
} }
@ -170,11 +171,14 @@ 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 = let mut renderer = IcedRenderer::TinySkia(IcedGraphicsRenderer::new(
IcedRenderer::TinySkia(IcedGraphicsRenderer::new(Backend::new(Default::default()))); Backend::new(),
Font::default(),
Pixels(16.0),
));
let mut debug = Debug::new(); let mut debug = Debug::new();
let state = State::new( let state = State::new(
Id(0), Id::MAIN,
ProgramWrapper(self.state.program().0.clone(), handle.clone()), ProgramWrapper(self.state.program().0.clone(), handle.clone()),
IcedSize::new(self.size.w as f32, self.size.h as f32), IcedSize::new(self.size.w as f32, self.size.h as f32),
&mut renderer, &mut renderer,
@ -232,12 +236,15 @@ 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 = let mut renderer = IcedRenderer::TinySkia(IcedGraphicsRenderer::new(
IcedRenderer::TinySkia(IcedGraphicsRenderer::new(Backend::new(Default::default()))); Backend::new(),
Font::default(),
Pixels(16.0),
));
let mut debug = Debug::new(); let mut debug = Debug::new();
let state = State::new( let state = State::new(
Id(0), Id::MAIN,
ProgramWrapper(program, handle.clone()), ProgramWrapper(program, handle.clone()),
IcedSize::new(size.w as f32, size.h as f32), IcedSize::new(size.w as f32, size.h as f32),
&mut renderer, &mut renderer,
@ -283,6 +290,8 @@ impl<P: Program + Send + 'static> IcedElement<P> {
let node = element let node = element
.as_widget() .as_widget()
.layout( .layout(
// TODO Avoid creating a new tree here?
&mut Tree::new(element.as_widget()),
&internal.renderer, &internal.renderer,
&Limits::new(IcedSize::ZERO, IcedSize::INFINITY) &Limits::new(IcedSize::ZERO, IcedSize::INFINITY)
.width(Length::Shrink) .width(Length::Shrink)
@ -368,7 +377,7 @@ impl<P: Program + Send + 'static> IcedElementInternal<P> {
let actions = self let actions = self
.state .state
.update( .update(
Id(0), Id::MAIN,
IcedSize::new(self.size.w as f32, self.size.h as f32), IcedSize::new(self.size.w as f32, self.size.h as f32),
cursor, cursor,
&mut self.renderer, &mut self.renderer,
@ -636,7 +645,7 @@ impl<P: Program + Send + 'static> SpaceElement for IcedElement<P> {
fn set_activate(&self, activated: bool) { fn set_activate(&self, activated: bool) {
let mut internal = self.0.lock().unwrap(); let mut internal = self.0.lock().unwrap();
internal.state.queue_event(Event::Window( internal.state.queue_event(Event::Window(
Id(0), Id::MAIN,
if activated { if activated {
WindowEvent::Focused WindowEvent::Focused
} else { } else {