- powerProfile now hides on machines without power-profiles-daemon by checking against the published profile set rather than a never-undefined enum, and uses mdi-scale-balance for Balanced (not battery-charging). - networkPanel renames the QML-keyword-shadowing 'signal' property to 'signalStrength'; ethernet glyph corrected to mdi-ethernet (not the access-point icon). - workspacesPro indicator color guards against null bar during construction. - Common.Slider keeps an internal liveValue so external value bindings survive a drag; sliders fed from PipeWire/brightnessctl now follow external changes after the user interacts. - audioPanel drops the redundant default-sink PwObjectTracker since the candidate-sinks tracker already covers it. - networkPanel guards scan/connect commands against re-entry while the previous Process is running. - notificationCenter only instantiates its NotificationServer when the module is opted in via settings.replaceMako (default off) so it does not collide with mako out of the box. - PopupCard fully opaque while open (previously 0.98) — removes a visible ghost outline on first render. - Drop dead code: calendar trailing MouseArea, weatherFlyout's unused parseForecast/forecast property, idleInhibitor's holdSeconds, media's scrollAnim.position; gate media's scroll animation off in vertical bar mode.
93 lines
2.4 KiB
QML
93 lines
2.4 KiB
QML
import QtQuick
|
|
import Quickshell
|
|
|
|
PopupWindow {
|
|
id: root
|
|
|
|
required property Item anchorItem
|
|
required property QtObject bar
|
|
property var owner: null
|
|
property int margin: 8
|
|
property int padding: 14
|
|
property int contentWidth: 280
|
|
property int contentHeight: 200
|
|
property bool open: false
|
|
|
|
readonly property var coordinatorKey: owner || root
|
|
|
|
function closePopout() {
|
|
if (owner && "closePopout" in owner) owner.closePopout()
|
|
else root.open = false
|
|
}
|
|
|
|
default property alias contentItem: contentHolder.children
|
|
|
|
visible: open
|
|
color: "transparent"
|
|
implicitWidth: contentWidth
|
|
implicitHeight: contentHeight
|
|
|
|
onOpenChanged: {
|
|
if (!bar) return
|
|
if (open) bar.requestPopout(coordinatorKey)
|
|
else if (bar.activePopout === coordinatorKey) bar.releasePopout(coordinatorKey)
|
|
}
|
|
|
|
anchor {
|
|
id: popupAnchor
|
|
window: anchorItem ? anchorItem.QsWindow.window : null
|
|
adjustment: PopupAdjustment.Slide
|
|
edges: Edges.Top | Edges.Left
|
|
gravity: Edges.Bottom | Edges.Right
|
|
rect.width: 1
|
|
rect.height: 1
|
|
|
|
onAnchoring: {
|
|
if (!root.anchorItem || !root.bar) return
|
|
|
|
var target = root.anchorItem
|
|
var popupWidth = root.implicitWidth
|
|
var popupHeight = root.implicitHeight
|
|
var localX = target.width / 2 - popupWidth / 2
|
|
var localY = target.height + root.margin
|
|
|
|
if (root.bar.position === "bottom") {
|
|
localY = -popupHeight - root.margin
|
|
} else if (root.bar.position === "left") {
|
|
localX = target.width + root.margin
|
|
localY = target.height / 2 - popupHeight / 2
|
|
} else if (root.bar.position === "right") {
|
|
localX = -popupWidth - root.margin
|
|
localY = target.height / 2 - popupHeight / 2
|
|
}
|
|
|
|
var window = target.QsWindow.window
|
|
if (!window) return
|
|
|
|
var point = window.contentItem.mapFromItem(target, localX, localY)
|
|
popupAnchor.rect.x = Math.round(point.x)
|
|
popupAnchor.rect.y = Math.round(point.y)
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
id: card
|
|
anchors.fill: parent
|
|
color: root.bar ? root.bar.background : "#101315"
|
|
border.color: root.bar ? root.bar.foreground : "#cacccc"
|
|
border.width: 1
|
|
radius: 0
|
|
opacity: root.open ? 1.0 : 0
|
|
|
|
Behavior on opacity {
|
|
NumberAnimation { duration: 140; easing.type: Easing.OutCubic }
|
|
}
|
|
|
|
Item {
|
|
id: contentHolder
|
|
anchors.fill: parent
|
|
anchors.margins: root.padding
|
|
}
|
|
}
|
|
}
|