diff options
Diffstat (limited to '')
| -rw-r--r-- | src/ui.py | 178 | 
1 files changed, 164 insertions, 14 deletions
| @@ -2,6 +2,7 @@  from common import *  from editorui import * +import os  class KPLayerList(QtGui.QWidget): @@ -28,7 +29,8 @@ class KPLayerList(QtGui.QWidget):  	def setupToolbar(self, tb): -		self.actAdd = tb.addAction(QtGui.QIcon(), 'Add', self.addLayer) +		self.actAddTile = tb.addAction(QtGui.QIcon(), 'T+', self.addTileLayer) +		self.actAddDoodad = tb.addAction(QtGui.QIcon(), 'D+', self.addDoodadLayer)  		self.actRemove = tb.addAction(QtGui.QIcon(), 'Remove', self.removeLayer)  		self.actMoveUp = tb.addAction(QtGui.QIcon(), 'Move Up', self.moveUp)  		self.actMoveDown = tb.addAction(QtGui.QIcon(), 'Move Down', self.moveDown) @@ -55,22 +57,26 @@ class KPLayerList(QtGui.QWidget):  		self.setButtonStates() -	def addLayer(self): +	def addTileLayer(self):  		from dialogs import KPTilesetChooserDialog -		special = ['Doodads (Special)'] -		tilesetName = KPTilesetChooserDialog.run('Choose a tileset for the new layer', special) +		tilesetName = KPTilesetChooserDialog.run('Choose a tileset for the new layer')  		if tilesetName is None:  			return -		if tilesetName == 0: -			layer = KP.map.createNewDoodadLayer() -		else: -			layer = KP.map.createNewTileLayer(tilesetName) +		layer = KP.map.createNewTileLayer(tilesetName) + +		KP.map.appendLayer(layer) +		self.setButtonStates() + + +	def addDoodadLayer(self): +		layer = KP.map.createNewDoodadLayer()  		KP.map.appendLayer(layer)  		self.setButtonStates() +  	def removeLayer(self):  		layer = self.selectedLayer()  		scene = KP.mainWindow.scene @@ -96,6 +102,135 @@ class KPLayerList(QtGui.QWidget): +class KPDoodadSelector(QtGui.QWidget): +	objChanged = QtCore.pyqtSignal(int, QtGui.QListWidgetItem) + + +	def __init__(self): +		"""Initialises the widget.""" + +		QtGui.QWidget.__init__(self) + +		self.layout = QtGui.QVBoxLayout() +		self.layout.setSpacing(0) + +		self.doodadList = QtGui.QListWidget() +		self.doodadList.setViewMode(1) +		self.doodadList.setWrapping(True) +		self.doodadList.setDragDropMode(1) +		self.doodadList.setSelectionMode(1) +		self.doodadList.setResizeMode(1) +		self.doodadList.setGridSize(QtCore.QSize(128, 128)) +		self.doodadList.setIconSize(QtCore.QSize(100, 100)) +		self.doodadList.setSpacing(4) + +	 +		self.toolbar = QtGui.QToolBar() +		self.layout.addWidget(self.toolbar) + +		self.addDoodadButton = self.toolbar.addAction(QtGui.QIcon(), 'Add', self.addDoodadfromFile) +		self.removeDoodadButton = self.toolbar.addAction(QtGui.QIcon(), 'Remove', self.removeDoodad) + + +		self.layout.addWidget(self.doodadList) + +		self.setLayout(self.layout) + +		self.nextIndex = 0 + +		self.doodadList.currentItemChanged.connect(self.handleRowChanged) + + +	def keyPressEvent(self, event): + +		self.doodadList.keyPressEvent(event) + +		if event.key() == 0x1000003: + +			msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Warning, +					"Delete Doodad?", "Are you sure you want to delete this doodad? This action cannot be undone.", +					QtGui.QMessageBox.NoButton, self) +			msgBox.addButton("Delete", QtGui.QMessageBox.AcceptRole) +			msgBox.addButton("Cancel", QtGui.QMessageBox.RejectRole) +			if msgBox.exec_() == QtGui.QMessageBox.AcceptRole: +				self.removeDoodad() + + +	def addDoodad(self, image, name): +		"""Takes a name and a QPixmap and turns it into an icon, then goes ahead and makes a doodad. +		Doodads are QListWidget items with an index number as Qt.UserRole #32.""" + + +		doodie = QtGui.QListWidgetItem(QtGui.QIcon(image), name) +		doodie.setSizeHint(QtCore.QSize(128,128)) +		doodie.setData(32, self.nextIndex) +		doodie.setToolTip(name) +		doodie.setTextAlignment(Qt.AlignBottom | Qt.AlignHCenter) + +		self.doodadList.addItem(doodie) +		self.nextIndex += 1 + + +	def addDoodadfromFile(self): +		"""Asks the user for files to load in as doodads.""" +		 +		log = QtGui.QFileDialog() +		log.setFileMode(3); + +		files = QtGui.QFileDialog.getOpenFileNames(self, +				"Choose an image or several image files.", "", +				"Images (*.png *.jpeg *.jpg *.bmp)") +		if files: +			for image in files: +				name = os.path.basename(unicode(image)).split('.')[0] + +				pix = QtGui.QPixmap() +				pix.load(image) + +				self.addDoodad(pix, name) + + +	def removeDoodad(self): +		"""Removes selected doodad""" + +		item = self.doodadList.currentRow() + +		if item != -1: +			self.doodadList.takeItem(item) + + +	def getDoodad(self, index): +		"""Retrieves a doodad by index""" + +		for item in self.doodadList.items(): +			if item.data(32) == index: +				return item + + +	def getDoodadImage(self, index, width, height): +		"""Retrieves a doodad pixmap by index""" + +		for item in self.doodadList.items(): +			if item.data(32) == index: +				return item.icon().pixmap(width, height) + +	def getDoodads(self): +		"""Returns a list of all doodads.  + +		Name can be retrieved with doodad.text() +		Image with doodad.icon().pixmap(doodad.icon().availableSizes()[0]) +		Index with doodad.data(32)""" + +		return self.doodadList.items() + + +	@QtCore.pyqtSlot(QtGui.QListWidgetItem) +	def handleRowChanged(self, current): +		"""Throws a signal emitting the current object when changed""" + +		self.objChanged.emit(current.data(32), current) + +  class KPObjectSelector(QtGui.QWidget): @@ -246,11 +381,6 @@ class KPObjectSelector(QtGui.QWidget): - - - - -  class KPMainWindow(QtGui.QMainWindow):  	def __init__(self):  		QtGui.QMainWindow.__init__(self) @@ -285,16 +415,31 @@ class KPMainWindow(QtGui.QMainWindow):  		self.objectSelectorDock = QtGui.QDockWidget('Objects')  		self.objectSelectorDock.setWidget(self.objectSelector) +		self.doodadSelector = KPDoodadSelector() +		self.doodadSelector.objChanged.connect(self.handleSelectedDoodadChanged) + +		self.doodadSelectorDock = QtGui.QDockWidget('Doodads') +		self.doodadSelectorDock.setWidget(self.doodadSelector) +		self.doodadSelectorDock.hide()  		self.addDockWidget(Qt.RightDockWidgetArea, self.layerListDock)  		self.addDockWidget(Qt.RightDockWidgetArea, self.objectSelectorDock) +		self.addDockWidget(Qt.RightDockWidgetArea, self.doodadSelectorDock)  	@QtCore.pyqtSlot(KPLayer)  	def handleSelectedLayerChanged(self, layer):  		self.scene.setCurrentLayer(layer) -		self.objectSelector.setModel(KP.map.loadedTilesets[layer.tileset].getModel()) +		if isinstance(layer, KPDoodadLayer): +			self.objectSelectorDock.hide() +			self.doodadSelectorDock.show() + +		else: +			self.doodadSelectorDock.hide() +			self.objectSelectorDock.show() + +			self.objectSelector.setModel(KP.map.loadedTilesets[layer.tileset].getModel())  	@QtCore.pyqtSlot(int, KPTileObject) @@ -303,5 +448,10 @@ class KPMainWindow(QtGui.QMainWindow):  		self.editor.paintNextID = index +	@QtCore.pyqtSlot(int, QtGui.QListWidgetItem) +	def handleSelectedDoodadChanged(self, index, obj): +		self.editor.paintNext = obj +		self.editor.paintNextID = index + | 
