# -*- coding: UTF-8 -*- from common import * from editorui import * class KPLayerList(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) self.layout = QtGui.QVBoxLayout() self.layout.setSpacing(0) self.model = KP.map.layerModel self.listView = QtGui.QListView() self.listView.setModel(self.model) self.listView.selectionModel().currentRowChanged.connect(self.handleRowChanged) self.layout.addWidget(self.listView) self.toolbar = QtGui.QToolBar() self.layout.addWidget(self.toolbar) self.setupToolbar(self.toolbar) self.setLayout(self.layout) def setupToolbar(self, tb): tb.addAction(QtGui.QIcon(), 'Add', self.addLayer) tb.addAction(QtGui.QIcon(), 'Remove', self.removeLayer) tb.addAction(QtGui.QIcon(), 'Move Up', self.moveUp) tb.addAction(QtGui.QIcon(), 'Move Down', self.moveDown) def selectedLayerIndex(self): return self.listView.selectionModel().currentIndex().row() def selectedLayer(self): return KP.map.layers[self.listView.selectionModel().currentIndex().row()] selectedLayerChanged = QtCore.pyqtSignal(KPLayer, KPLayer) @QtCore.pyqtSlot(QtCore.QModelIndex, QtCore.QModelIndex) def handleRowChanged(self, current, previous): self.selectedLayerChanged.emit( KP.map.layers[current.row()], ((previous.row() >= 0) and KP.map.layers[previous.row()]) or None ) def addLayer(self): KP.map.appendLayer(KP.map.createNewLayer()) def removeLayer(self): KP.map.removeLayer(self.selectedLayer()) def moveUp(self): index = self.selectedLayerIndex() KP.map.moveLayer(index, index - 1) def moveDown(self): index = self.selectedLayerIndex() KP.map.moveLayer(index, index + 2) class KPObjectSelector(QtGui.QListView): def __init__(self): """Initialises the widget. Remember to call setModel() on it with a KPGroupModel whenever the layer changes.""" font = QtGui.QFont() font.setPixelSize(22) font.setBold(True) icon = QtGui.QIcon('icons/downArrow.png') self.sorterButton = QtGui.QToolButton() string = QtCore.QString(QtCore.QChar(0x25BE)) string.append(' All Groups') self.sorterButton.setText(string) self.sorterButton.setFont(font) self.sorterButton.setPopupMode(2) self.sorterButton.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) self.sorterMenu = QtGui.QMenu() self.sorterMenu.setFixedWidth(self.sorterButton.width()) action = self.sorterMenu.addAction("test 1") self.sorterButton.setMenu(self.sorterMenu) layout = QtGui.QBoxLayout(2) layout.setAlignment(Qt.AlignTop) layout.setContentsMargins(0,0,0,0) layout.setMargin(0) layout.setSpacing(0) thing = QtGui.QListView.__init__(self) self.setFlow(QtGui.QListView.LeftToRight) self.setLayoutMode(QtGui.QListView.SinglePass) self.setMovement(QtGui.QListView.Static) self.setResizeMode(QtGui.QListView.Adjust) self.setWrapping(True) self.toolbar = QtGui.QToolBar() self.toolbar.setFixedHeight(28) self.toolbar.addWidget(self.sorterButton) layout.addWidget(self.toolbar) self.setLayout(layout) # Borrowed the signals and junk from Reggie, figure we'll need em' self.clicked.connect(self.handleObjReplace) self.sorterMenu.triggered.connect(self.toggleTopLevel) def resizeEvent(self, event): QtGui.QListView.resizeEvent(self, event) self.sorterMenu.setFixedWidth(self.width()-self.verticalScrollBar().width()) def currentSelectedObject(self): """Returns the currently selected object reference, for painting purposes.""" index = self.currentIndex().row() object = self.model().groupItem().getItem(index) return object def setModel(self, model): """Sets the model and the menu sorting list""" QtGui.QListView.setModel(self, model) menuList = model.groupItem().getGroupList() string = QtCore.QString(QtCore.QChar(0x25BE)) string.append(' All Groups') self.sorterButton.setText(string) self.sorterMenu.clear() for item in menuList: actionMan = self.sorterMenu.addAction(item[0]) actionMan.setData((item[1], item[2])) def toggleTopLevel(self, action): """Changes the top level group in the list view.""" name = str(action.text()).strip() startRow = action.data().toPyObject()[0] endRow = action.data().toPyObject()[1] for row in xrange(self.model().rowCount()): if (row < startRow) or (row > endRow): self.setRowHidden(row, True) else: self.setRowHidden(row, False) string = QtCore.QString(QtCore.QChar(0x25BE)) string.append(' ' + name) self.sorterButton.setText(string) @QtCore.pyqtSlot(QtCore.QModelIndex, QtCore.QModelIndex) def currentChanged(self, current, previous): """Throws a signal emitting the current object when changed""" i = current.row() object = self.model().groupItem().getItem(i) self.objChanged.emit(object) def handleObjReplace(self, index): """Throws a signal when the selected object is used as a replacement""" if QtGui.QApplication.keyboardModifiers() == QtCore.Qt.AltModifier: i = current.row() object = self.model().groupItem().getItem(i) self.objReplaced.emit(object) objChanged = QtCore.pyqtSignal(int) objReplaced = QtCore.pyqtSignal(KPTileObject) class KPMainWindow(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.editor = KPEditorWidget() self.setCentralWidget(self.editor) self.scene = KPMapScene() self.editor.setScene(self.scene) self.setupMenuBar() self.setupDocks() def setupMenuBar(self): mb = self.menuBar() m = mb.addMenu('&File') # ... def setupDocks(self): self.layerList = KPLayerList() self.layerListDock = QtGui.QDockWidget('Layers') self.layerListDock.setWidget(self.layerList) self.objectSelector = KPObjectSelector() self.updateObjectSelector() self.objectSelectorDock = QtGui.QDockWidget('Objects') self.objectSelectorDock.setWidget(self.objectSelector) self.addDockWidget(Qt.RightDockWidgetArea, self.layerListDock) self.addDockWidget(Qt.RightDockWidgetArea, self.objectSelectorDock) @QtCore.pyqtSlot() def updateObjectSelector(self): try: tileset = KPTileset.loadFromArc('/Users/Tempus/Dropbox/NEWERsmbw/Test3.arc') except IOError: tileset = KPTileset.loadFromArc('/home/me/Dropbox/NEWERsmbw/Test3.arc') self.objectSelector.setModel(tileset.getModel()) tileset.getModel().view = self.objectSelector