-#!/usr/bin/env python
-#
# This file is part of jack_mixer
#
# Copyright (C) 2006 Nedko Arnaudov <nedko@arnaudov.name>
-#
+#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-import gtk
-import gobject
+import configparser
+import logging
+import os
+
+import gi
+from gi.repository import GObject
+from serialization import SerializedObject
try:
- 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:
return scale
return None
-class factory(gobject.GObject):
- def __init__(self, glade_xml, topwindow, meter_scales, slider_scales):
- gobject.GObject.__init__(self)
- self.glade_xml = glade_xml
+
+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.gconf_client.add_dir("/apps/jack_mixer", gconf.CLIENT_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.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]
- def on_gconf_default_meter_scale_changed(self, client, connection_id, entry, args):
- #print "GConf default_meter_scale changed"
- scale_id = entry.get_value().get_string()
- scale = lookup_scale(self.meter_scales, scale_id)
+ 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:
self.default_meter_scale = scale
- self.emit("default-meter-scale-changed", self.default_meter_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, args):
- #print "GConf default_slider_scale changed"
- scale_id = entry.get_value().get_string()
- scale = lookup_scale(self.slider_scales, scale_id)
+ def set_default_slider_scale(self, scale):
if scale:
self.default_slider_scale = scale
- 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 run_dialog_add_channel(self):
- dialog = self.glade_xml.get_widget("dialog_add_channel")
- name_entry = self.glade_xml.get_widget("new_channel_name")
- name_entry.set_text("")
- dialog.set_transient_for(self.topwindow)
- dialog.show()
- ret = dialog.run()
- dialog.hide()
-
- if ret == gtk.RESPONSE_OK:
- result = {
- 'name': name_entry.get_text(),
- 'stereo': self.glade_xml.get_widget("new_channel_stereo").get_active()
- }
- return result
+ if xdg:
+ self.write_preferences()
+ self.emit('default-slider-scale-changed', self.default_slider_scale)
else:
- return None
-
- def run_dialog_rename_channel(self, name):
- dialog = self.glade_xml.get_widget("dialog_rename_channel")
- name_entry = self.glade_xml.get_widget("channel_name")
- name_entry.set_text(name)
- dialog.set_transient_for(self.topwindow)
- dialog.show()
- ret = dialog.run()
- dialog.hide()
- if ret == gtk.RESPONSE_OK:
- return name_entry.get_text()
- else:
- return None
-
- def run_dialog_choose_meter_scale(self):
- dialog = self.glade_xml.get_widget("dialog_choose_scale")
- dialog.set_title("Choose meter scale")
- dialog.set_transient_for(self.topwindow)
-
- available_scales = self.glade_xml.get_widget("available_scales")
- store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_PYOBJECT)
- renderer = gtk.CellRendererText()
-
- column_scale = gtk.TreeViewColumn("Scale", renderer, text=0)
- column_description = gtk.TreeViewColumn("Description", renderer, text=1)
-
- available_scales.append_column(column_scale)
- available_scales.append_column(column_description)
-
- selection = available_scales.get_selection()
-
- for scale in self.meter_scales:
- #print "%s: %s" % (scale.scale_id, scale.description)
-
- row = scale.scale_id, scale.description, scale
- current_iter = store.append(row)
- if scale is self.default_meter_scale:
- selected_iter = current_iter
- #print "Selected scale is %s" % scale.scale_id
-
- available_scales.set_model(store)
- selection.select_iter(selected_iter)
-
- dialog.show()
- while True:
- ret = dialog.run()
-
- if ret == gtk.RESPONSE_OK or ret == gtk.RESPONSE_APPLY:
- scale = store.get(selection.get_selected()[1], 2)[0]
- if gconf:
- # we are setting gconf, and then notified for change
- 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)
-
- if ret == gtk.RESPONSE_OK or ret == gtk.RESPONSE_CANCEL or ret == gtk.RESPONSE_DELETE_EVENT:
- break
-
- dialog.hide()
-
- def run_dialog_choose_slider_scale(self):
- dialog = self.glade_xml.get_widget("dialog_choose_scale")
- dialog.set_title("Choose slider scale")
- dialog.set_transient_for(self.topwindow)
-
- available_scales = self.glade_xml.get_widget("available_scales")
- store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_PYOBJECT)
- renderer = gtk.CellRendererText()
-
- column_scale = gtk.TreeViewColumn("Scale", renderer, text=0)
- column_description = gtk.TreeViewColumn("Description", renderer, text=1)
-
- available_scales.append_column(column_scale)
- available_scales.append_column(column_description)
-
- selection = available_scales.get_selection()
-
- for scale in self.slider_scales:
- #print "%s: %s" % (scale.scale_id, scale.description)
-
- row = scale.scale_id, scale.description, scale
- current_iter = store.append(row)
- if scale is self.default_slider_scale:
- selected_iter = current_iter
- #print "Selected scale is %s" % scale.scale_id
-
- available_scales.set_model(store)
- selection.select_iter(selected_iter)
-
- dialog.show()
- while True:
- ret = dialog.run()
-
- if ret == gtk.RESPONSE_OK or ret == gtk.RESPONSE_APPLY:
- scale = store.get(selection.get_selected()[1], 2)[0]
- if gconf:
- # we are setting gconf, and then notified for change
- 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)
-
- if ret == gtk.RESPONSE_OK or ret == gtk.RESPONSE_CANCEL or ret == gtk.RESPONSE_DELETE_EVENT:
- break
-
- dialog.hide()
+ 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
def get_default_slider_scale(self):
return self.default_slider_scale
-gobject.signal_new("default-meter-scale-changed", factory, gobject.SIGNAL_RUN_FIRST | gobject.SIGNAL_ACTION, gobject.TYPE_NONE, [gobject.TYPE_PYOBJECT])
-gobject.signal_new("default-slider-scale-changed", factory, gobject.SIGNAL_RUN_FIRST | gobject.SIGNAL_ACTION, gobject.TYPE_NONE, [gobject.TYPE_PYOBJECT])
+ 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 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.signal_new('vumeter-color-scheme-changed', Factory,
+ GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
+ None, [str])