From dd24a2921eb0587dfffbbafea4a3e62b92f39c43 Mon Sep 17 00:00:00 2001 From: Philipp Mildenberger Date: Sun, 10 Mar 2024 21:16:16 +0100 Subject: [PATCH] Add scroll-view example (and fix small issues) (#28) --- examples/scroll_view.rs | 65 ++++++++++++++++++++++++++++++ src/view/weighted_linear_layout.rs | 1 + src/widget/scroll_view.rs | 2 +- 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 examples/scroll_view.rs diff --git a/examples/scroll_view.rs b/examples/scroll_view.rs new file mode 100644 index 0000000..b5163be --- /dev/null +++ b/examples/scroll_view.rs @@ -0,0 +1,65 @@ +use std::sync::Arc; + +use anyhow::Result; +use ratatui::style::Color; +use trui::*; + +fn main() -> Result<()> { + let entry = |num| { + weighted_h_stack(( + format!("{num}").weight(0.05), + "Avatar" + .border(BorderKind::Straight) + .fill_max_height(1.0) // TODO not working + .weight(0.3), + v_stack(( + "Description" + .fg(Color::Red) + .margin((2, Position::LEFT)) + .margin((1, Position::VERTICAL)), + "Lorem ipsum dolor sit amet,\n\ + consectetur adipiscing elit,\n\ + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n\ + Ut enim ad minim veniam,\n\ + quis nostrud exercitation ullamco laboris nisi ut aliquip \ + ex ea commodo consequat.\n\ + Duis aute irure dolor in reprehenderit in voluptate velit esse \ + cillum dolore eu fugiat nulla pariatur.\n\ + Excepteur sint occaecat cupidatat non proident,\n\ + sunt in culpa qui officia deserunt mollit anim id est laborum." + .fg(Color::Blue), + )), + )) + .border(BorderKind::Rounded) + // .margin(1) + }; + + fn list_with_every_nth_red_otherwise_blue( + n: usize, + views: impl Iterator>, + ) -> Vec> { + views + .enumerate() + .map(|(i, v)| { + if i % n == 0 { + OneOf2::A( + v.border(Borders::VERTICAL) + .fg(Color::Red) + .on_hover_bg(Color::Magenta), + ) + } else { + OneOf2::B( + v.border(Borders::VERTICAL) + .fg(Color::Blue) + .on_hover_bg(Color::Yellow), + ) + } + }) + .collect() + } + let list = list_with_every_nth_red_otherwise_blue(2, (0..10).map(entry)); + let scroll_view = Arc::new(scroll_view(v_stack(list))); + + // let scroll_view = Arc::new(scroll_view()); + App::new((), move |()| scroll_view.clone()).run() +} diff --git a/src/view/weighted_linear_layout.rs b/src/view/weighted_linear_layout.rs index 39a4f12..24501a8 100644 --- a/src/view/weighted_linear_layout.rs +++ b/src/view/weighted_linear_layout.rs @@ -7,6 +7,7 @@ use crate::{ use std::{any::Any, marker::PhantomData}; use xilem_core::{Id, MessageResult, VecSplice}; +#[derive(Clone, Copy, Debug, PartialEq)] pub struct WeightedLinearLayout { children: VT, axis: Axis, diff --git a/src/widget/scroll_view.rs b/src/widget/scroll_view.rs index 3ccb7eb..eb5a552 100644 --- a/src/widget/scroll_view.rs +++ b/src/widget/scroll_view.rs @@ -37,7 +37,7 @@ impl Widget for ScrollView { // TODO: scroll wheel + click-drag on scroll bars let child_event = if let Event::Mouse(mouse_event) = event { let mut mouse_event = *mouse_event; - mouse_event.column += self.offset.round() as i16; + mouse_event.row += self.offset.round() as i16; Event::Mouse(mouse_event) } else { event.clone()