Align various sensor displays

This commit is contained in:
Michael Zanetti 2022-10-17 22:37:33 +02:00
parent c2ed1e5f36
commit e8a6291242
2 changed files with 121 additions and 89 deletions

View File

@ -31,6 +31,7 @@
import QtQuick 2.5 import QtQuick 2.5
import QtQuick.Controls 2.1 import QtQuick.Controls 2.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import QtGraphicalEffects 1.0
import Nymea 1.0 import Nymea 1.0
import "../components" import "../components"
import "../customviews" import "../customviews"
@ -362,17 +363,30 @@ ThingPageBase {
Behavior on progress { NumberAnimation { duration: Style.slowAnimationDuration; easing.type: Easing.InOutQuad } } Behavior on progress { NumberAnimation { duration: Style.slowAnimationDuration; easing.type: Easing.InOutQuad } }
onProgressChanged: requestPaint(); onProgressChanged: requestPaint();
Label { ColumnLayout {
anchors.centerIn: parent anchors.centerIn: parent
anchors.verticalCenter: -Style.smallMargins anchors.verticalCenterOffset: -Style.smallMargins
width: parent.width * 0.6 width: parent.width * 0.6
text: Types.toUiValue(progressCanvas.state.value, progressCanvas.stateType.unit).toFixed(1) + " " + Types.toUiUnit(progressCanvas.stateType.unit)
font.pixelSize: Math.min(Style.largeFont.pixelSize, parent.height / 6) Label {
wrapMode: Text.WordWrap Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter text: Types.toUiValue(progressCanvas.state.value, progressCanvas.stateType.unit).toFixed(1)
maximumLineCount: 2 wrapMode: Text.WordWrap
font.pixelSize: Math.min(Style.hugeFont.pixelSize, progressCanvas.height / 8)
maximumLineCount: 2
horizontalAlignment: Text.AlignHCenter
elide: Text.ElideRight
}
Label {
Layout.fillWidth: true
text: Types.toUiUnit(progressCanvas.stateType.unit)
font.pixelSize: Math.min(Style.largeFont.pixelSize, progressCanvas.height / 12)
horizontalAlignment: Text.AlignHCenter
elide: Text.ElideRight
}
} }
onPaint: { onPaint: {
var ctx = getContext("2d"); var ctx = getContext("2d");
ctx.reset(); ctx.reset();
@ -417,7 +431,7 @@ ThingPageBase {
Component { Component {
id: scaleComponent id: scaleComponent
Canvas { Item {
id: scaleCanvas id: scaleCanvas
property string interfaceName: parent.interfaceName property string interfaceName: parent.interfaceName
property StateType stateType: parent.stateType property StateType stateType: parent.stateType
@ -475,7 +489,98 @@ ThingPageBase {
return baseAngle + angleRange * progress return baseAngle + angleRange * progress
} }
Behavior on angle { NumberAnimation { duration: Style.slowAnimationDuration; easing.type: Easing.InOutQuad } } Behavior on angle { NumberAnimation { duration: Style.slowAnimationDuration; easing.type: Easing.InOutQuad } }
onAngleChanged: requestPaint(); onAngleChanged: maskCanvas.requestPaint();
Canvas {
id: baseCanvas
anchors.fill: parent
visible: false
onPaint: {
var ctx = getContext("2d");
ctx.reset();
ctx.beginPath()
ctx.fillStyle = Style.foregroundColor
ctx.translate(width / 2, height / 2)
ctx.rotate(135 * Math.PI / 180)
ctx.lineCap = "round"
ctx.lineWidth = scaleCanvas.scaleWidth
// paint first rounded
ctx.beginPath()
ctx.strokeStyle = scaleCanvas.scale[0].color
var startAngle = 0
var endAngle = scaleCanvas.scale[0].angle * Math.PI/180
ctx.arc(0, 0, width / 2 - ctx.lineWidth / 2, startAngle, endAngle)
ctx.stroke()
ctx.closePath()
// paint last rounded
ctx.beginPath()
ctx.strokeStyle = scaleCanvas.scale[scaleCanvas.scale.length - 1].color
startAngle = scaleCanvas.scale[scaleCanvas.scale.length - 2].angle * Math.PI/180
endAngle = scaleCanvas.scale[scaleCanvas.scale.length - 1].angle * Math.PI/180
ctx.arc(0, 0, width / 2 - ctx.lineWidth / 2, startAngle, endAngle)
ctx.stroke()
ctx.closePath()
// paint inner parts
ctx.lineCap = "butt"
for (var i = 1; i < scaleCanvas.scale.length - 1; i++) {
ctx.beginPath()
ctx.strokeStyle = scaleCanvas.scale[i].color
startAngle = scaleCanvas.scale[i - 1].angle * Math.PI/180
endAngle = scaleCanvas.scale[i].angle * Math.PI/180
ctx.arc(0, 0, width / 2 - ctx.lineWidth / 2, startAngle, endAngle)
ctx.stroke()
ctx.closePath()
}
}
}
Canvas {
id: maskCanvas
anchors.fill: parent
visible: false
onPaint: {
var ctx = getContext("2d");
ctx.reset();
ctx.beginPath()
ctx.fillStyle = Style.foregroundColor
ctx.translate(width / 2, height / 2)
ctx.rotate(135 * Math.PI / 180)
ctx.lineCap = "round"
ctx.lineWidth = width * .1
ctx.beginPath()
ctx.strokeStyle = "#55ffffff"
var startAngle = 0
var endAngle = 270
var radStart = startAngle * Math.PI/180;
var radEnd = endAngle * Math.PI/180;
ctx.arc(0, 0, width / 2 - ctx.lineWidth / 2, radStart, radEnd)
ctx.stroke()
ctx.closePath()
ctx.beginPath()
ctx.strokeStyle = "#000000"
radEnd = scaleCanvas.angle * Math.PI/180
ctx.arc(0, 0, width / 2 - ctx.lineWidth / 2, radStart, radEnd)
ctx.stroke()
ctx.closePath()
}
}
OpacityMask {
anchors.fill: parent
source: baseCanvas
maskSource: maskCanvas
}
ColumnLayout { ColumnLayout {
anchors.centerIn: parent anchors.centerIn: parent
@ -485,102 +590,29 @@ ThingPageBase {
Label { Label {
Layout.fillWidth: true Layout.fillWidth: true
text: scaleCanvas.scale[scaleCanvas.currentIndex].text text: scaleCanvas.scale[scaleCanvas.currentIndex].text
font.pixelSize: Math.min(Style.largeFont.pixelSize, scaleCanvas.height / 6) font.pixelSize: Math.min(Style.hugeFont.pixelSize, scaleCanvas.height / 8)
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
// color: scaleCanvas.scale[scaleCanvas.currentIndex].color // color: scaleCanvas.scale[scaleCanvas.currentIndex].color
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
elide: Text.ElideRight
maximumLineCount: 2 maximumLineCount: 2
} }
Label { Label {
Layout.fillWidth: true Layout.fillWidth: true
text: Types.toUiValue(scaleCanvas.state.value, scaleCanvas.stateType.unit).toFixed(1) + " " + Types.toUiUnit(scaleCanvas.stateType.unit) text: Types.toUiValue(scaleCanvas.state.value, scaleCanvas.stateType.unit).toFixed(1) + " " + Types.toUiUnit(scaleCanvas.stateType.unit)
font.pixelSize: Math.min(Style.smallFont.pixelSize, scaleCanvas.height / 12) font.pixelSize: Math.min(Style.largeFont.pixelSize, scaleCanvas.height / 12)
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
elide: Text.ElideRight
} }
} }
onPaint: {
var ctx = getContext("2d");
ctx.reset();
ctx.beginPath()
ctx.fillStyle = Style.foregroundColor
ctx.translate(width / 2, height / 2)
ctx.rotate(135 * Math.PI / 180)
ctx.lineCap = "round"
ctx.lineWidth = scaleCanvas.scaleWidth
// paint first rounded
ctx.beginPath()
ctx.strokeStyle = scaleCanvas.scale[0].color
var startAngle = 0
var endAngle = scaleCanvas.scale[0].angle * Math.PI/180
ctx.arc(0, 0, width / 2 - ctx.lineWidth / 2, startAngle, endAngle)
ctx.stroke()
ctx.closePath()
// paint last rounded
ctx.beginPath()
ctx.strokeStyle = scaleCanvas.scale[scaleCanvas.scale.length - 1].color
startAngle = scaleCanvas.scale[scaleCanvas.scale.length - 2].angle * Math.PI/180
endAngle = scaleCanvas.scale[scaleCanvas.scale.length - 1].angle * Math.PI/180
ctx.arc(0, 0, width / 2 - ctx.lineWidth / 2, startAngle, endAngle)
ctx.stroke()
ctx.closePath()
// paint inner parts
ctx.lineCap = "butt"
for (var i = 1; i < scaleCanvas.scale.length - 1; i++) {
ctx.beginPath()
ctx.strokeStyle = scaleCanvas.scale[i].color
startAngle = scaleCanvas.scale[i - 1].angle * Math.PI/180
endAngle = scaleCanvas.scale[i].angle * Math.PI/180
ctx.arc(0, 0, width / 2 - ctx.lineWidth / 2, startAngle, endAngle)
ctx.stroke()
ctx.closePath()
}
var tipRadius = width / 2 - scaleCanvas.scaleWidth
var baseRadius = tipRadius - scaleCanvas.scaleWidth / 2
var tipX = tipRadius * Math.cos(scaleCanvas.angle * Math.PI/180)
var tipY = tipRadius * Math.sin(scaleCanvas.angle * Math.PI/180)
var base1X = baseRadius * Math.cos((scaleCanvas.angle - 5) * Math.PI/180)
var base1Y = baseRadius * Math.sin((scaleCanvas.angle - 5) * Math.PI/180)
var base2X = baseRadius * Math.cos((scaleCanvas.angle + 5) * Math.PI/180)
var base2Y = baseRadius * Math.sin((scaleCanvas.angle + 5) * Math.PI/180)
ctx.lineWidth = 1
ctx.fillStyle = Style.foregroundColor
ctx.beginPath()
ctx.moveTo(tipX, tipY)
ctx.lineTo(base1X, base1Y)
ctx.lineTo(base2X, base2Y)
ctx.moveTo(tipX, tipY)
ctx.stroke()
ctx.fill()
ctx.closePath()
// ctx.beginPath()
// ctx.strokeStyle = app.interfaceToColor(progressCanvas.interfaceName)
// radEnd *= progressCanvas.progress
// ctx.arc(0, 0, width / 2 - ctx.lineWidth / 2, radStart, radEnd)
// ctx.stroke()
// ctx.closePath()
}
ColorIcon { ColorIcon {
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.bottomMargin: Style.smallMargins anchors.bottomMargin: Style.smallMargins
// anchors.verticalCenterOffset: scaleCanvas.height / 2 - height // anchors.verticalCenterOffset: scaleCanvas.height / 2 - height
name: app.interfaceToIcon(scaleCanvas.interfaceName) name: app.interfaceToIcon(scaleCanvas.interfaceName)
size: Math.min(Style.bigIconSize, parent.height / 5) size: Math.min(Style.bigIconSize, parent.height / 5)
color: app.interfaceToColor(scaleCanvas.interfaceName) color: app.interfaceToColor(scaleCanvas.interfaceName)

View File

@ -163,7 +163,7 @@ Item {
"color": Style.orange "color": Style.orange
}, },
{ {
"value": 50, "value": 255,
"angle": 270, "angle": 270,
"text": qsTr("Very high"), "text": qsTr("Very high"),
"color": Style.red "color": Style.red