From 7967698f2d90839e4e8fb8b6cd8534d34da9e466 Mon Sep 17 00:00:00 2001 From: Leo Date: Sat, 19 Oct 2024 15:23:46 +0200 Subject: [PATCH] some fixes --- src/components.rs | 42 ++++++++++++++++++++++++++++-------------- src/lib.rs | 25 ++++++++++++------------- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/src/components.rs b/src/components.rs index 923a990..b268e57 100644 --- a/src/components.rs +++ b/src/components.rs @@ -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 } diff --git a/src/lib.rs b/src/lib.rs index da6ea7b..0852144 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,17 +11,14 @@ pub enum UpdateResponse { Exit, Done, None, -} - -pub struct UpdateRequest<'a> { - pub key: key::Key, - pub screen: &'a App, + Tick(Vec), } #[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(); + } + } _ => {} } }