release: 13
[jack_mixer.git] / gui.py
blob8b1ff06447245c16f1f58da4ed22165b1d9bac02
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
23 from gi.repository import GObject
24 from serialization import SerializedObject
26 try:
27 import xdg
28 from xdg import BaseDirectory
29 except:
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):
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(BaseDirectory.save_config_path('jack_mixer'), 'preferences.ini')
55 if os.path.isfile(self.path):
56 self.read_preferences()
57 else:
58 self.write_preferences()
59 else:
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.default_meter_scale = self.meter_scales[0]
65 self.default_slider_scale = self.slider_scales[0]
66 self.vumeter_color = '#ccb300'
67 self.vumeter_color_scheme = 'default'
68 self.use_custom_widgets = False
69 self.midi_behavior_mode = 0
71 def read_preferences(self):
72 self.config.read(self.path)
73 scale_id = self.config['Preferences']['default_meter_scale']
74 self.default_meter_scale = lookup_scale(self.meter_scales, scale_id)
75 if not self.default_meter_scale:
76 self.default_meter_scale = self.meter_scales[0]
78 scale_id = self.config['Preferences']['default_slider_scale']
79 self.default_slider_scale = lookup_scale(self.slider_scales, scale_id)
80 if not self.default_slider_scale:
81 self.default_slider_scale = slider_scales[0]
83 self.vumeter_color_scheme = self.config['Preferences']['vumeter_color_scheme']
84 if not self.vumeter_color_scheme:
85 self.vumeter_color_scheme = 'default'
87 self.vumeter_color = self.config['Preferences']['vumeter_color']
88 if not self.vumeter_color:
89 self.vumeter_color = '#ccb300'
91 self.use_custom_widgets = self.config["Preferences"]["use_custom_widgets"] == 'True'
93 mode = 0
94 try:
95 mode = int(self.config["Preferences"]["midi_behavior_mode"])
96 except:
97 pass
98 self.midi_behavior_mode = mode
100 def write_preferences(self):
101 self.config['Preferences'] = {}
102 self.config['Preferences']['default_meter_scale'] = self.default_meter_scale.scale_id
103 self.config['Preferences']['default_slider_scale'] = self.default_slider_scale.scale_id
104 self.config['Preferences']['vumeter_color_scheme'] = self.vumeter_color_scheme
105 self.config['Preferences']['vumeter_color'] = self.vumeter_color
106 self.config['Preferences']['use_custom_widgets'] = str(self.use_custom_widgets)
107 self.config['Preferences']['midi_behavior_mode'] = str(self.midi_behavior_mode)
108 with open(self.path, 'w') as configfile:
109 self.config.write(configfile)
110 configfile.close()
112 def set_default_meter_scale(self, scale):
113 if scale:
114 self.default_meter_scale = scale
115 if xdg:
116 self.write_preferences()
117 self.emit("default-meter-scale-changed", self.default_meter_scale)
118 else:
119 log.warning('Ignoring default_meter_scale setting, because "%s" scale is not known.',
120 scale)
122 def set_default_slider_scale(self, scale):
123 if scale:
124 self.default_slider_scale = scale
125 if xdg:
126 self.write_preferences()
127 self.emit("default-slider-scale-changed", self.default_slider_scale)
128 else:
129 log.warning('Ignoring default_slider_scale setting, because "%s" scale is not known.',
130 scale)
132 def set_vumeter_color(self, color):
133 self.vumeter_color = color
134 if xdg:
135 self.write_preferences()
136 self.emit('vumeter-color-changed', self.vumeter_color)
138 def set_vumeter_color_scheme(self, color_scheme):
139 self.vumeter_color_scheme = color_scheme
140 if xdg:
141 self.write_preferences()
142 self.emit('vumeter-color-scheme-changed', self.vumeter_color_scheme)
144 def set_use_custom_widgets(self, use_custom):
145 self.use_custom_widgets = use_custom
146 if xdg:
147 self.write_preferences()
148 self.emit('use-custom-widgets-changed', self.use_custom_widgets)
150 def set_midi_behavior_mode(self, mode):
151 self.midi_behavior_mode = int(mode)
152 self.emit_midi_behavior_mode()
154 def emit_midi_behavior_mode(self):
155 self.emit("midi-behavior-mode-changed", self.midi_behavior_mode)
157 def get_default_meter_scale(self):
158 return self.default_meter_scale
160 def get_default_slider_scale(self):
161 return self.default_slider_scale
163 def get_vumeter_color(self):
164 return self.vumeter_color
166 def get_vumeter_color_scheme(self):
167 return self.vumeter_color_scheme
169 def get_use_custom_widgets(self):
170 return self.use_custom_widgets
172 def get_midi_behavior_mode(self):
173 return self.midi_behavior_mode
175 @classmethod
176 def serialization_name(cls):
177 return 'gui_factory'
179 def serialize(self, object_backend):
180 object_backend.add_property("default_meter_scale",
181 self.get_default_meter_scale().scale_id)
182 object_backend.add_property("default_slider_scale",
183 self.get_default_slider_scale().scale_id)
184 object_backend.add_property("vumeter_color_scheme",
185 self.get_vumeter_color_scheme())
186 object_backend.add_property("vumeter_color",
187 self.get_vumeter_color())
188 object_backend.add_property("use_custom_widgets",
189 str(self.get_use_custom_widgets()))
190 object_backend.add_property("midi_behavior_mode",
191 str(self.get_midi_behavior_mode()))
193 def unserialize_property(self, name, value):
194 if name == "default_meter_scale":
195 self.set_default_meter_scale(lookup_scale(self.meter_scales, value))
196 return True
197 if name == "default_slider_scale":
198 self.set_default_slider_scale(lookup_scale(self.slider_scales, value))
199 return True
200 if name == "vumeter_color_scheme":
201 self.set_vumeter_color_scheme(value)
202 return True
203 if name == "vumeter_color":
204 self.set_vumeter_color(value)
205 return True
206 if name == "use_custom_widgets":
207 self.set_use_custom_widgets(value == 'True')
208 return True
209 if name == "midi_behavior_mode":
210 self.set_midi_behavior_mode(int(value))
211 return True
212 return False
215 GObject.signal_new("default-meter-scale-changed", Factory,
216 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
217 None, [GObject.TYPE_PYOBJECT])
218 GObject.signal_new("default-slider-scale-changed", Factory,
219 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
220 None, [GObject.TYPE_PYOBJECT])
221 GObject.signal_new('vumeter-color-changed', Factory,
222 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
223 None, [str])
224 GObject.signal_new('vumeter-color-scheme-changed', Factory,
225 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
226 None, [str])
227 GObject.signal_new('use-custom-widgets-changed', Factory,
228 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
229 None, [bool])
230 GObject.signal_new('midi-behavior-mode-changed', Factory,
231 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
232 None, [int])