Skip to content

見た目とウィンドウ

すべての要素が取るキーワード、配色、そしてウィンドウ自身が持ってくるもの。

すべての要素が取るキーワード

どの要素も、次の 15 の性質を同じ名前と同じ意味で取ります。 widthheightmin_widthmax_widthdisabledthemeanimateeasingenterexitcol_spanrow_spanrolea11y_labeltooltip です。

    button("save", disabled => $busy, tooltip => "write the file", width => 120);
    text("total", role => "heading", a11y_label => "the running total");

同じ名前をもともと自分の意味で持っている要素では、要素側の意味がそのまま通ります。 textwidth は文字の幅を指し、外側のコンテナが上書きすることはありません。

テーマとアニメーション

配色も動きも、キーワードで指定します。

    column(@cells, theme => "dark");
    text("saved", animate => 150, easing => "out", enter => true);

theme は、書いた要素から下だけ配色を差し替えます。 animate には変化にかける時間をミリ秒で渡し、easing にはその曲がり方(linearinoutinOut)を渡します。 現れるときと消えるときの動きは、enterexit で指定します。 色は 16 進の文字列か、配色自身の名前(accentmuteddanger)です。 名前で書けば、一度書いた画面がそのまま明暗どちらの配色にも従います。

ウィンドウまわり

ウィンドウ自身から来るものが、次の四つです。 どれもアプリを作ったあと、run より前に宣言します。

use Rakugan;

class Keys {
    use Rakugan;
    field $count = 0;
    field $saved = 0;
    field $last  = "-";

    method save  { $saved = $count }
    method clear { $count = 0; $saved = 0 }

    method typed :Sig(Str) ($key) {
        $last = $key;
    }

    method view {
        return column(
            text("count: $count  saved: $saved"),
            text("last key: $last"),
            button("+1", on_click => sub { $count += 1 }),
            spacing => 8,
            padding => 12,
        );
    }
}

my $app = Keys->new;

menu_item("Count", "Clear", sub { $app->clear });
shortcut("cmd+s", sub { $app->save });
on_key(sub ($chord) { $app->typed($chord) });

run($app, title => "keys");

四つ目は on_file_drop(sub ($path) { ... }) です。 これらは、アプリが動いているあいだずっと有効です。

クリップボードは、二つの呼び出しで読み書きします。

    clipboard_set_text($text);
    $text = clipboard_get_text();

ファイルダイアログは人の操作を待つので、ウィンドウのスレッドの外に出します。 そのためにあるのが task です。

    task(sub { fs_open_dialog("Choose a file") },
         on_done => sub ($path) { $self->took($path) });
    task(sub { fs_save_dialog("notes.txt") },
         on_done => sub ($path) { $self->write_to($path) });

ウィンドウなしのスクリプトは、ダイアログに file:<path> の手順で答えます。 だからダイアログも、ほかの操作と同じように確かめられます。

音は、ファイルを鳴らして、あとは放っておく形です。

    audio_play("demo/assets/sound/blip.wav");        # 録音されたままの大きさで
    audio_play("demo/assets/sound/blast.wav", 0.4);  # 0.0 から 1.0 の大きさで
    audio_stop();

呼び出しはすぐ返り、鳴り終わるのを待ちません。 スクリプトで走らせるときは無音になります。 ゲートがスピーカーのあるマシンを要求するわけにはいかないからです。 音の出ないマシンや、読めないファイルでは、アプリを止めずに何も鳴りません。 エンジンが読めるのは WAV です。