最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

rust - Is there a way to remove the duplication of characters in rataui paragraph input - Stack Overflow

programmeradmin3浏览0评论

When trying to impliment a simple textbox into my tui project using rataui and when typing every character is duplicated e.g. if i type "h" it shows "hh". I want it to be able to just have a single character per keypress, this includes not messing with the update loop of the sparkline aswell

use std::{io, time::{Duration, Instant}};
use crossterm::{
    event::{self, EnableMouseCapture, DisableMouseCapture, Event, KeyCode},
    execute,
    terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
};
use ratatui::{
    backend::{CrosstermBackend, Backend},
    Terminal,
    widgets::{Block, Borders, Paragraph, Sparkline, Wrap},
    layout::{Layout, Constraint, Direction},
    style::{Color, Style},
    
};
use rand::Rng;

fn main() -> Result<(), io::Error> {
    enable_raw_mode()?;
    let mut stdout = io::stdout();
    execute!(stdout, EnterAlternateScreen, EnableMouseCapture, DisableMouseCapture)?;
    let backend = CrosstermBackend::new(stdout);
    let mut terminal = Terminal::new(backend)?;

    let res = run_app(&mut terminal);
    
    disable_raw_mode()?;
    execute!(
        terminal.backend_mut(),
        LeaveAlternateScreen,
        DisableMouseCapture
    )?;
    terminal.show_cursor()?;

    res
}

fn run_app<B: Backend>(terminal: &mut Terminal<B>) -> io::Result<()> {
    let mut data: Vec<u64> = (0..100).map(|_| rand::rng().random_range(0..50)).collect();
    let mut rng = rand::rng();
    let mut input = String::new();
    let mut last_update = Instant::now();

    loop {
        // Ensure sparkline updates continuously, regardless of input
        if last_update.elapsed() > Duration::from_millis(200) {
            data.remove(0);
            data.push(rng.random_range(0..50));
            last_update = Instant::now();
        }

        terminal.draw(|f| {
            let size = f.area();

            let main_layout = Layout::default()
                .direction(Direction::Horizontal)
                .constraints([
                    Constraint::Length(70),
                    Constraint::Min(0),
                ])
                .split(size);

            let left_layout = Layout::default()
                .direction(Direction::Vertical)
                .constraints([
                    Constraint::Length(20),
                    Constraint::Min(0),
                ])
                .split(main_layout[0]);

            let sparkline1 = Sparkline::default()
                .block(Block::default().borders(Borders::ALL).title("1"))
                .data(&data)
                .style(Style::default().fg(Color::Blue));
            
            let para2 = Paragraph::new("2")
                .block(Block::default().borders(Borders::ALL).title("2"));

            let para3 = Paragraph::new(input.clone())
                .block(Block::default().borders(Borders::ALL).title("3"))
                .style(Style::default().fg(Color::default()))
                .wrap(Wrap { trim: false });

            f.render_widget(sparkline1, left_layout[0]);
            f.render_widget(para2, left_layout[1]);
            f.render_widget(para3, main_layout[1]);
        })?;

        // Poll for input, preventing duplicate keypresses
        if event::poll(Duration::from_millis(100))? {
            if let Event::Key(key) = event::read()? {
                match key.code {
                    KeyCode::Char(c) => {
                        if !key.modifiers.is_empty() {
                            continue; // Ignore modified keys like Ctrl+C
                        }
                        input.push(c);
                    }
                    KeyCode::Backspace => { input.pop(); }
                    KeyCode::Enter => input.push('\n'),
                    KeyCode::Esc => break,
                    _ => {}
                }
            }
        }
    }
    Ok(())
}


I tried using AI like chatgpt, but it either had no success or when typing the was outputted to the screen much slower than i wanted

发布评论

评论列表(0)

  1. 暂无评论