import QtQuick 2.12 import QtGraphicalEffects 1.12 import QtQuick.Shapes 1.12 import NERvGear.Preferences 1.0 as P import "../../qml/api" AdvpStyleTemplate { style: Shape { id: shape width: widget.width height: widget.height property int gradientStyle property string main_color: "transparent" LinearGradient { id: pureGradient GradientStop { color: main_color} } RadialGradient { id: radialGradient centerX: widget.width/2 centerY: widget.height/2 focalX: centerX focalY: centerY centerRadius: Math.min(width, height)/2 GradientStop {id: radialGradient_pstart; color: "transparent"} GradientStop {id: radialGradient_pmiddle; color: "transparent"} GradientStop {id: radialGradient_pend; color: "transparent"} } ConicalGradient { id: conicalGradient angle: -90 centerX: widget.width/2 centerY: widget.height/2 GradientStop{id: conicalGradient_pstart; position: 0.0; color: "transparent"} GradientStop{id: conicalGradient_pquarter; position: 0.25; color: "transparent"} GradientStop {id: conicalGradient_phalf; position: 0.5; color: "transparent"} GradientStop {id: conicalGradient_p3quarter; position: 0.75; color: "transparent"} GradientStop{id: conicalGradient_pend; position: 1.0; color: "transparent"} } ShapePath { id: main fillGradient: [pureGradient, radialGradient, conicalGradient][gradientStyle] startX: -1 startY: -1 PathLine { x: widget.width+1; y: -1 } PathLine { x: widget.width+1; y: widget.height+1 } PathLine { x: -1; y: widget.height+1 } } layer.enabled: true layer.effect: OpacityMask{ maskSource: AdvpCanvasTemplate { readonly property var audioData: new Array(128) //configs readonly property int linePosition: configs["Line Position"] readonly property real maxRange: configs["Max Range"] / 100 readonly property int uDataLen: Math.pow(2, configs["Data Length"]) readonly property int dataLength: 64/uDataLen readonly property int channel: configs["Channel"] readonly property bool reverse: configs["Reverse"] readonly property bool rotateFlag: configs["Rotate"] readonly property real rSpeed: configs["Ratate Speed"] / 100 readonly property real angle: configs["Angle"] readonly property bool autoNormalizing: configs["Data Settings"]["Auto Normalizing"] readonly property real amplitude: 400/configs["Data Settings"]["Amplitude"] readonly property int unitStyle: configs["Data Settings"]["Unit Style"] readonly property int rotationDirection: configs["Rotation Direction"] readonly property int total: channel*dataLength readonly property real dotGap: 360/total property real offsetAngle: 0 property var outerPos: [] property var innerPos: [] readonly property real degUnit: Math.PI/180 readonly property real subRatio: 0.2*maxRange readonly property real mainRatio: 1-subRatio*2.5 readonly property real minLength: Math.min(width, height) readonly property real ratio:minLength*subRatio readonly property real halfWidth: width/2 readonly property real halfHeight: height/2 readonly property real halfMinLength: minLength/2 onConfigsUpdated: { gradientStyle = configs["Gradient Style"]; context.lineWidth = configs["Line Width"]; main_color = configs["Main Color"]; if (gradientStyle === 1) { radialGradient_pstart.color = configs["Radial Gradient Settings"]["Inside Position Color"]; radialGradient_pstart.position = configs["Radial Gradient Settings"]["Inside Position"]/100; radialGradient_pmiddle.color = configs["Radial Gradient Settings"]["Middle Position Color"]; radialGradient_pmiddle.position = configs["Radial Gradient Settings"]["Middle Position"]/100; radialGradient_pend.color = configs["Radial Gradient Settings"]["Outside Position Color"]; radialGradient_pend.position = configs["Radial Gradient Settings"]["Outside Position"]/100; } else if (gradientStyle === 2) { conicalGradient_pstart.color = configs["Conical Gradient Settings"]["Start Position Color"]; conicalGradient_pquarter.color = configs["Conical Gradient Settings"]["Quarter Position Color"]; conicalGradient_phalf.color = configs["Conical Gradient Settings"]["Middle Position Color"]; conicalGradient_p3quarter.color = configs["Conical Gradient Settings"]["End Position Color"]; conicalGradient_pend.color = configs["Conical Gradient Settings"]["Start Position Color"]; } } function createPoint() { outerPos.length = 0; innerPos.length = 0; let deg, deltaR, r1, r2, _rhmLen; _rhmLen = mainRatio*halfMinLength; for (let j=0; j < channel; j++) { for (let i=0; i < dataLength; i++) { deg = degUnit*((i+j*dataLength)*dotGap+offsetAngle*(1-2*rotationDirection)); deltaR = audioData[reverse*(dataLength-i-1)+(!reverse)*(i+j*dataLength)] * ratio; r1 = _rhmLen+1+deltaR*(linePosition!==2); r2 = _rhmLen-1-deltaR*(linePosition!==1); outerPos.push([halfWidth+Math.cos(deg)*r1,halfHeight+Math.sin(deg)*r1]); innerPos.push([halfWidth+Math.cos(deg)*r2,halfHeight+Math.sin(deg)*r2]); } } conicalGradient.angle = offsetAngle*(2*rotationDirection-1); offsetAngle = rotateFlag ? ((offsetAngle + rSpeed) % 360) : angle; } onAudioDataUpdeted: { let normalizing_ratio = autoNormalizing ? data[128] : amplitude; if (unitStyle) { //对数化显示 for(let i=0; i