GTK+のRustバインディングである、gtk-rsを研究中。
アプリケーションから自由に描画するには、DrawingAreaという部品を使うようだ。ここにイメージを表示する方法を調査。
まず画像ファイルを読むには、Pixbufを使うのが良いようだ。
let pix = match Pixbuf::new_from_file("images/moomoo.jpg") {
Err(e) => {
println!("Err: {}.", e);
return;
}
Ok(p) => p
};
DrawingAreaへの描画は、connect_draw()を使って、クロージャを登録する。
drawingArea.connect_draw(move |widget, context| {
...
});
このcontextが、cairo::Contextなので、これを利用して描画すれば良いのだが、APIを見た感じ、pixbufを描画するメソッドが見つからない。
途方に暮れていたら、gdk::prelude::ContextExtを見つけた。Rustのtraitは非侵入的に拡張できてしまうので、普通にAPIを眺めていてもダメで、APIサイトの検索で探さないとダメだ。
extern crate gdk;
use gtk::prelude::*;
...
drawingArea.connect_draw(move |widget, context| {
context.set_source_pixbuf(&ws.pix, 0f64, 0f64);
context.paint();
return Inhibit(false);
});
できた。
サンプルコード全体は、GitHubに置いておいた。