Add Align::Justified
This commit is contained in:
parent
cc70905336
commit
96cea8e6f9
2 changed files with 30 additions and 11 deletions
|
@ -67,7 +67,10 @@ pub enum Align {
|
||||||
/// Right/Bottom
|
/// Right/Bottom
|
||||||
/// Note: requires a bounded/known available_width.
|
/// Note: requires a bounded/known available_width.
|
||||||
Max,
|
Max,
|
||||||
// TODO: Justified
|
|
||||||
|
/// Full width/height.
|
||||||
|
/// Use this when you want
|
||||||
|
Justified,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Align {
|
impl Default for Align {
|
||||||
|
@ -76,14 +79,15 @@ impl Default for Align {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Give a position within the rect, specified by the aligns
|
||||||
pub fn align_rect(rect: Rect, align: (Align, Align)) -> Rect {
|
pub fn align_rect(rect: Rect, align: (Align, Align)) -> Rect {
|
||||||
let x = match align.0 {
|
let x = match align.0 {
|
||||||
Align::Min => rect.left(),
|
Align::Min | Align::Justified => rect.left(),
|
||||||
Align::Center => rect.left() - 0.5 * rect.width(),
|
Align::Center => rect.left() - 0.5 * rect.width(),
|
||||||
Align::Max => rect.left() - rect.width(),
|
Align::Max => rect.left() - rect.width(),
|
||||||
};
|
};
|
||||||
let y = match align.1 {
|
let y = match align.1 {
|
||||||
Align::Min => rect.top(),
|
Align::Min | Align::Justified => rect.top(),
|
||||||
Align::Center => rect.top() - 0.5 * rect.height(),
|
Align::Center => rect.top() - 0.5 * rect.height(),
|
||||||
Align::Max => rect.top() - rect.height(),
|
Align::Max => rect.top() - rect.height(),
|
||||||
};
|
};
|
||||||
|
|
|
@ -315,7 +315,11 @@ impl Ui {
|
||||||
/// Each widget should have a *minimum desired size* and a *desired size*.
|
/// Each widget should have a *minimum desired size* and a *desired size*.
|
||||||
/// When asking for space, ask AT LEAST for you minimum, and don't ask for more than you need.
|
/// When asking for space, ask AT LEAST for you minimum, and don't ask for more than you need.
|
||||||
/// If you want to fill the space, ask about `available_space()` and use that.
|
/// If you want to fill the space, ask about `available_space()` and use that.
|
||||||
/// NOTE: we always get the size we ask for (at the moment).
|
///
|
||||||
|
/// You may get MORE space than you asked for, for instance
|
||||||
|
/// for `Justified` aligned layouts, like in menus.
|
||||||
|
///
|
||||||
|
/// You may get LESS space than you asked for if the current layout won't fit what you asked for.
|
||||||
pub fn reserve_space(&mut self, child_size: Vec2, interaction_id: Option<Id>) -> InteractInfo {
|
pub fn reserve_space(&mut self, child_size: Vec2, interaction_id: Option<Id>) -> InteractInfo {
|
||||||
let child_size = self.round_vec_to_pixels(child_size);
|
let child_size = self.round_vec_to_pixels(child_size);
|
||||||
self.cursor = self.round_pos_to_pixels(self.cursor);
|
self.cursor = self.round_pos_to_pixels(self.cursor);
|
||||||
|
@ -324,8 +328,7 @@ impl Ui {
|
||||||
let too_wide = child_size.x > self.available_width();
|
let too_wide = child_size.x > self.available_width();
|
||||||
let too_high = child_size.x > self.available_height();
|
let too_high = child_size.x > self.available_height();
|
||||||
|
|
||||||
let child_pos = self.reserve_space_impl(child_size);
|
let rect = self.reserve_space_impl(child_size);
|
||||||
let rect = Rect::from_min_size(child_pos, child_size);
|
|
||||||
|
|
||||||
if self.style().debug_widget_rects {
|
if self.style().debug_widget_rects {
|
||||||
self.add_paint_cmd(PaintCmd::Rect {
|
self.add_paint_cmd(PaintCmd::Rect {
|
||||||
|
@ -381,29 +384,37 @@ impl Ui {
|
||||||
|
|
||||||
/// Reserve this much space and move the cursor.
|
/// Reserve this much space and move the cursor.
|
||||||
/// Returns where to put the widget.
|
/// Returns where to put the widget.
|
||||||
fn reserve_space_impl(&mut self, child_size: Vec2) -> Pos2 {
|
fn reserve_space_impl(&mut self, mut child_size: Vec2) -> Rect {
|
||||||
let mut child_pos = self.cursor;
|
let mut child_pos = self.cursor;
|
||||||
if self.dir == Direction::Horizontal {
|
if self.dir == Direction::Horizontal {
|
||||||
child_pos.y += match self.align {
|
child_pos.y += match self.align {
|
||||||
Align::Min => 0.0,
|
Align::Min | Align::Justified => 0.0,
|
||||||
Align::Center => 0.5 * (self.available_height() - child_size.y),
|
Align::Center => 0.5 * (self.available_height() - child_size.y),
|
||||||
Align::Max => self.available_height() - child_size.y,
|
Align::Max => self.available_height() - child_size.y,
|
||||||
};
|
};
|
||||||
|
if self.align == Align::Justified && self.available_height().is_finite() {
|
||||||
|
// Fill full height
|
||||||
|
child_size.y = child_size.y.max(self.available_height());
|
||||||
|
}
|
||||||
self.child_bounds.extend_with(self.cursor + child_size);
|
self.child_bounds.extend_with(self.cursor + child_size);
|
||||||
self.cursor.x += child_size.x;
|
self.cursor.x += child_size.x;
|
||||||
self.cursor.x += self.style.item_spacing.x; // Where to put next thing, if there is a next thing
|
self.cursor.x += self.style.item_spacing.x; // Where to put next thing, if there is a next thing
|
||||||
} else {
|
} else {
|
||||||
child_pos.x += match self.align {
|
child_pos.x += match self.align {
|
||||||
Align::Min => 0.0,
|
Align::Min | Align::Justified => 0.0,
|
||||||
Align::Center => 0.5 * (self.available_width() - child_size.x),
|
Align::Center => 0.5 * (self.available_width() - child_size.x),
|
||||||
Align::Max => self.available_width() - child_size.x,
|
Align::Max => self.available_width() - child_size.x,
|
||||||
};
|
};
|
||||||
|
if self.align == Align::Justified && self.available_width().is_finite() {
|
||||||
|
// Fill full width
|
||||||
|
child_size.x = child_size.x.max(self.available_width());
|
||||||
|
}
|
||||||
self.child_bounds.extend_with(self.cursor + child_size);
|
self.child_bounds.extend_with(self.cursor + child_size);
|
||||||
self.cursor.y += child_size.y;
|
self.cursor.y += child_size.y;
|
||||||
self.cursor.y += self.style.item_spacing.y; // Where to put next thing, if there is a next thing
|
self.cursor.y += self.style.item_spacing.y; // Where to put next thing, if there is a next thing
|
||||||
}
|
}
|
||||||
|
|
||||||
child_pos
|
Rect::from_min_size(child_pos, child_size)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------
|
// ------------------------------------------------
|
||||||
|
@ -579,11 +590,15 @@ impl Ui {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A column ui with a given width.
|
/// A column ui with a given width.
|
||||||
pub fn column(&mut self, column_position: Align, width: f32) -> Ui {
|
pub fn column(&mut self, column_position: Align, mut width: f32) -> Ui {
|
||||||
let x = match column_position {
|
let x = match column_position {
|
||||||
Align::Min => 0.0,
|
Align::Min => 0.0,
|
||||||
Align::Center => self.available_width() / 2.0 - width / 2.0,
|
Align::Center => self.available_width() / 2.0 - width / 2.0,
|
||||||
Align::Max => self.available_width() - width,
|
Align::Max => self.available_width() - width,
|
||||||
|
Align::Justified => {
|
||||||
|
width = self.available_width();
|
||||||
|
0.0
|
||||||
|
}
|
||||||
};
|
};
|
||||||
self.child_ui(Rect::from_min_size(
|
self.child_ui(Rect::from_min_size(
|
||||||
self.cursor + vec2(x, 0.0),
|
self.cursor + vec2(x, 0.0),
|
||||||
|
|
Loading…
Reference in a new issue