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.
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):
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(BaseDirectory.save_config_path('jack_mixer'), 'preferences.ini')
55 if os.path.isfile(self.path):
56 self.read_preferences()
58 self.write_preferences()
60 log.warning("Cannot load PyXDG. Your preferences will not be preserved across "
61 "jack_mixer invocations")
63 def set_default_preferences(self):
64 self.confirm_quit = False
65 self.default_meter_scale = self.meter_scales[0]
66 self.default_slider_scale = self.slider_scales[0]
67 self.midi_behavior_mode = 0
68 self.use_custom_widgets = False
69 self.vumeter_color = '#ccb300'
70 self.vumeter_color_scheme = 'default'
72 def read_preferences(self):
73 self.config.read(self.path)
74 self.confirm_quit = self.config.getboolean('Preferences', 'confirm_quit',
75 fallback=self.confirm_quit)
77 scale_id = self.config['Preferences']['default_meter_scale']
78 self.default_meter_scale = lookup_scale(self.meter_scales, scale_id)
79 if not self.default_meter_scale:
80 self.default_meter_scale = self.meter_scales[0]
82 scale_id = self.config['Preferences']['default_slider_scale']
83 self.default_slider_scale = lookup_scale(self.slider_scales, scale_id)
84 if not self.default_slider_scale:
85 self.default_slider_scale = slider_scales[0]
88 self.midi_behavior_mode = self.config.getint('Preferences', 'midi_behavior_mode',
89 fallback=self.midi_behavior_mode)
90 except (TypeError, ValueError):
94 self.use_custom_widgets = self.config.getboolean('Preferences', 'use_custom_widgets',
95 fallback=self.use_custom_widgets)
96 self.vumeter_color = self.config.get('Preferences', 'vumeter_color',
97 fallback=self.vumeter_color)
98 self.vumeter_color_scheme = self.config.get('Preferences', 'vumeter_color_scheme',
99 fallback=self.vumeter_color_scheme)
102 def write_preferences(self):
103 self.config['Preferences'] = {}
104 self.config['Preferences']['confirm_quit'] = str(self.confirm_quit)
105 self.config['Preferences']['default_meter_scale'] = self.default_meter_scale.scale_id
106 self.config['Preferences']['default_slider_scale'] = self.default_slider_scale.scale_id
107 self.config['Preferences']['midi_behavior_mode'] = str(self.midi_behavior_mode)
108 self.config['Preferences']['use_custom_widgets'] = str(self.use_custom_widgets)
109 self.config['Preferences']['vumeter_color'] = self.vumeter_color
110 self.config['Preferences']['vumeter_color_scheme'] = self.vumeter_color_scheme
111 with open(self.path, 'w') as configfile:
112 self.config.write(configfile)
115 def set_confirm_quit(self, confirm_quit):
116 self.confirm_quit = confirm_quit
118 self.write_preferences()
119 self.emit('confirm-quit-changed', self.confirm_quit)
121 def set_default_meter_scale(self, scale):
123 self.default_meter_scale = scale
125 self.write_preferences()
126 self.emit('default-meter-scale-changed', self.default_meter_scale)
128 log.warning('Ignoring default_meter_scale setting, because "%s" scale is not known.',
131 def set_default_slider_scale(self, scale):
133 self.default_slider_scale = scale
135 self.write_preferences()
136 self.emit('default-slider-scale-changed', self.default_slider_scale)
138 log.warning('Ignoring default_slider_scale setting, because "%s" scale is not known.',
141 def set_midi_behavior_mode(self, mode):
142 self.midi_behavior_mode = int(mode)
143 self.emit_midi_behavior_mode()
145 def set_use_custom_widgets(self, use_custom):
146 self.use_custom_widgets = use_custom
148 self.write_preferences()
149 self.emit('use-custom-widgets-changed', self.use_custom_widgets)
151 def set_vumeter_color(self, color):
152 self.vumeter_color = color
154 self.write_preferences()
155 self.emit('vumeter-color-changed', self.vumeter_color)
157 def set_vumeter_color_scheme(self, color_scheme):
158 self.vumeter_color_scheme = color_scheme
160 self.write_preferences()
161 self.emit('vumeter-color-scheme-changed', self.vumeter_color_scheme)
163 def get_confirm_quit(self):
164 return self.confirm_quit
166 def get_default_meter_scale(self):
167 return self.default_meter_scale
169 def get_default_slider_scale(self):
170 return self.default_slider_scale
172 def get_midi_behavior_mode(self):
173 return self.midi_behavior_mode
175 def get_use_custom_widgets(self):
176 return self.use_custom_widgets
178 def get_vumeter_color(self):
179 return self.vumeter_color
181 def get_vumeter_color_scheme(self):
182 return self.vumeter_color_scheme
184 def emit_midi_behavior_mode(self):
185 self.emit('midi-behavior-mode-changed', self.midi_behavior_mode)
188 def serialization_name(cls):
191 def serialize(self, object_backend):
192 object_backend.add_property('confirm-quit', str(self.get_confirm_quit()))
193 object_backend.add_property('default_meter_scale',
194 self.get_default_meter_scale().scale_id)
195 object_backend.add_property('default_slider_scale',
196 self.get_default_slider_scale().scale_id)
197 object_backend.add_property('midi_behavior_mode', str(self.get_midi_behavior_mode()))
198 object_backend.add_property('use_custom_widgets', str(self.get_use_custom_widgets()))
199 object_backend.add_property('vumeter_color', self.get_vumeter_color())
200 object_backend.add_property('vumeter_color_scheme', self.get_vumeter_color_scheme())
202 def unserialize_property(self, name, value):
203 if name == 'confirm_quit':
204 self.set_confirm_quit(value == 'True')
206 elif name == 'default_meter_scale':
207 self.set_default_meter_scale(lookup_scale(self.meter_scales, value))
209 elif name == 'default_slider_scale':
210 self.set_default_slider_scale(lookup_scale(self.slider_scales, value))
212 elif name == 'midi_behavior_mode':
213 self.set_midi_behavior_mode(int(value))
215 elif name == 'use_custom_widgets':
216 self.set_use_custom_widgets(value == 'True')
218 elif name == 'vumeter_color':
219 self.set_vumeter_color(value)
221 elif name == 'vumeter_color_scheme':
222 self.set_vumeter_color_scheme(value)
227 GObject.signal_new('confirm-quit-changed', Factory,
228 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
230 GObject.signal_new('default-meter-scale-changed', Factory,
231 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
232 None, [GObject.TYPE_PYOBJECT])
233 GObject.signal_new('default-slider-scale-changed', Factory,
234 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
235 None, [GObject.TYPE_PYOBJECT])
236 GObject.signal_new('midi-behavior-mode-changed', Factory,
237 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
239 GObject.signal_new('use-custom-widgets-changed', Factory,
240 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
242 GObject.signal_new('vumeter-color-changed', Factory,
243 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
245 GObject.signal_new('vumeter-color-scheme-changed', Factory,
246 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,