cedar 0.1.1

Reactive, functional library for creating GUI applications

use super::widget::Widgeted;

use stream::Stream;
use dom::Attributes;

use gtk;
use gtk::prelude::*;

pub struct Button<S> {
    pub button: gtk::Button,
    stream: Stream<S>,
}

impl<S: Clone + 'static> Button<S> {
    pub fn new(stream: Stream<S>) -> Self {
        Button {
            button: gtk::Button::new(),
            stream: stream,
        }
    }

    pub fn set_text(&mut self, text: &str) {
        self.button.set_label(text);
    }

    pub fn register_click(&mut self, message: S) {
        let stream = self.stream.clone();
        self.button
            .connect_clicked(move |_| stream.push(message.clone()));
    }
}


impl<S: Clone + 'static> Widgeted<S> for Button<S> {
    fn update(&mut self, attributes: Attributes<S>) {
        use dom::Attribute::*;
        for attr in attributes.into_iter() {
            match attr {
                Text(text) => self.set_text(&text),
                Click(message) => self.register_click(message),
                _ => {}
            }
        }
    }
}