Files
quickdots/components/PopupPanel.qml

72 lines
2.3 KiB
QML

import QtQuick
import Quickshell
import Quickshell.Wayland
import "../config" as Cfg
PanelWindow {
id: popup
property string ns: ""
property var chipRoot: null
property int cardWidth: 260
property bool hasKeyboardFocus: false
property alias clipItem: popupClip
default property alias content: popupClip.data
screen: chipRoot ? chipRoot.targetScreen : null
visible: false
color: "transparent"
property bool popupOpen: false
property real popupCenterX: -1
function _doOpen() {
hideTimer.stop()
if (chipRoot) {
popupCenterX = chipRoot.mapToItem(null, 0, 0).x + chipRoot.width / 2
}
visible = true; popupOpen = true
}
function open() {
_doOpen()
}
function close() { popupOpen = false; hideTimer.restart() }
function toggle() { popupOpen ? close() : open() }
PopupHideTimer {
id: hideTimer
onTriggered: popup.visible = false
}
anchors { top: true; bottom: true; left: true; right: true }
WlrLayershell.layer: WlrLayer.Top
WlrLayershell.namespace: "main-shell-" + ns
WlrLayershell.exclusiveZone: -1
WlrLayershell.keyboardFocus: hasKeyboardFocus ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None
mask: popupOpen ? null : _noInput
Region { id: _noInput }
MouseArea { anchors.fill: parent; onClicked: popup.close() }
Item {
id: popupClip
property int screenPad: chipRoot ? chipRoot.barMargin + 10 : 30
x: {
if (!chipRoot && popupCenterX < 0) return 0
let cx = popupCenterX >= 0 ? popupCenterX : chipRoot.mapToItem(null, 0, 0).x + chipRoot.width / 2
return Math.max(screenPad, Math.min(cx - cardWidth / 2, parent.width - cardWidth - screenPad))
}
width: cardWidth
anchors.top: chipRoot && chipRoot.isTop ? parent.top : undefined
anchors.bottom: chipRoot && chipRoot.isTop ? undefined : parent.bottom
anchors.topMargin: chipRoot && chipRoot.isTop ? (chipRoot.barHeight + chipRoot.barEdgePad + 10) : 0
anchors.bottomMargin: chipRoot && chipRoot.isTop ? 0 : (chipRoot.barHeight + chipRoot.barEdgePad + 10)
height: chipRoot ? parent.height - chipRoot.barHeight - chipRoot.barEdgePad - 10 : parent.height
clip: true
}
}