1
2
3
4
5
6
7
8
9
10
11 import copy
12
13 from twisted.internet import defer
14
15 from PyQt4.Qt import *
16
17 from mcverticalheader import MCVerticalHeader
18 from mcroitemdelegate import MCROItemDelegate
22 '''
23 Customized QTableView derived class. Used for implementing MOCOP custom features.
24 '''
26 QTableView.__init__(self, *prm)
27 self.setObjectName('mctableview')
28
29 self.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel)
30
31 self.horizontalScrollBar().setSingleStep(64)
32
33 height = self.fontMetrics().height()
34 self.verticalHeader().setDefaultSectionSize(height + 3)
35
36 self.verticalHeader().deleteLater()
37 self.setVerticalHeader(MCVerticalHeader(Qt.Vertical, self, QHeaderView.Fixed))
38 self.setSelectionBehavior(QAbstractItemView.SelectRows)
39 self.setSelectionMode(QAbstractItemView.SingleSelection)
40 self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
41 self.setItemDelegate(MCROItemDelegate(self))
42 self.connect(self, SIGNAL('doubleClicked(const QModelIndex &)'), self.cellDoubleClicked)
43
45 '''
46 Called when the model row count is changed.
47
48 @param newRowCount: New number of rows, unused.
49 @type newRowCount: int
50 '''
51 self.verticalHeader().reset()
52
53 - def setModel(self, model, fetchContents=True):
54 '''
55 Sets the model for this table view.
56
57 @param model: Model object, no reference is hold to this object from
58 this view.
59 @param fetchContents: If True, the default, view contents are initiated
60 to be fetched from the server.
61 '''
62
63 QTableView.setModel(self, model)
64
65 self.connect(model, SIGNAL('rowCountChanged(int)'), self.modelRowCountChanged)
66
67 self.setColumnWidths()
68
69 if fetchContents:
70
71 self.model().cacheMiss(0)
72
74 '''
75 Overriden method to resize a column width
76
77 @param col: Column index (logical)
78 @param width: New column size
79 '''
80 QTableView.setColumnWidth(self, col, width)
81
83 '''
84 Overriden method to hide a column
85
86 @param col: Column index (logical)
87 '''
88 QTableView.hideColumn(self, col)
89
91 '''
92 Adjusts the columnt widths according to the model properties.
93 '''
94 for i, colSize in enumerate(self.model().getColumnSizes()):
95
96 if colSize == 0:
97 self.hideColumn(i)
98 else:
99 self.setColumnWidth(i, colSize)
100
101 @defer.inlineCallbacks
103 '''
104 Completely clears and resets the table. Returns a deferred
105 that will fire when data is received from server.
106
107 @returns: A deferred that will fire when data is received from
108 server.
109 '''
110 yield self.model().cacheMiss(0)
111 self.viewport().update()
112
113 @defer.inlineCallbacks
115 '''
116 @returns: A deferred that will fire when the table is refreshed
117 '''
118
119
120 model = self.model()
121
122 if model.rowCount() == 0:
123 yield self.resetTable()
124 defer.returnValue(None)
125
126 model.initCache()
127 self.viewport().update()
128
129 defer.returnValue(True)
130
132 '''
133 Returns the currently selected object from the list.
134 '''
135 return self.model().selectedObject(self.currentIndex().row())
136
138 '''
139 Returns the currently selected index from the list.
140 '''
141 return self.currentIndex().row()
142
144 '''
145 When a cell on table is double clicked, emits a custom signal with
146 the object of corresponding row.
147
148 @def index: Unused index parameter.
149 '''
150 self.emit(SIGNAL('rowSelected(PyQt_PyObject)'), copy.deepcopy(self.selectedObject()))
151