-
Notifications
You must be signed in to change notification settings - Fork 7
/
todo-with-filter.py
130 lines (108 loc) · 3.76 KB
/
todo-with-filter.py
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
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.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]),
],
)
def update(self):
status = self.filter.value
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)
)
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 main(page):
page.title = "ToDo App"
page.horizontal_align = "center"
page.update()
# create application instance
app = TodoApp()
# add application's root control to the page
page.add(app.view)
pglet.app("todo-app", target=main)