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.
22 import gi
# noqa: F401
23 from gi
.repository
import GObject
24 from serialization
import SerializedObject
28 from xdg
import BaseDirectory
33 log
= logging
.getLogger(__name__
)
36 def lookup_scale(scales
, scale_id
):
38 if scale_id
== scale
.scale_id
:
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()
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()
59 self
.write_preferences()
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")
95 self
.midi_behavior_mode
= self
.config
.getint(
96 "Preferences", "midi_behavior_mode", fallback
=self
.midi_behavior_mode
98 except (TypeError, ValueError):
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
)
126 def set_confirm_quit(self
, confirm_quit
):
127 self
.confirm_quit
= confirm_quit
129 self
.write_preferences()
130 self
.emit("confirm-quit-changed", self
.confirm_quit
)
132 def set_default_meter_scale(self
, scale
):
134 self
.default_meter_scale
= scale
136 self
.write_preferences()
137 self
.emit("default-meter-scale-changed", self
.default_meter_scale
)
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
146 self
.write_preferences()
147 self
.emit("default-project-path-changed", self
.default_project_path
)
149 def set_default_slider_scale(self
, scale
):
151 self
.default_slider_scale
= scale
153 self
.write_preferences()
154 self
.emit("default-slider-scale-changed", self
.default_slider_scale
)
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
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
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
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
)
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
)
213 def serialization_name(cls
):
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")
233 elif name
== "default_meter_scale":
234 self
.set_default_meter_scale(lookup_scale(self
.meter_scales
, value
))
236 elif name
== "default_project_path":
237 self
.set_default_project_path(value
or None)
239 elif name
== "default_slider_scale":
240 self
.set_default_slider_scale(lookup_scale(self
.slider_scales
, value
))
242 elif name
== "midi_behavior_mode":
243 self
.set_midi_behavior_mode(int(value
))
245 elif name
== "use_custom_widgets":
246 self
.set_use_custom_widgets(value
== "True")
248 elif name
== "vumeter_color":
249 self
.set_vumeter_color(value
)
251 elif name
== "vumeter_color_scheme":
252 self
.set_vumeter_color_scheme(value
)
258 "confirm-quit-changed",
260 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,
265 "default-meter-scale-changed",
267 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,
269 [GObject
.TYPE_PYOBJECT
],
272 "default-project-path-changed",
274 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,
276 [GObject
.TYPE_PYOBJECT
],
279 "default-slider-scale-changed",
281 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,
283 [GObject
.TYPE_PYOBJECT
],
286 "midi-behavior-mode-changed",
288 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,
293 "use-custom-widgets-changed",
295 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,
300 "vumeter-color-changed",
302 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,
307 "vumeter-color-scheme-changed",
309 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,