[rust]icedで画像を表示する

2020/11/21に公開

icedの基本

Sandboxトレイト(またはApplicationトレイト)を実装したSandbox構造体が
GUIアプリケーションの本体となる。

Sandbox構造体は(main関数の中で)runメソッドを実行し開始する。

runメソッドを実行すると、newメソッドが実行され、
titleメソッド・viewメソッドが実行される。
titleメソッドでウィンドウタイトルが設定される。
viewメソッドではエレメント(ウィジェット)を作成し、見た目を決定する。

// 上記の流れは振る舞いからの予想。

viewメソッドの中で画像表示を行うウィジェットを作成するために
imageハンドラーを利用する。

// updateメソッドでウィジェットの更新ができるが、今回は更新しないので中身なしにしている。
// Message関連型で更新の種類を指定できるが、今回は更新しないのでユニット型にしている。

関数のフローイメージは以下の通り。
薄い色にしている箇所は今回利用していない。
関数のフローイメージ

実際のコード

Cargo.toml
[package]
name = "display_image"
version = "0.1.0"
authors = ["kiduki <kiduki>"]
edition = "2018"

[dependencies]
iced = {version = "0.1.1",features =["image"]}
main.rs
//! icedで画像を表示する。

use iced::{image, Element, Image, Length, Sandbox, Settings};

pub fn main() {
    DisplayImage::run(Settings::default())
}

struct DisplayImage;

impl Sandbox for DisplayImage {
    type Message = ();

    fn new() -> Self {
        DisplayImage
    }

    fn title(&self) -> String {
        String::from("display_image")
    }

    fn update(&mut self, _message: ()) {}

    fn view(&mut self) -> Element<()> {
        let img = Image::new(image::Handle::from_path(format!(
            "{}/resources/iced_component_relation.png",
            env!("CARGO_MANIFEST_DIR")
        )))
        .width(Length::Fill)
        .height(Length::Fill);
        img.into()
    }
}

参考サイト

iced - github
iced - docs.rs

Discussion