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
27 from xdg
import BaseDirectory
31 from .serialization
import SerializedObject
34 log
= logging
.getLogger(__name__
)
37 def lookup_scale(scales
, scale_id
):
39 if scale_id
== scale
.scale_id
:
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()
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()
60 self
.write_preferences()
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")
96 self
.midi_behavior_mode
= self
.config
.getint(
97 "Preferences", "midi_behavior_mode", fallback
=self
.midi_behavior_mode
99 except (TypeError, ValueError):
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
)
127 def set_confirm_quit(self
, confirm_quit
):
128 self
.confirm_quit
= confirm_quit
130 self
.write_preferences()
131 self
.emit("confirm-quit-changed", self
.confirm_quit
)
133 def set_default_meter_scale(self
, scale
):
135 self
.default_meter_scale
= scale
137 self
.write_preferences()
138 self
.emit("default-meter-scale-changed", self
.default_meter_scale
)
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
147 self
.write_preferences()
148 self
.emit("default-project-path-changed", self
.default_project_path
)
150 def set_default_slider_scale(self
, scale
):
152 self
.default_slider_scale
= scale
154 self
.write_preferences()
155 self
.emit("default-slider-scale-changed", self
.default_slider_scale
)
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
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
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
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
)
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
)
214 def serialization_name(cls
):
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")
234 elif name
== "default_meter_scale":
235 self
.set_default_meter_scale(lookup_scale(self
.meter_scales
, value
))
237 elif name
== "default_project_path":
238 self
.set_default_project_path(value
or None)
240 elif name
== "default_slider_scale":
241 self
.set_default_slider_scale(lookup_scale(self
.slider_scales
, value
))
243 elif name
== "midi_behavior_mode":
244 self
.set_midi_behavior_mode(int(value
))
246 elif name
== "use_custom_widgets":
247 self
.set_use_custom_widgets(value
== "True")
249 elif name
== "vumeter_color":
250 self
.set_vumeter_color(value
)
252 elif name
== "vumeter_color_scheme":
253 self
.set_vumeter_color_scheme(value
)
259 "confirm-quit-changed",
261 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,
266 "default-meter-scale-changed",
268 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,
270 [GObject
.TYPE_PYOBJECT
],
273 "default-project-path-changed",
275 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,
277 [GObject
.TYPE_PYOBJECT
],
280 "default-slider-scale-changed",
282 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,
284 [GObject
.TYPE_PYOBJECT
],
287 "midi-behavior-mode-changed",
289 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,
294 "use-custom-widgets-changed",
296 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,
301 "vumeter-color-changed",
303 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,
308 "vumeter-color-scheme-changed",
310 GObject
.SignalFlags
.RUN_FIRST | GObject
.SignalFlags
.ACTION
,