remove tuirealm for tui

This commit is contained in:
kageru 2022-11-11 15:00:07 +01:00
parent 07a8971b60
commit 97aa161166
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2
3 changed files with 414 additions and 149 deletions

361
Cargo.lock generated Normal file

@ -0,0 +1,361 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "aro"
version = "0.1.0"
dependencies = [
"crossterm",
"serde",
"serde_json",
"tui",
]
[[package]]
name = "autocfg"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "cassowary"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "crossterm"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67"
dependencies = [
"bitflags",
"crossterm_winapi",
"libc",
"mio",
"parking_lot",
"signal-hook",
"signal-hook-mio",
"winapi",
]
[[package]]
name = "crossterm_winapi"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ae1b35a484aa10e07fe0638d02301c5ad24de82d310ccbd2f3693da5f09bf1c"
dependencies = [
"winapi",
]
[[package]]
name = "itoa"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
[[package]]
name = "libc"
version = "0.2.137"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89"
[[package]]
name = "lock_api"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
dependencies = [
"autocfg",
"scopeguard",
]
[[package]]
name = "log"
version = "0.4.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [
"cfg-if",
]
[[package]]
name = "mio"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de"
dependencies = [
"libc",
"log",
"wasi",
"windows-sys",
]
[[package]]
name = "parking_lot"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
dependencies = [
"lock_api",
"parking_lot_core",
]
[[package]]
name = "parking_lot_core"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"smallvec",
"windows-sys",
]
[[package]]
name = "proc-macro2"
version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
dependencies = [
"proc-macro2",
]
[[package]]
name = "redox_syscall"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
dependencies = [
"bitflags",
]
[[package]]
name = "ryu"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
[[package]]
name = "scopeguard"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "serde"
version = "1.0.147"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.147"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.87"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ce777b7b150d76b9cf60d28b55f5847135a003f7d7350c6be7a773508ce7d45"
dependencies = [
"itoa",
"ryu",
"serde",
]
[[package]]
name = "signal-hook"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d"
dependencies = [
"libc",
"signal-hook-registry",
]
[[package]]
name = "signal-hook-mio"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af"
dependencies = [
"libc",
"mio",
"signal-hook",
]
[[package]]
name = "signal-hook-registry"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
dependencies = [
"libc",
]
[[package]]
name = "smallvec"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
[[package]]
name = "syn"
version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "tui"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccdd26cbd674007e649a272da4475fb666d3aa0ad0531da7136db6fab0e5bad1"
dependencies = [
"bitflags",
"cassowary",
"crossterm",
"unicode-segmentation",
"unicode-width",
]
[[package]]
name = "unicode-ident"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
[[package]]
name = "unicode-segmentation"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a"
[[package]]
name = "unicode-width"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows-sys"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
[[package]]
name = "windows_aarch64_msvc"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
[[package]]
name = "windows_i686_gnu"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
[[package]]
name = "windows_i686_msvc"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
[[package]]
name = "windows_x86_64_gnu"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
[[package]]
name = "windows_x86_64_msvc"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"

@ -6,3 +6,5 @@ edition = "2021"
[dependencies] [dependencies]
serde_json = "1.0" serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
tui = "0.19.0"
crossterm = "0.25.0"

@ -1,24 +1,24 @@
use std::time::Duration; use crossterm::terminal::enable_raw_mode;
use serde::Deserialize; use serde::Deserialize;
use tui_realm_stdlib::List; use std::{io, iter, time::Duration};
use tuirealm::{ use tui::{
event::{Key, KeyEvent}, backend::CrosstermBackend,
props::TextSpan, layout,
terminal::TerminalBridge, style::{Color, Style},
tui::layout::{Constraint, Layout}, text::Text,
Application, Component, Event, EventListenerCfg, MockComponent, NoUserEvent, PollStrategy, widgets::{Block, Borders, List, ListItem, Paragraph, Widget},
Update,
}; };
fn main() { type Terminal = tui::Terminal<CrosstermBackend<io::Stdout>>;
let mut app: Application<Id, Msg, NoUserEvent> = Application::init(
EventListenerCfg::default() fn main() -> Result<(), Box<dyn std::error::Error>> {
.default_input_listener(Duration::from_millis(20)) let stdout = io::stdout();
.poll_timeout(Duration::from_millis(10)), enable_raw_mode()?;
); let mut backend = CrosstermBackend::new(stdout);
app.mount(Id::MainList, Box::new(MyList { let mut terminal = Terminal::new(backend)?;
cards: vec![ terminal.hide_cursor()?;
terminal.clear()?;
let all_cards= vec![
Card::SpellCard { Card::SpellCard {
name: "The Cheerful Coffin".to_owned(), name: "The Cheerful Coffin".to_owned(),
text: "Discard up to 3 Monster Cards from your hand to the Graveyard.".to_owned() text: "Discard up to 3 Monster Cards from your hand to the Graveyard.".to_owned()
@ -32,145 +32,47 @@ fn main() {
r#type: "Zombie".to_owned(), r#type: "Zombie".to_owned(),
attribute: "EARTH".to_owned(), attribute: "EARTH".to_owned(),
} }
], ];
..Default::default() let mut cards = all_cards.clone();
}), vec![]) let mut search_text = String::new();
.unwrap();
app.active(&Id::MainList).unwrap();
let model = Model {
app,
quit: false,
redraw: true,
terminal: TerminalBridge::new().unwrap(),
state: State::default(),
};
model.terminal.enter_alternate_screen();
model.terminal.enable_raw_mode();
while !model.quit { loop {
match app.tick(PollStrategy::Once) { refresh(&mut terminal, &cards, &search_text);
Ok(messages) if messages.len() > 0 => {
model.redraw = true;
for msg in messages.into_iter() {
model.update(Some(msg));
}
}
_ => {}
}
if model.redraw {
model.view(&mut app);
model.redraw = false;
}
} }
Ok(())
model.terminal.leave_alternate_screen();
model.terminal.disable_raw_mode();
model.terminal.clear_screen();
} }
#[derive(Debug, PartialEq)] fn refresh(term: &mut Terminal, cards: &Vec<Card>, search_text: &str) -> Result<(), io::Error> {
enum Msg { let mut list = selectable_list(
Quit, search_text,
SearchInput(char), cards
SearchClear, .iter()
Up, .map(|c| ListItem::new(format!("{c:?}")))
Down, .collect::<Vec<_>>(),
Increment, None,
Decrement, );
term.draw(|mut frame| {
frame.render_widget(list, frame.size());
})?;
Ok(())
} }
#[derive(Debug, PartialEq, Hash, Clone, Copy, Eq)] pub fn selectable_list<'a>(
enum Id { title: &'a str,
MainList, content: Vec<ListItem<'a>>,
SearchField, selected: Option<usize>,
) -> List<'a> {
List::new(content)
.block(
Block::default()
.title(title)
.borders(Borders::TOP | Borders::RIGHT | Borders::LEFT),
)
.highlight_style(Style::default().fg(Color::LightGreen))
.highlight_symbol(">")
} }
#[derive(MockComponent, Default)] #[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
struct MyList {
component: List,
cards: Vec<Card>,
}
impl Component<Msg, NoUserEvent> for MyList {
fn on(&mut self, ev: tuirealm::Event<NoUserEvent>) -> Option<Msg> {
match ev {
Event::Keyboard(KeyEvent {
code: Key::Char(ch),
..
}) => match ch {
'+' => Some(Msg::Increment),
'-' => Some(Msg::Decrement),
ch => {
self.component = self.component
.rows(
self.cards
.iter()
.map(|c| {
vec![TextSpan::new(match c {
Card::SpellCard { name, .. } => name,
Card::EffectMonster { name, .. } => name,
})]
})
.collect(),
);
Some(Msg::SearchInput(ch))
}
},
Event::Keyboard(KeyEvent { code: Key::Esc, .. }) => Some(Msg::Quit),
Event::Keyboard(KeyEvent {
code: Key::Backspace,
..
}) => Some(Msg::SearchClear),
_ => None,
}
}
}
struct Model {
state: State,
app: Application<Id, Msg, NoUserEvent>,
terminal: TerminalBridge,
quit: bool,
redraw: bool,
}
impl Model {
pub fn view(&mut self, app: &mut Application<Id, Msg, NoUserEvent>) {
self.terminal
.raw_mut()
.draw(|f| {
let chunks = Layout::default()
.constraints([Constraint::Percentage(100)])
.split(f.size());
app.view(&Id::MainList, f, chunks[0]);
})
.unwrap();
}
}
impl Update<Msg> for Model {
fn update(&mut self, msg: Option<Msg>) -> Option<Msg> {
self.redraw = true;
match msg {
Some(Msg::SearchInput(c)) => self.state.filter.push(c),
Some(Msg::SearchClear) => self.state.filter.clear(),
Some(Msg::Quit) => self.quit = true,
_ => (),
};
None
}
}
#[derive(PartialEq, Eq, Default, Debug)]
struct State {
filter: String,
}
struct ApiResponse {
data: Vec<Card>,
}
#[derive(Debug, Deserialize, PartialEq, Eq)]
#[serde(tag = "type")] #[serde(tag = "type")]
enum Card { enum Card {
#[serde(rename = "Spell Card")] #[serde(rename = "Spell Card")]