Package mcbase :: Package widgets :: Module mctableview
[hide private]
[frames] | no frames]

Source Code for Module mcbase.widgets.mctableview

  1  # -*- coding: utf-8 -*- 
  2   
  3  ########################################################################## 
  4  # mctableview.py 
  5  # 
  6  # MOCOP customized QTableView derived class. 
  7  # 
  8  # (C) 2008 Likya Software 
  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 
19 20 21 -class MCTableView(QTableView):
22 ''' 23 Customized QTableView derived class. Used for implementing MOCOP custom features. 24 '''
25 - def __init__(self, *prm):
26 QTableView.__init__(self, *prm) 27 self.setObjectName('mctableview') 28 # We want horizontal scroll to be pixel based. 29 self.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel) 30 # Let horizontal scroll steps be 64 pixels. 31 self.horizontalScrollBar().setSingleStep(64) 32 # Set row height 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
44 - def modelRowCountChanged(self, newRowCount):
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 # Base class implementation 63 QTableView.setModel(self, model) 64 # Signal connections, this is essential for correct operation of table 65 self.connect(model, SIGNAL('rowCountChanged(int)'), self.modelRowCountChanged) 66 # Set column widths 67 self.setColumnWidths() 68 69 if fetchContents: 70 # Retrieve table contents 71 self.model().cacheMiss(0)
72
73 - def setColumnWidth(self, col, width):
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
82 - def hideColumn(self, col):
83 ''' 84 Overriden method to hide a column 85 86 @param col: Column index (logical) 87 ''' 88 QTableView.hideColumn(self, col)
89
90 - def setColumnWidths(self):
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
102 - def resetTable(self):
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
114 - def refreshTable(self):
115 ''' 116 @returns: A deferred that will fire when the table is refreshed 117 ''' 118 # Special case, if table row count is 0, then resetTable() must 119 # be called. 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
131 - def selectedObject(self):
132 ''' 133 Returns the currently selected object from the list. 134 ''' 135 return self.model().selectedObject(self.currentIndex().row())
136
137 - def selectedIndex(self):
138 ''' 139 Returns the currently selected index from the list. 140 ''' 141 return self.currentIndex().row()
142
143 - def cellDoubleClicked(self, index):
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