Table: fix bug with item spacing
This commit is contained in:
parent
21c32a18d8
commit
51cc9c9a9a
3 changed files with 34 additions and 31 deletions
|
@ -18,9 +18,9 @@ pub(crate) enum CellSize {
|
||||||
/// In a table there's a `[StripLayout]` for each table row with a horizontal `[CellDirection]`.
|
/// In a table there's a `[StripLayout]` for each table row with a horizontal `[CellDirection]`.
|
||||||
/// Its cells go from left to right. And the lines go from top to bottom.
|
/// Its cells go from left to right. And the lines go from top to bottom.
|
||||||
pub(crate) enum CellDirection {
|
pub(crate) enum CellDirection {
|
||||||
/// Cells go from left to right
|
/// Cells go from left to right.
|
||||||
Horizontal,
|
Horizontal,
|
||||||
/// Cells go from top to bottom
|
/// Cells go from top to bottom.
|
||||||
Vertical,
|
Vertical,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ pub struct StripLayout<'l> {
|
||||||
ui: &'l mut Ui,
|
ui: &'l mut Ui,
|
||||||
direction: CellDirection,
|
direction: CellDirection,
|
||||||
rect: Rect,
|
rect: Rect,
|
||||||
pos: Pos2,
|
cursor: Pos2,
|
||||||
max: Pos2,
|
max: Pos2,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ impl<'l> StripLayout<'l> {
|
||||||
Self {
|
Self {
|
||||||
ui,
|
ui,
|
||||||
rect,
|
rect,
|
||||||
pos,
|
cursor: pos,
|
||||||
max: pos,
|
max: pos,
|
||||||
direction,
|
direction,
|
||||||
}
|
}
|
||||||
|
@ -53,38 +53,32 @@ impl<'l> StripLayout<'l> {
|
||||||
|
|
||||||
fn cell_rect(&self, width: &CellSize, height: &CellSize) -> Rect {
|
fn cell_rect(&self, width: &CellSize, height: &CellSize) -> Rect {
|
||||||
Rect {
|
Rect {
|
||||||
min: self.pos,
|
min: self.cursor,
|
||||||
max: Pos2 {
|
max: Pos2 {
|
||||||
x: match width {
|
x: match width {
|
||||||
CellSize::Absolute(width) => self.pos.x + width,
|
CellSize::Absolute(width) => self.cursor.x + width,
|
||||||
CellSize::Remainder => self.rect.right() - self.ui.spacing().item_spacing.x,
|
CellSize::Remainder => self.rect.right(),
|
||||||
},
|
},
|
||||||
y: match height {
|
y: match height {
|
||||||
CellSize::Absolute(height) => self.pos.y + height,
|
CellSize::Absolute(height) => self.cursor.y + height,
|
||||||
CellSize::Remainder => self.rect.bottom() - self.ui.spacing().item_spacing.y,
|
CellSize::Remainder => self.rect.bottom(),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_pos(&mut self, rect: Rect) {
|
fn set_pos(&mut self, rect: Rect) {
|
||||||
|
self.max.x = self.max.x.max(rect.right());
|
||||||
|
self.max.y = self.max.y.max(rect.bottom());
|
||||||
|
|
||||||
match self.direction {
|
match self.direction {
|
||||||
CellDirection::Horizontal => {
|
CellDirection::Horizontal => {
|
||||||
self.pos.x = rect.right() + self.ui.spacing().item_spacing.x;
|
self.cursor.x = rect.right() + self.ui.spacing().item_spacing.x;
|
||||||
}
|
}
|
||||||
CellDirection::Vertical => {
|
CellDirection::Vertical => {
|
||||||
self.pos.y = rect.bottom() + self.ui.spacing().item_spacing.y;
|
self.cursor.y = rect.bottom() + self.ui.spacing().item_spacing.y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.max.x = self
|
|
||||||
.max
|
|
||||||
.x
|
|
||||||
.max(rect.right() + self.ui.spacing().item_spacing.x);
|
|
||||||
self.max.y = self
|
|
||||||
.max
|
|
||||||
.y
|
|
||||||
.max(rect.bottom() + self.ui.spacing().item_spacing.y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn empty(&mut self, width: CellSize, height: CellSize) {
|
pub(crate) fn empty(&mut self, width: CellSize, height: CellSize) {
|
||||||
|
@ -111,10 +105,10 @@ impl<'l> StripLayout<'l> {
|
||||||
clip: bool,
|
clip: bool,
|
||||||
add_contents: impl FnOnce(&mut Ui),
|
add_contents: impl FnOnce(&mut Ui),
|
||||||
) -> Response {
|
) -> Response {
|
||||||
let mut rect = self.cell_rect(&width, &height);
|
let rect = self.cell_rect(&width, &height);
|
||||||
// Make sure we don't have a gap in the stripe background
|
|
||||||
*rect.top_mut() -= self.ui.spacing().item_spacing.y;
|
// Make sure we don't have a gap in the stripe background:
|
||||||
*rect.left_mut() -= self.ui.spacing().item_spacing.x;
|
let rect = rect.expand2(egui::vec2(0.5 * self.ui.spacing().item_spacing.x, 0.0));
|
||||||
|
|
||||||
self.ui
|
self.ui
|
||||||
.painter()
|
.painter()
|
||||||
|
@ -123,16 +117,16 @@ impl<'l> StripLayout<'l> {
|
||||||
self.add(width, height, clip, add_contents)
|
self.add(width, height, clip, add_contents)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// only needed for layouts with multiple lines, like Table
|
/// only needed for layouts with multiple lines, like [`Table`].
|
||||||
pub fn end_line(&mut self) {
|
pub fn end_line(&mut self) {
|
||||||
match self.direction {
|
match self.direction {
|
||||||
CellDirection::Horizontal => {
|
CellDirection::Horizontal => {
|
||||||
self.pos.y = self.max.y;
|
self.cursor.y = self.max.y;
|
||||||
self.pos.x = self.rect.left();
|
self.cursor.x = self.rect.left();
|
||||||
}
|
}
|
||||||
CellDirection::Vertical => {
|
CellDirection::Vertical => {
|
||||||
self.pos.x = self.max.x;
|
self.cursor.x = self.max.x;
|
||||||
self.pos.y = self.rect.top();
|
self.cursor.y = self.rect.top();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,6 +91,10 @@ impl Sizing {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_lengths(&self, length: f32, spacing: f32) -> Vec<f32> {
|
pub fn to_lengths(&self, length: f32, spacing: f32) -> Vec<f32> {
|
||||||
|
if self.sizes.is_empty() {
|
||||||
|
return vec![];
|
||||||
|
}
|
||||||
|
|
||||||
let mut remainders = 0;
|
let mut remainders = 0;
|
||||||
let sum_non_remainder = self
|
let sum_non_remainder = self
|
||||||
.sizes
|
.sizes
|
||||||
|
@ -154,12 +158,18 @@ impl From<Vec<Size>> for Sizing {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_sizing() {
|
fn test_sizing() {
|
||||||
|
let sizing: Sizing = vec![].into();
|
||||||
|
assert_eq!(sizing.to_lengths(50.0, 0.0), vec![]);
|
||||||
|
|
||||||
let sizing: Sizing = vec![Size::remainder().at_least(20.0), Size::remainder()].into();
|
let sizing: Sizing = vec![Size::remainder().at_least(20.0), Size::remainder()].into();
|
||||||
assert_eq!(sizing.to_lengths(50.0, 0.0), vec![25.0, 25.0]);
|
assert_eq!(sizing.to_lengths(50.0, 0.0), vec![25.0, 25.0]);
|
||||||
assert_eq!(sizing.to_lengths(30.0, 0.0), vec![20.0, 10.0]);
|
assert_eq!(sizing.to_lengths(30.0, 0.0), vec![20.0, 10.0]);
|
||||||
assert_eq!(sizing.to_lengths(20.0, 0.0), vec![20.0, 0.0]);
|
assert_eq!(sizing.to_lengths(20.0, 0.0), vec![20.0, 0.0]);
|
||||||
assert_eq!(sizing.to_lengths(10.0, 0.0), vec![20.0, 0.0]);
|
assert_eq!(sizing.to_lengths(10.0, 0.0), vec![20.0, 0.0]);
|
||||||
assert_eq!(sizing.to_lengths(20.0, 10.0), vec![20.0, 0.0]);
|
assert_eq!(sizing.to_lengths(20.0, 10.0), vec![20.0, 0.0]);
|
||||||
|
assert_eq!(sizing.to_lengths(30.0, 10.0), vec![20.0, 0.0]);
|
||||||
|
assert_eq!(sizing.to_lengths(40.0, 10.0), vec![20.0, 10.0]);
|
||||||
|
assert_eq!(sizing.to_lengths(110.0, 10.0), vec![50.0, 50.0]);
|
||||||
|
|
||||||
let sizing: Sizing = vec![Size::relative(0.5).at_least(10.0), Size::exact(10.0)].into();
|
let sizing: Sizing = vec![Size::relative(0.5).at_least(10.0), Size::exact(10.0)].into();
|
||||||
assert_eq!(sizing.to_lengths(50.0, 0.0), vec![25.0, 10.0]);
|
assert_eq!(sizing.to_lengths(50.0, 0.0), vec![25.0, 10.0]);
|
||||||
|
|
|
@ -107,9 +107,8 @@ impl<'a> TableBuilder<'a> {
|
||||||
|
|
||||||
fn available_width(&self) -> f32 {
|
fn available_width(&self) -> f32 {
|
||||||
self.ui.available_rect_before_wrap().width()
|
self.ui.available_rect_before_wrap().width()
|
||||||
- 2.0 * self.ui.spacing().item_spacing.x
|
|
||||||
- if self.scroll {
|
- if self.scroll {
|
||||||
self.ui.spacing().scroll_bar_width
|
self.ui.spacing().item_spacing.x + self.ui.spacing().scroll_bar_width
|
||||||
} else {
|
} else {
|
||||||
0.0
|
0.0
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue