nushell/crates/nu-explore/src/views/mod.rs
Maxim Zhiburt 28123841ba
Patch explore 4 (#7517)
ref #7339 - This PR updates explore to take some of the colors from
nushell, namely the line colors and the ls_colors.

note: Not sure why this regression appeared maybe it's a feature or it's
no longer supposed to be supported?

Signed-off-by: Maxim Zhiburt <zhiburt@gmail.com>
Co-authored-by: Darren Schroeder <343840+fdncred@users.noreply.github.com>
2022-12-18 08:43:15 -06:00

144 lines
3.1 KiB
Rust

mod coloredtextw;
mod cursor;
mod information;
mod interactive;
mod preview;
mod record;
pub mod util;
use crossterm::event::KeyEvent;
use lscolors::LsColors;
use nu_color_config::StyleComputer;
use nu_protocol::{
engine::{EngineState, Stack},
Value,
};
use tui::layout::Rect;
use crate::{nu_common::NuConfig, pager::ConfigMap};
use super::{
nu_common::NuText,
pager::{Frame, Transition, ViewInfo},
};
pub mod configuration;
pub use configuration::ConfigurationView;
pub use information::InformationView;
pub use interactive::InteractiveView;
pub use preview::Preview;
pub use record::{Orientation, RecordView};
#[derive(Debug, Default)]
pub struct Layout {
pub data: Vec<ElementInfo>,
}
impl Layout {
fn push(&mut self, text: &str, x: u16, y: u16, width: u16, height: u16) {
self.data.push(ElementInfo::new(text, x, y, width, height));
}
}
#[derive(Debug, Default, Clone)]
pub struct ElementInfo {
// todo: make it a Cow
pub text: String,
pub area: Rect,
}
impl ElementInfo {
pub fn new(text: impl Into<String>, x: u16, y: u16, width: u16, height: u16) -> Self {
Self {
text: text.into(),
area: Rect::new(x, y, width, height),
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct ViewConfig<'a> {
pub nu_config: &'a NuConfig,
pub style_computer: &'a StyleComputer<'a>,
pub config: &'a ConfigMap,
pub lscolors: &'a LsColors,
}
impl<'a> ViewConfig<'a> {
pub fn new(
nu_config: &'a NuConfig,
style_computer: &'a StyleComputer<'a>,
config: &'a ConfigMap,
lscolors: &'a LsColors,
) -> Self {
Self {
nu_config,
style_computer,
config,
lscolors,
}
}
}
pub trait View {
fn draw(&mut self, f: &mut Frame, area: Rect, cfg: ViewConfig<'_>, layout: &mut Layout);
fn handle_input(
&mut self,
engine_state: &EngineState,
stack: &mut Stack,
layout: &Layout,
info: &mut ViewInfo,
key: KeyEvent,
) -> Option<Transition>;
fn show_data(&mut self, _: usize) -> bool {
false
}
fn collect_data(&self) -> Vec<NuText> {
Vec::new()
}
fn exit(&mut self) -> Option<Value> {
None
}
fn setup(&mut self, _: ViewConfig<'_>) {}
}
impl View for Box<dyn View> {
fn draw(&mut self, f: &mut Frame, area: Rect, cfg: ViewConfig<'_>, layout: &mut Layout) {
self.as_mut().draw(f, area, cfg, layout)
}
fn handle_input(
&mut self,
engine_state: &EngineState,
stack: &mut Stack,
layout: &Layout,
info: &mut ViewInfo,
key: KeyEvent,
) -> Option<Transition> {
self.as_mut()
.handle_input(engine_state, stack, layout, info, key)
}
fn collect_data(&self) -> Vec<NuText> {
self.as_ref().collect_data()
}
fn exit(&mut self) -> Option<Value> {
self.as_mut().exit()
}
fn show_data(&mut self, i: usize) -> bool {
self.as_mut().show_data(i)
}
fn setup(&mut self, cfg: ViewConfig<'_>) {
self.as_mut().setup(cfg)
}
}