Web Analytics

AppCUI-rs

⭐ 376 stars Polish by gdt050579

🌐 Język

AppCUI-rs

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


Status kompilacji Windows
Status kompilacji Linux
Status kompilacji macOS
Pokrycie kodu
Licencja
Crates.io
Docs.rs
Galeria

AppCUI-rs to szybka, wieloplatformowa biblioteka w języku Rust do budowania nowoczesnych, tekstowych interfejsów użytkownika (TUI) z bogatymi widżetami, motywami oraz pełnym wsparciem Unicode — alternatywa dla ncurses i innych frameworków UI terminala.

✨ Funkcje

  • [x] wiele gotowych do użycia kontrolek (przyciski, etykiety, pola tekstowe, pola wyboru, przyciski radiowe, listy, drzewa, listy rozwijane, wybieraki daty/czasu, wybieraki kolorów, zakładki, akordeony itd.). Pełna lista kontrolek znajduje się tutaj
  • [x] potężny system układu pozwalający pozycjonować kontrolki za pomocą współrzędnych absolutnych, względnych, dokowania, wyrównania, kotwic lub pozycji pivot (więcej tutaj)
  • [x] menu i paski narzędzi
  • [x] wsparcie wielu platform (Windows przez API i wirtualny terminal, Linux przez ncurses, macOS przez termios)
  • [x] wsparcie wielowątkowości dla zadań w tle
  • [x] timery
  • [x] obsługa myszy
  • [x] obsługa schowka
  • [x] motywy kolorystyczne
  • [x] obsługa znaków Unicode
  • [x] predefiniowane okna dialogowe (okno komunikatu, okno wprowadzania, wybierak kolorów, okna zapisu i otwierania, nawigator folderów itd.)
  • [x] wsparcie true-color (24 bity na piksel) dla terminali, które to obsługują.

📸 Zrzuty ekranu

👉 Zobacz Galerię po pełne dema wszystkich kontrolek!

🖥️ Backend'y

AppCUI obsługuje różne backendy w zależności od systemu operacyjnego:

  • Windows Console - oparty na niskopoziomowym API Win32, zaprojektowany dla klasycznego konsoli Windows
  • Windows VT - oparty na sekwencjach ANSI, zaprojektowany dla nowoczesnych wirtualnych terminali Windows
  • NCurses - oparty na API NCurses dla środowisk Linux
  • Termios - oparty na sekwencjach ANSI i niskopoziomowych API dla macOS
  • Web Terminal - zaprojektowany dla implementacji webowych (oparty na WebGL)
  • CrossTerm - oparty na bibliotece crossterm, aktywowany poprzez flagę funkcji
Więcej o obsługiwanych backendach znajdziesz tutaj

🚀 Szybki start

Dodaj poniższe do swojego pliku Cargo.toml:

toml [dependencies] appcui = "*"
Następnie utwórz nowy projekt w języku Rust i dodaj poniższy kod:

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(()) }


Lub bardziej kompaktowa wersja z użyciem proc-makrosów:
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(()) }


Następnie uruchom projekt poleceniem cargo run. Powinno pojawić się okno z tytułem Test i tekstem Hello World ! na środku.

🧪 Przykłady

AppCUI-rs zawiera zestaw przykładów, które pomogą Ci rozpocząć pracę. Znajdziesz je w folderze examples, w tym:

🛠️ Bardziej złożony przykład

Przykład, który tworzy okno z przyciskiem, który po naciśnięciu zwiększa licznik.

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