dotfiles/.local/share/gnome-shell/extensions/dynamic-panel-transparency@.../prefs.js

370 lines
17 KiB
JavaScript

/* exported init, buildPrefsWidget */
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Me = imports.misc.extensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
const Util = Me.imports.util;
const Gettext = imports.gettext.domain('dynamic-panel-transparency');
const _ = Gettext.gettext;
const gtk30_ = imports.gettext.domain('gtk30').gettext;
/* Settings Keys */
const SETTINGS_ENABLE_BACKGROUND_COLOR = 'enable-background-color';
const SETTINGS_ENABLE_MAXIMIZED_TEXT_COLOR = 'enable-maximized-text-color';
const SETTINGS_ENABLE_OPACITY = 'enable-opacity';
const SETTINGS_ENABLE_OVERVIEW_TEXT_COLOR = 'enable-overview-text-color';
const SETTINGS_ENABLE_TEXT_COLOR = 'enable-text-color';
const SETTINGS_HIDE_CORNERS = 'hide-corners';
const SETTINGS_ICON_SHADOW = 'icon-shadow';
const SETTINGS_ICON_SHADOW_COLOR = 'icon-shadow-color';
const SETTINGS_ICON_SHADOW_POSITION = 'icon-shadow-position';
const SETTINGS_MAXIMIZED_OPACITY = 'maximized-opacity';
const SETTINGS_MAXIMIZED_TEXT_COLOR = 'maximized-text-color';
const SETTINGS_PANEL_COLOR = 'panel-color';
const SETTINGS_REMOVE_PANEL_STYLING = 'remove-panel-styling';
const SETTINGS_TEXT_COLOR = 'text-color';
const SETTINGS_TEXT_SHADOW = 'text-shadow';
const SETTINGS_TEXT_SHADOW_COLOR = 'text-shadow-color';
const SETTINGS_TEXT_SHADOW_POSITION = 'text-shadow-position';
const SETTINGS_TRANSITION_SPEED = 'transition-speed';
const SETTINGS_TRANSITION_WITH_OVERVIEW = 'transition-with-overview';
const SETTINGS_TRANSITION_WINDOWS_TOUCH = 'transition-windows-touch';
const SETTINGS_UNMAXIMIZED_OPACITY = 'unmaximized-opacity';
const Page = { TRANSITIONS: 0, FOREGROUND: 1, BACKGROUND: 2, ABOUT: 3 };
Object.freeze(Page);
/* Color Array Indices */
const RED = 0;
const GREEN = 1;
const BLUE = 2;
const ALPHA = 3;
/* Shadow Positioning Indices */
const HORIZONTAL_OFFSET = 0;
const VERTICAL_OFFSET = 1;
const BLUR_RADIUS = 2;
/* UI spacing & similar values. */
const WEBSITE_LABEL_BOTTOM_MARGIN = 50;
const WEBSITE_LABEL_TOP_MARGIN = 20;
/* Color Scaling Factor (Byte to Decimal) */
const SCALE_FACTOR = 255.9999999;
function init() {
Convenience.initTranslations();
}
/* UI Setup */
function buildPrefsWidget() {
/* Stores settings until the user applies them. */
/* Get Settings */
let settings = Convenience.getSettings();
/* Create a UI Builder */
let builder = new Gtk.Builder();
/* Setup Translation */
builder.set_translation_domain(Me.metadata['gettext-domain']);
/* Get UI File */
builder.add_from_file(Me.path + '/prefs.ui');
/* Main Widget (Grid) */
let main_widget = builder.get_object('main_box');
{
/* Transition speed control */
let speed_scale = builder.get_object('speed_scale');
/* Init value. */
speed_scale.adjustment.set_value(settings.get_int(SETTINGS_TRANSITION_SPEED));
/* Add default marking. */
speed_scale.add_mark(settings.get_default_value(SETTINGS_TRANSITION_SPEED).unpack(), Gtk.PositionType.BOTTOM, _("default"));
/* Add formatting */
speed_scale.set_format_value_func((scale, value) => {
return value + 'ms';
});
speed_scale.connect('value-changed', (function(widget) {
settings.set_value(SETTINGS_TRANSITION_SPEED, new GLib.Variant('i', widget.adjustment.get_value()));
}).bind(this));
let transition_windows_touch = builder.get_object('transition_windows_touch_check');
transition_windows_touch.set_active(settings.get_boolean(SETTINGS_TRANSITION_WINDOWS_TOUCH));
transition_windows_touch.connect('toggled', (function(widget) {
settings.set_value(SETTINGS_TRANSITION_WINDOWS_TOUCH, new GLib.Variant('b', widget.get_active()));
}).bind(this));
let transition_with_overview = builder.get_object('transition_with_overview_check');
transition_with_overview.set_active(settings.get_boolean(SETTINGS_TRANSITION_WITH_OVERVIEW));
transition_with_overview.connect('toggled', (function(widget) {
settings.set_value(SETTINGS_TRANSITION_WITH_OVERVIEW, new GLib.Variant('b', widget.get_active()));
}).bind(this));
}
/* Setup foreground tab */
{
let text_color_switch = builder.get_object('text_color_switch');
let text_color_revealer = builder.get_object('text_color_revealer');
text_color_switch.set_active(settings.get_boolean(SETTINGS_ENABLE_TEXT_COLOR));
text_color_switch.connect('state-set', (function(widget, state) {
settings.set_value(SETTINGS_ENABLE_TEXT_COLOR, new GLib.Variant('b', state));
text_color_revealer.set_reveal_child(state);
}).bind(this));
let maximized_text_color_switch = builder.get_object('maximized_text_color_check');
maximized_text_color_switch.set_active(settings.get_boolean(SETTINGS_ENABLE_MAXIMIZED_TEXT_COLOR));
maximized_text_color_switch.connect('toggled', (function(widget) {
settings.set_value(SETTINGS_ENABLE_MAXIMIZED_TEXT_COLOR, new GLib.Variant('b', widget.get_active()));
}).bind(this));
let overview_text_color_switch = builder.get_object('overview_text_color_check');
overview_text_color_switch.set_active(settings.get_boolean(SETTINGS_ENABLE_OVERVIEW_TEXT_COLOR));
overview_text_color_switch.connect('toggled', (function(widget) {
settings.set_value(SETTINGS_ENABLE_OVERVIEW_TEXT_COLOR, new GLib.Variant('b', widget.get_active()));
}).bind(this));
let remove_panel_styling_check = builder.get_object('remove_panel_styling_check');
remove_panel_styling_check.set_active(settings.get_boolean(SETTINGS_REMOVE_PANEL_STYLING));
remove_panel_styling_check.connect('toggled', (function(widget) {
settings.set_value(SETTINGS_REMOVE_PANEL_STYLING, new GLib.Variant('b', widget.get_active()));
}).bind(this));
let maximized_text_color_btn = builder.get_object('maximized_text_color_btn');
let maximized_text_color = settings.get_value(SETTINGS_MAXIMIZED_TEXT_COLOR).deep_unpack();
let css_color = 'rgba(' + maximized_text_color[RED] + ',' + maximized_text_color[GREEN] + ',' + maximized_text_color[BLUE] + ', 1.0)';
let scaled_color = new Gdk.RGBA();
if (scaled_color.parse(css_color)) {
maximized_text_color_btn.set_rgba(scaled_color);
}
maximized_text_color_btn.connect('color-set', (function(color_btn) {
let color = Util.gdk_to_css_color(color_btn.get_rgba());
let rgb = [color.red, color.green, color.blue];
settings.set_value(SETTINGS_MAXIMIZED_TEXT_COLOR, new GLib.Variant('(iii)', rgb));
}).bind(this));
let text_color_btn = builder.get_object('text_color_btn');
let text_color = settings.get_value(SETTINGS_TEXT_COLOR).deep_unpack();
css_color = 'rgba(' + text_color[RED] + ',' + text_color[GREEN] + ',' + text_color[BLUE] + ', 1.0)';
scaled_color = new Gdk.RGBA();
if (scaled_color.parse(css_color)) {
text_color_btn.set_rgba(scaled_color);
}
text_color_btn.connect('color-set', (function(color_btn) {
let color = Util.gdk_to_css_color(color_btn.get_rgba());
let rgb = [color.red, color.green, color.blue];
settings.set_value(SETTINGS_TEXT_COLOR, new GLib.Variant('(iii)', rgb));
}).bind(this));
let text_shadow_switch = builder.get_object('text_shadow_switch');
let text_shadow_revealer = builder.get_object('text_shadow_revealer');
text_shadow_switch.set_active(settings.get_boolean(SETTINGS_TEXT_SHADOW));
text_shadow_switch.connect('state-set', (function(widget, state) {
settings.set_value(SETTINGS_TEXT_SHADOW, new GLib.Variant('b', state));
text_shadow_revealer.set_reveal_child(state);
}).bind(this));
let text_shadow_vertical_offset = builder.get_object('text_shadow_vertical_offset');
settings.set_value(SETTINGS_TEXT_SHADOW_POSITION, settings.get_value(SETTINGS_TEXT_SHADOW_POSITION));
text_shadow_vertical_offset.set_value(settings.get_value(SETTINGS_TEXT_SHADOW_POSITION).deep_unpack()[VERTICAL_OFFSET]);
text_shadow_vertical_offset.connect('value-changed', (function(widget) {
let position = settings.get_value(SETTINGS_TEXT_SHADOW_POSITION).deep_unpack();
position[VERTICAL_OFFSET] = widget.get_value_as_int();
settings.set_value(SETTINGS_TEXT_SHADOW_POSITION, new GLib.Variant('(iii)', position));
}).bind(this));
let text_shadow_horizontal_offset = builder.get_object('text_shadow_horizontal_offset');
text_shadow_horizontal_offset.set_value(settings.get_value(SETTINGS_TEXT_SHADOW_POSITION).deep_unpack()[HORIZONTAL_OFFSET]);
text_shadow_horizontal_offset.connect('value-changed', (function(widget) {
let position = settings.get_value(SETTINGS_TEXT_SHADOW_POSITION).deep_unpack();
position[HORIZONTAL_OFFSET] = widget.get_value_as_int();
settings.set_value(SETTINGS_TEXT_SHADOW_POSITION, new GLib.Variant('(iii)', position));
}).bind(this));
let text_shadow_radius = builder.get_object('text_shadow_radius');
text_shadow_radius.set_value(settings.get_value(SETTINGS_TEXT_SHADOW_POSITION).deep_unpack()[BLUR_RADIUS]);
text_shadow_radius.connect('value-changed', (function(widget) {
let position = settings.get_value(SETTINGS_TEXT_SHADOW_POSITION).deep_unpack();
position[BLUR_RADIUS] = widget.get_value_as_int();
settings.set_value(SETTINGS_TEXT_SHADOW_POSITION, new GLib.Variant('(iii)', position));
}).bind(this));
let text_shadow_color_btn = builder.get_object('text_shadow_color');
text_shadow_color_btn.show_editor = true;
let text_shadow_color = settings.get_value(SETTINGS_TEXT_SHADOW_COLOR).deep_unpack();
css_color = 'rgba(' + text_shadow_color[RED] + ',' + text_shadow_color[GREEN] + ',' + text_shadow_color[BLUE] + ',' + text_shadow_color[ALPHA].toFixed(2) + ')';
scaled_color = new Gdk.RGBA();
if (scaled_color.parse(css_color))
text_shadow_color_btn.set_rgba(scaled_color);
text_shadow_color_btn.connect('color-set', (function(color_btn) {
let color = Util.gdk_to_css_color(color_btn.get_rgba());
let alpha = +(color_btn.get_rgba().alpha.toFixed(2));
let rgba = [color.red, color.green, color.blue, alpha];
settings.set_value(SETTINGS_TEXT_SHADOW_COLOR, new GLib.Variant('(iiid)', rgba));
}).bind(this));
let icon_shadow = builder.get_object('icon_shadow_switch');
let icon_shadow_revealer = builder.get_object('icon_shadow_revealer');
icon_shadow.set_active(settings.get_boolean(SETTINGS_ICON_SHADOW));
icon_shadow.connect('state-set', (function(widget, state) {
settings.set_value(SETTINGS_ICON_SHADOW, new GLib.Variant('b', state));
icon_shadow_revealer.set_reveal_child(state);
}).bind(this));
let icon_shadow_vertical_offset = builder.get_object('icon_shadow_vertical_offset');
settings.set_value(SETTINGS_ICON_SHADOW_POSITION, settings.get_value(SETTINGS_ICON_SHADOW_POSITION));
icon_shadow_vertical_offset.set_value(settings.get_value(SETTINGS_ICON_SHADOW_POSITION).deep_unpack()[VERTICAL_OFFSET]);
icon_shadow_vertical_offset.connect('value-changed', (function(widget) {
let position = settings.get_value(SETTINGS_ICON_SHADOW_POSITION).deep_unpack();
position[VERTICAL_OFFSET] = widget.get_value_as_int();
settings.set_value(SETTINGS_ICON_SHADOW_POSITION, new GLib.Variant('(iii)', position));
}).bind(this));
let icon_shadow_horizontal_offset = builder.get_object('icon_shadow_horizontal_offset');
icon_shadow_horizontal_offset.set_value(settings.get_value(SETTINGS_ICON_SHADOW_POSITION).deep_unpack()[HORIZONTAL_OFFSET]);
icon_shadow_horizontal_offset.connect('value-changed', (function(widget) {
let position = settings.get_value(SETTINGS_ICON_SHADOW_POSITION).deep_unpack();
position[HORIZONTAL_OFFSET] = widget.get_value_as_int();
settings.set_value(SETTINGS_ICON_SHADOW_POSITION, new GLib.Variant('(iii)', position));
}).bind(this));
let icon_shadow_radius = builder.get_object('icon_shadow_radius');
icon_shadow_radius.set_value(settings.get_value(SETTINGS_ICON_SHADOW_POSITION).deep_unpack()[BLUR_RADIUS]);
icon_shadow_radius.connect('value-changed', (function(widget) {
let position = settings.get_value(SETTINGS_ICON_SHADOW_POSITION).deep_unpack();
position[BLUR_RADIUS] = widget.get_value_as_int();
settings.set_value(SETTINGS_ICON_SHADOW_POSITION, new GLib.Variant('(iii)', position));
}).bind(this));
let icon_shadow_color_btn = builder.get_object('icon_shadow_color');
icon_shadow_color_btn.show_editor = true;
let icon_shadow_color = settings.get_value(SETTINGS_ICON_SHADOW_COLOR).deep_unpack();
css_color = 'rgba(' + icon_shadow_color[RED] + ',' + icon_shadow_color[GREEN] + ',' + icon_shadow_color[BLUE] + ',' + icon_shadow_color[ALPHA].toFixed(2) + ')';
scaled_color = new Gdk.RGBA();
if (scaled_color.parse(css_color)) {
icon_shadow_color_btn.set_rgba(scaled_color);
}
icon_shadow_color_btn.connect('color-set', (function(color_btn) {
let color = Util.gdk_to_css_color(color_btn.get_rgba());
let alpha = +(color_btn.get_rgba().alpha.toFixed(2));
let rgba = [color.red, color.green, color.blue, alpha];
settings.set_value(SETTINGS_ICON_SHADOW_COLOR, new GLib.Variant('(iiid)', rgba));
}).bind(this));
}
/* Setup Background Tab */
{
let background_color_switch = builder.get_object('background_color_switch');
let opacity_switch = builder.get_object('opacity_switch');
let background_color_revealer = builder.get_object('background_color_revealer');
let opacity_revealer = builder.get_object('opacity_revealer');
background_color_switch.set_active(settings.get_boolean(SETTINGS_ENABLE_BACKGROUND_COLOR));
background_color_switch.connect('state-set', (function(widget, state) {
settings.set_value(SETTINGS_ENABLE_BACKGROUND_COLOR, new GLib.Variant('b', state));
background_color_revealer.set_reveal_child(state);
}).bind(this));
opacity_switch.set_active(settings.get_boolean(SETTINGS_ENABLE_OPACITY));
opacity_switch.connect('state-set', (function(widget, state) {
settings.set_value(SETTINGS_ENABLE_OPACITY, new GLib.Variant('b', state));
opacity_revealer.set_reveal_child(state);
}).bind(this));
/* Maximum opacity control */
let maximum_scale = builder.get_object('maximum_scale');
/* Init value. */
maximum_scale.adjustment.set_value(settings.get_int(SETTINGS_MAXIMIZED_OPACITY));
/* Add formatting */
maximum_scale.set_format_value_func((scale, value) => {
return (((value / SCALE_FACTOR) * 100).toFixed(0) + '%'); // eslint-disable-line no-magic-numbers
});
maximum_scale.connect('value-changed', (function(widget) {
settings.set_value(SETTINGS_MAXIMIZED_OPACITY, new GLib.Variant('i', widget.adjustment.get_value()));
}).bind(this));
/* Minimum opacity control */
let minimum_scale = builder.get_object('minimum_scale');
/* Init value. */
minimum_scale.adjustment.set_value(settings.get_int(SETTINGS_UNMAXIMIZED_OPACITY));
/* Add formatting */
minimum_scale.set_format_value_func((scale, value) => {
return ((value / SCALE_FACTOR) * 100).toFixed(0) + '%'; // eslint-disable-line no-magic-numbers
});
minimum_scale.connect('value-changed', (function(widget) {
settings.set_value(SETTINGS_UNMAXIMIZED_OPACITY, new GLib.Variant('i', widget.adjustment.get_value()));
}).bind(this));
/* Convert & scale color. */
let panel_color = settings.get_value(SETTINGS_PANEL_COLOR).deep_unpack();
let color_btn = builder.get_object('color_btn');
let css_color = 'rgba(' + panel_color[RED] + ',' + panel_color[GREEN] + ',' + panel_color[BLUE] + ', 1.0)';
let scaled_color = new Gdk.RGBA();
if (scaled_color.parse(css_color)) {
color_btn.set_rgba(scaled_color);
}
color_btn.connect('color-set', (function(color_btn) {
let color = Util.gdk_to_css_color(color_btn.get_rgba());
let rgb = [color.red, color.green, color.blue];
settings.set_value(SETTINGS_PANEL_COLOR, new GLib.Variant('ai', rgb));
}).bind(this));
let hide_corners = builder.get_object('hide_corners_check');
hide_corners.set_active(settings.get_boolean(SETTINGS_HIDE_CORNERS));
hide_corners.connect('toggled', (function(widget) {
settings.set_value(SETTINGS_HIDE_CORNERS, new GLib.Variant('b', widget.get_active()));
}).bind(this));
}
let about_button = builder.get_object('about_button');
let about_dialog = builder.get_object('about_dialog');
about_dialog.set_version('v' + Me.metadata['version']);
about_button.connect('clicked', () => {
about_dialog.set_transient_for(main_widget.get_root());
about_dialog.set_modal(true);
about_dialog.present();
});
return main_widget;
}