diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/editorui.py | 65 | ||||
-rw-r--r-- | src/mapdata.py | 65 | ||||
-rw-r--r-- | src/ui.py | 10 |
3 files changed, 114 insertions, 26 deletions
diff --git a/src/editorui.py b/src/editorui.py index 7969100..c7da106 100644 --- a/src/editorui.py +++ b/src/editorui.py @@ -236,6 +236,40 @@ class KPEditorObject(KPEditorItem): self._layerRef().updateCache() +class KPEditorDoodad(KPEditorItem): + def __init__(self, doodad, layer): + KPEditorItem.__init__(self) + obj.qtItem = self + self._doodadRef = weakref.ref(doodad) + self._layerRef = weakref.ref(layer) + self._updatePosition() + self._updateSize() + + self.setAcceptHoverEvents(True) + + def _updatePosition(self): + self.setPos(*self._doodadRef().position) + + def _updateSize(self): + self.prepareGeometryChange() + + w,h = self._doodadRef().size + + self._boundingRect = QtCore.QRectF(0, 0, w, h) + self._selectionRect = QtCore.QRectF(0, 0, w, h) + + + 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): + doodad = self._doodadRef() + doodad.position = (newX, newY) + + class KPMapScene(QtGui.QGraphicsScene): def __init__(self): QtGui.QGraphicsScene.__init__(self, 0, 0, 512*24, 512*24) @@ -259,10 +293,39 @@ class KPMapScene(QtGui.QGraphicsScene): areaRightT = ceil(areaRight / 24) areaBottomT = ceil(areaBottom / 24) + # compile a list of doodads + visibleDoodadsByLayer = {} + + for obj in self.items(rect): + if not isinstance(obj, KPEditorDoodad): continue + + layer = obj._layerRef() + + try: + doodadList = visibleDoodadsByLayer[layer] + except KeyError: + doodadList = [] + visibleDoodadsByLayer[layer] = doodadList + + doodadList.append(obj) + + # now draw everything! for layer in reversed(KP.map.layers): if not layer.visible: continue - if isinstance(layer, KPTileLayer): + if isinstance(layer, KPDoodadLayer): + try: + toDraw = visibleDoodadsByLayer[layer] + except KeyError: + continue + + for item in toDraw: + painter.save() + painter.setWorldTransform(item.transform(), True) + painter.drawPixmap(0, 0, item.pixmap) + painter.restore() + + elif isinstance(layer, KPTileLayer): left, top = layer.cacheBasePos width, height = layer.cacheSize right, bottom = left+width, top+height diff --git a/src/mapdata.py b/src/mapdata.py index 2f1f5a2..53331c5 100644 --- a/src/mapdata.py +++ b/src/mapdata.py @@ -4,19 +4,6 @@ TILE_SIZE = (24,24) MAP_SIZE_IN_TILES = (512,512) MAP_SIZE = (MAP_SIZE_IN_TILES[0] * TILE_SIZE[0], MAP_SIZE_IN_TILES[1] * TILE_SIZE[1]) -class KPObject(object): - def __init__(self): - self.position = (0,0) - self.size = (1,1) - self.kind = 0 - self.cache = [] - self.tileset = None - self.qtItem = None - - def updateCache(self): - self.cache = self.kind.render(self.size) - - class KPLayer(object): def __repr__(self): return "<KPLayer %r>" % self.name @@ -41,6 +28,19 @@ class KPLayer(object): pass +class KPObject(object): + def __init__(self): + self.position = (0,0) + self.size = (1,1) + self.kind = 0 + self.cache = [] + self.tileset = None + self.qtItem = None + + def updateCache(self): + self.cache = self.kind.render(self.size) + + class KPTileLayer(KPLayer): def __repr__(self): return "<KPTileLayer %r with %r>" % (self.name, self.tileset) @@ -111,6 +111,27 @@ class KPTileLayer(KPLayer): y += 1 +class KPDoodad(object): + def __init__(self): + self.position = (0,0) + self.angle = 0 + self.scale = (0,0) + + +class KPDoodadLayer(KPLayer): + def __repr__(self): + return "<KPDoodadLayer %r>" % self.name + + def __init__(self): + KPLayer.__init__(self) + self.objects = [] + + def _visibilityChanged(self, value): + for obj in self.objects: + item = obj.qtItem + if item: + item.setVisible(value) + class KPNodeAction(object): @@ -138,22 +159,14 @@ class KPPath(object): self.segments = [] -class KPDoodad(object): - def __init__(self): - self.position = (0,0) - self.angle = 0 - self.scale = (0,0) - - class KPMap(object): def __init__(self): self.nextLayerNumber = 1 - self.layers = [self.createNewLayer('Test') for x in range(4)] + self.layers = [self.createNewTileLayer('Test') for x in range(4)] self.layerModel = KPMap.LayerModel(self.layers) self.nodes = [] self.paths = [] - self.doodads = [] self.tilesets = {} self.loadedTilesets = {} @@ -220,13 +233,19 @@ class KPMap(object): return False - def createNewLayer(self, tilesetName): + def createNewTileLayer(self, tilesetName): layer = KPTileLayer() layer.name = "Layer %d" % self.nextLayerNumber self.nextLayerNumber += 1 layer.tileset = tilesetName return layer + def createNewDoodadLayer(self): + layer = KPDoodadLayer() + layer.name = "Layer %d" % self.nextLayerNumber + self.nextLayerNumber += 1 + return layer + def appendLayer(self, layer): return self.insertLayer(len(self.layers), layer) @@ -58,11 +58,17 @@ class KPLayerList(QtGui.QWidget): def addLayer(self): from dialogs import KPTilesetChooserDialog - tilesetName = KPTilesetChooserDialog.run('Choose a tileset for the new layer') + special = ['Doodads (Special)'] + tilesetName = KPTilesetChooserDialog.run('Choose a tileset for the new layer', special) if tilesetName is None: return - KP.map.appendLayer(KP.map.createNewLayer(tilesetName)) + if tilesetName == 0: + layer = KP.map.createNewDoodadLayer() + else: + layer = KP.map.createNewTileLayer(tilesetName) + + KP.map.appendLayer(layer) self.setButtonStates() def removeLayer(self): |