Added starter implementation.
This commit is contained in:
parent
41e7c4eeed
commit
11080210c1
|
@ -0,0 +1,15 @@
|
|||
.dub
|
||||
docs.json
|
||||
__dummy.html
|
||||
docs/
|
||||
/todo-d
|
||||
todo-d.so
|
||||
todo-d.dylib
|
||||
todo-d.dll
|
||||
todo-d.a
|
||||
todo-d.lib
|
||||
todo-d-test-*
|
||||
*.exe
|
||||
*.o
|
||||
*.obj
|
||||
*.lst
|
|
@ -1,2 +1,4 @@
|
|||
# todo-d
|
||||
A simple to-do list, implemented as a desktop application in D.
|
||||
|
||||
This project is built using GTK-D, and as such, please ensure that you've installed the necessary prerequisites to be able to build and run this application.
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"authors": [
|
||||
"Andrew Lalis"
|
||||
],
|
||||
"copyright": "Copyright © 2022, Andrew Lalis",
|
||||
"dependencies": {
|
||||
"gtk-d": "~>3.10.0"
|
||||
},
|
||||
"description": "A simple to-do list, implemented as a desktop application in D.",
|
||||
"license": "MIT",
|
||||
"name": "todo-d"
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"fileVersion": 1,
|
||||
"versions": {
|
||||
"gtk-d": "3.10.0"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
import std.stdio;
|
||||
|
||||
import model;
|
||||
import view : setupUI;
|
||||
|
||||
import gtk.MainWindow;
|
||||
import gtk.Main;
|
||||
|
||||
void main(string[] args) {
|
||||
Main.init(args);
|
||||
MainWindow window = new MainWindow("To-Do");
|
||||
window.setDefaultSize(300, 500);
|
||||
setupUI(window);
|
||||
window.showAll();
|
||||
Main.run();
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
module model;
|
||||
|
||||
struct ToDoItem {
|
||||
string text;
|
||||
int priority;
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
module view;
|
||||
|
||||
import model;
|
||||
|
||||
import gtk.Box;
|
||||
import gtk.ListBox;
|
||||
import gtk.ListBoxRow;
|
||||
import gtk.Label;
|
||||
import gtk.CheckButton;
|
||||
import gtk.Window;
|
||||
import gtk.ScrolledWindow;
|
||||
import gtk.Entry;
|
||||
import gtk.Button;
|
||||
|
||||
// Yes, I use global items for my application.
|
||||
|
||||
ListBox todoList;
|
||||
Entry todoEntry;
|
||||
|
||||
ToDoItem[] items = [];
|
||||
|
||||
void setupUI(Window w) {
|
||||
todoList = new ListBox();
|
||||
todoEntry = new Entry();
|
||||
|
||||
auto vbox = new Box(GtkOrientation.VERTICAL, 5);
|
||||
|
||||
todoList.setSelectionMode(GtkSelectionMode.NONE);
|
||||
|
||||
vbox.packStart(new ScrolledWindow(todoList), true, true, 5);
|
||||
|
||||
auto addBox = new Box(GtkOrientation.HORIZONTAL, 5);
|
||||
addBox.packStart(todoEntry, true, true, 0);
|
||||
Button addButton = new Button("Add");
|
||||
addButton.addOnClicked(delegate(Button b) {addItem();});
|
||||
addBox.packEnd(addButton, false, false, 0);
|
||||
vbox.packEnd(addBox, false, false, 0);
|
||||
|
||||
w.add(vbox);
|
||||
}
|
||||
|
||||
void addItem() {
|
||||
import std.algorithm;
|
||||
import std.string;
|
||||
string text = todoEntry.getText().strip;
|
||||
if (text.length == 0) return;
|
||||
int maxPrio = -1_000_000;
|
||||
foreach (item; items) {
|
||||
maxPrio = max(maxPrio, item.priority);
|
||||
}
|
||||
ToDoItem newItem = ToDoItem(text, maxPrio + 1);
|
||||
items ~= newItem;
|
||||
todoEntry.setText("");
|
||||
normalizePriorities();
|
||||
refreshList();
|
||||
}
|
||||
|
||||
void normalizePriorities() {
|
||||
int prio = 1;
|
||||
foreach (item; items) {
|
||||
item.priority = prio++;
|
||||
}
|
||||
}
|
||||
|
||||
void removeItem(int prio) {
|
||||
import std.algorithm;
|
||||
import std.array;
|
||||
ToDoItem[] newItems = items.filter!(item => item.priority != prio).array;
|
||||
items = newItems;
|
||||
normalizePriorities();
|
||||
refreshList();
|
||||
}
|
||||
|
||||
void refreshList() {
|
||||
todoList.removeAll();
|
||||
foreach (item; items) {
|
||||
auto widget = new ToDoItemWidget(item);
|
||||
auto row = new ListBoxRow();
|
||||
row.add(widget);
|
||||
todoList.add(row);
|
||||
}
|
||||
todoList.showAll();
|
||||
}
|
||||
|
||||
class ToDoItemWidget : Box {
|
||||
private ToDoItem item;
|
||||
|
||||
this(ToDoItem item) {
|
||||
super(GtkOrientation.HORIZONTAL, 5);
|
||||
this.item = item;
|
||||
CheckButton button = new CheckButton();
|
||||
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("Remove");
|
||||
removeButton.addOnClicked(delegate(Button b) {
|
||||
removeItem(item.priority);
|
||||
});
|
||||
this.packEnd(removeButton, false, false, 0);
|
||||
this.packEnd(label, true, true, 0);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue