1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
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.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()]
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."""
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.objReplaced.emit(index.row())
objChanged = QtCore.pyqtSignal(int)
objReplaced = 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
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()
# TODO: refactor this, this is just a bit of a hack for now
from wii.u8archive import WiiArchiveU8
arc = WiiArchiveU8(open('/home/me/Dropbox/NEWERsmbw/Test2.arc', 'rb'))
img = arc.resolvePath('/BG_tex/Test2_tex.bin').data
obj = arc.resolvePath('/BG_unt/Test2.bin').data
objm = arc.resolvePath('/BG_unt/Test2_hd.bin').data
grp = arc.resolvePath('/BG_grp/Test2_grp.bin').data
TestTileset = KPTileset(img, obj, objm, grp)
self.objectSelector.setModel(TestTileset.getModel())
self.objectSelectorDock = QtGui.QDockWidget('Objects')
self.objectSelectorDock.setWidget(self.objectSelector)
self.addDockWidget(Qt.RightDockWidgetArea, self.layerListDock)
self.addDockWidget(Qt.RightDockWidgetArea, self.objectSelectorDock)
|