]> git.0d.be Git - jack_mixer.git/blob - gui.py
Add 0dB/-Inf option for starting values on newly created channels
[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 gi
19 from gi.repository import GObject
20 import os
21 import configparser
22 from serialization import SerializedObject
23
24 try:
25     import xdg
26     from xdg import BaseDirectory
27 except:
28     xdg = None
29
30 def lookup_scale(scales, scale_id):
31     for scale in scales:
32         if scale_id == scale.scale_id:
33             return scale
34     return None
35
36 class Factory(GObject.GObject, SerializedObject):
37
38     def __init__(self, topwindow, meter_scales, slider_scales):
39         self.midi_behavior_modes = [ 'Jump To Value', 'Pick Up' ]
40         GObject.GObject.__init__(self)
41         self.topwindow = topwindow
42         self.meter_scales = meter_scales
43         self.slider_scales = slider_scales
44         self.set_default_preferences()
45         if xdg:
46             self.config = configparser.ConfigParser()
47             self.path = os.path.join(BaseDirectory.save_config_path('jack_mixer'), 'preferences.ini')
48             if os.path.isfile(self.path):
49                 self.read_preferences()
50             else:
51                 self.write_preferences()
52         else:
53             print("Cannot load PyXDG. Your preferences will not be preserved across jack_mixer invocations")
54
55     def set_default_preferences(self):
56         self.default_meter_scale = self.meter_scales[0]
57         self.default_slider_scale = self.slider_scales[0]
58         self.vumeter_color = '#ccb300'
59         self.vumeter_color_scheme = 'default'
60         self.use_custom_widgets = False
61         self.midi_behavior_mode = 0
62
63     def read_preferences(self):
64         self.config.read(self.path)
65         scale_id = self.config['Preferences']['default_meter_scale']
66         self.default_meter_scale = lookup_scale(self.meter_scales, scale_id)
67         if not self.default_meter_scale:
68             self.default_meter_scale = meter_scales[0]
69
70         scale_id = self.config['Preferences']['default_slider_scale']
71         self.default_slider_scale = lookup_scale(self.slider_scales, scale_id)
72         if not self.default_slider_scale:
73             self.default_slider_scale = slider_scales[0]
74
75         self.vumeter_color_scheme = self.config['Preferences']['vumeter_color_scheme']
76         if not self.vumeter_color_scheme:
77             self.vumeter_color_scheme = 'default'
78
79         self.vumeter_color = self.config['Preferences']['vumeter_color']
80         if not self.vumeter_color:
81             self.vumeter_color = '#ccb300'
82
83         self.use_custom_widgets = self.config["Preferences"]["use_custom_widgets"] == 'True'
84
85         try:
86             self.midi_behavior_mode = self.config["Preferences"]["midi_behavior_mode"]
87         except:
88             self.midi_behavior_mode = 0
89
90     def write_preferences(self):
91         self.config['Preferences'] = {}
92         self.config['Preferences']['default_meter_scale'] = self.default_meter_scale.scale_id
93         self.config['Preferences']['default_slider_scale'] = self.default_slider_scale.scale_id
94         self.config['Preferences']['vumeter_color_scheme'] = self.vumeter_color_scheme
95         self.config['Preferences']['vumeter_color'] = self.vumeter_color
96         self.config['Preferences']['use_custom_widgets'] = str(self.use_custom_widgets)
97         self.config['Preferences']['midi_behavior_mode'] = str(self.midi_behavior_mode)
98         with open(self.path, 'w') as configfile:
99             self.config.write(configfile)
100             configfile.close()
101
102     def set_default_meter_scale(self, scale):
103         if scale:
104             self.default_meter_scale = scale
105             if xdg:
106                 self.write_preferences()
107             self.emit("default-meter-scale-changed", self.default_meter_scale)
108         else:
109             print("Ignoring default_meter_scale setting, because \"%s\" scale is not known" % scale_id)
110
111     def set_default_slider_scale(self, scale):
112         if scale:
113             self.default_slider_scale = scale
114             if xdg:
115                 self.write_preferences()
116             self.emit("default-slider-scale-changed", self.default_slider_scale)
117         else:
118             print("Ignoring default_slider_scale setting, because \"%s\" scale is not known" % scale_id)
119
120     def set_vumeter_color(self, color):
121         self.vumeter_color = color
122         if xdg:
123             self.write_preferences()
124         self.emit('vumeter-color-changed', self.vumeter_color)
125
126     def set_vumeter_color_scheme(self, color_scheme):
127         self.vumeter_color_scheme = color_scheme
128         if xdg:
129             self.write_preferences()
130         self.emit('vumeter-color-scheme-changed', self.vumeter_color_scheme)
131
132     def set_use_custom_widgets(self, use_custom):
133         self.use_custom_widgets = use_custom
134         if xdg:
135             self.write_preferences()
136         self.emit('use-custom-widgets-changed', self.use_custom_widgets)
137
138     def set_midi_behavior_mode(self, mode):
139         self.midi_behavior_mode = int(mode)
140         self.emit("midi-behavior-mode-changed", self.midi_behavior_mode)
141
142     def get_default_meter_scale(self):
143         return self.default_meter_scale
144
145     def get_default_slider_scale(self):
146         return self.default_slider_scale
147
148     def get_vumeter_color(self):
149         return self.vumeter_color
150
151     def get_vumeter_color_scheme(self):
152         return self.vumeter_color_scheme
153
154     def get_use_custom_widgets(self):
155         return self.use_custom_widgets
156
157     def get_midi_behavior_mode(self):
158         return self.midi_behavior_mode
159
160     @classmethod
161     def serialization_name(cls):
162         return 'gui_factory'
163
164     def serialize(self, object_backend):
165         object_backend.add_property("default_meter_scale",
166                 self.get_default_meter_scale().scale_id)
167         object_backend.add_property("default_slider_scale",
168                 self.get_default_slider_scale().scale_id)
169         object_backend.add_property("vumeter_color_scheme",
170                 self.get_vumeter_color_scheme())
171         object_backend.add_property("vumeter_color",
172                 self.get_vumeter_color())
173         object_backend.add_property("use_custom_widgets",
174                 str(self.get_use_custom_widgets()))
175         object_backend.add_property("midi_behavior_mode",
176                 str(self.get_midi_behavior_mode()))
177
178     def unserialize_property(self, name, value):
179         if name == "default_meter_scale":
180             self.set_default_meter_scale(lookup_scale(self.meter_scales, value))
181             return True
182         if name == "default_slider_scale":
183             self.set_default_slider_scale(lookup_scale(self.slider_scales, value))
184             return True
185         if name == "vumeter_color_scheme":
186             self.set_vumeter_color_scheme(value)
187             return True
188         if name == "vumeter_color":
189             self.set_vumeter_color(value)
190             return True
191         if name == "use_custom_widgets":
192             self.set_use_custom_widgets(value == 'True')
193             return True
194         if name == "midi_behavior_mode":
195             self.set_midi_behavior_mode(int(value))
196             return True
197         return False
198
199 GObject.signal_new("default-meter-scale-changed", Factory,
200                 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
201                 None, [GObject.TYPE_PYOBJECT])
202 GObject.signal_new("default-slider-scale-changed", Factory,
203                 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
204                 None, [GObject.TYPE_PYOBJECT])
205 GObject.signal_new('vumeter-color-changed', Factory,
206                 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
207                 None, [str])
208 GObject.signal_new('vumeter-color-scheme-changed', Factory,
209                 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
210                 None, [str])
211 GObject.signal_new('use-custom-widgets-changed', Factory,
212                 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
213                 None, [bool])
214 GObject.signal_new('midi-behavior-mode-changed', Factory,
215                 GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
216                 None, [int])