Интерфейс (TUI)
TUI (Terminal User Interface) — это интерактивный интерфейс в терминале. Он выглядит как Midnight Commander или Far Manager — три панели, клавиатурное управление, модальные окна.
Общий вид
При первом запуске
csend(илиcsend tui) вы увидите три панели: Navigator слева, Send по центру, Receive справа. Панель Navigator показывает файлы текущей директории, Send — ваши раздачи, Receive — обнаруженные отправители в сети. Переключение между панелями —Tab.
Три панели
1. Navigator — файловый браузер
Панель для просмотра и выбора файлов. Работает как файловый менеджер в стиле Norton Commander.
Возможности:
- Навигация по директориям (вход, выход, вверх, вниз)
- Выделение файлов и папок (пробелом)
- Подсчёт размера выделенных файлов
- Скрытие/показ скрытых файлов (точка)
- Удаление файлов (с подтверждением)
- Автообновление при изменении файлов (через
notifywatcher)
Горячие клавиши:
| Клавиша | Действие |
|---|---|
↑ / 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 | Отклонить предложение |
Поток приёма файлов
Модальные окна
TUI использует несколько модальных окон (поверх основного интерфейса):
| Модальное окно | Когда появляется | Содержимое |
|---|---|---|
| Help | ? или F1 | Список всех горячих клавиш |
| Code Input | Enter на отправителе | Поле для ввода кодовой фразы |
| Offer | Получили предложение | Список файлов + Accept/Decline |
| Delete Confirm | d в Navigator | «Вы уверены? y/n» |
Режимы раскладки
Три режима расположения панелей (переключение: Ctrl+T):
Цветовые темы
Две встроенные темы (переключение: Ctrl+S):
| Тема | Стиль | Описание |
|---|---|---|
| Classic | Синий фон, жёлтые рамки | Стиль Midnight Commander |
| Dark | Тёмно-серый фон, мятный акцент | Современный минимализм |
Тема определяет ~26 цветовых свойств:
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):
| Код | Язык |
|---|---|
En | English |
Ru | Русский |
Переводы хранятся в locales/app.yml:
pane:
navigator:
en: Navigator
ru: Навигатор
send:
en: Send
ru: Отправка
receive:
en: Receive
ru: Приём
status:
waiting:
en: 'Waiting for receiver...'
ru: 'Ожидание получателя...'Статусные сообщения
Статусы передачи — не просто строки, а семантические типы. Они переводятся на нужный язык в момент отрисовки:
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) - Кеш выделенных файлов (хранит общий размер)
Рендеринг (ui.rs)
Вся отрисовка собрана в одном файле ui.rs. Он использует ratatui для создания виджетов:
Функции-помощники
| Функция | Что рисует |
|---|---|
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() | Обрезка длинных строк с … |