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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
eb2aa09653bd beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents: 2
diff changeset
1 import colorsys
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
2 import gi
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
3 import importlib
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
4 import json
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
5 import os
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
6 import pathlib
3
eb2aa09653bd beginnings of CPU colors, daemon
Brad Greco <brad@bgreco.net>
parents: 2
diff changeset
7 import re
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
8 import sys
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
9 import types
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
10 import uuid
2
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
11 from types import SimpleNamespace
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
12 gi.require_version("Gtk", "3.0")
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
13 from gi.repository import Gtk # noqa: E402
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
14 from gi.repository import GLib # noqa: E402
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
15
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
16
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
17 class ColorProfileBase:
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
18
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
19 type_name = '(no name)'
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
20
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
21 def __init__(self):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
22 self.name = ''
2
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
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
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
43
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
44 def build_settings_ui(self):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
45 glade_file = sys.modules[self.__module__].__file__.replace('.py', '.glade')
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
46 builder = Gtk.Builder()
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
47 builder.add_from_file(glade_file)
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
48 return builder.get_object('edit_profile_container')
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
49
2
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
50 def serialize(self):
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
51 properties = self.__dict__
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
52 properties['module'] = self.__class__.__module__
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
53 return properties
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
54
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
55 @staticmethod
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
56 def unserialize(data):
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
57 profile_module = importlib.import_module(data['module'])
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
58 profile_class = getattr(profile_module, 'ColorProfile')
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
59 profile = profile_class()
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
60 profile.__dict__.update(data)
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
61 return profile
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
62
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
63
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
64 class ProfileManager:
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
65
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
66 def __init__(self):
2
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
67 profile_list = self.load_profiles()
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
68 self.profiles = {p.id: p for p in profile_list}
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
69
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
70 def get_types(self):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
71 types = []
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
72 profile_directory = os.path.dirname(os.path.realpath(__file__))
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
73 (_, dirnames, _) = next(os.walk(profile_directory))
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
74 for dirname in dirnames:
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
75 module_file = os.path.join(profile_directory, dirname, dirname + '.py')
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
76 if os.path.isfile(module_file):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
77 module_name = 'keyboard_colors.' + dirname + '.' + dirname
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
78 profile_module = importlib.import_module(module_name)
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
79 profile_class = getattr(profile_module, 'ColorProfile')
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
80 types.append(profile_class)
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
81 return types
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
82
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
83 def config_path(self):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
84 dir = GLib.get_user_config_dir()
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
85 if not os.path.isdir(dir):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
86 os.mkdir(dir)
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
87 return os.path.join(dir, 'keyboard-color-profiles.conf')
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
88
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
89 def load_profiles(self):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
90 if os.path.isfile(self.config_path()):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
91 data = pathlib.Path(self.config_path()).read_text('utf-8')
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
92 try:
2
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
93 return json.loads(data, object_hook=lambda d: ColorProfileBase.unserialize(d))
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
94 except json.decoder.JSONDecodeError:
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
95 return []
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
96 else:
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
97 return []
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
98
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
99 def save_profiles(self):
2
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
100 data = json.dumps(self.profiles, default=lambda o: o.serialize())
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
101 pathlib.Path(self.config_path()).write_text(data, 'utf-8')
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
102
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
103 def get_profiles(self):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
104 return self.profiles
2
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
105
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
106 def get_profile(self, profile_id):
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
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()