/* This file is part of the KDE project. SPDX-FileCopyrightText: 2018 Vlad Zahorodnii SPDX-License-Identifier: GPL-2.0-or-later */ "use strict"; var squashEffect = { duration: animationTime(250), loadConfig: function () { squashEffect.duration = animationTime(250); }, slotWindowMinimized: function (window) { if (effects.hasActiveFullScreenEffect) { return; } window.setData(Effect.WindowForceBlurRole, true); // If the window doesn't have an icon in the task manager, // don't animate it. var iconRect = window.iconGeometry; if (iconRect.width == 0 || iconRect.height == 0) { return; } if (window.unminimizeAnimation) { if (redirect(window.unminimizeAnimation, Effect.Backward)) { return; } cancel(window.unminimizeAnimation); delete window.unminimizeAnimation; } if (window.minimizeAnimation) { if (redirect(window.minimizeAnimation, Effect.Forward)) { return; } cancel(window.minimizeAnimation); } var windowRect = window.geometry; window.setData(Effect.WindowForceBlurRole, true); window.minimizeAnimation = animate({ window: window, curve: QEasingCurve.InCubic, duration: squashEffect.duration, keepAlive: false, animations: [ { type: Effect.Size, from: { value1: windowRect.width, value2: windowRect.height }, to: { value1: iconRect.width, value2: iconRect.height } }, { type: Effect.Translation, from: { value1: 0.0, value2: 0.0 }, to: { value1: iconRect.x - windowRect.x - (windowRect.width - iconRect.width) / 2, value2: iconRect.y - windowRect.y - (windowRect.height - iconRect.height) / 2, } }, { type: Effect.Opacity, from: 1.0, to: 0.0 } ] }); }, slotWindowUnminimized: function (window) { if (effects.hasActiveFullScreenEffect) { return; } window.setData(Effect.WindowForceBlurRole, true); // If the window doesn't have an icon in the task manager, // don't animate it. var iconRect = window.iconGeometry; if (iconRect.width == 0 || iconRect.height == 0) { return; } if (window.minimizeAnimation) { if (redirect(window.minimizeAnimation, Effect.Backward)) { return; } cancel(window.minimizeAnimation); delete window.minimizeAnimation; } if (window.unminimizeAnimation) { if (redirect(window.unminimizeAnimation, Effect.Forward)) { return; } cancel(window.unminimizeAnimation); } var windowRect = window.geometry; window.setData(Effect.WindowForceBlurRole, true); window.unminimizeAnimation = animate({ window: window, curve: QEasingCurve.OutCubic, duration: squashEffect.duration, keepAlive: false, animations: [ { type: Effect.Size, from: { value1: iconRect.width, value2: iconRect.height }, to: { value1: windowRect.width, value2: windowRect.height } }, { type: Effect.Translation, from: { value1: iconRect.x - windowRect.x - (windowRect.width - iconRect.width) / 2, value2: iconRect.y - windowRect.y - (windowRect.height - iconRect.height) / 2, }, to: { value1: 0.0, value2: 0.0 } }, { type: Effect.Opacity, from: 0.0, to: 1.0 } ] }); }, slotWindowAdded: function (window) { window.minimizedChanged.connect(() => { if (window.minimized) { squashEffect.slotWindowMinimized(window); } else { squashEffect.slotWindowUnminimized(window); } }); }, restoreForceBlurState: function(window) { window.setData(Effect.WindowForceBlurRole, null); }, init: function () { effect.configChanged.connect(squashEffect.loadConfig); effect.animationEnded.connect(this.restoreForceBlurState.bind(this)); effects.windowAdded.connect(squashEffect.slotWindowAdded); for (const window of effects.stackingOrder) { squashEffect.slotWindowAdded(window); } } }; squashEffect.init();