From 4154f99b44ee10b39014da209c737a351ef3ce17 Mon Sep 17 00:00:00 2001 From: Alexandre Bury Date: Wed, 15 Apr 2020 12:20:50 -0700 Subject: [PATCH] Split non-backend code into cursive-core --- .github/workflows/rust.yml | 4 +- .travis.yml | 1 + CHANGELOG.md | 28 ++ Cargo.toml | 99 +------ Readme.md | 3 +- appveyor.yml | 2 +- cursive-core/Cargo.toml | 64 +++++ {src => cursive-core/src}/align.rs | 0 .../mod.rs => cursive-core/src/backend.rs | 75 +++++- {src => cursive-core/src}/cursive.rs | 121 +++------ {src => cursive-core/src}/direction.rs | 8 +- {src => cursive-core/src}/div.rs | 0 {src => cursive-core/src}/event.rs | 25 +- cursive-core/src/lib.rs | 58 +++++ {src => cursive-core/src}/logger.rs | 0 {src => cursive-core/src}/menu.rs | 0 {src => cursive-core/src}/printer.rs | 16 +- {src => cursive-core/src}/rect.rs | 0 .../src}/theme/border_style.rs | 0 {src => cursive-core/src}/theme/color.rs | 0 {src => cursive-core/src}/theme/color_pair.rs | 0 .../src}/theme/color_style.rs | 0 {src => cursive-core/src}/theme/effect.rs | 0 {src => cursive-core/src}/theme/mod.rs | 0 {src => cursive-core/src}/theme/palette.rs | 4 +- {src => cursive-core/src}/theme/style.rs | 0 {src => cursive-core/src}/traits.rs | 2 +- {src => cursive-core/src}/utils/counter.rs | 0 {src => cursive-core/src}/utils/immutify.rs | 2 +- {src => cursive-core/src}/utils/lines/mod.rs | 0 .../src}/utils/lines/simple/lines_iterator.rs | 0 .../src}/utils/lines/simple/mod.rs | 2 +- .../src}/utils/lines/simple/row.rs | 0 .../src}/utils/lines/simple/tests.rs | 0 .../src}/utils/lines/spans/chunk.rs | 0 .../src}/utils/lines/spans/chunk_iterator.rs | 0 .../src}/utils/lines/spans/lines_iterator.rs | 0 .../src}/utils/lines/spans/mod.rs | 0 .../src}/utils/lines/spans/prefix.rs | 0 .../src}/utils/lines/spans/row.rs | 0 .../src}/utils/lines/spans/segment.rs | 0 .../lines/spans/segment_merge_iterator.rs | 0 .../src}/utils/lines/spans/tests.rs | 0 .../src}/utils/markup/markdown.rs | 0 {src => cursive-core/src}/utils/markup/mod.rs | 0 {src => cursive-core/src}/utils/mod.rs | 0 {src => cursive-core/src}/utils/reader.rs | 2 +- {src => cursive-core/src}/utils/span.rs | 0 {src => cursive-core/src}/vec.rs | 56 ++-- {src => cursive-core/src}/view/any.rs | 4 +- {src => cursive-core/src}/view/finder.rs | 0 .../src}/view/into_boxed_view.rs | 0 {src => cursive-core/src}/view/margins.rs | 0 {src => cursive-core/src}/view/mod.rs | 0 {src => cursive-core/src}/view/nameable.rs | 8 +- {src => cursive-core/src}/view/position.rs | 0 {src => cursive-core/src}/view/resizable.rs | 0 {src => cursive-core/src}/view/scroll/core.rs | 0 {src => cursive-core/src}/view/scroll/mod.rs | 8 +- {src => cursive-core/src}/view/scroll/raw.rs | 0 .../src}/view/scroll/strategy.rs | 0 {src => cursive-core/src}/view/scroll_base.rs | 12 +- {src => cursive-core/src}/view/scrollable.rs | 0 {src => cursive-core/src}/view/size_cache.rs | 0 .../src}/view/size_constraint.rs | 0 {src => cursive-core/src}/view/view_path.rs | 0 {src => cursive-core/src}/view/view_trait.rs | 0 .../src}/view/view_wrapper.rs | 23 +- {src => cursive-core/src}/views/boxed_view.rs | 0 {src => cursive-core/src}/views/button.rs | 8 +- {src => cursive-core/src}/views/canvas.rs | 4 +- {src => cursive-core/src}/views/checkbox.rs | 6 +- .../src}/views/circular_focus.rs | 0 {src => cursive-core/src}/views/debug_view.rs | 0 {src => cursive-core/src}/views/dialog.rs | 18 +- {src => cursive-core/src}/views/dummy.rs | 0 {src => cursive-core/src}/views/edit_view.rs | 12 +- .../src}/views/enableable_view.rs | 6 +- .../src}/views/hideable_view.rs | 0 .../src}/views/last_size_view.rs | 0 {src => cursive-core/src}/views/layer.rs | 0 .../src}/views/linear_layout.rs | 4 +- {src => cursive-core/src}/views/list_view.rs | 0 {src => cursive-core/src}/views/menu_popup.rs | 0 {src => cursive-core/src}/views/menubar.rs | 0 {src => cursive-core/src}/views/mod.rs | 5 +- {src => cursive-core/src}/views/named_view.rs | 0 .../src}/views/on_event_view.rs | 12 +- .../src}/views/padded_view.rs | 2 +- {src => cursive-core/src}/views/panel.rs | 0 .../src}/views/progress_bar.rs | 2 +- {src => cursive-core/src}/views/radio.rs | 0 .../src}/views/resized_view.rs | 2 +- .../src}/views/screens_view.rs | 0 .../src}/views/scroll_view.rs | 0 .../src}/views/select_view.rs | 40 +-- .../src}/views/shadow_view.rs | 0 .../src}/views/slider_view.rs | 2 +- {src => cursive-core/src}/views/stack_view.rs | 4 +- {src => cursive-core/src}/views/text_area.rs | 4 +- {src => cursive-core/src}/views/text_view.rs | 8 +- .../src}/views/tracked_view.rs | 0 {src => cursive-core/src}/with.rs | 0 {src => cursive-core/src}/xy.rs | 68 ++--- cursive/Cargo.toml | 70 +++++ {assets => cursive/assets}/cities.txt | 0 {assets => cursive/assets}/lorem.txt | 0 {assets => cursive/assets}/style.toml | 0 {examples => cursive/examples}/Readme.md | 0 {examples => cursive/examples}/colors.rs | 4 +- .../examples}/debug_console.rs | 2 +- {examples => cursive/examples}/dialog.rs | 3 +- {examples => cursive/examples}/edit.rs | 2 +- {examples => cursive/examples}/hello_world.rs | 2 +- {examples => cursive/examples}/key_codes.rs | 4 +- {examples => cursive/examples}/linear.rs | 3 +- {examples => cursive/examples}/list_view.rs | 3 +- {examples => cursive/examples}/logs.rs | 2 +- {examples => cursive/examples}/lorem.rs | 3 +- {examples => cursive/examples}/markup.rs | 3 +- {examples => cursive/examples}/menubar.rs | 3 +- .../examples}/mines/Readme.md | 0 {examples => cursive/examples}/mines/game.rs | 0 {examples => cursive/examples}/mines/main.rs | 2 +- {examples => cursive/examples}/mutation.rs | 2 +- {examples => cursive/examples}/position.rs | 2 +- {examples => cursive/examples}/progress.rs | 2 +- {examples => cursive/examples}/radio.rs | 3 +- .../examples}/refcell_view.rs | 2 +- {examples => cursive/examples}/scroll.rs | 2 +- {examples => cursive/examples}/select.rs | 2 +- {examples => cursive/examples}/select_test.rs | 0 {examples => cursive/examples}/slider.rs | 2 +- {examples => cursive/examples}/tcp_server.rs | 2 +- .../examples}/terminal_default.rs | 2 +- {examples => cursive/examples}/text_area.rs | 2 +- {examples => cursive/examples}/theme.rs | 3 +- .../examples}/theme_manual.rs | 2 +- {examples => cursive/examples}/user_data.rs | 2 +- {examples => cursive/examples}/vpv.rs | 2 +- {src/backend => cursive/src/backends}/blt.rs | 0 .../src/backends}/crossterm.rs | 244 +++++++++--------- .../src/backends}/curses/mod.rs | 0 .../src/backends}/curses/n.rs | 0 .../src/backends}/curses/pan.rs | 0 .../backend => cursive/src/backends}/dummy.rs | 1 + cursive/src/backends/mod.rs | 18 ++ .../src/backends}/puppet/mod.rs | 6 +- .../src/backends}/puppet/observed.rs | 2 +- .../backends}/puppet/observed_screen_view.rs | 4 +- .../src/backends}/puppet/static_values.rs | 2 +- .../src/backends}/resize.rs | 0 .../src/backends}/termion.rs | 3 +- cursive/src/cursive_ext.rs | 106 ++++++++ {src => cursive/src}/lib.rs | 112 ++++---- {src => cursive/src}/utf8.rs | 0 doc/tutorial_1.md | 17 +- doc/tutorial_2.md | 11 +- doc/tutorial_3.md | 2 +- 159 files changed, 865 insertions(+), 635 deletions(-) create mode 100644 cursive-core/Cargo.toml rename {src => cursive-core/src}/align.rs (100%) rename src/backend/mod.rs => cursive-core/src/backend.rs (67%) rename {src => cursive-core/src}/cursive.rs (90%) rename {src => cursive-core/src}/direction.rs (97%) rename {src => cursive-core/src}/div.rs (100%) rename {src => cursive-core/src}/event.rs (96%) create mode 100644 cursive-core/src/lib.rs rename {src => cursive-core/src}/logger.rs (100%) rename {src => cursive-core/src}/menu.rs (100%) rename {src => cursive-core/src}/printer.rs (98%) rename {src => cursive-core/src}/rect.rs (100%) rename {src => cursive-core/src}/theme/border_style.rs (100%) rename {src => cursive-core/src}/theme/color.rs (100%) rename {src => cursive-core/src}/theme/color_pair.rs (100%) rename {src => cursive-core/src}/theme/color_style.rs (100%) rename {src => cursive-core/src}/theme/effect.rs (100%) rename {src => cursive-core/src}/theme/mod.rs (100%) rename {src => cursive-core/src}/theme/palette.rs (98%) rename {src => cursive-core/src}/theme/style.rs (100%) rename {src => cursive-core/src}/traits.rs (90%) rename {src => cursive-core/src}/utils/counter.rs (100%) rename {src => cursive-core/src}/utils/immutify.rs (98%) rename {src => cursive-core/src}/utils/lines/mod.rs (100%) rename {src => cursive-core/src}/utils/lines/simple/lines_iterator.rs (100%) rename {src => cursive-core/src}/utils/lines/simple/mod.rs (98%) rename {src => cursive-core/src}/utils/lines/simple/row.rs (100%) rename {src => cursive-core/src}/utils/lines/simple/tests.rs (100%) rename {src => cursive-core/src}/utils/lines/spans/chunk.rs (100%) rename {src => cursive-core/src}/utils/lines/spans/chunk_iterator.rs (100%) rename {src => cursive-core/src}/utils/lines/spans/lines_iterator.rs (100%) rename {src => cursive-core/src}/utils/lines/spans/mod.rs (100%) rename {src => cursive-core/src}/utils/lines/spans/prefix.rs (100%) rename {src => cursive-core/src}/utils/lines/spans/row.rs (100%) rename {src => cursive-core/src}/utils/lines/spans/segment.rs (100%) rename {src => cursive-core/src}/utils/lines/spans/segment_merge_iterator.rs (100%) rename {src => cursive-core/src}/utils/lines/spans/tests.rs (100%) rename {src => cursive-core/src}/utils/markup/markdown.rs (100%) rename {src => cursive-core/src}/utils/markup/mod.rs (100%) rename {src => cursive-core/src}/utils/mod.rs (100%) rename {src => cursive-core/src}/utils/reader.rs (96%) rename {src => cursive-core/src}/utils/span.rs (100%) rename {src => cursive-core/src}/vec.rs (92%) rename {src => cursive-core/src}/view/any.rs (95%) rename {src => cursive-core/src}/view/finder.rs (100%) rename {src => cursive-core/src}/view/into_boxed_view.rs (100%) rename {src => cursive-core/src}/view/margins.rs (100%) rename {src => cursive-core/src}/view/mod.rs (100%) rename {src => cursive-core/src}/view/nameable.rs (90%) rename {src => cursive-core/src}/view/position.rs (100%) rename {src => cursive-core/src}/view/resizable.rs (100%) rename {src => cursive-core/src}/view/scroll/core.rs (100%) rename {src => cursive-core/src}/view/scroll/mod.rs (97%) rename {src => cursive-core/src}/view/scroll/raw.rs (100%) rename {src => cursive-core/src}/view/scroll/strategy.rs (100%) rename {src => cursive-core/src}/view/scroll_base.rs (96%) rename {src => cursive-core/src}/view/scrollable.rs (100%) rename {src => cursive-core/src}/view/size_cache.rs (100%) rename {src => cursive-core/src}/view/size_constraint.rs (100%) rename {src => cursive-core/src}/view/view_path.rs (100%) rename {src => cursive-core/src}/view/view_trait.rs (100%) rename {src => cursive-core/src}/view/view_wrapper.rs (92%) rename {src => cursive-core/src}/views/boxed_view.rs (100%) rename {src => cursive-core/src}/views/button.rs (97%) rename {src => cursive-core/src}/views/canvas.rs (98%) rename {src => cursive-core/src}/views/checkbox.rs (96%) rename {src => cursive-core/src}/views/circular_focus.rs (100%) rename {src => cursive-core/src}/views/debug_view.rs (100%) rename {src => cursive-core/src}/views/dialog.rs (98%) rename {src => cursive-core/src}/views/dummy.rs (100%) rename {src => cursive-core/src}/views/edit_view.rs (98%) rename {src => cursive-core/src}/views/enableable_view.rs (91%) rename {src => cursive-core/src}/views/hideable_view.rs (100%) rename {src => cursive-core/src}/views/last_size_view.rs (100%) rename {src => cursive-core/src}/views/layer.rs (100%) rename {src => cursive-core/src}/views/linear_layout.rs (99%) rename {src => cursive-core/src}/views/list_view.rs (100%) rename {src => cursive-core/src}/views/menu_popup.rs (100%) rename {src => cursive-core/src}/views/menubar.rs (100%) rename {src => cursive-core/src}/views/mod.rs (98%) rename {src => cursive-core/src}/views/named_view.rs (100%) rename {src => cursive-core/src}/views/on_event_view.rs (96%) rename {src => cursive-core/src}/views/padded_view.rs (97%) rename {src => cursive-core/src}/views/panel.rs (100%) rename {src => cursive-core/src}/views/progress_bar.rs (99%) rename {src => cursive-core/src}/views/radio.rs (100%) rename {src => cursive-core/src}/views/resized_view.rs (99%) rename {src => cursive-core/src}/views/screens_view.rs (100%) rename {src => cursive-core/src}/views/scroll_view.rs (100%) rename {src => cursive-core/src}/views/select_view.rs (97%) rename {src => cursive-core/src}/views/shadow_view.rs (100%) rename {src => cursive-core/src}/views/slider_view.rs (99%) rename {src => cursive-core/src}/views/stack_view.rs (99%) rename {src => cursive-core/src}/views/text_area.rs (99%) rename {src => cursive-core/src}/views/text_view.rs (98%) rename {src => cursive-core/src}/views/tracked_view.rs (100%) rename {src => cursive-core/src}/with.rs (100%) rename {src => cursive-core/src}/xy.rs (91%) create mode 100644 cursive/Cargo.toml rename {assets => cursive/assets}/cities.txt (100%) rename {assets => cursive/assets}/lorem.txt (100%) rename {assets => cursive/assets}/style.toml (100%) rename {examples => cursive/examples}/Readme.md (100%) rename {examples => cursive/examples}/colors.rs (96%) rename {examples => cursive/examples}/debug_console.rs (93%) rename {examples => cursive/examples}/dialog.rs (90%) rename {examples => cursive/examples}/edit.rs (98%) rename {examples => cursive/examples}/hello_world.rs (89%) rename {examples => cursive/examples}/key_codes.rs (94%) rename {examples => cursive/examples}/linear.rs (95%) rename {examples => cursive/examples}/list_view.rs (98%) rename {examples => cursive/examples}/logs.rs (98%) rename {examples => cursive/examples}/lorem.rs (93%) rename {examples => cursive/examples}/markup.rs (91%) rename {examples => cursive/examples}/menubar.rs (98%) rename {examples => cursive/examples}/mines/Readme.md (100%) rename {examples => cursive/examples}/mines/game.rs (100%) rename {examples => cursive/examples}/mines/main.rs (99%) rename {examples => cursive/examples}/mutation.rs (97%) rename {examples => cursive/examples}/position.rs (96%) rename {examples => cursive/examples}/progress.rs (99%) rename {examples => cursive/examples}/radio.rs (97%) rename {examples => cursive/examples}/refcell_view.rs (97%) rename {examples => cursive/examples}/scroll.rs (94%) rename {examples => cursive/examples}/select.rs (97%) rename {examples => cursive/examples}/select_test.rs (100%) rename {examples => cursive/examples}/slider.rs (96%) rename {examples => cursive/examples}/tcp_server.rs (99%) rename {examples => cursive/examples}/terminal_default.rs (95%) rename {examples => cursive/examples}/text_area.rs (98%) rename {examples => cursive/examples}/theme.rs (94%) rename {examples => cursive/examples}/theme_manual.rs (96%) rename {examples => cursive/examples}/user_data.rs (97%) rename {examples => cursive/examples}/vpv.rs (99%) rename {src/backend => cursive/src/backends}/blt.rs (100%) rename {src/backend => cursive/src/backends}/crossterm.rs (56%) rename {src/backend => cursive/src/backends}/curses/mod.rs (100%) rename {src/backend => cursive/src/backends}/curses/n.rs (100%) rename {src/backend => cursive/src/backends}/curses/pan.rs (100%) rename {src/backend => cursive/src/backends}/dummy.rs (96%) create mode 100644 cursive/src/backends/mod.rs rename {src/backend => cursive/src/backends}/puppet/mod.rs (96%) rename {src/backend => cursive/src/backends}/puppet/observed.rs (99%) rename {src/backend => cursive/src/backends}/puppet/observed_screen_view.rs (93%) rename {src/backend => cursive/src/backends}/puppet/static_values.rs (93%) rename {src/backend => cursive/src/backends}/resize.rs (100%) rename {src/backend => cursive/src/backends}/termion.rs (99%) create mode 100644 cursive/src/cursive_ext.rs rename {src => cursive/src}/lib.rs (55%) rename {src => cursive/src}/utf8.rs (100%) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 97ea326..19b2e4e 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -10,6 +10,6 @@ jobs: steps: - uses: actions/checkout@v1 - name: Build - run: cargo build --no-default-features --verbose + run: cd cursive && cargo build --no-default-features --verbose - name: Run tests - run: cargo test --no-default-features --verbose + run: cd cursive && cargo test --no-default-features --verbose diff --git a/.travis.yml b/.travis.yml index d26ac12..375f908 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ rust: - stable - nightly script: + - cd cursive - cargo check --all-features - cargo build --verbose --features "markdown pancurses-backend termion-backend crossterm-backend" - cargo test --verbose --features "markdown pancurses-backend termion-backend crossterm-backend" diff --git a/CHANGELOG.md b/CHANGELOG.md index ebe13f3..2688bd9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,33 @@ # Changelog +## Next version (0.15.0) + +### Breaking changes + +- Split library into a backend-agnostic `cursive-core` and a user-facing `cursive`. +- `Cursive::default` now needs the `cursive::CursiveExt` trait to be in scope. +- Update dependencies: + - crossterm to 0.17. + - enumset to 1.0 + - ahash to 0.3 + - pulldown-cmark to 0.7 +- Add `PaletteColor::HighlightText` +- `AnyCb` now takes a `&mut dyn View` rather than a `&mut dyn Any`. + +### API updates + +- Added `cursive::{default,ncurses,pancurses,termion,crossterm,blt,dummy}` functions. +- Add `Cursive::debug_name` +- Add `ScreensView` to move some code away from the `Cursive` root + - Reworked global callbacks configuration + - Ctrl-C can be rewired to no longer exit the application + +### Bugfixes + +- Fix Ctrl-Z binding for ncurses +- Fix potential crash with empty `SelectView` +- Add `toml` and `markdown` features to docs.rs + ## 0.14.0 ### Breaking changes diff --git a/Cargo.toml b/Cargo.toml index e7c30c6..a83a315 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,98 +1,3 @@ -[package] -authors = ["Alexandre Bury "] -categories = ["command-line-interface", "gui"] -description = "A TUI (Text User Interface) library focused on ease-of-use." -documentation = "https://docs.rs/cursive" -exclude = ["doc/**", "assets/**", "examples/**"] -keywords = ["ncurses", "TUI", "UI"] -license = "MIT" -name = "cursive" -readme = "Readme.md" -repository = "https://github.com/gyscos/cursive" -version = "0.14.1-alpha.0" -edition = "2018" +[workspace] -[package.metadata.docs.rs] -features = ["unstable_scroll", "scroll", "markdown"] - -[badges.travis-ci] -repository = "gyscos/cursive" - -[badges.appveyor] -repository = "gyscos/cursive" - -[dependencies] -enum-map = "0.6.0" -enumset = "1.0.0" -log = "0.4.8" -owning_ref = "0.4.0" -unicode-segmentation = "1.3.0" -unicode-width = "0.1.5" -xi-unicode = "0.2.0" -libc = "0.2.60" -term_size = { version = "0.3.1", optional = true } -crossbeam-channel = "0.4.0" -lazy_static = "1" -chrono = "0.4.7" -cfg-if = "0.1.9" -ahash = "0.3" - -[dependencies.toml] -optional = true -version = "0.5.1" - -[dependencies.num] -default-features = false -version = "0.2.0" - -[dependencies.maplit] -optional = true -version = "1.0.1" - -[dependencies.bear-lib-terminal] -optional = true -version = "2.0.0" - -[dependencies.ncurses] -features = ["wide"] -optional = true -version = "5.99.0" - -[dependencies.pancurses] -features = ["wide"] -optional = true -version = "0.16.1" - -[dependencies.pulldown-cmark] -default-features = false -optional = true -version = "0.7.0" - -[dependencies.termion] -optional = true -version = "1.5.3" - -[dependencies.crossterm] -optional = true -version = "0.17" - -[target.'cfg(unix)'.dependencies] -signal-hook = "0.1" - -[dev-dependencies] -rand = "0.7.0" -pretty-bytes = "0.2.2" -atty = "0.2.13" - -[features] -blt-backend = ["bear-lib-terminal"] -default = ["ncurses-backend"] -markdown = ["pulldown-cmark"] -ncurses-backend = ["ncurses", "maplit", "term_size"] -pancurses-backend = ["pancurses", "maplit", "term_size"] -termion-backend = ["termion"] -crossterm-backend = ["crossterm"] -unstable_scroll = [] - -[lib] -name = "cursive" +members = ["cursive-core", "cursive"] diff --git a/Readme.md b/Readme.md index 7c61f51..936d698 100644 --- a/Readme.md +++ b/Readme.md @@ -30,12 +30,11 @@ cursive = { git = "https://github.com/gyscos/cursive" } ([You will also need ncurses installed.](https://github.com/gyscos/cursive/wiki/Install-ncurses)) ```rust,no_run -use cursive::Cursive; use cursive::views::{Dialog, TextView}; fn main() { // Creates the cursive root - required for every application. - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // Creates a dialog with a single "Quit" button siv.add_layer(Dialog::around(TextView::new("Hello Dialog!")) diff --git a/appveyor.yml b/appveyor.yml index 8684d5d..7411b6b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -33,4 +33,4 @@ build: false # Equivalent to Travis' `script` phase # TODO modify this phase as you see fit test_script: - - cargo test --verbose --all --no-default-features --features pancurses-backend + - cd cursive && cargo test --verbose --all --no-default-features --features pancurses-backend diff --git a/cursive-core/Cargo.toml b/cursive-core/Cargo.toml new file mode 100644 index 0000000..6d651d1 --- /dev/null +++ b/cursive-core/Cargo.toml @@ -0,0 +1,64 @@ +[package] +authors = ["Alexandre Bury "] +categories = ["command-line-interface", "gui"] +description = "Core components for the Cursive TUI" +documentation = "https://docs.rs/cursive" +exclude = ["doc/**", "assets/**", "examples/**"] +keywords = ["ncurses", "TUI", "UI"] +license = "MIT" +name = "cursive_core" +readme = "Readme.md" +repository = "https://github.com/gyscos/cursive" +version = "0.1.0" +edition = "2018" + +[package.metadata.docs.rs] +features = ["unstable_scroll", "scroll", "markdown"] + +[badges.travis-ci] +repository = "gyscos/cursive" + +[badges.appveyor] +repository = "gyscos/cursive" + +[dependencies] +enum-map = "0.6.0" +enumset = "1.0.0" +log = "0.4.8" +owning_ref = "0.4.0" +unicode-segmentation = "1.3.0" +unicode-width = "0.1.5" +xi-unicode = "0.2.0" +libc = "0.2.60" +crossbeam-channel = "0.4.0" +lazy_static = "1" +chrono = "0.4.7" +ahash = "0.3" + +[dependencies.toml] +optional = true +version = "0.5.1" + +[dependencies.num] +default-features = false +version = "0.2.0" + +[dependencies.pulldown-cmark] +default-features = false +optional = true +version = "0.7.0" + +[target.'cfg(unix)'.dependencies] +signal-hook = "0.1" + +[dev-dependencies] +rand = "0.7.0" +pretty-bytes = "0.2.2" +atty = "0.2.13" + +[features] +markdown = ["pulldown-cmark"] +unstable_scroll = [] + +[lib] +name = "cursive_core" diff --git a/src/align.rs b/cursive-core/src/align.rs similarity index 100% rename from src/align.rs rename to cursive-core/src/align.rs diff --git a/src/backend/mod.rs b/cursive-core/src/backend.rs similarity index 67% rename from src/backend/mod.rs rename to cursive-core/src/backend.rs index 69a7cce..8edfe3a 100644 --- a/src/backend/mod.rs +++ b/cursive-core/src/backend.rs @@ -12,17 +12,6 @@ use crate::theme; use crate::Vec2; use unicode_width::UnicodeWidthStr; -#[cfg(unix)] -mod resize; - -pub mod dummy; - -pub mod blt; -pub mod crossterm; -pub mod curses; -pub mod puppet; -pub mod termion; - /// Trait defining the required methods to be a backend. /// /// A backend is the interface between the abstract view tree and the actual @@ -40,11 +29,14 @@ pub mod termion; pub trait Backend { /// Polls the backend for any input. /// - /// Should return immediately. + /// Should return immediately: + /// * `None` if no event is currently available. + /// * `Some(event)` for each event to process. fn poll_event(&mut self) -> Option; // TODO: take `self` by value? // Or implement Drop? + // Will change when implementing resumable backends /// Prepares to close the backend. /// /// This should clear any state in the terminal. @@ -67,8 +59,11 @@ pub trait Backend { /// Main method used for printing fn print_at(&self, pos: Vec2, text: &str); - /// First positions the cursor, similar to `print_at`, and then prints the given number of - /// `repetitions` of `text`. + /// Efficient method to print repetitions of the same text. + /// + /// Usually used to draw horizontal lines/borders. + /// + /// It is a small optimization to avoid moving the cursor after each step. fn print_at_rep(&self, pos: Vec2, repetitions: usize, text: &str) { if repetitions > 0 { self.print_at(pos, text); @@ -110,3 +105,55 @@ pub trait Backend { "unknown" } } + +/// Dummy backend that does nothing and immediately exits. +/// +/// Mostly used for testing. +pub struct Dummy; + +impl Dummy { + /// Creates a new dummy backend. + pub fn init() -> Box + where + Self: Sized, + { + Box::new(Dummy) + } +} + +impl Backend for Dummy { + fn name(&self) -> &str { + "dummy" + } + + fn finish(&mut self) {} + + fn refresh(&mut self) {} + + fn has_colors(&self) -> bool { + false + } + + fn screen_size(&self) -> Vec2 { + (1, 1).into() + } + fn poll_event(&mut self) -> Option { + Some(Event::Exit) + } + + fn print_at(&self, _: Vec2, _: &str) {} + + fn print_at_rep(&self, _pos: Vec2, _repetitions: usize, _text: &str) {} + + fn clear(&self, _: theme::Color) {} + + // This sets the Colours and returns the previous colours + // to allow you to set them back when you're done. + fn set_color(&self, colors: theme::ColorPair) -> theme::ColorPair { + // TODO: actually save a stack of colors? + colors + } + + fn set_effect(&self, _: theme::Effect) {} + fn unset_effect(&self, _: theme::Effect) {} +} diff --git a/src/cursive.rs b/cursive-core/src/cursive.rs similarity index 90% rename from src/cursive.rs rename to cursive-core/src/cursive.rs index 38afb46..9d05b4f 100644 --- a/src/cursive.rs +++ b/cursive-core/src/cursive.rs @@ -69,53 +69,18 @@ pub type ScreenId = usize; /// [`send_wrapper`]: https://crates.io/crates/send_wrapper pub type CbSink = Sender>; -cfg_if::cfg_if! { - if #[cfg(feature = "blt-backend")] { - impl Default for Cursive { - fn default() -> Self { - Self::blt() - } - } - } else if #[cfg(feature = "termion-backend")] { - impl Default for Cursive { - fn default() -> Self { - Self::termion().unwrap() - } - } - } else if #[cfg(feature = "crossterm-backend")] { - impl Default for Cursive { - fn default() -> Self { - Self::crossterm().unwrap() - } - } - } else if #[cfg(feature = "pancurses-backend")] { - impl Default for Cursive { - fn default() -> Self { - Self::pancurses().unwrap() - } - } - } else if #[cfg(feature = "ncurses-backend")] { - impl Default for Cursive { - fn default() -> Self { - Self::ncurses().unwrap() - } - } - } else { - impl Default for Cursive { - fn default() -> Self { - log::warn!("No built-it backend, falling back to Cursive::dummy()."); - Self::dummy() - } - } - } -} - impl Cursive { /// Shortcut for `Cursive::try_new` with non-failible init function. /// - /// You probably don't want to use this function directly. Instead, - /// `Cursive::default()` or `Cursive::ncurses()` may be what you're - /// looking for. + /// You probably don't want to use this function directly, unless you're + /// using a non-standard backend. Built-in backends have dedicated functions. + /// + /// # Examples + /// + /// ```rust,no_run + /// # use cursive_core::{Cursive, backend}; + /// let siv = Cursive::new(backend::Dummy::init); + /// ``` pub fn new(backend_init: F) -> Self where F: FnOnce() -> Box, @@ -125,23 +90,11 @@ impl Cursive { /// Creates a new Cursive root, and initialize the back-end. /// - /// * If you just want a cursive instance, use `Cursive::default()`. - /// * If you want a specific backend, then: - /// * `Cursive::ncurses()` if the `ncurses-backend` feature is enabled (it is by default). - /// * `Cursive::pancurses()` if the `pancurses-backend` feature is enabled. - /// * `Cursive::termion()` if the `termion-backend` feature is enabled. - /// * `Cursive::crossterm()` if the `crossterm-backend` feature is enabled. - /// * `Cursive::blt()` if the `blt-backend` feature is enabled. - /// * `Cursive::dummy()` for a dummy backend, mostly useful for tests. - /// * If you want to use a third-party backend, then `Cursive::new` is indeed the way to go: - /// * `Cursive::new(bring::your::own::Backend::new)` + /// You probably don't want to use this function directly, unless you're + /// using a non-standard backend. Built-in backends have dedicated functions in the + /// [`CursiveExt`] trait. /// - /// Examples: - /// - /// ```rust,no_run - /// # use cursive::{Cursive, backend}; - /// let siv = Cursive::new(backend::dummy::Backend::init); // equivalent to Cursive::dummy() - /// ``` + /// [`CursiveExt`]: https://docs.rs/cursive/0/cursive/trait.CursiveExt.html pub fn try_new(backend_init: F) -> Result where F: FnOnce() -> Result, E>, @@ -171,6 +124,7 @@ impl Cursive { Ok(cursive) } + /* /// Creates a new Cursive root using a ncurses backend. #[cfg(feature = "ncurses-backend")] pub fn ncurses() -> std::io::Result { @@ -200,12 +154,15 @@ impl Cursive { pub fn blt() -> Self { Self::new(backend::blt::Backend::init) } + */ - /// Creates a new Cursive root using a dummy backend. + /// Creates a new Cursive root using a [dummy backend]. /// /// Nothing will be output. This is mostly here for tests. + /// + /// [dummy backend]: backend::Dummy pub fn dummy() -> Self { - Self::new(backend::dummy::Backend::init) + Self::new(backend::Dummy::init) } /// Sets some data to be stored in Cursive. @@ -236,7 +193,7 @@ impl Cursive { /// # Examples /// /// ```rust - /// let mut siv = cursive::Cursive::dummy(); + /// let mut siv = cursive_core::Cursive::dummy(); /// /// // Start with a simple `Vec` as user data. /// siv.set_user_data(vec![1i32, 2, 3]); @@ -304,7 +261,7 @@ impl Cursive { /// # Examples /// /// ```rust - /// # use cursive::Cursive; + /// # use cursive_core::Cursive; /// # let mut siv = Cursive::dummy(); /// siv.add_global_callback('~', Cursive::toggle_debug_console); /// ``` @@ -337,7 +294,7 @@ impl Cursive { /// # Examples /// /// ```rust - /// # use cursive::*; + /// # use cursive_core::*; /// let mut siv = Cursive::dummy(); /// /// // quit() will be called during the next event cycle @@ -367,10 +324,10 @@ impl Cursive { /// # Examples /// /// ```rust - /// # use cursive::{Cursive, event}; - /// # use cursive::views::{Dialog}; - /// # use cursive::traits::*; - /// # use cursive::menu::*; + /// # use cursive_core::{Cursive, event}; + /// # use cursive_core::views::{Dialog}; + /// # use cursive_core::traits::*; + /// # use cursive_core::menu::*; /// # /// let mut siv = Cursive::dummy(); /// @@ -524,8 +481,8 @@ impl Cursive { /// # Examples /// /// ```rust - /// # use cursive::{Cursive, views, view}; - /// # use cursive::traits::*; + /// # use cursive_core::{Cursive, views, view}; + /// # use cursive_core::traits::*; /// let mut siv = Cursive::dummy(); /// /// siv.add_layer(views::TextView::new("Text #1").with_name("text")); @@ -558,8 +515,8 @@ impl Cursive { /// # Examples /// /// ```rust - /// # use cursive::{Cursive, views}; - /// # use cursive::traits::*; + /// # use cursive_core::{Cursive, views}; + /// # use cursive_core::traits::*; /// let mut siv = Cursive::dummy(); /// /// siv.add_layer(views::TextView::new("Text #1") @@ -602,10 +559,10 @@ impl Cursive { /// # Examples /// /// ```rust - /// # use cursive::Cursive; - /// # use cursive::views::{TextView, ViewRef}; + /// # use cursive_core::Cursive; + /// # use cursive_core::views::{TextView, ViewRef}; /// # let mut siv = Cursive::dummy(); - /// use cursive::traits::Identifiable; + /// use cursive_core::traits::Identifiable; /// /// siv.add_layer(TextView::new("foo").with_name("id")); /// @@ -618,10 +575,10 @@ impl Cursive { /// wrong item type in a `SelectView` will not find anything: /// /// ```rust - /// # use cursive::Cursive; - /// # use cursive::views::{SelectView}; + /// # use cursive_core::Cursive; + /// # use cursive_core::views::{SelectView}; /// # let mut siv = Cursive::dummy(); - /// use cursive::traits::Identifiable; + /// use cursive_core::traits::Identifiable; /// /// let select = SelectView::new().item("zero", 0u32).item("one", 1u32); /// siv.add_layer(select.with_name("select")); @@ -679,7 +636,7 @@ impl Cursive { /// # Examples /// /// ```rust - /// # use cursive::*; + /// # use cursive_core::*; /// let mut siv = Cursive::dummy(); /// /// siv.add_global_callback('q', |s| s.quit()); @@ -775,7 +732,7 @@ impl Cursive { /// # Examples /// /// ```rust - /// use cursive::Cursive; + /// use cursive_core::Cursive; /// let mut siv = Cursive::dummy(); /// /// siv.add_global_callback('q', |s| s.quit()); @@ -804,7 +761,7 @@ impl Cursive { /// # Examples /// /// ```rust - /// use cursive::{Cursive, views}; + /// use cursive_core::{Cursive, views}; /// let mut siv = Cursive::dummy(); /// /// siv.add_layer(views::TextView::new("Hello world!")); diff --git a/src/direction.rs b/cursive-core/src/direction.rs similarity index 97% rename from src/direction.rs rename to cursive-core/src/direction.rs index d78c2be..cb5d7e0 100644 --- a/src/direction.rs +++ b/cursive-core/src/direction.rs @@ -62,8 +62,8 @@ impl Orientation { /// /// # Examples /// ```rust - /// # use cursive::XY; - /// # use cursive::direction::Orientation; + /// # use cursive_core::XY; + /// # use cursive_core::direction::Orientation; /// let o = Orientation::Horizontal; /// let mut xy = XY::new(1, 2); /// *o.get_ref(&mut xy) = 42; @@ -99,8 +99,8 @@ impl Orientation { /// # Examples /// /// ```rust - /// # use cursive::direction::Orientation; - /// # use cursive::Vec2; + /// # use cursive_core::direction::Orientation; + /// # use cursive_core::Vec2; /// let o = Orientation::Horizontal; /// let vec = o.make_vec(1, 2); /// diff --git a/src/div.rs b/cursive-core/src/div.rs similarity index 100% rename from src/div.rs rename to cursive-core/src/div.rs diff --git a/src/event.rs b/cursive-core/src/event.rs similarity index 96% rename from src/event.rs rename to cursive-core/src/event.rs index 3559c9d..5bd8926 100644 --- a/src/event.rs +++ b/cursive-core/src/event.rs @@ -23,7 +23,7 @@ use std::rc::Rc; /// /// It is meant to be stored in views. #[derive(Clone)] -pub struct Callback(Rc>); +pub struct Callback(Rc); // TODO: remove the Box when Box -> Rc is possible /// A callback that can be run on `&mut dyn View`. @@ -162,9 +162,9 @@ impl Callback { where F: 'static + Fn(&mut Cursive), { - Callback(Rc::new(Box::new(move |siv| { + Callback(Rc::new(move |siv| { f(siv); - }))) + })) } /// Wrap a `FnMut` into a `Callback` object. @@ -184,27 +184,22 @@ impl Callback { } impl Deref for Callback { - type Target = Box; - fn deref<'a>(&'a self) -> &'a Box { - &self.0 + type Target = dyn Fn(&mut Cursive) + 'static; + + fn deref(&self) -> &Self::Target { + &*self.0 } } -impl From>> for Callback { - fn from(f: Rc>) -> Self { +impl From> for Callback { + fn from(f: Rc) -> Self { Callback(f) } } -impl From> for Callback { - fn from(f: Box) -> Self { - Callback(Rc::new(f)) - } -} - impl From> for Callback { fn from(f: Box) -> Self { - Callback(Rc::new(f)) + Callback(Rc::from(f)) } } diff --git a/cursive-core/src/lib.rs b/cursive-core/src/lib.rs new file mode 100644 index 0000000..edabf9e --- /dev/null +++ b/cursive-core/src/lib.rs @@ -0,0 +1,58 @@ +//! # Cursive-core +//! +//! This library defines the core components for the Cursive TUI. +//! +//! The main purpose of `cursive-core` is to write third-party libraries to work with Cursive. +//! +//! If you are building an end-user application, then `cursive` is probably what you want. +#![deny(missing_docs)] + +macro_rules! new_default( + ($c:ident<$t:ident>) => { + impl<$t> Default for $c<$t> { + fn default() -> Self { + Self::new() + } + } + }; + ($c:ty) => { + impl Default for $c { + fn default() -> Self { + Self::new() + } + } + } +); + +#[macro_use] +pub mod utils; +#[macro_use] +pub mod view; +#[macro_use] +pub mod views; + +pub mod align; +pub mod backend; +pub mod direction; +pub mod event; +pub mod logger; +pub mod menu; +pub mod theme; +pub mod traits; +pub mod vec; + +mod cursive; +mod printer; +mod rect; +mod with; +mod xy; + +mod div; + +pub use self::cursive::{CbSink, Cursive, ScreenId}; +pub use self::printer::Printer; +pub use self::rect::Rect; +pub use self::vec::Vec2; +pub use self::view::View; +pub use self::with::With; +pub use self::xy::XY; diff --git a/src/logger.rs b/cursive-core/src/logger.rs similarity index 100% rename from src/logger.rs rename to cursive-core/src/logger.rs diff --git a/src/menu.rs b/cursive-core/src/menu.rs similarity index 100% rename from src/menu.rs rename to cursive-core/src/menu.rs diff --git a/src/printer.rs b/cursive-core/src/printer.rs similarity index 98% rename from src/printer.rs rename to cursive-core/src/printer.rs index a74ce35..1ccce8c 100644 --- a/src/printer.rs +++ b/cursive-core/src/printer.rs @@ -290,10 +290,10 @@ impl<'a, 'b> Printer<'a, 'b> { /// # Examples /// /// ```rust - /// # use cursive::Printer; - /// # use cursive::theme; - /// # use cursive::backend; - /// # let b = backend::dummy::Backend::init(); + /// # use cursive_core::Printer; + /// # use cursive_core::theme; + /// # use cursive_core::backend; + /// # let b = backend::Dummy::init(); /// # let t = theme::load_default(); /// # let printer = Printer::new((6,4), &t, &*b); /// printer.with_color(theme::ColorStyle::highlight(), |printer| { @@ -386,10 +386,10 @@ impl<'a, 'b> Printer<'a, 'b> { /// # Examples /// /// ```rust - /// # use cursive::Printer; - /// # use cursive::theme; - /// # use cursive::backend; - /// # let b = backend::dummy::Backend::init(); + /// # use cursive_core::Printer; + /// # use cursive_core::theme; + /// # use cursive_core::backend; + /// # let b = backend::Dummy::init(); /// # let t = theme::load_default(); /// # let printer = Printer::new((6,4), &t, &*b); /// printer.print_box((0,0), (6,4), false); diff --git a/src/rect.rs b/cursive-core/src/rect.rs similarity index 100% rename from src/rect.rs rename to cursive-core/src/rect.rs diff --git a/src/theme/border_style.rs b/cursive-core/src/theme/border_style.rs similarity index 100% rename from src/theme/border_style.rs rename to cursive-core/src/theme/border_style.rs diff --git a/src/theme/color.rs b/cursive-core/src/theme/color.rs similarity index 100% rename from src/theme/color.rs rename to cursive-core/src/theme/color.rs diff --git a/src/theme/color_pair.rs b/cursive-core/src/theme/color_pair.rs similarity index 100% rename from src/theme/color_pair.rs rename to cursive-core/src/theme/color_pair.rs diff --git a/src/theme/color_style.rs b/cursive-core/src/theme/color_style.rs similarity index 100% rename from src/theme/color_style.rs rename to cursive-core/src/theme/color_style.rs diff --git a/src/theme/effect.rs b/cursive-core/src/theme/effect.rs similarity index 100% rename from src/theme/effect.rs rename to cursive-core/src/theme/effect.rs diff --git a/src/theme/mod.rs b/cursive-core/src/theme/mod.rs similarity index 100% rename from src/theme/mod.rs rename to cursive-core/src/theme/mod.rs diff --git a/src/theme/palette.rs b/cursive-core/src/theme/palette.rs similarity index 98% rename from src/theme/palette.rs rename to cursive-core/src/theme/palette.rs index cf0f14b..de89f6f 100644 --- a/src/theme/palette.rs +++ b/cursive-core/src/theme/palette.rs @@ -21,8 +21,8 @@ type HashMap = std::collections::HashMap; /// # Example /// /// ```rust -/// # use cursive::theme::Palette; -/// use cursive::theme::{BaseColor::*, Color::*, PaletteColor::*}; +/// # use cursive_core::theme::Palette; +/// use cursive_core::theme::{BaseColor::*, Color::*, PaletteColor::*}; /// /// let mut palette = Palette::default(); /// diff --git a/src/theme/style.rs b/cursive-core/src/theme/style.rs similarity index 100% rename from src/theme/style.rs rename to cursive-core/src/theme/style.rs diff --git a/src/traits.rs b/cursive-core/src/traits.rs similarity index 90% rename from src/traits.rs rename to cursive-core/src/traits.rs index 521e874..6739d23 100644 --- a/src/traits.rs +++ b/cursive-core/src/traits.rs @@ -5,7 +5,7 @@ //! # Examples //! //! ``` -//! use cursive::traits::*; +//! use cursive_core::traits::*; //! ``` #[doc(no_inline)] diff --git a/src/utils/counter.rs b/cursive-core/src/utils/counter.rs similarity index 100% rename from src/utils/counter.rs rename to cursive-core/src/utils/counter.rs diff --git a/src/utils/immutify.rs b/cursive-core/src/utils/immutify.rs similarity index 98% rename from src/utils/immutify.rs rename to cursive-core/src/utils/immutify.rs index a93dbe1..98df182 100644 --- a/src/utils/immutify.rs +++ b/cursive-core/src/utils/immutify.rs @@ -52,7 +52,7 @@ pub fn immutify( /// # Examples /// /// ```rust -/// # use cursive::{Cursive, immut1}; +/// # use cursive_core::{Cursive, immut1}; /// # fn main() { /// # let mut siv = Cursive::dummy(); /// let mut i = 0; diff --git a/src/utils/lines/mod.rs b/cursive-core/src/utils/lines/mod.rs similarity index 100% rename from src/utils/lines/mod.rs rename to cursive-core/src/utils/lines/mod.rs diff --git a/src/utils/lines/simple/lines_iterator.rs b/cursive-core/src/utils/lines/simple/lines_iterator.rs similarity index 100% rename from src/utils/lines/simple/lines_iterator.rs rename to cursive-core/src/utils/lines/simple/lines_iterator.rs diff --git a/src/utils/lines/simple/mod.rs b/cursive-core/src/utils/lines/simple/mod.rs similarity index 98% rename from src/utils/lines/simple/mod.rs rename to cursive-core/src/utils/lines/simple/mod.rs index 6c8930a..9c0d022 100644 --- a/src/utils/lines/simple/mod.rs +++ b/cursive-core/src/utils/lines/simple/mod.rs @@ -41,7 +41,7 @@ pub fn make_lines(content: &str, width: usize) -> Vec { /// ``` /// use unicode_segmentation::UnicodeSegmentation; /// -/// # use cursive::utils::lines::simple::prefix; +/// # use cursive_core::utils::lines::simple::prefix; /// let my_text = "blah..."; /// // This returns the number of bytes for a prefix of `my_text` that /// // fits within 5 cells. diff --git a/src/utils/lines/simple/row.rs b/cursive-core/src/utils/lines/simple/row.rs similarity index 100% rename from src/utils/lines/simple/row.rs rename to cursive-core/src/utils/lines/simple/row.rs diff --git a/src/utils/lines/simple/tests.rs b/cursive-core/src/utils/lines/simple/tests.rs similarity index 100% rename from src/utils/lines/simple/tests.rs rename to cursive-core/src/utils/lines/simple/tests.rs diff --git a/src/utils/lines/spans/chunk.rs b/cursive-core/src/utils/lines/spans/chunk.rs similarity index 100% rename from src/utils/lines/spans/chunk.rs rename to cursive-core/src/utils/lines/spans/chunk.rs diff --git a/src/utils/lines/spans/chunk_iterator.rs b/cursive-core/src/utils/lines/spans/chunk_iterator.rs similarity index 100% rename from src/utils/lines/spans/chunk_iterator.rs rename to cursive-core/src/utils/lines/spans/chunk_iterator.rs diff --git a/src/utils/lines/spans/lines_iterator.rs b/cursive-core/src/utils/lines/spans/lines_iterator.rs similarity index 100% rename from src/utils/lines/spans/lines_iterator.rs rename to cursive-core/src/utils/lines/spans/lines_iterator.rs diff --git a/src/utils/lines/spans/mod.rs b/cursive-core/src/utils/lines/spans/mod.rs similarity index 100% rename from src/utils/lines/spans/mod.rs rename to cursive-core/src/utils/lines/spans/mod.rs diff --git a/src/utils/lines/spans/prefix.rs b/cursive-core/src/utils/lines/spans/prefix.rs similarity index 100% rename from src/utils/lines/spans/prefix.rs rename to cursive-core/src/utils/lines/spans/prefix.rs diff --git a/src/utils/lines/spans/row.rs b/cursive-core/src/utils/lines/spans/row.rs similarity index 100% rename from src/utils/lines/spans/row.rs rename to cursive-core/src/utils/lines/spans/row.rs diff --git a/src/utils/lines/spans/segment.rs b/cursive-core/src/utils/lines/spans/segment.rs similarity index 100% rename from src/utils/lines/spans/segment.rs rename to cursive-core/src/utils/lines/spans/segment.rs diff --git a/src/utils/lines/spans/segment_merge_iterator.rs b/cursive-core/src/utils/lines/spans/segment_merge_iterator.rs similarity index 100% rename from src/utils/lines/spans/segment_merge_iterator.rs rename to cursive-core/src/utils/lines/spans/segment_merge_iterator.rs diff --git a/src/utils/lines/spans/tests.rs b/cursive-core/src/utils/lines/spans/tests.rs similarity index 100% rename from src/utils/lines/spans/tests.rs rename to cursive-core/src/utils/lines/spans/tests.rs diff --git a/src/utils/markup/markdown.rs b/cursive-core/src/utils/markup/markdown.rs similarity index 100% rename from src/utils/markup/markdown.rs rename to cursive-core/src/utils/markup/markdown.rs diff --git a/src/utils/markup/mod.rs b/cursive-core/src/utils/markup/mod.rs similarity index 100% rename from src/utils/markup/mod.rs rename to cursive-core/src/utils/markup/mod.rs diff --git a/src/utils/mod.rs b/cursive-core/src/utils/mod.rs similarity index 100% rename from src/utils/mod.rs rename to cursive-core/src/utils/mod.rs diff --git a/src/utils/reader.rs b/cursive-core/src/utils/reader.rs similarity index 96% rename from src/utils/reader.rs rename to cursive-core/src/utils/reader.rs index 16b4660..3688e47 100644 --- a/src/utils/reader.rs +++ b/cursive-core/src/utils/reader.rs @@ -10,7 +10,7 @@ use std::io::{self, Read}; /// /// ```rust,no_run /// use std::io::Read; -/// use cursive::utils::{Counter, ProgressReader}; +/// use cursive_core::utils::{Counter, ProgressReader}; /// /// // Read a file and report the progress /// let file = std::fs::File::open("large_file").unwrap(); diff --git a/src/utils/span.rs b/cursive-core/src/utils/span.rs similarity index 100% rename from src/utils/span.rs rename to cursive-core/src/utils/span.rs diff --git a/src/vec.rs b/cursive-core/src/vec.rs similarity index 92% rename from src/vec.rs rename to cursive-core/src/vec.rs index b5c89a4..01c3ff4 100644 --- a/src/vec.rs +++ b/cursive-core/src/vec.rs @@ -38,7 +38,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; + /// # use cursive_core::Vec2; /// assert!(Vec2::new(9999, 9999) < Vec2::max_value()); /// ``` pub fn max_value() -> Self { @@ -52,7 +52,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; + /// # use cursive_core::Vec2; /// let u = Vec2::new(1, 2); /// let v = Vec2::new(2, 1); /// assert_eq!(u.saturating_sub(v), Vec2::new(0, 1)); @@ -69,8 +69,8 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; - /// # use cursive::XY; + /// # use cursive_core::Vec2; + /// # use cursive_core::XY; /// let u = Vec2::new(1, 2); /// let v = XY::::new(-2, 1); /// assert_eq!(u.saturating_add(v), Vec2::new(0, 3)); @@ -92,7 +92,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; + /// # use cursive_core::Vec2; /// let u = Vec2::new(1, 6); /// let v = Vec2::new(2, 3); /// assert_eq!(u.div_up(v), Vec2::new(1, 2)); @@ -113,7 +113,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; + /// # use cursive_core::Vec2; /// let xy = Vec2::new(1, 2); /// assert_eq!(xy.checked_sub((1, 1)), Some(Vec2::new(0, 1))); /// assert_eq!(xy.checked_sub((2, 2)), None); @@ -132,8 +132,8 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; - /// # use cursive::XY; + /// # use cursive_core::Vec2; + /// # use cursive_core::XY; /// let v: XY = Vec2::new(1, 2).signed().map(|i| i - 5); /// assert_eq!(v, XY::new(-4, -3)); /// @@ -155,7 +155,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; + /// # use cursive_core::Vec2; /// let v = Vec2::new(1, 2); /// assert!(v.fits_in((1, 2))); /// assert!(v.fits_in((3, 3))); @@ -175,7 +175,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; + /// # use cursive_core::Vec2; /// let v = Vec2::new(1, 2); /// assert!(v.fits((1, 2))); /// assert!(v.fits((0, 0))); @@ -203,7 +203,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; + /// # use cursive_core::Vec2; /// assert_eq!(Vec2::max((1, 2), (3, 1)), Vec2::new(3, 2)); /// ``` pub fn max>, B: Into>>(a: A, b: B) -> Self { @@ -217,7 +217,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; + /// # use cursive_core::Vec2; /// assert_eq!(Vec2::min((1, 2), (3, 1)), Vec2::new(1, 1)); /// ``` pub fn min>, B: Into>>(a: A, b: B) -> Self { @@ -289,7 +289,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 2); /// assert_eq!(xy.keep_x(), XY::new(1, 0)); /// ``` @@ -302,7 +302,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 2); /// assert_eq!(xy.keep_y(), XY::new(0, 2)); /// ``` @@ -315,7 +315,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; + /// # use cursive_core::Vec2; /// assert_eq!(Vec2::zero(), Vec2::new(0, 0)); /// ``` pub fn zero() -> Self { @@ -332,7 +332,7 @@ where /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(String::from("a"), String::from("ab")); /// assert_eq!(XY::from(&xy), xy); /// ``` @@ -349,8 +349,8 @@ where /// # Examples /// /// ```rust - /// # use cursive::XY; - /// # use cursive::Vec2; + /// # use cursive_core::XY; + /// # use cursive_core::Vec2; /// let u = Vec2::new(1, 2); /// let v: XY = XY::from(u); /// assert_eq!(v, XY::new(1, 2)); @@ -365,7 +365,7 @@ impl From<(i32, i32)> for XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy: XY = XY::from((-1i32, -2i32)); /// assert_eq!(xy, XY::new(-1, -2)); /// ``` @@ -378,7 +378,7 @@ impl From<(u32, u32)> for XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; + /// # use cursive_core::Vec2; /// let v = Vec2::from((1u32, 2u32)); /// assert_eq!(v, Vec2::new(1, 2)); /// ``` @@ -391,7 +391,7 @@ impl From<(u8, u8)> for XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; + /// # use cursive_core::Vec2; /// let v = Vec2::from((1u8, 2u8)); /// assert_eq!(v, Vec2::new(1, 2)); /// ``` @@ -404,7 +404,7 @@ impl From<(u16, u16)> for XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; + /// # use cursive_core::Vec2; /// let v = Vec2::from((1u16, 2u16)); /// assert_eq!(v, Vec2::new(1, 2)); /// ``` @@ -424,7 +424,7 @@ where /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 2); /// assert_eq!(xy + (2, 3), XY::new(3, 5)); /// ``` @@ -443,7 +443,7 @@ where /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 2); /// assert_eq!(xy - (1, 0), XY::new(0, 2)); /// ``` @@ -458,7 +458,7 @@ impl> Div for XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 4); /// assert_eq!(xy / 2, XY::new(0, 2)); /// ``` @@ -473,7 +473,7 @@ impl Mul for XY { /// # Examples /// /// ```rust - /// # use cursive::Vec2; + /// # use cursive_core::Vec2; /// let v = Vec2::new(1, 2); /// assert_eq!(v * 2, Vec2::new(2, 4)); /// ``` @@ -491,7 +491,7 @@ where /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let u = XY::new(1, 2); /// let v = XY::new(2, 3); /// assert_eq!(u * v, XY::new(2, 6)); @@ -509,7 +509,7 @@ where /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let u = XY::new(2, 3); /// let v = XY::new(1, 2); /// assert_eq!(u / v, XY::new(2, 1)); diff --git a/src/view/any.rs b/cursive-core/src/view/any.rs similarity index 95% rename from src/view/any.rs rename to cursive-core/src/view/any.rs index 816d855..705197d 100644 --- a/src/view/any.rs +++ b/cursive-core/src/view/any.rs @@ -18,8 +18,8 @@ pub trait AnyView { /// # Examples /// /// ```rust - /// # use cursive::views::TextView; - /// # use cursive::view::View; + /// # use cursive_core::views::TextView; + /// # use cursive_core::view::View; /// let boxed: Box = Box::new(TextView::new("text")); /// let text: Box = boxed.as_boxed_any().downcast().unwrap(); /// ``` diff --git a/src/view/finder.rs b/cursive-core/src/view/finder.rs similarity index 100% rename from src/view/finder.rs rename to cursive-core/src/view/finder.rs diff --git a/src/view/into_boxed_view.rs b/cursive-core/src/view/into_boxed_view.rs similarity index 100% rename from src/view/into_boxed_view.rs rename to cursive-core/src/view/into_boxed_view.rs diff --git a/src/view/margins.rs b/cursive-core/src/view/margins.rs similarity index 100% rename from src/view/margins.rs rename to cursive-core/src/view/margins.rs diff --git a/src/view/mod.rs b/cursive-core/src/view/mod.rs similarity index 100% rename from src/view/mod.rs rename to cursive-core/src/view/mod.rs diff --git a/src/view/nameable.rs b/cursive-core/src/view/nameable.rs similarity index 90% rename from src/view/nameable.rs rename to cursive-core/src/view/nameable.rs index 75781f7..664f5c9 100644 --- a/src/view/nameable.rs +++ b/cursive-core/src/view/nameable.rs @@ -12,10 +12,10 @@ pub trait Nameable: View + Sized { /// # Examples /// /// ```rust - /// # use cursive::Cursive; - /// # use cursive::views::TextView; - /// # use cursive::view::Resizable; - /// use cursive::view::Nameable; + /// # use cursive_core::Cursive; + /// # use cursive_core::views::TextView; + /// # use cursive_core::view::Resizable; + /// use cursive_core::view::Nameable; /// /// let mut siv = Cursive::dummy(); /// siv.add_layer( diff --git a/src/view/position.rs b/cursive-core/src/view/position.rs similarity index 100% rename from src/view/position.rs rename to cursive-core/src/view/position.rs diff --git a/src/view/resizable.rs b/cursive-core/src/view/resizable.rs similarity index 100% rename from src/view/resizable.rs rename to cursive-core/src/view/resizable.rs diff --git a/src/view/scroll/core.rs b/cursive-core/src/view/scroll/core.rs similarity index 100% rename from src/view/scroll/core.rs rename to cursive-core/src/view/scroll/core.rs diff --git a/src/view/scroll/mod.rs b/cursive-core/src/view/scroll/mod.rs similarity index 97% rename from src/view/scroll/mod.rs rename to cursive-core/src/view/scroll/mod.rs index 175c53b..4ffd3c1 100644 --- a/src/view/scroll/mod.rs +++ b/cursive-core/src/view/scroll/mod.rs @@ -50,15 +50,15 @@ impl Default for ScrollStrategy { /// Example: /// /// ``` -/// use cursive::{Printer, Vec2, Rect}; -/// use cursive::event::{Event, EventResult}; -/// use cursive::view::{View, scroll}; +/// use cursive_core::{Printer, Vec2, Rect}; +/// use cursive_core::event::{Event, EventResult}; +/// use cursive_core::view::{View, scroll}; /// /// struct MyView { /// core: scroll::Core, /// } /// -/// cursive::impl_scroller!(MyView::core); +/// cursive_core::impl_scroller!(MyView::core); /// /// impl MyView { /// fn inner_on_event(&mut self, event: Event) -> EventResult { diff --git a/src/view/scroll/raw.rs b/cursive-core/src/view/scroll/raw.rs similarity index 100% rename from src/view/scroll/raw.rs rename to cursive-core/src/view/scroll/raw.rs diff --git a/src/view/scroll/strategy.rs b/cursive-core/src/view/scroll/strategy.rs similarity index 100% rename from src/view/scroll/strategy.rs rename to cursive-core/src/view/scroll/strategy.rs diff --git a/src/view/scroll_base.rs b/cursive-core/src/view/scroll_base.rs similarity index 96% rename from src/view/scroll_base.rs rename to cursive-core/src/view/scroll_base.rs index fa32264..d2c4a51 100644 --- a/src/view/scroll_base.rs +++ b/cursive-core/src/view/scroll_base.rs @@ -210,14 +210,10 @@ impl ScrollBase { /// # Examples /// /// ```rust - /// # use cursive::view::ScrollBase; - /// # use cursive::Printer; - /// # use cursive::theme; - /// # use cursive::backend; - /// # let scrollbase = ScrollBase::new(); - /// # let b = backend::dummy::Backend::init(); - /// # let t = theme::load_default(); - /// # let printer = Printer::new((5,1), &t, &*b); + /// # let scrollbase = cursive_core::view::ScrollBase::new(); + /// # let b = cursive_core::backend::Dummy::init(); + /// # let t = cursive_core::theme::load_default(); + /// # let printer = &cursive_core::Printer::new((5,1), &t, &*b); /// # let printer = &printer; /// let lines = ["Line 1", "Line number 2"]; /// scrollbase.draw(printer, |printer, i| { diff --git a/src/view/scrollable.rs b/cursive-core/src/view/scrollable.rs similarity index 100% rename from src/view/scrollable.rs rename to cursive-core/src/view/scrollable.rs diff --git a/src/view/size_cache.rs b/cursive-core/src/view/size_cache.rs similarity index 100% rename from src/view/size_cache.rs rename to cursive-core/src/view/size_cache.rs diff --git a/src/view/size_constraint.rs b/cursive-core/src/view/size_constraint.rs similarity index 100% rename from src/view/size_constraint.rs rename to cursive-core/src/view/size_constraint.rs diff --git a/src/view/view_path.rs b/cursive-core/src/view/view_path.rs similarity index 100% rename from src/view/view_path.rs rename to cursive-core/src/view/view_path.rs diff --git a/src/view/view_trait.rs b/cursive-core/src/view/view_trait.rs similarity index 100% rename from src/view/view_trait.rs rename to cursive-core/src/view/view_trait.rs diff --git a/src/view/view_wrapper.rs b/cursive-core/src/view/view_wrapper.rs similarity index 92% rename from src/view/view_wrapper.rs rename to cursive-core/src/view/view_wrapper.rs index 633f10e..15c18bd 100644 --- a/src/view/view_wrapper.rs +++ b/cursive-core/src/view/view_wrapper.rs @@ -154,13 +154,13 @@ impl View for T { /// # Examples /// /// ```rust -/// # use cursive::view::{View,ViewWrapper}; +/// # use cursive_core::view::{View,ViewWrapper}; /// struct FooView { /// view: T, /// } /// /// impl ViewWrapper for FooView { -/// cursive::wrap_impl!(self.view: T); +/// cursive_core::wrap_impl!(self.view: T); /// } /// # fn main() { } /// ``` @@ -170,18 +170,23 @@ macro_rules! wrap_impl { type V = $t; fn with_view(&self, f: F) -> Option - where F: FnOnce(&Self::V) -> R + where + F: FnOnce(&Self::V) -> R, { Some(f(&self.$v)) } fn with_view_mut(&mut self, f: F) -> Option - where F: FnOnce(&mut Self::V) -> R + where + F: FnOnce(&mut Self::V) -> R, { Some(f(&mut self.$v)) } - fn into_inner(self) -> Result where Self::V: Sized { + fn into_inner(self) -> Result + where + Self::V: Sized, + { Ok(self.$v) } }; @@ -198,17 +203,17 @@ macro_rules! wrap_impl { /// # Examples /// /// ```rust -/// # use cursive::view::{View, ViewWrapper}; +/// # use cursive_core::view::{View, ViewWrapper}; /// struct FooView { /// view: T, /// } /// /// impl FooView { -/// cursive::inner_getters!(self.view: T); +/// cursive_core::inner_getters!(self.view: T); /// } /// /// impl ViewWrapper for FooView { -/// cursive::wrap_impl!(self.view: T); +/// cursive_core::wrap_impl!(self.view: T); /// } /// # fn main() { } /// ``` @@ -223,5 +228,5 @@ macro_rules! inner_getters { pub fn get_inner_mut(&mut self) -> &mut $t { &mut self.$v } - } + }; } diff --git a/src/views/boxed_view.rs b/cursive-core/src/views/boxed_view.rs similarity index 100% rename from src/views/boxed_view.rs rename to cursive-core/src/views/boxed_view.rs diff --git a/src/views/button.rs b/cursive-core/src/views/button.rs similarity index 97% rename from src/views/button.rs rename to cursive-core/src/views/button.rs index c0e4018..e913252 100644 --- a/src/views/button.rs +++ b/cursive-core/src/views/button.rs @@ -15,7 +15,7 @@ use unicode_width::UnicodeWidthStr; /// # Examples /// /// ``` -/// use cursive::views::Button; +/// use cursive_core::views::Button; /// /// let quit_button = Button::new("Quit", |s| s.quit()); /// ``` @@ -44,7 +44,7 @@ impl Button { /// # Examples /// /// ``` - /// use cursive::views::Button; + /// use cursive_core::views::Button; /// /// let button = Button::new_raw("[ Quit ]", |s| s.quit()); /// ``` @@ -107,7 +107,7 @@ impl Button { /// # Examples /// /// ```rust - /// # use cursive::views::Button; + /// # use cursive_core::views::Button; /// let button = Button::new("Quit", |s| s.quit()); /// assert_eq!(button.label(), ""); /// ``` @@ -122,7 +122,7 @@ impl Button { /// # Examples /// /// ``` - /// use cursive::views::Button; + /// use cursive_core::views::Button; /// /// let mut button = Button::new("Quit", |s| s.quit()); /// button.set_label("Escape"); diff --git a/src/views/canvas.rs b/cursive-core/src/views/canvas.rs similarity index 98% rename from src/views/canvas.rs rename to cursive-core/src/views/canvas.rs index 9729726..5c5b33d 100644 --- a/src/views/canvas.rs +++ b/cursive-core/src/views/canvas.rs @@ -16,8 +16,8 @@ type CallOnAny = Box FnMut(&mut T, &Selector, AnyCb<'a>)>; /// # Examples /// /// ```rust -/// use cursive::views::{Canvas, Dialog}; -/// use cursive::event::{Event, EventResult, Key}; +/// use cursive_core::views::{Canvas, Dialog}; +/// use cursive_core::event::{Event, EventResult, Key}; /// use unicode_width::UnicodeWidthStr; // To get the width of some text. /// /// // Build a canvas around a string. diff --git a/src/views/checkbox.rs b/cursive-core/src/views/checkbox.rs similarity index 96% rename from src/views/checkbox.rs rename to cursive-core/src/views/checkbox.rs index 81c7259..5b1ebb8 100644 --- a/src/views/checkbox.rs +++ b/cursive-core/src/views/checkbox.rs @@ -13,8 +13,8 @@ use std::rc::Rc; /// # Examples /// /// ``` -/// use cursive::views::Checkbox; -/// use cursive::traits::Identifiable; +/// use cursive_core::views::Checkbox; +/// use cursive_core::traits::Identifiable; /// /// let checkbox = Checkbox::new().checked().with_name("check"); /// ``` @@ -82,7 +82,7 @@ impl Checkbox { /// # Examples /// /// ``` - /// use cursive::views::Checkbox; + /// use cursive_core::views::Checkbox; /// /// let mut checkbox = Checkbox::new().checked(); /// assert!(checkbox.is_checked()); diff --git a/src/views/circular_focus.rs b/cursive-core/src/views/circular_focus.rs similarity index 100% rename from src/views/circular_focus.rs rename to cursive-core/src/views/circular_focus.rs diff --git a/src/views/debug_view.rs b/cursive-core/src/views/debug_view.rs similarity index 100% rename from src/views/debug_view.rs rename to cursive-core/src/views/debug_view.rs diff --git a/src/views/dialog.rs b/cursive-core/src/views/dialog.rs similarity index 98% rename from src/views/dialog.rs rename to cursive-core/src/views/dialog.rs index bc2f3bc..2d868a2 100644 --- a/src/views/dialog.rs +++ b/cursive-core/src/views/dialog.rs @@ -44,7 +44,7 @@ impl ChildButton { /// # Examples /// /// ``` -/// # use cursive::views::{Dialog,TextView}; +/// # use cursive_core::views::{Dialog,TextView}; /// let dialog = Dialog::around(TextView::new("Hello!")) /// .button("Ok", |s| s.quit()); /// ``` @@ -110,7 +110,7 @@ impl Dialog { /// # Examples /// /// ``` - /// use cursive::views::{Dialog, TextView}; + /// use cursive_core::views::{Dialog, TextView}; /// /// let dialog = Dialog::new() /// .content(TextView::new("Hello!")) @@ -123,7 +123,7 @@ impl Dialog { /// Gets the content of this dialog. /// /// ``` - /// use cursive::views::{Dialog, TextView}; + /// use cursive_core::views::{Dialog, TextView}; /// let dialog = Dialog::around(TextView::new("Hello!")); /// let text_view: &TextView = dialog /// .get_content() @@ -154,7 +154,7 @@ impl Dialog { /// # Examples /// /// ``` - /// use cursive::views::Dialog; + /// use cursive_core::views::Dialog; /// /// let dialog = Dialog::text("Hello!") /// .button("Quit", |s| s.quit()); @@ -170,7 +170,7 @@ impl Dialog { /// # Examples /// /// ``` - /// use cursive::views::Dialog; + /// use cursive_core::views::Dialog; /// /// let dialog = Dialog::info("Some very important information!"); /// ``` @@ -245,7 +245,7 @@ impl Dialog { /// # Examples /// /// ``` - /// use cursive::views::Dialog; + /// use cursive_core::views::Dialog; /// /// let dialog = Dialog::text("Hello!") /// .dismiss_button("Close"); @@ -263,7 +263,7 @@ impl Dialog { /// # Examples /// /// ``` - /// use cursive::views::Dialog; + /// use cursive_core::views::Dialog; /// /// let dialog = Dialog::info("Some info") /// .title("Read me!"); @@ -294,8 +294,8 @@ impl Dialog { /// /// # Examples /// ``` - /// use cursive::views::Dialog; - /// use cursive::view::Margins; + /// use cursive_core::views::Dialog; + /// use cursive_core::view::Margins; /// /// let dialog = Dialog::info("Hello!") /// .padding(Margins::lrtb(1, 1, 0, 0)); // (Left, Right, Top, Bottom) diff --git a/src/views/dummy.rs b/cursive-core/src/views/dummy.rs similarity index 100% rename from src/views/dummy.rs rename to cursive-core/src/views/dummy.rs diff --git a/src/views/edit_view.rs b/cursive-core/src/views/edit_view.rs similarity index 98% rename from src/views/edit_view.rs rename to cursive-core/src/views/edit_view.rs index eb07a39..d2b35a3 100644 --- a/src/views/edit_view.rs +++ b/cursive-core/src/views/edit_view.rs @@ -31,9 +31,9 @@ pub type OnSubmit = dyn Fn(&mut Cursive, &str); /// [1]: https://github.com/gyscos/cursive/blob/master/examples/edit.rs /// /// ```rust -/// # use cursive::Cursive; -/// # use cursive::traits::*; -/// # use cursive::views::{Dialog, EditView, TextView}; +/// # use cursive_core::Cursive; +/// # use cursive_core::traits::*; +/// # use cursive_core::views::{Dialog, EditView, TextView}; /// let mut siv = Cursive::dummy(); /// /// // Create a dialog with an edit text and a button. @@ -174,7 +174,7 @@ impl EditView { /// # Examples /// /// ```rust - /// # use cursive::views::EditView; + /// # use cursive_core::views::EditView; /// let edit = EditView::new().filler(" "); /// ``` pub fn filler>(self, filler: S) -> Self { @@ -269,7 +269,7 @@ impl EditView { /// # Examples /// /// ``` - /// use cursive::views::{TextContent, TextView, EditView}; + /// use cursive_core::views::{TextContent, TextView, EditView}; /// // Keep the length of the text in a separate view. /// let mut content = TextContent::new("0"); /// let text_view = TextView::new_with_content(content.clone()); @@ -343,7 +343,7 @@ impl EditView { /// # Examples /// /// ``` - /// use cursive::views::{Dialog, EditView}; + /// use cursive_core::views::{Dialog, EditView}; /// /// let edit_view = EditView::new() /// .on_submit(|s, text| { diff --git a/src/views/enableable_view.rs b/cursive-core/src/views/enableable_view.rs similarity index 91% rename from src/views/enableable_view.rs rename to cursive-core/src/views/enableable_view.rs index fa2fc79..991f953 100644 --- a/src/views/enableable_view.rs +++ b/cursive-core/src/views/enableable_view.rs @@ -9,9 +9,9 @@ use crate::Printer; /// # Examples /// /// ``` -/// use cursive::Cursive; -/// use cursive::views::{Button, EnableableView, Checkbox, LinearLayout}; -/// use cursive::traits::Identifiable; +/// use cursive_core::Cursive; +/// use cursive_core::views::{Button, EnableableView, Checkbox, LinearLayout}; +/// use cursive_core::traits::Identifiable; /// /// let mut siv = Cursive::dummy(); /// diff --git a/src/views/hideable_view.rs b/cursive-core/src/views/hideable_view.rs similarity index 100% rename from src/views/hideable_view.rs rename to cursive-core/src/views/hideable_view.rs diff --git a/src/views/last_size_view.rs b/cursive-core/src/views/last_size_view.rs similarity index 100% rename from src/views/last_size_view.rs rename to cursive-core/src/views/last_size_view.rs diff --git a/src/views/layer.rs b/cursive-core/src/views/layer.rs similarity index 100% rename from src/views/layer.rs rename to cursive-core/src/views/layer.rs diff --git a/src/views/linear_layout.rs b/cursive-core/src/views/linear_layout.rs similarity index 99% rename from src/views/linear_layout.rs rename to cursive-core/src/views/linear_layout.rs index a611010..f07b883 100644 --- a/src/views/linear_layout.rs +++ b/cursive-core/src/views/linear_layout.rs @@ -15,8 +15,8 @@ use std::ops::Deref; /// # Examples /// /// ``` -/// use cursive::views::{Button, LinearLayout, TextView, TextArea}; -/// use cursive::traits::Boxable; +/// use cursive_core::views::{Button, LinearLayout, TextView, TextArea}; +/// use cursive_core::traits::Boxable; /// /// let linear_layout = LinearLayout::horizontal() /// .child(TextView::new("Top of the page")) diff --git a/src/views/list_view.rs b/cursive-core/src/views/list_view.rs similarity index 100% rename from src/views/list_view.rs rename to cursive-core/src/views/list_view.rs diff --git a/src/views/menu_popup.rs b/cursive-core/src/views/menu_popup.rs similarity index 100% rename from src/views/menu_popup.rs rename to cursive-core/src/views/menu_popup.rs diff --git a/src/views/menubar.rs b/cursive-core/src/views/menubar.rs similarity index 100% rename from src/views/menubar.rs rename to cursive-core/src/views/menubar.rs diff --git a/src/views/mod.rs b/cursive-core/src/views/mod.rs similarity index 98% rename from src/views/mod.rs rename to cursive-core/src/views/mod.rs index d9ebfb2..4a8e42f 100644 --- a/src/views/mod.rs +++ b/cursive-core/src/views/mod.rs @@ -10,7 +10,7 @@ /// } /// /// impl MyView { -/// cursive::impl_enabled!(self.enabled); +/// cursive_core::impl_enabled!(self.enabled); /// } /// /// let view = MyView { enabled: true }; @@ -19,7 +19,6 @@ #[macro_export] macro_rules! impl_enabled { (self.$x:ident) => { - /// Disables this view. /// /// A disabled view cannot be selected. @@ -49,7 +48,7 @@ macro_rules! impl_enabled { pub fn is_enabled(&self) -> bool { self.$x } - } + }; } mod boxed_view; diff --git a/src/views/named_view.rs b/cursive-core/src/views/named_view.rs similarity index 100% rename from src/views/named_view.rs rename to cursive-core/src/views/named_view.rs diff --git a/src/views/on_event_view.rs b/cursive-core/src/views/on_event_view.rs similarity index 96% rename from src/views/on_event_view.rs rename to cursive-core/src/views/on_event_view.rs index 157311b..64fcdbe 100644 --- a/src/views/on_event_view.rs +++ b/cursive-core/src/views/on_event_view.rs @@ -32,8 +32,8 @@ use std::rc::Rc; /// # Examples /// /// ``` -/// # use cursive::event;; -/// # use cursive::views::{OnEventView, TextView}; +/// # use cursive_core::event;; +/// # use cursive_core::views::{OnEventView, TextView}; /// let view = OnEventView::new(TextView::new("This view has an event!")) /// .on_event('q', |s| s.quit()) /// .on_event(event::Key::Esc, |s| s.quit()); @@ -92,8 +92,8 @@ impl OnEventView { /// /// /// ```rust - /// # use cursive::views::{OnEventView, DummyView}; - /// # use cursive::event::{Key, EventTrigger}; + /// # use cursive_core::views::{OnEventView, DummyView}; + /// # use cursive_core::event::{Key, EventTrigger}; /// let view = OnEventView::new(DummyView) /// .on_event('q', |s| s.quit()) /// .on_event(Key::Esc, |s| { @@ -158,8 +158,8 @@ impl OnEventView { /// # Examples /// /// ```rust - /// # use cursive::views::{DummyView, OnEventView}; - /// # use cursive::event::{Event, EventTrigger, MouseEvent, EventResult}; + /// # use cursive_core::views::{DummyView, OnEventView}; + /// # use cursive_core::event::{Event, EventTrigger, MouseEvent, EventResult}; /// let view = OnEventView::new(DummyView) /// .on_event_inner( /// EventTrigger::mouse(), diff --git a/src/views/padded_view.rs b/cursive-core/src/views/padded_view.rs similarity index 97% rename from src/views/padded_view.rs rename to cursive-core/src/views/padded_view.rs index 26dcc22..55b28b1 100644 --- a/src/views/padded_view.rs +++ b/cursive-core/src/views/padded_view.rs @@ -12,7 +12,7 @@ use crate::Vec2; /// # Examples /// /// ```rust -/// # use cursive::views::{TextView, PaddedView}; +/// # use cursive_core::views::{TextView, PaddedView}; /// // Adds 2 columns of padding to the left and to the right. /// let view = PaddedView::lrtb( /// 2,2,0,0, // Left, Right, Top, Bottom diff --git a/src/views/panel.rs b/cursive-core/src/views/panel.rs similarity index 100% rename from src/views/panel.rs rename to cursive-core/src/views/panel.rs diff --git a/src/views/progress_bar.rs b/cursive-core/src/views/progress_bar.rs similarity index 99% rename from src/views/progress_bar.rs rename to cursive-core/src/views/progress_bar.rs index 1a6a015..a36bb8a 100644 --- a/src/views/progress_bar.rs +++ b/cursive-core/src/views/progress_bar.rs @@ -23,7 +23,7 @@ use std::thread; /// # Example /// /// ``` -/// # use cursive::views::ProgressBar; +/// # use cursive_core::views::ProgressBar; /// let bar = ProgressBar::new() /// .with_task(|counter| { /// // This closure is called in parallel. diff --git a/src/views/radio.rs b/cursive-core/src/views/radio.rs similarity index 100% rename from src/views/radio.rs rename to cursive-core/src/views/radio.rs diff --git a/src/views/resized_view.rs b/cursive-core/src/views/resized_view.rs similarity index 99% rename from src/views/resized_view.rs rename to cursive-core/src/views/resized_view.rs index 77a6932..f382bc7 100644 --- a/src/views/resized_view.rs +++ b/cursive-core/src/views/resized_view.rs @@ -16,7 +16,7 @@ use crate::XY; /// # Examples /// /// ``` -/// use cursive::views::{ResizedView, TextView}; +/// use cursive_core::views::{ResizedView, TextView}; /// /// // Creates a 20x4 ResizedView with a TextView content. /// let view = ResizedView::with_fixed_size((20,4), TextView::new("Hello!")); diff --git a/src/views/screens_view.rs b/cursive-core/src/views/screens_view.rs similarity index 100% rename from src/views/screens_view.rs rename to cursive-core/src/views/screens_view.rs diff --git a/src/views/scroll_view.rs b/cursive-core/src/views/scroll_view.rs similarity index 100% rename from src/views/scroll_view.rs rename to cursive-core/src/views/scroll_view.rs diff --git a/src/views/select_view.rs b/cursive-core/src/views/select_view.rs similarity index 97% rename from src/views/select_view.rs rename to cursive-core/src/views/select_view.rs index 66af462..5f51034 100644 --- a/src/views/select_view.rs +++ b/cursive-core/src/views/select_view.rs @@ -25,9 +25,9 @@ use std::rc::Rc; /// # Examples /// /// ```rust -/// # use cursive::Cursive; -/// # use cursive::views::{SelectView, Dialog, TextView}; -/// # use cursive::align::HAlign; +/// # use cursive_core::Cursive; +/// # use cursive_core::views::{SelectView, Dialog, TextView}; +/// # use cursive_core::align::HAlign; /// let mut time_select = SelectView::new().h_align(HAlign::Center); /// time_select.add_item("Short", 1); /// time_select.add_item("Medium", 5); @@ -175,8 +175,8 @@ impl SelectView { /// # Examples /// /// ``` - /// use cursive::traits::Identifiable; - /// use cursive::views::{TextView, SelectView}; + /// use cursive_core::traits::Identifiable; + /// use cursive_core::views::{TextView, SelectView}; /// /// let text_view = TextView::new("").with_name("text"); /// @@ -231,7 +231,7 @@ impl SelectView { /// # Examples /// /// ``` - /// use cursive::views::{Dialog, SelectView}; + /// use cursive_core::views::{Dialog, SelectView}; /// /// let select_view = SelectView::new() /// .item("One", 1) @@ -260,8 +260,8 @@ impl SelectView { /// # Examples /// /// ``` - /// use cursive::align; - /// use cursive::views::SelectView; + /// use cursive_core::align; + /// use cursive_core::views::SelectView; /// /// let select_view = SelectView::new() /// .item("One", 1) @@ -311,7 +311,7 @@ impl SelectView { /// # Examples /// /// ``` - /// use cursive::views::SelectView; + /// use cursive_core::views::SelectView; /// /// let mut select_view = SelectView::new(); /// @@ -325,8 +325,8 @@ impl SelectView { /// Gets an item at given idx or None. /// /// ``` - /// use cursive::Cursive; - /// use cursive::views::{SelectView, TextView}; + /// use cursive_core::Cursive; + /// use cursive_core::views::{SelectView, TextView}; /// let select = SelectView::new() /// .item("Short", 1); /// assert_eq!(select.get_item(0), Some(("Short", &1))); @@ -391,7 +391,7 @@ impl SelectView { /// # Examples /// /// ``` - /// use cursive::views::SelectView; + /// use cursive_core::views::SelectView; /// /// let select_view = SelectView::new() /// .item("Item 1", 1) @@ -420,7 +420,7 @@ impl SelectView { /// # Examples /// /// ``` - /// use cursive::views::SelectView; + /// use cursive_core::views::SelectView; /// /// // Create a SelectView with 100 items /// let select_view = SelectView::new() @@ -463,7 +463,7 @@ impl SelectView { /// # Examples /// /// ``` - /// use cursive::views::SelectView; + /// use cursive_core::views::SelectView; /// /// let select_view = SelectView::new() /// .item("Item 1", 1) @@ -481,7 +481,7 @@ impl SelectView { /// # Examples /// /// ``` - /// use cursive::views::SelectView; + /// use cursive_core::views::SelectView; /// /// let mut select_view = SelectView::new(); /// assert!(select_view.is_empty()); @@ -581,8 +581,8 @@ impl SelectView { /// You should run this callback with a `&mut Cursive`: /// /// ```rust - /// # use cursive::Cursive; - /// # use cursive::views::SelectView; + /// # use cursive_core::Cursive; + /// # use cursive_core::views::SelectView; /// fn select_up(siv: &mut Cursive, view: &mut SelectView<()>) { /// let cb = view.select_up(1); /// cb(siv); @@ -789,7 +789,7 @@ impl SelectView { /// # Examples /// /// ``` - /// use cursive::views::SelectView; + /// use cursive_core::views::SelectView; /// /// let select_view = SelectView::new() /// .item_str("Paris") @@ -814,7 +814,7 @@ impl SelectView { /// # Examples /// /// ``` - /// # use cursive::views::SelectView; + /// # use cursive_core::views::SelectView; /// let mut select_view = SelectView::new(); /// select_view.add_all_str(vec!["a", "b", "c"]); /// ``` @@ -835,7 +835,7 @@ impl SelectView { /// # Examples /// /// ``` - /// use cursive::views::SelectView; + /// use cursive_core::views::SelectView; /// /// let text = "..."; // Maybe read some config file /// diff --git a/src/views/shadow_view.rs b/cursive-core/src/views/shadow_view.rs similarity index 100% rename from src/views/shadow_view.rs rename to cursive-core/src/views/shadow_view.rs diff --git a/src/views/slider_view.rs b/cursive-core/src/views/slider_view.rs similarity index 99% rename from src/views/slider_view.rs rename to cursive-core/src/views/slider_view.rs index 731b199..455ec62 100644 --- a/src/views/slider_view.rs +++ b/cursive-core/src/views/slider_view.rs @@ -14,7 +14,7 @@ use std::rc::Rc; /// # Examples /// /// ``` -/// use cursive::views::{Dialog, SliderView}; +/// use cursive_core::views::{Dialog, SliderView}; /// /// let slider_view = SliderView::horizontal(10) /// .on_change(|s, n| if n == 5 { diff --git a/src/views/stack_view.rs b/cursive-core/src/views/stack_view.rs similarity index 99% rename from src/views/stack_view.rs rename to cursive-core/src/views/stack_view.rs index 206e900..1974adb 100644 --- a/src/views/stack_view.rs +++ b/cursive-core/src/views/stack_view.rs @@ -308,8 +308,8 @@ impl StackView { /// # Examples /// /// ```rust - /// # use cursive::views::{TextView, StackView, Dialog, LayerPosition}; - /// # use cursive::view::Identifiable; + /// # use cursive_core::views::{TextView, StackView, Dialog, LayerPosition}; + /// # use cursive_core::view::Identifiable; /// let mut stack = StackView::new(); /// stack.add_layer(TextView::new("Back")); /// stack.add_layer(Dialog::around(TextView::new("Middle").with_name("text"))); diff --git a/src/views/text_area.rs b/cursive-core/src/views/text_area.rs similarity index 99% rename from src/views/text_area.rs rename to cursive-core/src/views/text_area.rs index f076218..bd52719 100644 --- a/src/views/text_area.rs +++ b/cursive-core/src/views/text_area.rs @@ -20,8 +20,8 @@ use unicode_width::UnicodeWidthStr; /// # Examples /// /// ``` -/// use cursive::traits::{Resizable, Identifiable}; -/// use cursive::views::TextArea; +/// use cursive_core::traits::{Resizable, Identifiable}; +/// use cursive_core::views::TextArea; /// /// let text_area = TextArea::new() /// .content("Write description here...") diff --git a/src/views/text_view.rs b/cursive-core/src/views/text_view.rs similarity index 98% rename from src/views/text_view.rs rename to cursive-core/src/views/text_view.rs index 0901e5c..59b9116 100644 --- a/src/views/text_view.rs +++ b/cursive-core/src/views/text_view.rs @@ -22,7 +22,7 @@ type InnerContentType = Arc; /// # Examples /// /// ```rust -/// # use cursive::views::{TextView, TextContent}; +/// # use cursive_core::views::{TextView, TextContent}; /// let mut content = TextContent::new("content"); /// let view = TextView::new_with_content(content.clone()); /// @@ -170,8 +170,8 @@ impl TextContentInner { /// # Examples /// /// ```rust -/// # use cursive::Cursive; -/// # use cursive::views::TextView; +/// # use cursive_core::Cursive; +/// # use cursive_core::views::TextView; /// let mut siv = Cursive::dummy(); /// /// siv.add_layer(TextView::new("Hello world!")); @@ -209,7 +209,7 @@ impl TextView { /// # Examples /// /// ```rust - /// # use cursive::views::{TextView, TextContent}; + /// # use cursive_core::views::{TextView, TextContent}; /// let mut content = TextContent::new("content"); /// let view = TextView::new_with_content(content.clone()); /// diff --git a/src/views/tracked_view.rs b/cursive-core/src/views/tracked_view.rs similarity index 100% rename from src/views/tracked_view.rs rename to cursive-core/src/views/tracked_view.rs diff --git a/src/with.rs b/cursive-core/src/with.rs similarity index 100% rename from src/with.rs rename to cursive-core/src/with.rs diff --git a/src/xy.rs b/cursive-core/src/xy.rs similarity index 91% rename from src/xy.rs rename to cursive-core/src/xy.rs index 5fbd58a..00abe0b 100644 --- a/src/xy.rs +++ b/cursive-core/src/xy.rs @@ -31,7 +31,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 2); /// assert_eq!(xy.swap(), XY::new(2, 1)); /// ``` @@ -44,7 +44,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 2); /// /// assert_eq!(xy.fold(std::ops::Add::add), 3); @@ -63,7 +63,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 2); /// /// assert_eq!(xy.map(|v| v * 2), XY::new(2, 4)); @@ -83,7 +83,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 2); /// let cond = XY::new(true, false); /// @@ -104,7 +104,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 2); /// let cond = XY::new(true, false); /// @@ -122,7 +122,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 2); /// assert_eq!(xy.map_x(|x| x * 10), XY::new(10, 2)); /// ``` @@ -138,7 +138,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 2); /// assert_eq!(xy.map_y(|y| y * 10), XY::new(1, 20)); /// ``` @@ -154,7 +154,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 2); /// let (x, y) = xy.pair(); /// assert_eq!((x, y), (1, 2)); @@ -168,7 +168,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// fn longer(xy: &XY, l: usize) -> XY { /// // `XY::map` takes ownership /// // So we need to get a XY<&String> from a &XY @@ -189,7 +189,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 2); /// let vec: Vec = xy.iter().map(|&i| i > 1).collect(); /// assert_eq!(vec, vec![false, true]); @@ -203,8 +203,8 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; - /// # use cursive::direction::Orientation; + /// # use cursive_core::XY; + /// # use cursive_core::direction::Orientation; /// let xy = XY::new(1, 2); /// assert_eq!(xy.get(Orientation::Horizontal), &1); /// assert_eq!(xy.get(Orientation::Vertical), &2); @@ -221,8 +221,8 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; - /// # use cursive::direction::Orientation; + /// # use cursive_core::XY; + /// # use cursive_core::direction::Orientation; /// let mut xy = XY::new(1, 2); /// *xy.get_mut(Orientation::Horizontal) = 10; /// @@ -240,7 +240,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let a = XY::new(1, 2); /// let b = XY::new(true, false); /// assert_eq!(a.zip(b), XY::new((1, true), (2, false))); @@ -254,7 +254,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let a = XY::new(1, 2); /// let b = XY::new(true, false); /// let c = XY::new("x", "y"); @@ -269,7 +269,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let a = XY::new(1, 2); /// let b = XY::new(true, false); /// let c = XY::new("x", "y"); @@ -293,7 +293,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let a = XY::new(1, 2); /// let b = XY::new(true, false); /// let c = XY::new("x", "y"); @@ -325,7 +325,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let a = XY::new((1, 10), (2, 20)); /// let b = XY::new(true, false); /// let xy = a.zip_map(b, |(a1, a2), b| if b { a1 } else { a2 }); @@ -343,7 +343,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(1, 2); /// let cond = XY::new(true, false); /// @@ -360,8 +360,8 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; - /// # use cursive::direction::Orientation; + /// # use cursive_core::XY; + /// # use cursive_core::direction::Orientation; /// let xy = XY::new(1, 2).with_axis(Orientation::Horizontal, 42); /// /// assert_eq!(xy, XY::new(42, 2)); @@ -377,8 +377,8 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; - /// # use cursive::direction::Orientation; + /// # use cursive_core::XY; + /// # use cursive_core::direction::Orientation; /// let other = XY::new(3, 4); /// let xy = XY::new(1, 2).with_axis_from(Orientation::Horizontal, &other); /// @@ -395,8 +395,8 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; - /// # use cursive::direction::Orientation; + /// # use cursive_core::XY; + /// # use cursive_core::direction::Orientation; /// let mut xy = XY::new(1, 2); /// let other = XY::new(3, 4); /// xy.set_axis_from(Orientation::Horizontal, &other); @@ -412,7 +412,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::both_from(42); /// /// assert_eq!(xy, XY::new(42, 42)); @@ -430,7 +430,7 @@ impl XY> { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let xy = XY::new(Some(1), None); /// assert_eq!(xy.unwrap_or(XY::new(10, 20)), XY::new(1, 20)); /// ``` @@ -446,7 +446,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// assert_eq!(XY::new(true, false).any(), true); /// assert_eq!(XY::new(false, false).any(), false); /// assert_eq!(XY::new('a', 'b').map(|c| c == 'a').any(), true); @@ -462,7 +462,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// assert_eq!(XY::new(true, false).both(), false); /// assert_eq!(XY::new(true, true).both(), true); /// assert_eq!(XY::new("abc", "de").map(|s| s.len() > 2).both(), false); @@ -477,7 +477,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let choice = XY::new(true, false); /// let values = XY::new(1, 2); /// let selection = choice.select(values); @@ -493,7 +493,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let choice = XY::new(true, false); /// let values = XY::new(1, 2); /// let fallback = XY::new(3, 4); @@ -510,7 +510,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let a = XY::new(true, false); /// let b = XY::new(true, true); /// assert_eq!(a.and(b), XY::new(true, false)); @@ -524,7 +524,7 @@ impl XY { /// # Examples /// /// ```rust - /// # use cursive::XY; + /// # use cursive_core::XY; /// let a = XY::new(true, false); /// let b = XY::new(true, true); /// assert_eq!(a.or(b), XY::new(true, true)); diff --git a/cursive/Cargo.toml b/cursive/Cargo.toml new file mode 100644 index 0000000..f746114 --- /dev/null +++ b/cursive/Cargo.toml @@ -0,0 +1,70 @@ +[package] +authors = ["Alexandre Bury "] +categories = ["command-line-interface", "gui"] +description = "A TUI (Text User Interface) library focused on ease-of-use." +documentation = "https://docs.rs/cursive" +exclude = ["doc/**", "assets/**", "examples/**"] +keywords = ["ncurses", "TUI", "UI"] +license = "MIT" +name = "cursive" +readme = "Readme.md" +repository = "https://github.com/gyscos/cursive" +version = "0.15.0-alpha.0" +edition = "2018" + +[dependencies] +cursive_core = { path = "../cursive-core" } +crossbeam-channel = "0.4.0" +cfg-if = "0.1.9" +enumset = "1.0.0" +unicode-segmentation = "1.3.0" +unicode-width = "0.1.5" +lazy_static = "1" +libc = "0.2.60" +term_size = { version = "0.3", optional = true } +maplit = { version = "1.0", optional = true } +log = "0.4.8" +ahash = "0.3.2" + +[dependencies.bear-lib-terminal] +optional = true +version = "2.0.0" + +[dependencies.ncurses] +features = ["wide"] +optional = true +version = "5.99.0" + +[dependencies.pancurses] +features = ["wide"] +optional = true +version = "0.16.1" + +[dependencies.termion] +optional = true +version = "1.5.3" + +[dependencies.crossterm] +optional = true +version = "0.17" + +[dev-dependencies] +rand = "0.7.0" +pretty-bytes = "0.2.2" +atty = "0.2.13" + +[features] +blt-backend = ["bear-lib-terminal"] +default = ["ncurses-backend"] +ncurses-backend = ["ncurses", "maplit", "term_size"] +pancurses-backend = ["pancurses", "maplit", "term_size"] +termion-backend = ["termion"] +crossterm-backend = ["crossterm"] +markdown = ["cursive_core/markdown"] +unstable_scroll = ["cursive_core/unstable_scroll"] + +[lib] +name = "cursive" + +[target.'cfg(unix)'.dependencies] +signal-hook = "0.1" diff --git a/assets/cities.txt b/cursive/assets/cities.txt similarity index 100% rename from assets/cities.txt rename to cursive/assets/cities.txt diff --git a/assets/lorem.txt b/cursive/assets/lorem.txt similarity index 100% rename from assets/lorem.txt rename to cursive/assets/lorem.txt diff --git a/assets/style.toml b/cursive/assets/style.toml similarity index 100% rename from assets/style.toml rename to cursive/assets/style.toml diff --git a/examples/Readme.md b/cursive/examples/Readme.md similarity index 100% rename from examples/Readme.md rename to cursive/examples/Readme.md diff --git a/examples/colors.rs b/cursive/examples/colors.rs similarity index 96% rename from examples/colors.rs rename to cursive/examples/colors.rs index a385f38..94d9247 100644 --- a/examples/colors.rs +++ b/cursive/examples/colors.rs @@ -1,7 +1,7 @@ use cursive::theme::{Color, ColorStyle}; use cursive::view::Boxable; use cursive::views::Canvas; -use cursive::{Cursive, Printer}; +use cursive::Printer; // This example will draw a colored square with a gradient. // @@ -16,7 +16,7 @@ use cursive::{Cursive, Printer}; fn main() { // Start as usual - let mut siv = Cursive::default(); + let mut siv = cursive::default(); siv.add_global_callback('q', |s| s.quit()); // Canvas lets us easily override any method. diff --git a/examples/debug_console.rs b/cursive/examples/debug_console.rs similarity index 93% rename from examples/debug_console.rs rename to cursive/examples/debug_console.rs index 1ff9eae..5ea4ae5 100644 --- a/examples/debug_console.rs +++ b/cursive/examples/debug_console.rs @@ -8,7 +8,7 @@ fn main() { log::debug!("Logger initialized."); log::info!("Starting!"); - let mut siv = cursive::Cursive::default(); + let mut siv = cursive::default(); siv.add_layer(cursive::views::Dialog::text("Press ~ to open the console.\nPress l to generate logs.\nPress q to quit.")); siv.add_global_callback('q', cursive::Cursive::quit); siv.add_global_callback('~', cursive::Cursive::toggle_debug_console); diff --git a/examples/dialog.rs b/cursive/examples/dialog.rs similarity index 90% rename from examples/dialog.rs rename to cursive/examples/dialog.rs index 4255112..0de85e9 100644 --- a/examples/dialog.rs +++ b/cursive/examples/dialog.rs @@ -1,9 +1,8 @@ use cursive::views::{CircularFocus, Dialog, TextView}; -use cursive::Cursive; fn main() { // Creates the cursive root - required for every application. - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // Creates a dialog with a single "Quit" button siv.add_layer( diff --git a/examples/edit.rs b/cursive/examples/edit.rs similarity index 98% rename from examples/edit.rs rename to cursive/examples/edit.rs index 2934842..0657c18 100644 --- a/examples/edit.rs +++ b/cursive/examples/edit.rs @@ -3,7 +3,7 @@ use cursive::views::{Dialog, EditView, TextView}; use cursive::Cursive; fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // Create a dialog with an edit text and a button. // The user can either hit the button, diff --git a/examples/hello_world.rs b/cursive/examples/hello_world.rs similarity index 89% rename from examples/hello_world.rs rename to cursive/examples/hello_world.rs index 0ec8a08..819ff79 100644 --- a/examples/hello_world.rs +++ b/cursive/examples/hello_world.rs @@ -2,7 +2,7 @@ use cursive::views::TextView; use cursive::Cursive; fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // We can quit by pressing `q` siv.add_global_callback('q', Cursive::quit); diff --git a/examples/key_codes.rs b/cursive/examples/key_codes.rs similarity index 94% rename from examples/key_codes.rs rename to cursive/examples/key_codes.rs index 9d876c2..2ae23fa 100644 --- a/examples/key_codes.rs +++ b/cursive/examples/key_codes.rs @@ -1,12 +1,12 @@ use cursive::event::{Event, EventResult}; use cursive::traits::*; -use cursive::{Cursive, Printer}; +use cursive::Printer; // This example define a custom view that prints any event it receives. // This is a handy way to check the input received by cursive. fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); siv.add_layer(KeyCodeView::new(10).full_width().fixed_height(10)); siv.run(); diff --git a/examples/linear.rs b/cursive/examples/linear.rs similarity index 95% rename from examples/linear.rs rename to cursive/examples/linear.rs index 7e61713..178db87 100644 --- a/examples/linear.rs +++ b/cursive/examples/linear.rs @@ -1,12 +1,11 @@ use cursive::align::HAlign; use cursive::traits::*; use cursive::views::{Dialog, DummyView, LinearLayout, TextView}; -use cursive::Cursive; // This example uses a LinearLayout to stick multiple views next to each other. fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // Some description text. We want it to be long, but not _too_ long. let text = "This is a very simple example of linear layout. Two views \ diff --git a/examples/list_view.rs b/cursive/examples/list_view.rs similarity index 98% rename from examples/list_view.rs rename to cursive/examples/list_view.rs index ac0e78a..a130400 100644 --- a/examples/list_view.rs +++ b/cursive/examples/list_view.rs @@ -2,14 +2,13 @@ use cursive::traits::*; use cursive::views::{ Checkbox, Dialog, EditView, LinearLayout, ListView, SelectView, TextView, }; -use cursive::Cursive; // This example uses a ListView. // // ListView can be used to build forms, with a list of inputs. fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); siv.add_layer( Dialog::new() diff --git a/examples/logs.rs b/cursive/examples/logs.rs similarity index 98% rename from examples/logs.rs rename to cursive/examples/logs.rs index a973423..9a287fe 100644 --- a/examples/logs.rs +++ b/cursive/examples/logs.rs @@ -12,7 +12,7 @@ use std::time::Duration; fn main() { // As usual, create the Cursive root - let mut siv = Cursive::default(); + let mut siv = cursive::default(); let cb_sink = siv.cb_sink().clone(); diff --git a/examples/lorem.rs b/cursive/examples/lorem.rs similarity index 93% rename from examples/lorem.rs rename to cursive/examples/lorem.rs index 5e38959..6973e9a 100644 --- a/examples/lorem.rs +++ b/cursive/examples/lorem.rs @@ -1,13 +1,12 @@ use cursive::align::HAlign; use cursive::view::Scrollable; use cursive::views::{Dialog, Panel, TextView}; -use cursive::Cursive; fn main() { // Read some long text from a file. let content = include_str!("../assets/lorem.txt"); - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // We can quit by pressing q siv.add_global_callback('q', |s| s.quit()); diff --git a/examples/markup.rs b/cursive/examples/markup.rs similarity index 91% rename from examples/markup.rs rename to cursive/examples/markup.rs index b3544bd..9634b76 100644 --- a/examples/markup.rs +++ b/cursive/examples/markup.rs @@ -4,10 +4,9 @@ use cursive::theme::Effect; use cursive::theme::Style; use cursive::utils::markup::StyledString; use cursive::views::{Dialog, TextView}; -use cursive::Cursive; fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); let mut styled = StyledString::plain("Isn't "); styled.append(StyledString::styled("that ", Color::Dark(BaseColor::Red))); diff --git a/examples/menubar.rs b/cursive/examples/menubar.rs similarity index 98% rename from examples/menubar.rs rename to cursive/examples/menubar.rs index 621c168..f382bdf 100644 --- a/examples/menubar.rs +++ b/cursive/examples/menubar.rs @@ -2,14 +2,13 @@ use cursive::event::Key; use cursive::menu::MenuTree; use cursive::traits::*; use cursive::views::Dialog; -use cursive::Cursive; use std::sync::atomic::{AtomicUsize, Ordering}; // This examples shows how to configure and use a menubar at the top of the // application. fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // We'll use a counter to name new files. let counter = AtomicUsize::new(1); diff --git a/examples/mines/Readme.md b/cursive/examples/mines/Readme.md similarity index 100% rename from examples/mines/Readme.md rename to cursive/examples/mines/Readme.md diff --git a/examples/mines/game.rs b/cursive/examples/mines/game.rs similarity index 100% rename from examples/mines/game.rs rename to cursive/examples/mines/game.rs diff --git a/examples/mines/main.rs b/cursive/examples/mines/main.rs similarity index 99% rename from examples/mines/main.rs rename to cursive/examples/mines/main.rs index 9e978c7..5650aca 100644 --- a/examples/mines/main.rs +++ b/cursive/examples/mines/main.rs @@ -9,7 +9,7 @@ use cursive::Printer; use cursive::Vec2; fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); siv.add_layer( Dialog::new() diff --git a/examples/mutation.rs b/cursive/examples/mutation.rs similarity index 97% rename from examples/mutation.rs rename to cursive/examples/mutation.rs index 1451fc8..bd92584 100644 --- a/examples/mutation.rs +++ b/cursive/examples/mutation.rs @@ -6,7 +6,7 @@ use cursive::Cursive; // This example modifies a view after creation. fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); let content = "Press Q to quit the application.\n\nPress P to open the \ popup."; diff --git a/examples/position.rs b/cursive/examples/position.rs similarity index 96% rename from examples/position.rs rename to cursive/examples/position.rs index 1703a88..fa95294 100644 --- a/examples/position.rs +++ b/cursive/examples/position.rs @@ -20,7 +20,7 @@ fn move_top(c: &mut Cursive, x_in: isize, y_in: isize) { } fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // We can quit by pressing `q` siv.add_global_callback('q', Cursive::quit); diff --git a/examples/progress.rs b/cursive/examples/progress.rs similarity index 99% rename from examples/progress.rs rename to cursive/examples/progress.rs index 79778b2..83b3b62 100644 --- a/examples/progress.rs +++ b/cursive/examples/progress.rs @@ -14,7 +14,7 @@ use std::time::Duration; // "ticked" to indicate progress. fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // We'll start slowly with a simple start button... siv.add_layer( diff --git a/examples/radio.rs b/cursive/examples/radio.rs similarity index 97% rename from examples/radio.rs rename to cursive/examples/radio.rs index ab6c268..c60b098 100644 --- a/examples/radio.rs +++ b/cursive/examples/radio.rs @@ -1,10 +1,9 @@ use cursive::views::{Dialog, DummyView, LinearLayout, RadioGroup}; -use cursive::Cursive; // This example uses radio buttons. fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // We need to pre-create the groups for our RadioButtons. let mut color_group: RadioGroup = RadioGroup::new(); diff --git a/examples/refcell_view.rs b/cursive/examples/refcell_view.rs similarity index 97% rename from examples/refcell_view.rs rename to cursive/examples/refcell_view.rs index d6843fe..bc46e08 100644 --- a/examples/refcell_view.rs +++ b/cursive/examples/refcell_view.rs @@ -5,7 +5,7 @@ use cursive::Cursive; // This example shows a way to access multiple views at the same time. fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // Create a dialog with 2 edit fields, and a text view. // The text view indicates when the 2 fields content match. diff --git a/examples/scroll.rs b/cursive/examples/scroll.rs similarity index 94% rename from examples/scroll.rs rename to cursive/examples/scroll.rs index 037aca8..78dfc18 100644 --- a/examples/scroll.rs +++ b/cursive/examples/scroll.rs @@ -4,7 +4,7 @@ use cursive::views::{Button, Canvas, Dialog, LinearLayout}; use cursive::Printer; fn main() { - let mut siv = cursive::Cursive::default(); + let mut siv = cursive::default(); siv.add_layer( Dialog::around( diff --git a/examples/select.rs b/cursive/examples/select.rs similarity index 97% rename from examples/select.rs rename to cursive/examples/select.rs index 7d70021..13b046a 100644 --- a/examples/select.rs +++ b/cursive/examples/select.rs @@ -35,7 +35,7 @@ fn main() { Some(EventResult::Consumed(None)) }); - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // Let's add a ResizedView to keep the list at a reasonable size // (it can scroll anyway). diff --git a/examples/select_test.rs b/cursive/examples/select_test.rs similarity index 100% rename from examples/select_test.rs rename to cursive/examples/select_test.rs diff --git a/examples/slider.rs b/cursive/examples/slider.rs similarity index 96% rename from examples/slider.rs rename to cursive/examples/slider.rs index 933bb27..da77ed8 100644 --- a/examples/slider.rs +++ b/cursive/examples/slider.rs @@ -3,7 +3,7 @@ use cursive::views::{Dialog, SliderView}; use cursive::Cursive; fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); siv.add_global_callback('q', |s| s.quit()); diff --git a/examples/tcp_server.rs b/cursive/examples/tcp_server.rs similarity index 99% rename from examples/tcp_server.rs rename to cursive/examples/tcp_server.rs index 8b454d9..5261d91 100644 --- a/examples/tcp_server.rs +++ b/cursive/examples/tcp_server.rs @@ -9,7 +9,7 @@ use std::sync::{Arc, Mutex}; // It then builds a TUI to control the parameters and display the output. fn main() { - let mut siv = cursive::Cursive::default(); + let mut siv = cursive::default(); // Build a shared model let model = Arc::new(Mutex::new(ModelData { diff --git a/examples/terminal_default.rs b/cursive/examples/terminal_default.rs similarity index 95% rename from examples/terminal_default.rs rename to cursive/examples/terminal_default.rs index 00de7fb..a1af2ac 100644 --- a/examples/terminal_default.rs +++ b/cursive/examples/terminal_default.rs @@ -7,7 +7,7 @@ use cursive::Cursive; // This way, it looks more natural. fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); let theme = custom_theme_from_cursive(&siv); siv.set_theme(theme); diff --git a/examples/text_area.rs b/cursive/examples/text_area.rs similarity index 98% rename from examples/text_area.rs rename to cursive/examples/text_area.rs index b1a5029..e87f7df 100644 --- a/examples/text_area.rs +++ b/cursive/examples/text_area.rs @@ -4,7 +4,7 @@ use cursive::views::{Dialog, EditView, OnEventView, TextArea}; use cursive::Cursive; fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // The main dialog will just have a textarea. // Its size expand automatically with the content. diff --git a/examples/theme.rs b/cursive/examples/theme.rs similarity index 94% rename from examples/theme.rs rename to cursive/examples/theme.rs index f03385f..50f5cf6 100644 --- a/examples/theme.rs +++ b/cursive/examples/theme.rs @@ -1,8 +1,7 @@ use cursive::views::{Dialog, TextView}; -use cursive::Cursive; fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); #[cfg(feature = "toml")] { diff --git a/examples/theme_manual.rs b/cursive/examples/theme_manual.rs similarity index 96% rename from examples/theme_manual.rs rename to cursive/examples/theme_manual.rs index 7dbb6b8..bd2094f 100644 --- a/examples/theme_manual.rs +++ b/cursive/examples/theme_manual.rs @@ -3,7 +3,7 @@ use cursive::views::{Dialog, EditView, LinearLayout, TextView}; use cursive::Cursive; fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); let layout = LinearLayout::vertical() .child(TextView::new("This is a dynamic theme example!")) diff --git a/examples/user_data.rs b/cursive/examples/user_data.rs similarity index 97% rename from examples/user_data.rs rename to cursive/examples/user_data.rs index 0c9cbd1..fec19c0 100644 --- a/examples/user_data.rs +++ b/cursive/examples/user_data.rs @@ -14,7 +14,7 @@ struct Data { } fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // `Cursive::set_user_data` accepts any `T: Any`, which includes most // owned types diff --git a/examples/vpv.rs b/cursive/examples/vpv.rs similarity index 99% rename from examples/vpv.rs rename to cursive/examples/vpv.rs index ce5f8d9..5bcd18f 100644 --- a/examples/vpv.rs +++ b/cursive/examples/vpv.rs @@ -11,7 +11,7 @@ use std::time; // This example is a visual version of the `pv` tool. fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); // We'll use this channel to signal the end of the transfer let cb_sink = siv.cb_sink().clone(); diff --git a/src/backend/blt.rs b/cursive/src/backends/blt.rs similarity index 100% rename from src/backend/blt.rs rename to cursive/src/backends/blt.rs diff --git a/src/backend/crossterm.rs b/cursive/src/backends/crossterm.rs similarity index 56% rename from src/backend/crossterm.rs rename to cursive/src/backends/crossterm.rs index d976130..b3dec2e 100644 --- a/src/backend/crossterm.rs +++ b/cursive/src/backends/crossterm.rs @@ -48,150 +48,140 @@ pub struct Backend { stdout: RefCell>, } -impl From for MouseButton { - fn from(button: CMouseButton) -> Self { - match button { - CMouseButton::Left => MouseButton::Left, - CMouseButton::Right => MouseButton::Right, - CMouseButton::Middle => MouseButton::Middle, - } +fn translate_button(button: CMouseButton) -> MouseButton { + match button { + CMouseButton::Left => MouseButton::Left, + CMouseButton::Right => MouseButton::Right, + CMouseButton::Middle => MouseButton::Middle, } } -impl From for Key { - fn from(code: KeyCode) -> Self { - match code { - KeyCode::Esc => Key::Esc, - KeyCode::Backspace => Key::Backspace, - KeyCode::Left => Key::Left, - KeyCode::Right => Key::Right, - KeyCode::Up => Key::Up, - KeyCode::Down => Key::Down, - KeyCode::Home => Key::Home, - KeyCode::End => Key::End, - KeyCode::PageUp => Key::PageUp, - KeyCode::PageDown => Key::PageDown, - KeyCode::Delete => Key::Del, - KeyCode::Insert => Key::Ins, - KeyCode::Enter => Key::Enter, - KeyCode::Tab => Key::Tab, - KeyCode::F(n) => Key::from_f(n), - KeyCode::BackTab => Key::Tab, /* not supported */ - KeyCode::Char(_) => Key::Tab, /* is handled at `Event` level, use tab as default */ - KeyCode::Null => Key::Tab, /* is handled at `Event` level, use tab as default */ - } +fn translate_key(code: KeyCode) -> Key { + match code { + KeyCode::Esc => Key::Esc, + KeyCode::Backspace => Key::Backspace, + KeyCode::Left => Key::Left, + KeyCode::Right => Key::Right, + KeyCode::Up => Key::Up, + KeyCode::Down => Key::Down, + KeyCode::Home => Key::Home, + KeyCode::End => Key::End, + KeyCode::PageUp => Key::PageUp, + KeyCode::PageDown => Key::PageDown, + KeyCode::Delete => Key::Del, + KeyCode::Insert => Key::Ins, + KeyCode::Enter => Key::Enter, + KeyCode::Tab => Key::Tab, + KeyCode::F(n) => Key::from_f(n), + KeyCode::BackTab => Key::Tab, /* not supported */ + KeyCode::Char(_) => Key::Tab, /* is handled at `Event` level, use tab as default */ + KeyCode::Null => Key::Tab, /* is handled at `Event` level, use tab as default */ } } -impl From for Event { - fn from(event: CKeyEvent) -> Self { - const CTRL_ALT: KeyModifiers = KeyModifiers::from_bits_truncate( - KeyModifiers::CONTROL.bits() | KeyModifiers::ALT.bits(), - ); - const CTRL_SHIFT: KeyModifiers = KeyModifiers::from_bits_truncate( - KeyModifiers::CONTROL.bits() | KeyModifiers::SHIFT.bits(), - ); - const ALT_SHIFT: KeyModifiers = KeyModifiers::from_bits_truncate( - KeyModifiers::ALT.bits() | KeyModifiers::SHIFT.bits(), - ); +fn translate_event(event: CKeyEvent) -> Event { + const CTRL_ALT: KeyModifiers = KeyModifiers::from_bits_truncate( + KeyModifiers::CONTROL.bits() | KeyModifiers::ALT.bits(), + ); + const CTRL_SHIFT: KeyModifiers = KeyModifiers::from_bits_truncate( + KeyModifiers::CONTROL.bits() | KeyModifiers::SHIFT.bits(), + ); + const ALT_SHIFT: KeyModifiers = KeyModifiers::from_bits_truncate( + KeyModifiers::ALT.bits() | KeyModifiers::SHIFT.bits(), + ); - match event { - // Handle Char + modifier. - CKeyEvent { - modifiers: KeyModifiers::CONTROL, - code: KeyCode::Char(c), - } => Event::CtrlChar(c), - CKeyEvent { - modifiers: KeyModifiers::ALT, - code: KeyCode::Char(c), - } => Event::AltChar(c), - CKeyEvent { - modifiers: KeyModifiers::SHIFT, - code: KeyCode::Char(c), - } => Event::Char(c), + match event { + // Handle Char + modifier. + CKeyEvent { + modifiers: KeyModifiers::CONTROL, + code: KeyCode::Char(c), + } => Event::CtrlChar(c), + CKeyEvent { + modifiers: KeyModifiers::ALT, + code: KeyCode::Char(c), + } => Event::AltChar(c), + CKeyEvent { + modifiers: KeyModifiers::SHIFT, + code: KeyCode::Char(c), + } => Event::Char(c), - // Handle key + multiple modifiers - CKeyEvent { - modifiers: CTRL_ALT, - code, - } => Event::CtrlAlt(Key::from(code)), - CKeyEvent { - modifiers: CTRL_SHIFT, - code, - } => Event::CtrlShift(Key::from(code)), - CKeyEvent { - modifiers: ALT_SHIFT, - code, - } => Event::AltShift(Key::from(code)), + // Handle key + multiple modifiers + CKeyEvent { + modifiers: CTRL_ALT, + code, + } => Event::CtrlAlt(translate_key(code)), + CKeyEvent { + modifiers: CTRL_SHIFT, + code, + } => Event::CtrlShift(translate_key(code)), + CKeyEvent { + modifiers: ALT_SHIFT, + code, + } => Event::AltShift(translate_key(code)), - // Handle key + single modifier - CKeyEvent { - modifiers: KeyModifiers::CONTROL, - code, - } => Event::Ctrl(Key::from(code)), - CKeyEvent { - modifiers: KeyModifiers::ALT, - code, - } => Event::Alt(Key::from(code)), - CKeyEvent { - modifiers: KeyModifiers::SHIFT, - code, - } => Event::Shift(Key::from(code)), + // Handle key + single modifier + CKeyEvent { + modifiers: KeyModifiers::CONTROL, + code, + } => Event::Ctrl(translate_key(code)), + CKeyEvent { + modifiers: KeyModifiers::ALT, + code, + } => Event::Alt(translate_key(code)), + CKeyEvent { + modifiers: KeyModifiers::SHIFT, + code, + } => Event::Shift(translate_key(code)), - CKeyEvent { - code: KeyCode::Char(c), - .. - } => Event::Char(c), + CKeyEvent { + code: KeyCode::Char(c), + .. + } => Event::Char(c), - // Explicitly handle 'backtab' since crossterm does not sent SHIFT alongside the back tab key. - CKeyEvent { - code: KeyCode::BackTab, - .. - } => Event::Shift(Key::Tab), + // Explicitly handle 'backtab' since crossterm does not sent SHIFT alongside the back tab key. + CKeyEvent { + code: KeyCode::BackTab, + .. + } => Event::Shift(Key::Tab), - // All other keys. - CKeyEvent { code, .. } => Event::Key(Key::from(code)), - } + // All other keys. + CKeyEvent { code, .. } => Event::Key(translate_key(code)), } } -impl From for Color { - fn from(base_color: theme::Color) -> Self { - match base_color { - theme::Color::Dark(theme::BaseColor::Black) => Color::Black, - theme::Color::Dark(theme::BaseColor::Red) => Color::DarkRed, - theme::Color::Dark(theme::BaseColor::Green) => Color::DarkGreen, - theme::Color::Dark(theme::BaseColor::Yellow) => Color::DarkYellow, - theme::Color::Dark(theme::BaseColor::Blue) => Color::DarkBlue, - theme::Color::Dark(theme::BaseColor::Magenta) => { - Color::DarkMagenta - } - theme::Color::Dark(theme::BaseColor::Cyan) => Color::DarkCyan, - theme::Color::Dark(theme::BaseColor::White) => Color::Grey, - theme::Color::Light(theme::BaseColor::Black) => Color::DarkGrey, - theme::Color::Light(theme::BaseColor::Red) => Color::Red, - theme::Color::Light(theme::BaseColor::Green) => Color::Green, - theme::Color::Light(theme::BaseColor::Yellow) => Color::Yellow, - theme::Color::Light(theme::BaseColor::Blue) => Color::Blue, - theme::Color::Light(theme::BaseColor::Magenta) => Color::Magenta, - theme::Color::Light(theme::BaseColor::Cyan) => Color::Cyan, - theme::Color::Light(theme::BaseColor::White) => Color::White, - theme::Color::Rgb(r, g, b) => Color::Rgb { r, g, b }, - theme::Color::RgbLowRes(r, g, b) => { - debug_assert!(r <= 5, +fn translate_color(base_color: theme::Color) -> Color { + match base_color { + theme::Color::Dark(theme::BaseColor::Black) => Color::Black, + theme::Color::Dark(theme::BaseColor::Red) => Color::DarkRed, + theme::Color::Dark(theme::BaseColor::Green) => Color::DarkGreen, + theme::Color::Dark(theme::BaseColor::Yellow) => Color::DarkYellow, + theme::Color::Dark(theme::BaseColor::Blue) => Color::DarkBlue, + theme::Color::Dark(theme::BaseColor::Magenta) => Color::DarkMagenta, + theme::Color::Dark(theme::BaseColor::Cyan) => Color::DarkCyan, + theme::Color::Dark(theme::BaseColor::White) => Color::Grey, + theme::Color::Light(theme::BaseColor::Black) => Color::DarkGrey, + theme::Color::Light(theme::BaseColor::Red) => Color::Red, + theme::Color::Light(theme::BaseColor::Green) => Color::Green, + theme::Color::Light(theme::BaseColor::Yellow) => Color::Yellow, + theme::Color::Light(theme::BaseColor::Blue) => Color::Blue, + theme::Color::Light(theme::BaseColor::Magenta) => Color::Magenta, + theme::Color::Light(theme::BaseColor::Cyan) => Color::Cyan, + theme::Color::Light(theme::BaseColor::White) => Color::White, + theme::Color::Rgb(r, g, b) => Color::Rgb { r, g, b }, + theme::Color::RgbLowRes(r, g, b) => { + debug_assert!(r <= 5, "Red color fragment (r = {}) is out of bound. Make sure r ≤ 5.", r); - debug_assert!(g <= 5, + debug_assert!(g <= 5, "Green color fragment (g = {}) is out of bound. Make sure g ≤ 5.", g); - debug_assert!(b <= 5, + debug_assert!(b <= 5, "Blue color fragment (b = {}) is out of bound. Make sure b ≤ 5.", b); - Color::AnsiValue(16 + 36 * r + 6 * g + b) - } - theme::Color::TerminalDefault => Color::Reset, + Color::AnsiValue(16 + 36 * r + 6 * g + b) } + theme::Color::TerminalDefault => Color::Reset, } } @@ -224,8 +214,8 @@ impl Backend { fn apply_colors(&self, colors: theme::ColorPair) { queue!( self.stdout_mut(), - SetForegroundColor(Color::from(colors.front)), - SetBackgroundColor(Color::from(colors.back)) + SetForegroundColor(translate_color(colors.front)), + SetBackgroundColor(translate_color(colors.back)) ) .unwrap(); } @@ -240,24 +230,24 @@ impl Backend { fn map_key(&mut self, event: CEvent) -> Event { match event { - CEvent::Key(key_event) => Event::from(key_event), + CEvent::Key(key_event) => translate_event(key_event), CEvent::Mouse(mouse_event) => { let position; let event; match mouse_event { CMouseEvent::Down(button, x, y, _) => { - let button = MouseButton::from(button); + let button = translate_button(button); event = MouseEvent::Press(button); position = (x, y).into(); } CMouseEvent::Up(button, x, y, _) => { - let button = MouseButton::from(button); + let button = translate_button(button); event = MouseEvent::Release(button); position = (x, y).into(); } CMouseEvent::Drag(button, x, y, _) => { - let button = MouseButton::from(button); + let button = translate_button(button); event = MouseEvent::Hold(button); position = (x, y).into(); } diff --git a/src/backend/curses/mod.rs b/cursive/src/backends/curses/mod.rs similarity index 100% rename from src/backend/curses/mod.rs rename to cursive/src/backends/curses/mod.rs diff --git a/src/backend/curses/n.rs b/cursive/src/backends/curses/n.rs similarity index 100% rename from src/backend/curses/n.rs rename to cursive/src/backends/curses/n.rs diff --git a/src/backend/curses/pan.rs b/cursive/src/backends/curses/pan.rs similarity index 100% rename from src/backend/curses/pan.rs rename to cursive/src/backends/curses/pan.rs diff --git a/src/backend/dummy.rs b/cursive/src/backends/dummy.rs similarity index 96% rename from src/backend/dummy.rs rename to cursive/src/backends/dummy.rs index 4384926..9b30427 100644 --- a/src/backend/dummy.rs +++ b/cursive/src/backends/dummy.rs @@ -49,6 +49,7 @@ impl backend::Backend for Backend { // This sets the Colours and returns the previous colours // to allow you to set them back when you're done. fn set_color(&self, colors: theme::ColorPair) -> theme::ColorPair { + // TODO: actually save a stack of colors? colors } diff --git a/cursive/src/backends/mod.rs b/cursive/src/backends/mod.rs new file mode 100644 index 0000000..06ef46b --- /dev/null +++ b/cursive/src/backends/mod.rs @@ -0,0 +1,18 @@ +//! Define backends using common libraries. +//! +//! Cursive doesn't print anything by itself: it delegates this job to a +//! backend library, which handles all actual input and output. +//! +//! This module defines the `Backend` trait, as well as a few implementations +//! using some common libraries. Each of those included backends needs a +//! corresonding feature to be enabled. +#[cfg(unix)] +mod resize; + +pub mod dummy; + +pub mod blt; +pub mod crossterm; +pub mod curses; +pub mod puppet; +pub mod termion; diff --git a/src/backend/puppet/mod.rs b/cursive/src/backends/puppet/mod.rs similarity index 96% rename from src/backend/puppet/mod.rs rename to cursive/src/backends/puppet/mod.rs index 02e3853..8265338 100644 --- a/src/backend/puppet/mod.rs +++ b/cursive/src/backends/puppet/mod.rs @@ -1,10 +1,10 @@ //! Puppet backend use crossbeam_channel::{self, Receiver, Sender, TryRecvError}; +use self::observed::ObservedCell; +use self::observed::ObservedScreen; +use self::observed::ObservedStyle; use crate::backend; -use crate::backend::puppet::observed::ObservedCell; -use crate::backend::puppet::observed::ObservedScreen; -use crate::backend::puppet::observed::ObservedStyle; use crate::event::Event; use crate::theme; use crate::Vec2; diff --git a/src/backend/puppet/observed.rs b/cursive/src/backends/puppet/observed.rs similarity index 99% rename from src/backend/puppet/observed.rs rename to cursive/src/backends/puppet/observed.rs index 95f5452..11826ff 100644 --- a/src/backend/puppet/observed.rs +++ b/cursive/src/backends/puppet/observed.rs @@ -442,7 +442,7 @@ impl IndexMut for ObservedScreen { #[cfg(test)] mod tests { use super::*; - use crate::backend::puppet::DEFAULT_OBSERVED_STYLE; + use crate::backends::puppet::DEFAULT_OBSERVED_STYLE; /// Expecting fake_screen to be square, # will be replaced with blank. fn get_observed_screen(fake_screen: &Vec<&str>) -> ObservedScreen { diff --git a/src/backend/puppet/observed_screen_view.rs b/cursive/src/backends/puppet/observed_screen_view.rs similarity index 93% rename from src/backend/puppet/observed_screen_view.rs rename to cursive/src/backends/puppet/observed_screen_view.rs index 92ca685..9ffdcdf 100644 --- a/src/backend/puppet/observed_screen_view.rs +++ b/cursive/src/backends/puppet/observed_screen_view.rs @@ -1,6 +1,6 @@ //! View visualizing a captured PuppetBackend outputs -use crate::backend::puppet::observed::ObservedCell; -use crate::backend::puppet::observed::ObservedScreen; +use crate::backends::puppet::observed::ObservedCell; +use crate::backends::puppet::observed::ObservedScreen; use crate::theme::ColorStyle; use crate::theme::ColorType; use crate::view::View; diff --git a/src/backend/puppet/static_values.rs b/cursive/src/backends/puppet/static_values.rs similarity index 93% rename from src/backend/puppet/static_values.rs rename to cursive/src/backends/puppet/static_values.rs index 377013f..7b7aa41 100644 --- a/src/backend/puppet/static_values.rs +++ b/cursive/src/backends/puppet/static_values.rs @@ -7,7 +7,7 @@ use crate::Vec2; use crate::XY; use enumset::EnumSet; -use crate::backend::puppet::observed::*; +use crate::backends::puppet::observed::*; lazy_static! { /// Default size for the puppet terminal. diff --git a/src/backend/resize.rs b/cursive/src/backends/resize.rs similarity index 100% rename from src/backend/resize.rs rename to cursive/src/backends/resize.rs diff --git a/src/backend/termion.rs b/cursive/src/backends/termion.rs similarity index 99% rename from src/backend/termion.rs rename to cursive/src/backends/termion.rs index 5551743..a72f2ec 100644 --- a/src/backend/termion.rs +++ b/cursive/src/backends/termion.rs @@ -17,6 +17,7 @@ use self::termion::style as tstyle; use crossbeam_channel::{self, select, Receiver}; use crate::backend; +use crate::backends; use crate::event::{Event, Key, MouseButton, MouseEvent}; use crate::theme; use crate::Vec2; @@ -60,7 +61,7 @@ impl Backend { let running = Arc::new(AtomicBool::new(true)); #[cfg(unix)] - backend::resize::start_resize_thread( + backends::resize::start_resize_thread( resize_sender, Arc::clone(&running), ); diff --git a/cursive/src/cursive_ext.rs b/cursive/src/cursive_ext.rs new file mode 100644 index 0000000..736c219 --- /dev/null +++ b/cursive/src/cursive_ext.rs @@ -0,0 +1,106 @@ +/// Extension trait for the `Cursive` root to simplify initialization. +/// +/// It brings backend-specific methods to initialize a `Cursive` root. +/// +/// # Examples +/// +/// ```rust,no_run +/// use cursive::{Cursive, CursiveExt}; +/// +/// // Use `Cursive::default()` to pick one of the enabled backends, +/// // depending on cargo features. +/// let mut siv = Cursive::default(); +/// +/// // Or explicitly use a specific backend +/// #[cfg(feature = "ncurses-backend")] +/// let mut siv = Cursive::ncurses(); +/// #[cfg(feature = "panncurses-backend")] +/// let mut siv = Cursive::pancurses(); +/// #[cfg(feature = "termion-backend")] +/// let mut siv = Cursive::termion(); +/// #[cfg(feature = "crossterm-backend")] +/// let mut siv = Cursive::crossterm(); +/// #[cfg(feature = "blt-backend")] +/// let mut siv = Cursive::blt(); +/// ``` +pub trait CursiveExt { + /// Type of the returned cursive root. + type Cursive; + + /// Tries to use one of the enabled backends. + /// + /// Will fallback to the dummy backend if no other backend feature is enabled. + /// + /// # Panics + /// + /// If the backend initialization fails. + fn default() -> Self::Cursive; + + /// Creates a new Cursive root using a ncurses backend. + #[cfg(feature = "ncurses-backend")] + fn ncurses() -> std::io::Result; + + /// Creates a new Cursive root using a pancurses backend. + #[cfg(feature = "pancurses-backend")] + fn pancurses() -> std::io::Result; + + /// Creates a new Cursive root using a termion backend. + #[cfg(feature = "termion-backend")] + fn termion() -> std::io::Result; + + /// Creates a new Cursive root using a crossterm backend. + #[cfg(feature = "crossterm-backend")] + fn crossterm() -> Result; + + /// Creates a new Cursive root using a bear-lib-terminal backend. + #[cfg(feature = "blt-backend")] + fn blt() -> Self::Cursive; +} + +impl CursiveExt for cursive_core::Cursive { + type Cursive = Self; + + fn default() -> Self::Cursive { + cfg_if::cfg_if! { + if #[cfg(feature = "blt-backend")] { + Self::blt() + } else if #[cfg(feature = "termion-backend")] { + Self::termion().unwrap() + } else if #[cfg(feature = "crossterm-backend")] { + Self::crossterm().unwrap() + } else if #[cfg(feature = "pancurses-backend")] { + Self::pancurses().unwrap() + } else if #[cfg(feature = "ncurses-backend")] { + Self::ncurses().unwrap() + } else { + log::warn!("No built-it backend, falling back to Cursive::dummy()."); + Self::dummy() + } + } + } + + #[cfg(feature = "ncurses-backend")] + fn ncurses() -> std::io::Result { + Self::try_new(crate::backends::curses::n::Backend::init) + } + + #[cfg(feature = "pancurses-backend")] + fn pancurses() -> std::io::Result { + Self::try_new(crate::backends::curses::pan::Backend::init) + } + + #[cfg(feature = "termion-backend")] + fn termion() -> std::io::Result { + Self::try_new(crate::backends::termion::Backend::init) + } + + #[cfg(feature = "crossterm-backend")] + fn crossterm() -> Result { + Self::try_new(crate::backends::crossterm::Backend::init) + } + + #[cfg(feature = "blt-backend")] + fn blt() -> Self { + Self::new(crate::backends::blt::Backend::init) + } +} diff --git a/src/lib.rs b/cursive/src/lib.rs similarity index 55% rename from src/lib.rs rename to cursive/src/lib.rs index 9a54209..aff0f47 100644 --- a/src/lib.rs +++ b/cursive/src/lib.rs @@ -56,60 +56,66 @@ //! Or you can use gdb as usual. #![deny(missing_docs)] -// We use chan_signal to detect SIGWINCH. -// It's not how windows work, so no need to use that. +pub use cursive_core::*; -macro_rules! new_default( - ($c:ident<$t:ident>) => { - impl<$t> Default for $c<$t> { - fn default() -> Self { - Self::new() - } - } - }; - ($c:ty) => { - impl Default for $c { - fn default() -> Self { - Self::new() - } - } - } -); - -pub mod traits; - -pub mod event; -#[macro_use] -pub mod view; - -#[macro_use] -pub mod utils; - -pub mod align; -pub mod direction; -pub mod logger; -pub mod menu; -pub mod theme; -pub mod vec; -#[macro_use] -pub mod views; - -// This probably doesn't need to be public? -mod cursive; -mod printer; -mod rect; -mod with; -mod xy; - -mod div; mod utf8; -pub mod backend; +pub mod backends; -pub use self::cursive::{CbSink, Cursive, ScreenId}; -pub use self::printer::Printer; -pub use self::rect::Rect; -pub use self::vec::Vec2; -pub use self::view::View; -pub use self::with::With; -pub use self::xy::XY; +mod cursive_ext; +pub use cursive_ext::CursiveExt; + +/// Creates a new Cursive root using one of the enabled backends. +/// +/// Will use the first available backend from this list: +/// * BearLibTerminal +/// * Termion +/// * Crossterm +/// * Pancurses +/// * Ncurses +/// +/// If none of these is enabled, it will default to a dummy backend. +/// +/// # Panics +/// +/// If the backend initialization fails. +pub fn default() -> Cursive { + Cursive::default() +} + +/// Creates a new Cursive root using a ncurses backend. +#[cfg(feature = "ncurses-backend")] +pub fn ncurses() -> std::io::Result { + Cursive::ncurses() +} + +/// Creates a new Cursive root using a pancurses backend. +#[cfg(feature = "pancurses-backend")] +pub fn pancurses() -> std::io::Result { + Cursive::pancurses() +} + +/// Creates a new Cursive root using a termion backend. +#[cfg(feature = "termion-backend")] +pub fn termion() -> std::io::Result { + Cursive::termion() +} + +/// Creates a new Cursive root using a crossterm backend. +#[cfg(feature = "crossterm-backend")] +pub fn crossterm() -> Result { + Cursive::crossterm() +} + +/// Creates a new Cursive root using a bear-lib-terminal backend. +#[cfg(feature = "blt-backend")] +pub fn blt() -> Cursive { + Cursive::blt() +} + +/// Creates a new Cursive root using a dummy backend. +/// +/// Nothing will be output. This is mostly here for tests. +pub fn dummy() -> Cursive { + Cursive::dummy() +} diff --git a/src/utf8.rs b/cursive/src/utf8.rs similarity index 100% rename from src/utf8.rs rename to cursive/src/utf8.rs diff --git a/doc/tutorial_1.md b/doc/tutorial_1.md index 3dfefab..dbe6f39 100644 --- a/doc/tutorial_1.md +++ b/doc/tutorial_1.md @@ -6,11 +6,10 @@ In this first tutorial, we'll learn the basics of cursive, and write a very basic first application: ```rust,no_run -use cursive::Cursive; use cursive::views::TextView; fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); siv.add_global_callback('q', |s| s.quit()); @@ -61,7 +60,7 @@ The cursive library is configured through a main [`Cursive`] root. A typical cursive application will consist of three phases, all centered around this object: -1. Create a `Cursive` object +1. Create a `Cursive` object (we will use the [`cursive::default()`] method for that) 2. Configure the `Cursive` object 3. Run the `Cursive` object @@ -71,10 +70,8 @@ so let's skip it for now. In its simplest form, a cursive application is therefore: ```rust,no_run -use cursive::Cursive; - fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); siv.run(); } @@ -85,6 +82,7 @@ It's rather easy to identify the two steps involved. If you run this, you'll get an empty blue terminal, with no way of properly leaving the application (you'll have to press Ctrl+C to kill it). +[`cursive::default()`]: https://docs.rs/cursive/0/cursive/fn.default.html [`Cursive`]: https://docs.rs/cursive/0/cursive/struct.Cursive.html ## Interactivity @@ -106,10 +104,8 @@ This method takes 2 arguments: a trigger, and a callback. In the end, we have: ```rust,no_run -use cursive::Cursive; - fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); siv.add_global_callback('q', |s| s.quit()); @@ -145,11 +141,10 @@ exactly that. Once we've added this line, our first application is complete: ```rust,no_run -use cursive::Cursive; use cursive::views::TextView; fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); siv.add_global_callback('q', |s| s.quit()); diff --git a/doc/tutorial_2.md b/doc/tutorial_2.md index 8f9e35a..2bfd1f8 100644 --- a/doc/tutorial_2.md +++ b/doc/tutorial_2.md @@ -10,7 +10,7 @@ use cursive::Cursive; use cursive::views::Dialog; fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); siv.add_layer(Dialog::text("This is a survey!\nPress when you're ready.") .title("Important survey") @@ -44,10 +44,8 @@ This time you're not a beginner anymore, so we'll skip the introduction! Let's start from a basic cursive application: ```rust,no_run -use cursive::Cursive; - fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); siv.run(); } @@ -63,12 +61,11 @@ and/or buttons. `TextView`: ```rust,no_run -use cursive::Cursive; use cursive::views::Dialog; use cursive::views::TextView; fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); siv.add_layer(Dialog::around(TextView::new("..."))); @@ -127,7 +124,7 @@ use cursive::Cursive; use cursive::views::Dialog; fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); siv.add_layer(Dialog::text("This is a survey!\nPress when you're ready.") .title("Important survey") diff --git a/doc/tutorial_3.md b/doc/tutorial_3.md index bebb875..1dfb38e 100644 --- a/doc/tutorial_3.md +++ b/doc/tutorial_3.md @@ -15,7 +15,7 @@ use cursive::views::{Button, Dialog, DummyView, EditView, use cursive::traits::*; fn main() { - let mut siv = Cursive::default(); + let mut siv = cursive::default(); let select = SelectView::::new() .on_submit(on_submit)