🔒 Repository is read-only – file editing is disabled.

luna/crates/libluna/examples/minimal.rs main

55 lines Raw ← Back
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
//! Najmniejsza sensowna aplikacja na libLunie: okno, reakcja na klik, motyw i i18n.
//!
//! Uruchom: `cargo run -p libluna --example minimal` (wymaga kompozytora Wayland).

use libluna::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Język dobrany ze środowiska (LANG/LC_*); dołóż własne katalogi, jeśli chcesz.
    set_locale(Locale::from_env());

    let config = AppConfig::new("Hello libLuna").initial_size(640, 400);
    let mut highlighted = true;

    run(config, move |frame: &mut Frame| {
        // 1. Zdarzenia wejścia od poprzedniej klatki.
        for event in frame.events {
            if let Event::PointerButton(pe) = event {
                if pe.button == PointerButton::Left && pe.state == ButtonState::Pressed {
                    highlighted = !highlighted;
                }
            }
        }

        // 2. Rysowanie sceny (w pikselach logicznych).
        let theme = frame.theme;
        let (w, h) = (frame.size.width, frame.size.height);
        let scene = &mut *frame.scene;

        scene.fill_rect(Rect::from_xywh(0.0, 0.0, w, h), theme.colors.window_bg);
        scene.fill_rounded_rect(
            Rect::from_xywh(24.0, 24.0, w - 48.0, 96.0),
            theme.radius.large,
            if highlighted {
                theme.colors.accent
            } else {
                theme.colors.card_bg
            },
        );

        let fg = if highlighted {
            theme.colors.accent_fg
        } else {
            theme.colors.text
        };
        scene.text(
            TextRun::new(Point::new(44.0, 82.0), tr("Application"), 20.0)
                .with_weight(700)
                .with_color(fg),
        );
        scene.text(
            TextRun::new(Point::new(24.0, 168.0), "Click anywhere to toggle", 14.0)
                .with_color(theme.colors.dim_text),
        );
    })
}