import QtQuick 2.5 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4 import QtQuick.Dialogs 1.1 import QtQuick.Window 2.2 import "components" as Comps ApplicationWindow { id: aw visible: true width: 600 height: 960 visibility: Screen.height > Screen.width ? "FullScreen" : "Windowed" color: "#fffffe" Comps.WebSocket { id: socket } property alias t_slides: socket.tot_slides Item { id: item1 transformOrigin: Item.Center rotation: Screen.height > Screen.width ? 90 : 0 property alias mouseArea1: mouseArea1 property alias button3: button3 property int curImage: 1 property variant pregs: [] property string curPDF: "EBA" width: parent.height height: parent.width anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter 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 columns: 4 spacing: 4 Rectangle { id: canvasCol height: grid1.height width: Screen.height > Screen.width ? grid1.width *3/4 : grid1.width/2 color: "#333" smooth: false //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(region) onImageLoaded: { clean_path() if (ctx === null) ctx = canvas.getContext("2d"); ctx.lineCap = 'square' ctx.lineWidth = 4 requestPaint() } function clean_path() { points_array.length=0 requestPaint() } 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)+4)); } } 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(region){ if (ctx === null ) ctx = canvas.getContext("2d"); if ( region === undefined || region.width > 150 || region.height > 150 ) { console.log("Full", region.width, region.height); 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); } } else { var lastLine = points_array[points_array.length-1]; if (lastLine === undefined) return; stroke(lastLine.points, lastLine.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 - 10 Row { id: row2 width: parent.width height: 120 MouseArea { id: image1 width: parent.width/2 height: parent.height 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: parent.height 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 - 10 spacing: 2 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") } Button { id: salir width: 40 height: 20 text: qsTr("Salir") onClicked: { messageDialog.visible = true; } } } } } } MessageDialog { id: messageDialog title: "Salir" text: "Seguro que desea salir?" standardButtons: StandardButton.Yes | StandardButton.No icon: StandardIcon.Warning onYes: { Qt.quit() } onNo: { visible = false } } }