diff options
-rw-r--r-- | src/tileset.py | 142 | ||||
-rw-r--r-- | src/ui.py | 153 |
2 files changed, 149 insertions, 146 deletions
diff --git a/src/tileset.py b/src/tileset.py index 8d0c3d3..609fa1a 100644 --- a/src/tileset.py +++ b/src/tileset.py @@ -171,95 +171,95 @@ class KPTileObject(object): class KPGroupModel(QtCore.QAbstractListModel): - """Model containing all the grouped objects in a tileset""" - - def __init__(self, groupItem): - self.container = groupItem - - QtCore.QAbstractListModel.__init__(self) - - - def rowCount(self, parent=None): - return self.container.objectCount() - - - def data(self, index, role=QtCore.Qt.DisplayRole): + """Model containing all the grouped objects in a tileset""" + + def __init__(self, groupItem): + self.container = groupItem + + QtCore.QAbstractListModel.__init__(self) + + + def rowCount(self, parent=None): + return self.container.objectCount() + + + def data(self, index, role=QtCore.Qt.DisplayRole): # Should return the contents of a row when asked for the index - if not index.isValid(): return None - n = index.row() - - if n < 0: return None - if n >= self.container.objectCount(): return None - - item = self.container.getItem(n) - - if role == QtCore.Qt.DecorationRole: - if isInstance(item, KPTileObject): - return item.icon - - if role == QtCore.Qt.BackgroundRole: - return QtGui.qApp.palette().base() - - if role == QtCore.Qt.UserRole: - if isInstance(item, KPTileObject): - return item.itemsize - - if role == QtCore.Qt.DisplayRole: - if isInstance(item, KPGroupItem): - return item.name - - if role == QtCore.Qt.TextAlignmentRole: - if isInstance(item, KPGroupItem): - return item.alignment - - - return None + if not index.isValid(): return None + n = index.row() + + if n < 0: return None + if n >= self.container.objectCount(): return None + + item = self.container.getItem(n) + + if role == QtCore.Qt.DecorationRole: + if isInstance(item, KPTileObject): + return item.icon + + if role == QtCore.Qt.BackgroundRole: + return QtGui.qApp.palette().base() + + if role == QtCore.Qt.UserRole: + if isInstance(item, KPTileObject): + return item.itemsize + + if role == QtCore.Qt.DisplayRole: + if isInstance(item, KPGroupItem): + return item.name + + if role == QtCore.Qt.TextAlignmentRole: + if isInstance(item, KPGroupItem): + return item.alignment + + + return None class KPGroupItem(object): - """Hierarchal object for making a 2D hierarchy recursively using classes""" - - def __init__(self, name): + """Hierarchal object for making a 2D hierarchy recursively using classes""" + + def __init__(self, name): - self.objects = [] - self.groups = [] - self.startIndex = 0 - self.endIndex = 0 + self.objects = [] + self.groups = [] + self.startIndex = 0 + self.endIndex = 0 - self.name = name - self.alignment = QtCore.Qt.AlignCenter - + self.name = name + self.alignment = QtCore.Qt.AlignCenter + - def objectCount(self): - ''' Retrieves the total number of items in this group and all it's children ''' + def objectCount(self): + ''' Retrieves the total number of items in this group and all it's children ''' - objCount = 0 + objCount = 0 - objCount += len(self.objects) - objCount += len(self.groups) - for group in groups: - objCount += group.objectCount() + objCount += len(self.objects) + objCount += len(self.groups) + for group in groups: + objCount += group.objectCount() - return objCount - + return objCount + - def getItem(index): - ''' Retrieves an item of a specific index. The index is already checked for validity ''' + def getItem(index): + ''' Retrieves an item of a specific index. The index is already checked for validity ''' - if index == self.startIndex: - return self + if index == self.startIndex: + return self - if (index < self.startIndex + len(self.objects)): - return self.objects[index - self.startIndex - 1] + if (index < self.startIndex + len(self.objects)): + return self.objects[index - self.startIndex - 1] - else: + else: - for group in groups: + for group in groups: - if (group.startIndex < index) and (index < group.endIndex): - return group.getItem(index) + if (group.startIndex < index) and (index < group.endIndex): + return group.getItem(index) @@ -55,79 +55,82 @@ class KPLayerList(QtGui.QWidget): + + class KPObjectSelector(QtGui.QListView): - def __init__(self): - """Initialises the widget. Remember to call setModel() on it with a KPGroupModel - whenever the layer changes.""" - - 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.setItemDelegate(KPObjectSelector.ObjectItemDelegate()) - - self.clicked.connect(self.HandleObjReplace) - - - def toggleTopLevel(self, id): - """Changes the top level group in the list view.""" - - # Not quite sure how to implement this yet. Basically, the model is hierarchal, - # and it'll return items from whatever the top level KPGroupItem is. But removing - # and adding stuff isn't possible, since I need to retain my recursive object. - # - # So here's the structure. Above this QListView, there will be a QComboBox. - # - # The QComboBox will list all groups in my hierarchy. - # Selecting a group will cause the QListView to only show items for those rows, - # even though all rows are retained. - # - # It's kind of like a custom QSortFilterProxyModel. Maybe I should subclass that. - - - self.setCurrentIndex(self.model().index(sel, 0, QtCore.QModelIndex())) - - @QtCore.pyqtSlot(QtCore.QModelIndex, QtCore.QModelIndex) - def currentChanged(self, current, previous): - """Throws a signal when the selected object changed""" - self.ObjChanged.emit(current.row()) - - def HandleObjReplace(self, index): - """Throws a signal when the selected object is used as a replacement""" - if QtGui.QApplication.keyboardModifiers() == QtCore.Qt.AltModifier: - self.ObjReplace.emit(index.row()) - - ObjChanged = QtCore.pyqtSignal(int) - ObjReplace = QtCore.pyqtSignal(int) - - - class KPGroupItemDelegate(QtGui.QAbstractItemDelegate): - """Handles tileset groups, objects and their rendering""" - - def __init__(self): - """Initialises the delegate""" - QtGui.QAbstractItemDelegate.__init__(self) - - def paint(self, painter, option, index): - """Paints an object""" - if option.state & QtGui.QStyle.State_Selected: - painter.fillRect(option.rect, option.palette.highlight()) - - p = index.model().data(index, QtCore.Qt.DecorationRole) - painter.drawPixmap(option.rect.x()+2, option.rect.y()+2, p) - #painter.drawText(option.rect, str(index.row())) - - def sizeHint(self, option, index): - """Returns the size for the object""" - p = index.model().data(index, QtCore.Qt.UserRole) - return p - - - + def __init__(self): + """Initialises the widget. Remember to call setModel() on it with a KPGroupModel + whenever the layer changes.""" + + 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.setItemDelegate(KPObjectSelector.ObjectItemDelegate()) + # Borrowed the signals and junk from Reggie, figure we'll need em' + + self.clicked.connect(self.HandleObjReplace) + + + def toggleTopLevel(self, id): + """Changes the top level group in the list view.""" + + # Not quite sure how to implement this yet. Basically, the model is hierarchal, + # and it'll return items from whatever the top level KPGroupItem is. But removing + # and adding stuff isn't possible, since I need to retain my recursive object. + # + # So here's the structure. Above this QListView, there will be a QComboBox. + # + # The QComboBox will list all groups in my hierarchy. + # Selecting a group will cause the QListView to only show items for those rows, + # even though all rows are retained. + # + # It's kind of like a custom QSortFilterProxyModel. Maybe I should subclass that. + + + self.setCurrentIndex(self.model().index(sel, 0, QtCore.QModelIndex())) + + @QtCore.pyqtSlot(QtCore.QModelIndex, QtCore.QModelIndex) + def currentChanged(self, current, previous): + """Throws a signal when the selected object changed""" + self.ObjChanged.emit(current.row()) + + def HandleObjReplace(self, index): + """Throws a signal when the selected object is used as a replacement""" + if QtGui.QApplication.keyboardModifiers() == QtCore.Qt.AltModifier: + self.ObjReplace.emit(index.row()) + + ObjChanged = QtCore.pyqtSignal(int) + ObjReplace = QtCore.pyqtSignal(int) + + + class KPGroupItemDelegate(QtGui.QAbstractItemDelegate): + """Handles tileset groups, objects and their rendering""" + + def __init__(self): + """Initialises the delegate""" + QtGui.QAbstractItemDelegate.__init__(self) + + def paint(self, painter, option, index): + """Paints an object""" + if option.state & QtGui.QStyle.State_Selected: + painter.fillRect(option.rect, option.palette.highlight()) + + p = index.model().data(index, QtCore.Qt.DecorationRole) + painter.drawPixmap(option.rect.x()+2, option.rect.y()+2, p) + #painter.drawText(option.rect, str(index.row())) + + def sizeHint(self, option, index): + """Returns the size for the object""" + p = index.model().data(index, QtCore.Qt.UserRole) + return p + + + @@ -158,10 +161,10 @@ class KPMainWindow(QtGui.QMainWindow): self.layerListDock = QtGui.QDockWidget('Layers') self.layerListDock.setWidget(self.layerList) - self.objectSelector = KPObjectSelector() - # self.objectSelector.setModel(SomeTileset.getModel()) - self.objectSelectorDock = QtGui.QDockWidget('Layers') - self.objectSelectorDock.setWidget(self.layerList) + # self.objectSelector = KPObjectSelector() + # # self.objectSelector.setModel(SomeTileset.getModel()) + # self.objectSelectorDock = QtGui.QDockWidget('Layers') + # self.objectSelectorDock.setWidget(self.layerList) self.addDockWidget(Qt.RightDockWidgetArea, self.layerListDock) |