185 lines
6.2 KiB
JavaScript
185 lines
6.2 KiB
JavaScript
/*
|
|
* Copyright 2022 zhrexl
|
|
* Copyright 2024 Dave Prowse
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
* SPDX-FileCopyrightText: 2024 Dave Prowse
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
* SPDX-FileContributor: Modified by Dave Prowse
|
|
*/
|
|
|
|
/* eslint version: 9.16 (2024) */
|
|
|
|
|
|
import Adw from 'gi://Adw';
|
|
import Gdk from 'gi://Gdk';
|
|
import Gtk from 'gi://Gtk';
|
|
import GObject from 'gi://GObject';
|
|
|
|
import { gettext } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
|
|
|
|
import { CURATED_UUID as UUID } from '../utils.js';
|
|
import * as Shortcuts from '../shortcuts.js';
|
|
|
|
|
|
const _ = (string) => string ? gettext(string) : "";
|
|
const MARGIN = 10;
|
|
const ROWBOX_MARGIN_PARAMS = { margin_top: MARGIN / 2, margin_bottom: MARGIN / 2, margin_start: MARGIN, margin_end: MARGIN, spacing: 4 };
|
|
|
|
|
|
const PreferencesPage = GObject.registerClass({
|
|
GTypeName: `${UUID}-PreferencesPage`
|
|
}, class Preferences extends Adw.PreferencesPage {
|
|
|
|
constructor(extensionPreferences, window) {
|
|
super({});
|
|
|
|
this.set_title("Preferences");
|
|
this.set_name('prefs');
|
|
this.set_icon_name("preferences-system-symbolic");
|
|
|
|
// Use cached settings from extensionPreferences
|
|
let settings = window._settings;
|
|
let schema = settings.settings_schema;
|
|
|
|
let grp_Global = Adw.PreferencesGroup.new();
|
|
grp_Global.set_title("Global");
|
|
|
|
Shortcuts.GLOBAL_KEYBINDINGS.forEach((settingKeys) => {
|
|
let globalKeybindingsRow = new Adw.ActionRow();
|
|
let globalKeybindingsWidget = new ShortCutWidget(settings, settingKeys);
|
|
let name = settings.settings_schema.get_key(settingKeys).get_summary();
|
|
|
|
globalKeybindingsRow.set_title(name);
|
|
globalKeybindingsRow.add_suffix(globalKeybindingsWidget);
|
|
globalKeybindingsWidget.valign = Gtk.Align.CENTER;
|
|
|
|
grp_Global.add(globalKeybindingsRow);
|
|
});
|
|
|
|
Shortcuts.GLOBAL_KEYBINDINGS_SWITCHES.forEach((settingKeys) => {
|
|
let ActionRow = Adw.ActionRow.new();
|
|
let ActionRow_switch = Gtk.Switch.new();
|
|
let persistentOverTogglesKey = schema.get_key(settingKeys);
|
|
|
|
ActionRow.set_title(persistentOverTogglesKey.get_summary());
|
|
let description = persistentOverTogglesKey.get_description();
|
|
|
|
if (description)
|
|
ActionRow.set_subtitle(persistentOverTogglesKey.get_description());
|
|
|
|
ActionRow.add_suffix(ActionRow_switch);
|
|
ActionRow_switch.valign = Gtk.Align.CENTER;
|
|
|
|
settings.bind(settingKeys, ActionRow_switch, 'active', 0);
|
|
|
|
grp_Global.add(ActionRow);
|
|
});
|
|
|
|
let grp_Internal = Adw.PreferencesGroup.new();
|
|
grp_Internal.set_title("Internal");
|
|
|
|
// Use cached internalShortcutSettings
|
|
let internalShortcutSettings = window._internalShortcutSettings;
|
|
|
|
// Rest of the code stays the same...
|
|
Shortcuts.INTERNAL_KEYBINDINGS.forEach((settingKeys) => {
|
|
let globalKeybindingsRow = new Adw.ActionRow();
|
|
let globalKeybindingsWidget = new ShortCutWidget(internalShortcutSettings, settingKeys);
|
|
let name = internalShortcutSettings.settings_schema.get_key(settingKeys).get_summary();
|
|
|
|
globalKeybindingsRow.set_title(name);
|
|
globalKeybindingsRow.add_suffix(globalKeybindingsWidget);
|
|
globalKeybindingsWidget.valign = Gtk.Align.CENTER;
|
|
|
|
grp_Internal.add(globalKeybindingsRow);
|
|
});
|
|
|
|
let resetButton = new Gtk.Button({ label: _("Reset settings"), halign: Gtk.Align.CENTER });
|
|
resetButton.get_style_context().add_class('destructive-action');
|
|
resetButton.connect('clicked', () => {
|
|
internalShortcutSettings.settings_schema.list_keys().forEach(key => internalShortcutSettings.reset(key));
|
|
settings.settings_schema.list_keys().forEach(key => settings.reset(key));
|
|
});
|
|
|
|
resetButton.set_margin_top(12);
|
|
|
|
this.add(grp_Global);
|
|
this.add(grp_Internal);
|
|
grp_Internal.add(resetButton);
|
|
}
|
|
});
|
|
|
|
|
|
//TODO: ShortCutWidget should not allow two identicals shortcuts
|
|
const ShortCutWidget = GObject.registerClass({
|
|
GTypeName: `${UUID}-ShortCutWidget`
|
|
}, class ShortCutWidget extends Gtk.Button {
|
|
constructor(settings, settingsKeys) {
|
|
super({});
|
|
this._settings = settings;
|
|
this._settingsKeys = settingsKeys;
|
|
|
|
let key = settings.get_strv(settingsKeys)[0];
|
|
this.shortcutlabel = Gtk.ShortcutLabel.new(key);
|
|
this.evck = Gtk.EventControllerKey.new();
|
|
this.allow_changes = false;
|
|
|
|
this.add_controller(this.evck);
|
|
|
|
//TODO: This needs testing
|
|
if (key == null)
|
|
this.set_label(_("Click here to set new shortcut..."));
|
|
else
|
|
this.set_child(this.shortcutlabel);
|
|
|
|
this.get_style_context().add_class('flat');
|
|
this.connect('clicked', this.clicked.bind(this));
|
|
this.evck.connect('key-pressed', this.key_pressed.bind(this));
|
|
this.evck.connect('key-released', this.key_released.bind(this));
|
|
this._settings.connect('changed', this.on_settings_changed.bind(this));
|
|
}
|
|
on_settings_changed() {
|
|
let key = this._settings.get_strv(this._settingsKeys)[0];
|
|
this.shortcutlabel.set_accelerator(key);
|
|
}
|
|
clicked() {
|
|
this.set_label(_("Press the new shortcut..."));
|
|
this.allow_changes = true;
|
|
}
|
|
key_released(widget, keyval, keycode, state) {
|
|
if (this.allow_changes == false)
|
|
return Gdk.EVENT_STOP;
|
|
else
|
|
this.allow_changes = false;
|
|
|
|
let value = this.shortcutlabel.get_accelerator();
|
|
this._settings.set_strv(this._settingsKeys, [value]);
|
|
}
|
|
key_pressed(widget, keyval, keycode, state) {
|
|
if (this.allow_changes == false)
|
|
return Gdk.EVENT_STOP;
|
|
|
|
let mask = state & Gtk.accelerator_get_default_mod_mask();
|
|
let binding = Gtk.accelerator_name_with_keycode(null, keyval, keycode, mask);
|
|
|
|
this.shortcutlabel.set_accelerator(binding);
|
|
this.set_child(this.shortcutlabel);
|
|
|
|
return Gdk.EVENT_STOP;
|
|
}
|
|
});
|
|
|
|
|
|
export default PreferencesPage; |