Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
b3e9659
perf: remove duplicate startup settings initialization
MF-Dust Mar 14, 2026
d4c435e
perf: defer startup analytics and update imports
MF-Dust Mar 14, 2026
bb8ed88
perf: defer main window heavy imports
MF-Dust Mar 14, 2026
f196e43
perf: defer main page widget imports
MF-Dust Mar 14, 2026
32bdbec
perf: lazy-load update thread cleanup path
MF-Dust Mar 14, 2026
6a314bf
fix: clean up settings page threads before unload
MF-Dust Mar 14, 2026
90fda8b
fix: resolve invalid nuitka hidden imports
MF-Dust Mar 14, 2026
66ff5e7
perf: add quick mode and parallel jobs for nuitka
MF-Dust Mar 14, 2026
39afbd4
perf: defer face detector resource loading
MF-Dust Mar 14, 2026
e612b7b
perf: defer security verification imports
MF-Dust Mar 14, 2026
78f5218
perf: defer safety settings resource loading
MF-Dust Mar 14, 2026
915ac83
refactor: centralize lazy verification proxy
MF-Dust Mar 14, 2026
005e2a4
refactor: deduplicate themed main page wrappers
MF-Dust Mar 14, 2026
7642544
refactor: streamline main window page routing
MF-Dust Mar 14, 2026
2b5bc26
perf: remove redundant main page rebuild deferrals
MF-Dust Mar 14, 2026
d67870c
refactor: centralize page routing metadata
MF-Dust Mar 14, 2026
ddd98c5
refactor: drive settings window from shared page registry
MF-Dust Mar 14, 2026
1c4429a
refactor: unify settings deferred page materialization
MF-Dust Mar 14, 2026
1161e9a
refactor: deduplicate URL page routing handlers
MF-Dust Mar 14, 2026
9c4fd32
refactor: reuse verification policy for URL commands
MF-Dust Mar 14, 2026
f1dac11
fix: support settings path URL aliases
MF-Dust Mar 14, 2026
1fd0ff2
perf: reduce deferred settings geometry sync
MF-Dust Mar 14, 2026
dad9612
refactor: centralize settings page materialization access
MF-Dust Mar 14, 2026
96e1663
perf: remove polling from settings search navigation
MF-Dust Mar 14, 2026
f658092
perf: streamline page template initialization flow
MF-Dust Mar 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
353 changes: 80 additions & 273 deletions app/common/IPC_URL/url_command_handler.py

Large diffs are not rendered by default.

8 changes: 5 additions & 3 deletions app/common/lottery/lottery_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
from app.common.music.music_player import music_player
from app.common.voice.voice import TTSHandler
from app.common.extraction.extract import _is_non_class_time
from app.common.safety.verify_ops import require_and_run
from app.page_building.another_window import create_remaining_list_window
from app.tools.path_utils import get_data_path
from app.tools.personalised import load_custom_font
Expand All @@ -48,6 +47,7 @@
)
from app.tools.variable import APP_INIT_DELAY
from app.tools.config import track_event
from app.common.safety.verify_proxy import require_and_run_lazy

system_random = SystemRandom()

Expand Down Expand Up @@ -1225,7 +1225,9 @@ def start_draw(widget):
if _is_non_class_time():
if readme_settings_async("linkage_settings", "verification_required"):
logger.info("当前时间在非上课时间段内,需要密码验证")
require_and_run("lottery_start", widget, lambda: start_lottery_draw(widget))
require_and_run_lazy(
"lottery_start", widget, lambda: start_lottery_draw(widget)
)
else:
logger.info("当前时间在非上课时间段内,禁止抽取")
return
Expand All @@ -1241,7 +1243,7 @@ def reset_count(widget):
if _is_non_class_time():
if readme_settings_async("linkage_settings", "verification_required"):
logger.info("当前时间在非上课时间段内,需要密码验证")
require_and_run("lottery_reset", widget, widget._do_reset_count)
require_and_run_lazy("lottery_reset", widget, widget._do_reset_count)
else:
logger.info("当前时间在非上课时间段内,禁止重置")
return
Expand Down
210 changes: 210 additions & 0 deletions app/common/page_registry.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
from __future__ import annotations

from dataclasses import dataclass


@dataclass(frozen=True, slots=True)
class SettingsPageRegistration:
route_name: str
interface_attr: str
item_attr: str
page_method: str
is_pivot: bool
icon_name: str
language_module: str
sidebar_setting_key: str
title_key: str = "title"
url_alias: str | None = None


SETTINGS_PAGE_REGISTRY: tuple[SettingsPageRegistration, ...] = (
SettingsPageRegistration(
route_name="settings_basic",
interface_attr="basicSettingsInterface",
item_attr="basic_settings_item",
page_method="basic_settings_page",
is_pivot=False,
icon_name="ic_fluent_wrench_settings_20_filled",
language_module="basic_settings",
sidebar_setting_key="base_settings",
url_alias="basic",
),
SettingsPageRegistration(
route_name="settings_list",
interface_attr="listManagementInterface",
item_attr="list_management_item",
page_method="list_management_page",
is_pivot=True,
icon_name="ic_fluent_list_20_filled",
language_module="list_management",
sidebar_setting_key="name_management",
url_alias="list",
),
SettingsPageRegistration(
route_name="settings_extraction",
interface_attr="extractionSettingsInterface",
item_attr="extraction_settings_item",
page_method="extraction_settings_page",
is_pivot=True,
icon_name="ic_fluent_archive_20_filled",
language_module="extraction_settings",
sidebar_setting_key="draw_settings",
url_alias="extraction",
),
SettingsPageRegistration(
route_name="settings_floating",
interface_attr="floatingWindowManagementInterface",
item_attr="floating_window_management_item",
page_method="floating_window_management_page",
is_pivot=True,
icon_name="ic_fluent_window_apps_20_filled",
language_module="floating_window_management",
sidebar_setting_key="floating_window_management",
url_alias="floating",
),
SettingsPageRegistration(
route_name="settings_notification",
interface_attr="notificationSettingsInterface",
item_attr="notification_settings_item",
page_method="notification_settings_page",
is_pivot=True,
icon_name="ic_fluent_comment_note_20_filled",
language_module="notification_settings",
sidebar_setting_key="notification_service",
url_alias="notification",
),
SettingsPageRegistration(
route_name="settings_safety",
interface_attr="safetySettingsInterface",
item_attr="safety_settings_item",
page_method="safety_settings_page",
is_pivot=True,
icon_name="ic_fluent_shield_20_filled",
language_module="safety_settings",
sidebar_setting_key="security_settings",
url_alias="safety",
),
SettingsPageRegistration(
route_name="settings_linkage",
interface_attr="courseSettingsInterface",
item_attr="course_settings_item",
page_method="linkage_settings_page",
is_pivot=False,
icon_name="ic_fluent_calendar_ltr_20_filled",
language_module="linkage_settings",
sidebar_setting_key="linkage_settings",
),
SettingsPageRegistration(
route_name="settings_voice",
interface_attr="voiceSettingsInterface",
item_attr="voice_settings_item",
page_method="voice_settings_page",
is_pivot=True,
icon_name="ic_fluent_person_voice_20_filled",
language_module="voice_settings",
sidebar_setting_key="voice_settings",
url_alias="voice",
),
SettingsPageRegistration(
route_name="settings_theme",
interface_attr="themeManagementInterface",
item_attr="theme_management_item",
page_method="theme_management_page",
is_pivot=False,
icon_name="ic_fluent_paint_brush_20_filled",
language_module="theme_management",
sidebar_setting_key="theme_management",
),
SettingsPageRegistration(
route_name="settings_history",
interface_attr="historyInterface",
item_attr="history_item",
page_method="history_page",
is_pivot=True,
icon_name="ic_fluent_history_20_filled",
language_module="history",
sidebar_setting_key="settings_history",
url_alias="history",
),
SettingsPageRegistration(
route_name="settings_more",
interface_attr="moreSettingsInterface",
item_attr="more_settings_item",
page_method="more_settings_page",
is_pivot=True,
icon_name="ic_fluent_more_horizontal_20_filled",
language_module="more_settings",
sidebar_setting_key="more_settings",
url_alias="more",
),
SettingsPageRegistration(
route_name="settings_update",
interface_attr="updateInterface",
item_attr="update_item",
page_method="update_page",
is_pivot=False,
icon_name="ic_fluent_arrow_sync_20_filled",
language_module="update",
sidebar_setting_key="updateInterface",
url_alias="update",
),
SettingsPageRegistration(
route_name="settings_about",
interface_attr="aboutInterface",
item_attr="about_item",
page_method="about_page",
is_pivot=False,
icon_name="ic_fluent_info_20_filled",
language_module="about",
sidebar_setting_key="aboutInterface",
url_alias="about",
),
)


MAIN_PAGE_ALIAS_MAP: dict[str, str] = {
"roll": "roll_call_page",
"lottery": "lottery_page",
"history": "history_page",
}


SETTINGS_PAGE_BY_ROUTE: dict[str, SettingsPageRegistration] = {
page.route_name: page for page in SETTINGS_PAGE_REGISTRY
}
SETTINGS_PAGE_BY_INTERFACE: dict[str, SettingsPageRegistration] = {
page.interface_attr: page for page in SETTINGS_PAGE_REGISTRY
}
SETTINGS_PAGE_BY_ALIAS: dict[str, SettingsPageRegistration] = {
page.url_alias: page for page in SETTINGS_PAGE_REGISTRY if page.url_alias
}


def iter_settings_pages() -> tuple[SettingsPageRegistration, ...]:
return SETTINGS_PAGE_REGISTRY


def iter_navigable_settings_pages() -> tuple[SettingsPageRegistration, ...]:
return SETTINGS_PAGE_REGISTRY


def iter_settings_page_container_names() -> tuple[str, ...]:
return tuple(page.interface_attr for page in SETTINGS_PAGE_REGISTRY)


def get_settings_page_by_route(route_name: str) -> SettingsPageRegistration | None:
return SETTINGS_PAGE_BY_ROUTE.get(route_name)


def get_settings_page_by_interface(
interface_attr: str,
) -> SettingsPageRegistration | None:
return SETTINGS_PAGE_BY_INTERFACE.get(interface_attr)


def get_settings_page_by_alias(alias: str) -> SettingsPageRegistration | None:
return SETTINGS_PAGE_BY_ALIAS.get(alias)


def resolve_main_page_alias(alias: str) -> str | None:
return MAIN_PAGE_ALIAS_MAP.get(alias)
6 changes: 3 additions & 3 deletions app/common/roll_call/roll_call_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
from app.common.behind_scenes.behind_scenes_utils import BehindScenesUtils
from app.common.voice.voice import TTSHandler
from app.common.extraction.extract import _is_non_class_time
from app.common.safety.verify_ops import require_and_run
from app.page_building.another_window import create_remaining_list_window
from app.tools.config import remove_record
from app.tools.interaction_perf import start_interaction
Expand All @@ -42,6 +41,7 @@
from app.tools.path_utils import get_data_path
from app.tools.variable import APP_INIT_DELAY
from app.tools.config import track_event
from app.common.safety.verify_proxy import require_and_run_lazy

system_random = SystemRandom()

Expand Down Expand Up @@ -906,7 +906,7 @@ def start_draw(widget):
if _is_non_class_time():
if readme_settings_async("linkage_settings", "verification_required"):
logger.info("当前时间在非上课时间段内,需要密码验证")
require_and_run(
require_and_run_lazy(
"roll_call_start", widget, lambda: start_roll_call_draw(widget)
)
else:
Expand All @@ -924,7 +924,7 @@ def reset_count(widget):
if _is_non_class_time():
if readme_settings_async("linkage_settings", "verification_required"):
logger.info("当前时间在非上课时间段内,需要密码验证")
require_and_run("roll_call_reset", widget, widget._do_reset_count)
require_and_run_lazy("roll_call_reset", widget, widget._do_reset_count)
else:
logger.info("当前时间在非上课时间段内,禁止重置")
return
Expand Down
Loading
Loading