88 lines
2.4 KiB
QML
88 lines
2.4 KiB
QML
pragma ComponentBehavior: Bound
|
|
|
|
import QtQuick
|
|
import Quickshell
|
|
import qs.Components
|
|
import qs.Config
|
|
|
|
Item {
|
|
id: root
|
|
|
|
required property real borderThickness
|
|
readonly property alias content: content
|
|
readonly property bool horizontal: position !== "left"
|
|
// property real offsetScale: y > 0 || content.hasCurrent ? 0 : 1
|
|
property real offsetScale: {
|
|
if (content.hasCurrent)
|
|
return 0;
|
|
if (position === "top")
|
|
return y > 0 ? 0 : 1;
|
|
if (position === "bottom")
|
|
return 1;
|
|
return x > 0 ? 0 : 1;
|
|
}
|
|
required property string position
|
|
required property ShellScreen screen
|
|
|
|
anchors.bottom: position === "bottom" ? parent.bottom : undefined
|
|
clip: true
|
|
implicitHeight: horizontal ? content.implicitHeight * (1 - offsetScale) : content.implicitHeight
|
|
implicitWidth: horizontal ? content.implicitWidth : content.implicitWidth * (1 - offsetScale)
|
|
visible: width > 0 && height > 0
|
|
x: {
|
|
if (!horizontal)
|
|
return 0;
|
|
const off = content.currentCenter - borderThickness - content.nonAnimWidth / 2;
|
|
const diff = parent.width - Math.floor(off + content.nonAnimWidth);
|
|
if (diff < 0)
|
|
return off + diff;
|
|
return Math.floor(Math.max(off, 0));
|
|
}
|
|
y: {
|
|
if (horizontal)
|
|
return 0;
|
|
|
|
const off = content.currentCenter - borderThickness - content.nonAnimHeight / 2;
|
|
const diff = parent.height - Math.floor(off + content.nonAnimHeight);
|
|
if (diff < 0)
|
|
return off + diff;
|
|
return Math.max(off, 0);
|
|
}
|
|
|
|
Behavior on offsetScale {
|
|
Anim {
|
|
}
|
|
}
|
|
Behavior on x {
|
|
enabled: !root.horizontal || root.offsetScale < 1
|
|
|
|
Anim {
|
|
duration: content.animLength
|
|
easing.bezierCurve: content.animCurve
|
|
}
|
|
}
|
|
Behavior on y {
|
|
enabled: root.horizontal || root.offsetScale < 1
|
|
|
|
Anim {
|
|
duration: content.animLength
|
|
easing.bezierCurve: content.animCurve
|
|
}
|
|
}
|
|
|
|
Wrapper {
|
|
id: content
|
|
|
|
anchors.bottom: root.position === "bottom" ? parent.bottom : undefined
|
|
anchors.bottomMargin: (-implicitHeight - 5) * root.offsetScale
|
|
anchors.horizontalCenter: root.horizontal ? parent.horizontalCenter : undefined
|
|
anchors.left: root.horizontal ? undefined : parent.left
|
|
anchors.leftMargin: (-implicitWidth - 5) * root.offsetScale
|
|
anchors.top: root.position === "top" ? parent.top : undefined
|
|
anchors.topMargin: (-implicitHeight - 5) * root.offsetScale
|
|
anchors.verticalCenter: root.horizontal ? undefined : parent.verticalCenter
|
|
offsetScale: root.offsetScale
|
|
screen: root.screen
|
|
}
|
|
}
|