mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-04-30 17:42:06 -04:00
* dock: add trash bin button - icon reflects content- filled/empty - multiple file manager support with nautilus as default, builtin as fallback - settingsspec at dock tab - context menu * fix: remove support for builtin filebrowser needs specific adaptors at FB adhering the trash freedesktop spec * fix: suppress auto-hide dock with trash context menu open * feat: allow for custom file manager command * feat: switch runner to proc.runcommand with toasts on command failures
138 lines
3.9 KiB
QML
138 lines
3.9 KiB
QML
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Widgets
|
|
import qs.Common
|
|
import qs.Services
|
|
import qs.Widgets
|
|
|
|
Item {
|
|
id: root
|
|
|
|
clip: false
|
|
|
|
property var dockApps: null
|
|
property var contextMenu: null
|
|
property var parentDockScreen: null
|
|
property real actualIconSize: 40
|
|
property real hoverAnimOffset: 0
|
|
|
|
property bool isHovered: mouseArea.containsMouse
|
|
property bool showTooltip: mouseArea.containsMouse
|
|
readonly property string tooltipText: TrashService.isEmpty ? I18n.tr("Trash") : (I18n.tr("Trash") + " (" + TrashService.count + ")")
|
|
|
|
readonly property bool isVertical: SettingsData.dockPosition === SettingsData.Position.Left || SettingsData.dockPosition === SettingsData.Position.Right
|
|
readonly property real animationDistance: actualIconSize
|
|
readonly property real animationDirection: {
|
|
if (SettingsData.dockPosition === SettingsData.Position.Bottom)
|
|
return -1;
|
|
if (SettingsData.dockPosition === SettingsData.Position.Top)
|
|
return 1;
|
|
if (SettingsData.dockPosition === SettingsData.Position.Right)
|
|
return -1;
|
|
if (SettingsData.dockPosition === SettingsData.Position.Left)
|
|
return 1;
|
|
return -1;
|
|
}
|
|
|
|
onIsHoveredChanged: {
|
|
if (mouseArea.pressed)
|
|
return;
|
|
if (isHovered) {
|
|
exitAnimation.stop();
|
|
if (!bounceAnimation.running)
|
|
bounceAnimation.restart();
|
|
} else {
|
|
bounceAnimation.stop();
|
|
exitAnimation.restart();
|
|
}
|
|
}
|
|
|
|
SequentialAnimation {
|
|
id: bounceAnimation
|
|
|
|
running: false
|
|
|
|
NumberAnimation {
|
|
target: root
|
|
property: "hoverAnimOffset"
|
|
to: animationDirection * animationDistance * 0.25
|
|
duration: Anims.durShort
|
|
easing.type: Easing.BezierSpline
|
|
easing.bezierCurve: Anims.emphasizedAccel
|
|
}
|
|
|
|
NumberAnimation {
|
|
target: root
|
|
property: "hoverAnimOffset"
|
|
to: animationDirection * animationDistance * 0.2
|
|
duration: Anims.durShort
|
|
easing.type: Easing.BezierSpline
|
|
easing.bezierCurve: Anims.emphasizedDecel
|
|
}
|
|
}
|
|
|
|
NumberAnimation {
|
|
id: exitAnimation
|
|
|
|
running: false
|
|
target: root
|
|
property: "hoverAnimOffset"
|
|
to: 0
|
|
duration: Anims.durShort
|
|
easing.type: Easing.BezierSpline
|
|
easing.bezierCurve: Anims.emphasizedDecel
|
|
}
|
|
|
|
MouseArea {
|
|
id: mouseArea
|
|
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
cursorShape: Qt.PointingHandCursor
|
|
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
|
|
|
onClicked: mouse => {
|
|
if (mouse.button === Qt.LeftButton) {
|
|
TrashService.openTrash();
|
|
} else if (mouse.button === Qt.RightButton) {
|
|
if (contextMenu) {
|
|
contextMenu.showForButton(root, root.height, parentDockScreen, dockApps);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Item {
|
|
id: visualContent
|
|
anchors.fill: parent
|
|
|
|
transform: Translate {
|
|
x: !isVertical ? 0 : hoverAnimOffset
|
|
y: !isVertical ? hoverAnimOffset : 0
|
|
}
|
|
|
|
Item {
|
|
anchors.centerIn: parent
|
|
width: actualIconSize
|
|
height: actualIconSize
|
|
|
|
IconImage {
|
|
id: trashIcon
|
|
anchors.centerIn: parent
|
|
width: actualIconSize - 4
|
|
height: actualIconSize - 4
|
|
smooth: true
|
|
asynchronous: true
|
|
source: Quickshell.iconPath(TrashService.isEmpty ? "user-trash" : "user-trash-full", "user-trash")
|
|
|
|
Behavior on opacity {
|
|
NumberAnimation {
|
|
duration: Theme.shortDuration
|
|
easing.type: Easing.OutCubic
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|