Coverage for graphica/gui/ui_mode.py: 91.5%
41 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-12 16:38 +0000
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-12 16:38 +0000
1"""シンプル(Lite)とアドバンスド(Advanced)の表示の出し分け。
3部品は1組だけで、モードで見せる・隠すだけ。値には触らない(隠した設定もそのまま描かれ、保存される)。
4どの部品をどちらのモードで出すかは MODE_ONLY_ELEMENTS の表で決める。見本は docs/dev/mockups/gui_redesign/。
5"""
6from graphica.core.i18n import tr
7from graphica.gui import app_settings
9LITE = "lite"
10ADVANCED = "advanced"
11MODES = (LITE, ADVANCED)
13# 表示名(日本語は「シンプル / アドバンスド」。「ライト」はテーマのライトと紛らわしいので使わない)
14MODE_LABELS = {LITE: "シンプル", ADVANCED: "アドバンスド"}
16# (タブの属性の名前(ドットで辿る), 出すモード)。ここに無い部品は両方のモードで出す
17MODE_ONLY_ELEMENTS = (
18 # ステータスバー: 座標と、データセット・選択の数
19 ("coordinate_label", ADVANCED),
20 ("status_selection_label", ADVANCED),
21 ("dataset_stats_advanced_row", ADVANCED),
22 # グラフの道具: シンプルは左に縦のアイコン、アドバンスドはプロットの上に文字付き(同じ QAction)
23 ("plot_tool_rail", LITE),
24 ("plot_toolbar", ADVANCED),
25 ("card_subplot_label", ADVANCED),
26 ("card_minimap_button", ADVANCED),
27 # プロパティ: シンプルは種類のタイルと「アドバンスドですべて表示」の案内、色の 16 進はアドバンスドだけ
28 ("_plot_type_tiles_row", LITE),
29 ("lite_more_box", LITE),
30 ("color_picker_widget.hex_edit", ADVANCED),
31 # グラフの下のパネル(データ表・フィット結果・残差・来歴・ログ)
32 ("bottom_panel", ADVANCED),
33)
35# シンプルで隠すプロパティの行(欄の属性の名前。名前の欄も一緒に隠す)。種類などによる今の出し入れより強い
36LITE_HIDDEN_PROPERTY_FIELDS = (
37 "x_err_col_combo", "y_err_col_combo", "nan_policy_combo",
38 "ui.plot_type_combo", "alpha_slider", "ui.smoothing_checkbox", "smoothing_method_combo",
39)
40# シンプルで出すプロパティの節(ほかの節は見出しごと隠す)
41LITE_PROPERTY_SECTIONS = ("data", "style")
44# インスペクタのタブ(キー, 出すモード)
45MODE_ONLY_INSPECTOR_PAGES = (
46 ("legend", ADVANCED),
47)
50def mode_label(mode):
51 return tr(MODE_LABELS[mode])
54def initial_mode(settings):
55 """保存したモード。無ければ、今までの利用者(スタートアップ画面を見たことがある)はアドバンスド、初めての人はシンプル。
57 更新した人の手元で項目が消えて見えないよう、決めた値はすぐ保存する。
58 """
59 saved = app_settings.UI_MODE.read(settings)
60 if saved in MODES:
61 return saved
62 mode = ADVANCED if app_settings.HAS_SHOWN_WELCOME.read(settings) else LITE
63 app_settings.UI_MODE.write(settings, mode)
64 return mode
67def resolve(app, dotted_name):
68 target = app
69 for part in dotted_name.split("."):
70 target = getattr(target, part, None)
71 if target is None: 71 ↛ 72line 71 didn't jump to line 72 because the condition on line 71 was never true
72 return None
73 return target
76def apply_ui_mode(app, mode):
77 """タブの部品をモードに合わせて見せる・隠す。値は変えない。"""
78 if mode not in MODES:
79 raise ValueError(f"知らないモード: {mode!r}")
80 for dotted_name, only_in in MODE_ONLY_ELEMENTS:
81 widget = resolve(app, dotted_name)
82 if widget is not None: 82 ↛ 80line 82 didn't jump to line 80 because the condition on line 82 was always true
83 widget.setVisible(mode == only_in)
84 inspector = getattr(app, 'inspector', None)
85 if inspector is not None: 85 ↛ 88line 85 didn't jump to line 88 because the condition on line 85 was always true
86 for key, only_in in MODE_ONLY_INSPECTOR_PAGES:
87 inspector.set_page_visible(key, mode == only_in)
88 app.ui_mode = mode
89 # プロパティの行は種類などの条件でも出し入れするので、条件を当て直してからモードで隠す
90 property_panel = getattr(app, 'property_panel', None)
91 if property_panel is not None: 91 ↛ exitline 91 didn't return from function 'apply_ui_mode' because the condition on line 91 was always true
92 property_panel.update_mode_visibility()