canvas.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from PyQt4.QtGui import *
  2. from PyQt4.QtCore import *
  3. from shape import Shape
  4. class Canvas(QLabel):
  5. done = pyqtSignal()
  6. epsilon = 7**2 # TODO: Tune value
  7. def __init__(self, *args, **kwargs):
  8. super(Canvas, self).__init__(*args, **kwargs)
  9. self.points = []
  10. self.shapes = [Shape('one', QColor(0, 255, 0))]
  11. self.current_line = Shape('line', QColor(255, 0, 0))
  12. def mousePressEvent(self, ev):
  13. if ev.button() != 1:
  14. return
  15. if not self.points:
  16. self.setMouseTracking(True)
  17. self.points.append(ev.pos())
  18. self.shapes[0].addPoint(ev.pos())
  19. if self.isClosed():
  20. self.done.emit()
  21. print "Points:", self.points
  22. self.points = []
  23. self.shapes[0].setFill(True)
  24. self.setMouseTracking(False)
  25. self.repaint()
  26. def isClosed(self):
  27. return len(self.points) > 1 and self.closeEnough(self.points[0], self.points[-1])
  28. def mouseMoveEvent(self, ev):
  29. self.current_line.points = [self.points[-1], self.pos()]
  30. self.repaint()
  31. #print "moving", ev.pos()
  32. def closeEnough(self, p1, p2):
  33. def dist(p):
  34. return p.x() * p.x() + p.y() * p.y()
  35. print p1, p2
  36. print abs(dist(p1) - dist(p2)), self.epsilon
  37. return abs(dist(p1) - dist(p2)) < self.epsilon
  38. def paintEvent(self, event):
  39. super(Canvas, self).paintEvent(event)
  40. for shape in self.shapes:
  41. qp = QPainter()
  42. qp.begin(self)
  43. shape.drawShape(qp)
  44. self.current_line.drawShape(qp)
  45. qp.end()