Minor code re-ordering for clarity
[jack_mixer.git] / preferences.py
blob8a68b78708867d5906d0d2b77158b5b11942d0d1
1 # This file is part of jack_mixer
3 # Copyright (C) 2006 Nedko Arnaudov <nedko@arnaudov.name>
4 # Copyright (C) 2009 Frederic Peters <fpeters@0d.be>
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; version 2 of the License
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 from os.path import expanduser, isdir
21 from gi.repository import Gtk
22 from gi.repository import Gdk
23 from gi.repository import GObject
26 class PreferencesDialog(Gtk.Dialog):
27 def __init__(self, parent):
28 self.app = parent
29 GObject.GObject.__init__(self)
30 self.set_title("Preferences")
31 self.create_ui()
32 self.connect("response", self.on_response_cb)
33 self.connect("delete-event", self.on_response_cb)
35 def create_frame(self, label, child):
36 frame = Gtk.Frame()
37 frame.set_label("")
38 frame.set_border_width(3)
39 frame.set_shadow_type(Gtk.ShadowType.NONE)
40 frame.get_label_widget().set_markup("<b>%s</b>" % label)
42 child.set_margin_top(10)
43 child.set_margin_bottom(10)
44 frame.add(child)
46 return frame
48 def create_ui(self):
49 vbox = self.get_content_area()
51 path_vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
52 self.path_entry = Gtk.Entry()
53 self.path_entry.connect("changed", self.on_path_entry_changed)
54 path_vbox.pack_start(self.path_entry, False, False, 3)
55 self.project_path_chooser = Gtk.FileChooserButton(
56 title="Default Project Path", action=Gtk.FileChooserAction.SELECT_FOLDER
58 project_path = self.app.gui_factory.default_project_path
59 path_vbox.pack_start(self.project_path_chooser, False, False, 3)
61 if project_path:
62 self.path_entry.set_text(project_path)
64 if isdir(expanduser(project_path)):
65 self.project_path_chooser.set_current_folder(expanduser(project_path))
67 self.project_path_chooser.connect("file-set", self.on_project_path_selected)
68 vbox.pack_start(self.create_frame("Default Project Path", path_vbox), True, True, 0)
70 interface_vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
71 self.confirm_quit_checkbutton = Gtk.CheckButton("Confirm quit")
72 self.confirm_quit_checkbutton.set_tooltip_text(
73 "Always ask for confirmation before " "quitting the application"
75 self.confirm_quit_checkbutton.set_active(self.app.gui_factory.get_confirm_quit())
76 self.confirm_quit_checkbutton.connect("toggled", self.on_confirm_quit_toggled)
77 interface_vbox.pack_start(self.confirm_quit_checkbutton, True, True, 3)
79 self.custom_widgets_checkbutton = Gtk.CheckButton("Use custom widgets")
80 self.custom_widgets_checkbutton.set_active(self.app.gui_factory.get_use_custom_widgets())
81 self.custom_widgets_checkbutton.connect("toggled", self.on_custom_widget_toggled)
82 interface_vbox.pack_start(self.custom_widgets_checkbutton, True, True, 3)
84 self.vumeter_color_checkbutton = Gtk.CheckButton("Use custom vumeter color")
85 self.vumeter_color_checkbutton.set_active(
86 self.app.gui_factory.get_vumeter_color_scheme() == "solid"
88 self.vumeter_color_checkbutton.connect("toggled", self.on_vumeter_color_change)
89 interface_vbox.pack_start(self.vumeter_color_checkbutton, True, True, 3)
91 self.custom_color_box = hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
92 interface_vbox.pack_start(hbox, True, True, 3)
94 hbox.set_sensitive(self.vumeter_color_checkbutton.get_active())
95 hbox.pack_start(Gtk.Label("Custom color:"), False, True, 5)
96 self.vumeter_color_picker = Gtk.ColorButton()
97 self.vumeter_color_picker.set_color(
98 Gdk.color_parse(self.app.gui_factory.get_vumeter_color())
100 self.vumeter_color_picker.connect("color-set", self.on_vumeter_color_change)
101 hbox.pack_start(self.vumeter_color_picker, True, True, 0)
103 vbox.pack_start(self.create_frame("Interface", interface_vbox), True, True, 0)
105 table = Gtk.Table(2, 2, False)
106 table.set_row_spacings(5)
107 table.set_col_spacings(5)
109 table.attach(Gtk.Label(label="Meter scale"), 0, 1, 0, 1)
110 self.meter_scale_combo = self.create_meter_store_and_combo()
111 table.attach(self.meter_scale_combo, 1, 2, 0, 1)
113 table.attach(Gtk.Label(label="Slider scale"), 0, 1, 1, 2)
114 self.slider_scale_combo = self.create_slider_store_and_combo()
115 table.attach(self.slider_scale_combo, 1, 2, 1, 2)
117 vbox.pack_start(self.create_frame("Scales", table), True, True, 0)
119 table = Gtk.Table(1, 2, False)
120 table.set_row_spacings(5)
121 table.set_col_spacings(5)
123 table.attach(Gtk.Label(label="Control Behavior"), 0, 1, 0, 1)
124 self.midi_behavior_combo = self.create_midi_behavior_combo()
125 table.attach(self.midi_behavior_combo, 1, 2, 0, 1)
127 vbox.pack_start(self.create_frame("MIDI", table), True, True, 0)
128 self.vbox.show_all()
130 self.add_button(Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)
132 def create_meter_store_and_combo(self):
133 store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_PYOBJECT)
134 for scale in self.app.meter_scales:
135 row = scale.scale_id, scale
136 current_iter = store.append(row)
137 if scale is self.app.gui_factory.get_default_meter_scale():
138 active_iter = current_iter
139 self.meter_store = store
141 meter_scale_combo = Gtk.ComboBox.new_with_model(store)
142 cell = Gtk.CellRendererText()
143 meter_scale_combo.pack_start(cell, True)
144 meter_scale_combo.add_attribute(cell, "text", 0)
145 meter_scale_combo.set_active_iter(active_iter)
146 meter_scale_combo.connect("changed", self.on_meter_scale_combo_changed)
148 return meter_scale_combo
150 def create_slider_store_and_combo(self):
151 store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_PYOBJECT)
152 for scale in self.app.slider_scales:
153 row = scale.scale_id, scale
154 current_iter = store.append(row)
155 if scale is self.app.gui_factory.get_default_slider_scale():
156 active_iter = current_iter
157 self.slider_store = store
159 slider_scale_combo = Gtk.ComboBox.new_with_model(store)
160 cell = Gtk.CellRendererText()
161 slider_scale_combo.pack_start(cell, True)
162 slider_scale_combo.add_attribute(cell, "text", 0)
163 slider_scale_combo.set_active_iter(active_iter)
164 slider_scale_combo.connect("changed", self.on_slider_scale_combo_changed)
166 return slider_scale_combo
168 def create_midi_behavior_combo(self):
169 combo = Gtk.ComboBoxText()
170 for i, mode in enumerate(self.app.gui_factory.midi_behavior_modes):
171 combo.append(str(i), mode)
172 combo.set_active(self.app.gui_factory.get_midi_behavior_mode())
173 combo.connect("changed", self.on_midi_behavior_combo_changed)
174 return combo
176 def on_response_cb(self, dlg, response_id, *args):
177 self.app.preferences_dialog = None
178 self.destroy()
180 def on_path_entry_changed(self, *args):
181 path = self.path_entry.get_text().strip()
183 if path:
184 fullpath = expanduser(path)
186 if isdir(fullpath):
187 self.project_path_chooser.set_current_folder(fullpath)
188 self.app.gui_factory.set_default_project_path(path)
190 def on_project_path_selected(self, *args):
191 path = self.project_path_chooser.get_current_folder()
192 self.path_entry.set_text(path)
193 self.app.gui_factory.set_default_project_path(path)
195 def on_meter_scale_combo_changed(self, *args):
196 active_iter = self.meter_scale_combo.get_active_iter()
197 scale = self.meter_store.get(active_iter, 1)[0]
198 self.app.gui_factory.set_default_meter_scale(scale)
200 def on_slider_scale_combo_changed(self, *args):
201 active_iter = self.slider_scale_combo.get_active_iter()
202 scale = self.slider_store.get(active_iter, 1)[0]
203 self.app.gui_factory.set_default_slider_scale(scale)
205 def on_midi_behavior_combo_changed(self, *args):
206 active = self.midi_behavior_combo.get_active()
207 self.app.gui_factory.set_midi_behavior_mode(active)
209 def on_vumeter_color_change(self, *args):
210 color_scheme = "default"
211 if self.vumeter_color_checkbutton.get_active():
212 color_scheme = "solid"
213 self.app.gui_factory.set_vumeter_color_scheme(color_scheme)
215 color = self.vumeter_color_picker.get_color().to_string()
216 self.app.gui_factory.set_vumeter_color(color)
218 self.custom_color_box.set_sensitive(self.vumeter_color_checkbutton.get_active())
220 def on_confirm_quit_toggled(self, *args):
221 self.app.gui_factory.set_confirm_quit(self.confirm_quit_checkbutton.get_active())
223 def on_custom_widget_toggled(self, *args):
224 self.app.gui_factory.set_use_custom_widgets(self.custom_widgets_checkbutton.get_active())