.dotfiles/.local/share/gnome-shell/extensions/blur-my-shell@aunetx/preferences/customize_row.js

164 lines
6.1 KiB
JavaScript

import Adw from 'gi://Adw';
import GLib from 'gi://GLib';
import GObject from 'gi://GObject';
import Gio from 'gi://Gio';
import Gtk from 'gi://Gtk';
/// Given a component (described by its preferences node), a gschema key and
/// a Gtk.ColorButton, binds everything transparently.
let bind_color = function (component, key, widget) {
let property_name = key.replaceAll('-', '_').toUpperCase();
let parse_color = _ => {
let [r, g, b, a] = component[property_name];
let w = widget.rgba;
w.red = r;
w.green = g;
w.blue = b;
w.alpha = a;
widget.rgba = w;
};
component.settings.connect('changed::' + key, parse_color);
widget.connect('color-set', _ => {
let c = widget.rgba;
component[property_name] = [c.red, c.green, c.blue, c.alpha];
});
parse_color();
};
export const CustomizeRow = GObject.registerClass({
GTypeName: 'CustomizeRow',
Template: GLib.uri_resolve_relative(import.meta.url, '../ui/customize-row.ui', GLib.UriFlags.NONE),
InternalChildren: [
'sigma',
'brightness',
'color',
'color_row',
'noise_amount',
'noise_amount_row',
'noise_lightness',
'noise_lightness_row',
'noise_color_notice'
],
}, class CustomizeRow extends Adw.ExpanderRow {
/// Makes the required connections between the widgets and the preferences.
///
/// This function may be bound to another object than CustomizeRow, if we
/// are using it for the General page; some things will then change (no
/// expansion row, and no notice)
///
/// The color_and_noise parameter is either a boolean (true by default) or
/// a widget; and permits selecting weather or not we want to show the color
/// and noise buttons to the user. If it is a widget, it means we need to
/// dynamically update their visibility, according to the widget's state.
connect_to(settings, component_settings, color_and_noise = true) {
let s = component_settings.settings;
// is not fired if in General page
if (this instanceof CustomizeRow)
// bind the customize button
s.bind(
'customize', this, 'enable-expansion',
Gio.SettingsBindFlags.DEFAULT
);
// bind sigma and brightness
s.bind(
'sigma', this._sigma, 'value',
Gio.SettingsBindFlags.DEFAULT
);
s.bind(
'brightness', this._brightness, 'value',
Gio.SettingsBindFlags.DEFAULT
);
// bind the color button
bind_color(component_settings, 'color', this._color);
// bind noise sliders
s.bind(
'noise-amount', this._noise_amount, 'value',
Gio.SettingsBindFlags.DEFAULT
);
s.bind(
'noise-lightness', this._noise_lightness, 'value',
Gio.SettingsBindFlags.DEFAULT
);
// color_and_noise is either a boolean or a widget, if true, or it is a
// widget, this will appropriately show the required preferences about
// setting the color and noise
if (color_and_noise) {
// if we gave the static_blur widget, we are dealing with the panel,
// and binding it to enable/disable the required components when
// switching between static and dynamic blur
if (color_and_noise instanceof Gtk.Switch) {
// bind its state to dynamically toggle the notice and rows
color_and_noise.bind_property(
'active', this._color_row, 'visible',
GObject.BindingFlags.SYNC_CREATE
);
color_and_noise.bind_property(
'active', this._noise_amount_row, 'visible',
GObject.BindingFlags.SYNC_CREATE
);
color_and_noise.bind_property(
'active', this._noise_lightness_row, 'visible',
GObject.BindingFlags.SYNC_CREATE
);
color_and_noise.bind_property(
'active', this._noise_color_notice, 'visible',
GObject.BindingFlags.INVERT_BOOLEAN
);
// only way to get the correct state when first opening the
// window...
setTimeout(_ => {
let is_visible = color_and_noise.active;
this._color_row.visible = is_visible;
this._noise_amount_row.visible = is_visible;
this._noise_lightness_row.visible = is_visible;
this._noise_color_notice.visible = !is_visible;
}, 10);
}
// if in General page, there is no notice at all
if (this instanceof CustomizeRow) {
// disable the notice
this._noise_color_notice.visible = false;
}
} else {
// enable the notice and disable color and noise preferences
this._color_row.visible = false;
this._noise_amount_row.visible = false;
this._noise_lightness_row.visible = false;
this._noise_color_notice.visible = true;
}
// now we bind the color-and-noise preference to the sensitivity of the
// associated widgets, this will grey them out if the user choose not to
// have color and noise enabled
// note: I would love to bind to the visibility instead, but this part
// is already dirty enough, it would look like I obfuscate my code
// intentionally... (I am not)
settings.settings.bind(
'color-and-noise',
this._color_row, 'sensitive',
Gio.SettingsBindFlags.DEFAULT
);
settings.settings.bind(
'color-and-noise',
this._noise_amount_row, 'sensitive',
Gio.SettingsBindFlags.DEFAULT
);
settings.settings.bind(
'color-and-noise',
this._noise_lightness_row, 'sensitive',
Gio.SettingsBindFlags.DEFAULT
);
};
});