module mvvm.view;

import core.time;

import gtk.MainWindow;
import gtk.Box;
import gtk.Entry;
import gtk.Label;
import gtk.Button;
import gtk.Widget;

import rx;

import mvvm.model;
import mvvm.util;

class MyAppWindow : MainWindow
{
    this(AppViewModel model)
    {
        super("rx example");
        setDefaultSize(640, 480);

        auto disposeBag = new CompositeDisposable;
        this.addOnDestroy((Widget _) { disposeBag.dispose(); });

        auto name = model.name.toBindedEntry(disposeBag);
        auto age = model.age.toBindedLabel(disposeBag);
        auto profile = model.profile.debounce(500.msecs).toBindedLabel(disposeBag);
        auto incrementAge = makeBindedButton("+1", &model.incrementAge);
        auto decrementAge = makeBindedButton("-1", &model.decrementAge,
                model.canDecrementAge, disposeBag);
        auto clear = makeBindedButton("Clear", {
            model.clear();
            profile.setText("");
        }, model.canClear, disposeBag);

        auto box = new Box(GtkOrientation.VERTICAL, 5);
        box.packStart(makeLine("Name:", name), false, false, 0);
        box.packStart(makeLine("Age:", age, decrementAge, incrementAge), false, false, 0);
        box.packStart(makeLine("Profile:", profile), false, false, 0);
        box.packStart(clear, false, false, 0);
        add(box);
    }
}

Box makeLine(string name, Widget[] widgets...)
{
    auto box = new Box(GtkOrientation.HORIZONTAL, 5);
    box.packStart(new Label(name), false, false, 0);
    foreach (widget; widgets)
        box.packStart(widget, false, false, 0);
    return box;
}