Skip to content

Commit ef710ae

Browse files
committed
feat: add persistence for theme and layout settings
1 parent 8c6f6be commit ef710ae

File tree

6 files changed

+64
-26
lines changed

6 files changed

+64
-26
lines changed

app/ui/navigation/sidebar.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,20 @@ def load(self):
7878
self._ = self.app.language_manager.language.get("sidebar")
7979
self.rail = NavigationColumn(sidebar=self.sidebar, page=self.page, app=self.app)
8080

81-
self.dark_light_text = ft.Text(self._["light_theme"])
82-
self.dark_light_icon = ft.IconButton(
83-
icon=ft.Icons.BRIGHTNESS_2_OUTLINED,
84-
tooltip=self._["toggle_night_theme"],
85-
on_click=self.theme_changed,
86-
)
81+
if self.page.theme_mode == ft.ThemeMode.DARK:
82+
self.dark_light_text = ft.Text(self._["dark_theme"])
83+
self.dark_light_icon = ft.IconButton(
84+
icon=ft.Icons.BRIGHTNESS_HIGH_OUTLINED,
85+
tooltip=self._["toggle_day_theme"],
86+
on_click=self.theme_changed,
87+
)
88+
else:
89+
self.dark_light_text = ft.Text(self._["light_theme"])
90+
self.dark_light_icon = ft.IconButton(
91+
icon=ft.Icons.BRIGHTNESS_2_OUTLINED,
92+
tooltip=self._["toggle_night_theme"],
93+
on_click=self.theme_changed,
94+
)
8795

8896
colors_list = [
8997
("deeppurple", "Deep purple"),
@@ -144,11 +152,14 @@ async def theme_changed(self, _):
144152
self.dark_light_text.value = self._["dark_theme"]
145153
self.dark_light_icon.icon = ft.Icons.BRIGHTNESS_HIGH_OUTLINED
146154
self.dark_light_icon.tooltip = self._["toggle_day_theme"]
155+
self.app.settings.user_config["theme_mode"] = "dark"
147156
else:
148157
page.theme_mode = ft.ThemeMode.LIGHT
149158
self.dark_light_text.value = self._["light_theme"]
150159
self.dark_light_icon.icon = ft.Icons.BRIGHTNESS_2_OUTLINED
151160
self.dark_light_icon.tooltip = self._["toggle_night_theme"]
161+
self.app.settings.user_config["theme_mode"] = "light"
162+
self.page.run_task(self.app.config_manager.save_user_config, self.app.settings.user_config)
152163
await self.on_theme_change()
153164
page.update()
154165

app/ui/themes/theme.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ def seed_color_changed(self, e):
2222

2323
def save_theme_color(self, e):
2424
page = e.page
25-
page.client_storage.set("theme_color", self.data)
25+
app = page.data
26+
app.settings.user_config["theme_color"] = self.data
27+
page.run_task(app.config_manager.save_user_config, app.settings.user_config)
2628

2729

2830
def create_light_theme(custom_font: str) -> ft.Theme:

app/ui/themes/theme_manager.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
class ThemeManager:
99
def __init__(self, app):
1010
self.page = app.page
11+
self.app = app
1112
self.custom_font = None
1213
self.theme_color = None
1314
self.assets_dir = app.assets_dir
@@ -30,21 +31,15 @@ async def apply_initial_theme(self):
3031
"""Apply initial theme based on saved settings or default to light theme."""
3132
self.page.theme = create_light_theme(self.custom_font)
3233
self.page.dark_theme = create_dark_theme(self.custom_font)
33-
try:
34-
self.theme_color = await self.page.client_storage.get_async("theme_color")
35-
if self.theme_color is not None:
36-
await self.update_theme_color(self.theme_color)
37-
return
38-
except Exception:
39-
pass
40-
await self.update_theme_color("blue")
34+
35+
self.theme_color = self.app.settings.user_config.get("theme_color", "blue")
36+
await self.update_theme_color(self.theme_color)
4137

4238
async def update_theme_color(self, color):
4339
"""Update the current theme color scheme and save it."""
4440
self.page.theme.color_scheme_seed = color
4541
self.page.theme.color_scheme = ft.ColorScheme(primary=color)
4642
self.page.update()
47-
try:
48-
await self.page.client_storage.set_async("theme_color", color)
49-
except Exception:
50-
pass
43+
44+
self.app.settings.user_config["theme_color"] = color
45+
self.page.run_task(self.app.config_manager.save_user_config, self.app.settings.user_config)

app/ui/views/home_view.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def __init__(self, app):
1717
self.page_name = "home"
1818
self.recording_card_area = None
1919
self.add_recording_dialog = None
20-
self.is_grid_view = False
20+
self.is_grid_view = app.settings.user_config.get("is_grid_view", False)
2121
self.loading_indicator = None
2222
self.app.language_manager.add_observer(self)
2323
self.load_language()
@@ -36,8 +36,24 @@ def init(self):
3636
visible=False
3737
)
3838

39+
if self.is_grid_view:
40+
initial_content = ft.GridView(
41+
expand=True,
42+
runs_count=3,
43+
spacing=10,
44+
run_spacing=10,
45+
child_aspect_ratio=2.3,
46+
controls=[]
47+
)
48+
else:
49+
initial_content = ft.Column(
50+
controls=[],
51+
spacing=10,
52+
expand=True
53+
)
54+
3955
self.recording_card_area = ft.Container(
40-
content=ft.Column(controls=[], spacing=10, expand=True),
56+
content=initial_content,
4157
expand=True
4258
)
4359
self.add_recording_dialog = RecordingDialog(self.app, self.add_recording)
@@ -51,6 +67,9 @@ async def load(self):
5167
self.recording_card_area.content.controls.clear()
5268
await self.add_record_cards()
5369

70+
if self.is_grid_view:
71+
await self.recalculate_grid_columns()
72+
5473
self.page.on_keyboard_event = self.on_keyboard
5574
self.page.on_resized = self.update_grid_layout
5675

@@ -86,6 +105,9 @@ async def toggle_view_mode(self, _):
86105
self.content_area.clean()
87106
self.content_area.controls.extend([self.create_home_title_area(), self.create_home_content_area()])
88107
self.content_area.update()
108+
109+
self.app.settings.user_config["is_grid_view"] = self.is_grid_view
110+
self.page.run_task(self.app.config_manager.save_user_config, self.app.settings.user_config)
89111

90112
def create_home_title_area(self):
91113
return ft.Row(
@@ -196,8 +218,7 @@ async def create_card_with_time_range(_recording: Recording):
196218

197219
if existing_cards:
198220
self.recording_card_area.content.controls.extend(existing_cards)
199-
200-
221+
201222
self.loading_indicator.visible = False
202223
self.loading_indicator.update()
203224
self.recording_card_area.update()
@@ -315,7 +336,6 @@ async def refresh_cards_on_click(self, _e):
315336
self.recording_card_area.controls.remove(card["card"])
316337
await self.show_all_cards()
317338

318-
319339
self.loading_indicator.visible = False
320340
self.loading_indicator.update()
321341

config/default_settings.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,8 @@
5252
"email_password": "",
5353
"sender_email": "",
5454
"sender_name": "",
55-
"recipient_email": ""
55+
"recipient_email": "",
56+
"theme_color": "blue",
57+
"is_grid_view": false,
58+
"theme_mode": "light"
5659
}

main.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,21 @@ def disconnect(_: ft.ControlEvent) -> None:
8181
def main(page: ft.Page) -> None:
8282

8383
page.title = "StreamCap"
84-
page.theme_mode = ft.ThemeMode.LIGHT
8584
page.window.min_width = MIN_WIDTH
8685
page.window.min_height = MIN_WIDTH * WINDOW_SCALE
8786

8887
is_web = args.web or platform == "web"
8988
setup_window(page, is_web)
9089

9190
app = App(page)
91+
page.data = app
92+
93+
theme_mode = app.settings.user_config.get("theme_mode", "light")
94+
if theme_mode == "dark":
95+
page.theme_mode = ft.ThemeMode.DARK
96+
else:
97+
page.theme_mode = ft.ThemeMode.LIGHT
98+
9299
save_progress_overlay = SaveProgressOverlay(app)
93100
page.overlay.append(save_progress_overlay.overlay)
94101

0 commit comments

Comments
 (0)