Open6
Druid memo
Druidにはファイルドロップのサポートはまだない。
Windowsで下記のようにファイルダイアログからpng、jpgファイルを読み込んでもfile_info.format
がNone
であった。
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のファイルタイプを指定しても変わらず。
KbKey
ファイルダイアログオプションにファイルタイプを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"]);
widgetを状態によって入れ替えるとlayoutが呼ばれる前に起きたイベントによってwarningが出る。
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.
Flex
widgetのwith_flex_child
・add_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の割合で割り当てられる。