Use aliasable in AxisToplevelLayout to use slice in argument

This makes layouts possible to compose without clones.
This commit is contained in:
Ian Douglas Scott 2025-03-24 14:59:25 -07:00
parent f2a2904978
commit 874245bc2e
4 changed files with 29 additions and 6 deletions

1
Cargo.lock generated
View file

@ -1252,6 +1252,7 @@ dependencies = [
name = "cosmic-workspaces" name = "cosmic-workspaces"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"aliasable",
"anyhow", "anyhow",
"calloop 0.14.2", "calloop 0.14.2",
"calloop-wayland-source 0.4.0", "calloop-wayland-source 0.4.0",

View file

@ -28,6 +28,7 @@ i18n-embed-fl = "0.9.0"
rust-embed = "8.1.0" rust-embed = "8.1.0"
rustix = { version = "0.38.30", features = ["fs"] } rustix = { version = "0.38.30", features = ["fs"] }
calloop-wayland-source = "0.4.0" calloop-wayland-source = "0.4.0"
aliasable = "0.1.3"
[dependencies.i18n-embed] [dependencies.i18n-embed]
version = "0.15.3" version = "0.15.3"

View file

@ -1,3 +1,4 @@
use aliasable::vec::AliasableVec;
use cosmic::iced::{advanced::layout::flex::Axis, Length, Point, Rectangle, Size}; use cosmic::iced::{advanced::layout::flex::Axis, Length, Point, Rectangle, Size};
use std::marker::PhantomData; use std::marker::PhantomData;
@ -70,7 +71,7 @@ pub trait AxisToplevelLayout {
fn layout( fn layout(
&self, &self,
max_limit: AxisSize, max_limit: AxisSize,
toplevels: Vec<LayoutToplevel<'_, AxisSize>>, toplevels: &[LayoutToplevel<'_, AxisSize>],
) -> impl Iterator<Item = AxisRectangle>; ) -> impl Iterator<Item = AxisRectangle>;
} }
@ -79,10 +80,10 @@ impl<T: AxisToplevelLayout> ToplevelLayout for T {
self.size().pack(self.axis()) self.size().pack(self.axis())
} }
fn layout( fn layout<'a>(
&self, &self,
max_limit: Size, max_limit: Size,
toplevels: &[LayoutToplevel<'_>], toplevels: &[LayoutToplevel<'a>],
) -> impl Iterator<Item = Rectangle> { ) -> impl Iterator<Item = Rectangle> {
let max_limit = AxisSize::unpack(self.axis(), max_limit); let max_limit = AxisSize::unpack(self.axis(), max_limit);
let toplevels = toplevels let toplevels = toplevels
@ -92,7 +93,27 @@ impl<T: AxisToplevelLayout> ToplevelLayout for T {
_phantom_data: PhantomData, _phantom_data: PhantomData,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
self.layout(max_limit, toplevels) let toplevels = AliasableVec::from_unique(toplevels);
.map(|rect| rect.pack(self.axis())) // Extend lifetime
let toplevels_slice =
unsafe { std::mem::transmute::<_, &'a [LayoutToplevel<'a, AxisSize>]>(&*toplevels) };
let inner = self
.layout(max_limit, toplevels_slice)
.map(|rect| rect.pack(self.axis()));
AxisLayoutIterator { inner, toplevels }
}
}
struct AxisLayoutIterator<'a, I: Iterator<Item = Rectangle>> {
inner: I,
// After `inner` so it is dropped only after that is dropped
toplevels: AliasableVec<LayoutToplevel<'a, AxisSize>>,
}
impl<'a, I: Iterator<Item = Rectangle>> Iterator for AxisLayoutIterator<'a, I> {
type Item = Rectangle;
fn next(&mut self) -> Option<Rectangle> {
self.inner.next()
} }
} }

View file

@ -33,7 +33,7 @@ impl AxisToplevelLayout for RowColToplevelLayout {
fn layout( fn layout(
&self, &self,
max_limit: AxisSize, max_limit: AxisSize,
toplevels: Vec<LayoutToplevel<'_, AxisSize>>, toplevels: &[LayoutToplevel<'_, AxisSize>],
) -> impl Iterator<Item = AxisRectangle> { ) -> impl Iterator<Item = AxisRectangle> {
let requested_main_total = self.requested_main_total(&toplevels); let requested_main_total = self.requested_main_total(&toplevels);
let scale_factor = (max_limit.main / requested_main_total).min(1.0); let scale_factor = (max_limit.main / requested_main_total).min(1.0);