...または、どうすれば gtk::Widget をサブクラス化できますか?
my には次の依存関係がありますCargo.toml
。
[dependencies]
num = "*"
gtk = "*"
cairo-rs = "*"
gdk = "*"
time = "*"
独自のタイプのウィジェットを作成したい (フラクタルをレンダリングするため)。私は持っている:
extern crate cairo;
extern crate gtk;
use cairo::Context;
use gtk::signal::Inhibit;
use gtk::signal::WidgetSignals;
use gtk::traits::ContainerTrait;
use gtk::traits::WidgetTrait;
struct MyWidget {
widget: gtk::DrawingArea,
foo: u32,
}
impl MyWidget {
fn new() -> MyWidget {
let result = MyWidget {
widget: gtk::DrawingArea::new().unwrap(),
foo: 17
};
result.widget.connect_draw(move |_w, c| {
// Cannot do: result.redraw(c)
Inhibit(true)
});
result
}
fn modify(&mut self, x: u32) {
self.foo += x;
self.widget.queue_draw();
}
fn redraw(&self, _ : Context) -> Inhibit {
println!("Should redraw for {}", self.foo);
Inhibit(true)
}
}
fn main() {
gtk::init().ok();
let window = gtk::Window::new(gtk::WindowType::TopLevel).unwrap();
let area = MyWidget::new();
window.add(&area.widget);
window.connect_delete_event(|_, _| {
gtk::main_quit();
Inhibit(true)
});
window.connect_key_release_event(move |_w, _event| {
// Cannot do: area.modify(3);
Inhibit(true)
});
window.connect_button_release_event(move |_w, _event| {
// Cannot do: area.modify(17);
Inhibit(true)
});
window.show_all();
gtk::main();
}
しかし、redraw
gets が呼び出されると、 w はもちろん thegtk::DrawingArea
であり、 my ではありませんFractalWidget
。私はクロージャーを使って呼び出しconnect_draw
を試みましたが、それを使用result
することができませんでした (Box
結果を取得しmove
てラムダに入れようとしましたが、これは初めてなので、おそらく試していない方法があります) .
それで、私の実際の質問:より多くのデータをrust-gnome redrawメソッド(および他の同様のコールバック)に送信する方法はありますか、それともウィジェット構造体を拡張して自分のデータを含める方法はありますか?