mirror of
https://github.com/FliegendeWurst/cursive.git
synced 2024-11-23 17:35:00 +00:00
Add Cursive::screen_size based on last layout phase
This commit is contained in:
parent
58bbae5ec8
commit
fb23445e1d
@ -19,6 +19,8 @@ use crate::{
|
||||
|
||||
static DEBUG_VIEW_NAME: &str = "_cursive_debug_view";
|
||||
|
||||
type RootView = views::OnEventView<views::ScreensView<views::StackView>>;
|
||||
|
||||
/// Central part of the cursive library.
|
||||
///
|
||||
/// It initializes ncurses on creation and cleans up on drop.
|
||||
@ -30,7 +32,7 @@ pub struct Cursive {
|
||||
theme: theme::Theme,
|
||||
|
||||
// The main view
|
||||
root: views::OnEventView<views::ScreensView<views::StackView>>,
|
||||
root: RootView,
|
||||
|
||||
menubar: views::Menubar,
|
||||
|
||||
@ -42,6 +44,8 @@ pub struct Cursive {
|
||||
cb_source: Receiver<Box<dyn FnOnce(&mut Cursive) + Send>>,
|
||||
cb_sink: Sender<Box<dyn FnOnce(&mut Cursive) + Send>>,
|
||||
|
||||
last_size: Vec2,
|
||||
|
||||
// User-provided data.
|
||||
user_data: Box<dyn Any>,
|
||||
|
||||
@ -84,6 +88,7 @@ impl Cursive {
|
||||
views::StackView::new(),
|
||||
)),
|
||||
menubar: views::Menubar::new(),
|
||||
last_size: Vec2::zero(),
|
||||
needs_clear: true,
|
||||
running: true,
|
||||
cb_source,
|
||||
@ -96,7 +101,15 @@ impl Cursive {
|
||||
cursive
|
||||
}
|
||||
|
||||
/// Returns the screen size given in the last layout phase.
|
||||
///
|
||||
/// Note: this will return `(0, 0)` before the first layout phase.
|
||||
pub fn screen_size(&self) -> Vec2 {
|
||||
self.last_size
|
||||
}
|
||||
|
||||
pub(crate) fn layout(&mut self, size: Vec2) {
|
||||
self.last_size = size;
|
||||
let offset = if self.menubar.autohide { 0 } else { 1 };
|
||||
let size = size.saturating_sub((0, offset));
|
||||
self.root.layout(size);
|
||||
|
@ -9,6 +9,8 @@ const INPUT_POLL_DELAY_MS: u64 = 30;
|
||||
///
|
||||
/// You can get one from `Cursive::runner`, then either call `.run()`, or
|
||||
/// manually `.step()`.
|
||||
///
|
||||
/// The `C` type is usually either `Cursive` or `&mut Cursive`.
|
||||
pub struct CursiveRunner<C> {
|
||||
siv: C,
|
||||
backend: Box<dyn backend::Backend>,
|
||||
|
@ -305,6 +305,7 @@ impl Core {
|
||||
&& (self.offset.y + self.available_size().y
|
||||
< self.inner_size.y) =>
|
||||
{
|
||||
// No `min` check here - we allow going over the edge.
|
||||
self.offset.y += 5;
|
||||
}
|
||||
Event::Ctrl(Key::Down) | Event::Key(Key::Down)
|
||||
|
@ -210,19 +210,13 @@ where
|
||||
}
|
||||
|
||||
/// Implements `View::on_event` on the given model.
|
||||
pub fn on_event<Model, GetScroller, OnEvent, ImportantArea>(
|
||||
pub fn on_event<Model: ?Sized>(
|
||||
event: Event,
|
||||
model: &mut Model,
|
||||
mut get_scroller: GetScroller,
|
||||
mut on_event: OnEvent,
|
||||
mut important_area: ImportantArea,
|
||||
) -> EventResult
|
||||
where
|
||||
Model: ?Sized,
|
||||
GetScroller: FnMut(&mut Model) -> &mut scroll::Core,
|
||||
OnEvent: FnMut(&mut Model, Event) -> EventResult,
|
||||
ImportantArea: FnMut(&Model, Vec2) -> Rect,
|
||||
{
|
||||
mut get_scroller: impl FnMut(&mut Model) -> &mut scroll::Core,
|
||||
mut on_event: impl FnMut(&mut Model, Event) -> EventResult,
|
||||
mut important_area: impl FnMut(&Model, Vec2) -> Rect,
|
||||
) -> EventResult {
|
||||
let mut relative_event = event.clone();
|
||||
let inside = get_scroller(model).is_event_inside(&mut relative_event);
|
||||
let result = if inside {
|
||||
|
Loading…
Reference in New Issue
Block a user