summaryrefslogtreecommitdiff
path: root/src/editorui.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/editorui.py')
-rw-r--r--src/editorui.py169
1 files changed, 159 insertions, 10 deletions
diff --git a/src/editorui.py b/src/editorui.py
index 4eeca1d..557fe54 100644
--- a/src/editorui.py
+++ b/src/editorui.py
@@ -1,8 +1,92 @@
from common import *
+from math import floor, ceil
+import weakref
+
+
+class KPEditorItem(QtGui.QGraphicsItem):
+ def __init__(self):
+ QtGui.QGraphicsItem.__init__(self)
+ self.setFlags(
+ self.ItemSendsGeometryChanges |
+ self.ItemIsSelectable |
+ self.ItemIsMovable
+ )
+
+ def itemChange(self, change, value):
+ if change == self.ItemPositionChange:
+ currentX, currentY = self.x(), self.y()
+
+ # snap the item to 24x24
+ newpos = value.toPyObject()
+
+ x, y = newpos.x(), newpos.y()
+
+ x = int((x + 12) / 24) * 24
+ y = int((y + 12) / 24) * 24
+
+ if x < 0: x = 0
+ if x > 12264: x = 12264
+ if y < 0: y = 0
+ if y > 12264: y = 12264
+
+ if x != currentX or y != currentY:
+ print "Position change"
+ self._itemMoved(currentX, currentY, x, y)
+
+ newpos.setX(x)
+ newpos.setY(y)
+ return newpos
+
+ return QtGui.QGraphicsItem.itemChange(self, change, value)
+
+ def boundingRect(self):
+ return self._boundingRect
+
+ def _itemMoved(self, oldX, oldY, newX, newY):
+ pass
+
+
+class KPEditorObject(KPEditorItem):
+ def __init__(self, obj, layer):
+ KPEditorItem.__init__(self)
+ obj.qtItem = self
+ self._objRef = weakref.ref(obj)
+ self._layerRef = weakref.ref(layer)
+ self._updatePosition()
+ self._updateSize()
+
+ def _updatePosition(self):
+ obj = self._objRef()
+ x,y = obj.position
+
+ self.setPos(x*24, y*24)
+
+ def _updateSize(self):
+ self.prepareGeometryChange()
+
+ obj = self._objRef()
+ w,h = obj.size
+
+ self._boundingRect = QtCore.QRectF(0, 0, w*24, h*24)
+ self._selectionRect = QtCore.QRectF(0, 0, w*24-1, h*24-1)
+
+ def paint(self, painter, option, widget):
+ if self.isSelected():
+ painter.setPen(QtGui.QPen(Qt.white, 1, Qt.DotLine))
+ painter.drawRect(self._selectionRect)
+
+ def _itemMoved(self, oldX, oldY, newX, newY):
+ obj = self._objRef()
+ obj.position = (newX/24, newY/24)
+ self._layerRef().updateCache()
+
class KPMapScene(QtGui.QGraphicsScene):
def __init__(self):
- QtGui.QGraphicsScene.__init__(self)
+ QtGui.QGraphicsScene.__init__(self, 0, 0, 512*24, 512*24)
+
+ # todo: handle selectionChanged
+ # todo: look up why I used setItemIndexMethod(self.NoIndex) in Reggie
self.currentLayer = None
@@ -14,10 +98,10 @@ class KPMapScene(QtGui.QGraphicsScene):
areaWidth, areaHeight = rect.width(), rect.height()
areaRight, areaBottom = areaLeft+areaWidth, areaTop+areaHeight
- areaLeftT = areaLeft / 24
- areaTopT = areaTop / 24
- areaRightT = areaRight / 24
- areaBottomT = areaBottom / 24
+ areaLeftT = floor(areaLeft / 24)
+ areaTopT = floor(areaTop / 24)
+ areaRightT = ceil(areaRight / 24)
+ areaBottomT = ceil(areaBottom / 24)
for layer in KP.map.layers:
left, top = layer.cacheBasePos
@@ -33,11 +117,11 @@ class KPMapScene(QtGui.QGraphicsScene):
if top > areaBottomT: continue
# decide how much of the layer we'll actually draw
- drawLeft = max(areaLeftT, left)
- drawRight = min(areaRightT, right)
+ drawLeft = int(max(areaLeftT, left))
+ drawRight = int(min(areaRightT, right))
- drawTop = max(areaTopT, top)
- drawBottom = min(areaBottomT, bottom)
+ drawTop = int(max(areaTopT, top))
+ drawBottom = int(min(areaBottomT, bottom))
srcY = drawTop - top
destY = drawTop * 24
@@ -80,8 +164,73 @@ class KPMapScene(QtGui.QGraphicsScene):
if item:
item.setFlag(flag, value)
+
+
class KPEditorWidget(QtGui.QGraphicsView):
- pass
+ def __init__(self, scene, parent=None):
+ QtGui.QGraphicsView.__init__(self, scene, parent)
+
+ self.setAlignment(Qt.AlignLeft | Qt.AlignTop)
+ self.setDragMode(self.RubberBandDrag)
+
+ self.xScrollBar = QtGui.QScrollBar(Qt.Horizontal, parent)
+ self.setHorizontalScrollBar(self.xScrollBar)
+
+ self.yScrollBar = QtGui.QScrollBar(Qt.Vertical, parent)
+ self.setVerticalScrollBar(self.yScrollBar)
+
+ self.centerOn(0,0)
+
+ # set up stuff for painting
+ self.paintNext = None
+ self.paintNextID = None
+ self._resetPaintVars()
+
+ def _resetPaintVars(self):
+ self.painting = None
+ self.paintingItem = None
+
+ def _tryToPaint(self, event):
+ '''Called when a paint attempt is initiated'''
+
+ if self.paintNext is None: return
+
+ paint = self.paintNext
+ if isinstance(paint, KPTileObject):
+ clicked = self.mapToScene(event.x(), event.y())
+ x, y = clicked.x(), clicked.y()
+ if x < 0: x = 0
+ if y < 0: y = 0
+
+ x = int(x / 24)
+ y = int(y / 24)
+
+ layer = self.scene().currentLayer
+
+ obj = KPObject()
+ obj.position = (x,y)
+ obj.size = (1,1)
+ obj.tileset = layer.tileset
+ obj.kind = self.paintNextID
+ obj.updateCache()
+ layer.objects.append(obj)
+ layer.updateCache()
+
+ item = KPEditorObject(obj, layer)
+ self.scene().addItem(item)
+
+ self.painting = obj
+ self.paintingItem = item
+
+
+
+ def mousePressEvent(self, event):
+ if event.button() == Qt.RightButton:
+ self._tryToPaint(event)
+ event.accept()
+
+ else:
+ QtGui.QGraphicsView.mousePressEvent(self, event)