mirror of
https://github.com/itsjunetime/tdf.git
synced 2026-06-01 23:51:46 -04:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 01b6c2fa55 | |||
| c9ef119393 | |||
| cc46791627 | |||
| 9cf4a8e0d8 | |||
| 25d98c3776 | |||
| 03c2f381d9 | |||
| eb5ee99eec | |||
| 34b42cb1b2 | |||
| e3ccb26d66 | |||
| 1aa26b8e8c | |||
| 1402db3eba | |||
| 2d43c1e513 |
@@ -0,0 +1,56 @@
|
|||||||
|
name: Rust
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "main" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "main" ]
|
||||||
|
|
||||||
|
env:
|
||||||
|
CARGO_TERM_COLOR: always
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Setup sccache
|
||||||
|
if: github.event_name != 'release' && github.event_name != 'workflow_dispatch'
|
||||||
|
uses: mozilla-actions/sccache-action@v0.0.6
|
||||||
|
- name: Configure sccache
|
||||||
|
if: github.event_name != 'release' && github.event_name != 'workflow_dispatch'
|
||||||
|
run: |
|
||||||
|
echo "SCCACHE_GHA_ENABLED=true" >> $GITHUB_ENV
|
||||||
|
echo "RUSTC_WRAPPER=sccache" >> $GITHUB_ENV
|
||||||
|
- name: Install build dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y cmake libjpeg-dev libfontconfig1-dev libopenjp2-7-dev libopenjpip7 libopenjp2-7 libglib2.0-dev libnss3-dev libunwind-dev libgoogle-perftools-dev libboost-dev
|
||||||
|
- name: Build newer poppler
|
||||||
|
run: |
|
||||||
|
wget http://archive.ubuntu.com/ubuntu/pool/main/p/poppler/poppler_23.08.0.orig.tar.xz
|
||||||
|
tar xf poppler_23.08.0.orig.tar.xz
|
||||||
|
cd poppler-23.08.0
|
||||||
|
mkdir build && cd build
|
||||||
|
cmake .. -DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_C_COMPILER_LAUNCHER=sccache \
|
||||||
|
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache \
|
||||||
|
-DENABLE_UNSTABLE_API_ABI_HEADERS=ON \
|
||||||
|
-DENABLE_GPGME=OFF \
|
||||||
|
-DENABLE_QT5=OFF \
|
||||||
|
-DENABLE_QT6=OFF \
|
||||||
|
-DENABLE_SPLASH=OFF \
|
||||||
|
-DENABLE_LIBCURL=OFF
|
||||||
|
make -j$(nproc)
|
||||||
|
sudo make install
|
||||||
|
sudo ldconfig
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Clippy
|
||||||
|
run: cargo clippy -- -D warnings
|
||||||
|
- name: Check fmt
|
||||||
|
run: cargo fmt -- --check
|
||||||
|
- name: Run tests
|
||||||
|
run: cargo test --benches -- adobe_example
|
||||||
|
- name: Build
|
||||||
|
run: cargo build
|
||||||
@@ -5,6 +5,8 @@
|
|||||||
- Small internal changes to accomodate a few more clippy lints
|
- Small internal changes to accomodate a few more clippy lints
|
||||||
- Update `ratatui` and `ratatui-image` git dependencies to latest upstream
|
- Update `ratatui` and `ratatui-image` git dependencies to latest upstream
|
||||||
- Move `ratatui-image/vb64` support under `nightly` feature, enabled by default
|
- Move `ratatui-image/vb64` support under `nightly` feature, enabled by default
|
||||||
|
- Fixed a bug where jumping to a page out of range could result in weird `esc` key behavior
|
||||||
|
- Added CI ([#31](https://github.com/itsjunetime/tdf/pull/31), thank you [@Kriejstal](https://github.com/Kreijstal))
|
||||||
|
|
||||||
# v0.1.0
|
# v0.1.0
|
||||||
|
|
||||||
|
|||||||
Generated
+27
-27
@@ -149,9 +149,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "axum"
|
name = "axum"
|
||||||
version = "0.7.7"
|
version = "0.7.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae"
|
checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"axum-core",
|
"axum-core",
|
||||||
@@ -253,9 +253,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bytemuck"
|
name = "bytemuck"
|
||||||
version = "1.19.0"
|
version = "1.20.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d"
|
checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "byteorder"
|
name = "byteorder"
|
||||||
@@ -321,9 +321,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.2.0"
|
version = "1.2.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1aeb932158bd710538c73702db6945cb68a8fb08c519e6e12706b94263b36db8"
|
checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"jobserver",
|
"jobserver",
|
||||||
"libc",
|
"libc",
|
||||||
@@ -342,9 +342,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cfg-expr"
|
name = "cfg-expr"
|
||||||
version = "0.17.0"
|
version = "0.17.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d0890061c4d3223e7267f3bad2ec40b997d64faac1c2815a4a9d95018e2b9e9c"
|
checksum = "c360837f8f19e2e4468275138f1c0dec1647d1e17bb7c0215fe3cd7530e93c25"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"target-lexicon",
|
"target-lexicon",
|
||||||
@@ -385,18 +385,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "4.5.20"
|
version = "4.5.21"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8"
|
checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap_builder",
|
"clap_builder",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_builder"
|
name = "clap_builder"
|
||||||
version = "4.5.20"
|
version = "4.5.21"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54"
|
checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anstyle",
|
"anstyle",
|
||||||
"clap_lex",
|
"clap_lex",
|
||||||
@@ -404,9 +404,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_lex"
|
name = "clap_lex"
|
||||||
version = "0.7.2"
|
version = "0.7.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97"
|
checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "compact_str"
|
name = "compact_str"
|
||||||
@@ -681,9 +681,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flate2"
|
name = "flate2"
|
||||||
version = "1.0.34"
|
version = "1.0.35"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0"
|
checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crc32fast",
|
"crc32fast",
|
||||||
"miniz_oxide",
|
"miniz_oxide",
|
||||||
@@ -910,9 +910,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "h2"
|
name = "h2"
|
||||||
version = "0.4.6"
|
version = "0.4.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205"
|
checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atomic-waker",
|
"atomic-waker",
|
||||||
"bytes",
|
"bytes",
|
||||||
@@ -1039,9 +1039,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hyper"
|
name = "hyper"
|
||||||
version = "1.5.0"
|
version = "1.5.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a"
|
checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
@@ -1294,9 +1294,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.162"
|
version = "0.2.164"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398"
|
checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libfuzzer-sys"
|
name = "libfuzzer-sys"
|
||||||
@@ -2009,9 +2009,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustix"
|
name = "rustix"
|
||||||
version = "0.38.40"
|
version = "0.38.41"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0"
|
checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.6.0",
|
"bitflags 2.6.0",
|
||||||
"errno",
|
"errno",
|
||||||
@@ -2069,9 +2069,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_json"
|
name = "serde_json"
|
||||||
version = "1.0.132"
|
version = "1.0.133"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03"
|
checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itoa",
|
"itoa",
|
||||||
"memchr",
|
"memchr",
|
||||||
@@ -2258,7 +2258,7 @@ version = "7.0.3"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "66d23aaf9f331227789a99e8de4c91bf46703add012bdfd45fdecdfb2975a005"
|
checksum = "66d23aaf9f331227789a99e8de4c91bf46703add012bdfd45fdecdfb2975a005"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-expr 0.17.0",
|
"cfg-expr 0.17.1",
|
||||||
"heck",
|
"heck",
|
||||||
"pkg-config",
|
"pkg-config",
|
||||||
"toml",
|
"toml",
|
||||||
|
|||||||
+91
-1
@@ -7,7 +7,7 @@ description = "A terminal viewer for PDFs"
|
|||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
homepage = "https://github.com/itsjunetime/tdf"
|
homepage = "https://github.com/itsjunetime/tdf"
|
||||||
repository = "https://github.com/itsjunetime/tdf"
|
repository = "https://github.com/itsjunetime/tdf"
|
||||||
license = "GPL-3.0-or-later"
|
license = "MPL-2.0"
|
||||||
keywords = ["pdf", "tui", "cli", "terminal"]
|
keywords = ["pdf", "tui", "cli", "terminal"]
|
||||||
categories = ["command-line-utilities", "text-processing", "visualization"]
|
categories = ["command-line-utilities", "text-processing", "visualization"]
|
||||||
default-run = "tdf"
|
default-run = "tdf"
|
||||||
@@ -61,3 +61,93 @@ harness = false
|
|||||||
[[bin]]
|
[[bin]]
|
||||||
name = "for_profiling"
|
name = "for_profiling"
|
||||||
path = "./benches/for_profiling.rs"
|
path = "./benches/for_profiling.rs"
|
||||||
|
|
||||||
|
[lints.clippy]
|
||||||
|
uninlined_format_args = "warn"
|
||||||
|
redundant_closure_for_method_calls = "warn"
|
||||||
|
cast_lossless = "warn"
|
||||||
|
single_char_pattern = "warn"
|
||||||
|
manual_let_else = "warn"
|
||||||
|
ignored_unit_patterns = "warn"
|
||||||
|
range_plus_one = "warn"
|
||||||
|
unreadable_literal = "warn"
|
||||||
|
redundant_else = "warn"
|
||||||
|
assigning_clones = "warn"
|
||||||
|
bool_to_int_with_if = "warn"
|
||||||
|
borrow_as_ptr = "warn"
|
||||||
|
cast_ptr_alignment = "warn"
|
||||||
|
checked_conversions = "warn"
|
||||||
|
copy_iterator = "warn"
|
||||||
|
default_trait_access = "warn"
|
||||||
|
doc_link_with_quotes = "warn"
|
||||||
|
empty_enum = "warn"
|
||||||
|
explicit_into_iter_loop = "warn"
|
||||||
|
explicit_iter_loop = "warn"
|
||||||
|
filter_map_next = "warn"
|
||||||
|
flat_map_option = "warn"
|
||||||
|
fn_params_excessive_bools = "warn"
|
||||||
|
from_iter_instead_of_collect = "warn"
|
||||||
|
implicit_clone = "warn"
|
||||||
|
index_refutable_slice = "warn"
|
||||||
|
inefficient_to_string = "warn"
|
||||||
|
invalid_upcast_comparisons = "warn"
|
||||||
|
iter_filter_is_ok = "warn"
|
||||||
|
iter_filter_is_some = "warn"
|
||||||
|
iter_not_returning_iterator = "warn"
|
||||||
|
large_futures = "warn"
|
||||||
|
large_stack_arrays = "warn"
|
||||||
|
large_types_passed_by_value = "warn"
|
||||||
|
linkedlist = "warn"
|
||||||
|
macro_use_imports = "warn"
|
||||||
|
manual_assert = "warn"
|
||||||
|
manual_instant_elapsed = "warn"
|
||||||
|
manual_is_power_of_two = "warn"
|
||||||
|
manual_is_variant_and = "warn"
|
||||||
|
manual_ok_or = "warn"
|
||||||
|
manual_string_new = "warn"
|
||||||
|
many_single_char_names = "warn"
|
||||||
|
manual_unwrap_or = "warn"
|
||||||
|
match_on_vec_items = "warn"
|
||||||
|
match_same_arms = "warn"
|
||||||
|
match_wildcard_for_single_variants = "warn"
|
||||||
|
maybe_infinite_iter = "warn"
|
||||||
|
mismatching_type_param_order = "warn"
|
||||||
|
missing_fields_in_debug = "warn"
|
||||||
|
mut_mut = "warn"
|
||||||
|
needless_bitwise_bool = "warn"
|
||||||
|
needless_continue = "warn"
|
||||||
|
needless_for_each = "warn"
|
||||||
|
needless_pass_by_value = "warn"
|
||||||
|
needless_raw_string_hashes = "warn"
|
||||||
|
no_effect_underscore_binding = "warn"
|
||||||
|
no_mangle_with_rust_abi = "warn"
|
||||||
|
option_as_ref_cloned = "warn"
|
||||||
|
option_option = "warn"
|
||||||
|
ptr_as_ptr = "warn"
|
||||||
|
ptr_cast_constness = "warn"
|
||||||
|
range_minus_one = "warn"
|
||||||
|
ref_as_ptr = "warn"
|
||||||
|
ref_binding_to_reference = "warn"
|
||||||
|
ref_option = "warn"
|
||||||
|
ref_option_ref = "warn"
|
||||||
|
return_self_not_must_use = "warn"
|
||||||
|
same_functions_in_if_condition = "warn"
|
||||||
|
should_panic_without_expect = "warn"
|
||||||
|
similar_names = "warn"
|
||||||
|
stable_sort_primitive = "warn"
|
||||||
|
str_split_at_newline = "warn"
|
||||||
|
struct_excessive_bools = "warn"
|
||||||
|
struct_field_names = "warn"
|
||||||
|
transmute_ptr_to_ptr = "warn"
|
||||||
|
trivially_copy_pass_by_ref = "warn"
|
||||||
|
unicode_not_nfc = "warn"
|
||||||
|
unnecessary_box_returns = "warn"
|
||||||
|
unnecessary_join = "warn"
|
||||||
|
unnecessary_literal_bound = "warn"
|
||||||
|
unnecessary_wraps = "warn"
|
||||||
|
unnested_or_patterns = "warn"
|
||||||
|
unused_async = "warn"
|
||||||
|
unused_self = "warn"
|
||||||
|
used_underscore_binding = "warn"
|
||||||
|
used_underscore_items = "warn"
|
||||||
|
zero_sized_map_values = "warn"
|
||||||
|
|||||||
@@ -29,5 +29,3 @@ I dunno. Just for fun, mostly.
|
|||||||
## Can I contribute?
|
## Can I contribute?
|
||||||
|
|
||||||
Yeah, sure. Please do.
|
Yeah, sure. Please do.
|
||||||
|
|
||||||
Please note, though, that all contributions will be treated as licensed under MPL-2.0. This is so that we can relicense to MPL-2.0 at some point in the future if we manage to move away from poppler as a backend (since that is the only dependency, at time of writing, which requires the GPLv3 license).
|
|
||||||
|
|||||||
+1
-1
@@ -123,7 +123,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
|
|
||||||
// We need to create `picker` on this thread because if we create it on the `renderer` thread,
|
// We need to create `picker` on this thread because if we create it on the `renderer` thread,
|
||||||
// it messes up something with user input. Input never makes it to the crossterm thing
|
// it messes up something with user input. Input never makes it to the crossterm thing
|
||||||
let picker = Picker::from_query_stdio()?;
|
let picker = Picker::from_query_stdio()?;
|
||||||
|
|
||||||
// then we want to spawn off the rendering task
|
// then we want to spawn off the rendering task
|
||||||
// We need to use the thread::spawn API so that this exists in a thread not owned by tokio,
|
// We need to use the thread::spawn API so that this exists in a thread not owned by tokio,
|
||||||
|
|||||||
+38
-22
@@ -1,4 +1,4 @@
|
|||||||
use std::{io::stdout, num::NonZeroUsize, rc::Rc};
|
use std::{borrow::Cow, io::stdout, num::NonZeroUsize, rc::Rc};
|
||||||
|
|
||||||
use crossterm::{
|
use crossterm::{
|
||||||
event::{Event, KeyCode, MouseEventKind},
|
event::{Event, KeyCode, MouseEventKind},
|
||||||
@@ -152,18 +152,18 @@ impl Tui {
|
|||||||
let rendered_span = Span::styled(&rendered_str, Style::new().fg(Color::Cyan));
|
let rendered_span = Span::styled(&rendered_str, Style::new().fg(Color::Cyan));
|
||||||
frame.render_widget(rendered_span, bottom_layout[1]);
|
frame.render_widget(rendered_span, bottom_layout[1]);
|
||||||
|
|
||||||
let (msg_str, color) = match self.bottom_msg {
|
let (msg_str, color): (Cow<'_, str>, _) = match self.bottom_msg {
|
||||||
BottomMessage::Help => (
|
BottomMessage::Help => (
|
||||||
"/: Search, g: Go To Page, n: Next Search Result, N: Previous Search Result"
|
"/: Search, g: Go To Page, n: Next Search Result, N: Previous Search Result".into(),
|
||||||
.to_string(),
|
|
||||||
Color::Blue
|
Color::Blue
|
||||||
),
|
),
|
||||||
BottomMessage::Error(ref e) => (format!("Couldn't render a page: {e}"), Color::Red),
|
BottomMessage::Error(ref e) => (e.as_str().into(), Color::Red),
|
||||||
BottomMessage::Input(ref input_state) => (
|
BottomMessage::Input(ref input_state) => (
|
||||||
match input_state {
|
match input_state {
|
||||||
InputCommand::GoToPage(page) => format!("Go to: {page}"),
|
InputCommand::GoToPage(page) => format!("Go to: {page}"),
|
||||||
InputCommand::Search(s) => format!("Search: {s}")
|
InputCommand::Search(s) => format!("Search: {s}")
|
||||||
},
|
}
|
||||||
|
.into(),
|
||||||
Color::Blue
|
Color::Blue
|
||||||
),
|
),
|
||||||
BottomMessage::SearchResults(ref term) => {
|
BottomMessage::SearchResults(ref term) => {
|
||||||
@@ -181,7 +181,8 @@ impl Tui {
|
|||||||
format!(
|
format!(
|
||||||
"Results for '{term}': {num_found} (searched: {}%)",
|
"Results for '{term}': {num_found} (searched: {}%)",
|
||||||
num_searched / self.rendered.len()
|
num_searched / self.rendered.len()
|
||||||
),
|
)
|
||||||
|
.into(),
|
||||||
Color::Blue
|
Color::Blue
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -370,12 +371,16 @@ impl Tui {
|
|||||||
match key.code {
|
match key.code {
|
||||||
KeyCode::Char(c) => {
|
KeyCode::Char(c) => {
|
||||||
// TODO: refactor back to `if let` arm guards when those are stabilized
|
// TODO: refactor back to `if let` arm guards when those are stabilized
|
||||||
if let BottomMessage::Input(InputCommand::Search(ref mut term)) = self.bottom_msg {
|
if let BottomMessage::Input(InputCommand::Search(ref mut term)) =
|
||||||
|
self.bottom_msg
|
||||||
|
{
|
||||||
term.push(c);
|
term.push(c);
|
||||||
return Some(InputAction::Redraw);
|
return Some(InputAction::Redraw);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let BottomMessage::Input(InputCommand::GoToPage(ref mut page)) = self.bottom_msg {
|
if let BottomMessage::Input(InputCommand::GoToPage(ref mut page)) =
|
||||||
|
self.bottom_msg
|
||||||
|
{
|
||||||
return c.to_digit(10).map(|input_num| {
|
return c.to_digit(10).map(|input_num| {
|
||||||
*page = (*page * 10) + input_num as usize;
|
*page = (*page * 10) + input_num as usize;
|
||||||
InputAction::Redraw
|
InputAction::Redraw
|
||||||
@@ -389,13 +394,15 @@ impl Tui {
|
|||||||
'k' => self.change_page(PageChange::Prev, ChangeAmount::WholeScreen),
|
'k' => self.change_page(PageChange::Prev, ChangeAmount::WholeScreen),
|
||||||
'q' => Some(InputAction::QuitApp),
|
'q' => Some(InputAction::QuitApp),
|
||||||
'g' => {
|
'g' => {
|
||||||
self.set_bottom_msg(Some(BottomMessage::Input(InputCommand::GoToPage(0))));
|
self.set_bottom_msg(Some(BottomMessage::Input(
|
||||||
|
InputCommand::GoToPage(0)
|
||||||
|
)));
|
||||||
Some(InputAction::Redraw)
|
Some(InputAction::Redraw)
|
||||||
}
|
}
|
||||||
'/' => {
|
'/' => {
|
||||||
self.set_bottom_msg(Some(BottomMessage::Input(InputCommand::Search(
|
self.set_bottom_msg(Some(BottomMessage::Input(
|
||||||
String::new()
|
InputCommand::Search(String::new())
|
||||||
))));
|
)));
|
||||||
Some(InputAction::Redraw)
|
Some(InputAction::Redraw)
|
||||||
}
|
}
|
||||||
'n' if self.page < self.rendered.len() - 1 => {
|
'n' if self.page < self.rendered.len() - 1 => {
|
||||||
@@ -424,27 +431,29 @@ impl Tui {
|
|||||||
});
|
});
|
||||||
|
|
||||||
jump_to_page(&mut self.page, &mut self.last_render.rect, prev_page)
|
jump_to_page(&mut self.page, &mut self.last_render.rect, prev_page)
|
||||||
},
|
}
|
||||||
_ => None
|
_ => None
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
KeyCode::Backspace => {
|
KeyCode::Backspace => {
|
||||||
if let BottomMessage::Input(InputCommand::Search(ref mut term)) = self.bottom_msg {
|
if let BottomMessage::Input(InputCommand::Search(ref mut term)) =
|
||||||
|
self.bottom_msg
|
||||||
|
{
|
||||||
term.pop();
|
term.pop();
|
||||||
return Some(InputAction::Redraw);
|
return Some(InputAction::Redraw);
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
},
|
}
|
||||||
KeyCode::Right => self.change_page(PageChange::Next, ChangeAmount::Single),
|
KeyCode::Right => self.change_page(PageChange::Next, ChangeAmount::Single),
|
||||||
KeyCode::Down => self.change_page(PageChange::Next, ChangeAmount::WholeScreen),
|
KeyCode::Down => self.change_page(PageChange::Next, ChangeAmount::WholeScreen),
|
||||||
KeyCode::Left => self.change_page(PageChange::Prev, ChangeAmount::Single),
|
KeyCode::Left => self.change_page(PageChange::Prev, ChangeAmount::Single),
|
||||||
KeyCode::Up => self.change_page(PageChange::Prev, ChangeAmount::WholeScreen),
|
KeyCode::Up => self.change_page(PageChange::Prev, ChangeAmount::WholeScreen),
|
||||||
KeyCode::Esc => match self.bottom_msg {
|
KeyCode::Esc => match self.bottom_msg {
|
||||||
BottomMessage::Input(_) => {
|
BottomMessage::Help => Some(InputAction::QuitApp),
|
||||||
|
_ => {
|
||||||
self.set_bottom_msg(None);
|
self.set_bottom_msg(None);
|
||||||
Some(InputAction::Redraw)
|
Some(InputAction::Redraw)
|
||||||
}
|
}
|
||||||
_ => Some(InputAction::QuitApp)
|
|
||||||
},
|
},
|
||||||
KeyCode::Enter => {
|
KeyCode::Enter => {
|
||||||
let BottomMessage::Input(_) = self.bottom_msg else {
|
let BottomMessage::Input(_) = self.bottom_msg else {
|
||||||
@@ -463,10 +472,17 @@ impl Tui {
|
|||||||
// Only forward the command if it's within range
|
// Only forward the command if it's within range
|
||||||
InputCommand::GoToPage(page) => {
|
InputCommand::GoToPage(page) => {
|
||||||
let page = *page;
|
let page = *page;
|
||||||
(page < self.rendered.len()).then(|| {
|
let rendered_len = self.rendered.len();
|
||||||
|
|
||||||
|
if page < rendered_len {
|
||||||
self.set_page(page);
|
self.set_page(page);
|
||||||
InputAction::JumpingToPage(page)
|
Some(InputAction::JumpingToPage(page))
|
||||||
})
|
} else {
|
||||||
|
self.set_bottom_msg(Some(BottomMessage::Error(
|
||||||
|
format!("Cannot jump to page {page}; there are only {rendered_len} pages in the document")
|
||||||
|
)));
|
||||||
|
Some(InputAction::Redraw)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
InputCommand::Search(term) => {
|
InputCommand::Search(term) => {
|
||||||
let term = term.clone();
|
let term = term.clone();
|
||||||
|
|||||||
Reference in New Issue
Block a user