Implement spacing
support for PaneGrid
This commit is contained in:
parent
c2ced4cd59
commit
29bf51d25a
@ -12,6 +12,7 @@ pub struct PaneGrid<'a, Message, Renderer> {
|
|||||||
elements: Vec<(Pane, Element<'a, Message, Renderer>)>,
|
elements: Vec<(Pane, Element<'a, Message, Renderer>)>,
|
||||||
width: Length,
|
width: Length,
|
||||||
height: Length,
|
height: Length,
|
||||||
|
spacing: u16,
|
||||||
on_drag: Option<Box<dyn Fn(DragEvent) -> Message>>,
|
on_drag: Option<Box<dyn Fn(DragEvent) -> Message>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,6 +50,7 @@ impl<'a, Message, Renderer> PaneGrid<'a, Message, Renderer> {
|
|||||||
elements,
|
elements,
|
||||||
width: Length::Fill,
|
width: Length::Fill,
|
||||||
height: Length::Fill,
|
height: Length::Fill,
|
||||||
|
spacing: 0,
|
||||||
on_drag: None,
|
on_drag: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -69,6 +71,14 @@ impl<'a, Message, Renderer> PaneGrid<'a, Message, Renderer> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets the spacing _between_ the panes of the [`PaneGrid`].
|
||||||
|
///
|
||||||
|
/// [`PaneGrid`]: struct.Column.html
|
||||||
|
pub fn spacing(mut self, units: u16) -> Self {
|
||||||
|
self.spacing = units;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
pub fn on_drag(
|
pub fn on_drag(
|
||||||
mut self,
|
mut self,
|
||||||
f: impl Fn(DragEvent) -> Message + 'static,
|
f: impl Fn(DragEvent) -> Message + 'static,
|
||||||
@ -107,7 +117,7 @@ where
|
|||||||
let limits = limits.width(self.width).height(self.height);
|
let limits = limits.width(self.width).height(self.height);
|
||||||
let size = limits.resolve(Size::ZERO);
|
let size = limits.resolve(Size::ZERO);
|
||||||
|
|
||||||
let regions = self.state.layout.regions(size);
|
let regions = self.state.layout.regions(f32::from(self.spacing), size);
|
||||||
|
|
||||||
let children = self
|
let children = self
|
||||||
.elements
|
.elements
|
||||||
@ -498,10 +508,15 @@ impl Node {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn regions(&self, size: Size) -> HashMap<Pane, Rectangle> {
|
pub fn regions(
|
||||||
|
&self,
|
||||||
|
spacing: f32,
|
||||||
|
size: Size,
|
||||||
|
) -> HashMap<Pane, Rectangle> {
|
||||||
let mut regions = HashMap::new();
|
let mut regions = HashMap::new();
|
||||||
|
|
||||||
self.compute_regions(
|
self.compute_regions(
|
||||||
|
spacing / 2.0,
|
||||||
&Rectangle {
|
&Rectangle {
|
||||||
x: 0.0,
|
x: 0.0,
|
||||||
y: 0.0,
|
y: 0.0,
|
||||||
@ -530,16 +545,18 @@ impl Node {
|
|||||||
|
|
||||||
fn compute_regions(
|
fn compute_regions(
|
||||||
&self,
|
&self,
|
||||||
|
halved_spacing: f32,
|
||||||
current: &Rectangle,
|
current: &Rectangle,
|
||||||
regions: &mut HashMap<Pane, Rectangle>,
|
regions: &mut HashMap<Pane, Rectangle>,
|
||||||
) {
|
) {
|
||||||
match self {
|
match self {
|
||||||
Node::Split { kind, ratio, a, b } => {
|
Node::Split { kind, ratio, a, b } => {
|
||||||
let ratio = *ratio as f32 / 1_000_000.0;
|
let ratio = *ratio as f32 / 1_000_000.0;
|
||||||
let (region_a, region_b) = kind.apply(current, ratio);
|
let (region_a, region_b) =
|
||||||
|
kind.apply(current, ratio, halved_spacing);
|
||||||
|
|
||||||
a.compute_regions(®ion_a, regions);
|
a.compute_regions(halved_spacing, ®ion_a, regions);
|
||||||
b.compute_regions(®ion_b, regions);
|
b.compute_regions(halved_spacing, ®ion_b, regions);
|
||||||
}
|
}
|
||||||
Node::Pane(pane) => {
|
Node::Pane(pane) => {
|
||||||
let _ = regions.insert(*pane, *current);
|
let _ = regions.insert(*pane, *current);
|
||||||
@ -559,11 +576,13 @@ impl Split {
|
|||||||
&self,
|
&self,
|
||||||
rectangle: &Rectangle,
|
rectangle: &Rectangle,
|
||||||
ratio: f32,
|
ratio: f32,
|
||||||
|
halved_spacing: f32,
|
||||||
) -> (Rectangle, Rectangle) {
|
) -> (Rectangle, Rectangle) {
|
||||||
match self {
|
match self {
|
||||||
Split::Horizontal => {
|
Split::Horizontal => {
|
||||||
let width_left = (rectangle.width * ratio).round();
|
let width_left =
|
||||||
let width_right = rectangle.width - width_left;
|
(rectangle.width * ratio).round() - halved_spacing;
|
||||||
|
let width_right = rectangle.width - width_left - halved_spacing;
|
||||||
|
|
||||||
(
|
(
|
||||||
Rectangle {
|
Rectangle {
|
||||||
@ -571,15 +590,17 @@ impl Split {
|
|||||||
..*rectangle
|
..*rectangle
|
||||||
},
|
},
|
||||||
Rectangle {
|
Rectangle {
|
||||||
x: rectangle.x + width_left,
|
x: rectangle.x + width_left + halved_spacing,
|
||||||
width: width_right,
|
width: width_right,
|
||||||
..*rectangle
|
..*rectangle
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Split::Vertical => {
|
Split::Vertical => {
|
||||||
let height_top = (rectangle.height * ratio).round();
|
let height_top =
|
||||||
let height_bottom = rectangle.height - height_top;
|
(rectangle.height * ratio).round() - halved_spacing;
|
||||||
|
let height_bottom =
|
||||||
|
rectangle.height - height_top - halved_spacing;
|
||||||
|
|
||||||
(
|
(
|
||||||
Rectangle {
|
Rectangle {
|
||||||
@ -587,7 +608,7 @@ impl Split {
|
|||||||
..*rectangle
|
..*rectangle
|
||||||
},
|
},
|
||||||
Rectangle {
|
Rectangle {
|
||||||
y: rectangle.y + height_top,
|
y: rectangle.y + height_top + halved_spacing,
|
||||||
height: height_bottom,
|
height: height_bottom,
|
||||||
..*rectangle
|
..*rectangle
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user