extern crate chrono;
extern crate glib;
extern crate gtk;
extern crate relm_core;
use std::time::Duration;
use chrono::Local;
use gtk::{
Button,
ButtonExt,
ContainerExt,
Inhibit,
Label,
LabelExt,
WidgetExt,
Window,
WindowType,
};
use gtk::Orientation::Vertical;
use relm_core::EventStream;
use Msg::*;
struct Widgets {
clock_label: Label,
counter_label: Label,
}
#[derive(Clone, Debug)]
enum Msg {
Clock,
Decrement,
Increment,
Quit,
}
struct Model {
counter: i32,
}
fn main() {
gtk::init().expect("gtk::init failed");
let vbox = gtk::Box::new(Vertical, 0);
let clock_label = Label::new(None);
vbox.add(&clock_label);
let plus_button = Button::new_with_label("+");
vbox.add(&plus_button);
let counter_label = Label::new("0");
vbox.add(&counter_label);
let minus_button = Button::new_with_label("-");
vbox.add(&minus_button);
let widgets = Widgets {
clock_label: clock_label,
counter_label: counter_label,
};
let window = Window::new(WindowType::Toplevel);
window.add(&vbox);
let main_stream = EventStream::new();
let echo_stream = EventStream::new();
echo_stream.observe(move |event: &Msg| {
println!("...Echo: {:?}", event);
});
{
main_stream.observe(move |event: &Msg| {
println!("Event: {:?}", event);
echo_stream.emit(event.clone());
});
}
{
let stream = main_stream.clone();
plus_button.connect_clicked(move |_| {
stream.emit(Increment);
});
}
{
let stream = main_stream.clone();
minus_button.connect_clicked(move |_| {
stream.emit(Decrement);
});
}
window.show_all();
{
let stream = main_stream.clone();
window.connect_delete_event(move |_, _| {
stream.emit(Quit);
Inhibit(false)
});
}
let mut model = Model {
counter: 0,
};
fn update(event: Msg, model: &mut Model, widgets: &Widgets) {
match event {
Clock => {
let now = Local::now();
widgets.clock_label.set_text(&now.format("%H:%M:%S").to_string());
},
Decrement => {
model.counter -= 1;
widgets.counter_label.set_text(&model.counter.to_string());
},
Increment => {
model.counter += 1;
widgets.counter_label.set_text(&model.counter.to_string());
},
Quit => gtk::main_quit(),
}
}
main_stream.set_callback(move |msg| {
update(msg, &mut model, &widgets);
});
gtk::main();
}