Conversation
|
Thanks for the patch. |
|
Thank you, I was waiting for this! |
|
Strange. The patch has not shown up in master. Perhaps I have pressed the wrong button. Anyway, I have then manually updated master to that commit and bumped the version to 0.12.0. The semver check has not flagged a problem with 0.11.3. Wonder, if/how that works |
|
My reasoning was that upgrading ratatui will cause multiple versions of ratatui to be installed for apps that use tui-logger, often causing conflicts. |
new file mode 100644
index 0000000..3b5cf10
--- /dev/null
+++ b/logger-template/README.md
@@ -0,0 +1,17 @@
+# Ratatui Simple template
+
+The simple template will create the following project structure:
+
+```text
+src/
+├── app.rs -> holds the state and application logic
+├── main.rs -> entry-point
+```
+
+## Design choices
+
+We have a small `App` struct that has a main loop that calls methods to handle events and draw the
+ui. The app can be quit by pressing any of Q/Esc/Ctrl+C.
+
+We use [color-eyre](https://docs.rs/color-eyre/latest/color_eyre/) for simplifying any errors that
+need to be reported to the console.
diff --git a/logger-template/template/.github/workflows/build_examples.yml b/logger-template/template/.github/workflows/build_examples.yml
new file mode 100644
index 0000000..4cb1a8d
--- /dev/null
+++ b/logger-template/template/.github/workflows/build_examples.yml
@@ -0,0 +1,21 @@
+name: Build examples
+
+on:
+ push:
+ branches: [master]
+ pull_request:
+ branches: [master]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Check rust version
+ run: rustup show
+ - name: Build examples with ratatui and termion
+ run: cargo build --examples --features termion
+ - name: Build example with ratatui and crossterm
+ run: cargo build --examples --features crossterm
diff --git a/logger-template/template/.github/workflows/build_examples_latest.yml b/logger-template/template/.github/workflows/build_examples_latest.yml
new file mode 100644
index 0000000..c0aff04
--- /dev/null
+++ b/logger-template/template/.github/workflows/build_examples_latest.yml
@@ -0,0 +1,23 @@
+name: Build examples with latest rust version
+
+on:
+ push:
+ branches: [master]
+ pull_request:
+ branches: [master]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Check rust version
+ run: rustup show
+ - name: Update rust
+ run: rustup update
+ - name: Build examples with ratatui and termion
+ run: cargo build --examples --features termion
+ - name: Build example with ratatui and crossterm
+ run: cargo build --examples --features crossterm
diff --git a/logger-template/template/.github/workflows/docs.yml b/logger-template/template/.github/workflows/docs.yml
new file mode 100644
index 0000000..11b0a37
--- /dev/null
+++ b/logger-template/template/.github/workflows/docs.yml
@@ -0,0 +1,20 @@
+name: Documentation
+
+on:
+ push:
+ branches: [master]
+ pull_request:
+ branches: [master]
+
+jobs:
+ check-docs:
+ name: Check
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install cargo-rdme
+ uses: taiki-e/install-action@v2
+ with:
+ tool: cargo-rdme
+ - name: Check README.md is up-to-date
+ run: cargo rdme --check
diff --git a/logger-template/template/.github/workflows/semver_checks.yml b/logger-template/template/.github/workflows/semver_checks.yml
new file mode 100644
index 0000000..b0db256
--- /dev/null
+++ b/logger-template/template/.github/workflows/semver_checks.yml
@@ -0,0 +1,16 @@
+name: Semver Checks
+
+on:
+ push:
+ branches: [master]
+ pull_request:
+ branches: [master]
+
+jobs:
+ semver-checks:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Check semver
+ uses: obi1kenobi/cargo-semver-checks-action@v2
diff --git a/logger-template/template/.gitignore b/logger-template/template/.gitignore
new file mode 100644
index 0000000..6936990
--- /dev/null
+++ b/logger-template/template/.gitignore
@@ -0,0 +1,3 @@
+/target
+**/*.rs.bk
+Cargo.lock
diff --git a/logger-template/template/CHANGELOG.md b/logger-template/template/CHANGELOG.md
new file mode 100644
index 0000000..bd120e9
--- /dev/null
+++ b/logger-template/template/CHANGELOG.md
@@ -0,0 +1,139 @@
+0.14.1:
+- re-export log::LevelFilter
+
+0.14.0:
+- Update version of ratatui
+
+0.13.2:
+- fix tracing support
+
+0.13.1:
+- fix missing `move_events()` on half full buffer in case hot buffer capacity was odd
+
+0.13.0:
+- `move_events()` is not published anymore, but called by a cyclic internal task.
+ This task is called by timeout (10ms) unless the hot buffer is half full.
+- `init_logger()` returns now `Result<(), TuiLoggerError>`
+
+0.12.1:
+- fix for issue #69: avoid unwrap panic by using default level
+- add `set_buffer_depth()` to modify circular buffer size
+
+0.12.0:
+- update ratatui to 0.28
+
+0.11.2:
+- update ratatui to 0.27
+
+0.11.1:
+- one line error report for demo example, if feature flag crossterm or termion not given
+- use cargo readme and test in github build
+- Fix of issue #60: panic on too small widget size
+
+0.11.0:
+- BREAKING CHANGE: TuiWidgetEvent::transition() method now takes a TuiWidgetEvent by value instead of by reference.
+- update ratatui to 0.25
+
+0.10.1:
+- update ratatui to ^0.25.0
+
+0.10.0:
+- Remove support for tui legacy crate
+- Use `Cell::set_symbol()` as performance optimization from ratatui
+- Require chrono >= 0.4.20 for avoid security vulnerability (https://rustsec.org/advisories/RUSTSEC-2020-0159.html)
+
+0.9.6:
+- update ratatui to 0.23.0
+
+0.9.5:
+- rework examples/demo to not use termion
+
+0.9.4:
+- fix breaking change in 0.9.3 as reported by issue #43
+
+0.9.3:
+- update to ratatui 0.22 and fix clippy warnings
+
+0.9.2:
+- update to ratatui 0.21
+
+0.9.1:
+- Implement Eq for TuiWidgetEvent
+- suppport `border_type()` for TuiLoggerSmartWidget
+- Disable default features of chrono to avoid import of `time` v0.1.x
+
+0.9.0:
+- support for tracing-subscriber
+- add optional ratatui support as proposed by (#32)
+- slog is NOT a default feature anymore. Enable with `slog-support`
+
+0.8.3:
+- Make `TuiWidgetState.set_default_display_level()` work for TuiLoggerWidget (#30)
+
+0.8.2:
+- Allow TuiLoggerWidget to be controlled with TuiWidgetState by calling state() builder function (#30)
+- Extend demo for an example for this TuiLoggerWidget control
+
+0.8.1:
+- Update to tui-rs 0.19 and slog to 2.7.0
+
+0.8.0:
+- Update to tui-rs 0.18
+
+0.7.1:
+- Update to tui-rs 0.17
+
+0.7.0:
+- Update rust edition in Cargo.toml to 2021
+- Fix all warnings from cargo clippy
+- new function for TuiWidgetState to set the default display level - not impacting the recording
+ ```rust
+ set_default_display_level(self, levelfilter: LevelFilter) -> TuiWidgetState
+- changed signature for TuiWidgetState function from
+ ```rust
+ set_level_for_target(&self, target: &str, levelfilter: LevelFilter) -> &TuiWidgetState
+ ```
+ to
+ ```rust
+ set_level_for_target(self, target: &str, levelfilter: LevelFilter) -> TuiWidgetState
+ ```
+
+
+0.6.6:
+- Add functions to format output of log data as discussed in [issue #19](https://github.com/gin66/tui-logger/issues/19)
+ The functions are with their default values:
+ ```
+ output_separator(':')
+ output_timestamp(Some("%H:%M:%S".to_string()))
+ output_level(Some(TuiLoggerLevelOutput::Long))
+ output_target(true)
+ output_file(true)
+ output_line(true)
+ ```
+
+0.6.5:
+- Use thread safe counterparts for Rc/RefCell
+
+0.6.4:
+- Bump version up for update to tui 0.16
+
+0.6.3:
+- Removed verbose timestamp info log (issue #16)
+
+0.6.2:
+- Fix by Wuelle to avoid panic on line wrapping inside a utf8 character
+
+0.6.1:
+- Changes in README
+
+0.6.0:
+- Support Scrollback in log history with TuiWidgetEvent::PrevPageKey, NextPageKey and EscapeKey
+- log and target panes' title can be set via .title_log(String) and .title_target(String)
+
+0.5.1:
+- TuiWidgetEvent is now Debug, Clone, PartialEq, Hash
+
+0.5.0:
+- Remove dispatcher completely
+- Get rid of dependency to termion and crossterm
+- KeyCommands to be translated by the application into KeyEvents for TuiWidgetState::transition()
diff --git a/logger-template/template/Cargo.toml b/logger-template/template/Cargo.toml
new file mode 100644
index 0000000..c2fa40b
--- /dev/null
+++ b/logger-template/template/Cargo.toml
@@ -0,0 +1,55 @@
+[package]
+name = "tui-logger"
+version = "0.14.1"
+authors = ["Jochen Kiemes <jochen@kiemes.de>"]
+edition = "2021"
+license = "MIT"
+description = "Logger with smart widget for the `ratatui` crate"
+documentation = "https://docs.rs/tui-logger/latest/tui_logger/"
+repository = "https://github.com/gin66/tui-logger"
+readme = "README.md"
+keywords = ["tui", "log", "logger", "widget", "dispatcher"]
+
+[dependencies]
+log = "0.4"
+chrono = { version = "^0.4.38", default-features = false, features = ["clock"] }
+ratatui = { version = "0.29", default-features = false}
+tracing = {version = "0.1.40", optional = true}
+tracing-subscriber = {version = "0.3", optional = true}
+lazy_static = "1.5"
+fxhash = "0.2"
+parking_lot = "0.12"
+slog = { version = "2.7.0", optional = true }
+
+[dev-dependencies]
+# the crate is compatible with ratatui >=0.25.0, but the demo uses features from 0.27.0
+ratatui = { version = "0.29", default-features = false}
+anyhow = "1.0.91"
+env_logger = "0.11.5"
+termion = {version = "4.0.3" }
+crossterm = {version = "0.28"}
+
+[features]
+slog-support = ["slog"]
+tracing-support = ["tracing", "tracing-subscriber"]
+
+# only necessary for the demo, the crate does has no dependencies on these
+#
+# feature_crossterm_or_termion_must_be_selected to generate one line error message
+# instead of many compile error messages, if neither crossterm nor termion are selected.
+feature_crossterm_or_termion_must_be_selected = []
+crossterm = ["ratatui/crossterm", "feature_crossterm_or_termion_must_be_selected"]
+termion = ["ratatui/termion", "feature_crossterm_or_termion_must_be_selected"]
+
+# Docs.rs-specific configuration required to enable documentation of
+# code requiring optional features.
+[package.metadata.docs.rs]
+# Document all features
+all-features = true
+# Defines the configuration attribute `docsrs`
+rustdoc-args = ["--cfg", "docsrs"]
+
+[[example]]
+name="demo"
+required-features=["feature_crossterm_or_termion_must_be_selected"]
+
diff --git a/logger-template/template/LICENSE b/logger-template/template/LICENSE
new file mode 100644
index 0000000..a6efc1d
--- /dev/null
+++ b/logger-template/template/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Jochen Kiemes
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/logger-template/template/README.md b/logger-template/template/README.md
new file mode 100644
index 0000000..915da11
--- /dev/null
+++ b/logger-template/template/README.md
@@ -0,0 +1,213 @@
+# tui-logger
+
+## Logger with smart widget for the `tui` and `ratatui` crate
+
+[](https://deps.rs/repo/github/gin66/tui-logger)
+
+
+
+### Demo of the widget
+
+
+
+### Documentation
+
+[Documentation](https://docs.rs/tui-logger/latest/tui_logger/)
+
+### Important note for `tui`
+
+The `tui` crate has been archived and `ratatui` has taken over.
+In order to avoid supporting compatibility for an inactive crate,
+the v0.9.x releases are the last to support `tui`. In case future bug fixes
+are needed, the branch `tui_legacy` has been created to track changes to 0.9.x releases.
+
+Starting with v0.10 `tui-logger` is `ratatui` only.
+
+### Features
+
+- [X] Logger implementation for the `log` crate
+- [X] Logger enable/disable detection via hash table (avoid string compare)
+- [X] Hot logger code only copies enabled log messages with timestamp into a circular buffer
+- [X] Widgets/move_message() retrieve captured log messages from hot circular buffer
+- [X] Lost message detection due to circular buffer
+- [X] Log filtering performed on log record target
+- [X] Simple Widgets to view logs and configure debuglevel per target
+- [X] Logging of enabled logs to file
+- [X] Scrollback in log history
+- [x] Title of target and log pane can be configured
+- [X] `slog` support, providing a Drain to integrate into your `slog` infrastructure
+- [X] `tracing` support
+- [ ] Allow configuration of target dependent loglevel specifically for file logging
+- [ ] Avoid duplicating of target, module and filename in every log record
+- [ ] Simultaneous modification of all targets' display/hot logging loglevel by key command
+
+### Smart Widget
+
+Smart widget consists of two widgets. Left is the target selector widget and
+on the right side the logging messages view scrolling up. The target selector widget
+can be hidden/shown during runtime via key command.
+The key command to be provided to the TuiLoggerWidget via transition() function.
+
+The target selector widget looks like this:
+
+
+
+It controls:
+
+- Capturing of log messages by the logger
+- Selection of levels for display in the logging message view
+
+The two columns have the following meaning:
+
+- Code EWIDT: E stands for Error, W for Warn, Info, Debug and Trace.
+ + Inverted characters (EWIDT) are enabled log levels in the view
+ + Normal characters show enabled capturing of a log level per target
+ + If any of EWIDT are not shown, then the respective log level is not captured
+- Target of the log events can be defined in the log e.g. `warn!(target: "demo", "Log message");`
+
+### Smart Widget Key Commands
+```rust
+| KEY | ACTION
+|----------|-----------------------------------------------------------|
+| h | Toggles target selector widget hidden/visible
+| f | Toggle focus on the selected target only
+| UP | Select previous target in target selector widget
+| DOWN | Select next target in target selector widget
+| LEFT | Reduce SHOWN (!) log messages by one level
+| RIGHT | Increase SHOWN (!) log messages by one level
+| - | Reduce CAPTURED (!) log messages by one level
+| + | Increase CAPTURED (!) log messages by one level
+| PAGEUP | Enter Page Mode and scroll approx. half page up in log history.
+| PAGEDOWN | Only in page mode: scroll 10 events down in log history.
+| ESCAPE | Exit page mode and go back to scrolling mode
+| SPACE | Toggles hiding of targets, which have logfilter set to off
+```
+
+The mapping of key to action has to be done in the application. The respective TuiWidgetEvent
+has to be provided to TuiWidgetState::transition().
+
+Remark to the page mode: The timestamp of the event at event history's bottom line is used as
+reference. This means, changing the filters in the EWIDT/focus from the target selector window
+should work as expected without jumps in the history. The page next/forward advances as
+per visibility of the events.
+
+### Basic usage to initialize logger-system:
+```rust
+#[macro_use]
+extern crate log;
+//use tui_logger;
+
+fn main() {
+ // Early initialization of the logger
+
+ // Set max_log_level to Trace
+ tui_logger::init_logger(log::LevelFilter::Trace).unwrap();
+
+ // Set default level for unknown targets to Trace
+ tui_logger::set_default_level(log::LevelFilter::Trace);
+
+ // code....
+}
+```
+
+For use of the widget please check examples/demo.rs
+
+### Demo
+
+Run demo using termion:
+
+```rust
+cargo run --example demo --features termion
+```
+
+Run demo with crossterm:
+
+```rust
+cargo run --example demo --features crossterm
+```
+
+### `slog` support
+
+`tui-logger` provides a [`TuiSlogDrain`] which implements `slog::Drain` and will route all records
+it receives to the `tui-logger` widget.
+
+Enabled by feature "slog-support"
+
+### `tracing-subscriber` support
+
+`tui-logger` provides a [`TuiTracingSubscriberLayer`] which implements
+`tracing_subscriber::Layer` and will collect all events
+it receives to the `tui-logger` widget
+
+Enabled by feature "tracing-support"
+
+### Custom filtering
+```rust
+#[macro_use]
+extern crate log;
+//use tui_logger;
+use env_logger;
+
+fn main() {
+ // Early initialization of the logger
+ let drain = tui_logger::Drain::new();
+ // instead of tui_logger::init_logger, we use `env_logger`
+ env_logger::Builder::default()
+ .format(move |buf, record|
+ // patch the env-logger entry through our drain to the tui-logger
+ Ok(drain.log(record))
+ ).init(); // make this the global logger
+ // code....
+}
+```
+
+### Internals
+
+For logging there are two circular buffers in use:
+* "hot" buffer, which is written to during any logging macro invocation
+* main buffer, which holds events to be displayed by the widgets.
+
+The size of the "hot" buffer is 1000 and can be modified by `set_hot_buffer_depth()`.
+The size of the main buffer is 10000 and can be modified by `set_buffer_depth()`.
+
+Reason for this scheme: The main buffer is locked for a while during widget updates.
+In order to avoid blocking the log-macros, this scheme is in use.
+
+The copy from "hot" buffer to main buffer is performed by a call to `move_events()`,
+which is done in a cyclic task, which repeats every 10 ms, or when the hot buffer is half full.
+
+In versions <0.13 log messages may have been lost, if the widget wasn't drawn.
+
+### THANKS TO
+
+* [Florian Dehau](https://github.com/fdehau) for his great crate [tui-rs](https://github.com/fdehau/tui-rs)
+* [Antoine Büsch](https://github.com/abusch) for providing the patches to tui-rs v0.3.0 and v0.6.0
+* [Adam Sypniewski](https://github.com/ajsyp) for providing the patches to tui-rs v0.6.2
+* [James aka jklong](https://github.com/jklong) for providing the patch to tui-rs v0.7
+* [icy-ux](https://github.com/icy-ux) for adding slog support and example
+* [alvinhochun](https://github.com/alvinhochun) for updating to tui 0.10 and crossterm support
+* [brooksmtownsend](https://github.com/brooksmtownsend) Patch to remove verbose timestamp info
+* [Kibouo](https://github.com/Kibouo) Patch to change Rc/Refcell to thread-safe counterparts
+* [Afonso Bordado](https://github.com/afonso360) for providing the patch to tui-rs v0.17
+* [Benjamin Kampmann](https://github.com/gnunicorn) for providing patch to tui-rs v0.18
+* [Paul Sanders](https://github.com/pms1969) for providing patch in [issue #30](https://github.com/gin66/tui-logger/issues/30)
+* [Ákos Hadnagy](https://github.com/ahadnagy) for providing patch in [#31](https://github.com/gin66/tui-logger/issues/31) for tracing-subscriber support
+* [Orhun Parmaksız](https://github.com/orhun) for providing patches in [#33](https://github.com/gin66/tui-logger/issues/33), [#34](https://github.com/gin66/tui-logger/issues/34), [#37](https://github.com/gin66/tui-logger/issues/37) and [#46](https://github.com/gin66/tui-logger/issues/46)
+* [purephantom](https://github.com/purephantom) for providing patch in [#42](https://github.com/gin66/tui-logger/issues/42) for ratatui update
+* [Badr Bouslikhin](https://github.com/badrbouslikhin) for providing patch in [#47](https://github.com/gin66/tui-logger/issues/47) for ratatui update
+* [ganthern](https://github.com/ganthern) for providing patch in [#49](https://github.com/gin66/tui-logger/issues/49) for tui support removal
+* [Linda_pp](https://github.com/rhysd) for providing patch in [#51](https://github.com/gin66/tui-logger/issues/51) for Cell:set_symbol
+* [Josh McKinney](https://github.com/joshka) for providing patch in
+[#56](https://github.com/gin66/tui-logger/issues/56) for Copy on TuiWidgetEvent and
+TuiLoggerWidget
+* [nick42d](https://github.com/nick42d) for providing patch in
+[#63](https://github.com/gin66/tui-logger/issues/63) for semver checks and [#74](https://github.com/gin66/tui-logger/pull/74)
+* [Tom Groenwoldt](https://github.com/tomgroenwoldt) for providing patch in [#65](https://github.com/gin66/tui-logger/issues/65) for ratatui update
+* [Kevin](https://github.com/doesnotcompete) for providing patch in [#71](https://github.com/issues/71)
+* [urizennnn](https://github.com/urizennnn) for providing patch in [#72](https://github.com/issues/72)
+
+### Star History
+
+[](https://star-history.com/#gin66/tui-logger&Date)
+
+License: MIT
diff --git a/logger-template/template/bacon.toml b/logger-template/template/bacon.toml
new file mode 100644
index 0000000..7caa3f2
--- /dev/null
+++ b/logger-template/template/bacon.toml
@@ -0,0 +1,58 @@
+# This is a configuration file for the bacon tool
+#
+# Bacon repository: https://github.com/Canop/bacon
+# Complete help on configuration: https://dystroy.org/bacon/config/
+# You can also check bacon's own bacon.toml file
+# as an example: https://github.com/Canop/bacon/blob/main/bacon.toml
+
+default_job = "check"
+
+[jobs.check]
+command = ["cargo", "check", "--color", "always"]
+need_stdout = false
+
+# This is a helpful job to check that the demo compiles with the crossterm
+# feature enabled. This and the termion feature are mutually exclusive.
+[jobs.check-crossterm]
+command = ["cargo", "check", "--all-targets", "--features", "crossterm", "--color", "always"]
+need_stdout = false
+
+# This is a helpful job to check that the demo compiles with the termion
+# feature enabled. This and the crossterm feature are mutually exclusive.
+[jobs.check-termion]
+command = ["cargo", "check", "--all-targets", "--features", "termion", "--color", "always"]
+need_stdout = false
+
+[jobs.clippy]
+command = [
+ "cargo", "clippy",
+ "--color", "always",
+]
+need_stdout = false
+
+[jobs.test]
+command = [
+ "cargo", "test", "--libs", "--color", "always",
+ "--", "--color", "always", # see https://github.com/Canop/bacon/issues/124
+]
+need_stdout = true
+
+[jobs.doc]
+command = ["cargo", "doc", "--color", "always", "--no-deps"]
+need_stdout = false
+
+# If the doc compiles, then it opens in your browser and bacon switches
+# to the previous job
+[jobs.doc-open]
+command = ["cargo", "doc", "--color", "always", "--no-deps", "--open"]
+need_stdout = false
+on_success = "back" # so that we don't open the browser at each change
+
+# You may define here keybindings that would be specific to
+# a project, for example a shortcut to launch a specific job.
+# Shortcuts to internal functions (scrolling, toggling, etc.)
+# should go in your personal global prefs.toml file instead.
+[keybindings]
+# alt-m = "job:my-job"
+1 = "job:check-crossterm"
+2 = "job:check-termion"
diff --git a/logger-template/template/cargo-generate.toml b/logger-template/template/cargo-generate.toml
new file mode 100644
index 0000000..2589766
--- /dev/null
+++ b/logger-template/template/cargo-generate.toml
@@ -0,0 +1,2 @@
+[template]
+cargo_generate_version = ">=0.10.0"
diff --git a/logger-template/template/demo.tape b/logger-template/template/demo.tape
new file mode 100644
index 0000000..e754c9c
--- /dev/null
+++ b/logger-template/template/demo.tape
@@ -0,0 +1,105 @@
+# VHS documentation
+#
+# Output:
+# Output <path>.gif Create a GIF output at the given <path>
+# Output <path>.mp4 Create an MP4 output at the given <path>
+# Output <path>.webm Create a WebM output at the given <path>
+#
+# Require:
+# Require <string> Ensure a program is on the $PATH to proceed
+#
+# Settings:
+# Set FontSize <number> Set the font size of the terminal
+# Set FontFamily <string> Set the font family of the terminal
+# Set Height <number> Set the height of the terminal
+# Set Width <number> Set the width of the terminal
+# Set LetterSpacing <float> Set the font letter spacing (tracking)
+# Set LineHeight <float> Set the font line height
+# Set LoopOffset <float>% Set the starting frame offset for the GIF loop
+# Set Theme <json|string> Set the theme of the terminal
+# Set Padding <number> Set the padding of the terminal
+# Set Framerate <number> Set the framerate of the recording
+# Set PlaybackSpeed <float> Set the playback speed of the recording
+# Set MarginFill <file|#000000> Set the file or color the margin will be filled with.
+# Set Margin <number> Set the size of the margin. Has no effect if MarginFill isn't set.
+# Set BorderRadius <number> Set terminal border radius, in pixels.
+# Set WindowBar <string> Set window bar type. (one of: Rings, RingsRight, Colorful, ColorfulRight)
+# Set WindowBarSize <number> Set window bar size, in pixels. Default is 40.
+# Set TypingSpeed <time> Set the typing speed of the terminal. Default is 50ms.
+#
+# Sleep:
+# Sleep <time> Sleep for a set amount of <time> in seconds
+#
+# Type:
+# Type[@<time>] "<characters>" Type <characters> into the terminal with a
+# <time> delay between each character
+#
+# Keys:
+# Escape[@<time>] [number] Press the Escape key
+# Backspace[@<time>] [number] Press the Backspace key
+# Delete[@<time>] [number] Press the Delete key
+# Insert[@<time>] [number] Press the Insert key
+# Down[@<time>] [number] Press the Down key
+# Enter[@<time>] [number] Press the Enter key
+# Space[@<time>] [number] Press the Space key
+# Tab[@<time>] [number] Press the Tab key
+# Left[@<time>] [number] Press the Left Arrow key
+# Right[@<time>] [number] Press the Right Arrow key
+# Up[@<time>] [number] Press the Up Arrow key
+# Down[@<time>] [number] Press the Down Arrow key
+# PageUp[@<time>] [number] Press the Page Up key
+# PageDown[@<time>] [number] Press the Page Down key
+# Ctrl+<key> Press the Control key + <key> (e.g. Ctrl+C)
+#
+# Display:
+# Hide Hide the subsequent commands from the output
+# Show Show the subsequent commands in the output
+
+Output target/demo.gif
+Set Theme "Aardvark Blue"
+Set Width 1600
+Set Height 1200
+Set Framerate 50
+
+Hide
+Type "cargo run --example=demo --features=crossterm" Enter
+
+Sleep 2s # allows time for build
+Show
+Right 2 # set App to tracing
+Down 2 # select the crossterm target
+Right 2 # set crossterm to tracing
+Sleep 1s
+
+# a screenshot for using in a more static context (e.g. ratatui.rs showcase)
+Screenshot target/demo.png
+Sleep 1s
+
+# The following commented out commands are for a more full demo similar to the existing demo
+# However they produce a much larger gif and are not necessary for the showcase
+
+# Type "f" Sleep 2s # focus on the crossterm target
+# Up
+# Up
+# Type "f" Sleep 2s # unfocus
+
+# # unselect everything except error
+# Left 4 Down
+# Left 2 Down
+# Left 4 Down
+# Left 2 Down
+# Left 2 Sleep 2s
+
+# # Hide / show the selector
+# Type "h" Sleep 2s
+# Type "h" Sleep 2s
+
+# # turn off tracing capture
+# Type "-" Up
+# Type "-" Up
+# Type "-" Up
+# Type "-" Up
+# Type "-" Sleep 2s
+
+Hide
+Type "q"
diff --git a/logger-template/template/doc/demo_v0.6.6.gif b/logger-template/template/doc/demo_v0.6.6.gif
new file mode 100644
index 0000000..1f2b8fc
Binary files /dev/null and b/logger-template/template/doc/demo_v0.6.6.gif differ
diff --git a/logger-template/template/doc/example.png b/logger-template/template/doc/example.png
new file mode 100644
index 0000000..536d196
Binary files /dev/null and b/logger-template/template/doc/example.png differ
diff --git a/logger-template/template/doc/example.svg b/logger-template/template/doc/example.svg
new file mode 100644
index 0000000..077ca1f
--- /dev/null
+++ b/logger-template/template/doc/example.svg
@@ -0,0 +1,198 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="terminal" baseProfile="full" viewBox="0 0 1016 716" width="1016" version="1.1">
+ <defs>
+ <termtosvg:template_settings xmlns:termtosvg="https://github.com/nbedos/termtosvg">
+ <termtosvg:screen_geometry columns="127" rows="42"/>
+ <termtosvg:animation type="css"/>
+ </termtosvg:template_settings>
+ <style type="text/css" id="generated-style"><![CDATA[#screen {
+ font-family: 'DejaVu Sans Mono', monospace;
+ font-style: normal;
+ font-size: 14px;
+ }
+
+ text {
+ dominant-baseline: text-before-edge;
+ white-space: pre;
+ }
+
+ :root {
+ --animation-duration: 32277ms;
+ }
+
+ @keyframes roll {
+ 0.000%{transform:translateY(0px)}
+0.090%{transform:translateY(-748px)}
+0.096%{transform:translateY(-1496px)}
+1.047%{transform:translateY(-2244px)}
+2.119%{transform:translateY(-2992px)}
+5.233%{transform:translateY(-3740px)}
+5.239%{transform:translateY(-4488px)}
+5.242%{transform:translateY(-5236px)}
+5.753%{transform:translateY(-5984px)}
+7.541%{transform:translateY(-6732px)}
+10.106%{transform:translateY(-7480px)}
+10.112%{transform:translateY(-8228px)}
+10.116%{transform:translateY(-8976px)}
+10.119%{transform:translateY(-9724px)}
+13.273%{transform:translateY(-10472px)}
+13.276%{transform:translateY(-11220px)}
+13.285%{transform:translateY(-11968px)}
+13.297%{transform:translateY(-12716px)}
+13.316%{transform:translateY(-13464px)}
+13.335%{transform:translateY(-14212px)}
+13.362%{transform:translateY(-14960px)}
+13.403%{transform:translateY(-15708px)}
+13.449%{transform:translateY(-16456px)}
+16.073%{transform:translateY(-17204px)}
+16.129%{transform:translateY(-17952px)}
+16.185%{transform:translateY(-18700px)}
+16.340%{transform:translateY(-19448px)}
+16.396%{transform:translateY(-20196px)}
+16.616%{transform:translateY(-20944px)}
+16.671%{transform:translateY(-21692px)}
+17.238%{transform:translateY(-22440px)}
+18.366%{transform:translateY(-23188px)}
+19.237%{transform:translateY(-23936px)}
+19.466%{transform:translateY(-24684px)}
+19.528%{transform:translateY(-25432px)}
+21.724%{transform:translateY(-26180px)}
+21.783%{transform:translateY(-26928px)}
+22.499%{transform:translateY(-27676px)}
+22.592%{transform:translateY(-28424px)}
+22.645%{transform:translateY(-29172px)}
+24.324%{transform:translateY(-29920px)}
+24.383%{transform:translateY(-30668px)}
+25.647%{transform:translateY(-31416px)}
+25.703%{transform:translateY(-32164px)}
+26.142%{transform:translateY(-32912px)}
+26.276%{transform:translateY(-33660px)}
+27.109%{transform:translateY(-34408px)}
+27.230%{transform:translateY(-35156px)}
+28.757%{transform:translateY(-35904px)}
+28.810%{transform:translateY(-36652px)}
+29.550%{transform:translateY(-37400px)}
+29.696%{transform:translateY(-38148px)}
+31.902%{transform:translateY(-38896px)}
+31.961%{transform:translateY(-39644px)}
+32.543%{transform:translateY(-40392px)}
+32.683%{transform:translateY(-41140px)}
+33.538%{transform:translateY(-41888px)}
+33.671%{transform:translateY(-42636px)}
+35.000%{transform:translateY(-43384px)}
+35.059%{transform:translateY(-44132px)}
+38.055%{transform:translateY(-44880px)}
+38.108%{transform:translateY(-45628px)}
+40.753%{transform:translateY(-46376px)}
+40.800%{transform:translateY(-47124px)}
+41.150%{transform:translateY(-47872px)}
+41.237%{transform:translateY(-48620px)}
+41.348%{transform:translateY(-49368px)}
+41.398%{transform:translateY(-50116px)}
+42.736%{transform:translateY(-50864px)}
+42.789%{transform:translateY(-51612px)}
+44.307%{transform:translateY(-52360px)}
+45.565%{transform:translateY(-53108px)}
+45.618%{transform:translateY(-53856px)}
+47.353%{transform:translateY(-54604px)}
+48.604%{transform:translateY(-55352px)}
+50.500%{transform:translateY(-56100px)}
+51.309%{transform:translateY(-56848px)}
+53.549%{transform:translateY(-57596px)}
+54.686%{transform:translateY(-58344px)}
+54.832%{transform:translateY(-59092px)}
+56.644%{transform:translateY(-59840px)}
+58.735%{transform:translateY(-60588px)}
+58.794%{transform:translateY(-61336px)}
+58.844%{transform:translateY(-62084px)}
+59.820%{transform:translateY(-62832px)}
+59.944%{transform:translateY(-63580px)}
+61.564%{transform:translateY(-64328px)}
+61.675%{transform:translateY(-65076px)}
+61.747%{transform:translateY(-65824px)}
+62.053%{transform:translateY(-66572px)}
+62.128%{transform:translateY(-67320px)}
+62.698%{transform:translateY(-68068px)}
+62.853%{transform:translateY(-68816px)}
+62.918%{transform:translateY(-69564px)}
+63.249%{transform:translateY(-70312px)}
+63.336%{transform:translateY(-71060px)}
+64.455%{transform:translateY(-71808px)}
+66.007%{transform:translateY(-72556px)}
+66.069%{transform:translateY(-73304px)}
+66.165%{transform:translateY(-74052px)}
+66.214%{transform:translateY(-74800px)}
+66.955%{transform:translateY(-75548px)}
+67.076%{transform:translateY(-76296px)}
+68.984%{transform:translateY(-77044px)}
+69.037%{transform:translateY(-77792px)}
+69.086%{transform:translateY(-78540px)}
+69.529%{transform:translateY(-79288px)}
+70.041%{transform:translateY(-80036px)}
+70.595%{transform:translateY(-80784px)}
+71.066%{transform:translateY(-81532px)}
+72.147%{transform:translateY(-82280px)}
+72.209%{transform:translateY(-83028px)}
+73.476%{transform:translateY(-83776px)}
+73.600%{transform:translateY(-84524px)}
+75.298%{transform:translateY(-85272px)}
+75.363%{transform:translateY(-86020px)}
+75.515%{transform:translateY(-86768px)}
+75.568%{transform:translateY(-87516px)}
+76.798%{transform:translateY(-88264px)}
+76.860%{transform:translateY(-89012px)}
+76.925%{transform:translateY(-89760px)}
+78.344%{transform:translateY(-90508px)}
+81.448%{transform:translateY(-91256px)}
+83.688%{transform:translateY(-92004px)}
+83.741%{transform:translateY(-92752px)}
+83.797%{transform:translateY(-93500px)}
+84.596%{transform:translateY(-94248px)}
+84.723%{transform:translateY(-94996px)}
+86.771%{transform:translateY(-95744px)}
+86.842%{transform:translateY(-96492px)}
+86.916%{transform:translateY(-97240px)}
+87.710%{transform:translateY(-97988px)}
+87.771%{transform:translateY(-98736px)}
+90.823%{transform:translateY(-99484px)}
+91.403%{transform:translateY(-100232px)}
+91.495%{transform:translateY(-100980px)}
+91.536%{transform:translateY(-101728px)}
+96.902%{transform:translateY(-102476px)}
+100.000%{transform:translateY(-102476px)}
+ }
+
+ #screen_view {
+ animation-duration: 32277ms;
+ animation-iteration-count:infinite;
+ animation-name:roll;
+ animation-timing-function: steps(1,end);
+ animation-fill-mode: forwards;
+ }
+ ]]></style>
+ <style type="text/css" id="user-style">
+ /* The colors defined below are the default 16 colors used for rendering text of the terminal. Adjust
+ them as needed.
+ PowerShell colors based on https://en.wikipedia.org/wiki/ANSI_escape_code#Colors */
+ .foreground {fill: #cccccc;}
+ .background {fill: #0c0c0c;}
+ .color0 {fill: #0c0c0c;}
+ .color1 {fill: #c50f1f;}
+ .color2 {fill: #13a10e;}
+ .color3 {fill: #c19c00;}
+ .color4 {fill: #0037da;}
+ .color5 {fill: #881798;}
+ .color6 {fill: #3a96dd;}
+ .color7 {fill: #cccccc;}
+ .color8 {fill: #767676;}
+ .color9 {fill: #e74856;}
+ .color10 {fill: #16c60c;}
+ .color11 {fill: #f9f1a5;}
+ .color12 {fill: #3b78ff;}
+ .color13 {fill: #b4009e;}
+ .color14 {fill: #61d6d6;}
+ .color15 {fill: #f2f2f2;}
+ </style>
+ </defs>
+ <svg id="screen" width="1016" height="714" viewBox="0 0 1016 714" preserveAspectRatio="xMidYMin slice">
+ <rect class="background" height="100%" width="100%" x="0" y="0"/><defs><g id="g1"><text x="0" textLength="8" class="background"> </text><text x="8" textLength="1008" class="foreground"> </text></g><g id="g2"><text x="0" textLength="200" font-weight="bold" class="foreground">nuc1~/src/rust/tui-logger</text><text x="200" textLength="8" class="foreground">[</text><text x="208" textLength="48" font-weight="bold" class="color13">master</text><text x="256" textLength="24" class="foreground"> L|</text><text x="280" textLength="16" class="color6">…1</text><text x="296" textLength="40" class="foreground">] % </text><text x="336" textLength="8" class="background"> </text><text x="344" textLength="672" class="foreground"> </text></g><g id="g3"><text x="0" textLength="200" font-weight="bold" class="foreground">nuc1~/src/rust/tui-logger</text><text x="200" textLength="8" class="foreground">[</text><text x="208" textLength="48" font-weight="bold" class="color13">master</text><text x="256" textLength="24" class="foreground"> L|</text><text x="280" textLength="16" class="color6">…1</text><text x="296" textLength="208" class="foreground">] % termtosvg example.svg</text><text x="504" textLength="8" class="background"> </text><text x="512" textLength="504" class="foreground"> </text></g><g id="g4"><text x="0" textLength="200" font-weight="bold" class="foreground">nuc1~/src/rust/tui-logger</text><text x="200" textLength="8" class="foreground">[</text><text x="208" textLength="48" font-weight="bold" class="color13">master</text><text x="256" textLength="24" class="foreground"> L|</text><text x="280" textLength="16" class="color6">…1</text><text x="296" textLength="232" class="foreground">] % cargo run --example demo</text><text x="528" textLength="8" class="background"> </text><text x="536" textLength="480" class="foreground"> </text></g><g id="g5"><text x="0" textLength="200" font-weight="bold" class="foreground">nuc1~/src/rust/tui-logger</text><text x="200" textLength="8" class="foreground">[</text><text x="208" textLength="48" font-weight="bold" class="color13">master</text><text x="256" textLength="24" class="foreground"> L|</text><text x="280" textLength="16" class="color6">…1</text><text x="296" textLength="40" class="foreground">] % </text><text x="336" textLength="40" class="color2">cargo</text><text x="376" textLength="40" class="foreground"> run </text><text x="416" textLength="72" class="color6">--example</text><text x="488" textLength="40" class="foreground"> demo</text><text x="528" textLength="8" class="background"> </text><text x="536" textLength="480" class="foreground"> </text></g><g id="g6"><text x="0" textLength="200" font-weight="bold" class="foreground">nuc1~/src/rust/tui-logger</text><text x="200" textLength="8" class="foreground">[</text><text x="208" textLength="48" font-weight="bold" class="color13">master</text><text x="256" textLength="24" class="foreground"> L|</text><text x="280" textLength="16" class="color6">…1</text><text x="296" textLength="40" class="foreground">] % </text><text x="336" textLength="40" class="color2">cargo</text><text x="376" textLength="40" class="foreground"> run </text><text x="416" textLength="72" class="color6">--example</text><text x="488" textLength="528" class="foreground"> demo </text></g><g id="g7"><text x="0" textLength="8" class="background"> </text></g><g id="g8"><text x="0" textLength="96" font-weight="bold" class="color10"> Compiling</text><text x="96" textLength="432" class="foreground"> tui-logger v0.4.13 (/home/jochen/src/rust/tui-logger)</text></g><g id="g9"><text x="0" textLength="8" class="background"> </text><text x="8" textLength="88" font-weight="bold" class="color14"> Building</text><text x="96" textLength="904" class="foreground"> [========================> ] 40/42: tui-logger </text></g><g id="g10"><text x="0" textLength="8" class="background"> </text><text x="8" textLength="88" font-weight="bold" class="color14"> Building</text><text x="96" textLength="904" class="foreground"> [=========================> ] 41/42: demo(example) </text></g><g id="g11"><text x="0" textLength="96" font-weight="bold" class="color10"> Finished</text><text x="96" textLength="920" class="foreground"> dev [unoptimized + debuginfo] target(s) in 1.42s </text></g><g id="g12"><text x="0" textLength="96" font-weight="bold" class="color10"> Running</text><text x="96" textLength="232" class="foreground"> `target/debug/examples/demo`</text></g><g id="g13"><text x="0" textLength="528" class="foreground"> </text></g><g id="g14"><text x="0" textLength="1016" class="foreground"> </text></g><g id="g15"><text x="0" textLength="328" class="foreground"> </text></g><g id="g16"><text x="0" textLength="1016" class="foreground">┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐</text></g><g id="g17"><text x="0" textLength="1016" class="foreground">│┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐│</text></g><g id="g18"><text x="0" textLength="24" class="foreground">││ </text><text x="24" textLength="16" class="background">V1</text><text x="40" textLength="976" class="foreground"> │ V2 │ V3 │ V4 ││</text></g><g id="g19"><text x="0" textLength="384" class="foreground">│└──────────────────────────────────────────────</text></g><g id="g20"><text x="0" textLength="1016" class="foreground">│└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘│</text></g><g id="g21"><text x="0" textLength="40" class="foreground">│┌Tui</text><text x="48" textLength="48" class="foreground">Target</text><text x="104" textLength="176" class="foreground">Selector─────────┐┌Tui</text><text x="288" textLength="24" class="foreground">Log</text><text x="328" textLength="688" class="foreground">[log=13.0/s]────────────────────────────────────────────────────────────────────────┐│</text></g><g id="g22"><text x="0" textLength="16" class="foreground">││</text><text x="16" textLength="40" class="background">EWIDT</text><text x="56" textLength="40" class="foreground">:DEMO</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="240" class="color6">20:29:31:INFO :DEMO:Start demo</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g23"><text x="0" textLength="16" class="foreground">││</text><text x="16" textLength="40" class="background">EWIDT</text><text x="56" textLength="32" class="foreground">:New</text><text x="96" textLength="40" class="foreground">event</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="680" class="color5">20:29:31:TRACE:tui_logger::dispatcher:src/dispatcher.rs:29:New dispatcher is created.</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g24"><text x="0" textLength="16" class="foreground">││</text><text x="16" textLength="40" class="background">EWIDT</text><text x="56" textLength="48" class="foreground">:debug</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="448" class="color5">20:29:31:TRACE:DEMO:examples/demo.rs:59:Sleep one second</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g25"><text x="0" textLength="16" class="foreground">││</text><text x="16" textLength="40" class="background">EWIDT</text><text x="56" textLength="48" class="foreground">:error</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="56" class="color5">20:29:3</text></g><g id="g26"><text x="0" textLength="16" class="foreground">││</text><text x="16" textLength="40" class="background">EWIDT</text><text x="56" textLength="48" class="foreground">:error</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="560" class="color5">20:29:32:TRACE:DEMO:examples/demo.rs:61:Issue log entry for each level</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g27"><text x="0" textLength="16" class="foreground">││</text><text x="16" textLength="40" class="background">EWIDT</text><text x="56" textLength="40" class="foreground">:info</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="392" class="color1">20:29:32:ERROR:error:examples/demo.rs:62:an error</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g28"><text x="0" textLength="16" class="foreground">││</text><text x="16" textLength="40" class="background">EWIDT</text><text x="56" textLength="48" class="foreground">:trace</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="392" class="color3">20:29:32:WARN :warn:examples/demo.rs:63:a warning</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g29"><text x="0" textLength="16" class="foreground">││</text><text x="16" textLength="40" class="background">EWIDT</text><text x="56" textLength="200" class="foreground">:tui_logger::dispatcher││</text><text x="256" textLength="384" class="color5">20:29:32:TRACE:trace:examples/demo.rs:64:a trace</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g30"><text x="0" textLength="16" class="foreground">││</text><text x="16" textLength="40" class="background">EWIDT</text><text x="56" textLength="40" class="foreground">:warn</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="384" class="color2">20:29:32:DEBUG:debug:examples/demo.rs:65:a debug</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g31"><text x="0" textLength="16" class="foreground">││</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="216" class="color6">20:29:32:INFO :info:an info</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g32"><text x="0" textLength="16" class="foreground">││</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="448" class="color5">20:29:32:TRACE:DEMO:examples/demo.rs:59:Sleep one second</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g33"><text x="0" textLength="16" class="foreground">││</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="496" class="color5">20:29:32:TRACE:New event:examples/demo.rs:134:LoopCnt(Some(1))</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g34"><text x="0" textLength="16" class="foreground">││</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="664" class="color5">20:29:32:TRACE:tui_logger::dispatcher:src/dispatcher.rs:64:Dispatcher clear called.</text></g><g id="g35"><text x="0" textLength="16" class="foreground">││</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="664" class="color5">20:29:32:TRACE:tui_logger::dispatcher:src/dispatcher.rs:64:Dispatcher clear called.</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g36"><text x="0" textLength="16" class="foreground">││</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="728" class="color5">20:29:32:TRACE:tui_logger::dispatcher:src/dispatcher.rs:35:Add listener to this dispatcher.</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g37"><text x="0" textLength="16" class="foreground">││</text><text x="240" textLength="16" class="foreground">││</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g38"><text x="0" textLength="880" class="foreground">│└────────────────────────────┘└──────────────────────────────────────────────────────────────────────────────</text></g><g id="g39"><text x="0" textLength="1016" class="foreground">│└────────────────────────────┘└─────────────────────────────────────────────────────────────────────────────────────────────┘│</text></g><g id="g40"><text x="0" textLength="8" class="foreground">│</text><text x="8" textLength="1000" class="color15">┌Independent Tui Logger View────────────────────────────────────────────────────────────────────────────────────────────────┐</text><text x="1008" textLength="8" class="foreground">│</text></g><g id="g41"><text x="0" textLength="8" class="foreground">│</text><text x="8" textLength="1000" class="color15">│20:29:32:ERROR:error:examples/demo.rs:62:an error │</text><text x="1008" textLength="8" class="foreground">│</text></g><g id="g42"><text x="0" textLength="8" class="foreground">│</text><text x="8" textLength="1000" class="color15">│20:29:32:WARN :warn:examples/demo.rs:63:a warning │</text><text x="1008" textLength="8" class="foreground">│</text></g><g id="g43"><text x="0" textLength="8" class="foreground">│</text><text x="8" textLength="1000" class="color15">│20:29:32:TRACE:trace:examples/demo.rs:64:a trace │</text><text x="1008" textLength="8" class="foreground">│</text></g><g id="g44"><text x="0" textLength="8" class="foreground">│</text><text x="8" textLength="528" class="color15">│20:29:32:DEBUG:debug:examples/demo.rs:65:a debug </text></g><g id="g45"><text x="0" textLength="8" class="foreground">│</text><text x="8" textLength="1000" class="color15">│20:29:32:DEBUG:debug:examples/demo.rs:65:a debug │</text><text x="1008" textLength="8" class="foreground">│</text></g><g id="g46"><text x="0" textLength="8" class="foreground">│</text><text x="8" textLength="1000" class="color15">│20:29:32:INFO :info:an info │</text><text x="1008" textLength="8" class="foreground">│</text></g><g id="g47"><text x="0" textLength="8" class="foreground">│</text><text x="8" textLength="1000" class="color15">│20:29:32:TRACE:DEMO:examples/demo.rs:59:Sleep one second │</text><text x="1008" textLength="8" class="foreground">│</text></g><g id="g48"><text x="0" textLength="8" class="foreground">│</text><text x="8" textLength="1000" class="color15">│20:29:32:TRACE:New event:examples/demo.rs:134:LoopCnt(Some(1)) │</text><text x="1008" textLength="8" class="foreground">│</text></g><g id="g49"><text x="0" textLength="8" class="foreground">│</text><text x="8" textLength="1000" class="color15">│20:29:32:TRACE:tui_logger::dispatcher:src/dispatcher.rs:64:Dispatcher clear called. │</text><text x="1008" textLength="8" class="foreground">│</text></g><g id="g50"><text x="0" textLength="8" class="foreground">│</text><text x="8" textLength="1000" class="color15">│20:29:32:TRACE:tui_logger::dispatcher:src/dispatcher.rs:35:Add listener to this dispatcher. │</text><text x="1008" textLength="8" class="foreground">│</text></g><g id="g51"><text x="0" textLength="8" class="foreground">│</text><text x="8" textLength="512" class="color15">│20:29:32:TRACE:tui_logger::dispatcher:src/dispatcher.rs:35:Add </text></g><g id="g52"><text x="0" textLength="8" class="foreground">│</text><text x="8" textLength="1000" class="color15">└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘</text><text x="1008" textLength="8" class="foreground">│</text></g><g id="g53"><text x="0" textLength="528" class="foreground">│┌Progress────────────────────────────────────────────────────────</text></g><g id="g54"><text x="0" textLength="1016" class="foreground">│┌Progress───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐│</text></g><g id="g55"><text x="0" textLength="16" class="foreground">││</text><text x="16" textLength="8" font-style="italic" class="color15"> </text><text x="24" textLength="976" font-style="italic" class="color0"> 1% </text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g56"><text x="0" textLength="656" class="foreground">└─────────────────────────────────────────────────────────────────────────────────</text></g><g id="g57"><text x="0" textLength="1016" class="foreground">└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘</text></g><g id="g58"><text x="0" textLength="40" class="foreground">│┌Tui</text><text x="48" textLength="48" class="foreground">Target</text><text x="104" textLength="176" class="foreground">Selector─────────┐┌Tui</text><text x="288" textLength="24" class="foreground">Log</text><text x="328" textLength="688" class="foreground">[log=11.5/s]────────────────────────────────────────────────────────────────────────┐│</text></g><g id="g59"><text x="0" textLength="16" class="foreground">││</text><text x="16" textLength="40" class="background">EWIDT</text><text x="56" textLength="8" class="foreground">:</text><text x="64" textLength="32" class="background">DEMO</text><text x="240" textLength="16" class="foreground">││</text><text x="256" textLength="728" class="color5">20:29:32:TRACE:tui_logger::dispatcher:src/dispatcher.rs:35:Add listener to this dispatcher.</text><text x="1000" textLength="16" class="foreground">││</text></g><g id="g60"><text x="0" textLength="16" class="foreground">││</text><text x="16" textLength="40" class="background">EWIDT</text><text x="56" tex…
Hi, I'm currently in the process of using your crate and so far it worked out quite nice for my use case. The only problem I faced was conflicting
ratatuiversions.This PR updates
ratatuito0.28and adjusts the (now) deprecated functions.