]> git.0d.be Git - jack_mixer.git/blobdiff - gui.py
Set version to 14 in preparation for next release
[jack_mixer.git] / gui.py
diff --git a/gui.py b/gui.py
index 9b555e1c3cbd9e67b8da478301c1a69ff661902c..fd06fc7e71b19a5bee0aa029616771619dd055db 100644 (file)
--- a/gui.py
+++ b/gui.py
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 
+import configparser
+import logging
+import os
+
 import gi
-gi.require_version('GConf', '2.0')
 from gi.repository import GObject
+from serialization import SerializedObject
 
 try:
-    from gi.repository import GConf
+    import xdg
+    from xdg import BaseDirectory
 except:
-    print("Cannot load Python bindings for GConf, your preferences will not be preserved across jack_mixer invocations")
-    GConf = None
+    xdg = None
+
+
+log = logging.getLogger(__name__)
+
 
 def lookup_scale(scales, scale_id):
     for scale in scales:
@@ -31,113 +39,129 @@ def lookup_scale(scales, scale_id):
             return scale
     return None
 
-class Factory(GObject.GObject):
+
+class Factory(GObject.GObject, SerializedObject):
+
     def __init__(self, topwindow, meter_scales, slider_scales):
+        self.midi_behavior_modes = [ 'Jump To Value', 'Pick Up' ]
         GObject.GObject.__init__(self)
         self.topwindow = topwindow
         self.meter_scales = meter_scales
         self.slider_scales = slider_scales
-
-        if GConf:
-            self.gconf_client = GConf.Client.get_default()
-
-            scale_id = self.gconf_client.get_string("/apps/jack_mixer/default_meter_scale")
-            self.default_meter_scale = lookup_scale(meter_scales, scale_id)
-            if not self.default_meter_scale:
-                self.default_meter_scale = meter_scales[0]
-
-            scale_id = self.gconf_client.get_string("/apps/jack_mixer/default_slider_scale")
-            self.default_slider_scale = lookup_scale(slider_scales, scale_id)
-            if not self.default_slider_scale:
-                self.default_slider_scale = slider_scales[0]
-
-            self.vumeter_color_scheme = self.gconf_client.get_string(
-                            '/apps/jack_mixer/vumeter_color_scheme')
-            self.vumeter_color = self.gconf_client.get_string(
-                            '/apps/jack_mixer/vumeter_color')
-            if not self.vumeter_color:
-                self.vumeter_color = '#ccb300'
-
-            self.use_custom_widgets = self.gconf_client.get_bool(
-                            '/apps/jack_mixer/use_custom_widgets')
-
-            self.gconf_client.add_dir("/apps/jack_mixer", GConf.ClientPreloadType.PRELOAD_NONE)
-            self.gconf_client.notify_add("/apps/jack_mixer/default_meter_scale", self.on_gconf_default_meter_scale_changed)
-            self.gconf_client.notify_add("/apps/jack_mixer/default_slider_scale", self.on_gconf_default_slider_scale_changed)
-            self.gconf_client.notify_add('/apps/jack_mixer/vumeter_color', self.on_gconf_vumeter_color_change)
-            self.gconf_client.notify_add('/apps/jack_mixer/vumeter_color_scheme', self.on_gconf_vumeter_color_scheme_change)
-            self.gconf_client.notify_add('/apps/jack_mixer/use_custom_widgets', self.on_gconf_use_custom_widgets_change)
+        self.set_default_preferences()
+        if xdg:
+            self.config = configparser.ConfigParser()
+            self.path = os.path.join(BaseDirectory.save_config_path('jack_mixer'), 'preferences.ini')
+            if os.path.isfile(self.path):
+                self.read_preferences()
+            else:
+                self.write_preferences()
         else:
-            self.default_meter_scale = meter_scales[0]
+            log.warning("Cannot load PyXDG. Your preferences will not be preserved across "
+                        "jack_mixer invocations")
+
+    def set_default_preferences(self):
+        self.confirm_quit = False
+        self.default_meter_scale = self.meter_scales[0]
+        self.default_slider_scale = self.slider_scales[0]
+        self.midi_behavior_mode = 0
+        self.use_custom_widgets = False
+        self.vumeter_color = '#ccb300'
+        self.vumeter_color_scheme = 'default'
+
+    def read_preferences(self):
+        self.config.read(self.path)
+        self.confirm_quit = self.config.getboolean('Preferences', 'confirm_quit',
+                                                   fallback=self.confirm_quit)
+
+        scale_id = self.config['Preferences']['default_meter_scale']
+        self.default_meter_scale = lookup_scale(self.meter_scales, scale_id)
+        if not self.default_meter_scale:
+            self.default_meter_scale = self.meter_scales[0]
+
+        scale_id = self.config['Preferences']['default_slider_scale']
+        self.default_slider_scale = lookup_scale(self.slider_scales, scale_id)
+        if not self.default_slider_scale:
             self.default_slider_scale = slider_scales[0]
-            self.vumeter_color = '#ccb300'
-            self.vumeter_color_scheme = 'default'
-            self.use_custom_widgets = False
 
-    def on_gconf_default_meter_scale_changed(self, client, connection_id, entry):
-        #print "GConf default_meter_scale changed"
-        scale_id = entry.get_value().get_string()
-        scale = lookup_scale(self.meter_scales, scale_id)
-        self.set_default_meter_scale(scale, from_gconf=True)
-
-    def set_default_meter_scale(self, scale, from_gconf=False):
+        try:
+            self.midi_behavior_mode = self.config.getint('Preferences', 'midi_behavior_mode',
+                                                         fallback=self.midi_behavior_mode)
+        except (TypeError, ValueError):
+            # use default value
+            pass
+
+        self.use_custom_widgets = self.config.getboolean('Preferences', 'use_custom_widgets',
+                                                         fallback=self.use_custom_widgets)
+        self.vumeter_color = self.config.get('Preferences', 'vumeter_color',
+                                             fallback=self.vumeter_color)
+        self.vumeter_color_scheme = self.config.get('Preferences', 'vumeter_color_scheme',
+                                                    fallback=self.vumeter_color_scheme)
+
+
+    def write_preferences(self):
+        self.config['Preferences'] = {}
+        self.config['Preferences']['confirm_quit'] = str(self.confirm_quit)
+        self.config['Preferences']['default_meter_scale'] = self.default_meter_scale.scale_id
+        self.config['Preferences']['default_slider_scale'] = self.default_slider_scale.scale_id
+        self.config['Preferences']['midi_behavior_mode'] = str(self.midi_behavior_mode)
+        self.config['Preferences']['use_custom_widgets'] = str(self.use_custom_widgets)
+        self.config['Preferences']['vumeter_color'] = self.vumeter_color
+        self.config['Preferences']['vumeter_color_scheme'] = self.vumeter_color_scheme
+        with open(self.path, 'w') as configfile:
+            self.config.write(configfile)
+            configfile.close()
+
+    def set_confirm_quit(self, confirm_quit):
+        self.confirm_quit = confirm_quit
+        if xdg:
+            self.write_preferences()
+        self.emit('confirm-quit-changed', self.confirm_quit)
+
+    def set_default_meter_scale(self, scale):
         if scale:
-            if GConf and not from_gconf:
-                self.gconf_client.set_string("/apps/jack_mixer/default_meter_scale", scale.scale_id)
-            else:
-                self.default_meter_scale = scale
-                self.emit("default-meter-scale-changed", self.default_meter_scale)
+            self.default_meter_scale = scale
+            if xdg:
+                self.write_preferences()
+            self.emit('default-meter-scale-changed', self.default_meter_scale)
         else:
-            print("Ignoring GConf default_meter_scale setting, because \"%s\" scale is not known" % scale_id)
+            log.warning('Ignoring default_meter_scale setting, because "%s" scale is not known.',
+                        scale)
 
-    def on_gconf_default_slider_scale_changed(self, client, connection_id, entry):
-        #print "GConf default_slider_scale changed"
-        scale_id = entry.get_value().get_string()
-        scale = lookup_scale(self.slider_scales, scale_id)
-        self.set_default_slider_scale(scale, from_gconf=True)
-
-    def set_default_slider_scale(self, scale, from_gconf=False):
+    def set_default_slider_scale(self, scale):
         if scale:
-            if GConf and not from_gconf:
-                self.gconf_client.set_string("/apps/jack_mixer/default_slider_scale", scale.scale_id)
-            else:
-                self.default_slider_scale = scale
-                self.emit("default-slider-scale-changed", self.default_slider_scale)
+            self.default_slider_scale = scale
+            if xdg:
+                self.write_preferences()
+            self.emit('default-slider-scale-changed', self.default_slider_scale)
         else:
-            print("Ignoring GConf default_slider_scale setting, because \"%s\" scale is not known" % scale_id)
-
-    def set_vumeter_color(self, color, from_gconf=False):
-        if GConf and not from_gconf:
-            self.gconf_client.set_string('/apps/jack_mixer/vumeter_color', color)
-        else:
-            self.vumeter_color = color
-            self.emit('vumeter-color-changed', self.vumeter_color)
-
-    def on_gconf_vumeter_color_change(self, client, connection_id, entry):
-        color = entry.get_value().get_string()
-        self.set_vumeter_color(color, from_gconf=True)
-
-    def set_vumeter_color_scheme(self, color_scheme, from_gconf=False):
-        if GConf and not from_gconf:
-            self.gconf_client.set_string('/apps/jack_mixer/vumeter_color_scheme', color_scheme)
-        else:
-            self.vumeter_color_scheme = color_scheme
-            self.emit('vumeter-color-scheme-changed', self.vumeter_color_scheme)
-
-    def on_gconf_vumeter_color_scheme_change(self, client, connection_id, entry):
-        color_scheme = entry.get_value().get_string()
-        self.set_vumeter_color_scheme(color_scheme, from_gconf=True)
-
-    def set_use_custom_widgets(self, use_custom, from_gconf=False):
-        if GConf and not from_gconf:
-            self.gconf_client.set_bool('/apps/jack_mixer/use_custom_widgets', use_custom)
-        else:
-            self.use_custom_widgets = use_custom
-            self.emit('use-custom-widgets-changed', self.use_custom_widgets)
-
-    def on_gconf_use_custom_widgets_change(self, client, connection_id, entry):
-        use_custom = entry.get_value().get_bool()
-        self.set_use_custom_widgets(use_custom, from_gconf=True)
+            log.warning('Ignoring default_slider_scale setting, because "%s" scale is not known.',
+                        scale)
+
+    def set_midi_behavior_mode(self, mode):
+        self.midi_behavior_mode = int(mode)
+        self.emit_midi_behavior_mode()
+
+    def set_use_custom_widgets(self, use_custom):
+        self.use_custom_widgets = use_custom
+        if xdg:
+            self.write_preferences()
+        self.emit('use-custom-widgets-changed', self.use_custom_widgets)
+
+    def set_vumeter_color(self, color):
+        self.vumeter_color = color
+        if xdg:
+            self.write_preferences()
+        self.emit('vumeter-color-changed', self.vumeter_color)
+
+    def set_vumeter_color_scheme(self, color_scheme):
+        self.vumeter_color_scheme = color_scheme
+        if xdg:
+            self.write_preferences()
+        self.emit('vumeter-color-scheme-changed', self.vumeter_color_scheme)
+
+    def get_confirm_quit(self):
+        return self.confirm_quit
 
     def get_default_meter_scale(self):
         return self.default_meter_scale
@@ -145,28 +169,79 @@ class Factory(GObject.GObject):
     def get_default_slider_scale(self):
         return self.default_slider_scale
 
+    def get_midi_behavior_mode(self):
+        return self.midi_behavior_mode
+
+    def get_use_custom_widgets(self):
+        return self.use_custom_widgets
+
     def get_vumeter_color(self):
         return self.vumeter_color
 
     def get_vumeter_color_scheme(self):
         return self.vumeter_color_scheme
 
-    def get_use_custom_widgets(self):
-        return self.use_custom_widgets
-
-
-GObject.signal_new("default-meter-scale-changed", Factory,
-                GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
-                None, [GObject.TYPE_PYOBJECT])
-GObject.signal_new("default-slider-scale-changed", Factory,
-                GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
-                None, [GObject.TYPE_PYOBJECT])
+    def emit_midi_behavior_mode(self):
+        self.emit('midi-behavior-mode-changed', self.midi_behavior_mode)
+
+    @classmethod
+    def serialization_name(cls):
+        return 'gui_factory'
+
+    def serialize(self, object_backend):
+        object_backend.add_property('confirm-quit', str(self.get_confirm_quit()))
+        object_backend.add_property('default_meter_scale',
+                                    self.get_default_meter_scale().scale_id)
+        object_backend.add_property('default_slider_scale',
+                                    self.get_default_slider_scale().scale_id)
+        object_backend.add_property('midi_behavior_mode', str(self.get_midi_behavior_mode()))
+        object_backend.add_property('use_custom_widgets', str(self.get_use_custom_widgets()))
+        object_backend.add_property('vumeter_color', self.get_vumeter_color())
+        object_backend.add_property('vumeter_color_scheme', self.get_vumeter_color_scheme())
+
+    def unserialize_property(self, name, value):
+        if name == 'confirm_quit':
+            self.set_confirm_quit(value == 'True')
+            return True
+        elif name == 'default_meter_scale':
+            self.set_default_meter_scale(lookup_scale(self.meter_scales, value))
+            return True
+        elif name == 'default_slider_scale':
+            self.set_default_slider_scale(lookup_scale(self.slider_scales, value))
+            return True
+        elif name == 'midi_behavior_mode':
+            self.set_midi_behavior_mode(int(value))
+            return True
+        elif name == 'use_custom_widgets':
+            self.set_use_custom_widgets(value == 'True')
+            return True
+        elif name == 'vumeter_color':
+            self.set_vumeter_color(value)
+            return True
+        elif name == 'vumeter_color_scheme':
+            self.set_vumeter_color_scheme(value)
+            return True
+        return False
+
+
+GObject.signal_new('confirm-quit-changed', Factory,
+                   GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
+                   None, [bool])
+GObject.signal_new('default-meter-scale-changed', Factory,
+                   GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
+                   None, [GObject.TYPE_PYOBJECT])
+GObject.signal_new('default-slider-scale-changed', Factory,
+                   GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
+                   None, [GObject.TYPE_PYOBJECT])
+GObject.signal_new('midi-behavior-mode-changed', Factory,
+                   GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
+                   None, [int])
+GObject.signal_new('use-custom-widgets-changed', Factory,
+                   GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
+                   None, [bool])
 GObject.signal_new('vumeter-color-changed', Factory,
-                GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
-                None, [str])
+                   GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
+                   None, [str])
 GObject.signal_new('vumeter-color-scheme-changed', Factory,
-                GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
-                None, [str])
-GObject.signal_new('use-custom-widgets-changed', Factory,
-                GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
-                None, [bool])
+                   GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
+                   None, [str])