widgets/cliprect: use layer.effect on content item over property

ShaderEffectSource as a property not parented to an item does not
update its sourceItem's QQuickWindow when its own is changed. This
lead to use after frees and broken effects when using ClippingRectangle.
This commit is contained in:
outfoxxed committed 2026-01-28 01:43:31 -08:00
1 parent 191085a882
commit 1e4d804e7f
2 files changed
+11 -13

No files matched your search

+10 -13
View File
@@ -1,3 +1,5 @@
pragma ComponentBehavior: Bound
import QtQuick
///! Rectangle capable of clipping content inside its border.
@@ -24,7 +26,7 @@ Item {
/// Defaults to true if any corner has a non-zero radius, otherwise false.
property /*bool*/alias antialiasing: rectangle.antialiasing
/// The background color of the rectangle, which goes under its content.
property /*color*/alias color: shader.backgroundColor
property color color: "white"
/// See @@QtQuick.Rectangle.border.
property clippingRectangleBorder border
/// Radius of all corners. Defaults to 0.
@@ -70,19 +72,14 @@ Item {
anchors.fill: parent
anchors.margins: root.contentInsideBorder ? root.border.width : 0
}
}
ShaderEffect {
id: shader
anchors.fill: root
fragmentShader: `qrc:/Quickshell/Widgets/shaders/cliprect${root.contentUnderBorder ? "-ub" : ""}.frag.qsb`
property Rectangle rect: rectangle
property color backgroundColor: "white"
property color borderColor: root.border.color
property ShaderEffectSource content: ShaderEffectSource {
hideSource: true
sourceItem: contentItemContainer
layer.enabled: true
layer.samplerName: "content"
layer.effect: ShaderEffect {
fragmentShader: `qrc:/Quickshell/Widgets/shaders/cliprect${root.contentUnderBorder ? "-ub" : ""}.frag.qsb`
property Rectangle rect: rectangle
property color backgroundColor: root.color
property color borderColor: root.border.color
}
}
}