]> git.0d.be Git - jack_mixer.git/blob - gui.py
Add a preferences dialog
[jack_mixer.git] / gui.py
1 #!/usr/bin/env python
2 #
3 # This file is part of jack_mixer
4 #
5 # Copyright (C) 2006 Nedko Arnaudov <nedko@arnaudov.name>
6 #  
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; version 2 of the License
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19
20 import gtk
21 import gobject
22
23 try:
24     import gconf
25 except:
26     print "Cannot load Python bindings for GConf, your preferences will not be preserved across jack_mixer invocations"
27     gconf = None
28
29 def lookup_scale(scales, scale_id):
30     for scale in scales:
31         if scale_id == scale.scale_id:
32             return scale
33     return None
34
35 class factory(gobject.GObject):
36     def __init__(self, glade_xml, topwindow, meter_scales, slider_scales):
37         gobject.GObject.__init__(self)
38         self.glade_xml = glade_xml
39         self.topwindow = topwindow
40         self.meter_scales = meter_scales
41         self.slider_scales = slider_scales
42
43         if gconf:
44             self.gconf_client = gconf.client_get_default()
45
46             scale_id = self.gconf_client.get_string("/apps/jack_mixer/default_meter_scale")
47             self.default_meter_scale = lookup_scale(meter_scales, scale_id)
48             if not self.default_meter_scale:
49                 self.default_meter_scale = meter_scales[0]
50
51             scale_id = self.gconf_client.get_string("/apps/jack_mixer/default_slider_scale")
52             self.default_slider_scale = lookup_scale(slider_scales, scale_id)
53             if not self.default_slider_scale:
54                 self.default_slider_scale = slider_scales[0]
55
56             self.gconf_client.add_dir("/apps/jack_mixer", gconf.CLIENT_PRELOAD_NONE)
57             self.gconf_client.notify_add("/apps/jack_mixer/default_meter_scale", self.on_gconf_default_meter_scale_changed)
58             self.gconf_client.notify_add("/apps/jack_mixer/default_slider_scale", self.on_gconf_default_slider_scale_changed)
59         else:
60             self.default_meter_scale = meter_scales[0]
61             self.default_slider_scale = slider_scales[0]
62
63     def on_gconf_default_meter_scale_changed(self, client, connection_id, entry, args):
64         #print "GConf default_meter_scale changed"
65         scale_id = entry.get_value().get_string()
66         scale = lookup_scale(self.meter_scales, scale_id)
67         self.set_default_meter_scale(scale, from_gconf=True)
68
69     def set_default_meter_scale(self, scale, from_gconf=False):
70         if scale:
71             if gconf and not from_gconf:
72                 self.gconf_client.set_string("/apps/jack_mixer/default_meter_scale", scale.scale_id)
73             else:
74                 self.default_meter_scale = scale
75                 self.emit("default-meter-scale-changed", self.default_meter_scale)
76         else:
77             print "Ignoring GConf default_meter_scale setting, because \"%s\" scale is not known" % scale_id
78
79     def on_gconf_default_slider_scale_changed(self, client, connection_id, entry, args):
80         #print "GConf default_slider_scale changed"
81         scale_id = entry.get_value().get_string()
82         scale = lookup_scale(self.slider_scales, scale_id)
83         self.set_default_slider_scale(scale, from_gconf=True)
84
85     def set_default_slider_scale(self, scale, from_gconf=False):
86         if scale:
87             if gconf and not from_gconf:
88                 self.gconf_client.set_string("/apps/jack_mixer/default_slider_scale", scale.scale_id)
89             else:
90                 self.default_slider_scale = scale
91                 self.emit("default-slider-scale-changed", self.default_slider_scale)
92         else:
93             print "Ignoring GConf default_slider_scale setting, because \"%s\" scale is not known" % scale_id
94
95     def run_dialog_add_channel(self):
96         dialog = self.glade_xml.get_widget("dialog_add_channel")
97         name_entry = self.glade_xml.get_widget("new_channel_name")
98         name_entry.set_text("")
99         dialog.set_transient_for(self.topwindow)
100         dialog.show()
101         ret = dialog.run()
102         dialog.hide()
103
104         if ret == gtk.RESPONSE_OK:
105             result = {
106                 'name': name_entry.get_text(),
107                 'stereo': self.glade_xml.get_widget("new_channel_stereo").get_active()
108                 }
109             return result
110         else:
111             return None
112
113     def run_dialog_rename_channel(self, name):
114         dialog = self.glade_xml.get_widget("dialog_rename_channel")
115         name_entry = self.glade_xml.get_widget("channel_name")
116         name_entry.set_text(name)
117         dialog.set_transient_for(self.topwindow)
118         dialog.show()
119         ret = dialog.run()
120         dialog.hide()
121         if ret == gtk.RESPONSE_OK:
122             return name_entry.get_text()
123         else:
124             return None
125
126     def get_default_meter_scale(self):
127         return self.default_meter_scale
128
129     def get_default_slider_scale(self):
130         return self.default_slider_scale
131
132 gobject.signal_new("default-meter-scale-changed", factory, gobject.SIGNAL_RUN_FIRST | gobject.SIGNAL_ACTION, gobject.TYPE_NONE, [gobject.TYPE_PYOBJECT])
133 gobject.signal_new("default-slider-scale-changed", factory, gobject.SIGNAL_RUN_FIRST | gobject.SIGNAL_ACTION, gobject.TYPE_NONE, [gobject.TYPE_PYOBJECT])