Open6

Druid memo

Takashi TenjoTakashi Tenjo

Windowsで下記のようにファイルダイアログからpng、jpgファイルを読み込んでもfile_info.formatNoneであった。

impl AppDelegate<AppState> for Delegate {
    fn command(
        &mut self,
        _ctx: &mut DelegateCtx,
        _target: Target,
        cmd: &Command,
        data: &mut AppState,
        _env: &Env,
    ) -> Handled {
        if let Some(file_info) = cmd.get(commands::OPEN_FILE) {
            data.path = match file_info.format {
                Some(FileSpec::JPG) => Some(file_info.path.to_owned()),
                Some(FileSpec::GIF) => Some(file_info.path.to_owned()),
                Some(FileSpec::PNG) => Some(file_info.path.to_owned()),
                _ => None,
            };
            return Handled::Yes;
        }

        Handled::No
    }
}

FileDialogOptionsにpng、jpgのファイルタイプを指定しても変わらず。

Takashi TenjoTakashi Tenjo

ファイルダイアログオプションにファイルタイプをVecで渡すとドロップダウンでそれぞれが選択できるようになる。下のようにするとデフォルトはjpgで、異なるファイルタイプを選択するときはドロップダウンから選択しないといけない。

FileDialogOptions::default().allowed_types(vec![
    FileSpec::JPG,
    FileSpec::GIF,
    FileSpec::PNG,
]),

jpg・gif・pngを一度に表示するには全てを含んだファイルタイプを作らないといけない。

pub const Img: FileSpec = FileSpec::new("Image", &["jpg", "jpeg", "gif", "png"]);
Takashi TenjoTakashi Tenjo

widgetを状態によって入れ替えるとlayoutが呼ばれる前に起きたイベントによってwarningが出る。

https://github.com/linebender/druid/issues/1760

fn build_widget(state: &AppState) -> Box<dyn Widget<AppState>> {
    let img = if let Some(path) = &state.path {
        match ImageBuf::from_file(path.as_path()) {
            Ok(data) => Image::new(data)
                .fill_mode(FillStrat::None)
                .border(Color::RED, 1.0),
            Err(e) => Label::new(e.to_string()).border(Color::RED, 1.0),
        }
    } else {
        Label::new("No Image").border(Color::RED, 1.0)
    };

    let sized = SizedBox::new(img);
    sized.center().border(Color::BLUE, 1.0).boxed()
}
WARN druid::core: WidgetId(1) received an event (MouseMove(MouseEvent { pos: (516.0, 445.0), window_pos: (516.0, 445.0), buttons: MouseButtons(00000), mods: Modifiers(NUM_LOCK), count: 0, focus: false, button: None, wheel_delta: Vec2 { x: 0.0, y: 0.0 } })) without having been laid out. This likely indicates a missed call to set_origin.
Takashi TenjoTakashi Tenjo

Flexwidgetのwith_flex_childadd_flex_childの第2引数はcssのflex-growのように残りの空間のうち、どれだけがその子に割り当てられるかを設定する。ただし、子が小さい時には引き伸ばされないのでexpand_heightなどを使って無限大の大きさに設定すると良い。

Flex::column()
    .with_child(Label::new("First"))
    .with_flex_child(Label::new("Second").expand_height(), 1.0)
    .with_flex_child(Label::new("Third").expand_height(), 2.0)
    .with_child(Label::new("Fourth"));

上の例では、まずFirstとFourthの高さが計算され、残りのスペースがSecondとThirdに1:2の割合で割り当てられる。