-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathtodo-complete.py
More file actions
149 lines (132 loc) · 4.64 KB
/
Copy pathtodo-complete.py
File metadata and controls
149 lines (132 loc) · 4.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import pglet
from pglet import Text, Stack, Textbox, Button, Checkbox, Tabs, Tab
class Task:
def __init__(self, app, name):
self.app = app
self.display_task = Checkbox(
value=False, label=name, on_change=self.status_changed
)
self.edit_name = Textbox(width="100%")
self.display_view = Stack(
horizontal=True,
horizontal_align="space-between",
vertical_align="center",
controls=[
self.display_task,
Stack(
horizontal=True,
gap="0",
controls=[
Button(
icon="Edit", title="Edit todo", on_click=self.edit_clicked
),
Button(
icon="Delete",
title="Delete todo",
on_click=self.delete_clicked,
),
],
),
],
)
self.edit_view = Stack(
visible=False,
horizontal=True,
horizontal_align="space-between",
vertical_align="center",
controls=[self.edit_name, Button(text="Save", on_click=self.save_clicked)],
)
self.view = Stack(controls=[self.display_view, self.edit_view])
def edit_clicked(self, e):
self.edit_name.value = self.display_task.label
self.display_view.visible = False
self.edit_view.visible = True
self.view.update()
def save_clicked(self, e):
self.display_task.label = self.edit_name.value
self.display_view.visible = True
self.edit_view.visible = False
self.view.update()
def delete_clicked(self, e):
self.app.delete_task(self)
def status_changed(self, e):
self.app.update()
class TodoApp:
def __init__(self):
self.tasks = []
self.new_task = Textbox(placeholder="Whats needs to be done?", width="100%")
self.tasks_view = Stack()
self.filter = Tabs(
value="all",
on_change=self.tabs_changed,
tabs=[Tab(text="all"), Tab(text="active"), Tab(text="completed")],
)
self.items_left = Text("0 items left")
self.view = Stack(
width="70%",
controls=[
Text(value="Todos", size="large", align="center"),
Stack(
horizontal=True,
on_submit=self.add_clicked,
controls=[
self.new_task,
Button(primary=True, text="Add", on_click=self.add_clicked),
],
),
Stack(
gap=25,
controls=[
self.filter,
self.tasks_view,
Stack(
horizontal=True,
horizontal_align="space-between",
vertical_align="center",
controls=[
self.items_left,
Button(
text="Clear completed", on_click=self.clear_clicked
),
],
),
],
),
],
)
def update(self):
status = self.filter.value
count = 0
for task in self.tasks:
task.view.visible = (
status == "all"
or (status == "active" and task.display_task.value == False)
or (status == "completed" and task.display_task.value)
)
if task.display_task.value == False:
count += 1
self.items_left.value = f"{count} active item(s) left"
self.view.update()
def add_clicked(self, e):
task = Task(self, self.new_task.value)
self.tasks.append(task)
self.tasks_view.controls.append(task.view)
self.new_task.value = ""
self.update()
def delete_task(self, task):
self.tasks.remove(task)
self.tasks_view.controls.remove(task.view)
self.update()
def tabs_changed(self, e):
self.update()
def clear_clicked(self, e):
for task in self.tasks[:]:
if task.display_task.value == True:
self.delete_task(task)
def main(page):
page.title = "ToDo App"
page.horizontal_align = "center"
page.update()
app = TodoApp()
page.add(app.view)
pglet.app("todo-app", target=main)