Files
dotfiles/gnome/.local/share/gnome-shell/extensions/grimble@lmt.github.io/prefs.js

91 lines
3.6 KiB
JavaScript

import Gio from 'gi://Gio';
import Gtk from 'gi://Gtk';
import './prefs/shortcutListener.js';
import {Shortcut, Switches, Radio, Spin, Combo} from './common.js';
import {getKeybindingController} from './keybindingController.js';
import {saveConfiguration} from './utils.js';
import {ExtensionPreferences} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
export default class GrimblePreferences extends ExtensionPreferences {
fillPreferencesWindow(window) {
const settings = this.getSettings();
const builder = Gtk.Builder.new_from_file(`${this.path}/ui/prefs.ui`);
const page1 = this.createGeneralSettingsPage(builder, settings);
const page2 = this.createKeybindingsPage(builder, settings);
window.add(page1);
window.add(page2);
return Promise.resolve();
}
createGeneralSettingsPage(builder, settings) {
const page1 = builder.get_object('general');
this._bindRadioButtons(builder, settings);
this._bindSwitches(builder, settings);
this._bindSpinbuttons(builder, settings);
return page1;
}
createKeybindingsPage(builder, settings) {
const page2 = builder.get_object('keybindings');
const comboRow = Combo.getCombo();
comboRow.forEach(({key, rowNames}) => {
const combo = builder.get_object(key.replaceAll('-', '_'));
let lastValue = settings.get_string(key);
let row = rowNames.findIndex(item => lastValue === item);
if (row === -1)
row = 0;
combo.set_selected(row);
combo.connect('notify::selected-item', widget => {
settings.set_string(key, rowNames[widget.get_selected()]);
});
getKeybindingController().connect('keybinding-changed', () => {
combo.set_selected(rowNames.findIndex(item => item === 'Custom'));
const shortcuts = Shortcut.getShortcuts();
let o = {};
for (const p of shortcuts)
o[p] = settings.get_strv(p) ?? [];
saveConfiguration('custom.json', o);
});
});
let keys = Shortcut.getShortcuts();
keys.forEach(key => {
const shortcut = builder.get_object(key.replaceAll('-', '_'));
shortcut.initialize(key, settings);
});
return page2;
}
_bindRadioButtons(builder, settings) {
const radioButtons = Radio.getRadios();
radioButtons.forEach(({key, rowNames}) => {
const currActive = settings.get_int(key);
rowNames.forEach((name, idx) => {
const row = builder.get_object(name.replaceAll('-', '_'));
const checkButton = row.activatable_widget;
checkButton.connect('toggled', () => {
settings.set_int(key, idx);
});
// Set initial state
if (idx === currActive)
checkButton.activate();
});
});
}
_bindSwitches(builder, settings) {
const switches = Switches.getSwitches();
switches.forEach(key => {
const widget = builder.get_object(key.replaceAll('-', '_'));
settings.bind(key, widget, 'active', Gio.SettingsBindFlags.DEFAULT);
});
}
_bindSpinbuttons(builder, settings) {
const spinButtons = Spin.getSpins();
spinButtons.forEach(key => {
const widget = builder.get_object(key.replaceAll('-', '_'));
settings.bind(key, widget, 'value', Gio.SettingsBindFlags.DEFAULT);
});
}
}