とにかく書く

日々の雑感や知り得たことを、とにかく書いています

おっさんの挑戦(画像ビューア作成) 005

おっさんも、たまには浮気をしたい。あれやこれや目移りしたい。
Rust で GUI を実装するためのクレートを iced 以外にも探してみた。
結局、今のまま iced で続けることにした。


今は、iced だと画像を拡大しようとすると、image クレートを使って、画像を画素に分解してから、拡大して、campas ウィジェットに描画して初めて実現できると思っている。

こういう実装をするのがちょっと面倒だなと思って、他の GUI クレートが使えないかを探してみた。
もともと、このプログラムを始める前から拝読していた RustでGUI 〜GUIライブラリ比較編〜 と、「GUI の種は蒔かれた (でもまだ根を張ってない)」で始まる Are we GUI Yet? を参考にした。

ただ、GUI ライブラリといっても、せっかく Rust を使っているので iced のように Rust だけで構築されているものを使いたい。つまり、GTK とか Qt とかのバインドは使いたくない。

あと、普段はバイナリコードで使いたい。ウェブへ出力できる機能は良いけど、ウェブしかダメなのは NG.
そこで Azul と OrgTk を試してみた。

Azul は、Mozilla が開発している GUI クレートで、CSS でボタンなどの部品の見た目を変えられる。
ただ、画像の描画は SVG を除いて Open GL で行うようだ。(ここ、嘘の可能性大。)
そのため gleam クレートを使って Open GL にアクセスしている。
ただ、example の opengl.rs すらコンパイルが通らない。あきらめた。

OrgTk でも画像の描画はすぐにできる。だけど以下の点が今ひとつだった。

  • ウィンドウマネージャによるウィンドウサイズの変更ができない (Openbox の場合)
  • ウィンドウのサイズを画像より小さくして起動すると、画像の一部だけが表示された。
  • ウィンドウのサイズを画像より大きくして起動すると、のこりは黒背景が表示され。
  • 画像の拡大縮小ができない
  • 親ウィンドウより大きなサイズの画像を置こうとするとエラーで停止する
  • クレートのソースコードの記載が少なく、動作がよくわからない。Template のメソッドが継承されている?
# Cargo.toml
[dependencies]
orbtk = "0.3.1-alpha3"
// main.rs
use orbtk::prelude::*;

fn main() {
    // use this only if you want to run it as web application.
    //orbtk::initialize();

    Application::new()
        .window(|ctx| {
            Window::new()
                .title("OrbTk - image example")
                .position((100.0, 100.0))
                .size(800.0, 420.0)
                .child(
                    ImageWidget::new()
                        .image("res/orbtk-space.png")
                        //.max_size(400, 210)
                        //.size(400, 210)
                        .build(ctx),
                )
                //.max_size(400, 210)
                //.size(400, 210)
                .build(ctx)
        })
        .run();
}