Coverage for graphica/gui/color_history.py: 100.0%

23 statements  

« prev     ^ index     » next       coverage.py v7.16.2, created at 2026-10-12 16:38 +0000

1# gui/color_history.py 

2""" 

3QColorDialog で選択した色を「最近使った色」としてQSettingsに永続化し、 

4QColorDialogのカスタムカラー欄(プロセス内で共有される静的な状態)に 

5反映するためのヘルパー。 

6 

7QColorDialog.setCustomColor() はダイアログのインスタンスではなく 

8Qt側の静的な状態を書き換えるため、一度読み込めばアプリ内のどの 

9QColorDialog.getColor() 呼び出しにも反映される。 

10""" 

11from PySide6.QtGui import QColor 

12from PySide6.QtWidgets import QColorDialog 

13 

14from graphica.gui import app_settings 

15 

16MAX_RECENT_COLORS = 16 

17 

18 

19def load_recent_colors_into_picker(settings): 

20 """起動時に一度呼び、QSettingsに保存された「最近使った色」をカスタムカラー欄に復元する。""" 

21 colors = app_settings.as_list(app_settings.RECENT_COLORS.read(settings)) 

22 if not colors: 

23 return 

24 for i, color_name in enumerate(colors[:MAX_RECENT_COLORS]): 

25 QColorDialog.setCustomColor(i, QColor(color_name)) 

26 

27 

28def ask_color(parent=None, initial=None, title=""): 

29 """色を選ばせる。無効な QColor ならキャンセル。 

30 

31 どの OS でも Qt のダイアログを使う。macOS の OS の色パネルにはカスタムカラー欄が無く、「最近使った色」が出ない。 

32 """ 

33 return QColorDialog.getColor(initial if initial is not None else QColor("white"), parent, title, 

34 QColorDialog.ColorDialogOption.DontUseNativeDialog) 

35 

36 

37def get_color_with_history(settings, parent=None, initial=None): 

38 """ 

39 QColorDialog.getColor() のラッパー。選択(Cancel以外)された色を 

40 「最近使った色」の先頭に記録し、QSettingsへ永続化する。 

41 """ 

42 color = ask_color(parent, initial) 

43 

44 if color.isValid(): 

45 color_name = color.name() 

46 colors = [c for c in app_settings.as_list(app_settings.RECENT_COLORS.read(settings)) if c != color_name] 

47 colors.insert(0, color_name) 

48 colors = colors[:MAX_RECENT_COLORS] 

49 app_settings.RECENT_COLORS.write(settings, colors) 

50 for i, c in enumerate(colors): 

51 QColorDialog.setCustomColor(i, QColor(c)) 

52 

53 return color