370 lines
17 KiB
JavaScript
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;
|
|
} |