Refine installation instructions
[jack_mixer.git] / jack_mixer / gui.py
blob5fa4265998510ec63654dedb2bbaac59ff6a91cc
1 # This file is part of jack_mixer
3 # Copyright (C) 2006 Nedko Arnaudov <nedko@arnaudov.name>
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; version 2 of the License
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 import configparser
19 import logging
20 import os
22 import gi # noqa: F401
23 from gi.repository import GObject
25 try:
26 import xdg
27 from xdg import BaseDirectory
28 except ImportError:
29 xdg = None
31 from .serialization import SerializedObject
34 log = logging.getLogger(__name__)
37 def lookup_scale(scales, scale_id):
38 for scale in scales:
39 if scale_id == scale.scale_id:
40 return scale
41 return None
44 class Factory(GObject.GObject, SerializedObject):
45 def __init__(self, topwindow, meter_scales, slider_scales):
46 self.midi_behavior_modes = ["Jump To Value", "Pick Up"]
47 GObject.GObject.__init__(self)
48 self.topwindow = topwindow
49 self.meter_scales = meter_scales
50 self.slider_scales = slider_scales
51 self.set_default_preferences()
52 if xdg:
53 self.config = configparser.ConfigParser()
54 self.path = os.path.join(
55 BaseDirectory.save_config_path("jack_mixer"), "preferences.ini"
57 if os.path.isfile(self.path):
58 self.read_preferences()
59 else:
60 self.write_preferences()
61 else:
62 log.warning(
63 "Cannot load PyXDG. Your preferences will not be preserved across "
64 "jack_mixer invocations"
67 def set_default_preferences(self):
68 self.confirm_quit = False
69 self.default_meter_scale = self.meter_scales[0]
70 self.default_project_path = None
71 self.default_slider_scale = self.slider_scales[0]
72 self.midi_behavior_mode = 0
73 self.use_custom_widgets = False
74 self.vumeter_color = "#ccb300"
75 self.vumeter_color_scheme = "default"
77 def read_preferences(self):
78 self.config.read(self.path)
79 self.confirm_quit = self.config.getboolean(
80 "Preferences", "confirm_quit", fallback=self.confirm_quit
83 scale_id = self.config["Preferences"]["default_meter_scale"]
84 self.default_meter_scale = lookup_scale(self.meter_scales, scale_id)
85 if not self.default_meter_scale:
86 self.default_meter_scale = self.meter_scales[0]
88 scale_id = self.config["Preferences"]["default_slider_scale"]
89 self.default_slider_scale = lookup_scale(self.slider_scales, scale_id)
90 if not self.default_slider_scale:
91 self.default_slider_scale = self.slider_scales[0]
93 self.default_project_path = self.config["Preferences"].get("default_project_path")
95 try:
96 self.midi_behavior_mode = self.config.getint(
97 "Preferences", "midi_behavior_mode", fallback=self.midi_behavior_mode
99 except (TypeError, ValueError):
100 # use default value
101 pass
103 self.use_custom_widgets = self.config.getboolean(
104 "Preferences", "use_custom_widgets", fallback=self.use_custom_widgets
106 self.vumeter_color = self.config.get(
107 "Preferences", "vumeter_color", fallback=self.vumeter_color
109 self.vumeter_color_scheme = self.config.get(
110 "Preferences", "vumeter_color_scheme", fallback=self.vumeter_color_scheme
113 def write_preferences(self):
114 self.config["Preferences"] = {}
115 self.config["Preferences"]["confirm_quit"] = str(self.confirm_quit)
116 self.config["Preferences"]["default_meter_scale"] = self.default_meter_scale.scale_id
117 self.config["Preferences"]["default_project_path"] = self.default_project_path or ""
118 self.config["Preferences"]["default_slider_scale"] = self.default_slider_scale.scale_id
119 self.config["Preferences"]["midi_behavior_mode"] = str(self.midi_behavior_mode)
120 self.config["Preferences"]["use_custom_widgets"] = str(self.use_custom_widgets)
121 self.config["Preferences"]["vumeter_color"] = self.vumeter_color
122 self.config["Preferences"]["vumeter_color_scheme"] = self.vumeter_color_scheme
123 with open(self.path, "w") as configfile:
124 self.config.write(configfile)
125 configfile.close()
127 def set_confirm_quit(self, confirm_quit):
128 self.confirm_quit = confirm_quit
129 if xdg:
130 self.write_preferences()
131 self.emit("confirm-quit-changed", self.confirm_quit)
133 def set_default_meter_scale(self, scale):
134 if scale:
135 self.default_meter_scale = scale
136 if xdg:
137 self.write_preferences()
138 self.emit("default-meter-scale-changed", self.default_meter_scale)
139 else:
140 log.warning(
141 'Ignoring default_meter_scale setting, because "%s" scale is not known.', scale
144 def set_default_project_path(self, path):
145 self.default_project_path = path
146 if xdg:
147 self.write_preferences()
148 self.emit("default-project-path-changed", self.default_project_path)
150 def set_default_slider_scale(self, scale):
151 if scale:
152 self.default_slider_scale = scale
153 if xdg:
154 self.write_preferences()
155 self.emit("default-slider-scale-changed", self.default_slider_scale)
156 else:
157 log.warning(
158 'Ignoring default_slider_scale setting, because "%s" scale is not known.', scale
161 def set_midi_behavior_mode(self, mode):
162 self.midi_behavior_mode = int(mode)
163 self.emit_midi_behavior_mode()
165 def set_use_custom_widgets(self, use_custom):
166 self.use_custom_widgets = use_custom
167 if xdg:
168 self.write_preferences()
169 self.emit("use-custom-widgets-changed", self.use_custom_widgets)
171 def set_vumeter_color(self, color):
172 self.vumeter_color = color
173 if xdg:
174 self.write_preferences()
175 self.emit("vumeter-color-changed", self.vumeter_color)
177 def set_vumeter_color_scheme(self, color_scheme):
178 self.vumeter_color_scheme = color_scheme
179 if xdg:
180 self.write_preferences()
181 self.emit("vumeter-color-scheme-changed", self.vumeter_color_scheme)
183 def get_confirm_quit(self):
184 return self.confirm_quit
186 def get_default_meter_scale(self):
187 return self.default_meter_scale
189 def get_default_project_path(self):
190 if self.default_project_path:
191 return os.path.expanduser(self.default_project_path)
192 elif xdg:
193 return BaseDirectory.save_data_path("jack_mixer")
195 def get_default_slider_scale(self):
196 return self.default_slider_scale
198 def get_midi_behavior_mode(self):
199 return self.midi_behavior_mode
201 def get_use_custom_widgets(self):
202 return self.use_custom_widgets
204 def get_vumeter_color(self):
205 return self.vumeter_color
207 def get_vumeter_color_scheme(self):
208 return self.vumeter_color_scheme
210 def emit_midi_behavior_mode(self):
211 self.emit("midi-behavior-mode-changed", self.midi_behavior_mode)
213 @classmethod
214 def serialization_name(cls):
215 return "gui_factory"
217 def serialize(self, object_backend):
218 object_backend.add_property("confirm-quit", str(self.get_confirm_quit()))
219 object_backend.add_property("default_meter_scale", self.get_default_meter_scale().scale_id)
220 # serialize the value, even if it's empty, not the default fallback directories
221 object_backend.add_property("default_project_path", self.default_project_path or "")
222 object_backend.add_property(
223 "default_slider_scale", self.get_default_slider_scale().scale_id
225 object_backend.add_property("midi_behavior_mode", str(self.get_midi_behavior_mode()))
226 object_backend.add_property("use_custom_widgets", str(self.get_use_custom_widgets()))
227 object_backend.add_property("vumeter_color", self.get_vumeter_color())
228 object_backend.add_property("vumeter_color_scheme", self.get_vumeter_color_scheme())
230 def unserialize_property(self, name, value):
231 if name == "confirm_quit":
232 self.set_confirm_quit(value == "True")
233 return True
234 elif name == "default_meter_scale":
235 self.set_default_meter_scale(lookup_scale(self.meter_scales, value))
236 return True
237 elif name == "default_project_path":
238 self.set_default_project_path(value or None)
239 return True
240 elif name == "default_slider_scale":
241 self.set_default_slider_scale(lookup_scale(self.slider_scales, value))
242 return True
243 elif name == "midi_behavior_mode":
244 self.set_midi_behavior_mode(int(value))
245 return True
246 elif name == "use_custom_widgets":
247 self.set_use_custom_widgets(value == "True")
248 return True
249 elif name == "vumeter_color":
250 self.set_vumeter_color(value)
251 return True
252 elif name == "vumeter_color_scheme":
253 self.set_vumeter_color_scheme(value)
254 return True
255 return False
258 GObject.signal_new(
259 "confirm-quit-changed",
260 Factory,
261 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
262 None,
263 [bool],
265 GObject.signal_new(
266 "default-meter-scale-changed",
267 Factory,
268 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
269 None,
270 [GObject.TYPE_PYOBJECT],
272 GObject.signal_new(
273 "default-project-path-changed",
274 Factory,
275 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
276 None,
277 [GObject.TYPE_PYOBJECT],
279 GObject.signal_new(
280 "default-slider-scale-changed",
281 Factory,
282 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
283 None,
284 [GObject.TYPE_PYOBJECT],
286 GObject.signal_new(
287 "midi-behavior-mode-changed",
288 Factory,
289 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
290 None,
291 [int],
293 GObject.signal_new(
294 "use-custom-widgets-changed",
295 Factory,
296 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
297 None,
298 [bool],
300 GObject.signal_new(
301 "vumeter-color-changed",
302 Factory,
303 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
304 None,
305 [str],
307 GObject.signal_new(
308 "vumeter-color-scheme-changed",
309 Factory,
310 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
311 None,
312 [str],