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
« 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反映するためのヘルパー。
7QColorDialog.setCustomColor() はダイアログのインスタンスではなく
8Qt側の静的な状態を書き換えるため、一度読み込めばアプリ内のどの
9QColorDialog.getColor() 呼び出しにも反映される。
10"""
11from PySide6.QtGui import QColor
12from PySide6.QtWidgets import QColorDialog
14from graphica.gui import app_settings
16MAX_RECENT_COLORS = 16
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))
28def ask_color(parent=None, initial=None, title=""):
29 """色を選ばせる。無効な QColor ならキャンセル。
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)
37def get_color_with_history(settings, parent=None, initial=None):
38 """
39 QColorDialog.getColor() のラッパー。選択(Cancel以外)された色を
40 「最近使った色」の先頭に記録し、QSettingsへ永続化する。
41 """
42 color = ask_color(parent, initial)
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))
53 return color