mirror of
https://github.com/FliegendeWurst/cursive.git
synced 2024-11-23 17:35:00 +00:00
Implement TextArea::important_area
This commit is contained in:
parent
1ad515e5f0
commit
a989fd5f80
@ -597,16 +597,28 @@ impl View for LinearLayout {
|
||||
}
|
||||
|
||||
fn important_area(&self, _: Vec2) -> Rect {
|
||||
let mut iterator = ChildIterator::new(
|
||||
self.children.iter(),
|
||||
self.orientation,
|
||||
usize::max_value(),
|
||||
);
|
||||
let item = iterator.nth(self.focus).unwrap();
|
||||
if self.children.is_empty() {
|
||||
// Return dummy area if we are empty.
|
||||
return Rect::from((0, 0));
|
||||
}
|
||||
|
||||
let rect = item.child.view.important_area(item.child.size);
|
||||
// Pick the focused item, with its offset
|
||||
let item = {
|
||||
let mut iterator = ChildIterator::new(
|
||||
self.children.iter(),
|
||||
self.orientation,
|
||||
usize::max_value(),
|
||||
);
|
||||
iterator.nth(self.focus).unwrap()
|
||||
};
|
||||
|
||||
// Make a vector offset from the scalar value
|
||||
let offset = self.orientation.make_vec(item.offset, 0);
|
||||
|
||||
// And ask the child its own area.
|
||||
let rect = item.child.view.important_area(item.child.size);
|
||||
|
||||
// Add `offset` to the rect.
|
||||
rect + offset
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
use {Printer, With, XY};
|
||||
use direction::Direction;
|
||||
use event::{Event, EventResult, Key, MouseButton, MouseEvent};
|
||||
use rect::Rect;
|
||||
use std::cmp::min;
|
||||
use theme::{ColorStyle, Effect};
|
||||
use unicode_segmentation::UnicodeSegmentation;
|
||||
@ -133,6 +134,10 @@ impl TextArea {
|
||||
self.row_at(self.cursor)
|
||||
}
|
||||
|
||||
fn selected_col(&self) -> usize {
|
||||
self.col_at(self.cursor)
|
||||
}
|
||||
|
||||
fn page_up(&mut self) {
|
||||
for _ in 0..5 {
|
||||
self.move_up();
|
||||
@ -593,4 +598,24 @@ impl View for TextArea {
|
||||
self.last_size = size;
|
||||
self.compute_rows(size);
|
||||
}
|
||||
|
||||
fn important_area(&self, _: Vec2) -> Rect {
|
||||
// The important area is a single character
|
||||
let char_width = if self.cursor >= self.content.len() {
|
||||
// If we're are the end of the content, it'll be a space
|
||||
1
|
||||
} else {
|
||||
// Otherwise it's the selected grapheme
|
||||
self.content[self.cursor..]
|
||||
.graphemes(true)
|
||||
.next()
|
||||
.unwrap()
|
||||
.width()
|
||||
};
|
||||
|
||||
Rect::from_size(
|
||||
(self.selected_col(), self.selected_row()),
|
||||
(char_width, 1),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user