some fixes
This commit is contained in:
+28
-14
@@ -2,9 +2,9 @@ use std::collections::HashMap;
|
||||
|
||||
use crate::{
|
||||
create_frame,
|
||||
key::KeyKind,
|
||||
key::{self, KeyKind},
|
||||
utils::{closest_component, render_to_frame},
|
||||
Component, UpdateRequest, UpdateResponse,
|
||||
Component, UpdateResponse,
|
||||
};
|
||||
|
||||
pub fn div() -> Component {
|
||||
@@ -17,8 +17,8 @@ pub fn div() -> Component {
|
||||
(KeyKind::Right, String::from("right")),
|
||||
]);
|
||||
|
||||
fn update(this: &mut Component, req: UpdateRequest) -> UpdateResponse {
|
||||
if let Some(v) = this.binds.get(&req.key.kind) {
|
||||
fn update(this: &mut Component, k: key::Key) -> UpdateResponse {
|
||||
if let Some(v) = this.binds.get(&k.kind) {
|
||||
match v.as_str() {
|
||||
"up" => {
|
||||
this.active_child = closest_component(
|
||||
@@ -54,13 +54,13 @@ pub fn div() -> Component {
|
||||
|
||||
_ => {
|
||||
if let Some(child) = this.get_active_child() {
|
||||
return (child.update)(child, req);
|
||||
return (child.update)(child, k);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if let Some(child) = this.get_active_child() {
|
||||
return (child.update)(child, req);
|
||||
return (child.update)(child, k);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,15 +75,22 @@ pub fn div() -> Component {
|
||||
frame.join("\n")
|
||||
}
|
||||
|
||||
fn tick(this: &mut Component, i: usize) {
|
||||
if let Some(child) = this.get_active_child() {
|
||||
return (child.tick)(child, i);
|
||||
}
|
||||
}
|
||||
|
||||
component.update = update;
|
||||
component.render = render;
|
||||
component.tick = tick;
|
||||
component
|
||||
}
|
||||
|
||||
pub fn text() -> Component {
|
||||
let mut component = Component::new();
|
||||
|
||||
fn update(_: &mut Component, _: UpdateRequest) -> UpdateResponse {
|
||||
fn update(_: &mut Component, _: key::Key) -> UpdateResponse {
|
||||
UpdateResponse::None
|
||||
}
|
||||
|
||||
@@ -99,27 +106,34 @@ pub fn text() -> Component {
|
||||
pub fn button() -> Component {
|
||||
let mut component = Component::new();
|
||||
|
||||
fn update(this: &mut Component, req: UpdateRequest) -> UpdateResponse {
|
||||
if req.key.kind == KeyKind::Enter {
|
||||
fn update(this: &mut Component, k: key::Key) -> UpdateResponse {
|
||||
if k.kind == KeyKind::Enter {
|
||||
if this.toggle {
|
||||
this.clicked = !this.clicked;
|
||||
(this.on_click)(this);
|
||||
} else {
|
||||
this.clicked = true;
|
||||
(this.on_click)(this);
|
||||
std::thread::sleep(std::time::Duration::from_millis(300));
|
||||
this.clicked = false;
|
||||
(this.on_click)(this);
|
||||
return UpdateResponse::Tick(vec![1, 140]);
|
||||
}
|
||||
}
|
||||
UpdateResponse::None
|
||||
}
|
||||
|
||||
fn tick(this: &mut Component, i: usize) {
|
||||
if i == 0 {
|
||||
this.clicked = true;
|
||||
(this.on_click)(this);
|
||||
} else if i == 1 {
|
||||
this.clicked = false;
|
||||
(this.on_click)(this);
|
||||
}
|
||||
}
|
||||
|
||||
fn render(s: &mut Component) -> String {
|
||||
s.expr.clone()
|
||||
}
|
||||
|
||||
component.update = update;
|
||||
component.render = render;
|
||||
component.tick = tick;
|
||||
component
|
||||
}
|
||||
|
||||
+12
-13
@@ -11,17 +11,14 @@ pub enum UpdateResponse {
|
||||
Exit,
|
||||
Done,
|
||||
None,
|
||||
}
|
||||
|
||||
pub struct UpdateRequest<'a> {
|
||||
pub key: key::Key,
|
||||
pub screen: &'a App,
|
||||
Tick(Vec<u32>),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
pub struct Component {
|
||||
pub render: fn(&mut Component) -> String,
|
||||
pub update: fn(&mut Component, UpdateRequest) -> UpdateResponse,
|
||||
pub update: fn(&mut Component, key::Key) -> UpdateResponse,
|
||||
pub tick: fn(&mut Component, usize),
|
||||
pub on_click: fn(&mut Component),
|
||||
pub x: usize,
|
||||
pub y: usize,
|
||||
@@ -41,6 +38,7 @@ impl Component {
|
||||
Component {
|
||||
render: |_| String::new(),
|
||||
update: |_, _| UpdateResponse::None,
|
||||
tick: |_, _| {},
|
||||
on_click: |_| {},
|
||||
x: 0,
|
||||
y: 0,
|
||||
@@ -102,19 +100,20 @@ impl App {
|
||||
crossterm::terminal::enable_raw_mode().unwrap();
|
||||
loop {
|
||||
self.render();
|
||||
match (self.component.update)(
|
||||
&mut self.component,
|
||||
UpdateRequest {
|
||||
key: key::read_key(),
|
||||
screen: self, // error: cannot borrow `*self` as immutable because it is also borrowed as mutable (IMPORTANT)
|
||||
},
|
||||
) {
|
||||
match (self.component.update)(&mut self.component, key::read_key()) {
|
||||
UpdateResponse::Exit => {
|
||||
crossterm::terminal::disable_raw_mode().unwrap();
|
||||
utils::clear();
|
||||
utils::show_cursor();
|
||||
return;
|
||||
}
|
||||
UpdateResponse::Tick(ticks) => {
|
||||
for (i, n) in ticks.into_iter().enumerate() {
|
||||
std::thread::sleep(std::time::Duration::from_millis(n as u64));
|
||||
(self.component.tick)(&mut self.component, i);
|
||||
self.render();
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user