Added preference window.
[AdvancedVolumeMixer.git] / prefs.js
blobbbe887495f52abeb949adf6c188b8afd565e2528
1 // vi: et sw=2 fileencoding=utf8
2 //
4 const Gtk = imports.gi.Gtk;
5 const GObject = imports.gi.GObject;
7 const Gettext = imports.gettext.domain('gnome-shell-extensions-AdvancedVolumeMixer');
8 const _ = Gettext.gettext;
10 const AVM = imports.misc.extensionUtils.getCurrentExtension();
11 const Lib = AVM.imports.lib;
13 let gsettings;
14 let settings;
16 function init() {
17   gsettings = Lib.getSettings(AVM);
18   settings = {
19     position: {
20       type: "e",
21       label: _("Position of volume mixer"),
22       list: [
23         {nick: "left", name: _("Left"), id: 0},
24         {nick: "center", name: _("Center"), id: 1},
25         {nick: "right", name: _("Right"), id: 2},
26         {nick: "aggregatedMenu", name: _("Aggregated menu"), id: 3},
27       ]
28     }
29   };
32 function buildPrefsWidget() {
33   let frame = new Gtk.Box({
34     orientation: Gtk.Orientation.VERTICAL,
35     border_width: 10
36   });
37   let vbox = new Gtk.Box({
38     orientation: Gtk.Orientation.VERTICAL,
39     margin: 20, margin_top: 10
40   });
41   let hbox;
43   for (setting in settings) {
44     hbox = buildHbox(settings, setting);
45     vbox.add(hbox);
46   }
48   frame.add(vbox);
49   frame.show_all();
51   return frame;
54 function buildHbox(settings, setting) {
55   let hbox;
57   if (settings[setting].type == 's') {
58     hbox = createStringSetting(settings, setting);
59   } else if (settings[setting].type == "i") {
60     hbox = createIntSetting(settings, setting);
61   } else if (settings[setting].type == "b") {
62     hbox = createBoolSetting(settings, setting);
63   } else if (settings[setting].type == "r") {
64     hbox = createRangeSetting(settings, setting);
65   } else if (settings[setting].type == "e") {
66     hbox = createEnumSetting(settings, setting);
67   }
69   return hbox;
73 function createEnumSetting(settings, setting) {
74   let hbox = new Gtk.Box({
75     orientation: Gtk.Orientation.HORIZONTAL,
76     margin_top: 5
77   });
79   let setting_label = new Gtk.Label({
80     label: settings[setting].label,
81     xalign: 0
82   });
84   let model = new Gtk.ListStore();
85   model.set_column_types([GObject.TYPE_INT, GObject.TYPE_STRING]);
86   let setting_enum = new Gtk.ComboBox({model: model});
87   setting_enum.get_style_context().add_class(Gtk.STYLE_CLASS_RAISED);
88   let renderer = new Gtk.CellRendererText();
89   setting_enum.pack_start(renderer, true);
90   setting_enum.add_attribute(renderer, 'text', 1);
92   for (let i=0; i<settings[setting].list.length; i++) {
93     let item = settings[setting].list[i];
94     let iter = model.append();
95     model.set(iter, [0, 1], [item.id, item.name]);
96     if (item.id == gsettings.get_enum(setting.replace('_', '-'))) {
97       setting_enum.set_active(item.id);
98     }
99   }
101   setting_enum.connect('changed', function(entry) {
102     let [success, iter] = setting_enum.get_active_iter();
103     if (!success) {
104       return;
105     }
107     let id = model.get_value(iter, 0)
108     gsettings.set_enum(setting.replace('_', '-'), id);
109   });
111   if (settings[setting].help) {
112     setting_label.set_tooltip_text(settings[setting].help)
113     setting_enum.set_tooltip_text(settings[setting].help)
114   }
116   hbox.pack_start(setting_label, true, true, 0);
117   hbox.add(setting_enum);
119   return hbox;