Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Factory:Rebuild
hamster-time-tracker
0170-prefs.js-re-implement-for-GNOME-45.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0170-prefs.js-re-implement-for-GNOME-45.patch of Package hamster-time-tracker
From 56a49e059d6ba187086df9690303352e27ed1702 Mon Sep 17 00:00:00 2001 From: Martin Wilck <mwilck@suse.com> Date: Fri, 22 Sep 2023 23:12:35 +0200 Subject: [PATCH 170/173] prefs.js: re-implement for GNOME 45 I used check buttons for the settings. Adw.ComboRow might have been more suitable, but I couldn't find an example how to set it up. The code here was copied from GNOME's window-list extension and adapted to hamster. Signed-off-by: Martin Wilck <mwilck@suse.com> --- extension/prefs.js | 251 ++++++++++++++++++++------------------------- 1 file changed, 114 insertions(+), 137 deletions(-) diff --git a/extension/prefs.js b/extension/prefs.js index c7ae150..0b565e6 100644 --- a/extension/prefs.js +++ b/extension/prefs.js @@ -21,155 +21,132 @@ Copyright (c) 2016 - 2018 Eric Goller / projecthamster <elbenfreund@projecthamst */ +import Adw from 'gi://Adw'; import Gdk from 'gi://Gdk'; import Gio from 'gi://Gio'; import Gtk from 'gi://Gtk'; import GObject from 'gi://GObject'; +import GLib from 'gi://GLib'; -const HamsterSettingsWidget = GObject.registerClass( -class HamsterSettingsWidget extends Gtk.Grid { - _init(params) { - super._init(params); +import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; - this.name = 'ProjectHamster.Prefs.HamsterSettingsWidget'; - this.set_margin_bottom(18); - this.set_margin_end(18); - this.set_margin_start(18); - this.set_margin_top(18); - this.set_column_spacing(12); - this.set_row_spacing(12); - this.visible = true; +class HotkeyRow extends Adw.EntryRow { + static { + GObject.registerClass(this); + } - this._settings = ExtensionUtils.getSettings(); + constructor({ title, settings, bind }) { + super({ + title: title, + }); - let label = new Gtk.Label({ - label: "Positioning:", - halign: Gtk.Align.START, - visible: true - }); - this.attach(label, 0, 0, 1, 1); + this.connect("apply", () => { + const hotkeys = this.get_text(); - let placementOptions = new Gtk.ListStore(); - placementOptions.set_column_types([GObject.TYPE_STRING, GObject.TYPE_INT]); + const mappings = hotkeys.split(",").map((x) => { + const [, key, mods] = Gtk.accelerator_parse(x); + return Gtk.accelerator_valid(key, mods) && Gtk.accelerator_name(key, mods); + }); - placementOptions.set(placementOptions.append(), [0, 1], ["Default", 0]); - placementOptions.set(placementOptions.append(), [0, 1], ["Replace calendar", 1]); - placementOptions.set(placementOptions.append(), [0, 1], ["Replace activities", 2]); - placementOptions.set(placementOptions.append(), [0, 1], ["Center, next to calendar", 3]); + if (mappings.every((x) => !!x)) { + console.log("HotkeyRow: good hotkey value ", hotkeys); + this.current = mappings; + settings.set_strv(bind, this.current); + } else { + console.log("invalid hotkey value ", hotkeys); + this.set_text(this.current.join(",")); + } + }); - let placementCombo = new Gtk.ComboBox({ - model: placementOptions, - visible: true - }); - - let placementComboRenderer = new Gtk.CellRendererText(); - placementCombo.pack_start(placementComboRenderer, true); - placementCombo.add_attribute(placementComboRenderer, 'text', 0); - placementCombo.connect('changed', this._onPlacementChange.bind(this)); - placementCombo.set_active(this._settings.get_int("panel-placement")); - this.attach(placementCombo, 1, 0, 1, 1); - - label = new Gtk.Label({ - label: "Appearance in panel:", - halign: Gtk.Align.START, - visible: true - }); - this.attach(label, 0, 1, 1, 1); - - let appearanceOptions = new Gtk.ListStore(); - appearanceOptions.set_column_types([GObject.TYPE_STRING, GObject.TYPE_INT]); - - appearanceOptions.set(appearanceOptions.append(), [0, 1], ["Label", 0]); - appearanceOptions.set(appearanceOptions.append(), [0, 1], ["Icon", 1]); - appearanceOptions.set(appearanceOptions.append(), [0, 1], ["Label and icon", 2]); - - let appearanceCombo = new Gtk.ComboBox({ - model: appearanceOptions, - visible: true - }); - - let appearanceComboRenderer = new Gtk.CellRendererText(); - appearanceCombo.pack_start(appearanceComboRenderer, true); - appearanceCombo.add_attribute(appearanceComboRenderer, 'text', 0); - appearanceCombo.connect('changed', this._onAppearanceChange.bind(this)); - appearanceCombo.set_active(this._settings.get_int("panel-appearance")); - this.attach(appearanceCombo, 1, 1, 1, 1); - - label = new Gtk.Label({ - label: "Global hotkey:", - halign: Gtk.Align.START, - visible: true - }); - this.attach(label, 0, 2, 1, 1); - - let entry = new Gtk.Entry({ - margin_bottom: 10, - margin_top: 5, - text: this._settings.get_strv("show-hamster-dropdown")[0], - visible: true - }); - entry.connect('changed', this._onHotkeyChange.bind(this)); - this.attach(entry, 1, 2, 1, 1); - - label = new Gtk.Label({ - label: "Reload gnome shell after updating prefs (alt+f2 > r)", - halign: Gtk.Align.CENTER, - visible: true, - margin_top: 70 - }); - this.attach(label, 0, 3, 2, 1); - - } - - _onPlacementChange(widget) { - let [success, iter] = widget.get_active_iter(); - if (!success) - return; - - let newPlacement = widget.get_model().get_value(iter, 1); - - if (this._settings.get_int("panel-placement") == newPlacement) - return; - - this._settings.set_int("panel-placement", newPlacement); - } - - _onAppearanceChange(widget) { - let [success, iter] = widget.get_active_iter(); - if (!success) - return; - - let newAppearance = widget.get_model().get_value(iter, 1); - - if (this._settings.get_int("panel-appearance") == newAppearance) - return; - - this._settings.set_int("panel-appearance", newAppearance); - } - - _onHotkeyChange(widget, bananas) { - let hotkey = widget.get_text(); - let [key, mods] = [null, null]; - - if (Gtk.MAJOR_VERSION >= 4) { - let _r = null; - [_r, key, mods] = Gtk.accelerator_parse(hotkey); - } else { - [key, mods] = Gtk.accelerator_parse(hotkey); - } - - if (key != 0) { - let parsedName = Gtk.accelerator_name(key, mods); - this._settings.set_strv("show-hamster-dropdown", [parsedName]); - } - - } -}); - -function init() { + this.show_apply_button = true, + this.current = settings.get_strv(bind); + console.log("HotkeyRow current: ", bind, this.current); + this.set_text(this.current.join(",")); + } } -function buildPrefsWidget() { - return new HamsterSettingsWidget(); +class HamsterPrefsWidget extends Adw.PreferencesPage { + + static { + GObject.registerClass(this); + } + + constructor(settings) { + super(); + this._settings = settings; + + this._actionGroup = new Gio.SimpleActionGroup(); + this.insert_action_group('hamster', this._actionGroup); + this._actionGroup.add_action( + this._settings.create_action('panel-placement')); + this._actionGroup.add_action( + this._settings.create_action('panel-appearance')); + + const placementGroup = new Adw.PreferencesGroup({ + title: _('Panel Placement'), + }); + this.add(placementGroup); + + const placements = [ + { p: 0, title: _("Default") }, + { p: 1, title: _("Replace calendar") }, + { p: 2, title: _("Replace activities") }, + { p: 3, title: _("Center, next to calendar") }, + ]; + + for (const {p, title} of placements) { + const btn = new Gtk.CheckButton({ + action_name: 'hamster.panel-placement', + action_target: new GLib.Variant('i', p), + }); + const row = new Adw.ActionRow({ + activatable_widget: btn, + title, + }); + row.add_prefix(btn); + placementGroup.add(row); + } + + const appearanceGroup = new Adw.PreferencesGroup({ + title: _('Panel Appearance'), + }); + this.add(appearanceGroup); + + const appearances = [ + { a: 0, title: _("Label") }, + { a: 1, title: _("Icon") }, + { a: 2, title: _("Label and icon") }, + ]; + + for (const {a, title} of appearances) { + const btn = new Gtk.CheckButton({ + action_name: 'hamster.panel-appearance', + action_target: new GLib.Variant('i', a), + }); + const row = new Adw.ActionRow({ + activatable_widget: btn, + title, + }); + row.add_prefix(btn); + appearanceGroup.add(row); + } + + const miscGroup = new Adw.PreferencesGroup(); + this.add(miscGroup); + + let row = new HotkeyRow({ + title: _("Global hotkey"), + settings: this._settings, + bind: "show-hamster-dropdown", + }); + + miscGroup.add(row); + } +} + +export default class HamsterPrefs extends ExtensionPreferences { + getPreferencesWidget() { + return new HamsterPrefsWidget(this.getSettings()); + } } -- 2.42.0
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor