From 5f2655b96817ade53456cfe9abc8dcccc8cec5a8 Mon Sep 17 00:00:00 2001 From: Josh McKinney Date: Tue, 28 May 2024 13:23:39 -0700 Subject: [PATCH] feat: re-export backends from the ratatui crate (#1151) `crossterm`, `termion`, and `termwiz` can now be accessed as `ratatui::{crossterm, termion, termwiz}` respectively. This makes it possible to just add the Ratatui crate as a dependency and use the backend of choice without having to add the backend crates as dependencies. To update existing code, replace all instances of `crossterm::` with `ratatui::crossterm::`, `termion::` with `ratatui::termion::`, and `termwiz::` with `ratatui::termwiz::`. --- README.md | 44 ++++++++++++++--------------- examples/barchart.rs | 10 +++---- examples/block.rs | 10 +++---- examples/calendar.rs | 13 +++++---- examples/canvas.rs | 10 +++---- examples/chart.rs | 10 +++---- examples/colors.rs | 10 +++---- examples/colors_rgb.rs | 14 ++++++---- examples/constraint-explorer.rs | 10 +++---- examples/constraints.rs | 15 ++++++---- examples/custom_widget.rs | 17 +++++++----- examples/demo/crossterm.rs | 12 ++++---- examples/demo/termion.rs | 14 ++++++---- examples/demo/termwiz.rs | 10 ++++--- examples/demo2/app.rs | 7 +++-- examples/demo2/term.rs | 12 ++++---- examples/docsrs.rs | 10 +++---- examples/flex.rs | 10 +++---- examples/gauge.rs | 10 +++---- examples/hello_world.rs | 13 +++++---- examples/layout.rs | 10 +++---- examples/line_gauge.rs | 10 +++---- examples/list.rs | 14 ++++++---- examples/minimal.rs | 14 ++++++---- examples/modifiers.rs | 15 ++++++---- examples/panic.rs | 8 +++--- examples/paragraph.rs | 10 +++---- examples/popup.rs | 10 +++---- examples/ratatui-logo.rs | 7 +++-- examples/scrollbar.rs | 14 ++++++---- examples/sparkline.rs | 10 +++---- examples/table.rs | 15 ++++++---- examples/tabs.rs | 14 ++++++---- examples/user_input.rs | 10 +++---- src/backend/crossterm.rs | 30 +++++++++++--------- src/backend/termion.rs | 11 ++++---- src/backend/termwiz.rs | 15 +++++----- src/lib.rs | 49 ++++++++++++++++++++------------- tests/backend_termion.rs | 2 +- 39 files changed, 295 insertions(+), 234 deletions(-) diff --git a/README.md b/README.md index e3e65e0152..2ba910c6c0 100644 --- a/README.md +++ b/README.md @@ -43,10 +43,10 @@ Ratatui was forked from the [tui-rs] crate in 2023 in order to continue its deve ## Installation -Add `ratatui` and `crossterm` as dependencies to your cargo.toml: +Add `ratatui` as a dependency to your cargo.toml: ```shell -cargo add ratatui crossterm +cargo add ratatui ``` Ratatui uses [Crossterm] by default as it works on most platforms. See the [Installation] @@ -110,7 +110,8 @@ module] and the [Backends] section of the [Ratatui Website] for more info. The drawing logic is delegated to a closure that takes a [`Frame`] instance as argument. The [`Frame`] provides the size of the area to draw to and allows the app to render any [`Widget`] -using the provided [`render_widget`] method. See the [Widgets] section of the [Ratatui Website] +using the provided [`render_widget`] method. After this closure returns, a diff is performed and +only the changes are drawn to the terminal. See the [Widgets] section of the [Ratatui Website] for more info. ### Handling events @@ -125,12 +126,17 @@ Website] for more info. For example, if you are using [Crossterm], you can use t ```rust use std::io::{self, stdout}; -use crossterm::{ - event::{self, Event, KeyCode}, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, - ExecutableCommand, +use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode}, + terminal::{ + disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, + }, + ExecutableCommand, + }, + prelude::*, + widgets::*, }; -use ratatui::{prelude::*, widgets::*}; fn main() -> io::Result<()> { enable_raw_mode()?; @@ -161,8 +167,7 @@ fn handle_events() -> io::Result { fn ui(frame: &mut Frame) { frame.render_widget( - Paragraph::new("Hello World!") - .block(Block::bordered().title("Greeting")), + Paragraph::new("Hello World!").block(Block::bordered().title("Greeting")), frame.size(), ); } @@ -206,14 +211,8 @@ fn ui(frame: &mut Frame) { [Constraint::Percentage(50), Constraint::Percentage(50)], ) .split(main_layout[1]); - frame.render_widget( - Block::bordered().title("Left"), - inner_layout[0], - ); - frame.render_widget( - Block::bordered().title("Right"), - inner_layout[1], - ); + frame.render_widget(Block::bordered().title("Left"), inner_layout[0]); + frame.render_widget(Block::bordered().title("Right"), inner_layout[1]); } ``` @@ -331,17 +330,14 @@ Running this example produces the following output: [License Badge]: https://img.shields.io/crates/l/ratatui?style=flat-square&color=1370D3 [CI Badge]: https://img.shields.io/github/actions/workflow/status/ratatui-org/ratatui/ci.yml?style=flat-square&logo=github [CI Workflow]: https://github.com/ratatui-org/ratatui/actions/workflows/ci.yml -[Codecov Badge]: - https://img.shields.io/codecov/c/github/ratatui-org/ratatui?logo=codecov&style=flat-square&token=BAQ8SOKEST&color=C43AC3&logoColor=C43AC3 +[Codecov Badge]: https://img.shields.io/codecov/c/github/ratatui-org/ratatui?logo=codecov&style=flat-square&token=BAQ8SOKEST&color=C43AC3&logoColor=C43AC3 [Codecov]: https://app.codecov.io/gh/ratatui-org/ratatui [Deps.rs Badge]: https://deps.rs/repo/github/ratatui-org/ratatui/status.svg?style=flat-square [Deps.rs]: https://deps.rs/repo/github/ratatui-org/ratatui -[Discord Badge]: - https://img.shields.io/discord/1070692720437383208?label=discord&logo=discord&style=flat-square&color=1370D3&logoColor=1370D3 +[Discord Badge]: https://img.shields.io/discord/1070692720437383208?label=discord&logo=discord&style=flat-square&color=1370D3&logoColor=1370D3 [Discord Server]: https://discord.gg/pMCEU9hNEj [Docs Badge]: https://img.shields.io/docsrs/ratatui?logo=rust&style=flat-square&logoColor=E05D44 -[Matrix Badge]: - https://img.shields.io/matrix/ratatui-general%3Amatrix.org?style=flat-square&logo=matrix&label=Matrix&color=C43AC3 +[Matrix Badge]: https://img.shields.io/matrix/ratatui-general%3Amatrix.org?style=flat-square&logo=matrix&label=Matrix&color=C43AC3 [Matrix]: https://matrix.to/#/#ratatui:matrix.org [Sponsors Badge]: https://img.shields.io/github/sponsors/ratatui-org?logo=github&style=flat-square&color=1370D3 diff --git a/examples/barchart.rs b/examples/barchart.rs index b405bf965e..b71bd3dd87 100644 --- a/examples/barchart.rs +++ b/examples/barchart.rs @@ -19,12 +19,12 @@ use std::{ time::{Duration, Instant}, }; -use crossterm::{ - event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -}; use ratatui::{ + crossterm::{ + event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, prelude::*, widgets::{Bar, BarChart, BarGroup, Block, Paragraph}, }; diff --git a/examples/block.rs b/examples/block.rs index beb47004e2..385c87f448 100644 --- a/examples/block.rs +++ b/examples/block.rs @@ -20,13 +20,13 @@ use std::{ time::Duration, }; -use crossterm::{ - event::{self, Event, KeyCode}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -}; use itertools::Itertools; use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, prelude::*, widgets::{ block::{Position, Title}, diff --git a/examples/calendar.rs b/examples/calendar.rs index e7c4970eb6..4861a786b2 100644 --- a/examples/calendar.rs +++ b/examples/calendar.rs @@ -17,12 +17,15 @@ use std::{error::Error, io}; -use crossterm::{ - event::{self, Event, KeyCode}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, +use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, + prelude::*, + widgets::calendar::*, }; -use ratatui::{prelude::*, widgets::calendar::*}; use time::{Date, Month, OffsetDateTime}; fn main() -> Result<(), Box> { diff --git a/examples/canvas.rs b/examples/canvas.rs index 972d928712..170490a9ad 100644 --- a/examples/canvas.rs +++ b/examples/canvas.rs @@ -20,12 +20,12 @@ use std::{ time::{Duration, Instant}, }; -use crossterm::{ - event::{self, Event, KeyCode}, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, - ExecutableCommand, -}; use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode}, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + ExecutableCommand, + }, prelude::*, widgets::{canvas::*, *}, }; diff --git a/examples/chart.rs b/examples/chart.rs index 2c592e365d..57903314d3 100644 --- a/examples/chart.rs +++ b/examples/chart.rs @@ -19,12 +19,12 @@ use std::{ time::{Duration, Instant}, }; -use crossterm::{ - event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -}; use ratatui::{ + crossterm::{ + event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, prelude::*, widgets::{block::Title, Axis, Block, Chart, Dataset, GraphType, LegendPosition}, }; diff --git a/examples/colors.rs b/examples/colors.rs index be919abc60..831216c2e5 100644 --- a/examples/colors.rs +++ b/examples/colors.rs @@ -23,13 +23,13 @@ use std::{ time::Duration, }; -use crossterm::{ - event::{self, Event, KeyCode}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -}; use itertools::Itertools; use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, prelude::*, widgets::{Block, Borders, Paragraph}, }; diff --git a/examples/colors_rgb.rs b/examples/colors_rgb.rs index d7b5ab6898..d19841942a 100644 --- a/examples/colors_rgb.rs +++ b/examples/colors_rgb.rs @@ -33,13 +33,15 @@ use std::{ }; use color_eyre::{config::HookBuilder, eyre, Result}; -use crossterm::{ - event::{self, Event, KeyCode, KeyEventKind}, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, - ExecutableCommand, -}; use palette::{convert::FromColorUnclamped, Okhsv, Srgb}; -use ratatui::prelude::*; +use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode, KeyEventKind}, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + ExecutableCommand, + }, + prelude::*, +}; #[derive(Debug, Default)] struct App { diff --git a/examples/constraint-explorer.rs b/examples/constraint-explorer.rs index 8a9faf5fd1..a369821508 100644 --- a/examples/constraint-explorer.rs +++ b/examples/constraint-explorer.rs @@ -18,13 +18,13 @@ use std::io::{self, stdout}; use color_eyre::{config::HookBuilder, Result}; -use crossterm::{ - event::{self, Event, KeyCode, KeyEventKind}, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, - ExecutableCommand, -}; use itertools::Itertools; use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode, KeyEventKind}, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + ExecutableCommand, + }, layout::{Constraint::*, Flex}, prelude::*, style::palette::tailwind::*, diff --git a/examples/constraints.rs b/examples/constraints.rs index 72601a4b55..7c9149e614 100644 --- a/examples/constraints.rs +++ b/examples/constraints.rs @@ -18,12 +18,17 @@ use std::io::{self, stdout}; use color_eyre::{config::HookBuilder, Result}; -use crossterm::{ - event::{self, Event, KeyCode, KeyEventKind}, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, - ExecutableCommand, +use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode, KeyEventKind}, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + ExecutableCommand, + }, + layout::Constraint::*, + prelude::*, + style::palette::tailwind, + widgets::*, }; -use ratatui::{layout::Constraint::*, prelude::*, style::palette::tailwind, widgets::*}; use strum::{Display, EnumIter, FromRepr, IntoEnumIterator}; const SPACER_HEIGHT: u16 = 0; diff --git a/examples/custom_widget.rs b/examples/custom_widget.rs index 93c6961466..d5d00bd02f 100644 --- a/examples/custom_widget.rs +++ b/examples/custom_widget.rs @@ -15,15 +15,18 @@ use std::{error::Error, io, ops::ControlFlow, time::Duration}; -use crossterm::{ - event::{ - self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, MouseButton, MouseEvent, - MouseEventKind, +use ratatui::{ + crossterm::{ + event::{ + self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, MouseButton, MouseEvent, + MouseEventKind, + }, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, }, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + prelude::*, + widgets::Paragraph, }; -use ratatui::{prelude::*, widgets::Paragraph}; /// A custom widget that renders a button with a label, theme and state. #[derive(Debug, Clone)] diff --git a/examples/demo/crossterm.rs b/examples/demo/crossterm.rs index 907c364586..3ab93c1a5b 100644 --- a/examples/demo/crossterm.rs +++ b/examples/demo/crossterm.rs @@ -4,12 +4,14 @@ use std::{ time::{Duration, Instant}, }; -use crossterm::{ - event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, +use ratatui::{ + crossterm::{ + event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, + prelude::*, }; -use ratatui::prelude::*; use crate::{app::App, ui}; diff --git a/examples/demo/termion.rs b/examples/demo/termion.rs index 47d828f6ba..8b49ed5e87 100644 --- a/examples/demo/termion.rs +++ b/examples/demo/termion.rs @@ -1,11 +1,13 @@ use std::{error::Error, io, sync::mpsc, thread, time::Duration}; -use ratatui::prelude::*; -use termion::{ - event::Key, - input::{MouseTerminal, TermRead}, - raw::IntoRawMode, - screen::IntoAlternateScreen, +use ratatui::{ + prelude::*, + termion::{ + event::Key, + input::{MouseTerminal, TermRead}, + raw::IntoRawMode, + screen::IntoAlternateScreen, + }, }; use crate::{app::App, ui}; diff --git a/examples/demo/termwiz.rs b/examples/demo/termwiz.rs index 45cb14a3e1..030be7b818 100644 --- a/examples/demo/termwiz.rs +++ b/examples/demo/termwiz.rs @@ -3,10 +3,12 @@ use std::{ time::{Duration, Instant}, }; -use ratatui::prelude::*; -use termwiz::{ - input::{InputEvent, KeyCode}, - terminal::Terminal as TermwizTerminal, +use ratatui::{ + prelude::*, + termwiz::{ + input::{InputEvent, KeyCode}, + terminal::Terminal as TermwizTerminal, + }, }; use crate::{app::App, ui}; diff --git a/examples/demo2/app.rs b/examples/demo2/app.rs index e74ee31d79..480a01e9ed 100644 --- a/examples/demo2/app.rs +++ b/examples/demo2/app.rs @@ -1,9 +1,12 @@ use std::time::Duration; use color_eyre::{eyre::Context, Result}; -use crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind}; use itertools::Itertools; -use ratatui::{prelude::*, widgets::*}; +use ratatui::{ + crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind}, + prelude::*, + widgets::*, +}; use strum::{Display, EnumIter, FromRepr, IntoEnumIterator}; use crate::{destroy, tabs::*, term, THEME}; diff --git a/examples/demo2/term.rs b/examples/demo2/term.rs index 6bab1329d8..9c1ff3fdb9 100644 --- a/examples/demo2/term.rs +++ b/examples/demo2/term.rs @@ -4,12 +4,14 @@ use std::{ }; use color_eyre::{eyre::WrapErr, Result}; -use crossterm::{ - event::{self, Event}, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, - ExecutableCommand, +use ratatui::{ + crossterm::{ + event::{self, Event}, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + ExecutableCommand, + }, + prelude::*, }; -use ratatui::prelude::*; pub fn init() -> Result> { // this size is to match the size of the terminal when running the demo diff --git a/examples/docsrs.rs b/examples/docsrs.rs index a5e7ae1f6d..d2b58b13e3 100644 --- a/examples/docsrs.rs +++ b/examples/docsrs.rs @@ -15,11 +15,12 @@ use std::io::{self, stdout}; -use crossterm::{ - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, - ExecutableCommand, -}; use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode}, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + ExecutableCommand, + }, prelude::*, widgets::{Block, Borders, Paragraph}, }; @@ -56,7 +57,6 @@ fn hello_world(frame: &mut Frame) { ); } -use crossterm::event::{self, Event, KeyCode}; fn handle_events() -> io::Result { if event::poll(std::time::Duration::from_millis(50))? { if let Event::Key(key) = event::read()? { diff --git a/examples/flex.rs b/examples/flex.rs index 6ba4938eac..706e3e2ba6 100644 --- a/examples/flex.rs +++ b/examples/flex.rs @@ -18,12 +18,12 @@ use std::io::{self, stdout}; use color_eyre::{config::HookBuilder, Result}; -use crossterm::{ - event::{self, Event, KeyCode, KeyEventKind}, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, - ExecutableCommand, -}; use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode, KeyEventKind}, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + ExecutableCommand, + }, layout::{Constraint::*, Flex}, prelude::*, style::palette::tailwind, diff --git a/examples/gauge.rs b/examples/gauge.rs index 85d86ec2f5..86428efc7d 100644 --- a/examples/gauge.rs +++ b/examples/gauge.rs @@ -18,12 +18,12 @@ use std::{io::stdout, time::Duration}; use color_eyre::{config::HookBuilder, Result}; -use crossterm::{ - event::{self, Event, KeyCode, KeyEventKind}, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, - ExecutableCommand, -}; use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode, KeyEventKind}, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + ExecutableCommand, + }, prelude::*, style::palette::tailwind, widgets::{block::Title, Block, Borders, Gauge, Padding, Paragraph}, diff --git a/examples/hello_world.rs b/examples/hello_world.rs index db17792592..cc6b3874ae 100644 --- a/examples/hello_world.rs +++ b/examples/hello_world.rs @@ -19,12 +19,15 @@ use std::{ }; use anyhow::{Context, Result}; -use crossterm::{ - event::{self, Event, KeyCode}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, +use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, + prelude::*, + widgets::Paragraph, }; -use ratatui::{prelude::*, widgets::Paragraph}; /// This is a bare minimum example. There are many approaches to running an application loop, so /// this is not meant to be prescriptive. It is only meant to demonstrate the basic setup and diff --git a/examples/layout.rs b/examples/layout.rs index 7986ef830f..3facac5832 100644 --- a/examples/layout.rs +++ b/examples/layout.rs @@ -17,13 +17,13 @@ use std::{error::Error, io}; -use crossterm::{ - event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -}; use itertools::Itertools; use ratatui::{ + crossterm::{ + event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, layout::Constraint::*, prelude::*, widgets::{Block, Paragraph}, diff --git a/examples/line_gauge.rs b/examples/line_gauge.rs index ad475b5784..0bec1785fb 100644 --- a/examples/line_gauge.rs +++ b/examples/line_gauge.rs @@ -16,12 +16,12 @@ use std::{io::stdout, time::Duration}; use color_eyre::{config::HookBuilder, Result}; -use crossterm::{ - event::{self, Event, KeyCode, KeyEventKind}, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, - ExecutableCommand, -}; use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode, KeyEventKind}, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + ExecutableCommand, + }, prelude::*, style::palette::tailwind, widgets::{block::Title, *}, diff --git a/examples/list.rs b/examples/list.rs index db7163b50d..d4baecb199 100644 --- a/examples/list.rs +++ b/examples/list.rs @@ -18,12 +18,16 @@ use std::{error::Error, io, io::stdout}; use color_eyre::config::HookBuilder; -use crossterm::{ - event::{self, Event, KeyCode, KeyEventKind}, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, - ExecutableCommand, +use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode, KeyEventKind}, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + ExecutableCommand, + }, + prelude::*, + style::palette::tailwind, + widgets::*, }; -use ratatui::{prelude::*, style::palette::tailwind, widgets::*}; const TODO_HEADER_BG: Color = tailwind::BLUE.c950; const NORMAL_ROW_COLOR: Color = tailwind::SLATE.c950; diff --git a/examples/minimal.rs b/examples/minimal.rs index 4915522cd6..75e2328ba5 100644 --- a/examples/minimal.rs +++ b/examples/minimal.rs @@ -13,12 +13,16 @@ //! [examples]: https://github.com/ratatui-org/ratatui/blob/main/examples //! [examples readme]: https://github.com/ratatui-org/ratatui/blob/main/examples/README.md -use crossterm::{ - event::{self, Event, KeyCode, KeyEventKind}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, +use ratatui::{ + backend::CrosstermBackend, + crossterm::{ + event::{self, Event, KeyCode, KeyEventKind}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, + text::Text, + Terminal, }; -use ratatui::{backend::CrosstermBackend, text::Text, Terminal}; /// This is a bare minimum example. There are many approaches to running an application loop, so /// this is not meant to be prescriptive. See the [examples] folder for more complete examples. diff --git a/examples/modifiers.rs b/examples/modifiers.rs index 336cbbff38..20954cd084 100644 --- a/examples/modifiers.rs +++ b/examples/modifiers.rs @@ -25,13 +25,16 @@ use std::{ time::Duration, }; -use crossterm::{ - event::{self, Event, KeyCode}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -}; use itertools::Itertools; -use ratatui::{prelude::*, widgets::Paragraph}; +use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, + prelude::*, + widgets::Paragraph, +}; type Result = result::Result>; diff --git a/examples/panic.rs b/examples/panic.rs index 21db3d2836..a82bc52590 100644 --- a/examples/panic.rs +++ b/examples/panic.rs @@ -31,11 +31,11 @@ use std::{error::Error, io}; -use crossterm::{ - event::{self, Event, KeyCode}, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -}; use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode}, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, prelude::*, widgets::{Block, Paragraph}, }; diff --git a/examples/paragraph.rs b/examples/paragraph.rs index fff8d89996..38f1c994dd 100644 --- a/examples/paragraph.rs +++ b/examples/paragraph.rs @@ -19,12 +19,12 @@ use std::{ time::{Duration, Instant}, }; -use crossterm::{ - event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -}; use ratatui::{ + crossterm::{ + event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, prelude::*, widgets::{Block, Paragraph, Wrap}, }; diff --git a/examples/popup.rs b/examples/popup.rs index 6ac42b134c..0b4ce10690 100644 --- a/examples/popup.rs +++ b/examples/popup.rs @@ -18,12 +18,12 @@ use std::{error::Error, io}; -use crossterm::{ - event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -}; use ratatui::{ + crossterm::{ + event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, prelude::*, widgets::{Block, Clear, Paragraph, Wrap}, }; diff --git a/examples/ratatui-logo.rs b/examples/ratatui-logo.rs index e40979fea5..30a421ec89 100644 --- a/examples/ratatui-logo.rs +++ b/examples/ratatui-logo.rs @@ -19,10 +19,13 @@ use std::{ time::Duration, }; -use crossterm::terminal::{disable_raw_mode, enable_raw_mode}; use indoc::indoc; use itertools::izip; -use ratatui::{prelude::*, widgets::Paragraph}; +use ratatui::{ + crossterm::terminal::{disable_raw_mode, enable_raw_mode}, + prelude::*, + widgets::Paragraph, +}; /// A fun example of using half block characters to draw a logo #[allow(clippy::many_single_char_names)] diff --git a/examples/scrollbar.rs b/examples/scrollbar.rs index 4777ab7f40..9601becabe 100644 --- a/examples/scrollbar.rs +++ b/examples/scrollbar.rs @@ -22,12 +22,16 @@ use std::{ time::{Duration, Instant}, }; -use crossterm::{ - event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, +use ratatui::{ + crossterm::{ + event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, + prelude::*, + symbols::scrollbar, + widgets::*, }; -use ratatui::{prelude::*, symbols::scrollbar, widgets::*}; #[derive(Default)] struct App { diff --git a/examples/sparkline.rs b/examples/sparkline.rs index cca8a20cdf..cc4523ef0d 100644 --- a/examples/sparkline.rs +++ b/examples/sparkline.rs @@ -19,16 +19,16 @@ use std::{ time::{Duration, Instant}, }; -use crossterm::{ - event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -}; use rand::{ distributions::{Distribution, Uniform}, rngs::ThreadRng, }; use ratatui::{ + crossterm::{ + event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, prelude::*, widgets::{Block, Borders, Sparkline}, }; diff --git a/examples/table.rs b/examples/table.rs index b2c0fcd1dd..3d9cd20206 100644 --- a/examples/table.rs +++ b/examples/table.rs @@ -17,13 +17,16 @@ use std::{error::Error, io}; -use crossterm::{ - event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -}; use itertools::Itertools; -use ratatui::{prelude::*, widgets::*}; +use ratatui::{ + crossterm::{ + event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, + prelude::*, + widgets::*, +}; use style::palette::tailwind; use unicode_width::UnicodeWidthStr; diff --git a/examples/tabs.rs b/examples/tabs.rs index e1feedc006..1b25bf7bcb 100644 --- a/examples/tabs.rs +++ b/examples/tabs.rs @@ -18,12 +18,16 @@ use std::io::stdout; use color_eyre::{config::HookBuilder, Result}; -use crossterm::{ - event::{self, Event, KeyCode, KeyEventKind}, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, - ExecutableCommand, +use ratatui::{ + crossterm::{ + event::{self, Event, KeyCode, KeyEventKind}, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + ExecutableCommand, + }, + prelude::*, + style::palette::tailwind, + widgets::*, }; -use ratatui::{prelude::*, style::palette::tailwind, widgets::*}; use strum::{Display, EnumIter, FromRepr, IntoEnumIterator}; #[derive(Default)] diff --git a/examples/user_input.rs b/examples/user_input.rs index 5aeb57839c..24f4d19dc1 100644 --- a/examples/user_input.rs +++ b/examples/user_input.rs @@ -29,12 +29,12 @@ use std::{error::Error, io}; -use crossterm::{ - event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -}; use ratatui::{ + crossterm::{ + event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, prelude::*, widgets::{Block, List, ListItem, Paragraph}, }; diff --git a/src/backend/crossterm.rs b/src/backend/crossterm.rs index 9c882fadec..ba47c75171 100644 --- a/src/backend/crossterm.rs +++ b/src/backend/crossterm.rs @@ -6,19 +6,19 @@ use std::io::{self, Write}; #[cfg(feature = "underline-color")] use crossterm::style::SetUnderlineColor; -use crossterm::{ - cursor::{Hide, MoveTo, Show}, - execute, queue, - style::{ - Attribute as CAttribute, Attributes as CAttributes, Color as CColor, Colors, ContentStyle, - Print, SetAttribute, SetBackgroundColor, SetColors, SetForegroundColor, - }, - terminal::{self, Clear}, -}; use crate::{ backend::{Backend, ClearType, WindowSize}, buffer::Cell, + crossterm::{ + cursor::{Hide, MoveTo, Show}, + execute, queue, + style::{ + Attribute as CAttribute, Attributes as CAttributes, Color as CColor, Colors, + ContentStyle, Print, SetAttribute, SetBackgroundColor, SetColors, SetForegroundColor, + }, + terminal::{self, Clear}, + }, layout::Size, prelude::Rect, style::{Color, Modifier, Style}, @@ -45,11 +45,15 @@ use crate::{ /// ```rust,no_run /// use std::io::{stderr, stdout}; /// -/// use crossterm::{ -/// terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -/// ExecutableCommand, +/// use ratatui::{ +/// crossterm::{ +/// terminal::{ +/// disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, +/// }, +/// ExecutableCommand, +/// }, +/// prelude::*, /// }; -/// use ratatui::prelude::*; /// /// let mut backend = CrosstermBackend::new(stdout()); /// // or diff --git a/src/backend/termion.rs b/src/backend/termion.rs index d6311fbcce..1aba61085d 100644 --- a/src/backend/termion.rs +++ b/src/backend/termion.rs @@ -9,13 +9,12 @@ use std::{ io::{self, Write}, }; -use termion::{color as tcolor, style as tstyle}; - use crate::{ backend::{Backend, ClearType, WindowSize}, buffer::Cell, prelude::Rect, style::{Color, Modifier, Style}, + termion::{self, color as tcolor, color::Color as _, style as tstyle}, }; /// A [`Backend`] implementation that uses [Termion] to render to the terminal. @@ -40,8 +39,10 @@ use crate::{ /// ```rust,no_run /// use std::io::{stderr, stdout}; /// -/// use ratatui::prelude::*; -/// use termion::{raw::IntoRawMode, screen::IntoAlternateScreen}; +/// use ratatui::{ +/// prelude::*, +/// termion::{raw::IntoRawMode, screen::IntoAlternateScreen}, +/// }; /// /// let writer = stdout().into_raw_mode()?.into_alternate_screen()?; /// let mut backend = TermionBackend::new(writer); @@ -257,7 +258,6 @@ struct ModifierDiff { impl fmt::Display for Fg { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - use termion::color::Color as TermionColor; match self.0 { Color::Reset => termion::color::Reset.write_fg(f), Color::Black => termion::color::Black.write_fg(f), @@ -283,7 +283,6 @@ impl fmt::Display for Fg { } impl fmt::Display for Bg { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - use termion::color::Color as TermionColor; match self.0 { Color::Reset => termion::color::Reset.write_bg(f), Color::Black => termion::color::Black.write_bg(f), diff --git a/src/backend/termwiz.rs b/src/backend/termwiz.rs index d665741452..1e01cf1650 100644 --- a/src/backend/termwiz.rs +++ b/src/backend/termwiz.rs @@ -7,20 +7,19 @@ use std::{error::Error, io}; -use termwiz::{ - caps::Capabilities, - cell::{AttributeChange, Blink, CellAttributes, Intensity, Underline}, - color::{AnsiColor, ColorAttribute, ColorSpec, LinearRgba, RgbColor, SrgbaTuple}, - surface::{Change, CursorVisibility, Position}, - terminal::{buffered::BufferedTerminal, ScreenSize, SystemTerminal, Terminal}, -}; - use crate::{ backend::{Backend, WindowSize}, buffer::Cell, layout::Size, prelude::Rect, style::{Color, Modifier, Style}, + termwiz::{ + caps::Capabilities, + cell::{AttributeChange, Blink, CellAttributes, Intensity, Underline}, + color::{AnsiColor, ColorAttribute, ColorSpec, LinearRgba, RgbColor, SrgbaTuple}, + surface::{Change, CursorVisibility, Position}, + terminal::{buffered::BufferedTerminal, ScreenSize, SystemTerminal, Terminal}, + }, }; /// A [`Backend`] implementation that uses [Termwiz] to render to the terminal. diff --git a/src/lib.rs b/src/lib.rs index 905790880d..f89cfecda5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,10 +20,10 @@ //! //! ## Installation //! -//! Add `ratatui` and `crossterm` as dependencies to your cargo.toml: +//! Add `ratatui` as a dependency to your cargo.toml: //! //! ```shell -//! cargo add ratatui crossterm +//! cargo add ratatui //! ``` //! //! Ratatui uses [Crossterm] by default as it works on most platforms. See the [Installation] @@ -103,12 +103,17 @@ //! ```rust,no_run //! use std::io::{self, stdout}; //! -//! use crossterm::{ -//! event::{self, Event, KeyCode}, -//! terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -//! ExecutableCommand, +//! use ratatui::{ +//! crossterm::{ +//! event::{self, Event, KeyCode}, +//! terminal::{ +//! disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, +//! }, +//! ExecutableCommand, +//! }, +//! prelude::*, +//! widgets::*, //! }; -//! use ratatui::{prelude::*, widgets::*}; //! //! fn main() -> io::Result<()> { //! enable_raw_mode()?; @@ -300,24 +305,20 @@ //! [Termwiz]: https://crates.io/crates/termwiz //! [tui-rs]: https://crates.io/crates/tui //! [GitHub Sponsors]: https://github.com/sponsors/ratatui-org -//! [Crate Badge]: https://img.shields.io/crates/v/ratatui?logo=rust&style=flat-square -//! [License Badge]: https://img.shields.io/crates/l/ratatui?style=flat-square -//! [CI Badge]: -//! https://img.shields.io/github/actions/workflow/status/ratatui-org/ratatui/ci.yml?style=flat-square&logo=github +//! [Crate Badge]: https://img.shields.io/crates/v/ratatui?logo=rust&style=flat-square&logoColor=E05D44&color=E05D44 +//! [License Badge]: https://img.shields.io/crates/l/ratatui?style=flat-square&color=1370D3 +//! [CI Badge]: https://img.shields.io/github/actions/workflow/status/ratatui-org/ratatui/ci.yml?style=flat-square&logo=github //! [CI Workflow]: https://github.com/ratatui-org/ratatui/actions/workflows/ci.yml -//! [Codecov Badge]: -//! https://img.shields.io/codecov/c/github/ratatui-org/ratatui?logo=codecov&style=flat-square&token=BAQ8SOKEST +//! [Codecov Badge]: https://img.shields.io/codecov/c/github/ratatui-org/ratatui?logo=codecov&style=flat-square&token=BAQ8SOKEST&color=C43AC3&logoColor=C43AC3 //! [Codecov]: https://app.codecov.io/gh/ratatui-org/ratatui //! [Deps.rs Badge]: https://deps.rs/repo/github/ratatui-org/ratatui/status.svg?style=flat-square //! [Deps.rs]: https://deps.rs/repo/github/ratatui-org/ratatui -//! [Discord Badge]: -//! https://img.shields.io/discord/1070692720437383208?label=discord&logo=discord&style=flat-square +//! [Discord Badge]: https://img.shields.io/discord/1070692720437383208?label=discord&logo=discord&style=flat-square&color=1370D3&logoColor=1370D3 //! [Discord Server]: https://discord.gg/pMCEU9hNEj -//! [Docs Badge]: https://img.shields.io/docsrs/ratatui?logo=rust&style=flat-square -//! [Matrix Badge]: -//! https://img.shields.io/matrix/ratatui-general%3Amatrix.org?style=flat-square&logo=matrix&label=Matrix +//! [Docs Badge]: https://img.shields.io/docsrs/ratatui?logo=rust&style=flat-square&logoColor=E05D44 +//! [Matrix Badge]: https://img.shields.io/matrix/ratatui-general%3Amatrix.org?style=flat-square&logo=matrix&label=Matrix&color=C43AC3 //! [Matrix]: https://matrix.to/#/#ratatui:matrix.org -//! [Sponsors Badge]: https://img.shields.io/github/sponsors/ratatui-org?logo=github&style=flat-square +//! [Sponsors Badge]: https://img.shields.io/github/sponsors/ratatui-org?logo=github&style=flat-square&color=1370D3 // show the feature flags in the generated documentation #![cfg_attr(docsrs, feature(doc_auto_cfg))] @@ -339,3 +340,13 @@ pub mod widgets; pub use self::terminal::{CompletedFrame, Frame, Terminal, TerminalOptions, Viewport}; pub mod prelude; + +/// re-export the `crossterm` crate so that users don't have to add it as a dependency +#[cfg(feature = "crossterm")] +pub use crossterm; +/// re-export the `termion` crate so that users don't have to add it as a dependency +#[cfg(feature = "termion")] +pub use termion; +/// re-export the `termwiz` crate so that users don't have to add it as a dependency +#[cfg(feature = "termwiz")] +pub use termwiz; diff --git a/tests/backend_termion.rs b/tests/backend_termion.rs index 8f181d7711..7b3b3dfce4 100644 --- a/tests/backend_termion.rs +++ b/tests/backend_termion.rs @@ -30,7 +30,7 @@ fn backend_termion_should_only_write_diffs() -> Result<(), Box