]> git.0d.be Git - jack_mixer.git/blob - gui.py
Set version to 14 in preparation for next release
[jack_mixer.git] / gui.py
1 # This file is part of jack_mixer
2 #
3 # Copyright (C) 2006 Nedko Arnaudov <nedko@arnaudov.name>
4 #
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
8 #
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.
13 #
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.
17
18 import configparser
19 import logging
20 import os
21
22 import gi
23 from gi.repository import GObject
24 from serialization import SerializedObject
25
26 try:
27     import xdg
28     from xdg import BaseDirectory
29 except:
30     xdg = None
31
32
33 log = logging.getLogger(__name__)
34
35
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
41
42
43 class Factory(GObject.GObject, SerializedObject):
44
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")
62
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
70
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]
77
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]
82
83         self.vumeter_color_scheme = self.config['Preferences']['vumeter_color_scheme']
84         if not self.vumeter_color_scheme:
85             self.vumeter_color_scheme = 'default'
86
87         self.vumeter_color = self.config['Preferences']['vumeter_color']
88         if not self.vumeter_color:
89             self.vumeter_color = '#ccb300'
90
91         self.use_custom_widgets = self.config["Preferences"]["use_custom_widgets"] == 'True'
92
93         mode = 0
94         try:
95             mode = int(self.config["Preferences"]["midi_behavior_mode"])
96         except:
97             pass
98         self.midi_behavior_mode = mode
99
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()
111
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)
121
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)
131
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)
137
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)
143
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)
149
150     def set_midi_behavior_mode(self, mode):
151         self.midi_behavior_mode = int(mode)
152         self.emit_midi_behavior_mode()
153
154     def emit_midi_behavior_mode(self):
155         self.emit("midi-behavior-mode-changed", self.midi_behavior_mode)
156
157     def get_default_meter_scale(self):
158         return self.default_meter_scale
159
160     def get_default_slider_scale(self):
161         return self.default_slider_scale
162
163     def get_vumeter_color(self):
164         return self.vumeter_color
165
166     def get_vumeter_color_scheme(self):
167         return self.vumeter_color_scheme
168
169     def get_use_custom_widgets(self):
170         return self.use_custom_widgets
171
172     def get_midi_behavior_mode(self):
173         return self.midi_behavior_mode
174
175     @classmethod
176     def serialization_name(cls):
177         return 'gui_factory'
178
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()))
192
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
213
214
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])