Minor code re-ordering for clarity
[jack_mixer.git] / gui.py
blob3402481e180cd0c3d8fb92cee46a414e65243fd9
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
24 from serialization import SerializedObject
26 try:
27 import xdg
28 from xdg import BaseDirectory
29 except ImportError:
30 xdg = None
33 log = logging.getLogger(__name__)
36 def lookup_scale(scales, scale_id):
37 for scale in scales:
38 if scale_id == scale.scale_id:
39 return scale
40 return None
43 class Factory(GObject.GObject, SerializedObject):
44 def __init__(self, topwindow, meter_scales, slider_scales):
45 self.midi_behavior_modes = ["Jump To Value", "Pick Up"]
46 GObject.GObject.__init__(self)
47 self.topwindow = topwindow
48 self.meter_scales = meter_scales
49 self.slider_scales = slider_scales
50 self.set_default_preferences()
51 if xdg:
52 self.config = configparser.ConfigParser()
53 self.path = os.path.join(
54 BaseDirectory.save_config_path("jack_mixer"), "preferences.ini"
56 if os.path.isfile(self.path):
57 self.read_preferences()
58 else:
59 self.write_preferences()
60 else:
61 log.warning(
62 "Cannot load PyXDG. Your preferences will not be preserved across "
63 "jack_mixer invocations"
66 def set_default_preferences(self):
67 self.confirm_quit = False
68 self.default_meter_scale = self.meter_scales[0]
69 self.default_project_path = None
70 self.default_slider_scale = self.slider_scales[0]
71 self.midi_behavior_mode = 0
72 self.use_custom_widgets = False
73 self.vumeter_color = "#ccb300"
74 self.vumeter_color_scheme = "default"
76 def read_preferences(self):
77 self.config.read(self.path)
78 self.confirm_quit = self.config.getboolean(
79 "Preferences", "confirm_quit", fallback=self.confirm_quit
82 scale_id = self.config["Preferences"]["default_meter_scale"]
83 self.default_meter_scale = lookup_scale(self.meter_scales, scale_id)
84 if not self.default_meter_scale:
85 self.default_meter_scale = self.meter_scales[0]
87 scale_id = self.config["Preferences"]["default_slider_scale"]
88 self.default_slider_scale = lookup_scale(self.slider_scales, scale_id)
89 if not self.default_slider_scale:
90 self.default_slider_scale = self.slider_scales[0]
92 self.default_project_path = self.config["Preferences"].get("default_project_path")
94 try:
95 self.midi_behavior_mode = self.config.getint(
96 "Preferences", "midi_behavior_mode", fallback=self.midi_behavior_mode
98 except (TypeError, ValueError):
99 # use default value
100 pass
102 self.use_custom_widgets = self.config.getboolean(
103 "Preferences", "use_custom_widgets", fallback=self.use_custom_widgets
105 self.vumeter_color = self.config.get(
106 "Preferences", "vumeter_color", fallback=self.vumeter_color
108 self.vumeter_color_scheme = self.config.get(
109 "Preferences", "vumeter_color_scheme", fallback=self.vumeter_color_scheme
112 def write_preferences(self):
113 self.config["Preferences"] = {}
114 self.config["Preferences"]["confirm_quit"] = str(self.confirm_quit)
115 self.config["Preferences"]["default_meter_scale"] = self.default_meter_scale.scale_id
116 self.config["Preferences"]["default_project_path"] = self.default_project_path or ""
117 self.config["Preferences"]["default_slider_scale"] = self.default_slider_scale.scale_id
118 self.config["Preferences"]["midi_behavior_mode"] = str(self.midi_behavior_mode)
119 self.config["Preferences"]["use_custom_widgets"] = str(self.use_custom_widgets)
120 self.config["Preferences"]["vumeter_color"] = self.vumeter_color
121 self.config["Preferences"]["vumeter_color_scheme"] = self.vumeter_color_scheme
122 with open(self.path, "w") as configfile:
123 self.config.write(configfile)
124 configfile.close()
126 def set_confirm_quit(self, confirm_quit):
127 self.confirm_quit = confirm_quit
128 if xdg:
129 self.write_preferences()
130 self.emit("confirm-quit-changed", self.confirm_quit)
132 def set_default_meter_scale(self, scale):
133 if scale:
134 self.default_meter_scale = scale
135 if xdg:
136 self.write_preferences()
137 self.emit("default-meter-scale-changed", self.default_meter_scale)
138 else:
139 log.warning(
140 'Ignoring default_meter_scale setting, because "%s" scale is not known.', scale
143 def set_default_project_path(self, path):
144 self.default_project_path = path
145 if xdg:
146 self.write_preferences()
147 self.emit("default-project-path-changed", self.default_project_path)
149 def set_default_slider_scale(self, scale):
150 if scale:
151 self.default_slider_scale = scale
152 if xdg:
153 self.write_preferences()
154 self.emit("default-slider-scale-changed", self.default_slider_scale)
155 else:
156 log.warning(
157 'Ignoring default_slider_scale setting, because "%s" scale is not known.', scale
160 def set_midi_behavior_mode(self, mode):
161 self.midi_behavior_mode = int(mode)
162 self.emit_midi_behavior_mode()
164 def set_use_custom_widgets(self, use_custom):
165 self.use_custom_widgets = use_custom
166 if xdg:
167 self.write_preferences()
168 self.emit("use-custom-widgets-changed", self.use_custom_widgets)
170 def set_vumeter_color(self, color):
171 self.vumeter_color = color
172 if xdg:
173 self.write_preferences()
174 self.emit("vumeter-color-changed", self.vumeter_color)
176 def set_vumeter_color_scheme(self, color_scheme):
177 self.vumeter_color_scheme = color_scheme
178 if xdg:
179 self.write_preferences()
180 self.emit("vumeter-color-scheme-changed", self.vumeter_color_scheme)
182 def get_confirm_quit(self):
183 return self.confirm_quit
185 def get_default_meter_scale(self):
186 return self.default_meter_scale
188 def get_default_project_path(self):
189 if self.default_project_path:
190 return os.path.expanduser(self.default_project_path)
191 elif xdg:
192 return BaseDirectory.save_data_path("jack_mixer")
194 def get_default_slider_scale(self):
195 return self.default_slider_scale
197 def get_midi_behavior_mode(self):
198 return self.midi_behavior_mode
200 def get_use_custom_widgets(self):
201 return self.use_custom_widgets
203 def get_vumeter_color(self):
204 return self.vumeter_color
206 def get_vumeter_color_scheme(self):
207 return self.vumeter_color_scheme
209 def emit_midi_behavior_mode(self):
210 self.emit("midi-behavior-mode-changed", self.midi_behavior_mode)
212 @classmethod
213 def serialization_name(cls):
214 return "gui_factory"
216 def serialize(self, object_backend):
217 object_backend.add_property("confirm-quit", str(self.get_confirm_quit()))
218 object_backend.add_property("default_meter_scale", self.get_default_meter_scale().scale_id)
219 # serialize the value, even if it's empty, not the default fallback directories
220 object_backend.add_property("default_project_path", self.default_project_path or "")
221 object_backend.add_property(
222 "default_slider_scale", self.get_default_slider_scale().scale_id
224 object_backend.add_property("midi_behavior_mode", str(self.get_midi_behavior_mode()))
225 object_backend.add_property("use_custom_widgets", str(self.get_use_custom_widgets()))
226 object_backend.add_property("vumeter_color", self.get_vumeter_color())
227 object_backend.add_property("vumeter_color_scheme", self.get_vumeter_color_scheme())
229 def unserialize_property(self, name, value):
230 if name == "confirm_quit":
231 self.set_confirm_quit(value == "True")
232 return True
233 elif name == "default_meter_scale":
234 self.set_default_meter_scale(lookup_scale(self.meter_scales, value))
235 return True
236 elif name == "default_project_path":
237 self.set_default_project_path(value or None)
238 return True
239 elif name == "default_slider_scale":
240 self.set_default_slider_scale(lookup_scale(self.slider_scales, value))
241 return True
242 elif name == "midi_behavior_mode":
243 self.set_midi_behavior_mode(int(value))
244 return True
245 elif name == "use_custom_widgets":
246 self.set_use_custom_widgets(value == "True")
247 return True
248 elif name == "vumeter_color":
249 self.set_vumeter_color(value)
250 return True
251 elif name == "vumeter_color_scheme":
252 self.set_vumeter_color_scheme(value)
253 return True
254 return False
257 GObject.signal_new(
258 "confirm-quit-changed",
259 Factory,
260 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
261 None,
262 [bool],
264 GObject.signal_new(
265 "default-meter-scale-changed",
266 Factory,
267 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
268 None,
269 [GObject.TYPE_PYOBJECT],
271 GObject.signal_new(
272 "default-project-path-changed",
273 Factory,
274 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
275 None,
276 [GObject.TYPE_PYOBJECT],
278 GObject.signal_new(
279 "default-slider-scale-changed",
280 Factory,
281 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
282 None,
283 [GObject.TYPE_PYOBJECT],
285 GObject.signal_new(
286 "midi-behavior-mode-changed",
287 Factory,
288 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
289 None,
290 [int],
292 GObject.signal_new(
293 "use-custom-widgets-changed",
294 Factory,
295 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
296 None,
297 [bool],
299 GObject.signal_new(
300 "vumeter-color-changed",
301 Factory,
302 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
303 None,
304 [str],
306 GObject.signal_new(
307 "vumeter-color-scheme-changed",
308 Factory,
309 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
310 None,
311 [str],