annotate keyboard_colors/color_profile.py @ 2:091a1f59a79c

Load profiles into list view
author Brad Greco <brad@bgreco.net>
date Tue, 02 Mar 2021 20:17:36 -0500
parents b6d0a1e6ba3a
children eb2aa09653bd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
1 import gi
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
2 import importlib
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
3 import json
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
4 import os
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
5 import pathlib
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
6 import sys
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
7 import types
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
8 import uuid
2
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
9 from types import SimpleNamespace
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
10 gi.require_version("Gtk", "3.0")
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
11 from gi.repository import Gtk # noqa: E402
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
12 from gi.repository import GLib # noqa: E402
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
13
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
14
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
15 class ColorProfileBase:
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
16
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
17 type_name = '(no name)'
0
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 def __init__(self):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
20 self.name = ''
2
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
21 self.id = str(uuid.uuid4())
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
22
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
23 def build_settings_ui(self):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
24 glade_file = sys.modules[self.__module__].__file__.replace('.py', '.glade')
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
25 builder = Gtk.Builder()
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
26 builder.add_from_file(glade_file)
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
27 return builder.get_object('edit_profile_container')
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
28
2
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
29 def serialize(self):
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
30 properties = self.__dict__
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
31 properties['module'] = self.__class__.__module__
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
32 return properties
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
33
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
34 @staticmethod
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
35 def unserialize(data):
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
36 profile_module = importlib.import_module(data['module'])
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
37 profile_class = getattr(profile_module, 'ColorProfile')
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
38 profile = profile_class()
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
39 profile.__dict__.update(data)
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
40 return profile
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
41
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
42
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
43 class ProfileManager:
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
44
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
45 def __init__(self):
2
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
46 profile_list = self.load_profiles()
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
47 self.profiles = {p.id: p for p in profile_list}
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
48
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
49 def get_types(self):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
50 types = []
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
51 profile_directory = os.path.dirname(os.path.realpath(__file__))
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
52 (_, dirnames, _) = next(os.walk(profile_directory))
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
53 for dirname in dirnames:
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
54 module_file = os.path.join(profile_directory, dirname, dirname + '.py')
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
55 if os.path.isfile(module_file):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
56 module_name = 'keyboard_colors.' + dirname + '.' + dirname
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
57 profile_module = importlib.import_module(module_name)
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
58 profile_class = getattr(profile_module, 'ColorProfile')
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
59 types.append(profile_class)
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
60 return types
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
61
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
62 def config_path(self):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
63 dir = GLib.get_user_config_dir()
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
64 if not os.path.isdir(dir):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
65 os.mkdir(dir)
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
66 return os.path.join(dir, 'keyboard-color-profiles.conf')
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
67
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
68 def load_profiles(self):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
69 if os.path.isfile(self.config_path()):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
70 data = pathlib.Path(self.config_path()).read_text('utf-8')
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
71 try:
2
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
72 return json.loads(data, object_hook=lambda d: ColorProfileBase.unserialize(d))
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
73 except json.decoder.JSONDecodeError:
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
74 return []
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
75 else:
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
76 return []
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
77
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
78 def save_profiles(self):
2
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
79 data = json.dumps(self.profiles, default=lambda o: o.serialize())
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
80 pathlib.Path(self.config_path()).write_text(data, 'utf-8')
0
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
81
1
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
82 def get_profiles(self):
b6d0a1e6ba3a Linter cleanup
Brad Greco <brad@bgreco.net>
parents: 0
diff changeset
83 return self.profiles
2
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
84
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
85 def get_profile(self, profile_id):
091a1f59a79c Load profiles into list view
Brad Greco <brad@bgreco.net>
parents: 1
diff changeset
86 return self.get_profiles()[profile_id]