Fix important_size for SelectView and ListView

This commit is contained in:
Alexandre Bury 2018-10-18 13:36:17 -07:00
parent 861b5fbd1d
commit 9b3b16f64d
4 changed files with 23 additions and 13 deletions

View File

@ -3,8 +3,6 @@ use std::ops::Add;
use vec::Vec2; use vec::Vec2;
/// A non-empty rectangle on the 2D grid. /// A non-empty rectangle on the 2D grid.
///
///
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Rect { pub struct Rect {
/// Top-left corner, inclusive /// Top-left corner, inclusive
@ -38,7 +36,7 @@ where
impl Rect { impl Rect {
/// Creates a new `Rect` with the given position and size. /// Creates a new `Rect` with the given position and size.
/// ///
/// `size` must be non-zero in each axis. /// The minimum size will `(1, 1)`.
pub fn from_size<U, V>(top_left: U, size: V) -> Self pub fn from_size<U, V>(top_left: U, size: V) -> Self
where where
U: Into<Vec2>, U: Into<Vec2>,
@ -46,7 +44,6 @@ impl Rect {
{ {
let size = size.into(); let size = size.into();
let top_left = top_left.into(); let top_left = top_left.into();
assert!(size > Vec2::zero());
let bottom_right = top_left + size.saturating_sub((1, 1)); let bottom_right = top_left + size.saturating_sub((1, 1));
@ -119,21 +116,29 @@ impl Rect {
} }
/// Returns the top-left corner. /// Returns the top-left corner.
///
/// This is inclusive.
pub fn top_left(self) -> Vec2 { pub fn top_left(self) -> Vec2 {
self.top_left self.top_left
} }
/// Returns the bottom-right corner. /// Returns the bottom-right corner.
///
/// This is inclusive.
pub fn bottom_right(self) -> Vec2 { pub fn bottom_right(self) -> Vec2 {
self.bottom_right self.bottom_right
} }
/// Returns the top-right corner. /// Returns the top-right corner.
///
/// This is inclusive.
pub fn top_right(self) -> Vec2 { pub fn top_right(self) -> Vec2 {
Vec2::new(self.right(), self.top()) Vec2::new(self.right(), self.top())
} }
/// Returns the bottom-left corner. /// Returns the bottom-left corner.
///
/// This is inclusive.
pub fn bottom_left(self) -> Vec2 { pub fn bottom_left(self) -> Vec2 {
Vec2::new(self.left(), self.bottom()) Vec2::new(self.left(), self.bottom())
} }

View File

@ -106,6 +106,6 @@ pub trait View: Any + AnyView {
/// ///
/// Default implementation return the entire view. /// Default implementation return the entire view.
fn important_area(&self, view_size: Vec2) -> Rect { fn important_area(&self, view_size: Vec2) -> Rect {
Rect::from_corners((0, 0), view_size) Rect::from_size((0, 0), view_size)
} }
} }

View File

@ -239,11 +239,13 @@ fn try_focus(
) -> Option<usize> { ) -> Option<usize> {
match *child { match *child {
ListChild::Delimiter => None, ListChild::Delimiter => None,
ListChild::Row(_, ref mut view) => if view.take_focus(source) { ListChild::Row(_, ref mut view) => {
if view.take_focus(source) {
Some(i) Some(i)
} else { } else {
None None
}, }
}
} }
} }
@ -409,7 +411,8 @@ impl View for ListView {
let area = match self.children[self.focus] { let area = match self.children[self.focus] {
ListChild::Row(_, ref view) => { ListChild::Row(_, ref view) => {
let available = Vec2::new(size.x - labels_width - 1, 1); let available =
Vec2::new(size.x.saturating_sub(labels_width + 1), 1);
view.important_area(available) + (labels_width, 0) view.important_area(available) + (labels_width, 0)
} }
ListChild::Delimiter => Rect::from_size((0, 0), (size.x, 1)), ListChild::Delimiter => Rect::from_size((0, 0), (size.x, 1)),

View File

@ -510,7 +510,8 @@ impl<T: 'static> SelectView<T> {
.checked_sub(offset) .checked_sub(offset)
.map(|position| { .map(|position| {
position < self.last_size && position.y < self.len() position < self.last_size && position.y < self.len()
}).unwrap_or(false) => })
.unwrap_or(false) =>
{ {
self.focus.set(position.y - offset.y) self.focus.set(position.y - offset.y)
} }
@ -523,7 +524,8 @@ impl<T: 'static> SelectView<T> {
.checked_sub(offset) .checked_sub(offset)
.map(|position| { .map(|position| {
position < self.last_size && position.y == self.focus() position < self.last_size && position.y == self.focus()
}).unwrap_or(false) => })
.unwrap_or(false) =>
{ {
return self.submit(); return self.submit();
} }