Warning, /maui/mauikit/src/controls.6/DoodleCanvas.qml is written in an unsupported language. File is not indexed.
0001 import QtQuick 0002 import QtQuick.Controls 0003 0004 /** 0005 @since org.mauikit.controls 1.0 0006 @brief The canvas element for the Doodle component. 0007 0008 @note Use the Doodle element instead, since it has the features implemneted. 0009 */ 0010 Item 0011 { 0012 id: control 0013 property alias buffer: buffer 0014 0015 /** 0016 * 0017 */ 0018 property int brushSize : 16 0019 0020 /** 0021 * 0022 */ 0023 property real brushOpacity : 1 0024 0025 /** 0026 * 0027 */ 0028 property int brushShape : 1 //0 -Circular, 1 - rectangular. 0029 0030 /** 0031 * 0032 */ 0033 property int maxBrushSize: 100 0034 0035 /** 0036 * 0037 */ 0038 property color paintColor: "red" 0039 0040 0041 Canvas 0042 { 0043 id: pickCanvas 0044 width: 1 0045 height: 1 0046 visible: false 0047 } 0048 0049 0050 Canvas 0051 { 0052 id: buffer 0053 0054 anchors.fill: parent 0055 0056 property real lastX 0057 property real lastY 0058 property color paintColor: control.paintColor 0059 smooth: false 0060 0061 function clear() 0062 { 0063 var bufferCtx = buffer.getContext("2d") 0064 bufferCtx.clearRect(0, 0, width, height) 0065 buffer.requestPaint() 0066 } 0067 0068 MouseArea 0069 { 0070 id: mouseArea 0071 anchors.fill: parent 0072 propagateComposedEvents: false 0073 preventStealing: true 0074 0075 property int spacing: 32 0076 0077 property real deltaDab: Math.max(spacing / 100 * control.brushSize, 1) 0078 property var points: [] 0079 property point lastDrawPoint 0080 property point startPos 0081 property point finalPos 0082 property real brushAngle: 0 0083 0084 onPressed: 0085 { 0086 var point = Qt.point(mouseX, mouseY) 0087 points = [] 0088 0089 startPos = Qt.point(point.x, point.y) 0090 finalPos = Qt.point(point.x, point.y) 0091 lastDrawPoint = point 0092 if (control.brushShape != 1) 0093 {//if brush is not square 0094 drawDab(point) 0095 } 0096 points = [] 0097 points.push(point) 0098 0099 //Hide Color Picker later move it to the whole screen. 0100 // colorPicker.visible = false 0101 } 0102 0103 0104 onPositionChanged: 0105 { 0106 0107 drawDab(Qt.point(mouseX, mouseY)) 0108 0109 // **************** Fancy and intense bezier I don't quite understand yet: 0110 var currentPoint = Qt.point(mouseX, mouseY) 0111 var startPoint = lastDrawPoint 0112 0113 0114 //Rotating the dab if brush is recangular. 0115 if (control.brushShape == 1) { 0116 spacing = 16 0117 0118 if ( (currentPoint.x > startPoint.x)) 0119 { 0120 // dab.brushAngle = find_angle(Qt.point(startPoint.x, startPoint.y-10), 0121 // startPoint, currentPoint) 0122 // dab.requestPaint() 0123 brushAngle = find_angle(Qt.point(startPoint.x, startPoint.y-10),startPoint, currentPoint) 0124 0125 } else 0126 { 0127 // dab.brushAngle = - find_angle(Qt.point(startPoint.x, startPoint.y-10), 0128 // startPoint, currentPoint) 0129 // dab.requestPaint() 0130 brushAngle = - find_angle(Qt.point(startPoint.x, startPoint.y-10),startPoint, currentPoint) 0131 0132 } 0133 } else 0134 { 0135 spacing = 32 0136 } 0137 0138 // ## 0139 var currentSpacing = Math.sqrt(Math.pow(currentPoint.x - startPoint.x, 2) + Math.pow(currentPoint.y - startPoint.y, 2)) 0140 var numDabs = Math.floor(currentSpacing / deltaDab) 0141 0142 if (points.length == 1 || numDabs < 3) { 0143 var endPoint = currentPoint 0144 } else { 0145 var controlPoint = points[points.length - 1] 0146 endPoint = Qt.point((controlPoint.x + currentPoint.x) / 2, (controlPoint.y + currentPoint.y) / 2) 0147 } 0148 0149 var deltaT = 1 / numDabs 0150 var betweenPoint = startPoint 0151 var t = deltaT 0152 var diff 0153 while (t > 0 && t <= 1) { 0154 var point = bezierCurve(startPoint, controlPoint, endPoint, t) 0155 var deltaPoint = Math.sqrt(Math.pow(point.x - betweenPoint.x, 2) + Math.pow(point.y - betweenPoint.y, 2)) 0156 // check on bezier loop 0157 if (diff && Math.abs(deltaPoint - deltaDab) > Math.abs(diff)) { break; } 0158 diff = deltaPoint - deltaDab 0159 if (Math.abs(diff <= 0.5)) { 0160 drawDab(point) 0161 diff = undefined 0162 betweenPoint = point 0163 t += deltaT 0164 } else { 0165 t -= diff / deltaDab * deltaT 0166 } 0167 } 0168 points.push(currentPoint) 0169 lastDrawPoint = betweenPoint 0170 0171 } 0172 0173 onReleased: 0174 { 0175 0176 var bufferCtx = buffer.getContext("2d") 0177 0178 //saving image 0179 // Grab Buffer image 0180 var bufferImage = bufferCtx.getImageData(0, 0, width, height) 0181 0182 0183 // Auto save painting 0184 // saveDrawing() 0185 0186 // Clear the buffer 0187 buffer.requestPaint() 0188 0189 0190 } 0191 0192 function drawDab(point) 0193 { 0194 var ctx = buffer.getContext("2d") 0195 0196 //Bezier Dab 0197 // ctx.save() 0198 // var size = toolbar.maxBrushSize //toolbar.brushSize 0199 // var x = point.x - size / 2 0200 // var y = point.y - size / 2 0201 // if (x < startPos.x) { startPos.x = Math.min(0, x) } 0202 // if (y < startPos.y) { startPos.y = Math.min(0, y) } 0203 // if (x > finalPos.x) { finalPos.x = Math.max(x, buffer.width) } 0204 // if (y > finalPos.y) { finalPos.y = Math.max(y, buffer.height) } 0205 // ctx.drawImage(dab, x, y) 0206 // ctx.restore() 0207 // buffer.requestPaint() 0208 0209 //Raster Circle: 0210 //ctx.drawImage("brushes/circle.png", x, y, size, size) 0211 0212 //Simple dab 0213 var size = control.brushSize 0214 ctx.fillStyle = Qt.rgba(control.paintColor.r, control.paintColor.g, control.paintColor.b, control.brushOpacity); 0215 var x = point.x - size / 2 0216 var y = point.y - size / 2 0217 0218 if (control.brushShape == 0) 0219 { 0220 ctx.beginPath(); 0221 x = point.x - size/8 0222 y = point.y - size/8 0223 ctx.arc(x, y, size/2 ,0,Math.PI*2,true); 0224 } else 0225 { 0226 ctx.save() 0227 ctx.translate(x+size/2,y+size/2) 0228 ctx.beginPath() 0229 ctx.rotate(brushAngle) 0230 ctx.roundedRect(-size/4, -size/8, size/2, size/4, 2, 2) 0231 ctx.restore() 0232 } 0233 ctx.fill() 0234 buffer.requestPaint() 0235 0236 } 0237 } 0238 0239 0240 } 0241 0242 // Bezier Curve 0243 function bezierCurve(start, control, end, t) 0244 { 0245 var x, y 0246 // linear bezier curve 0247 if (!control) { 0248 x = (1 - t) * start.x + t * end.x 0249 y = (1 - t) * start.y + t * end.y 0250 } 0251 // quad bezier curve 0252 else { 0253 x = Math.pow((1 - t), 2) * start.x + 2 * t * (1 - t) * control.x + t * t * end.x 0254 y = Math.pow((1 - t), 2) * start.y + 2 * t * (1 - t) * control.y + t * t * end.y 0255 } 0256 return Qt.point(x, y) 0257 } 0258 0259 // Convert RGB to HEX 0260 function rgbToHex(r, g, b) 0261 { 0262 if (r > 255 || g > 255 || b > 255) 0263 throw "Invalid color component"; 0264 return ((r << 16) | (g << 8) | b).toString(16); 0265 } 0266 0267 function find_angle(A,B,C) { 0268 var AB = Math.sqrt(Math.pow(B.x-A.x,2)+ Math.pow(B.y-A.y,2)); 0269 var BC = Math.sqrt(Math.pow(B.x-C.x,2)+ Math.pow(B.y-C.y,2)); 0270 var AC = Math.sqrt(Math.pow(C.x-A.x,2)+ Math.pow(C.y-A.y,2)); 0271 return Math.acos((BC*BC+AB*AB-AC*AC)/(2*BC*AB)); 0272 } 0273 } 0274 0275 0276 0277