Mercurial > system76-keyboard-colors
annotate keyboard_colors/color_profile.py @ 3:eb2aa09653bd default tip
beginnings of CPU colors, daemon
author | Brad Greco <brad@bgreco.net> |
---|---|
date | Mon, 29 Mar 2021 20:27:09 -0400 |
parents | 091a1f59a79c |
children |
rev | line source |
---|---|
3
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
1 import colorsys |
0 | 2 import gi |
3 import importlib | |
4 import json | |
5 import os | |
6 import pathlib | |
3
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
7 import re |
0 | 8 import sys |
1 | 9 import types |
0 | 10 import uuid |
2 | 11 from types import SimpleNamespace |
0 | 12 gi.require_version("Gtk", "3.0") |
1 | 13 from gi.repository import Gtk # noqa: E402 |
14 from gi.repository import GLib # noqa: E402 | |
15 | |
0 | 16 |
17 class ColorProfileBase: | |
18 | |
1 | 19 type_name = '(no name)' |
0 | 20 |
1 | 21 def __init__(self): |
22 self.name = '' | |
2 | 23 self.id = str(uuid.uuid4()) |
3
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
24 self.transition_time = 1000 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
25 self.frequency_time = 1000 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
26 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
27 def color_scale_value(self, value): |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
28 if value in self.color_scale: |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
29 return self.color_scale[value] |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
30 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
31 thresholds = self.color_scale.keys() |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
32 thresholds_below = (i for i in thresholds if i < value) |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
33 thresholds_above = (i for i in thresholds if i > value) |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
34 threshold_below = max(thresholds_below, default=min(thresholds)) |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
35 threshold_above = min(thresholds_above, default=max(thresholds)) |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
36 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
37 percent = value / (threshold_above - threshold_below) |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
38 return Color.get_step_color( |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
39 self.color_scale[threshold_below], |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
40 self.color_scale[threshold_above], |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
41 percent |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
42 ) |
0 | 43 |
1 | 44 def build_settings_ui(self): |
45 glade_file = sys.modules[self.__module__].__file__.replace('.py', '.glade') | |
46 builder = Gtk.Builder() | |
47 builder.add_from_file(glade_file) | |
48 return builder.get_object('edit_profile_container') | |
49 | |
2 | 50 def serialize(self): |
51 properties = self.__dict__ | |
52 properties['module'] = self.__class__.__module__ | |
53 return properties | |
54 | |
55 @staticmethod | |
56 def unserialize(data): | |
57 profile_module = importlib.import_module(data['module']) | |
58 profile_class = getattr(profile_module, 'ColorProfile') | |
59 profile = profile_class() | |
60 profile.__dict__.update(data) | |
61 return profile | |
62 | |
0 | 63 |
64 class ProfileManager: | |
65 | |
1 | 66 def __init__(self): |
2 | 67 profile_list = self.load_profiles() |
68 self.profiles = {p.id: p for p in profile_list} | |
0 | 69 |
1 | 70 def get_types(self): |
71 types = [] | |
72 profile_directory = os.path.dirname(os.path.realpath(__file__)) | |
73 (_, dirnames, _) = next(os.walk(profile_directory)) | |
74 for dirname in dirnames: | |
75 module_file = os.path.join(profile_directory, dirname, dirname + '.py') | |
76 if os.path.isfile(module_file): | |
77 module_name = 'keyboard_colors.' + dirname + '.' + dirname | |
78 profile_module = importlib.import_module(module_name) | |
79 profile_class = getattr(profile_module, 'ColorProfile') | |
80 types.append(profile_class) | |
81 return types | |
0 | 82 |
1 | 83 def config_path(self): |
84 dir = GLib.get_user_config_dir() | |
85 if not os.path.isdir(dir): | |
86 os.mkdir(dir) | |
87 return os.path.join(dir, 'keyboard-color-profiles.conf') | |
0 | 88 |
1 | 89 def load_profiles(self): |
90 if os.path.isfile(self.config_path()): | |
91 data = pathlib.Path(self.config_path()).read_text('utf-8') | |
92 try: | |
2 | 93 return json.loads(data, object_hook=lambda d: ColorProfileBase.unserialize(d)) |
1 | 94 except json.decoder.JSONDecodeError: |
95 return [] | |
96 else: | |
97 return [] | |
0 | 98 |
1 | 99 def save_profiles(self): |
2 | 100 data = json.dumps(self.profiles, default=lambda o: o.serialize()) |
1 | 101 pathlib.Path(self.config_path()).write_text(data, 'utf-8') |
0 | 102 |
1 | 103 def get_profiles(self): |
104 return self.profiles | |
2 | 105 |
106 def get_profile(self, profile_id): | |
107 return self.get_profiles()[profile_id] | |
3
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
108 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
109 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
110 class Color: |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
111 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
112 def __init__(self, r, g, b): |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
113 self.r = r |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
114 self.g = g |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
115 self.b = b |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
116 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
117 @staticmethod |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
118 def from_hsv(h, s, v): |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
119 return Color(*colorsys.hsv_to_rgb(h, s, v)) |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
120 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
121 def to_hsv(self): |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
122 return colorsys.rgb_to_hsv(self.r, self.g, self.b) |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
123 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
124 @staticmethod |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
125 def from_hex(hex): |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
126 hex = hex.strip().strip('#').lower() |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
127 if not re.match('[0-9a-f]{6}', hex): |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
128 raise ValueError('Invalid hex color string: ' + hex) |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
129 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
130 r = int(hex[0:2], 16) / 255 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
131 g = int(hex[2:4], 16) / 255 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
132 b = int(hex[4:6], 16) / 255 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
133 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
134 return Color(r, g, b) |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
135 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
136 def to_hex(self): |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
137 return format(int(self.r * 255), '02x') \ |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
138 + format(int(self.g * 255), '02x') \ |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
139 + format(int(self.b * 255), '02x') |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
140 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
141 @staticmethod |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
142 def get_steps(start_color, end_color, step_count): |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
143 # (start_h, start_s, start_v) = start_color.to_hsv() |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
144 # (end_h, end_s, end_v) = end_color.to_hsv() |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
145 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
146 # # Find the shortest distance between the two hues. |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
147 # if abs(start_h - end_h) < 0.5: |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
148 # h_step = (end_h - start_h) / step_count |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
149 # else: |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
150 # h_step = (1 - abs(end_h - start_h)) / step_count |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
151 # if (start_h < end_h): |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
152 # h_step = h_step * -1 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
153 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
154 # steps = [] |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
155 # for i in range(0, step_count): |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
156 # h = (start_h + h_step * i) % 1 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
157 # s = start_s + (end_s - start_s) / step_count * i |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
158 # v = start_v + (end_v - start_v) / step_count * i |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
159 # steps.append(Color.from_hsv(h, s, v)) |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
160 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
161 steps = [] |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
162 for i in range(0, step_count): |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
163 percent = i / step_count |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
164 steps.append(Color.get_step_color(start_color, end_color, percent)) |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
165 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
166 return steps |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
167 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
168 @staticmethod |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
169 def get_step_color(start_color, end_color, percent): |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
170 (start_h, start_s, start_v) = start_color.to_hsv() |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
171 (end_h, end_s, end_v) = end_color.to_hsv() |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
172 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
173 # Find the shortest distance between the two hues. |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
174 if abs(start_h - end_h) < 0.5: |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
175 h_diff = end_h - start_h |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
176 else: |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
177 h_diff = 1 - abs(end_h - start_h) |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
178 if (start_h < end_h): |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
179 h_diff = h_diff * -1 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
180 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
181 h = (start_h + h_diff * percent) % 1 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
182 s = start_s + (end_s - start_s) * percent |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
183 v = start_v + (end_v - start_v) * percent |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
184 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
185 return Color.from_hsv(h, s, v) |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
186 |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
187 def __repr__(self): |
eb2aa09653bd
beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents:
2
diff
changeset
|
188 return 'Color #' + self.to_hex() |