mirror of
https://github.com/FliegendeWurst/cursive.git
synced 2024-11-23 17:35:00 +00:00
Fix focus for stack and text views.
And updated Lorem example with a Quit button under the scrollable text.
This commit is contained in:
parent
6b781684ef
commit
db39069260
@ -19,7 +19,8 @@ fn main() {
|
|||||||
|
|
||||||
// The text is too long to fit on a line, so the view will wrap lines,
|
// The text is too long to fit on a line, so the view will wrap lines,
|
||||||
// and will adapt to the terminal size.
|
// and will adapt to the terminal size.
|
||||||
siv.add_layer(TextView::new(&content));
|
siv.add_layer(Dialog::new(TextView::new(&content))
|
||||||
|
.button("Quit", |s| s.quit()));
|
||||||
// Show a popup on top of the view.
|
// Show a popup on top of the view.
|
||||||
siv.add_layer(Dialog::new(TextView::new("Try resizing the terminal!\n(Press 'q' to quit when you're done.)"))
|
siv.add_layer(Dialog::new(TextView::new("Try resizing the terminal!\n(Press 'q' to quit when you're done.)"))
|
||||||
.padding((0,0,0,0))
|
.padding((0,0,0,0))
|
||||||
|
@ -15,6 +15,8 @@ pub struct StackView {
|
|||||||
struct Layer {
|
struct Layer {
|
||||||
view: Box<View>,
|
view: Box<View>,
|
||||||
size: Vec2,
|
size: Vec2,
|
||||||
|
// Has it received the gift yet?
|
||||||
|
virgin: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl StackView {
|
impl StackView {
|
||||||
@ -26,11 +28,11 @@ impl StackView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Add new view on top of the stack.
|
/// Add new view on top of the stack.
|
||||||
pub fn add_layer<T: 'static + View>(&mut self, mut view: T) {
|
pub fn add_layer<T: 'static + View>(&mut self, view: T) {
|
||||||
view.take_focus();
|
|
||||||
self.layers.push(Layer {
|
self.layers.push(Layer {
|
||||||
view: Box::new(ShadowView::new(view)),
|
view: Box::new(ShadowView::new(view)),
|
||||||
size: Vec2::new(0,0),
|
size: Vec2::new(0,0),
|
||||||
|
virgin: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,12 +44,13 @@ impl StackView {
|
|||||||
|
|
||||||
impl View for StackView {
|
impl View for StackView {
|
||||||
fn draw(&mut self, printer: &Printer) {
|
fn draw(&mut self, printer: &Printer) {
|
||||||
for v in self.layers.iter_mut() {
|
let last = self.layers.len();
|
||||||
|
for (i,v) in self.layers.iter_mut().enumerate() {
|
||||||
// Center the view
|
// Center the view
|
||||||
let size = v.size;
|
let size = v.size;
|
||||||
let offset = (printer.size - size) / 2;
|
let offset = (printer.size - size) / 2;
|
||||||
// TODO: only draw focus for the top view
|
// TODO: only draw focus for the top view
|
||||||
v.view.draw(&printer.sub_printer(offset, size, true));
|
v.view.draw(&printer.sub_printer(offset, size, i+1 == last));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,6 +69,10 @@ impl View for StackView {
|
|||||||
for layer in self.layers.iter_mut() {
|
for layer in self.layers.iter_mut() {
|
||||||
layer.size = Vec2::min(size, layer.view.get_min_size(req));
|
layer.size = Vec2::min(size, layer.view.get_min_size(req));
|
||||||
layer.view.layout(layer.size);
|
layer.view.layout(layer.size);
|
||||||
|
if layer.virgin {
|
||||||
|
layer.view.take_focus();
|
||||||
|
layer.virgin = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,6 +247,10 @@ impl View for TextView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn take_focus(&mut self) -> bool {
|
||||||
|
self.view_height < self.rows.len()
|
||||||
|
}
|
||||||
|
|
||||||
fn layout(&mut self, size: Vec2) {
|
fn layout(&mut self, size: Vec2) {
|
||||||
// Compute the text rows.
|
// Compute the text rows.
|
||||||
self.view_height = size.y;
|
self.view_height = size.y;
|
||||||
|
Loading…
Reference in New Issue
Block a user