summaryrefslogtreecommitdiff
path: root/src/editorui.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/editorui.py')
-rw-r--r--src/editorui.py147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/editorui.py b/src/editorui.py
index 1d468c6..e89810c 100644
--- a/src/editorui.py
+++ b/src/editorui.py
@@ -54,6 +54,10 @@ class KPEditorObject(KPEditorItem):
self._updatePosition()
self._updateSize()
+ self.setAcceptHoverEvents(True)
+
+ self.resizing = None
+
# I don't bother setting the ZValue because it doesn't quite matter:
# only one layer's objects are ever clickable, and drawBackground takes
# care of the layered drawing
@@ -72,6 +76,8 @@ class KPEditorObject(KPEditorItem):
self._boundingRect = QtCore.QRectF(0, 0, w*24, h*24)
self._selectionRect = QtCore.QRectF(0, 0, w*24-1, h*24-1)
+
+ self._resizerEndXY = (w*24-5, h*24-5)
def paint(self, painter, option, widget):
@@ -79,6 +85,147 @@ class KPEditorObject(KPEditorItem):
painter.setPen(QtGui.QPen(Qt.white, 1, Qt.DotLine))
painter.drawRect(self._selectionRect)
+
+ RESIZER_TOP_LEFT = 1
+ RESIZER_TOP_RIGHT = 2
+ RESIZER_BOTTOM_LEFT = 3
+ RESIZER_BOTTOM_RIGHT = 4
+ RESIZER_TOP = 5
+ RESIZER_BOTTOM = 6
+ RESIZER_LEFT = 7
+ RESIZER_RIGHT = 8
+
+ def resizerPortionAt(self, x, y):
+ rightBound, bottomBound = self._resizerEndXY
+
+ if y < 5:
+ if x < 5: return 1 # TOP_LEFT
+ elif x >= rightBound: return 2 # TOP_RIGHT
+ else: return 5 # TOP
+
+ elif y >= bottomBound:
+ if x < 5: return 3 # BOTTOM_LEFT
+ elif x >= rightBound: return 4 # BOTTOM_RIGHT
+ else: return 6 # BOTTOM
+
+ else:
+ if x < 5: return 7 # LEFT
+ elif x >= rightBound: return 8 # RIGHT
+ else: return None
+
+
+ def hoverMoveEvent(self, event):
+ pos = event.pos()
+ bit = self.resizerPortionAt(pos.x(), pos.y())
+
+ if bit == 1 or bit == 4:
+ self.setCursor(Qt.SizeFDiagCursor)
+ elif bit == 2 or bit == 3:
+ self.setCursor(Qt.SizeBDiagCursor)
+ elif bit == 7 or bit == 8:
+ self.setCursor(Qt.SizeHorCursor)
+ elif bit == 5 or bit == 6:
+ self.setCursor(Qt.SizeVerCursor)
+ else:
+ self.setCursor(Qt.ArrowCursor)
+
+
+ def mousePressEvent(self, event):
+ if event.button() == Qt.LeftButton:
+ pos = event.pos()
+ bit = self.resizerPortionAt(pos.x(), pos.y())
+
+ if bit:
+ event.accept()
+
+ x, xSide, y, ySide = False, None, False, None
+
+ if bit == 1 or bit == 7 or bit == 3:
+ x, xSide = True, 1
+ elif bit == 2 or bit == 4 or bit == 8:
+ x, xSide = True, 0
+
+ if bit == 1 or bit == 2 or bit == 5:
+ y, ySide = True, 1
+ elif bit == 3 or bit == 4 or bit == 6:
+ y, ySide = True, 0
+
+ self.resizing = (x, xSide, y, ySide)
+ return
+
+ KPEditorItem.mousePressEvent(self, event)
+
+
+ def _tryAndResize(self, obj, axisIndex, mousePosition, stationarySide):
+ objPosition = obj.position[axisIndex]
+ objSize = obj.size[axisIndex]
+
+
+ if stationarySide == 0:
+ # Resize the right/bottom side
+ relativeMousePosition = mousePosition - objPosition
+ newSize = relativeMousePosition + 1
+ if newSize == objSize or newSize < 1:
+ return False
+
+ if axisIndex == 1:
+ obj.size = (obj.size[0], newSize)
+ else:
+ obj.size = (newSize, obj.size[1])
+
+ else:
+ # Resize the left/top side
+ rightSide = objPosition + objSize - 1
+ newLeftSide = mousePosition
+
+ newPosition = newLeftSide
+ newSize = rightSide - newLeftSide + 1
+
+ if newSize < 1:
+ return False
+ if newPosition == objPosition and newSize == objSize:
+ return False
+
+ if axisIndex == 1:
+ obj.position = (obj.position[0], newPosition)
+ obj.size = (obj.size[0], newSize)
+ else:
+ obj.position = (newPosition, obj.position[1])
+ obj.size = (newSize, obj.size[1])
+
+ return True
+
+
+ def mouseMoveEvent(self, event):
+ if self.resizing:
+ obj = self._objRef()
+ scenePos = event.scenePos()
+
+ hasChanged = False
+ resizeX, xSide, resizeY, ySide = self.resizing
+
+ if resizeX:
+ hasChanged |= self._tryAndResize(obj, 0, int(scenePos.x() / 24), xSide)
+ if resizeY:
+ hasChanged |= self._tryAndResize(obj, 1, int(scenePos.y() / 24), ySide)
+
+ if hasChanged:
+ obj.updateCache()
+ self._layerRef().updateCache()
+ self._updatePosition()
+ self._updateSize()
+
+ else:
+ KPEditorItem.mouseMoveEvent(self, event)
+
+
+ def mouseReleaseEvent(self, event):
+ if self.resizing and event.button() == Qt.LeftButton:
+ self.resizing = None
+ else:
+ KPEditorItem.mouseReleaseEvent(self, event)
+
+
def _itemMoved(self, oldX, oldY, newX, newY):
obj = self._objRef()
obj.position = (newX/24, newY/24)