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

275 lines
7.5 KiB
JavaScript

/* exported init, cleanup, lock, unlock, get_animation_status, get_transparency_status, minimum_fade_in, update_transition_type */
/* exported fade_in, fade_out, blank_fade_out */
const Mainloop = imports.mainloop;
const St = imports.gi.St;
const Me = imports.misc.extensionUtils.getCurrentExtension();
const Settings = Me.imports.settings;
const Theming = Me.imports.theming;
const Equations = imports.tweener.equations;
const CORNER_UPDATE_FREQUENCY = 30;
class TransparencyStatus {
constructor() {
this.transparent = false;
this.blank = false;
}
is_transparent() {
return this.transparent;
}
is_blank() {
return this.blank;
}
set_transparent(transparent) {
this.transparent = transparent;
}
set_blank(blank) {
this.blank = blank;
}
};
/**
* Intialize.
*
*/
function init() {
/* Objects to track where the transparency is and where it's going. */
this.status = new TransparencyStatus();
this.corner_timeout_id = 0;
}
/**
* Freeup any held assets on disable.
*
*/
function cleanup() {
this.status = null;
this.corner_timeout_id = null;
}
/**
* Get the current status of the panel's transparency.
*
* @returns {Object} Current transparency. @see TransparencyStatus
*/
function get_transparency_status() {
return this.status;
}
/**
* Get any animation that the panel is currently doing.
* DEPRECATED.
*
* @returns {Object} Current animation status. @see AnimationStatus
*/
function get_animation_status() {
return { destination: null, action: null };
}
/**
* Fades the panel into the unmaximized (minimum) alpha. Used for closing the overview.
*
*/
function minimum_fade_in() {
/* The CSS backend doesn't need different starting/ending values */
fade_out();
}
/**
* Fades the panel into the nmaximized (maximum) alpha.
*
*/
function fade_in() {
if (!Settings.remove_panel_styling()) {
Theming.reapply_panel_styling();
Theming.reapply_panel_background_image();
}
Theming.remove_panel_transparency();
if (Settings.enable_custom_background_color()) {
Theming.set_maximized_background_color('custom');
Theming.remove_unmaximized_background_color();
Theming.remove_unmaximized_background_color('custom');
} else {
Theming.set_maximized_background_color();
Theming.remove_unmaximized_background_color();
Theming.remove_unmaximized_background_color('custom');
}
if (!Settings.get_hide_corners()) {
let speed = St.Settings.get().slow_down_factor * Settings.get_transition_speed();
let maximized = Settings.get_maximized_opacity();
let unmaximized = !this.status.is_transparent() ? maximized : Settings.get_unmaximized_opacity();
this.status.set_transparent(false);
this.status.set_blank(false);
let count = 0;
const id = this.corner_timeout_id = Mainloop.timeout_add(Math.floor(speed / CORNER_UPDATE_FREQUENCY), (function() {
if (id === this.corner_timeout_id && !this.status.is_transparent()) {
count++;
let alpha = Equations.linear(Math.floor(count * (speed / CORNER_UPDATE_FREQUENCY)), unmaximized, maximized - unmaximized, speed);
update_corner_alpha(alpha);
if (count > CORNER_UPDATE_FREQUENCY) {
update_corner_alpha(maximized);
return false;
}
} else {
return false;
}
return true;
}).bind(this));
} else {
update_corner_alpha();
}
this.status.set_transparent(false);
this.status.set_blank(false);
}
/**
* Fades the panel into the unmaximized (minimum) alpha.
*
*/
function fade_out() {
Theming.strip_panel_background_image();
Theming.strip_panel_styling();
if (Settings.enable_custom_background_color()) {
Theming.set_unmaximized_background_color('custom');
Theming.remove_maximized_background_color();
Theming.remove_maximized_background_color('custom');
} else {
Theming.set_unmaximized_background_color();
Theming.remove_maximized_background_color();
Theming.remove_maximized_background_color('custom');
}
Theming.remove_panel_transparency();
// TODO: Figure out how to write the panel corners in pure CSS.
if (!Settings.get_hide_corners()) {
let speed = St.Settings.get().slow_down_factor * Settings.get_transition_speed();
let unmaximized = Settings.get_unmaximized_opacity();
let maximized = this.status.is_transparent() ? unmaximized : Settings.get_maximized_opacity();
/* Keep the status up to date */
this.status.set_transparent(true);
this.status.set_blank(false);
let count = 0;
const id = this.corner_timeout_id = Mainloop.timeout_add(Math.floor(speed / CORNER_UPDATE_FREQUENCY), (function() {
if (id === this.corner_timeout_id && this.status.is_transparent()) {
count++;
let alpha = Equations.linear(Math.floor(count * (speed / CORNER_UPDATE_FREQUENCY)), maximized, unmaximized - maximized, speed);
update_corner_alpha(alpha);
if (count > CORNER_UPDATE_FREQUENCY) {
update_corner_alpha(unmaximized);
return false;
}
} else {
return false;
}
return true;
}).bind(this));
} else {
update_corner_alpha();
}
/* Keep the status up to date */
this.status.set_transparent(true);
this.status.set_blank(false);
}
/**
* Fades the panel's alpha to 0. Used for opening the overview & displaying the screenShield.
*
*/
function blank_fade_out() {
this.status.set_transparent(true);
this.status.set_blank(true);
/* Completely remove every possible background style... */
Theming.remove_background_color();
Theming.strip_panel_background_image();
Theming.strip_panel_styling();
Theming.apply_panel_transparency();
// TODO: These corners...
if (!Settings.get_hide_corners()) {
let speed = St.Settings.get().slow_down_factor * Settings.get_transition_speed();
let maximized = Settings.get_maximized_opacity();
let count = 0;
const id = this.corner_timeout_id = Mainloop.timeout_add(Math.floor(speed / CORNER_UPDATE_FREQUENCY), (function() {
if (id === this.corner_timeout_id && this.status.is_transparent()) {
count++;
let alpha = Equations.linear(Math.floor(count * (speed / CORNER_UPDATE_FREQUENCY)), maximized, -maximized, speed);
update_corner_alpha(alpha);
if (count > CORNER_UPDATE_FREQUENCY) {
update_corner_alpha(0);
return false;
}
} else {
return false;
}
return true;
}).bind(this));
} else {
update_corner_alpha();
}
}
/**
* Updates the alpha value of the corners' coloring. Slightly awkward overlap is unavoidable.
*
* @param {Number} alpha - Alpha value ranging from 0-255.
*/
function update_corner_alpha(alpha = null) {
if (alpha === null) {
if (Settings.get_hide_corners()) {
alpha = 0;
} else {
alpha = this.status.is_transparent() ? Theming.get_unmaximized_opacity() : Theming.get_maximized_opacity();
}
}
Theming.set_corner_color({
alpha: alpha
});
}