import QtQuick 2.5 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4 import "./simplify.js" as Simplify import "components" as Comps ApplicationWindow { id: aw visible: true width: 960 height: 540 color: "#fffffe" Comps.WebSocket { id: socket } property alias t_slides: socket.tot_slides Item { id: item1 width: parent.width height: parent.height property alias mouseArea1: mouseArea1 property alias button3: button3 property int curImage: 1 property variant pregs: [] property string curPDF: "EBA" anchors.fill: parent onCurPDFChanged: { canvas.change_image(curPDF, curImage) diapoStatus.text = qsTr("%1/%2 (%3 preg)").arg(curImage).arg( t_slides).arg(pregs.length) } onPregsChanged: { diapoStatus.text = qsTr("%1/%2 (%3 preg)").arg(curImage).arg( t_slides).arg(pregs.length) } onCurImageChanged: { canvas.change_image(curPDF, curImage) diapoStatus.text = qsTr("%1/%2 (%3 preg)").arg(curImage).arg( t_slides).arg(pregs.length) } function addPreg(p) { if (pregs.indexOf(p) !== -1) { return } pregs.push(p) curImageChanged(); } Grid { id: grid1 width: parent.width height: parent.height anchors.right: parent.right anchors.bottom: parent.bottom anchors.top: parent.top anchors.left: parent.left columns: 4 spacing: 4 Rectangle { id: canvasCol height: parent.height width: height * 4 / 3 color: aw.color Canvas { id: canvas antialiasing: false renderTarget: Canvas.Image renderStrategy: Canvas.Immediate property color strokeStyle: Qt.darker(fillStyle, 1.2) property color fillStyle: "#6400aa" property string curColor: "#ff0000" property real px: width / 2 property real py: height / 2 + 10 property real alpha: 1.0 property variant points_array: [] property string curImageUrl: "https://plataforma.especificosba.com.ar/diapo/EBA/1.png" property var ctx : null width: parent.width height: parent.height onPaint: full_repaint() //paint_canvas() onImageLoaded: { clean_path() if (ctx === null) ctx = canvas.getContext("2d"); ctx.lineCap = 'square' ctx.lineWidth = 4 full_repaint() } function clean_path() { points_array.length=0 full_repaint() } function start_path() { points_array.push({ points: [], color: curColor }) } function normalizeTo800by600(point) { return { x: Math.round( point.x * 800 / canvas.width), y: Math.round( point.y * 600 / canvas.height) } } function change_image(pdf, number) { curImageUrl = "https://plataforma.especificosba.com.ar/diapo/" + pdf + "/" + number + ".png" canvas.loadImage(curImageUrl) } function add_point(p) { var pts = points_array[points_array.length - 1].points var lastpoint; if (pts.length>1) lastpoint = pts[pts.length-1]; pts.push(p) socket.send_point(p); if (lastpoint) markDirty(Qt.rect(Math.min(p.x,lastpoint.x),Math.min(p.y,lastpoint.y), Math.abs(p.x-lastpoint.x)+4, Math.abs(p.y-lastpoint.y)+1)) } function stroke(points, color) { if (points.length===0) return; if (ctx.strokeStyle !== color){ ctx.strokeStyle = color; } ctx.beginPath() ctx.moveTo(points[0].x, points[0].y) var i = 0; for (i = 0; i < points.length - 1; i++) { ctx.moveTo(points[i].x, points[i].y) ctx.lineTo(points[i + 1].x, points[i + 1].y) } ctx.stroke() } function full_repaint(){ //console.log("Fullpaint") if (ctx === null ) ctx = canvas.getContext("2d"); if (canvas.isImageLoaded(curImageUrl)) { ctx.drawImage(curImageUrl, 0, 0, canvas.width, canvas.height) } var j = 0 for (j = 0; j < points_array.length; j++) { if (points_array[j].points.length <= 1) continue stroke(points_array[j].points,points_array[j].color); } requestPaint() } function paint_canvas() { if (ctx === null ) ctx = canvas.getContext("2d"); if (points_array.length === 0) return; var ar = points_array[points_array.length -1]; stroke(ar.points,ar.color); } } MouseArea { id: mouseArea1 x: 0 y:0 width: canvas.width height: canvas.height property var last_point; onPressed: { if (!socket.isOpen) return canvas.start_path() last_point = { x: mouse.x, y: mouse.y } canvas.add_point(last_point) } onPositionChanged: { if (!socket.isOpen) return var point = { x: mouse.x, y: mouse.y } if (distance(last_point, point) <= 61) //distance returns squared dsitance return; last_point = point canvas.add_point(point) } onReleased: { if (!socket.isOpen) return socket.finish_path() } function distance(p1,p2){ return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y) } } } Column { id: columnLayout1 spacing: 10 width: parent.width - canvasCol.width - parent.spacing * 2 height: parent.height Column { width: parent.width height: parent.height / 2 - 60 Row { id: row2 width: parent.width height: 70 MouseArea { id: image1 width: parent.width/2 height: 70 Image { anchors.centerIn: parent.Center source: "qrc:///images/back.png" height: parent.height fillMode: Image.PreserveAspectFit } enabled: socket.isOpen && (item1.curImage > 1) onClicked : socket.prev_diapo() } MouseArea { id: image2 width: parent.width/2 height: 70 Image { anchors.centerIn: parent.Center height: parent.height source: "qrc:///images/fwd.png" fillMode: Image.PreserveAspectFit } enabled: socket.isOpen && (item1.curImage < t_slides) onClicked: socket.next_diapo() } } Row { id: row1 width: parent.width height: 70 Button { height: 70 width: parent.width / 2 id: preg text: qsTr("Preg") onClicked: { socket.set_preg() } } Button { height: 70 width: parent.width / 2 id: nopreg text: qsTr("No Preg") onClicked: { socket.unset_preg() } } } } Column { id: column1 width: parent.width height: parent.height / 2 - 60 Repeater{ model: [ ["#0000ff", "#00ff00", "#ff0000"], ["#ffff00", "#00ffff", "#000000"] ] Row { width: parent.width height: 70 Repeater { model: modelData Button { height: 70 width: parent.width/3 checkable: true checked: canvas.curColor === modelData onClicked: canvas.curColor = modelData style: ButtonStyle { background: Rectangle { implicitWidth: 100 implicitHeight: 25 border.width: 3 border.color: canvas.curColor === modelData ?"#000":"#FFF" radius: 8 gradient: Gradient { GradientStop { position: 0 ; color: modelData } GradientStop { position: 1 ; color: modelData } } } } } } } } Button { height: 70 width: parent.width id: button3 text: qsTr("Limpiar") enabled: socket.isOpen onClicked: { canvas.clean_path(); socket.clear_path(); } } Text { id: wsStatus text: qsTr("WS Status") } Text { id: diapoStatus text: qsTr("Diapo status") } } } } } }