2022-04-26 17:33:31 +00:00
|
|
|
import model;
|
2022-04-28 20:24:47 +00:00
|
|
|
import std.stdio;
|
2022-04-26 17:33:31 +00:00
|
|
|
|
|
|
|
import gtk.MainWindow;
|
|
|
|
import gtk.Main;
|
2022-04-28 20:24:47 +00:00
|
|
|
import gtk.Builder;
|
|
|
|
import gtk.Application;
|
|
|
|
import gtk.ApplicationWindow;
|
|
|
|
import gtk.Entry;
|
|
|
|
import gtk.Box;
|
|
|
|
import gtk.ListBox;
|
|
|
|
import gtk.ListBoxRow;
|
|
|
|
import gtk.Label;
|
|
|
|
import gtk.CheckButton;
|
|
|
|
import gtk.ToggleButton;
|
|
|
|
import gtk.Button;
|
|
|
|
|
|
|
|
class ToDoItemWidget : Box {
|
|
|
|
this(ToDoItem item, ToDoModel todoModel) {
|
|
|
|
super(GtkOrientation.HORIZONTAL, 5);
|
|
|
|
CheckButton button = new CheckButton();
|
|
|
|
button.setActive(item.checked);
|
|
|
|
button.addOnToggled(delegate(ToggleButton b) {
|
|
|
|
item.checked = b.getActive();
|
|
|
|
});
|
|
|
|
Label label = new Label(item.text);
|
|
|
|
label.setLineWrap(true);
|
|
|
|
label.setHalign(GtkAlign.START);
|
|
|
|
label.setValign(GtkAlign.CENTER);
|
|
|
|
this.packStart(button, false, false, 0);
|
|
|
|
|
|
|
|
Button removeButton = new Button(StockID.REMOVE);
|
|
|
|
removeButton.addOnClicked(delegate(Button b) {
|
|
|
|
todoModel.removeItem(item.priority);
|
|
|
|
});
|
|
|
|
this.packEnd(removeButton, false, false, 0);
|
|
|
|
|
|
|
|
if (todoModel.canIncrement(item)) {
|
|
|
|
Button upButton = new Button(StockID.GO_UP, delegate(Button b) {
|
|
|
|
todoModel.incrementPriority(item);
|
|
|
|
});
|
|
|
|
this.packEnd(upButton, false, false, 0);
|
|
|
|
}
|
|
|
|
if (todoModel.canDecrement(item)) {
|
|
|
|
Button downButton = new Button(StockID.GO_DOWN, delegate(Button b) {
|
|
|
|
todoModel.decrementPriority(item);
|
|
|
|
});
|
|
|
|
this.packEnd(downButton, false, false, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.packEnd(label, true, true, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Entry taskEntry;
|
|
|
|
ListBox taskList;
|
|
|
|
|
|
|
|
ToDoModel todoModel;
|
2022-04-26 17:33:31 +00:00
|
|
|
|
|
|
|
void main(string[] args) {
|
|
|
|
Main.init(args);
|
2022-04-28 20:24:47 +00:00
|
|
|
Builder builder = new Builder("todo-ui.glade");
|
|
|
|
|
|
|
|
builder.addCallbackSymbol("onAddTask", &addTask);
|
|
|
|
builder.addCallbackSymbol("onWindowDestroy", &onWindowDestroy);
|
|
|
|
builder.addCallbackSymbol("onQuitMenuActivated", &onWindowDestroy);
|
|
|
|
builder.connectSignals(null);
|
|
|
|
|
|
|
|
taskList = cast(ListBox) builder.getObject("taskList");
|
|
|
|
taskEntry = cast(Entry) builder.getObject("addTaskEntry");
|
|
|
|
|
|
|
|
todoModel = new ToDoModel();
|
|
|
|
import std.functional : toDelegate;
|
|
|
|
todoModel.addListener(ModelUpdateListener.of(toDelegate(&itemsUpdated)));
|
|
|
|
|
|
|
|
ApplicationWindow window = cast(ApplicationWindow) builder.getObject("window");
|
2022-04-26 17:33:31 +00:00
|
|
|
window.showAll();
|
|
|
|
Main.run();
|
|
|
|
}
|
2022-04-28 20:24:47 +00:00
|
|
|
|
|
|
|
void itemsUpdated(ToDoItem[] items) {
|
|
|
|
taskList.removeAll();
|
|
|
|
foreach (item; items) {
|
|
|
|
auto widget = new ToDoItemWidget(item, todoModel);
|
|
|
|
auto row = new ListBoxRow();
|
|
|
|
row.add(widget);
|
|
|
|
taskList.add(row);
|
|
|
|
}
|
|
|
|
taskList.showAll();
|
|
|
|
}
|
|
|
|
|
|
|
|
extern (C) void addTask() {
|
|
|
|
todoModel.addItem(taskEntry.getText());
|
|
|
|
taskEntry.setText("");
|
|
|
|
}
|
|
|
|
|
|
|
|
extern (C) void onWindowDestroy() {
|
|
|
|
Main.quit();
|
|
|
|
}
|