72 lines
2.3 KiB
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
|
|
}
|
|
}
|