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

1"""シンプル(Lite)とアドバンスド(Advanced)の表示の出し分け。 

2 

3部品は1組だけで、モードで見せる・隠すだけ。値には触らない(隠した設定もそのまま描かれ、保存される)。 

4どの部品をどちらのモードで出すかは MODE_ONLY_ELEMENTS の表で決める。見本は docs/dev/mockups/gui_redesign/。 

5""" 

6from graphica.core.i18n import tr 

7from graphica.gui import app_settings 

8 

9LITE = "lite" 

10ADVANCED = "advanced" 

11MODES = (LITE, ADVANCED) 

12 

13# 表示名(日本語は「シンプル / アドバンスド」。「ライト」はテーマのライトと紛らわしいので使わない) 

14MODE_LABELS = {LITE: "シンプル", ADVANCED: "アドバンスド"} 

15 

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) 

34 

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") 

42 

43 

44# インスペクタのタブ(キー, 出すモード) 

45MODE_ONLY_INSPECTOR_PAGES = ( 

46 ("legend", ADVANCED), 

47) 

48 

49 

50def mode_label(mode): 

51 return tr(MODE_LABELS[mode]) 

52 

53 

54def initial_mode(settings): 

55 """保存したモード。無ければ、今までの利用者(スタートアップ画面を見たことがある)はアドバンスド、初めての人はシンプル。 

56 

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 

65 

66 

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 

74 

75 

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()