add scroll edge fade to some scrolled windows

This commit is contained in:
end-4
2025-09-23 11:14:34 +02:00
parent 2b47083c12
commit fc9bda9f7f
8 changed files with 178 additions and 93 deletions
@@ -88,7 +88,7 @@ Item {
delegate: StyledText { delegate: StyledText {
required property string modelData required property string modelData
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent?.horizontalCenter
font { font {
pixelSize: modelData.match(/am|pm/i) ? 26 : 68 pixelSize: modelData.match(/am|pm/i) ? 26 : 68
family: Appearance.font.family.expressive family: Appearance.font.family.expressive
@@ -4,6 +4,7 @@ import qs.services
import qs.modules.common.functions import qs.modules.common.functions
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import Qt5Compat.GraphicalEffects
import Quickshell import Quickshell
import Quickshell.Hyprland import Quickshell.Hyprland
import Quickshell.Services.Notifications import Quickshell.Services.Notifications
@@ -220,12 +221,30 @@ Item { // Notification item area
PointingHandLinkHover {} PointingHandLinkHover {}
} }
Item {
Layout.fillWidth: true
implicitWidth: actionsFlickable.implicitWidth
implicitHeight: actionsFlickable.implicitHeight
layer.enabled: true
layer.effect: OpacityMask {
maskSource: Rectangle {
width: actionsFlickable.width
height: actionsFlickable.height
radius: Appearance.rounding.small
}
}
ScrollEdgeFade {
target: actionsFlickable
vertical: false
}
StyledFlickable { // Notification actions StyledFlickable { // Notification actions
id: actionsFlickable id: actionsFlickable
Layout.fillWidth: true anchors.fill: parent
implicitHeight: actionRowLayout.implicitHeight implicitHeight: actionRowLayout.implicitHeight
contentWidth: actionRowLayout.implicitWidth contentWidth: actionRowLayout.implicitWidth
clip: !onlyNotification
Behavior on opacity { Behavior on opacity {
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this) animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
@@ -311,3 +330,4 @@ Item { // Notification item area
} }
} }
} }
}
@@ -0,0 +1,59 @@
import QtQuick
import qs.modules.common
import qs.modules.common.functions
Item {
id: root
z: 99
required property Item target
property real fadeSize: Appearance.m3colors.darkmode ? 40 : 20
property color color: ColorUtils.transparentize(Appearance.colors.colShadow, Appearance.m3colors.darkmode ? 0 : 0.7)
property bool vertical: true
anchors.fill: target
EndGradient {
anchors {
top: parent.top
left: parent.left
right: vertical ? parent.right : undefined
bottom: vertical ? undefined : parent.bottom
}
shown: !(root.vertical ? root.target.atYBeginning : root.target.atXBeginning)
}
EndGradient {
anchors {
bottom: parent.bottom
right: parent.right
left: vertical ? parent.left : undefined
top: vertical ? undefined : parent.top
}
shown: !(root.vertical ? root.target.atYEnd : root.target.atXEnd)
rotation: 180
}
component EndGradient: Rectangle {
required property bool shown
height: vertical ? root.fadeSize : parent.height
width: vertical ? parent.width : root.fadeSize
opacity: shown ? 1 : 0
visible: opacity > 0
Behavior on opacity {
animation: Appearance?.animation.elementMoveFast.numberAnimation.createObject(this)
}
gradient: Gradient {
orientation: root.vertical ? Gradient.Vertical : Gradient.Horizontal
GradientStop {
position: 0.0
color: root.color
}
GradientStop {
position: 1.0
color: ColorUtils.transparentize(root.color)
}
}
}
}
@@ -50,4 +50,5 @@ Flickable {
root.scrollTargetY = root.contentY; root.scrollTargetY = root.contentY;
} }
} }
} }
@@ -308,6 +308,20 @@ Inline w/ backslash and round brackets \\(e^{i\\pi} + 1 = 0\\)
Item { // Messages Item { // Messages
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
layer.enabled: true
layer.effect: OpacityMask {
maskSource: Rectangle {
width: swipeView.width
height: swipeView.height
radius: Appearance.rounding.small
}
}
ScrollEdgeFade {
target: messageListView
vertical: true
}
StyledListView { // Message list StyledListView { // Message list
id: messageListView id: messageListView
anchors.fill: parent anchors.fill: parent
@@ -318,8 +332,8 @@ Inline w/ backslash and round brackets \\(e^{i\\pi} + 1 = 0\\)
mouseScrollFactor: Config.options.interactions.scrolling.mouseScrollFactor * 1.4 mouseScrollFactor: Config.options.interactions.scrolling.mouseScrollFactor * 1.4
property int lastResponseLength: 0 property int lastResponseLength: 0
property bool shouldAutoScroll: true property bool shouldAutoScroll: true
onContentYChanged: shouldAutoScroll = atYEnd onContentYChanged: shouldAutoScroll = atYEnd
onContentHeightChanged: { onContentHeightChanged: {
if (shouldAutoScroll) positionViewAtEnd(); if (shouldAutoScroll) positionViewAtEnd();
@@ -328,16 +342,6 @@ Inline w/ backslash and round brackets \\(e^{i\\pi} + 1 = 0\\)
if (shouldAutoScroll) positionViewAtEnd(); if (shouldAutoScroll) positionViewAtEnd();
} }
clip: true
layer.enabled: true
layer.effect: OpacityMask {
maskSource: Rectangle {
width: swipeView.width
height: swipeView.height
radius: Appearance.rounding.small
}
}
add: null // Prevent function calls from being janky add: null // Prevent function calls from being janky
model: ScriptModel { model: ScriptModel {
@@ -141,6 +141,21 @@ Item {
Item { Item {
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
layer.enabled: true
layer.effect: OpacityMask {
maskSource: Rectangle {
width: swipeView.width
height: swipeView.height
radius: Appearance.rounding.small
}
}
ScrollEdgeFade {
target: booruResponseListView
vertical: true
}
StyledListView { // Booru responses StyledListView { // Booru responses
id: booruResponseListView id: booruResponseListView
anchors.fill: parent anchors.fill: parent
@@ -151,16 +166,6 @@ Item {
property int lastResponseLength: 0 property int lastResponseLength: 0
clip: true
layer.enabled: true
layer.effect: OpacityMask {
maskSource: Rectangle {
width: swipeView.width
height: swipeView.height
radius: Appearance.rounding.small
}
}
model: ScriptModel { model: ScriptModel {
values: { values: {
if(root.responses.length > booruResponseListView.lastResponseLength) { if(root.responses.length > booruResponseListView.lastResponseLength) {
@@ -101,7 +101,7 @@ Item {
ColumnLayout { ColumnLayout {
anchors.fill: parent anchors.fill: parent
Flickable { StyledFlickable {
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
contentHeight: contentColumn.implicitHeight contentHeight: contentColumn.implicitHeight
@@ -105,7 +105,6 @@ Rectangle {
return true return true
} }
implicitHeight: tagRowLayout.implicitHeight implicitHeight: tagRowLayout.implicitHeight
// height: tagRowLayout.implicitHeight
contentWidth: tagRowLayout.implicitWidth contentWidth: tagRowLayout.implicitWidth
clip: true clip: true
@@ -118,9 +117,6 @@ Rectangle {
} }
} }
Behavior on height {
animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
}
Behavior on implicitHeight { Behavior on implicitHeight {
animation: Appearance.animation.elementMove.numberAnimation.createObject(this) animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
} }