-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
304 lines (261 loc) · 13 KB
/
main.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
import flet as ft
from backend import save_progress, save_all_masechta, load_progress, load_data
from hebrew_numbers import int_to_gematria
def main(page: ft.Page):
page.title = "שמור וזכור"
page.rtl = True
page.theme_mode = ft.ThemeMode.LIGHT
page.theme = ft.Theme(color_scheme_seed=ft.colors.BROWN)
page.vertical_alignment = ft.MainAxisAlignment.START
page.horizontal_alignment = ft.CrossAxisAlignment.CENTER
page.padding = 20
page.scroll = "adaptive"
# משתנה לשמירת הכרטיסייה הנוכחית
current_tab_index = 0
# טוען את כל הנתונים הרלוונטיים מקבצי ה-JSON השונים
data = load_data()
if not data:
page.overlay.append(ft.SnackBar(ft.Text("Error loading data.")))
page.update()
return
current_masechta = None
completion_indicators = {}
def update_completion_status(category, masechta_name):
""" עדכון סטטוס להשלמת מסכת, ספר תנ"ך, סימן רמב"ם וכו' בהתאם לקטגוריה """
progress = load_progress(masechta_name, category) # נוספה קטגוריה
masechta_data = data[category].get(masechta_name)
if not masechta_data:
return
total_pages = 2 * masechta_data["pages"] if category in ["תלמוד בבלי", "תלמוד ירושלמי"] else masechta_data["pages"]
# בתלמוד בבלי וירושלמי נבדוק עמוד א' ועמוד ב', בשאר רק פרק/סימן
if category in ["תלמוד בבלי", "תלמוד ירושלמי"]:
completed_pages = sum(
1 for daf_data in progress.values() for amud_value in daf_data.values() if amud_value
)
else:
completed_pages = sum(1 for daf_data in progress.values() if daf_data.get("a", False))
complication = completed_pages == total_pages
completion_indicators[masechta_name].icon = ft.icons.CHECK_CIRCLE if complication else ft.icons.CIRCLE_OUTLINED
completion_indicators[masechta_name].color = ft.colors.GREEN if complication else ft.colors.GREY_400
page.update()
return complication
def create_table(category, masechta_name):
# גישה נכונה לקטגוריה ולמסכת בתוך הנתונים
masechta_data = data[category].get(masechta_name)
if not masechta_data:
page.overlay.append(ft.SnackBar(ft.Text(f"Error: Masechta '{masechta_name}' not found.")))
page.update()
return None
progress = load_progress(masechta_name, category) # נוספה קטגוריה
def on_change(e):
daf = int(e.control.data["daf"])
amud = e.control.data["amud"]
save_progress(masechta_name, daf, amud, e.control.value, category) # נוספה קטגוריה
update_completion_status(category, masechta_name)
update_check_all_status(table)
def check_all(e):
for row in table.rows:
if category in ["תלמוד בבלי", "תלמוד ירושלמי"]:
row.cells[1].content.value = e.control.value
row.cells[2].content.value = e.control.value
else:
row.cells[1].content.value = e.control.value
save_all_masechta(masechta_name, masechta_data["pages"], e.control.value, category) # נוספה קטגוריה
update_completion_status(category, masechta_name)
def update_check_all_status(table):
all_checked = all(
row.cells[1].content.value if category in ["תלמוד בבלי", "תלמוד ירושלמי"] else row.cells[0].content.value
for row in table.rows
)
check_all_checkbox.value = all_checked
page.update()
# הגדרת השמות המותאמים לכל נושא
if category in ["תלמוד בבלי", "תלמוד ירושלמי"]:
table_columns = [
ft.DataColumn(ft.Text("דף")),
ft.DataColumn(ft.Text("עמוד א")),
ft.DataColumn(ft.Text("עמוד ב")),
]
else:
# שתי עמודות: מספר פרק/סימן + Checkbox לבדיקת סטטוס
table_columns = [
ft.DataColumn(ft.Text("פרק" if category == "תנ״ך" else "סימן")),
ft.DataColumn(ft.Text("מצב"))
]
table = ft.DataTable(
columns=table_columns,
rows=[],
border=ft.border.all(1, "black"),
column_spacing=30,
)
for i in range(1, masechta_data["pages"] + 1):
daf_progress = progress.get(str(i), {})
if category in ["תלמוד בבלי", "תלמוד ירושלמי"]:
table.rows.append(
ft.DataRow(
cells=[
ft.DataCell(ft.Text(int_to_gematria(i))),
ft.DataCell(ft.Checkbox(value=daf_progress.get("a", False), on_change=on_change, data={"daf": i, "amud": "a"})),
ft.DataCell(ft.Checkbox(value=daf_progress.get("b", False), on_change=on_change, data={"daf": i, "amud": "b"}))
],
)
)
else:
# פרק/סימן + סטטוס (Checkbox)
table.rows.append(
ft.DataRow(
cells=[
ft.DataCell(ft.Text(int_to_gematria(i))),
ft.DataCell(ft.Checkbox(value=daf_progress.get("a", False), on_change=on_change, data={"daf": i, "amud": "a"})),
],
)
)
completion_indicators[masechta_name] = ft.Icon(ft.icons.CIRCLE_OUTLINED)
complication = update_completion_status(category, masechta_name)
check_all_checkbox = ft.Checkbox(label="בחר הכל", on_change=check_all, value=complication)
header = ft.Row(
[
ft.Text(masechta_name, size=20, weight=ft.FontWeight.BOLD),
completion_indicators[masechta_name],
check_all_checkbox,
],
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
vertical_alignment=ft.CrossAxisAlignment.CENTER,
)
return ft.Card(
content=ft.Container(
content=ft.Column(
[
header,
table,
],
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
),
padding=20,
),
)
def show_masechta(e):
nonlocal current_masechta, current_tab_index
current_masechta = e.control.data["masechta"]
category = e.control.data["category"]
page.views.clear()
# שמירת הכרטיסייה הפעילה לפני המעבר לתצוגת המסכת
current_tab_index = section_to_index(category)
# יצירת הטבלה למסכת הנבחרת
masechta_table = create_table(category, current_masechta)
if masechta_table is None:
return # עצור את הביצוע אם יש שגיאה ביצירת הטבלה
page.views.append(
ft.View(
"/masechta",
[
ft.AppBar(title=ft.Text(current_masechta), leading=ft.IconButton(icon=ft.icons.ARROW_BACK, on_click=show_main_menu)),
masechta_table,
],
vertical_alignment=ft.MainAxisAlignment.START,
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
scroll="always",
)
)
page.update()
def show_main_menu(e=None):
nonlocal current_masechta
current_masechta = None
sections = {
"תנ״ך": list(data.get("תנ״ך", {}).keys()),
"תלמוד בבלי": list(data.get("תלמוד בבלי", {}).keys()),
"תלמוד ירושלמי": list(data.get("תלמוד ירושלמי", {}).keys()),
"רמב״ם": list(data.get("רמב״ם", {}).keys()),
"שולחן ערוך": list(data.get("שולחן ערוך", {}).keys())
}
def create_masechta_button(masechta, category):
completed = check_masechta_completion(category, masechta) # נוספה קטגוריה
return ft.ElevatedButton(
text=masechta,
data={"masechta": masechta, "category": category},
on_click=show_masechta,
style=ft.ButtonStyle(shape=ft.RoundedRectangleBorder(radius=10), padding=15),
width=150,
height=50,
icon=ft.icons.CHECK_CIRCLE if completed else None,
icon_color=ft.colors.GREEN if completed else None,
)
def check_masechta_completion(category, masechta_name):
""" בדיקה האם מסכת/ספר הושלם. בתלמוד בבלי וירושלמי עמוד א' ועמוד ב', בשאר רק פרק/סימן """
progress = load_progress(masechta_name, category) # נוספה קטגוריה
masechta_data = data[category].get(masechta_name)
if not masechta_data:
return False
total_pages = 2 * masechta_data["pages"] if category in ["תלמוד בבלי", "תלמוד ירושלמי"] else masechta_data["pages"]
if category in ["תלמוד בבלי", "תלמוד ירושלמי"]:
completed_pages = sum(
1 for daf_data in progress.values() for amud_value in daf_data.values() if amud_value
)
else:
completed_pages = sum(1 for daf_data in progress.values() if daf_data.get("a", False))
return completed_pages == total_pages
# הפעם נקבע את הכרטיסייה הנבחרת לפי המשתנה הנוכחי
page.views.clear()
page.views.append(
ft.View(
"/",
[
ft.AppBar(
title=ft.Row(
[
ft.Icon(ft.icons.BOOK_OUTLINED),
ft.Text("שמור וזכור", size=20, weight=ft.FontWeight.BOLD),
],
alignment=ft.MainAxisAlignment.CENTER,
),
bgcolor=ft.colors.PRIMARY_CONTAINER,
color=ft.colors.ON_PRIMARY_CONTAINER,
),
ft.Column(
[
ft.Text("בחר מקור:", size=24, weight=ft.FontWeight.BOLD, text_align=ft.TextAlign.CENTER, style=ft.TextStyle(color=ft.colors.SECONDARY)),
ft.Tabs(
selected_index=current_tab_index, # הגדרת הכרטיסייה הנבחרת לפי המשתנה
tabs=[
ft.Tab(
text=section_name,
content=ft.Container(
content=ft.GridView(
controls=[
create_masechta_button(masechta, section_name)
for masechta in masechtot
] if masechtot else [],
runs_count=3,
max_extent=150,
run_spacing=10,
spacing=10,
padding=10,
visible=bool(masechtot),
),
expand=True,
),
)
for section_name, masechtot in sections.items()
],
expand=1,
),
],
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
expand=True,
),
],
)
)
page.update()
def section_to_index(section_name):
""" המרת שם קטגוריה לאינדקס מתאים עבור הכרטיסיות """
section_mapping = {
"תנ״ך": 0,
"תלמוד בבלי": 1,
"תלמוד ירושלמי": 2,
"רמב״ם": 3,
"שולחן ערוך": 4
}
return section_mapping.get(section_name, 1) # ברירת מחדל "תלמוד בבלי"
show_main_menu()
ft.app(target=main)