Web Analytics

AppCUI-rs

⭐ 376 stars Russian by gdt050579

🌐 Язык

AppCUI-rs

`` ⯈ 𝗔𝗽𝗽𝗖𝗨𝗜-𝗿𝘀 🖳


Статус сборки Windows
Статус сборки Linux
Статус сборки macOS
Покрытие кода
Лицензия
Crates.io
Docs.rs
Галерея

AppCUI-rs — это быстрая кроссплатформенная библиотека Rust для создания современных текстовых пользовательских интерфейсов (TUI) с богатыми виджетами, темами и полной поддержкой Unicode — альтернатива ncurses и другим фреймворкам терминальных интерфейсов.

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

  • [x] множество готовых контролов (кнопки, метки, текстовые поля, чекбоксы, радиокнопки, списки, деревья, комбобоксы, выбор даты/времени, выбор цвета, вкладки, аккордеоны и т.д.). Полный список контролов доступен здесь
  • [x] мощная система компоновки, позволяющая размещать элементы с помощью абсолютных координат, относительных координат, докинга, выравнивания, якорей или позиционирования по точке опоры (подробнее здесь)
  • [x] меню и панели инструментов
  • [x] поддержка нескольких платформ (Windows через API и виртуальный терминал, Linux через ncurses, macOS через termios)
  • [x] поддержка многопоточности для фоновых задач
  • [x] таймеры
  • [x] поддержка мыши
  • [x] поддержка буфера обмена
  • [x] цветовые темы
  • [x] поддержка символов Unicode
  • [x] предопределённые диалоги (сообщение, ввод, выбор цвета, диалоги открытия/сохранения, навигатор папок и др.)
  • [x] поддержка true-color (24 бита на пиксель) для терминалов, поддерживающих это.

📸 Скриншоты

👉 Посмотрите Галерею для полноценных демонстраций всех контролов!

🖥️ Бэкенды

AppCUI поддерживает различные бэкенды в зависимости от операционной системы:

  • Windows Console - основан на низкоуровневом Win32 API, предназначен для классической консоли Windows
  • Windows VT - основан на ANSI-последовательностях, предназначен для современных виртуальных терминалов Windows
  • NCurses - основан на API NCurses для Linux-сред
  • Termios - основан на ANSI-последовательностях и низкоуровневых API для macOS
  • Web Terminal - предназначен для веб-реализаций (основан на WebGL)
  • CrossTerm - основан на библиотеке crossterm, активируется через feature-флаг
Подробнее о поддерживаемых бэкендах можно узнать здесь

🚀 Быстрый старт

Добавьте следующее в ваш Cargo.toml:

toml [dependencies] appcui = "*"
Затем создайте новый проект Rust и добавьте следующий код:

rust use appcui::prelude::*;

fn main() -> Result<(), appcui::system::Error> { let mut app = App::new().build()?; let mut win = Window::new( "Test", LayoutBuilder::new().alignment(Alignment::Center).width(30).height(9).build(), window::Flags::Sizeable, ); win.add(Label::new( "Hello World !", LayoutBuilder::new().alignment(Alignment::Center).width(13).height(1).build(), )); app.add_window(win); app.run(); Ok(()) }


Или более компактная версия с использованием proc-macros:
rs use appcui::prelude::*;

fn main() -> Result<(), appcui::system::Error> { let mut app = App::new().build()?; let mut win = window!("Test,a:c,w:30,h:9"); win.add(label!("'Hello World !',a:c,w:13,h:1")); app.add_window(win); app.run(); Ok(()) }


Затем запустите проект с помощью cargo run. Вы должны увидеть окно с заголовком Test и текстом Hello World ! в центре.

🧪 Примеры

AppCUI-rs поставляется с набором примеров, чтобы помочь вам начать работу. Вы можете найти их в папке examples, включая:

🛠️ Более сложный пример

Пример, который создает окно с кнопкой, при нажатии на которую увеличивается счетчик.

rust use appcui::prelude::*;

// Create a window that handles button events and has a counter #[Window(events = ButtonEvents)] struct CounterWindow { counter: i32 }

impl CounterWindow { fn new() -> Self { let mut w = Self { // set up the window title and position base: window!("'Counter window',a:c,w:30,h:5"), // initial counter is 1 counter: 1 }; // add a single button with the caption "1" (like the counter) w.add(button!("'1',d:b,w:20")); w } } impl ButtonEvents for CounterWindow { // When the button is pressed, this function will be called // with the handle of the button that was pressed // Since we only have one button, we don't need to store its handle // in the struct, as we will receive the handle via the on_pressed method fn on_pressed(&mut self, handle: Handle