#![feature(proc_macro)]
extern crate gtk;
#[macro_use]
extern crate relm;
extern crate relm_attributes;
#[macro_use]
extern crate relm_derive;
use gtk::{
Inhibit,
WidgetExt,
};
use relm::Widget;
use relm_attributes::widget;
use self::Msg::*;
#[derive(Msg)]
pub enum Msg {
Press,
Release,
Quit,
}
#[derive(Clone)]
pub struct Model {
press_count: i32,
}
#[widget]
impl Widget for Win {
fn model() -> Model {
Model {
press_count: 0,
}
}
fn update(&mut self, event: Msg, model: &mut Model) {
match event {
Press => {
model.press_count += 1;
println!("Press");
},
Release => {
println!("Release");
},
Quit => gtk::main_quit(),
}
}
view! {
gtk::Window {
key_press_event(_, key) => (Press, Inhibit(false)),
key_release_event(_, key) => (Release, Inhibit(false)),
delete_event(_, _) with model => return Self::quit(model),
}
}
}
impl Win {
fn quit(model: &mut Model) -> (Option<Msg>, Inhibit) {
if model.press_count > 3 {
(None, Inhibit(true))
}
else {
(Some(Quit), Inhibit(false))
}
}
}
fn main() {
Win::run(()).unwrap();
}