Warning, /plasma/latte-dock/declarativeimports/components/BadgeText.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.2
0007 import QtGraphicalEffects 1.0
0008
0009 import org.kde.plasma.plasmoid 2.0
0010
0011 Rectangle {
0012 property double proportion: 0
0013
0014 property double previousProportion: 0
0015
0016 property bool style3d: true
0017
0018 property int numberValue
0019 property string textValue
0020
0021 property bool fullCircle: true
0022 property bool showNumber: true
0023 property bool showText: false
0024 property bool textWithBackgroundColor: false
0025
0026 property int radiusPerCentage: 100
0027 property int minimumWidth: 0
0028 property int maximumWidth: 9999
0029
0030 property double circleOpacity: 1
0031 property double fontPixelSize: partSize // * 0.55
0032
0033 property double stdThickness: partSize < 0 ? 0 : partSize // "/2.1"
0034 property double circleThicknessAttr: fullCircle ? 0 : stdThickness * 0.9
0035 property double partSize: height / 2
0036 property double pi2: Math.PI * 2
0037
0038 width: Math.max(minimumWidth, valueText.width + 4*units.smallSpacing)
0039
0040 color: theme.backgroundColor
0041 radius: (radiusPerCentage / 100) * (height / 2)
0042 border.width: 0 //Math.max(1,width/64)
0043
0044 property int borderWidth: 1
0045 property real borderOpacity: 1
0046 property color borderColor: theme.textColor
0047 property color textColor: theme.textColor
0048 property color highlightedColor: theme.buttonFocusColor
0049
0050 readonly property bool singleCharacter: (showNumber && numberValue<=9 && numberValue>=0)|| (showText && textValue.length===1)
0051
0052 onProportionChanged: {
0053 if (proportion<0.03) {
0054 previousProportion = 0;
0055 }
0056
0057 //console.log(previousProportion + " - "+proportion);
0058 var currentStep = (proportion - previousProportion);
0059 if ((currentStep >= 0.01) || (proportion>=1 && previousProportion !==1)) {
0060 // console.log("request repaint...");
0061 previousProportion = proportion;
0062 repaint();
0063 }
0064 }
0065
0066 function repaint() {
0067 canvas.requestPaint()
0068 }
0069
0070 Canvas {
0071 id: canvas
0072
0073 property int lineWidth: 1
0074 property bool fill: true
0075 property bool stroke: true
0076 property real alpha: 1.0
0077
0078 // edge bleeding fix
0079 readonly property double filler: 0.01
0080
0081 width: parent.width - 2 * parent.borderWidth
0082 height: parent.height - 2 * parent.borderWidth
0083 opacity: proportion > 0 ? 1 : 0
0084
0085 anchors.centerIn: parent
0086
0087 property color drawColor: highlightedColor
0088
0089 onDrawColorChanged: requestPaint();
0090
0091 onPaint: {
0092 var ctx = getContext('2d');
0093 ctx.clearRect(0, 0, canvas.width, canvas.height);
0094 ctx.fillStyle = drawColor;
0095
0096 var startRadian = - Math.PI / 2;
0097
0098 var radians = pi2 * proportion;
0099
0100 ctx.beginPath();
0101 ctx.arc(width/2, height/2, stdThickness, startRadian, startRadian + radians + filler, false);
0102 ctx.arc(width/2, height/2, circleThicknessAttr, startRadian + radians + filler, startRadian, true);
0103
0104 ctx.closePath();
0105 ctx.fill();
0106 }
0107 }
0108
0109 Rectangle {
0110 id: badgerBackground
0111 anchors.fill: canvas
0112 color: canvas.drawColor
0113
0114 visible: proportion === 1 && showNumber
0115 radius: parent.radius
0116 }
0117
0118 Text {
0119 id: valueText
0120 anchors.centerIn: canvas
0121
0122 width: Math.min(maximumWidth - 4*units.smallSpacing, implicitWidth)
0123 horizontalAlignment: Text.AlignHCenter
0124 verticalAlignment: Text.AlignVCenter
0125
0126 elide: Text.ElideRight
0127
0128 text: {
0129 if (showNumber) {
0130 if (numberValue > 9999) {
0131 return i18nc("Over 9999 new messages, overlay, keep short", "9,999+");
0132 } else if (numberValue > 0) {
0133 return numberValue.toLocaleString(Qt.locale(), 'f', 0);
0134 }
0135 }
0136
0137 if (showText) {
0138 return textValue;
0139 }
0140
0141 return "";
0142 }
0143 font.pixelSize: 0.62 * parent.height
0144 font.bold: true
0145 color: textWithBackgroundColor ? parent.color : parent.textColor
0146 visible: showNumber || showText
0147 }
0148
0149 Rectangle{
0150 anchors.fill: parent
0151 anchors.topMargin: parent.borderWidth
0152 anchors.bottomMargin: parent.borderWidth
0153 anchors.leftMargin: parent.borderWidth
0154 anchors.rightMargin: parent.borderWidth
0155 color: "transparent"
0156 border.width: parent.borderWidth > 0 ? parent.borderWidth+1 : 0
0157 border.color: "black"
0158 radius: parent.radius
0159 opacity: 0.4
0160
0161 visible: style3d
0162 }
0163
0164 Rectangle{
0165 anchors.fill: parent
0166 border.width: parent.borderWidth
0167 border.color: {
0168 if (style3d) {
0169 return parent.borderColor
0170 }
0171
0172 return proportion === 1 ? parent.highlightedColor : parent.color
0173 }
0174 color: "transparent"
0175 radius: parent.radius
0176 opacity: parent.borderOpacity
0177 }
0178 }
0179