Web Analytics

AppCUI-rs

⭐ 376 stars Italian by gdt050579

🌐 Lingua

AppCUI-rs

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


Stato Build Windows
Stato Build Linux
Stato Build macOS
Copertura del Codice
Licenza
Crates.io
Docs.rs
Gallery

AppCUI-rs è una veloce libreria Rust multipiattaforma per creare interfacce utente testuali (TUI) moderne, con widget avanzati, temi e pieno supporto Unicode—un'alternativa a ncurses e ad altri framework UI per terminale.

✨ Funzionalità

  • [x] numerosi controlli pronti all'uso (bottoni, etichette, caselle di testo, checkbox, radio button, list view, tree view, combo box, selettori data/ora, selettori colore, tab, accordion, ecc.). Un elenco completo dei controlli è disponibile qui
  • [x] potente sistema di layout che consente di posizionare i controlli tramite coordinate assolute, relative, docking, allineamento, ancoraggi o posizionamento pivot (vedi di più qui)
  • [x] menu e barre degli strumenti
  • [x] supporto multipiattaforma (Windows tramite API e terminale virtuale, Linux tramite ncurses, macOS tramite termios)
  • [x] supporto multithreading per permettere task in background
  • [x] timer
  • [x] supporto mouse
  • [x] supporto clipboard
  • [x] temi colore
  • [x] supporto caratteri Unicode
  • [x] dialoghi predefiniti (message box, input box, selettore colore, finestre di salvataggio/apertura, navigatore cartelle, ecc.)
  • [x] supporto true-color (24 bit per pixel) per i terminali che lo supportano.

📸 Screenshot

👉 Dai un'occhiata alla Galleria per demo complete di tutti i controlli!

🖥️ Backend

AppCUI supporta diversi backend a seconda del sistema operativo:

  • Console di Windows - basata sull'API low-level Win32, progettata per la console classica di Windows
  • Windows VT - basata su sequenze ANSI, progettata per i terminali virtuali moderni di Windows
  • NCurses - basata sull'API NCurses per ambienti Linux
  • Termios - basata su sequenze ANSI e API low-level per macOS
  • Web Terminale - progettata per implementazioni web (basata su WebGL)
  • CrossTerm - basata sul crate crossterm, abilitata tramite un feature flag
Maggiori informazioni sui backend supportati sono disponibili qui

🚀 Avvio rapido

Aggiungi quanto segue al tuo Cargo.toml:

toml [dependencies] appcui = "*"

Quindi crea un nuovo progetto Rust e aggiungi il seguente codice:
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(()) }


Oppure una versione più compatta utilizzando proc-macro:
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(()) }


Quindi esegui il progetto con cargo run. Dovresti vedere una finestra con il titolo Test e il testo Hello World ! al centro.

🧪 Esempi

AppCUI-rs include una serie di esempi per aiutarti a iniziare. Puoi trovarli nella cartella examples, tra cui:

🛠️ Un esempio più complesso

Un esempio che crea una finestra con un pulsante che, quando premuto, incrementa un contatore.

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