AppOutputStreamSlider: Fixed scrolling and added description if stream has no name.
[AdvancedVolumeMixer.git] / prefs.js
blobc06ac4d74fdc2fdad2546a02179933eec848270a
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     output_type: {
30       type: "e",
31       label: _("Type of output slider"),
32       list: [
33         {nick: "OutputStreamSlider", name: _("Default"), id: 0},
34         {nick: "AppOutputStreamSlider", name: _("New"), id: 1},
35       ]
36     }
37   };
40 function buildPrefsWidget() {
41   let frame = new Gtk.Box({
42     orientation: Gtk.Orientation.VERTICAL,
43     border_width: 10
44   });
45   let vbox = new Gtk.Box({
46     orientation: Gtk.Orientation.VERTICAL,
47     margin: 20, margin_top: 10
48   });
49   let hbox;
51   for (setting in settings) {
52     hbox = buildHbox(settings, setting);
53     vbox.add(hbox);
54   }
56   frame.add(vbox);
57   frame.show_all();
59   return frame;
62 function buildHbox(settings, setting) {
63   let hbox;
65   if (settings[setting].type == 's') {
66     hbox = createStringSetting(settings, setting);
67   } else if (settings[setting].type == "i") {
68     hbox = createIntSetting(settings, setting);
69   } else if (settings[setting].type == "b") {
70     hbox = createBoolSetting(settings, setting);
71   } else if (settings[setting].type == "r") {
72     hbox = createRangeSetting(settings, setting);
73   } else if (settings[setting].type == "e") {
74     hbox = createEnumSetting(settings, setting);
75   }
77   return hbox;
81 function createEnumSetting(settings, setting) {
82   let hbox = new Gtk.Box({
83     orientation: Gtk.Orientation.HORIZONTAL,
84     margin_top: 5
85   });
87   let setting_label = new Gtk.Label({
88     label: settings[setting].label,
89     xalign: 0
90   });
92   let model = new Gtk.ListStore();
93   model.set_column_types([GObject.TYPE_INT, GObject.TYPE_STRING]);
94   let setting_enum = new Gtk.ComboBox({model: model});
95   setting_enum.get_style_context().add_class(Gtk.STYLE_CLASS_RAISED);
96   let renderer = new Gtk.CellRendererText();
97   setting_enum.pack_start(renderer, true);
98   setting_enum.add_attribute(renderer, 'text', 1);
100   for (let i=0; i<settings[setting].list.length; i++) {
101     let item = settings[setting].list[i];
102     let iter = model.append();
103     model.set(iter, [0, 1], [item.id, item.name]);
104     if (item.id == gsettings.get_enum(setting.replace('_', '-'))) {
105       setting_enum.set_active(item.id);
106     }
107   }
109   setting_enum.connect('changed', function(entry) {
110     let [success, iter] = setting_enum.get_active_iter();
111     if (!success) {
112       return;
113     }
115     let id = model.get_value(iter, 0)
116     gsettings.set_enum(setting.replace('_', '-'), id);
117   });
119   if (settings[setting].help) {
120     setting_label.set_tooltip_text(settings[setting].help)
121     setting_enum.set_tooltip_text(settings[setting].help)
122   }
124   hbox.pack_start(setting_label, true, true, 0);
125   hbox.add(setting_enum);
127   return hbox;