91 lines
3.6 KiB
JavaScript
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);
|
|
});
|
|
}
|
|
}
|