برنامه نویسی

ساخت اپلیکیشن ترمینال TODO در Rust

Summarize this content to 400 words in Persian Lang

بررسی اجمالی پروژه

برنامه ترمینال TODO یک مدیر وظیفه خط فرمان است که با Rust ساخته شده است. از آن استفاده می کند tui و crossterm جعبه ها برای ایجاد یک رابط کاربری ترمینال تعاملی.

ویژگی های کلیدی

مدیریت لیست دوگانه (لیست های TODO و DONE)
ناوبری تعاملی
ویرایش و حذف کار
ماندگاری داده ها
کلیدهای الهام گرفته از Vim

خرابی فنی

1. مدیریت دولتی

وضعیت برنامه از طریق یک مرکز مدیریت می شود App ساختار:

struct App {
todos: Vec<String>,
done: Vec<String>,
input: String,
input_mode: InputMode,
todo_list_state: ListState,
done_list_state: ListState,
editing_index: Option<usize>,
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این ساختار تمام داده های لازم را برای برنامه، از جمله لیست وظایف، ورودی فعلی و وضعیت رابط کاربری را جمع آوری می کند.

2. مدیریت ورودی کاربر

ورودی کاربر در حلقه رویداد اصلی پردازش می شود:

fn run_app<B: tui::backend::Backend>(terminal: &mut Terminal<B>, app: &mut App) -> io::Result<()> {
loop {
terminal.draw(|f| ui(f, app))?;

if let Event::Key(key) = event::read()? {
match app.input_mode {
InputMode::Normal => match key.code {
// Handle normal mode inputs
},
InputMode::Editing => match key.code {
// Handle editing mode inputs
},
InputMode::EditingExisting => match key.code {
// Handle existing item editing inputs
},
}
}
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این الگو امکان رفتارهای متفاوتی را بر اساس حالت ورودی فعلی می دهد.

3. رندر کردن UI

رابط کاربری ترمینال با استفاده از tui جعبه:

fn ui<B: tui::backend::Backend>(f: &mut Frame<B>, app: &App) {
let chunks = Layout::default()
.direction(Direction::Vertical)
.margin(2)
.constraints([
Constraint::Length(3),
Constraint::Min(0),
Constraint::Length(3),
])
.split(f.size());

// Render TODO and DONE lists
let lists = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Percentage(50), Constraint::Percentage(50)])
.split(chunks[1]);

let todo_items: Vec<ListItem> = app.todos.iter().map(|i| ListItem::new(i.as_ref())).collect();
let todo_list = List::new(todo_items)
.block(Block::default().borders(Borders::ALL).title(“Todo”));

f.render_stateful_widget(todo_list, lists[0], &mut app.todo_list_state);

// Similar rendering for DONE list…
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این تابع نحوه ایجاد یک طرح و رندر ویجت هایی مانند لیست ها و فیلدهای ورودی را نشان می دهد.

4. پایداری داده ها

تداوم وظیفه با استفاده از I/O فایل ساده پیاده سازی می شود:

impl App {
pub fn save_to_file(&self, filename: &str) -> io::Result<()> {
let mut file = OpenOptions::new()
.write(true)
.create(true)
.truncate(true)
.open(filename)?;

writeln!(file, “[TODO]”)?;
for item in &self.todos {
writeln!(file, “{}”, item)?;
}

writeln!(file, “[DONE]”)?;
for item in &self.done {
writeln!(file, “{}”, item)?;
}

Ok(())
}

pub fn load_from_file(filename: &str) -> io::Result<Self> {
// Implementation of file loading…
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این رویکرد برای ذخیره و بارگذاری وضعیت برنامه بین جلسات ساده است.

بررسی اجمالی پروژه

برنامه ترمینال TODO یک مدیر وظیفه خط فرمان است که با Rust ساخته شده است. از آن استفاده می کند tui و crossterm جعبه ها برای ایجاد یک رابط کاربری ترمینال تعاملی.

ویژگی های کلیدی

  • مدیریت لیست دوگانه (لیست های TODO و DONE)
  • ناوبری تعاملی
  • ویرایش و حذف کار
  • ماندگاری داده ها
  • کلیدهای الهام گرفته از Vim

خرابی فنی

1. مدیریت دولتی

وضعیت برنامه از طریق یک مرکز مدیریت می شود App ساختار:

struct App {
    todos: Vec<String>,
    done: Vec<String>,
    input: String,
    input_mode: InputMode,
    todo_list_state: ListState,
    done_list_state: ListState,
    editing_index: Option<usize>,
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این ساختار تمام داده های لازم را برای برنامه، از جمله لیست وظایف، ورودی فعلی و وضعیت رابط کاربری را جمع آوری می کند.

2. مدیریت ورودی کاربر

ورودی کاربر در حلقه رویداد اصلی پردازش می شود:

fn run_app<B: tui::backend::Backend>(terminal: &mut Terminal<B>, app: &mut App) -> io::Result<()> {
    loop {
        terminal.draw(|f| ui(f, app))?;

        if let Event::Key(key) = event::read()? {
            match app.input_mode {
                InputMode::Normal => match key.code {
                    // Handle normal mode inputs
                },
                InputMode::Editing => match key.code {
                    // Handle editing mode inputs
                },
                InputMode::EditingExisting => match key.code {
                    // Handle existing item editing inputs
                },
            }
        }
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این الگو امکان رفتارهای متفاوتی را بر اساس حالت ورودی فعلی می دهد.

3. رندر کردن UI

رابط کاربری ترمینال با استفاده از tui جعبه:

fn ui<B: tui::backend::Backend>(f: &mut Frame<B>, app: &App) {
    let chunks = Layout::default()
        .direction(Direction::Vertical)
        .margin(2)
        .constraints([
            Constraint::Length(3),
            Constraint::Min(0),
            Constraint::Length(3),
        ])
        .split(f.size());

    // Render TODO and DONE lists
    let lists = Layout::default()
        .direction(Direction::Horizontal)
        .constraints([Constraint::Percentage(50), Constraint::Percentage(50)])
        .split(chunks[1]);

    let todo_items: Vec<ListItem> = app.todos.iter().map(|i| ListItem::new(i.as_ref())).collect();
    let todo_list = List::new(todo_items)
        .block(Block::default().borders(Borders::ALL).title("Todo"));

    f.render_stateful_widget(todo_list, lists[0], &mut app.todo_list_state);

    // Similar rendering for DONE list...
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این تابع نحوه ایجاد یک طرح و رندر ویجت هایی مانند لیست ها و فیلدهای ورودی را نشان می دهد.

4. پایداری داده ها

تداوم وظیفه با استفاده از I/O فایل ساده پیاده سازی می شود:

impl App {
    pub fn save_to_file(&self, filename: &str) -> io::Result<()> {
        let mut file = OpenOptions::new()
            .write(true)
            .create(true)
            .truncate(true)
            .open(filename)?;

        writeln!(file, "[TODO]")?;
        for item in &self.todos {
            writeln!(file, "{}", item)?;
        }

        writeln!(file, "[DONE]")?;
        for item in &self.done {
            writeln!(file, "{}", item)?;
        }

        Ok(())
    }

    pub fn load_from_file(filename: &str) -> io::Result<Self> {
        // Implementation of file loading...
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این رویکرد برای ذخیره و بارگذاری وضعیت برنامه بین جلسات ساده است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا