优化UI加载速度
This commit is contained in:
@@ -13,6 +13,11 @@ from typing import TYPE_CHECKING, Any, Callable
|
||||
if TYPE_CHECKING:
|
||||
from pqAutomationApp import PQAutomationApp
|
||||
|
||||
# 叠层切换:lift/lower,避免 pack_forget 触发 Matplotlib 等大面板重绘。
|
||||
_STACK_PANELS = frozenset(
|
||||
{"log", "ai_image", "pantone_baseline", "gamma_pattern", "calman", "single_step"}
|
||||
)
|
||||
|
||||
|
||||
def create_tool_panel_sidebar_item(
|
||||
self: "PQAutomationApp", parent: tk.Misc, label: str, command: Callable[[], None]
|
||||
@@ -175,69 +180,42 @@ def register_panel(self: "PQAutomationApp", panel_name, frame, button, visible_a
|
||||
}
|
||||
|
||||
|
||||
def show_panel(self: "PQAutomationApp", panel_name):
|
||||
"""显示指定面板,隐藏其他所有面板"""
|
||||
if panel_name not in self.panels:
|
||||
def setup_view_stack(self: "PQAutomationApp") -> None:
|
||||
"""将所有工具面板叠放在 view_stack 上,切换时仅调整 Z 序。"""
|
||||
if getattr(self, "_view_stack_ready", False):
|
||||
return
|
||||
|
||||
# 如果当前面板就是要显示的面板,则隐藏它
|
||||
if self.current_panel == panel_name:
|
||||
self.hide_all_panels()
|
||||
# 如果当前测试类型是 Local Dimming,则在关闭日志等面板后自动恢复 Local Dimming 面板
|
||||
try:
|
||||
if (
|
||||
getattr(self, "config", None)
|
||||
and getattr(self.config, "current_test_type", None) == "local_dimming"
|
||||
and panel_name != "local_dimming"
|
||||
):
|
||||
self.show_panel("local_dimming")
|
||||
except Exception:
|
||||
pass
|
||||
return
|
||||
|
||||
# 隐藏所有面板
|
||||
self.hide_all_panels()
|
||||
|
||||
# 显示指定面板
|
||||
panel_info = self.panels[panel_name]
|
||||
|
||||
# 隐藏主内容区域。
|
||||
# Local Dimming 作为并列测试类型时,需要保留顶部配置区,
|
||||
# 让用户在面板上方直接看到并修改配置项。
|
||||
if panel_name == "local_dimming":
|
||||
# 重新按“自适应高度”布局顶部配置区,避免其占用可扩展空间把
|
||||
# Local Dimming 主面板整体向下挤出大块空白。
|
||||
self.control_frame_top.pack_forget()
|
||||
self.control_frame_top.pack(
|
||||
side=tk.TOP, fill=tk.X, expand=False, padx=0, pady=5
|
||||
)
|
||||
self.control_frame_middle.pack_forget()
|
||||
self.control_frame_bottom.pack_forget()
|
||||
else:
|
||||
self.control_frame_top.pack_forget()
|
||||
self.control_frame_middle.pack_forget()
|
||||
self.control_frame_bottom.pack_forget()
|
||||
|
||||
# 显示目标面板
|
||||
panel_info["frame"].pack(side=tk.TOP, fill=tk.BOTH, expand=True, padx=5, pady=5)
|
||||
|
||||
# 更新侧栏选中样式
|
||||
_set_tool_panel_sidebar_selected(panel_info, True)
|
||||
|
||||
# 更新状态
|
||||
setattr(self, panel_info["visible_attr"], True)
|
||||
self.current_panel = panel_name
|
||||
|
||||
|
||||
def hide_all_panels(self: "PQAutomationApp"):
|
||||
"""隐藏所有面板,显示主内容区域"""
|
||||
# 隐藏所有注册的面板
|
||||
self.main_view.place(relx=0, rely=0, relwidth=1, relheight=1)
|
||||
for panel_name, panel_info in self.panels.items():
|
||||
panel_info["frame"].pack_forget()
|
||||
if panel_name == "local_dimming":
|
||||
continue
|
||||
panel_info["frame"].place(relx=0, rely=0, relwidth=1, relheight=1)
|
||||
panel_info["frame"].lower()
|
||||
|
||||
self._view_stack_ready = True
|
||||
|
||||
|
||||
def _lower_stack_panels(self: "PQAutomationApp") -> None:
|
||||
for panel_name, panel_info in self.panels.items():
|
||||
if panel_name in _STACK_PANELS:
|
||||
panel_info["frame"].lower()
|
||||
|
||||
|
||||
def _clear_panel_selection(self: "PQAutomationApp") -> None:
|
||||
for panel_info in self.panels.values():
|
||||
_set_tool_panel_sidebar_selected(panel_info, False)
|
||||
setattr(self, panel_info["visible_attr"], False)
|
||||
|
||||
# 显示主内容区域
|
||||
|
||||
def _restore_main_view_layout(self: "PQAutomationApp") -> None:
|
||||
"""恢复主界面三区布局,并收起嵌入的 Local Dimming 面板。"""
|
||||
if getattr(self, "_ld_embedded", False):
|
||||
self.local_dimming_frame.pack_forget()
|
||||
self._ld_embedded = False
|
||||
|
||||
self.control_frame_top.pack_forget()
|
||||
self.control_frame_middle.pack_forget()
|
||||
self.control_frame_bottom.pack_forget()
|
||||
self.control_frame_top.pack(
|
||||
side=tk.TOP, fill=tk.BOTH, expand=True, padx=0, pady=5
|
||||
)
|
||||
@@ -248,6 +226,14 @@ def hide_all_panels(self: "PQAutomationApp"):
|
||||
side=tk.TOP, fill=tk.BOTH, expand=True, padx=0, pady=5
|
||||
)
|
||||
|
||||
|
||||
def _show_main_content(self: "PQAutomationApp") -> None:
|
||||
"""显示主内容区并清除当前面板状态。"""
|
||||
setup_view_stack(self)
|
||||
_lower_stack_panels(self)
|
||||
_restore_main_view_layout(self)
|
||||
self.main_view.lift()
|
||||
_clear_panel_selection(self)
|
||||
self.current_panel = None
|
||||
|
||||
if hasattr(self, "_sync_save_button_state"):
|
||||
@@ -257,6 +243,109 @@ def hide_all_panels(self: "PQAutomationApp"):
|
||||
pass
|
||||
|
||||
|
||||
def _notify_panel_shown(self: "PQAutomationApp", panel_name: str) -> None:
|
||||
"""面板显示后的轻量刷新(延迟执行,不阻塞切换)。"""
|
||||
if panel_name == "calman":
|
||||
refresh = getattr(self, "_on_calman_panel_shown", None)
|
||||
if refresh is not None:
|
||||
self.root.after_idle(refresh)
|
||||
|
||||
|
||||
def _show_stack_panel(self: "PQAutomationApp", panel_name: str) -> None:
|
||||
"""叠层模式显示工具面板。"""
|
||||
setup_view_stack(self)
|
||||
panel_info = self.panels[panel_name]
|
||||
|
||||
_set_tool_panel_sidebar_selected(panel_info, True)
|
||||
|
||||
previous = self.current_panel
|
||||
if previous == "local_dimming":
|
||||
self.local_dimming_frame.pack_forget()
|
||||
self._ld_embedded = False
|
||||
elif previous is not None and previous in _STACK_PANELS:
|
||||
prev_info = self.panels[previous]
|
||||
_set_tool_panel_sidebar_selected(prev_info, False)
|
||||
setattr(self, prev_info["visible_attr"], False)
|
||||
prev_info["frame"].lower()
|
||||
|
||||
self.main_view.lower()
|
||||
panel_info["frame"].lift()
|
||||
setattr(self, panel_info["visible_attr"], True)
|
||||
self.current_panel = panel_name
|
||||
_notify_panel_shown(self, panel_name)
|
||||
|
||||
|
||||
def _show_local_dimming_panel(self: "PQAutomationApp") -> None:
|
||||
"""Local Dimming:保留顶部配置区,下方嵌入 LD 面板。"""
|
||||
setup_view_stack(self)
|
||||
panel_info = self.panels["local_dimming"]
|
||||
|
||||
if self.current_panel in _STACK_PANELS:
|
||||
prev_info = self.panels[self.current_panel]
|
||||
_set_tool_panel_sidebar_selected(prev_info, False)
|
||||
setattr(self, prev_info["visible_attr"], False)
|
||||
prev_info["frame"].lower()
|
||||
|
||||
_set_tool_panel_sidebar_selected(panel_info, True)
|
||||
_lower_stack_panels(self)
|
||||
self.main_view.lift()
|
||||
|
||||
self.control_frame_top.pack_forget()
|
||||
self.control_frame_top.pack(
|
||||
side=tk.TOP, fill=tk.X, expand=False, padx=0, pady=5
|
||||
)
|
||||
self.control_frame_middle.pack_forget()
|
||||
self.control_frame_bottom.pack_forget()
|
||||
self.local_dimming_frame.pack(
|
||||
side=tk.TOP, fill=tk.BOTH, expand=True, padx=5, pady=5
|
||||
)
|
||||
self._ld_embedded = True
|
||||
|
||||
setattr(self, panel_info["visible_attr"], True)
|
||||
self.current_panel = "local_dimming"
|
||||
|
||||
|
||||
def _maybe_restore_local_dimming_panel(
|
||||
self: "PQAutomationApp", closed_panel: str
|
||||
) -> None:
|
||||
"""关闭工具面板后,Local Dimming 测试类型下自动恢复 LD 面板。"""
|
||||
if closed_panel == "local_dimming":
|
||||
return
|
||||
try:
|
||||
if (
|
||||
getattr(self, "config", None)
|
||||
and getattr(self.config, "current_test_type", None) == "local_dimming"
|
||||
):
|
||||
self.show_panel("local_dimming")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
def show_panel(self: "PQAutomationApp", panel_name):
|
||||
"""显示指定面板,隐藏其他所有面板"""
|
||||
if panel_name not in self.panels:
|
||||
return
|
||||
|
||||
if self.current_panel == panel_name:
|
||||
_show_main_content(self)
|
||||
_maybe_restore_local_dimming_panel(self, panel_name)
|
||||
return
|
||||
|
||||
if panel_name == "local_dimming":
|
||||
_show_local_dimming_panel(self)
|
||||
return
|
||||
|
||||
if panel_name in _STACK_PANELS:
|
||||
_show_stack_panel(self, panel_name)
|
||||
return
|
||||
|
||||
# 未知面板类型:回退到叠层显示
|
||||
_show_stack_panel(self, panel_name)
|
||||
|
||||
|
||||
def hide_all_panels(self: "PQAutomationApp"):
|
||||
"""隐藏所有面板,显示主内容区域"""
|
||||
_show_main_content(self)
|
||||
|
||||
|
||||
class PanelManagerMixin:
|
||||
@@ -265,6 +354,7 @@ class PanelManagerMixin:
|
||||
"""
|
||||
create_tool_panel_sidebar_item = create_tool_panel_sidebar_item
|
||||
register_panel = register_panel
|
||||
setup_view_stack = setup_view_stack
|
||||
show_panel = show_panel
|
||||
hide_all_panels = hide_all_panels
|
||||
refresh_tool_panel_sidebar_theme = refresh_tool_panel_sidebar_theme
|
||||
|
||||
Reference in New Issue
Block a user