base application
This commit is contained in:
parent
5c0ad57804
commit
f11e2e3a64
|
@ -2,18 +2,54 @@
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "addr2line"
|
||||||
|
version = "0.24.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375"
|
||||||
|
dependencies = [
|
||||||
|
"gimli",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "adler2"
|
||||||
|
version = "2.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "autocfg"
|
name = "autocfg"
|
||||||
version = "1.3.0"
|
version = "1.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
|
checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "backtrace"
|
||||||
|
version = "0.3.74"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
|
||||||
|
dependencies = [
|
||||||
|
"addr2line",
|
||||||
|
"cfg-if",
|
||||||
|
"libc",
|
||||||
|
"miniz_oxide",
|
||||||
|
"object",
|
||||||
|
"rustc-demangle",
|
||||||
|
"windows-targets",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
version = "2.6.0"
|
version = "2.6.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
|
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bytes"
|
||||||
|
version = "1.7.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cfg-if"
|
name = "cfg-if"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
|
@ -45,6 +81,12 @@ dependencies = [
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "equivalent"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "errno"
|
name = "errno"
|
||||||
version = "0.3.9"
|
version = "0.3.9"
|
||||||
|
@ -55,12 +97,34 @@ dependencies = [
|
||||||
"windows-sys",
|
"windows-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "gimli"
|
||||||
|
version = "0.31.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.14.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hermit-abi"
|
name = "hermit-abi"
|
||||||
version = "0.3.9"
|
version = "0.3.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
|
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indexmap"
|
||||||
|
version = "2.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5"
|
||||||
|
dependencies = [
|
||||||
|
"equivalent",
|
||||||
|
"hashbrown",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.158"
|
version = "0.2.158"
|
||||||
|
@ -89,6 +153,21 @@ version = "0.4.22"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
|
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memchr"
|
||||||
|
version = "2.7.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "miniz_oxide"
|
||||||
|
version = "0.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
|
||||||
|
dependencies = [
|
||||||
|
"adler2",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mio"
|
name = "mio"
|
||||||
version = "1.0.2"
|
version = "1.0.2"
|
||||||
|
@ -107,6 +186,18 @@ name = "muxde"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crossterm",
|
"crossterm",
|
||||||
|
"serde",
|
||||||
|
"tokio",
|
||||||
|
"toml",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "object"
|
||||||
|
version = "0.36.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -132,6 +223,30 @@ dependencies = [
|
||||||
"windows-targets",
|
"windows-targets",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pin-project-lite"
|
||||||
|
version = "0.2.14"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.86"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.37"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.5.4"
|
version = "0.5.4"
|
||||||
|
@ -141,6 +256,12 @@ dependencies = [
|
||||||
"bitflags",
|
"bitflags",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc-demangle"
|
||||||
|
version = "0.1.24"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustix"
|
name = "rustix"
|
||||||
version = "0.38.37"
|
version = "0.38.37"
|
||||||
|
@ -160,6 +281,35 @@ version = "1.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde"
|
||||||
|
version = "1.0.210"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a"
|
||||||
|
dependencies = [
|
||||||
|
"serde_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_derive"
|
||||||
|
version = "1.0.210"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_spanned"
|
||||||
|
version = "0.6.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "signal-hook"
|
name = "signal-hook"
|
||||||
version = "0.3.17"
|
version = "0.3.17"
|
||||||
|
@ -196,6 +346,96 @@ version = "1.13.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
|
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "socket2"
|
||||||
|
version = "0.5.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "2.0.77"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tokio"
|
||||||
|
version = "1.40.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998"
|
||||||
|
dependencies = [
|
||||||
|
"backtrace",
|
||||||
|
"bytes",
|
||||||
|
"libc",
|
||||||
|
"mio",
|
||||||
|
"parking_lot",
|
||||||
|
"pin-project-lite",
|
||||||
|
"signal-hook-registry",
|
||||||
|
"socket2",
|
||||||
|
"tokio-macros",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tokio-macros"
|
||||||
|
version = "2.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml"
|
||||||
|
version = "0.8.19"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
"serde_spanned",
|
||||||
|
"toml_datetime",
|
||||||
|
"toml_edit",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_datetime"
|
||||||
|
version = "0.6.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_edit"
|
||||||
|
version = "0.22.21"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf"
|
||||||
|
dependencies = [
|
||||||
|
"indexmap",
|
||||||
|
"serde",
|
||||||
|
"serde_spanned",
|
||||||
|
"toml_datetime",
|
||||||
|
"winnow",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-ident"
|
||||||
|
version = "1.0.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasi"
|
name = "wasi"
|
||||||
version = "0.11.0+wasi-snapshot-preview1"
|
version = "0.11.0+wasi-snapshot-preview1"
|
||||||
|
@ -296,3 +536,12 @@ name = "windows_x86_64_msvc"
|
||||||
version = "0.52.6"
|
version = "0.52.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winnow"
|
||||||
|
version = "0.6.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
|
@ -5,3 +5,6 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
crossterm = "0.28.1"
|
crossterm = "0.28.1"
|
||||||
|
serde = { version = "1.0.210", features = ["derive", "serde_derive"] }
|
||||||
|
tokio = { version = "1.40.0", features = ["full"] }
|
||||||
|
toml = "0.8.19"
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
[colortheme]
|
||||||
|
background = [26, 26, 28]
|
||||||
|
command_bar = [20, 28, 20]
|
||||||
|
|
||||||
|
[command]
|
||||||
|
new_window = "n"
|
||||||
|
quit = "q"
|
|
@ -1,3 +1,170 @@
|
||||||
|
use std::{
|
||||||
|
collections::HashMap,
|
||||||
|
io::{self, stdout, Stdout, Write},
|
||||||
|
thread,
|
||||||
|
time::Duration,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crossterm::{
|
||||||
|
cursor, event, queue,
|
||||||
|
style::{self, Color},
|
||||||
|
terminal::{self, disable_raw_mode, enable_raw_mode, ClearType},
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::{colortheme::ColorTheme, iterate_config, window::Window, Config};
|
||||||
|
|
||||||
pub struct Application {
|
pub struct Application {
|
||||||
windows: Window,
|
config: Config,
|
||||||
|
colortheme: ColorTheme,
|
||||||
|
stdout: Stdout,
|
||||||
|
size: (u16, u16),
|
||||||
|
windows: HashMap<usize, Window>,
|
||||||
|
command_mode: bool,
|
||||||
|
command: String,
|
||||||
|
cmdbar_show: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Application {
|
||||||
|
pub fn new(config: Config) -> Result<Self, io::Error> {
|
||||||
|
queue!(
|
||||||
|
stdout(),
|
||||||
|
event::EnableMouseCapture,
|
||||||
|
terminal::EnterAlternateScreen,
|
||||||
|
terminal::Clear(ClearType::All),
|
||||||
|
style::SetBackgroundColor(Color::Black)
|
||||||
|
)?;
|
||||||
|
enable_raw_mode()?;
|
||||||
|
stdout().flush()?;
|
||||||
|
Ok(Application {
|
||||||
|
colortheme: ColorTheme::from(config.get("colortheme").unwrap().as_table().unwrap()),
|
||||||
|
config,
|
||||||
|
stdout: stdout(),
|
||||||
|
size: terminal::size()?,
|
||||||
|
windows: HashMap::new(),
|
||||||
|
command_mode: true,
|
||||||
|
command: String::new(),
|
||||||
|
cmdbar_show: String::new(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn exec(&mut self) -> io::Result<()> {
|
||||||
|
self.render()?;
|
||||||
|
self.stdout.flush()?;
|
||||||
|
loop {
|
||||||
|
if event::poll(Duration::from_secs(5))? {
|
||||||
|
match event::read()? {
|
||||||
|
event::Event::FocusGained => queue!(self.stdout, cursor::Show)?,
|
||||||
|
event::Event::FocusLost => queue!(self.stdout, cursor::Hide)?,
|
||||||
|
event::Event::Key(key_event) => match key_event.code {
|
||||||
|
event::KeyCode::Backspace => {
|
||||||
|
if self.command_mode {
|
||||||
|
self.command.pop();
|
||||||
|
self.cmdbar_show.clone_from(&self.command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
event::KeyCode::Enter => (),
|
||||||
|
event::KeyCode::Left => (),
|
||||||
|
event::KeyCode::Right => (),
|
||||||
|
event::KeyCode::Up => (),
|
||||||
|
event::KeyCode::Down => (),
|
||||||
|
event::KeyCode::Home => (),
|
||||||
|
event::KeyCode::End => (),
|
||||||
|
event::KeyCode::PageUp => (),
|
||||||
|
event::KeyCode::PageDown => (),
|
||||||
|
event::KeyCode::Tab => (),
|
||||||
|
event::KeyCode::BackTab => (),
|
||||||
|
event::KeyCode::Delete => (),
|
||||||
|
event::KeyCode::Insert => (),
|
||||||
|
event::KeyCode::F(_) => (),
|
||||||
|
event::KeyCode::Char(c) => {
|
||||||
|
if self.command_mode {
|
||||||
|
self.command.push(c);
|
||||||
|
self.cmdbar_show.clone_from(&self.command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
event::KeyCode::Null => (),
|
||||||
|
event::KeyCode::Esc => (),
|
||||||
|
event::KeyCode::CapsLock => (),
|
||||||
|
event::KeyCode::ScrollLock => (),
|
||||||
|
event::KeyCode::NumLock => (),
|
||||||
|
event::KeyCode::PrintScreen => (),
|
||||||
|
event::KeyCode::Pause => (),
|
||||||
|
event::KeyCode::Menu => (),
|
||||||
|
event::KeyCode::KeypadBegin => (),
|
||||||
|
event::KeyCode::Media(media_key_code) => (),
|
||||||
|
event::KeyCode::Modifier(modifier_key_code) => (),
|
||||||
|
},
|
||||||
|
event::Event::Mouse(mouse_event) => (),
|
||||||
|
event::Event::Paste(_) => (),
|
||||||
|
event::Event::Resize(w, h) => self.size = (w, h),
|
||||||
|
}
|
||||||
|
self.render()?;
|
||||||
|
let f = |_, value| {
|
||||||
|
if let &toml::Value::String(ref s) = value {
|
||||||
|
s == &self.command
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if let toml::Value::Table(map) = &self.config.get("command").unwrap() {
|
||||||
|
if let Some((name, _)) = iterate_config(map, &f) {
|
||||||
|
match name.as_str() {
|
||||||
|
"quit" => break,
|
||||||
|
"print" => queue!(
|
||||||
|
self.stdout,
|
||||||
|
style::SetBackgroundColor(self.colortheme.background),
|
||||||
|
cursor::SavePosition,
|
||||||
|
cursor::MoveTo(0, 0),
|
||||||
|
style::Print("Hello"),
|
||||||
|
cursor::RestorePosition,
|
||||||
|
)?,
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
self.command.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.stdout.flush()?;
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.render()?;
|
||||||
|
self.stdout.flush()?;
|
||||||
|
thread::sleep(Duration::from_millis(200));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn render(&mut self) -> io::Result<()> {
|
||||||
|
let mut show = String::new();
|
||||||
|
for c in self.cmdbar_show.chars() {
|
||||||
|
show.push(c);
|
||||||
|
if cursor::position().unwrap().0 >= self.size.0 - 1 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
queue!(
|
||||||
|
self.stdout,
|
||||||
|
style::SetBackgroundColor(self.colortheme.command_bar),
|
||||||
|
cursor::MoveTo(0, self.size.1 - 1),
|
||||||
|
style::Print(show),
|
||||||
|
)?;
|
||||||
|
let x = cursor::position().unwrap().0;
|
||||||
|
queue!(
|
||||||
|
self.stdout,
|
||||||
|
style::Print(" ".repeat((self.size.0 - x) as usize)),
|
||||||
|
cursor::MoveTo(x, self.size.1 - 1),
|
||||||
|
)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for Application {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
disable_raw_mode().unwrap();
|
||||||
|
queue!(
|
||||||
|
self.stdout,
|
||||||
|
terminal::LeaveAlternateScreen,
|
||||||
|
event::DisableMouseCapture,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
use crossterm::style::Color;
|
||||||
|
use toml::{Table, Value};
|
||||||
|
|
||||||
|
|
||||||
|
pub struct ColorTheme {
|
||||||
|
pub background: Color,
|
||||||
|
pub command_bar: Color,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&Table> for ColorTheme {
|
||||||
|
fn from(value: &Table) -> Self {
|
||||||
|
let f = |name| {
|
||||||
|
if let Value::Array(arr) = value.get(name).unwrap() {
|
||||||
|
Color::Rgb {
|
||||||
|
r: arr[0].as_integer().unwrap() as u8,
|
||||||
|
g: arr[1].as_integer().unwrap() as u8,
|
||||||
|
b: arr[2].as_integer().unwrap() as u8,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
panic!();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let background = f("background");
|
||||||
|
let command_bar = f("command_bar");
|
||||||
|
Self {
|
||||||
|
background,
|
||||||
|
command_bar,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
29
src/lib.rs
29
src/lib.rs
|
@ -1,7 +1,32 @@
|
||||||
pub mod application;
|
pub mod application;
|
||||||
|
pub mod colortheme;
|
||||||
|
pub mod window;
|
||||||
|
|
||||||
|
use std::io;
|
||||||
|
|
||||||
use application::Application;
|
use application::Application;
|
||||||
|
use toml::map::Map;
|
||||||
|
|
||||||
pub fn run() {
|
pub type Config = Map<String, toml::Value>;
|
||||||
let app = Application::new();
|
|
||||||
|
pub fn iterate_config<'a, 'b: 'a, F>(config: &'b Config, f: &F) -> Option<(String, toml::Value)>
|
||||||
|
where
|
||||||
|
F: Fn(&'a str, &'b toml::Value) -> bool,
|
||||||
|
{
|
||||||
|
for (name, value) in config {
|
||||||
|
if let toml::Value::Table(map) = value {
|
||||||
|
if let Some(p) = iterate_config(map, f) {
|
||||||
|
return Some(p);
|
||||||
|
}
|
||||||
|
} else if f(name, value) {
|
||||||
|
return Some((name.clone(), value.clone()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run(config: Config) -> io::Result<()> {
|
||||||
|
let mut app = Application::new(config)?;
|
||||||
|
app.exec()?;
|
||||||
|
Ok(())
|
||||||
}
|
}
|
11
src/main.rs
11
src/main.rs
|
@ -1,3 +1,10 @@
|
||||||
fn main() {
|
use std::fs;
|
||||||
crate::run();
|
|
||||||
|
use muxde::{run, Config};
|
||||||
|
|
||||||
|
fn main() -> std::io::Result<()> {
|
||||||
|
let config = fs::read_to_string("config/default.toml")?;
|
||||||
|
let config: Config = toml::from_str(&config).unwrap();
|
||||||
|
run(config)?;
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
pub struct Window {
|
||||||
|
pos: (u16, u16),
|
||||||
|
size: (u16, u16),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue