annotate keyboard_colors/color_profile.py @ 0:11a9d346aa7a

Sort of working model
author Brad Greco <brad@bgreco.net>
date Wed, 27 Jan 2021 21:02:30 -0500
parents
children b6d0a1e6ba3a
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
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
7 import uuid
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
8 gi.require_version("Gtk", "3.0")
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
9 from gi.repository import Gtk
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
10 from gi.repository import GLib
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
11
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
12 class ColorProfileBase:
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
13
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
14 type_name = '(no name)'
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
15
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
16 def __init__(self):
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
17 self.name = ''
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
18 self.id = uuid.uuid4().hex
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
19
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
20 def build_settings_ui(self):
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
21 glade_file = sys.modules[self.__module__].__file__.replace('.py', '.glade')
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
22 builder = Gtk.Builder()
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
23 builder.add_from_file(glade_file)
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
24 return builder.get_object('edit_profile_container')
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
25
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
26 class ProfileManager:
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
27
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
28 def __init__(self):
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
29 self.profiles = self.load_profiles()
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
30 self.save_profiles()
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
31
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
32 def get_types(self):
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
33 types = []
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
34 profile_directory = os.path.dirname(os.path.realpath(__file__))
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
35 (_, dirnames, _) = next(os.walk(profile_directory))
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
36 for dirname in dirnames:
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
37 module_file = os.path.join(profile_directory, dirname, dirname + '.py')
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
38 if os.path.isfile(module_file):
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
39 profile_module = importlib.import_module('keyboard_colors.' + dirname + '.' + dirname)
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
40 profile_class = getattr(profile_module, 'ColorProfile')
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
41 types.append(profile_class)
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
42 return types
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
43
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
44 def config_path(self):
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
45 dir = GLib.get_user_config_dir()
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
46 if not os.path.isdir(dir):
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
47 os.mkdir(dir)
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
48 return os.path.join(dir, 'keyboard-color-profiles.conf')
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
49
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
50 def load_profiles(self):
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
51 if os.path.isfile(self.config_path()):
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
52 data = pathlib.Path(self.config_path()).read_text('utf-8')
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
53 try:
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
54 return json.loads(data, object_hook=lambda d: SimpleNamespace(**d))
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
55 except json.decoder.JSONDecodeError:
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
56 return []
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
57 else:
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
58 return []
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
59
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
60 def save_profiles(self):
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
61 data = json.dumps(self.profiles, default=lambda o: o.__dict__)
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
62 pathlib.Path(self.config_path()).write_text(data, 'utf-8')
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 def get_profiles(self):
11a9d346aa7a Sort of working model
Brad Greco <brad@bgreco.net>
parents:
diff changeset
65 return self.profiles