eb78b1ca3a
Summary: There were several reasons to rewrite the Minimize Animation effect in JavaScript: to simplify code and to get rid of full repaints. One could say that nothing prevents us from calculating the dirty region in postPaintScreen or postPaintWindow and it is correct, but with the scripting effects API the dirty region will be calculated for us, so we can focus more on "what we want" instead of "how". Visually, the "old" effect and the rewritten one look quite the same. Except one tiny bit: if a window doesn't have an icon in the task manager, it won't be animated. The reason for that is the purpose of this effect is to show where the window will be after it's minimized, if the window doesn't have icon in the task manager, one can't click at the center of the screen to unminimize the window. There is one significant change, the name of the effect was changed to "Squash". If we put this effect and the Magic lamp effect under "Window Minimize Animation" category (or if we add some "heading" label), then the old name and the name of the category would "conflict". The new name was suggested by Nate Graham and it very closely describes what the effect does. "Scale" doesn't fit this effect because while a window is being animated, its aspect ratio is not preserved. Reviewers: #kwin, #plasma, davidedmundson Reviewed By: #kwin, #plasma, davidedmundson Subscribers: davidedmundson, kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D16372
150 lines
4.9 KiB
JavaScript
150 lines
4.9 KiB
JavaScript
/********************************************************************
|
|
This file is part of the KDE project.
|
|
|
|
Copyright (C) 2018 Vlad Zagorodniy <vladzzag@gmail.com>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*********************************************************************/
|
|
|
|
var squashEffect = {
|
|
duration: animationTime(250),
|
|
loadConfig: function () {
|
|
"use strict";
|
|
squashEffect.duration = animationTime(250);
|
|
},
|
|
slotWindowMinimized: function (window) {
|
|
"use strict";
|
|
if (effects.hasActiveFullScreenEffect) {
|
|
return;
|
|
}
|
|
|
|
// 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) {
|
|
// TODO: Try to reverse it instead.
|
|
cancel(window.unminimizeAnimation);
|
|
delete window.unminimizeAnimation;
|
|
}
|
|
|
|
var windowRect = window.geometry;
|
|
|
|
window.minimizeAnimation = animate({
|
|
window: window,
|
|
curve: QEasingCurve.InOutSine,
|
|
duration: squashEffect.duration,
|
|
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) {
|
|
"use strict";
|
|
if (effects.hasActiveFullScreenEffect) {
|
|
return;
|
|
}
|
|
|
|
// 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) {
|
|
// TODO: Try to reverse it instead.
|
|
cancel(window.minimizeAnimation);
|
|
delete window.minimizeAnimation;
|
|
}
|
|
|
|
var windowRect = window.geometry;
|
|
|
|
window.unminimizeAnimation = animate({
|
|
window: window,
|
|
curve: QEasingCurve.InOutSine,
|
|
duration: squashEffect.duration,
|
|
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
|
|
}
|
|
]
|
|
});
|
|
},
|
|
init: function () {
|
|
"use strict";
|
|
effect.configChanged.connect(squashEffect.loadConfig);
|
|
effects.windowMinimized.connect(squashEffect.slotWindowMinimized);
|
|
effects.windowUnminimized.connect(squashEffect.slotWindowUnminimized);
|
|
}
|
|
};
|
|
|
|
squashEffect.init();
|