Warning, /plasma/latte-dock/declarativeimports/components/GlowPoint.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 SPDX-FileCopyrightText: 2019 Michail Vourlakos <mvourlakos@gmail.com>
0003 SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005
0006 import QtQuick 2.0
0007 import QtGraphicalEffects 1.0
0008
0009 import org.kde.plasma.components 2.0 as Components
0010 import org.kde.plasma.core 2.0 as PlasmaCore
0011 import org.kde.plasma.plasmoid 2.0
0012
0013 Item{
0014 // property string color
0015 id: glowItem
0016
0017 property bool glow3D: true
0018 property bool roundCorners: true
0019 property bool showBorder: false
0020 property bool showAttention: false
0021 property bool showGlow: false
0022
0023 property int animation: 250
0024 property int location: PlasmaCore.Types.BottomEdge
0025 property int size: 10
0026
0027 property real glowOpacity: 0.75
0028
0029 property color attentionColor: "red"
0030 property color basicColor: "blue"
0031 property color contrastColor: "#b0b0b0"
0032 property color currentColor: glowItem.showAttention ? animationColorAlpha : basicColorAlpha
0033
0034 property color animationColor: "red" // it is used only internally for the animation
0035 readonly property color basicColorAlpha: Qt.rgba(basicColor.r, basicColor.g, basicColor.b, glowOpacity)
0036 readonly property color animationColorAlpha: Qt.rgba(animationColor.r, animationColor.g, animationColor.b, glowOpacity)
0037 readonly property color contrastColorAlpha: Qt.rgba(contrastColor.r, contrastColor.g, contrastColor.b, Math.min(glowOpacity+0.25,1))
0038 readonly property color contrastColorAlpha2: Qt.rgba(contrastColor.r, contrastColor.g, contrastColor.b, 0.3)
0039
0040 readonly property bool isVertical: (location === PlasmaCore.Types.LeftEdge) || (location === PlasmaCore.Types.RightEdge)
0041 readonly property bool isHorizontal: !isVertical
0042
0043 Grid{
0044 id: mainGlow
0045 anchors.horizontalCenter: parent.horizontalCenter
0046 anchors.verticalCenter: parent.verticalCenter
0047 visible: glowItem.showGlow
0048
0049 rows: isHorizontal ? 1 : 0
0050 columns: isVertical ? 1 : 0
0051
0052 property int halfCorner: 3*glowItem.size
0053 property int fullCorner: 6*glowItem.size
0054
0055 Item {
0056 id: firstGlowCorner
0057 width: isHorizontal ? mainGlow.halfCorner : mainGlow.fullCorner
0058 height: isHorizontal ? mainGlow.fullCorner : mainGlow.halfCorner
0059 clip: true
0060
0061 Item {
0062 id: firstGlowCornerFull
0063 width: mainGlow.fullCorner
0064 height: mainGlow.fullCorner
0065
0066 RadialGradient {
0067 anchors.fill: parent
0068 gradient: Gradient {
0069 GradientStop { position: 0.0; color: "transparent" }
0070 GradientStop { position: 0.07; color: glowItem.contrastColorAlpha }
0071 GradientStop { position: 0.125; color: glowItem.currentColor }
0072 GradientStop { position: 0.4; color: "transparent" }
0073 GradientStop { position: 1; color: "transparent" }
0074 }
0075 }
0076
0077 states: [
0078 State{
0079 name: "*"
0080 when: isHorizontal
0081
0082 AnchorChanges{
0083 target:firstGlowCornerFull;
0084 anchors{ bottom: undefined; left:parent.left;}
0085 }
0086 },
0087 State{
0088 name: "vertical"
0089 when: isVertical
0090
0091 AnchorChanges{
0092 target:firstGlowCornerFull;
0093 anchors{ top: parent.top; left:undefined;}
0094 }
0095 }
0096 ]
0097 }
0098 }
0099
0100 Item {
0101 id:mainGlowPart
0102 width: isHorizontal ? glowItem.width - glowItem.size : mainGlow.fullCorner
0103 height: isHorizontal ? mainGlow.fullCorner : glowItem.height - glowItem.size
0104
0105 LinearGradient {
0106 anchors.fill: parent
0107 start: {
0108 if (location === PlasmaCore.Types.BottomEdge || location === PlasmaCore.Types.Floating)
0109 return Qt.point(0, 0);
0110 else if (location === PlasmaCore.Types.TopEdge)
0111 return Qt.point(0, mainGlow.fullCorner);
0112 else if (location === PlasmaCore.Types.LeftEdge)
0113 return Qt.point(mainGlow.fullCorner, 0);
0114 else if (location === PlasmaCore.Types.RightEdge)
0115 return Qt.point(0, 0);
0116
0117 return Qt.point(mainGlow.fullCorner, 0);
0118 }
0119 end: {
0120 if (location === PlasmaCore.Types.BottomEdge || location === PlasmaCore.Types.Floating)
0121 return Qt.point(0, mainGlow.fullCorner);
0122 else if (location === PlasmaCore.Types.TopEdge)
0123 return Qt.point(0, 0);
0124 else if (location === PlasmaCore.Types.LeftEdge)
0125 return Qt.point(0,0);
0126 else if (location === PlasmaCore.Types.RightEdge)
0127 return Qt.point(mainGlow.fullCorner, 0);
0128
0129 return Qt.point(0,0);
0130 }
0131
0132 gradient: Gradient {
0133 GradientStop { position: 0.0; color: "transparent" }
0134 GradientStop { position: 0.08; color: "transparent" }
0135 GradientStop { position: 0.37; color: glowItem.currentColor }
0136 GradientStop { position: 0.43; color: glowItem.contrastColorAlpha }
0137 GradientStop { position: 0.57; color: glowItem.contrastColorAlpha }
0138 GradientStop { position: 0.63; color: glowItem.currentColor }
0139 GradientStop { position: 0.92; color: "transparent" }
0140 GradientStop { position: 1; color: "transparent" }
0141 }
0142 }
0143 }
0144
0145 Item {
0146 id:lastGlowCorner
0147 width: isHorizontal ? mainGlow.halfCorner : mainGlow.fullCorner
0148 height: isHorizontal ? mainGlow.fullCorner : mainGlow.halfCorner
0149 clip: true
0150
0151 Item {
0152 id: lastGlowCornerFull
0153 width: mainGlow.fullCorner
0154 height: mainGlow.fullCorner
0155
0156 RadialGradient {
0157 anchors.fill: parent
0158 gradient: Gradient {
0159 GradientStop { position: 0.0; color: "transparent" }
0160 GradientStop { position: 0.07; color: glowItem.contrastColorAlpha }
0161 GradientStop { position: 0.125; color: glowItem.currentColor }
0162 GradientStop { position: 0.4; color: "transparent"}
0163 GradientStop { position: 1; color: "transparent" }
0164 }
0165 }
0166
0167 states: [
0168 State{
0169 name: "*"
0170 when: isHorizontal
0171
0172 AnchorChanges{
0173 target:lastGlowCornerFull;
0174 anchors{ bottom: undefined; right:parent.right;}
0175 }
0176 },
0177 State{
0178 name: "vertical"
0179 when: isVertical
0180
0181 AnchorChanges{
0182 target:lastGlowCornerFull;
0183 anchors{ bottom: parent.bottom; right:undefined;}
0184 }
0185 }
0186 ]
0187 }
0188 }
0189 }
0190
0191 //! add border around indicator without reducing its size
0192 Loader{
0193 anchors.centerIn: mainElement
0194 active: glowItem.showBorder
0195
0196 sourceComponent:Rectangle {
0197 width: mainElement.width + size
0198 height: mainElement.height + size
0199 anchors.centerIn: parent
0200
0201 color: contrastColorAlpha2
0202 radius: glowItem.roundCorners ? Math.min(width,height) / 2 : 0
0203
0204 property int size: Math.min(2*Math.max(1,mainElement.width/5 ),
0205 2*Math.max(1,mainElement.height/5 ))
0206 }
0207 }
0208
0209 Item{
0210 id:mainElement
0211
0212 width: Math.max(glowItem.size, parent.width)
0213 height: Math.max(glowItem.size, parent.height)
0214 anchors.centerIn: parent
0215
0216 Rectangle {
0217 id: smallCircle
0218 anchors.centerIn: parent
0219 anchors.fill: parent
0220
0221 color: glowItem.basicColor
0222 radius: glowItem.roundCorners ? Math.min(width,height) / 2 : 0
0223 visible: !glowItem.showAttention
0224 }
0225
0226 Loader{
0227 anchors.centerIn: parent
0228 anchors.fill: parent
0229
0230 active: glowItem.showAttention
0231
0232 sourceComponent:Rectangle {
0233 id: smallCircleInAttention
0234
0235 color: glowItem.animationColor
0236 radius: smallCircle.radius
0237
0238 SequentialAnimation{
0239 running: glowItem.showAttention
0240 loops: Animation.Infinite
0241 alwaysRunToEnd: true
0242
0243 PropertyAnimation {
0244 target: glowItem
0245 property: "animationColor"
0246 to: glowItem.animationColor
0247 duration: glowItem.animation
0248 easing.type: Easing.InOutQuad
0249 }
0250
0251 PropertyAnimation {
0252 target: glowItem
0253 property: "animationColor"
0254 to: glowItem.basicColor
0255 duration: glowItem.animation
0256 easing.type: Easing.InOutQuad
0257 }
0258 }
0259 }
0260 }
0261
0262 Rectangle {
0263 visible: glowItem.showGlow && glowItem.glow3D
0264 anchors.horizontalCenter: parent.horizontalCenter
0265 anchors.verticalCenter: parent.verticalCenter
0266
0267 anchors.horizontalCenterOffset: {
0268 if (isHorizontal)
0269 return 0;
0270 else if (location === PlasmaCore.Types.LeftEdge)
0271 return -glowItem.width / 7;
0272 else if (location === PlasmaCore.Types.RightEdge)
0273 return glowItem.width / 7;
0274
0275 return 0;
0276 }
0277 anchors.verticalCenterOffset: {
0278 if (isVertical)
0279 return 0;
0280 else if (location === PlasmaCore.Types.BottomEdge)
0281 return glowItem.height / 7;
0282 else if (location === PlasmaCore.Types.TopEdge)
0283 return -glowItem.height / 7;
0284
0285 return 0;
0286 }
0287
0288 width: isHorizontal ? Math.max(mainGlowPart.width, shadow) : shadow
0289 height: isHorizontal ? shadow : Math.max(mainGlowPart.height, shadow)
0290 radius: isHorizontal ? height/2 : width/2
0291
0292 property int shadow: glowItem.size / 3
0293
0294 color: glowItem.contrastColorAlpha
0295 opacity: 0.2
0296 }
0297 }
0298 }