1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtQuick.Controls
import "../"
Item {
id: root
width: 320
height: 480
Column {
spacing: 6
anchors {
fill: parent
topMargin: 12
}
Label {
anchors.horizontalCenter: parent.horizontalCenter
text: qsTr("Squircles")
color: Qt.lighter(palette.text)
font {
pointSize: 24
bold: true
}
}
Image {
anchors.horizontalCenter: parent.horizontalCenter
source: "squircle.png"
width: 250
height: 25
}
Canvas {
id: canvas
readonly property color strokeStyle: Qt.darker(fillStyle, 1.2)
readonly property color fillStyle: "#6400aa"
readonly property int lineWidth: 2
readonly property alias nSize: nCtrl.value
readonly property alias radius: rCtrl.value
readonly property alias fill: toggleFillCheckBox.checked
readonly property alias stroke: toggleStrokeCheckBox.checked
readonly property real px: width / 2
readonly property real py: height / 2 + 10
readonly property real alpha: 1.0
width: root.width
height: parent.height - controls.height
antialiasing: true
onRadiusChanged: requestPaint()
onLineWidthChanged: requestPaint()
onNSizeChanged: requestPaint()
onFillChanged: requestPaint()
onStrokeChanged: requestPaint()
onPaint: function () {
let ctx = canvas.getContext("2d")
const N = Math.abs(canvas.nSize)
const R = canvas.radius
const M = Math.max(0.00000000001, Math.min(N, 100))
ctx.save()
ctx.globalAlpha = canvas.alpha
ctx.fillStyle = "white"
ctx.fillRect(0, 0, canvas.width, canvas.height)
ctx.strokeStyle = canvas.strokeStyle
ctx.fillStyle = canvas.fillStyle
ctx.lineWidth = canvas.lineWidth
ctx.beginPath()
let i, x, y;
for (i = 0; i < (2 * R + 1); i++) {
x = Math.round(i - R) + canvas.px
y = Math.round(Math.pow(Math.abs(Math.pow(R, M) - Math.pow(Math.abs(i - R), M)), 1 / M)) + canvas.py
if (i === 0)
ctx.moveTo(x, y)
else
ctx.lineTo(x, y)
}
for (i = (2 * R); i < (4 * R + 1); i++) {
x = Math.round(3 * R - i) + canvas.px
y = Math.round(-Math.pow(Math.abs(Math.pow(R, M) - Math.pow(Math.abs(3 * R - i), M)), 1 / M)) + canvas.py
ctx.lineTo(x, y)
}
ctx.closePath()
if (canvas.stroke) {
ctx.stroke()
}
if (canvas.fill) {
ctx.fill()
}
ctx.restore()
}
}
}
Column {
id: controls
anchors {
bottom: parent.bottom
bottomMargin: 12
}
LabeledSlider {
id: nCtrl
name: qsTr("N")
width: root.width
min: 1
max: 10
value: 2
}
LabeledSlider {
id: rCtrl
name: qsTr("Radius")
width: root.width
min: 30
max: 180
value: 60
}
Row {
CheckBox {
id: toggleFillCheckBox
text: qsTr("Toggle fill")
}
CheckBox {
id: toggleStrokeCheckBox
checked: true
text: qsTr("Toggle stroke")
}
}
}
}
|