Skip to content

Интерфейс (TUI)

TUI (Terminal User Interface) — это интерактивный интерфейс в терминале. Он выглядит как Midnight Commander или Far Manager — три панели, клавиатурное управление, модальные окна.

Общий вид

plantuml Diagram

При первом запуске csend (или csend tui) вы увидите три панели: Navigator слева, Send по центру, Receive справа. Панель Navigator показывает файлы текущей директории, Send — ваши раздачи, Receive — обнаруженные отправители в сети. Переключение между панелями — Tab.

Три панели

1. Navigator — файловый браузер

Панель для просмотра и выбора файлов. Работает как файловый менеджер в стиле Norton Commander.

Возможности:

  • Навигация по директориям (вход, выход, вверх, вниз)
  • Выделение файлов и папок (пробелом)
  • Подсчёт размера выделенных файлов
  • Скрытие/показ скрытых файлов (точка)
  • Удаление файлов (с подтверждением)
  • Автообновление при изменении файлов (через notify watcher)

Горячие клавиши:

КлавишаДействие
/ kВверх по списку
/ jВниз по списку
/ l / EnterВойти в директорию (или отправить, если есть выделенные файлы)
/ h / BackspaceВернуться назад
Home / EndВ начало / конец списка
PgUp / PgDnПостраничная прокрутка
SpaceВыделить / снять выделение
.Показать / скрыть скрытые файлы
sОтправить выделенные файлы
dУдалить файл / директорию

2. Send — панель отправки

Показывает список всех отправок (текущих и завершённых).

Каждая отправка содержит:

  • Кодовую фразу (например, 3-royal-mount-dance)
  • Название (метка)
  • Прогресс-бар с процентами
  • Статус (ожидание, передача, готово, ошибка)

Горячие клавиши:

КлавишаДействие
/ kПредыдущая отправка
/ jСледующая отправка
d / DeleteУдалить из списка
EscОтменить активную передачу

3. Receive — панель приёма

Комбинированная панель: сверху — обнаруженные отправители, снизу — наши загрузки.

Обнаруженные отправители:

  • Имя устройства
  • Метка передачи
  • Количество файлов и размер

Горячие клавиши (список отправителей):

КлавишаДействие
/ kПредыдущий отправитель
/ jСледующий отправитель
EnterВвести кодовую фразу (для выбранного отправителя)
rОбновить список отправителей
dУдалить отправителя / отменить загрузку

Горячие клавиши (модальное окно Offer):

КлавишаДействие
y / EnterПринять файлы
n / EscОтклонить предложение

Поток приёма файлов

plantuml Diagram

Модальные окна

TUI использует несколько модальных окон (поверх основного интерфейса):

Модальное окноКогда появляетсяСодержимое
Help? или F1Список всех горячих клавиш
Code InputEnter на отправителеПоле для ввода кодовой фразы
OfferПолучили предложениеСписок файлов + Accept/Decline
Delete Confirmd в Navigator«Вы уверены? y/n»

Режимы раскладки

Три режима расположения панелей (переключение: Ctrl+T):

plantuml Diagram

Цветовые темы

Две встроенные темы (переключение: Ctrl+S):

ТемаСтильОписание
ClassicСиний фон, жёлтые рамкиСтиль Midnight Commander
DarkТёмно-серый фон, мятный акцентСовременный минимализм

Тема определяет ~26 цветовых свойств:

rust
pub struct Theme {
    // Navigator
    pub nav_bg, nav_fg, nav_dir_fg, nav_selected_fg,
    pub nav_cursor_bg, nav_cursor_fg,
    pub nav_header_bg, nav_header_fg, nav_separator,
    pub nav_border, nav_border_focused, nav_title_focused_fg,

    // Панели Send/Receive
    pub panel_bg, panel_fg, panel_border, panel_border_focused,
    pub panel_title_focused_fg, panel_dim, panel_accent,
    pub panel_ok, panel_err, panel_warn,
    pub panel_cursor_bg, panel_cursor_fg,

    // Status Bar
    pub bar_bg, bar_fg, bar_key_bg, bar_key_fg,
}

Локализация (i18n)

TUI поддерживает два языка (переключение: Ctrl+L):

КодЯзык
EnEnglish
RuРусский

Переводы хранятся в locales/app.yml:

yaml
pane:
  navigator:
    en: Navigator
    ru: Навигатор
  send:
    en: Send
    ru: Отправка
  receive:
    en: Receive
    ru: Приём

status:
  waiting:
    en: 'Waiting for receiver...'
    ru: 'Ожидание получателя...'

Статусные сообщения

Статусы передачи — не просто строки, а семантические типы. Они переводятся на нужный язык в момент отрисовки:

rust
pub enum StatusMsg {
    WaitingForReceiver,
    Listening,
    Connected,
    Transferring,
    Sent { total_bytes: u64, elapsed_secs: f64 },
    Received { total_bytes: u64, elapsed_secs: f64 },
    Error(String),
    Cancelled,
    Declined(String),
    // ...
}

Это позволяет переключить язык прямо во время передачи — все статусы обновятся мгновенно.

Глобальные горячие клавиши

КлавишаДействие
TabПереключение фокуса между панелями
Ctrl+TПереключение раскладки (Horizontal → Vertical → Stack)
Ctrl+SПереключение цветовой темы
Ctrl+LПереключение языка (EN ↔ RU)
Ctrl+CВыход (всегда)
qВыход (только когда нет активных передач)
? / F1Показать справку
F12Показать логи (только с --verbose)

File Picker — выбор файлов

FilePicker — это модуль, который отвечает за чтение содержимого директорий для Navigator.

Возможности:

  • Ленивая загрузка (читает директорию только при переходе)
  • Обнаружение symlink'ов (пропускаются для безопасности)
  • Подсчёт размера поддиректорий (рекурсивный)
  • Информация о свободном месте на диске
  • Автообновление через notify (filesystem watcher)
  • Кеш выделенных файлов (хранит общий размер)
plantuml Diagram

Рендеринг (ui.rs)

Вся отрисовка собрана в одном файле ui.rs. Он использует ratatui для создания виджетов:

plantuml Diagram

Функции-помощники

ФункцияЧто рисует
render_navigator_pane()Таблица файлов с колонками Name, Size, Modified
render_send_pane()Список передач с прогресс-барами
render_receive_pane()Обнаруженные отправители + загрузки
render_status_bar()Строка подсказок внизу экрана
render_help_modal()Окно со списком горячих клавиш
render_code_input_modal()Окно для ввода кодовой фразы
render_offer_modal()Окно с предложением файлов
render_delete_confirm_modal()Окно подтверждения удаления
truncate_str()Обрезка длинных строк с