.dotfiles/.local/share/gnome-shell/extensions/ding@rastersoft.com/app/prefswindow.js

216 lines
7.5 KiB
JavaScript

'use strict';
const GObject = imports.gi.GObject;
const Gettext = imports.gettext;
const Gio = imports.gi.Gio;
const GioSSS = Gio.SettingsSchemaSource;
const GLib = imports.gi.GLib;
var _ = Gettext.domain('ding').gettext;
var Gtk;
/**
*
* @param path
* @param schema
*/
function get_schema(path, schema) {
// check if this extension was built with "make zip-file", and thus
// has the schema files in a subfolder
// otherwise assume that extension has been installed in the
// same prefix as gnome-shell (and therefore schemas are available
// in the standard folders)
let schemaSource;
let schemaFile = Gio.File.new_for_path(GLib.build_filenamev([path, 'schemas', 'gschemas.compiled']));
if (schemaFile.query_exists(null)) {
schemaSource = GioSSS.new_from_directory(GLib.build_filenamev([path, 'schemas']), GioSSS.get_default(), false);
} else {
schemaFile = Gio.File.new_for_path(GLib.build_filenamev([path, '..', 'schemas', 'gschemas.compiled']));
if (schemaFile.query_exists(null)) {
schemaSource = GioSSS.new_from_directory(GLib.build_filenamev([path, '..', 'schemas']), GioSSS.get_default(), false);
} else {
schemaSource = GioSSS.get_default();
}
}
let schemaObj = schemaSource.lookup(schema, true);
if (!schemaObj) {
throw new Error(`Schema ${schema} could not be found for extension ` + '. Please check your installation.');
}
return new Gio.Settings({settings_schema: schemaObj});
}
/**
*
* @param _Gtk
* @param desktopSettings
* @param nautilusSettings
* @param gtkSettings
*/
function preferencesFrame(_Gtk, desktopSettings, nautilusSettings, gtkSettings) {
Gtk = _Gtk;
let frame = new Gtk.Box({
orientation: Gtk.Orientation.VERTICAL,
spacing: 10,
margin_top: 10,
margin_bottom: 10,
margin_start: 10,
margin_end: 10,
});
if (!frame.add) {
frame.add = frame.append;
}
frame.add(buildSelector(desktopSettings, 'icon-size', _('Size for the desktop icons'), {'tiny': _('Tiny'), 'small': _('Small'), 'standard': _('Standard'), 'large': _('Large')}));
frame.add(buildSwitcher(desktopSettings, 'show-home', _('Show the personal folder in the desktop')));
frame.add(buildSwitcher(desktopSettings, 'show-trash', _('Show the trash icon in the desktop')));
frame.add(buildSwitcher(desktopSettings, 'show-volumes', _('Show external drives in the desktop')));
frame.add(buildSwitcher(desktopSettings, 'show-network-volumes', _('Show network drives in the desktop')));
frame.add(buildSelector(desktopSettings,
'start-corner',
_('New icons alignment'),
{
'top-left': _('Top-left corner'),
'top-right': _('Top-right corner'),
'bottom-left': _('Bottom-left corner'),
'bottom-right': _('Bottom-right corner'),
}));
frame.add(buildSwitcher(desktopSettings, 'add-volumes-opposite', _('Add new drives to the opposite side of the screen')));
frame.add(buildSwitcher(desktopSettings, 'show-drop-place', _("Highlight the drop place during Drag'n'Drop")));
frame.add(buildSwitcher(desktopSettings, 'use-nemo', _('Use Nemo to open folders')));
frame.add(buildSwitcher(desktopSettings, 'show-link-emblem', _('Add an emblem to soft links')));
frame.add(buildSwitcher(desktopSettings, 'dark-text-in-labels', _('Use dark text in icon labels')));
frame.add(new Gtk.Separator({orientation: Gtk.Orientation.HORIZONTAL}));
// Nautilus options
let frameLabel = new Gtk.Label({
label: `<b>${_('Settings shared with Nautilus')}</b>`,
use_markup: true,
});
let nautilusFrame = new Gtk.Frame({label_widget: frameLabel});
let nautilusBox = new Gtk.Box({
orientation: Gtk.Orientation.VERTICAL,
margin_top: 5,
margin_bottom: 5,
margin_start: 5,
margin_end: 5,
spacing: 10,
});
if (nautilusFrame.add) {
nautilusFrame.add(nautilusBox);
} else {
nautilusFrame.set_child(nautilusBox);
}
frame.add(nautilusFrame);
if (!nautilusBox.add) {
nautilusBox.add = nautilusBox.append;
}
nautilusBox.add(buildSelector(nautilusSettings, 'click-policy', _('Click type for open files'), {'single': _('Single click'), 'double': _('Double click')}));
nautilusBox.add(buildSwitcher(gtkSettings, 'show-hidden', _('Show hidden files')));
nautilusBox.add(buildSwitcher(nautilusSettings, 'show-delete-permanently', _('Show a context menu item to delete permanently')));
// Gnome Shell 40 removed this option
try {
nautilusBox.add(buildSelector(nautilusSettings,
'executable-text-activation',
_('Action to do when launching a program from the desktop'), {
'display': _('Display the content of the file'),
'launch': _('Launch the file'),
'ask': _('Ask what to do'),
}));
} catch (e) {
}
nautilusBox.add(buildSelector(nautilusSettings,
'show-image-thumbnails',
_('Show image thumbnails'), {
'never': _('Never'),
'local-only': _('Local files only'),
'always': _('Always'),
}));
return frame;
}
/**
*
* @param settings
* @param key
* @param labelText
*/
function buildSwitcher(settings, key, labelText) {
let hbox = new Gtk.Box({orientation: Gtk.Orientation.HORIZONTAL, spacing: 10});
let label = new Gtk.Label({label: labelText, xalign: 0});
if (settings) {
var status = settings.get_boolean(key);
} else {
var status = false;
}
let switcher = new Gtk.Switch({active: status});
label.set_hexpand(true);
switcher.set_hexpand(false);
switcher.set_halign(Gtk.Align.END);
if (settings) {
settings.bind(key, switcher, 'active', 3);
} else {
switcher.sensitive = false;
}
if (hbox.pack_start) {
hbox.pack_start(label, true, true, 0);
hbox.add(switcher);
} else {
hbox.append(label);
hbox.append(switcher);
}
return hbox;
}
/**
*
* @param settings
* @param key
* @param labelText
* @param elements
*/
function buildSelector(settings, key, labelText, elements) {
let listStore = new Gtk.ListStore();
listStore.set_column_types([GObject.TYPE_STRING, GObject.TYPE_STRING]);
if (settings) {
let schemaKey = settings.settings_schema.get_key(key);
let values = schemaKey.get_range().get_child_value(1).get_child_value(0).get_strv();
for (let val of values) {
let iter = listStore.append();
let visibleText = val;
if (visibleText in elements) {
visibleText = elements[visibleText];
}
listStore.set(iter, [0, 1], [visibleText, val]);
}
}
let hbox = new Gtk.Box({orientation: Gtk.Orientation.HORIZONTAL, spacing: 10});
let label = new Gtk.Label({label: labelText, xalign: 0});
let combo = new Gtk.ComboBox({model: listStore});
let rendererText = new Gtk.CellRendererText();
combo.pack_start(rendererText, false);
combo.add_attribute(rendererText, 'text', 0);
combo.set_id_column(1);
label.set_hexpand(true);
combo.set_hexpand(false);
combo.set_halign(Gtk.Align.END);
if (settings) {
settings.bind(key, combo, 'active-id', 3);
} else {
combo.sensitive = false;
}
if (hbox.pack_start) {
hbox.pack_start(label, true, true, 0);
hbox.add(combo);
} else {
hbox.append(label);
hbox.append(combo);
}
return hbox;
}