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); }); } }