return '{:f}'.format(mag)
def getItem(self, device, channel):
- '''Returns the item for the device + channel combination from the model,
- or creates a new item if no existing one matches.'''
+ '''Return the item for the device + channel combination from the
+ model, or create a new item if no existing one matches.'''
- # unique identifier for the device + channel
- # TODO: isn't there something better?
+ # Unique identifier for the device + channel.
+ # TODO: Isn't there something better?
uid = (
device.vendor,
device.model,
channel.index
)
- # find the correct item in the model
+ # Find the correct item in the model.
for row in range(self.rowCount()):
item = self.item(row)
rid = item.data(MeasurementDataModel._idRole)
- rid = tuple(rid) # PySide returns a list
+ rid = tuple(rid) # PySide returns a list.
if uid == rid:
return item
- # nothing found, create a new item
+ # Nothing found, create a new item.
desc = '{} {}, channel "{}"'.format(
device.vendor, device.model, channel.name)
@QtCore.Slot(object, object, object)
def update(self, device, channel, data):
- '''Updates the data for the device (+channel) with the most recent
+ '''Update the data for the device (+channel) with the most recent
measurement from the given payload.'''
item = self.getItem(device, channel)
unit_str = self.format_unit(unit)
mqflags_str = self.format_mqflags(mqflags)
- disp = ' '.join([value_str, unit_str, mqflags_str])
+ # The display role is a tuple containing the value and the unit/flags.
+ disp = (value_str, ' '.join([unit_str, mqflags_str]))
item.setData(disp, QtCore.Qt.DisplayRole)
class MultimeterDelegate(QtGui.QStyledItemDelegate):
'''Delegate to show the data items from a MeasurementDataModel.'''
def __init__(self, parent, font):
- '''Initializes the delegate.
+ '''Initialize the delegate.
:param font: Font used for the description text, the value is drawn
with a slightly bigger and bold variant of the font.
fm = QtGui.QFontMetrics(self._bfont)
r = fm.boundingRect('-XX.XXXXXX X XX')
- self._size = QtCore.QSize(r.width() * 1.2, r.height() * 3.5)
+ self._size = QtCore.QSize(r.width() * 1.4, r.height() * 3.5)
+
+ # Values used to calculate the positions of the strings in the
+ # 'paint()' function.
+ self._space_width = fm.boundingRect('_').width()
+ self._value_width = fm.boundingRect('-XX.XXXXXX').width()
def sizeHint(self, option=None, index=None):
return self._size
def paint(self, painter, options, index):
- value = index.data(QtCore.Qt.DisplayRole)
+ value, unit = index.data(QtCore.Qt.DisplayRole)
desc = index.data(MeasurementDataModel.descRole)
- # description in the top left corner
+ # Description in the top left corner.
painter.setFont(self._nfont)
p = options.rect.topLeft()
p += QtCore.QPoint(self._nfontheight, 2 * self._nfontheight)
painter.drawText(p, desc)
- # value in the center
painter.setFont(self._bfont)
- r = options.rect.adjusted(self._nfontheight, 2.5 * self._nfontheight,
- 0, 0)
- painter.drawText(r, QtCore.Qt.AlignCenter, value)
+
+ # Value about in the center.
+ p = options.rect.center()
+ p += QtCore.QPoint(-3 * self._space_width, self._nfontheight)
+ rect = QtCore.QRect(0, 0, self._value_width, 2 * self._nfontheight)
+ rect.moveCenter(p)
+ painter.drawText(rect, QtCore.Qt.AlignRight, value)
+
+ # Unit right of the value.
+ rect.moveLeft(rect.right())
+ rect.adjust(self._space_width, 0, 0, 0)
+ painter.drawText(rect, QtCore.Qt.AlignLeft, unit)