1
0
зеркало из https://github.com/glebtv/tui-textarea.git synced 2026-09-03 14:26:17 +03:00
Этот коммит содержится в:
rhysd
2023-10-24 15:32:39 +09:00
родитель e3783d1baf 1625ad6bc8
Коммит 8f2594bbc5
29 изменённых файлов: 434 добавлений и 348 удалений

Просмотреть файл

@@ -1,3 +1,3 @@
[alias]
watch-check = ["watch", "-x", "clippy --features ratatui-crossterm,search --no-default-features --examples --tests", "-x", "clippy --features search --examples --tests"]
watch-check = ["watch", "-x", "clippy --features search --examples --tests", "-x", "clippy --features tuirs-crossterm,search --no-default-features --examples --tests"]
watch-test = ["watch", "-x", "test --features=search", "-w", "src", "-w", "tests"]

21
.github/workflows/ci.yml поставляемый
Просмотреть файл

@@ -15,12 +15,11 @@ jobs:
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo test --features=search
- run: cargo test --no-default-features --features=ratatui-crossterm,search -- --skip .rs
- run: cargo test --no-default-features --features=ratatui-termion,search -- --skip .rs
- run: cargo test --no-default-features --features=tuirs-crossterm,search -- --skip .rs
- run: cargo test --no-default-features --features=tuirs-termion,search -- --skip .rs
if: ${{ matrix.os != 'windows-latest' }}
- run: cargo test --no-default-features --features=ratatui-termwiz,search -- --skip .rs
- run: cargo test --no-default-features --features=your-backend,search -- --skip .rs
- run: cargo test --no-default-features --features=ratatui-your-backend,search -- --skip .rs
- run: cargo test --no-default-features --features=tuirs-your-backend,search -- --skip .rs
lint:
runs-on: ubuntu-latest
steps:
@@ -32,16 +31,14 @@ jobs:
- run: cargo fmt -- --check
- run: cargo clippy --examples -- -D warnings
- run: cargo clippy --examples --features search -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-crossterm -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-crossterm,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-termion -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-termion,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-termwiz -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-termwiz,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features termion -- -D warnings
- run: cargo clippy --examples --no-default-features --features termion,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features your-backend -- -D warnings
- run: cargo clippy --examples --no-default-features --features your-backend,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-your-backend -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-your-backend,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features tuirs-crossterm -- -D warnings
- run: cargo clippy --examples --no-default-features --features tuirs-crossterm,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features tuirs-termion -- -D warnings
- run: cargo clippy --examples --no-default-features --features tuirs-termion,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features tuirs-your-backend -- -D warnings
- run: cargo clippy --examples --no-default-features --features tuirs-your-backend,search -- -D warnings
- run: cargo rustdoc --features=search -p tui-textarea -- -D warnings

Просмотреть файл

@@ -10,7 +10,7 @@ For reporting a bug, please make sure your report includes the following points.
- Environment
- Your terminal
- Rust version
- `tui` or `ratatui` crate version
- `ratatui` or `tui` crate version
- Enabled features of `tui-textarea` crate
An example of bug report: https://github.com/rhysd/tui-textarea/issues/1
@@ -29,7 +29,7 @@ To run linters:
```sh
cargo clippy --features=search --tests --examples
cargo clippy --features=ratatui-crossterm,search --no-default-features --tests --examples
cargo clippy --features=tuirs-crossterm,search --no-default-features --tests --examples
cargo fmt -- --check
```
@@ -67,7 +67,7 @@ tail -F debug.txt
## Running a fuzzer
To run fuzzing tests, [cargo-fuzz][] is necessary.
To run fuzzing tests, [cargo-fuzz][] and Rust nightly toolchain are necessary.
```sh
cargo +nightly fuzz run edit

Просмотреть файл

@@ -2,10 +2,10 @@
name = "tui-textarea"
version = "0.2.4"
edition = "2021"
rust-version = "1.56.1"
rust-version = "1.56.1" # for `tui` crate support
authors = ["rhysd <lin90162@yahoo.co.jp>"]
description = """
tui-textarea is a simple yet powerful text editor widget for tui-rs and ratatui. Multi-line
tui-textarea is a simple yet powerful text editor widget for ratatui and tui-rs. Multi-line
text editor can be easily put as part of your TUI application.
"""
license = "MIT"
@@ -24,37 +24,33 @@ include = [
[features]
default = ["crossterm"]
# Features to use tui-rs
crossterm = ["dep:crossterm", "tui/crossterm"]
termion = ["dep:termion", "tui/termion"]
your-backend = ["tui"]
# Features to use ratatui
ratatui-crossterm = ["dep:crossterm-027", "ratatui/crossterm"]
ratatui-termion = ["dep:termion", "ratatui/termion"]
ratatui-termwiz = ["dep:termwiz", "ratatui/termwiz"]
ratatui-your-backend = ["ratatui"]
crossterm = ["dep:crossterm", "ratatui/crossterm"]
termion = ["dep:termion", "ratatui/termion"]
termwiz = ["dep:termwiz", "ratatui/termwiz"]
your-backend = ["ratatui"]
# Features to use tui-rs
tuirs-crossterm = ["dep:crossterm-025", "tui/crossterm"]
tuirs-termion = ["dep:termion", "tui/termion"]
tuirs-your-backend = ["tui"]
# Other optional features
search = ["dep:regex"]
[dependencies]
crossterm = { package = "crossterm", version = "0.25", optional = true }
arbitrary = { version = "1", features = ["derive"], optional = true }
crossterm = { package = "crossterm", version = "0.27", optional = true }
crossterm-025 = { package = "crossterm", version = "0.25", optional = true }
ratatui = { version = "0.23.0", default-features = false, optional = true }
regex = { version = "1", optional = true }
termion = { version = "2.0", optional = true }
tui = { version = "0.19", default-features = false, optional = true }
arbitrary = { version = "1", features = ["derive"], optional = true }
crossterm-027 = { package = "crossterm", version = "0.27", optional = true }
ratatui = { version = "0.23.0", default-features = false, optional = true }
unicode-width = "0.1.11"
termwiz = { version = "0.20.0", optional = true }
tui = { version = "0.19", default-features = false, optional = true }
unicode-width = "0.1.11"
[[example]]
name = "minimal"
required-features = ["crossterm"]
[[example]]
name = "termion"
required-features = ["termion"]
[[example]]
name = "editor"
required-features = ["crossterm", "search"]
@@ -67,10 +63,6 @@ required-features = ["crossterm"]
name = "single_line"
required-features = ["crossterm"]
[[example]]
name = "password"
required-features = ["crossterm"]
[[example]]
name = "variable"
required-features = ["crossterm"]
@@ -79,29 +71,37 @@ required-features = ["crossterm"]
name = "modal"
required-features = ["crossterm"]
[[example]]
name = "password"
required-features = ["crossterm"]
[[example]]
name = "popup_placeholder"
required-features = ["crossterm"]
[[example]]
name = "ratatui_minimal"
required-features = ["ratatui-crossterm"]
[[example]]
name = "ratatui_popup_placeholder"
required-features = ["ratatui-crossterm"]
[[example]]
name = "ratatui_editor"
required-features = ["ratatui-crossterm", "search"]
[[example]]
name = "ratatui_termion"
required-features = ["ratatui-termion"]
[[example]]
name = "termwiz"
required-features = ["ratatui-termwiz"]
required-features = ["termwiz"]
[[example]]
name = "termion"
required-features = ["termion"]
[[example]]
name = "tuirs_minimal"
required-features = ["tuirs-crossterm"]
[[example]]
name = "tuirs_editor"
required-features = ["tuirs-crossterm", "search"]
[[example]]
name = "tuirs_popup_placeholder"
required-features = ["tuirs-crossterm"]
[[example]]
name = "tuirs_termion"
required-features = ["tuirs-termion"]
[workspace]
members = [

119
README.md
Просмотреть файл

@@ -4,7 +4,7 @@ tui-textarea
[![docs][doc-badge]][doc]
[![CI][ci-badge]][ci]
[tui-textarea][crate] is a simple yet powerful text editor widget like `<textarea>` in HTML for [tui-rs][] and [ratatui][].
[tui-textarea][crate] is a simple yet powerful text editor widget like `<textarea>` in HTML for [ratatui][] and [tui-rs][].
Multi-line text editor can be easily put as part of your TUI application.
**Features:**
@@ -19,7 +19,7 @@ Multi-line text editor can be easily put as part of your TUI application.
- Yank support. Paste text deleted with `C-k`, `C-j`, ...
- Backend agnostic. [crossterm][], [termion][], [termwiz][], and your own backend are all supported
- Multiple textarea widgets in the same screen
- Support both [tui-rs][] (the original) and [ratatui][] (the fork by community)
- Support both [ratatui][] (the fork by community) and [tui-rs][] (the original)
[Documentation][doc]
@@ -67,14 +67,6 @@ Two split textareas in a screen and switch them. An example for multiple textare
<img src="https://raw.githubusercontent.com/rhysd/ss/master/tui-textarea/split.gif" width=539 height=124 alt="multiple textareas example">
### [`termion`](./examples/termion.rs)
```sh
cargo run --example termion --features=termion
```
Minimal usage with [termion][] support.
### [`variable`](./examples/variable.rs)
```sh
@@ -111,40 +103,48 @@ Password input form with masking text with ●.
<img src="https://raw.githubusercontent.com/rhysd/ss/master/tui-textarea/password.gif" width=589 height=92 alt="password example">
### Examples for [ratatui][] support
All above examples use [tui-rs][], but some examples provide [ratatui][] version. Try `ratatui_` prefix. In these cases,
you need to specify features to use ratatui and `--no-default-features` flag explicitly.
### [`termion`](./examples/termion.rs)
```sh
# ratatui version of `minimal` example
cargo run --example ratatui_minimal --no-default-features --features=ratatui-crossterm
# ratatui version of `editor` example
cargo run --example ratatui_editor --no-default-features --features=ratatui-crossterm,search file.txt
# ratatui version of `termion` example
cargo run --example ratatui_termion --no-default-features --features=ratatui-termion
# ratatui version of `popup_placeholder` example
cargo run --example ratatui_popup_placeholder --no-default-features --features=ratatui-crossterm
cargo run --example termion --no-default-features --features=termion
```
Minimal usage with [termion][] support.
### [`termwiz`](./examples/termwiz.rs)
```sh
cargo run --example termwiz --no-default-features --features=ratatui-termwiz
cargo run --example termwiz --no-default-features --features=termwiz
```
Minimal usage with [termwiz][] support.
### Examples for [tui-rs][] support
All above examples use [ratatui][], but some examples provide tui-rs version. Try `tuirs_` prefix. In these cases, you
need to specify features to use tui-rs and `--no-default-features` flag explicitly.
```sh
# tui-rs version of `minimal` example
cargo run --example tuirs_minimal --no-default-features --features=tuirs-crossterm
# tui-rs version of `editor` example
cargo run --example tuirs_editor --no-default-features --features=tuirs-crossterm,search file.txt
# tui-rs version of `termion` example
cargo run --example tuirs_termion --no-default-features --features=tuirs-termion
# tui-rs version of `popup_placeholder` example
cargo run --example tuirs_popup_placeholder --no-default-features --features=tuirs-crossterm
```
## Installation
Add `tui-textarea` crate to dependencies in your `Cargo.toml`. This enables crossterm backend support by default.
```toml
[dependencies]
tui = "*"
ratatui = "*"
tui-textarea = "*"
```
@@ -153,40 +153,46 @@ dependency.
```toml
[dependencies]
tui = "*"
ratatui = "*"
tui-textarea = { version = "*", features = ["search"] }
```
If you're using tui-rs with [termion][], enable `termion` feature instead of `crossterm` feature.
If you're using ratatui with [termion][] or [termwiz][], enable respective feature instead of `crossterm` feature.
```toml
[dependencies]
tui = { version = "*", default-features = false, features = ["termion"] }
# For termion
ratatui = { version = "*", default-features = false, features = ["termion"] }
tui-textarea = { version = "*", default-features = false, features = ["termion"] }
# For termwiz
ratatui = { version = "*", default-features = false, features = ["termwiz"] }
tui-textarea = { version = "*", default-features = false, features = ["termwiz"] }
```
If you're using [ratatui][] instead of [tui-rs][], you need to enable features for using ratatui crate. The following table
shows feature names corresponding to the dependencies.
If you're using [tui-rs][] instead of [ratatui][], you need to enable features for using tui-rs crate and to disable
default features. The following table shows feature names corresponding to the dependencies.
| | crossterm | termion | termwiz | Your own backend |
|---------|----------------------------------|-------------------|-------------------|------------------------|
| tui-rs | `crossterm` (enabled by default) | `termion` | N/A | `your-backend` |
| ratatui | `ratatui-crossterm` | `ratatui-termion` | `ratatui-termwiz` | `ratatui-your-backend` |
| | crossterm | termion | termwiz | Your own backend |
|---------|----------------------------------|-----------------|-----------|----------------------|
| ratatui | `crossterm` (enabled by default) | `termion` | `termwiz` | `your-backend` |
| tui-rs | `tuirs-crossterm` | `tuirs-termion` | N/A | `tuirs-your-backend` |
For example, when you want to use the combination of [ratatui][] and [crossterm][],
For example, when you want to use the combination of [tui-rs][] and [crossterm][],
```toml
[dependencies]
ratatui = "*"
tui-textarea = { version = "*", features = ["ratatui-crossterm"], default-features = false }
tui = "*"
tui-textarea = { version = "*", features = ["tuirs-crossterm"], default-features = false }
```
Note that [tui-rs][] support and [ratatui][] support are exclusive. When you use [ratatui][] support, you must disable
[tui-rs][] support by `default-features = false`.
Note that [ratatui][] support and [tui-rs][] support are exclusive. When you use [tui-rs][] support, you must disable
[ratatui][] support by `default-features = false`.
In addition to above dependencies, you also need to install [crossterm][] or [termion][] or [termwiz][] to initialize
your application and to receive key inputs. Note that version of [crossterm][] crate is different between [tui-rs][]
and [ratatui][]. Please select the correct version.
your application and to receive key inputs. Note that version of [crossterm][] crate is different between [ratatui][]
and [tui-rs][]. Please select the correct version.
## Minimal Usage
@@ -194,7 +200,7 @@ and [ratatui][]. Please select the correct version.
use tui_textarea::TextArea;
use crossterm::event::{Event, read};
let mut term = tui::Terminal::new(...);
let mut term = ratatui::Terminal::new(...);
// Create an empty `TextArea` instance which manages the editor state
let mut textarea = TextArea::default();
@@ -202,7 +208,7 @@ let mut textarea = TextArea::default();
// Event loop
loop {
term.draw(|f| {
// Get `tui::layout::Rect` where the editor should be rendered
// Get `ratatui::layout::Rect` where the editor should be rendered
let rect = ...;
// `TextArea::widget` builds a widget to render the editor with tui
let widget = textarea.widget();
@@ -338,7 +344,7 @@ By default, `TextArea` does now show line numbers. To enable, set a style for re
color.
```rust,ignore
use tui::style::{Style, Color};
use ratatui::style::{Style, Color};
let style = Style::default().bg(Color::DarkGray);
textarea.set_line_number_style(style);
@@ -351,7 +357,7 @@ is. To change the style of cursor line, use `TextArea::set_cursor_line_style()`.
cursor line with bold text.
```rust,ignore
use tui::style::{Style, Modifier};
use ratatui::style::{Style, Modifier};
let style = Style::default().add_modifier(Modifier::BOLD);
textarea.set_line_number_style(style);
@@ -360,7 +366,7 @@ textarea.set_line_number_style(style);
To disable cursor line style, set the default style as follows:
```rust,ignore
use tui::style::{Style, Modifier};
use ratatui::style::{Style, Modifier};
textarea.set_line_number_style(Style::default());
```
@@ -559,17 +565,16 @@ match read()?.into() {
### Use your own backend
tui-rs allows to make your own backend by implementing [`tui::backend::Backend`][tui-backend] trait. tui-textarea also
supports it. In this case, please use `your-backend` feature for [tui-rs][] or `ratatui-your-backend` feature for
[ratatui][]. They avoid adding backend crates (crossterm, termion, and termwiz) since you're using your own backend.
ratatui and tui-rs allows to make your own backend by implementing [`ratatui::backend::Backend`][ratatui-backend] trait.
tui-textarea supports it as well. Please use `your-backend` feature for [ratatui][] or `tuirs-your-backend` feature for
[tui-rs][]. They avoid adding backend crates (crossterm, termion, or termwiz) since you're using your own backend.
```toml
[dependencies]
tui = { version = "*", default-features = false }
# For tui-rs
tui-textarea = { version = "*", default-features = false, features = ["your-backend"] }
# For ratatui
tui-textarea = { version = "*", default-features = false, features = ["ratatui-your-backend"] }
tui-textarea = { version = "*", default-features = false, features = ["your-backend"] }
# For tui-rs
tui-textarea = { version = "*", default-features = false, features = ["tuirs-your-backend"] }
```
`tui_textarea::Input` is a type for backend-agnostic key input. What you need to do is converting key event in your own
@@ -691,7 +696,7 @@ This project is developed [on GitHub][repo].
For feature requests or bug reports, please [create an issue][new-issue]. For submitting patches, please [create a pull
request][pulls].
Please see [CONTRIBUTING.md](./CONTRIBUTING.md) before reporting an issue or making a PR.
Please read [CONTRIBUTING.md](./CONTRIBUTING.md) before reporting an issue or making a PR.
## License
@@ -708,7 +713,7 @@ tui-textarea is distributed under [The MIT License](./LICENSE.txt).
[crossterm]: https://docs.rs/crossterm/latest/crossterm/
[termion]: https://docs.rs/termion/latest/termion/
[termwiz]: https://docs.rs/termwiz/latest/termwiz/
[tui-backend]: https://docs.rs/tui/latest/tui/backend/trait.Backend.html
[ratatui-backend]: https://docs.rs/ratatui/latest/ratatui/backend/trait.Backend.html
[repo]: https://github.com/rhysd/tui-textarea
[new-issue]: https://github.com/rhysd/tui-textarea/issues/new
[pulls]: https://github.com/rhysd/tui-textarea/pulls

Просмотреть файл

@@ -9,8 +9,8 @@ license = "MIT"
bench = false
[dependencies]
tui-textarea = { path = "..", features = ["search"] }
tui = { version = "0.19", default-features = false }
tui-textarea = { path = "..", features = ["your-backend", "search"] }
ratatui = { version = "0.23.0", default-features = false }
[dev-dependencies]
criterion = "0.5"

Просмотреть файл

@@ -1,11 +1,11 @@
// We use empty backend for our benchmark instead of tui::backend::TestBackend to make impact of benchmark from tui-rs
// as small as possible.
use ratatui::backend::Backend;
use ratatui::buffer::Cell;
use ratatui::layout::Rect;
use ratatui::Terminal;
use std::io;
use tui::backend::Backend;
use tui::buffer::Cell;
use tui::layout::Rect;
use tui::Terminal;
use tui_textarea::TextArea;
pub const LOREM: &[&str] = &[

Просмотреть файл

@@ -3,6 +3,12 @@ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, is_raw_mode_enabled, EnterAlternateScreen,
LeaveAlternateScreen,
};
use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::style::{Color, Modifier, Style};
use ratatui::text::{Line, Span};
use ratatui::widgets::{Block, Borders, Paragraph};
use ratatui::Terminal;
use std::borrow::Cow;
use std::env;
use std::fmt::Display;
@@ -10,12 +16,6 @@ use std::fs;
use std::io;
use std::io::{BufRead, Write};
use std::path::PathBuf;
use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Direction, Layout};
use tui::style::{Color, Modifier, Style};
use tui::text::{Span, Spans};
use tui::widgets::{Block, Borders, Paragraph};
use tui::Terminal;
use tui_textarea::{CursorMove, Input, Key, TextArea};
macro_rules! error {
@@ -223,9 +223,9 @@ impl<'a> Editor<'a> {
// Render message at bottom
let message = if let Some(message) = self.message.take() {
Spans::from(Span::raw(message))
Line::from(Span::raw(message))
} else if search_height > 0 {
Spans::from(vec![
Line::from(vec![
Span::raw("Press "),
Span::styled("Enter", Style::default().add_modifier(Modifier::BOLD)),
Span::raw(" to jump to first match and close, "),
@@ -243,7 +243,7 @@ impl<'a> Editor<'a> {
Span::raw(" to search previous"),
])
} else {
Spans::from(vec![
Line::from(vec![
Span::raw("Press "),
Span::styled("^Q", Style::default().add_modifier(Modifier::BOLD)),
Span::raw(" to quit, "),

Просмотреть файл

@@ -2,10 +2,10 @@ use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use ratatui::backend::CrosstermBackend;
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io;
use tui::backend::CrosstermBackend;
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea};
fn main() -> io::Result<()> {

Просмотреть файл

@@ -2,15 +2,15 @@ use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use ratatui::backend::CrosstermBackend;
use ratatui::style::{Color, Modifier, Style};
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::env;
use std::fmt;
use std::fs;
use std::io;
use std::io::BufRead;
use tui::backend::CrosstermBackend;
use tui::style::{Color, Modifier, Style};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{CursorMove, Input, Key, Scrolling, TextArea};
enum Mode {

Просмотреть файл

@@ -2,12 +2,12 @@ use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Layout};
use ratatui::style::{Color, Style};
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io;
use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Layout};
use tui::style::{Color, Style};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea};
fn main() -> io::Result<()> {

Просмотреть файл

@@ -2,12 +2,12 @@ use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use ratatui::backend::CrosstermBackend;
use ratatui::layout::Rect;
use ratatui::style::{Color, Style};
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io;
use tui::backend::CrosstermBackend;
use tui::layout::Rect;
use tui::style::{Color, Style};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea};
fn main() -> io::Result<()> {
@@ -34,9 +34,6 @@ fn main() -> io::Result<()> {
y: 5,
};
textarea.set_style(Style::default().fg(Color::Yellow));
// set placeholder
textarea.set_placeholder_style(Style::default());
textarea.set_placeholder_text("prompt message");
loop {

Просмотреть файл

@@ -2,12 +2,12 @@ use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Layout};
use ratatui::style::{Color, Style};
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io;
use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Layout};
use tui::style::{Color, Style};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea};
fn validate(textarea: &mut TextArea) -> bool {

Просмотреть файл

@@ -2,12 +2,12 @@ use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::style::{Color, Modifier, Style};
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io;
use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Direction, Layout};
use tui::style::{Color, Modifier, Style};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea};
fn inactivate(textarea: &mut TextArea<'_>) {
@@ -54,9 +54,9 @@ fn main() -> io::Result<()> {
loop {
term.draw(|f| {
let chunks = layout.split(f.size());
for (textarea, chunk) in textarea.iter().zip(chunks) {
for (textarea, chunk) in textarea.iter().zip(chunks.iter()) {
let widget = textarea.widget();
f.render_widget(widget, chunk);
f.render_widget(widget, *chunk);
}
})?;
match crossterm::event::read()?.into() {

Просмотреть файл

@@ -1,3 +1,6 @@
use ratatui::backend::TermionBackend;
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::error::Error;
use std::io;
use std::sync::mpsc;
@@ -7,9 +10,6 @@ use termion::event::Event as TermEvent;
use termion::input::{MouseTerminal, TermRead};
use termion::raw::IntoRawMode;
use termion::screen::IntoAlternateScreen;
use tui::backend::TermionBackend;
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea};
enum Event {

Просмотреть файл

@@ -1,16 +1,10 @@
use crossterm_027 as crossterm;
use crossterm_025 as crossterm;
use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, is_raw_mode_enabled, EnterAlternateScreen,
LeaveAlternateScreen,
};
use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::style::{Color, Modifier, Style};
use ratatui::text::{Line, Span};
use ratatui::widgets::{Block, Borders, Paragraph};
use ratatui::Terminal;
use std::borrow::Cow;
use std::env;
use std::fmt::Display;
@@ -18,6 +12,12 @@ use std::fs;
use std::io;
use std::io::{BufRead, Write};
use std::path::PathBuf;
use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Direction, Layout};
use tui::style::{Color, Modifier, Style};
use tui::text::{Span, Spans};
use tui::widgets::{Block, Borders, Paragraph};
use tui::Terminal;
use tui_textarea::{CursorMove, Input, Key, TextArea};
macro_rules! error {
@@ -225,9 +225,9 @@ impl<'a> Editor<'a> {
// Render message at bottom
let message = if let Some(message) = self.message.take() {
Line::from(Span::raw(message))
Spans::from(Span::raw(message))
} else if search_height > 0 {
Line::from(vec![
Spans::from(vec![
Span::raw("Press "),
Span::styled("Enter", Style::default().add_modifier(Modifier::BOLD)),
Span::raw(" to jump to first match and close, "),
@@ -245,7 +245,7 @@ impl<'a> Editor<'a> {
Span::raw(" to search previous"),
])
} else {
Line::from(vec![
Spans::from(vec![
Span::raw("Press "),
Span::styled("^Q", Style::default().add_modifier(Modifier::BOLD)),
Span::raw(" to quit, "),

Просмотреть файл

@@ -1,13 +1,13 @@
use crossterm_027 as crossterm;
use crossterm_025 as crossterm;
use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use ratatui::backend::CrosstermBackend;
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io;
use tui::backend::CrosstermBackend;
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea};
fn main() -> io::Result<()> {

Просмотреть файл

@@ -1,14 +1,15 @@
use crossterm_025 as crossterm;
use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use crossterm_027 as crossterm;
use ratatui::backend::CrosstermBackend;
use ratatui::layout::Rect;
use ratatui::style::{Color, Style};
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io;
use tui::backend::CrosstermBackend;
use tui::layout::Rect;
use tui::style::{Color, Style};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea};
fn main() -> io::Result<()> {
@@ -35,6 +36,9 @@ fn main() -> io::Result<()> {
y: 5,
};
textarea.set_style(Style::default().fg(Color::Yellow));
// set placeholder
textarea.set_placeholder_style(Style::default());
textarea.set_placeholder_text("prompt message");
loop {

Просмотреть файл

@@ -1,6 +1,3 @@
use ratatui::backend::TermionBackend;
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::error::Error;
use std::io;
use std::sync::mpsc;
@@ -10,6 +7,9 @@ use termion::event::Event as TermEvent;
use termion::input::{MouseTerminal, TermRead};
use termion::raw::IntoRawMode;
use termion::screen::IntoAlternateScreen;
use tui::backend::TermionBackend;
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea};
enum Event {

Просмотреть файл

@@ -2,12 +2,12 @@ use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
};
use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::cmp;
use std::io;
use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Direction, Layout};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea};
fn main() -> io::Result<()> {

141
fuzz/Cargo.lock сгенерированный
Просмотреть файл

@@ -32,6 +32,12 @@ version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
[[package]]
name = "cassowary"
version = "0.3.0"
@@ -52,11 +58,11 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "crossterm"
version = "0.23.2"
version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2102ea4f781910f8a5b98dd061f4c2023f479ce7bb1236330099ceb5a93cf17"
checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df"
dependencies = [
"bitflags",
"bitflags 2.4.1",
"crossterm_winapi",
"libc",
"mio",
@@ -68,9 +74,9 @@ dependencies = [
[[package]]
name = "crossterm_winapi"
version = "0.9.0"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ae1b35a484aa10e07fe0638d02301c5ad24de82d310ccbd2f3693da5f09bf1c"
checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
dependencies = [
"winapi",
]
@@ -83,7 +89,34 @@ checksum = "8728db27dd9033a7456655aaeb35fde74425d0f130b4cb18a19171ef38a1b454"
dependencies = [
"proc-macro2",
"quote",
"syn",
"syn 1.0.96",
]
[[package]]
name = "either"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
[[package]]
name = "heck"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]]
name = "indoc"
version = "2.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
[[package]]
name = "itertools"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
dependencies = [
"either",
]
[[package]]
@@ -170,30 +203,53 @@ dependencies = [
]
[[package]]
name = "proc-macro2"
version = "1.0.39"
name = "paste"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f"
checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
[[package]]
name = "proc-macro2"
version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.18"
version = "1.0.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1"
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
dependencies = [
"proc-macro2",
]
[[package]]
name = "ratatui"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e2e4cd95294a85c3b4446e63ef054eea43e0205b1fd60120c16b74ff7ff96ad"
dependencies = [
"bitflags 2.4.1",
"cassowary",
"crossterm",
"indoc",
"itertools",
"paste",
"strum",
"unicode-segmentation",
"unicode-width",
]
[[package]]
name = "redox_syscall"
version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42"
dependencies = [
"bitflags",
"bitflags 1.3.2",
]
[[package]]
@@ -213,6 +269,12 @@ version = "0.6.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
[[package]]
name = "rustversion"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
[[package]]
name = "scopeguard"
version = "1.1.0"
@@ -221,9 +283,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "signal-hook"
version = "0.3.14"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d"
checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
dependencies = [
"libc",
"signal-hook-registry",
@@ -255,6 +317,28 @@ version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1"
[[package]]
name = "strum"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125"
dependencies = [
"strum_macros",
]
[[package]]
name = "strum_macros"
version = "0.25.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0"
dependencies = [
"heck",
"proc-macro2",
"quote",
"rustversion",
"syn 2.0.38",
]
[[package]]
name = "syn"
version = "1.0.96"
@@ -267,33 +351,32 @@ dependencies = [
]
[[package]]
name = "tui"
version = "0.18.0"
name = "syn"
version = "2.0.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96fe69244ec2af261bced1d9046a6fee6c8c2a6b0228e59e5ba39bc8ba4ed729"
checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
dependencies = [
"bitflags",
"cassowary",
"crossterm",
"unicode-segmentation",
"unicode-width",
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "tui-textarea"
version = "0.1.4"
version = "0.2.4"
dependencies = [
"arbitrary",
"crossterm",
"ratatui",
"regex",
"tui",
"unicode-width",
]
[[package]]
name = "tui-textarea-bench"
version = "0.0.0"
dependencies = [
"tui",
"ratatui",
"tui-textarea",
]
@@ -315,15 +398,15 @@ checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c"
[[package]]
name = "unicode-segmentation"
version = "1.9.0"
version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99"
checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
[[package]]
name = "unicode-width"
version = "0.1.9"
version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
[[package]]
name = "wasi"

Просмотреть файл

@@ -199,9 +199,9 @@ pub enum CursorMove {
///
/// This is useful when you moved a cursor but you don't want to move the viewport.
/// ```
/// # use tui::buffer::Buffer;
/// # use tui::layout::Rect;
/// # use tui::widgets::Widget;
/// # use ratatui::buffer::Buffer;
/// # use ratatui::layout::Rect;
/// # use ratatui::widgets::Widget;
/// use tui_textarea::{TextArea, CursorMove};
///
/// // Let's say terminal height is 8.
@@ -324,12 +324,12 @@ impl CursorMove {
#[cfg(test)]
mod tests {
// Seaparate tests for ratatui support
// Seaparate tests for tui-rs support
#[test]
fn in_viewport() {
use crate::tui::buffer::Buffer;
use crate::tui::layout::Rect;
use crate::tui::widgets::Widget;
use crate::ratatui::buffer::Buffer;
use crate::ratatui::layout::Rect;
use crate::ratatui::widgets::Widget;
use crate::{CursorMove, TextArea};
let mut textarea: TextArea = (0..20).map(|i| i.to_string()).collect();

Просмотреть файл

@@ -1,19 +1,18 @@
use crate::tui::style::Style;
use crate::ratatui::style::Style;
#[cfg(any(
feature = "ratatui-crossterm",
feature = "ratatui-termion",
feature = "ratatui-termwiz",
feature = "ratatui-your-backend",
feature = "crossterm",
feature = "termion",
feature = "termwiz",
feature = "your-backend",
))]
use crate::tui::text::Line as Spans;
use crate::tui::text::Span;
#[cfg(not(any(
feature = "ratatui-crossterm",
feature = "ratatui-termion",
feature = "ratatui-termwiz",
feature = "ratatui-your-backend",
)))]
use crate::tui::text::Spans;
use crate::ratatui::text::Line;
use crate::ratatui::text::Span;
#[cfg(any(
feature = "tuirs-crossterm",
feature = "tuirs-termion",
feature = "tuirs-your-backend",
))]
use crate::ratatui::text::Spans as Line;
use crate::util::{num_digits, spaces};
use std::borrow::Cow;
use std::cmp::Ordering;
@@ -138,7 +137,7 @@ impl<'a> LineHighlighter<'a> {
}
}
pub fn into_spans(self) -> Spans<'a> {
pub fn into_spans(self) -> Line<'a> {
let Self {
line,
mut spans,
@@ -158,7 +157,7 @@ impl<'a> LineHighlighter<'a> {
if cursor_at_end {
spans.push(Span::styled(" ", cursor_style));
}
return Spans::from(spans);
return Line::from(spans);
}
boundaries.sort_unstable_by(|(l, i), (r, j)| match i.cmp(j) {
@@ -197,7 +196,7 @@ impl<'a> LineHighlighter<'a> {
if cursor_at_end {
spans.push(Span::styled(" ", cursor_style));
}
return Spans::from(spans);
return Line::from(spans);
}
}
}

Просмотреть файл

@@ -1,13 +1,13 @@
#[cfg(any(feature = "crossterm", feature = "ratatui-crossterm"))]
#[cfg(any(feature = "crossterm", feature = "tuirs-crossterm"))]
use crate::crossterm::event::{
Event as CrosstermEvent, KeyCode, KeyEvent, KeyEventKind, KeyModifiers, MouseEvent,
MouseEventKind as CrosstermMouseEventKind,
};
#[cfg(feature = "arbitrary")]
use arbitrary::Arbitrary;
#[cfg(any(feature = "termion", feature = "ratatui-termion"))]
#[cfg(any(feature = "termion", feature = "tuirs-termion"))]
use termion::event::{Event as TermionEvent, Key as TermionKey, MouseEvent as TermionMouseEvent};
#[cfg(feature = "ratatui-termwiz")]
#[cfg(feature = "termwiz")]
use termwiz::input::{
InputEvent as TermwizInputEvent, KeyEvent as TermwizKeyEvent,
MouseButtons as TermwizMouseButtons, MouseEvent as TermwizMouseEvent, PixelMouseEvent,
@@ -47,7 +47,7 @@ pub enum Key {
/// Backend-agnostic key input type.
///
/// When `crossterm`, `termion`, `ratatui-termwiz` features are enabled, converting respective key input types into this
/// When `crossterm`, `termion`, `termwiz` features are enabled, converting respective key input types into this
/// `Input` type is defined.
/// ```no_run
/// use tui_textarea::{TextArea, Input, Key};
@@ -101,7 +101,7 @@ impl Default for Input {
}
}
#[cfg(any(feature = "crossterm", feature = "ratatui-crossterm"))]
#[cfg(any(feature = "crossterm", feature = "tuirs-crossterm"))]
impl From<CrosstermEvent> for Input {
/// Convert [`crossterm::event::Event`] to [`Input`].
fn from(event: CrosstermEvent) -> Self {
@@ -113,7 +113,7 @@ impl From<CrosstermEvent> for Input {
}
}
#[cfg(any(feature = "crossterm", feature = "ratatui-crossterm"))]
#[cfg(any(feature = "crossterm", feature = "tuirs-crossterm"))]
impl From<KeyEvent> for Input {
/// Convert [`crossterm::event::KeyEvent`] to [`Input`].
fn from(key: KeyEvent) -> Self {
@@ -141,7 +141,7 @@ impl From<KeyEvent> for Input {
}
}
#[cfg(any(feature = "crossterm", feature = "ratatui-crossterm"))]
#[cfg(any(feature = "crossterm", feature = "tuirs-crossterm"))]
impl From<MouseEvent> for Input {
/// Convert [`crossterm::event::MouseEvent`] to [`Input`].
fn from(mouse: MouseEvent) -> Self {
@@ -156,7 +156,7 @@ impl From<MouseEvent> for Input {
}
}
#[cfg(any(feature = "termion", feature = "ratatui-termion"))]
#[cfg(any(feature = "termion", feature = "tuirs-termion"))]
impl From<TermionEvent> for Input {
/// Convert [`termion::event::Event`] to [`Input`].
fn from(event: TermionEvent) -> Self {
@@ -168,7 +168,7 @@ impl From<TermionEvent> for Input {
}
}
#[cfg(any(feature = "termion", feature = "ratatui-termion"))]
#[cfg(any(feature = "termion", feature = "tuirs-termion"))]
impl From<TermionKey> for Input {
/// Convert [`termion::event::Key`] to [`Input`].
fn from(key: TermionKey) -> Self {
@@ -207,7 +207,7 @@ impl From<TermionKey> for Input {
}
}
#[cfg(any(feature = "termion", feature = "ratatui-termion"))]
#[cfg(any(feature = "termion", feature = "tuirs-termion"))]
impl From<TermionMouseEvent> for Input {
/// Convert [`termion::event::MouseEvent`] to [`Input`].
fn from(mouse: TermionMouseEvent) -> Self {
@@ -225,7 +225,7 @@ impl From<TermionMouseEvent> for Input {
}
}
#[cfg(feature = "ratatui-termwiz")]
#[cfg(feature = "termwiz")]
impl From<TermwizInputEvent> for Input {
/// Convert [`termwiz::input::InputEvent`] to [`Input`].
fn from(input: TermwizInputEvent) -> Self {
@@ -238,7 +238,7 @@ impl From<TermwizInputEvent> for Input {
}
}
#[cfg(feature = "ratatui-termwiz")]
#[cfg(feature = "termwiz")]
impl From<TermwizKeyEvent> for Input {
/// Convert [`termwiz::input::KeyEvent`] to [`Input`].
fn from(key: TermwizKeyEvent) -> Self {
@@ -270,7 +270,7 @@ impl From<TermwizKeyEvent> for Input {
}
}
#[cfg(feature = "ratatui-termwiz")]
#[cfg(feature = "termwiz")]
impl From<TermwizMouseButtons> for Key {
/// Convert [`termwiz::input::MouseButtons`] to [`Key`].
fn from(buttons: TermwizMouseButtons) -> Self {
@@ -286,7 +286,7 @@ impl From<TermwizMouseButtons> for Key {
}
}
#[cfg(feature = "ratatui-termwiz")]
#[cfg(feature = "termwiz")]
impl From<TermwizMouseEvent> for Input {
/// Convert [`termwiz::input::MouseEvent`] to [`Input`].
fn from(mouse: TermwizMouseEvent) -> Self {
@@ -305,7 +305,7 @@ impl From<TermwizMouseEvent> for Input {
}
}
#[cfg(feature = "ratatui-termwiz")]
#[cfg(feature = "termwiz")]
impl From<PixelMouseEvent> for Input {
/// Convert [`termwiz::input::PixelMouseEvent`] to [`Input`].
fn from(mouse: PixelMouseEvent) -> Self {

Просмотреть файл

@@ -5,15 +5,19 @@
#![doc = include_str!("../README.md")]
#[cfg(all(
any(feature = "crossterm", feature = "termion", feature = "your-backend"),
any(
feature = "ratatui-crossterm",
feature = "ratatui-termion",
feature = "ratatui-termwiz",
feature = "ratatui-your-backend"
feature = "crossterm",
feature = "termion",
feature = "termwiz",
feature = "your-backend"
),
any(
feature = "tuirs-crossterm",
feature = "tuirs-termion",
feature = "tuirs-your-backend"
),
))]
compile_error!("tui-rs support and ratatui support are exclussive. only one of them can be enabled at the same time. see https://github.com/rhysd/tui-textarea#installation");
compile_error!("ratatui support and tui-rs support are exclussive. only one of them can be enabled at the same time. see https://github.com/rhysd/tui-textarea#installation");
mod cursor;
mod highlight;
@@ -28,26 +32,25 @@ mod widget;
mod word;
#[cfg(any(
feature = "ratatui-crossterm",
feature = "ratatui-termion",
feature = "ratatui-termwiz",
feature = "ratatui-your-backend",
feature = "crossterm",
feature = "termion",
feature = "termwiz",
feature = "your-backend",
))]
use ratatui as tui;
#[cfg(not(any(
feature = "ratatui-crossterm",
feature = "ratatui-termion",
feature = "ratatui-termwiz",
feature = "ratatui-your-backend",
)))]
#[allow(clippy::single_component_path_imports)]
use tui;
use ratatui;
#[cfg(any(
feature = "tuirs-crossterm",
feature = "tuirs-termion",
feature = "tuirs-your-backend",
))]
use tui as ratatui;
#[cfg(feature = "crossterm")]
#[allow(clippy::single_component_path_imports)]
use crossterm;
#[cfg(feature = "ratatui-crossterm")]
use crossterm_027 as crossterm;
#[cfg(feature = "tuirs-crossterm")]
use crossterm_025 as crossterm;
pub use cursor::CursorMove;
pub use input::{Input, Key};

Просмотреть файл

@@ -13,9 +13,9 @@ pub enum Scrolling {
/// `Scrolling::Delta` where 1st element means rows and 2nd means columns.
///
/// ```
/// # use tui::buffer::Buffer;
/// # use tui::layout::Rect;
/// # use tui::widgets::Widget;
/// # use ratatui::buffer::Buffer;
/// # use ratatui::layout::Rect;
/// # use ratatui::widgets::Widget;
/// use tui_textarea::{TextArea, Scrolling};
///
/// // Let's say terminal height is 8.
@@ -39,9 +39,9 @@ pub enum Scrolling {
/// Scroll down the textarea by one page.
///
/// ```
/// # use tui::buffer::Buffer;
/// # use tui::layout::Rect;
/// # use tui::widgets::Widget;
/// # use ratatui::buffer::Buffer;
/// # use ratatui::layout::Rect;
/// # use ratatui::widgets::Widget;
/// use tui_textarea::{TextArea, Scrolling};
///
/// // Let's say terminal height is 8.
@@ -65,9 +65,9 @@ pub enum Scrolling {
/// Scroll up the textarea by one page.
///
/// ```
/// # use tui::buffer::Buffer;
/// # use tui::layout::Rect;
/// # use tui::widgets::Widget;
/// # use ratatui::buffer::Buffer;
/// # use ratatui::layout::Rect;
/// # use ratatui::widgets::Widget;
/// use tui_textarea::{TextArea, Scrolling, CursorMove};
///
/// // Let's say terminal height is 8.
@@ -95,9 +95,9 @@ pub enum Scrolling {
/// Scroll down the textarea by half of the page.
///
/// ```
/// # use tui::buffer::Buffer;
/// # use tui::layout::Rect;
/// # use tui::widgets::Widget;
/// # use ratatui::buffer::Buffer;
/// # use ratatui::layout::Rect;
/// # use ratatui::widgets::Widget;
/// use tui_textarea::{TextArea, Scrolling};
///
/// // Let's say terminal height is 8.
@@ -121,9 +121,9 @@ pub enum Scrolling {
/// Scroll up the textarea by half of the page.
///
/// ```
/// # use tui::buffer::Buffer;
/// # use tui::layout::Rect;
/// # use tui::widgets::Widget;
/// # use ratatui::buffer::Buffer;
/// # use ratatui::layout::Rect;
/// # use ratatui::widgets::Widget;
/// use tui_textarea::{TextArea, Scrolling, CursorMove};
///
/// // Let's say terminal height is 8.
@@ -185,12 +185,12 @@ impl From<(i16, i16)> for Scrolling {
mod tests {
use super::*;
// Seaparate tests for ratatui support
// Seaparate tests for tui-rs support
#[test]
fn delta() {
use crate::tui::buffer::Buffer;
use crate::tui::layout::Rect;
use crate::tui::widgets::Widget;
use crate::ratatui::buffer::Buffer;
use crate::ratatui::layout::Rect;
use crate::ratatui::widgets::Widget;
use crate::TextArea;
let mut textarea: TextArea = (0..20).map(|i| i.to_string()).collect();

Просмотреть файл

@@ -1,4 +1,4 @@
use crate::tui::style::{Color, Style};
use crate::ratatui::style::{Color, Style};
use regex::Regex;
#[derive(Clone, Debug)]

Просмотреть файл

@@ -2,26 +2,25 @@ use crate::cursor::CursorMove;
use crate::highlight::LineHighlighter;
use crate::history::{Edit, EditKind, History};
use crate::input::{Input, Key};
use crate::ratatui::layout::Alignment;
use crate::ratatui::style::{Color, Modifier, Style};
#[cfg(any(
feature = "crossterm",
feature = "termion",
feature = "termwiz",
feature = "your-backend",
))]
use crate::ratatui::text::Line;
#[cfg(any(
feature = "tuirs-crossterm",
feature = "tuirs-termion",
feature = "tuirs-your-backend",
))]
use crate::ratatui::text::Spans as Line;
use crate::ratatui::widgets::{Block, Widget};
use crate::scroll::Scrolling;
#[cfg(feature = "search")]
use crate::search::Search;
use crate::tui::layout::Alignment;
use crate::tui::style::{Color, Modifier, Style};
#[cfg(any(
feature = "ratatui-crossterm",
feature = "ratatui-termion",
feature = "ratatui-termwiz",
feature = "ratatui-your-backend",
))]
use crate::tui::text::Line as Spans;
#[cfg(not(any(
feature = "ratatui-crossterm",
feature = "ratatui-termion",
feature = "ratatui-termwiz",
feature = "ratatui-your-backend",
)))]
use crate::tui::text::Spans;
use crate::tui::widgets::{Block, Widget};
use crate::util::spaces;
use crate::widget::{Renderer, Viewport};
use crate::word::{find_word_end_forward, find_word_start_backward};
@@ -172,7 +171,7 @@ impl<'a> TextArea<'a> {
/// Handle a key input with default key mappings. For default key mappings, see the table in
/// [the module document](./index.html).
/// `crossterm`, `termion`, and `ratatui-termwiz` features enable conversion from their own key event types into
/// `crossterm`, `termion`, and `termwiz` features enable conversion from their own key event types into
/// [`Input`] so this method can take the event values directly.
/// This method returns if the input modified text contents or not in the textarea.
/// ```ignore
@@ -1010,7 +1009,7 @@ impl<'a> TextArea<'a> {
}
}
pub(crate) fn line_spans<'b>(&'b self, line: &'b str, row: usize, lnum_len: u8) -> Spans<'b> {
pub(crate) fn line_spans<'b>(&'b self, line: &'b str, row: usize, lnum_len: u8) -> Line<'b> {
let mut hl = LineHighlighter::new(line, self.cursor_style, self.tab_len, self.mask);
if let Some(style) = self.line_number_style {
@@ -1029,12 +1028,12 @@ impl<'a> TextArea<'a> {
hl.into_spans()
}
/// Build a tui-rs widget to render the current state of the textarea. The widget instance returned from this
/// method can be rendered with [`tui::terminal::Frame::render_widget`].
/// Build a ratatui (or tui-rs) widget to render the current state of the textarea. The widget instance returned
/// from this method can be rendered with [`ratatui::terminal::Frame::render_widget`].
/// ```no_run
/// use tui::backend::CrosstermBackend;
/// use tui::layout::{Constraint, Direction, Layout};
/// use tui::Terminal;
/// use ratatui::backend::CrosstermBackend;
/// use ratatui::layout::{Constraint, Direction, Layout};
/// use ratatui::Terminal;
/// use tui_textarea::TextArea;
///
/// let mut textarea = TextArea::default();
@@ -1061,7 +1060,7 @@ impl<'a> TextArea<'a> {
/// Set the style of textarea. By default, textarea is not styled.
/// ```
/// use tui::style::{Style, Color};
/// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea;
///
/// let mut textarea = TextArea::default();
@@ -1081,7 +1080,7 @@ impl<'a> TextArea<'a> {
/// Set the block of textarea. By default, no block is set.
/// ```
/// use tui_textarea::TextArea;
/// use tui::widgets::{Block, Borders};
/// use ratatui::widgets::{Block, Borders};
///
/// let mut textarea = TextArea::default();
/// let block = Block::default().borders(Borders::ALL).title("Block Title");
@@ -1095,7 +1094,7 @@ impl<'a> TextArea<'a> {
/// Remove the block of textarea which was set by [`TextArea::set_block`].
/// ```
/// use tui_textarea::TextArea;
/// use tui::widgets::{Block, Borders};
/// use ratatui::widgets::{Block, Borders};
///
/// let mut textarea = TextArea::default();
/// let block = Block::default().borders(Borders::ALL).title("Block Title");
@@ -1112,8 +1111,7 @@ impl<'a> TextArea<'a> {
self.block.as_ref()
}
/// Set the length of tab character. Due to limitation of tui-rs, hard tab is not supported. Setting 0 disables tab
/// inputs.
/// Set the length of tab character. Setting 0 disables tab inputs.
/// ```
/// use tui_textarea::{TextArea, Input, Key};
///
@@ -1199,7 +1197,7 @@ impl<'a> TextArea<'a> {
/// Set the style of line at cursor. By default, the cursor line is styled with underline. To stop styling the
/// cursor line, set the default style.
/// ```
/// use tui::style::{Style, Color};
/// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea;
///
/// let mut textarea = TextArea::default();
@@ -1224,7 +1222,7 @@ impl<'a> TextArea<'a> {
/// that line numbers are disabled by default. If you want to show line numbers but don't want to style them, set
/// the default style.
/// ```
/// use tui::style::{Style, Color};
/// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea;
///
/// let mut textarea = TextArea::default();
@@ -1241,7 +1239,7 @@ impl<'a> TextArea<'a> {
/// Remove the style of line number which was set by [`TextArea::set_line_number_style`]. After calling this
/// method, Line numbers will no longer be shown.
/// ```
/// use tui::style::{Style, Color};
/// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea;
///
/// let mut textarea = TextArea::default();
@@ -1279,7 +1277,7 @@ impl<'a> TextArea<'a> {
/// Set the style of the placeholder text. The default style is a dark gray text.
/// ```
/// use tui::style::{Style, Color};
/// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea;
///
/// let mut textarea = TextArea::default();
@@ -1373,7 +1371,7 @@ impl<'a> TextArea<'a> {
/// Set the style of cursor. By default, a cursor is rendered in the reversed color. Setting the same style as
/// cursor line hides a cursor.
/// ```
/// use tui::style::{Style, Color};
/// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea;
///
/// let mut textarea = TextArea::default();
@@ -1449,8 +1447,8 @@ impl<'a> TextArea<'a> {
/// Set text alignment. When [`Alignment::Center`] or [`Alignment::Right`] is set, line number is automatically
/// disabled because those alignments don't work well with line numbers.
/// ```
/// use ratatui::layout::Alignment;
/// use tui_textarea::TextArea;
/// use tui::layout::Alignment;
///
/// let mut textarea = TextArea::default();
///
@@ -1466,8 +1464,8 @@ impl<'a> TextArea<'a> {
/// Get current text alignment. The default alignment is [`Alignment::Left`].
/// ```
/// use ratatui::layout::Alignment;
/// use tui_textarea::TextArea;
/// use tui::layout::Alignment;
///
/// let mut textarea = TextArea::default();
///
@@ -1669,7 +1667,7 @@ impl<'a> TextArea<'a> {
/// Get the text style at matches of text search. The default style is colored with blue in background.
///
/// ```
/// use tui::style::{Style, Color};
/// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea;
///
/// let textarea = TextArea::default();
@@ -1685,7 +1683,7 @@ impl<'a> TextArea<'a> {
/// Set the text style at matches of text search. The default style is colored with blue in background.
///
/// ```
/// use tui::style::{Style, Color};
/// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea;
///
/// let mut textarea = TextArea::default();
@@ -1706,9 +1704,9 @@ impl<'a> TextArea<'a> {
/// the cursor position will be adjusted to stay in the viewport using the same logic as [`CursorMove::InViewport`].
///
/// ```
/// # use tui::buffer::Buffer;
/// # use tui::layout::Rect;
/// # use tui::widgets::Widget;
/// # use ratatui::buffer::Buffer;
/// # use ratatui::layout::Rect;
/// # use ratatui::widgets::Widget;
/// use tui_textarea::TextArea;
///
/// // Let's say terminal height is 8.
@@ -1749,12 +1747,12 @@ impl<'a> TextArea<'a> {
mod tests {
use super::*;
// Seaparate tests for ratatui support
// Seaparate tests for tui-rs support
#[test]
fn scroll() {
use crate::tui::buffer::Buffer;
use crate::tui::layout::Rect;
use crate::tui::widgets::Widget;
use crate::ratatui::buffer::Buffer;
use crate::ratatui::layout::Rect;
use crate::ratatui::widgets::Widget;
let mut textarea: TextArea = (0..20).map(|i| i.to_string()).collect();
let r = Rect {

Просмотреть файл

@@ -1,8 +1,8 @@
use crate::ratatui::buffer::Buffer;
use crate::ratatui::layout::Rect;
use crate::ratatui::text::Text;
use crate::ratatui::widgets::{Paragraph, Widget};
use crate::textarea::TextArea;
use crate::tui::buffer::Buffer;
use crate::tui::layout::Rect;
use crate::tui::text::Text;
use crate::tui::widgets::{Paragraph, Widget};
use crate::util::num_digits;
use std::cmp;
use std::sync::atomic::{AtomicU64, Ordering};