main.qml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. import QtQuick 2.5
  2. import QtQuick.Controls 1.4
  3. import QtWebSockets 1.0
  4. import "./simplify.js" as Simplify
  5. ApplicationWindow {
  6. id: aw
  7. visible: true
  8. width: 1280
  9. height: 720
  10. color: "#fffffe"
  11. property alias label1: label1
  12. WebSocket {
  13. property int total_slides: 5
  14. id: socket
  15. url: "wss://wscasa.especificosba.com.ar"
  16. onTextMessageReceived: {
  17. // console.log("\nReceived message: " + message)
  18. var obj = JSON.parse(message)
  19. switch (obj.type) {
  20. case "diapo":
  21. canvas.clean_path()
  22. item1.curPDF = obj.PDF
  23. item1.curImage = obj.slide //automagically change_image
  24. total_slides = obj.total_slides
  25. }
  26. }
  27. function send_obj(obj) {
  28. sendTextMessage(JSON.stringify(obj))
  29. }
  30. function prev_diapo() {
  31. var curImage = Math.max(item1.curImage - 1, 1)
  32. send_obj({
  33. type: "command",
  34. commandtype: "diapo",
  35. PDF: item1.curPDF,
  36. slide: curImage
  37. })
  38. }
  39. function next_diapo() {
  40. var curImage = Math.min(item1.curImage + 1, total_slides)
  41. send_obj({
  42. type: "command",
  43. commandtype: "diapo",
  44. PDF: item1.curPDF,
  45. slide: curImage
  46. })
  47. }
  48. function clear_path() {
  49. send_obj({
  50. type: "command",
  51. commandtype: "clean"
  52. })
  53. canvas.clean_path()
  54. }
  55. function send_drawing(d) {
  56. send_obj({
  57. type: "command",
  58. commandtype: "draw",
  59. points: d,
  60. color: canvas.curColor
  61. })
  62. }
  63. onStatusChanged: {
  64. //FIXME implement
  65. if (socket.status == WebSocket.Error) {
  66. console.log("Error: " + socket.errorString)
  67. } else if (socket.status == WebSocket.Open) {
  68. /*?*/
  69. } else if (socket.status == WebSocket.Closed) {
  70. console.log("\nSocket closed")
  71. }
  72. }
  73. active: true
  74. }
  75. Item {
  76. id: item1
  77. width: parent.width
  78. height: parent.height
  79. property alias mouseArea1: mouseArea1
  80. property alias button2: button2
  81. property alias button3: button3
  82. property alias button1: button1
  83. property int curImage: 1
  84. property string curPDF: "EBA"
  85. anchors.fill: parent
  86. onCurPDFChanged: {
  87. canvas.change_image(curPDF, curImage)
  88. }
  89. onCurImageChanged: {
  90. canvas.change_image(curPDF, curImage)
  91. label1.text=curImage+"/"+socket.total_slides
  92. }
  93. Grid {
  94. id: grid1
  95. width: parent.width
  96. height: parent.height
  97. anchors.right: parent.right
  98. anchors.bottom: parent.bottom
  99. anchors.top: parent.top
  100. anchors.left: parent.left
  101. columns: 4
  102. spacing: 4
  103. Rectangle {
  104. id: canvasCol
  105. height: parent.height
  106. width: height * 4 / 3
  107. color: aw.color
  108. Canvas {
  109. id: canvas
  110. antialiasing: true
  111. renderTarget: Canvas.Image
  112. property color strokeStyle: Qt.darker(fillStyle, 1.2)
  113. property color fillStyle: "#6400aa"
  114. property string curColor: "#ff0000"
  115. property real px: width / 2
  116. property real py: height / 2 + 10
  117. property real alpha: 1.0
  118. property variant points_array: []
  119. property string curImageUrl: "https://plataforma.especificosba.com.ar/diapo/EBA/1.png"
  120. width: parent.width
  121. height: parent.height
  122. onPaint: paint_canvas()
  123. onImageLoaded: {
  124. clean_path()
  125. requestPaint()
  126. }
  127. function clean_path() {
  128. points_array = []
  129. requestPaint()
  130. }
  131. function start_path() {
  132. points_array.push({points:[],color:curColor})
  133. }
  134. function finish_path() {
  135. points_array[points_array.length - 1].points = Simplify.simplify(
  136. points_array[points_array.length - 1].points, 2.2)
  137. requestPaint()
  138. //normalized to 800x600
  139. var ar = points_array[points_array.length - 1].points.map(
  140. function (el) {
  141. return {
  142. x: el.x * 800 / canvas.width,
  143. y: el.y * 600 / canvas.height
  144. }
  145. })
  146. while (ar.length > 30) {
  147. socket.send_drawing(ar.splice(0,29));
  148. }
  149. socket.send_drawing(ar);
  150. }
  151. function change_image(pdf, number) {
  152. curImageUrl = "https://plataforma.especificosba.com.ar/diapo/"
  153. + pdf + "/" + number + ".png"
  154. requestPaint()
  155. }
  156. function add_point(p) {
  157. points_array[points_array.length - 1].points.push(p);
  158. if (points_array[points_array.length - 1].length/ 3 > 40){ //FIXME
  159. finish_path()
  160. start_path()
  161. points_array[points_array.length - 1].points.push(p)
  162. } else {
  163. requestPaint()
  164. }
  165. }
  166. function paint_canvas() {
  167. var ctx = canvas.getContext("2d")
  168. canvas.loadImage(curImageUrl)
  169. if (canvas.isImageLoaded(curImageUrl)) {
  170. ctx.drawImage(curImageUrl, 0, 0, canvas.width,
  171. canvas.height)
  172. }
  173. ctx.lineCap = 'square'
  174. ctx.lineWidth = 4
  175. ctx.strokeStyle = "#000000"
  176. var i = 0, j = 0
  177. for (j = 0; j < points_array.length; j++) {
  178. var points = points_array[j].points;
  179. ctx.strokeStyle= points_array[j].color;
  180. ctx.beginPath()
  181. ctx.moveTo(points[0].x, points[0].y)
  182. for (i = 0; i < points.length - 1; i++) {
  183. ctx.moveTo(points[i].x, points[i].y)
  184. ctx.lineTo(points[i + 1].x, points[i + 1].y)
  185. }
  186. ctx.stroke()
  187. }
  188. }
  189. }
  190. MouseArea {
  191. id: mouseArea1
  192. x: 0
  193. y: 0
  194. width: canvas.width
  195. height: canvas.height
  196. onPressed: {
  197. if (!socket.active)
  198. return
  199. canvas.start_path()
  200. }
  201. onPositionChanged: {
  202. if (!socket.active)
  203. return
  204. canvas.add_point({
  205. x: mouse.x,
  206. y: mouse.y
  207. })
  208. }
  209. onReleased: {
  210. if (!socket.active)
  211. return
  212. canvas.finish_path()
  213. }
  214. }
  215. }
  216. Column {
  217. id: columnLayout1
  218. spacing: 10
  219. width: parent.width - canvasCol.width - parent.spacing * 2
  220. height: parent.height
  221. Column {
  222. width: parent.width
  223. height: parent.height/2-20
  224. Button {
  225. width: parent.width
  226. height: 70
  227. id: button1
  228. text: qsTr("Anterior")
  229. enabled: socket.active
  230. onClicked: socket.prev_diapo()
  231. }
  232. Button {
  233. height: 70
  234. width: parent.width
  235. id: button2
  236. text: qsTr("Siguiente")
  237. enabled: socket.active && (item1.curImage < socket.total_slides)
  238. onClicked: socket.next_diapo()
  239. }
  240. Button {
  241. height: 70
  242. width: parent.width
  243. id: button3
  244. text: qsTr("Limpiar")
  245. enabled: socket.active && (item1.curImage>1)
  246. onClicked: socket.clear_path()
  247. }
  248. }
  249. Label {
  250. id: label1
  251. width: parent.width
  252. height: 30
  253. }
  254. Column {
  255. id: column1
  256. width: parent.width
  257. height: parent.height/2-20
  258. Button {
  259. width: parent.width
  260. height: 70
  261. id: color1
  262. text: qsTr("Rojo")
  263. checked: true
  264. checkable: true
  265. onClicked: {
  266. color2.checked=false
  267. color3.checked=false
  268. checked=true
  269. canvas.curColor="#ff0000"
  270. }
  271. }
  272. Button {
  273. height: 70
  274. width: parent.width
  275. id: color2
  276. text: qsTr("Verde")
  277. checkable: true
  278. onClicked: {
  279. color1.checked=false
  280. color3.checked=false
  281. checked=true
  282. canvas.curColor="#00ff00"
  283. }
  284. }
  285. Button {
  286. height: 70
  287. width: parent.width
  288. id: color3
  289. text: qsTr("Azul")
  290. checkable: true
  291. onClicked: {
  292. color1.checked=false
  293. color2.checked=false
  294. checked=true
  295. canvas.curColor="#0000ff"
  296. }
  297. }
  298. }
  299. }
  300. }
  301. }
  302. }