class DeviceView(QtWidgets.QTableView): def __init__(self, device, parent=None): super().__init__(parent=parent) self.proxy_model = QSortFilterProxyModel() self.proxy_model.setFilterKeyColumn(-1) self.proxy_model.setDynamicSortFilter(True) self.setModel(self.proxy_model) self.models = {} self._device = None # Set the property last self.device = device def clear(self): for model in self.models.values(): model.stop() self.models.clear() self._device = None @property def device(self): return self._device @device.setter def device(self, device): if device is self._device: return if self._device is not None: self.models[device].stop() self._device = device if device: try: model = self.models[device] except KeyError: model = PolledDeviceModel(device=device) self.models[device] = model model.start() self.proxy_model.setSourceModel(model)
class DetectorView(QtWidgets.QTableView): def __init__(self, prefix, parent=None): super().__init__(parent=parent) self._prefix = None self._pvlist = None self._pvlist_key = None self.models = {} self.proxy_model = QSortFilterProxyModel() self.proxy_model.setDynamicSortFilter(True) self.proxy_model.setSortCaseSensitivity(QtCore.Qt.CaseInsensitive) self.setModel(self.proxy_model) self.setSortingEnabled(True) # Set the property last self.prefix = prefix @property def model(self): if self._pvlist_key: return self.models.get(self._pvlist_key, None) return self.models.get(self._prefix, None) @property def prefix(self): return self._prefix @prefix.setter def prefix(self, prefix): if prefix == self._prefix: return logger.info('New prefix: %s', prefix) self._prefix = prefix self._pvlist = None self._pvlist_key = None if prefix: try: model = self.models[prefix] except KeyError: model = DetectorFromPrefixModel(prefix=prefix) self.models[prefix] = model self.proxy_model.setSourceModel(model) header = self.horizontalHeader() for col in range(3): header.setSectionResizeMode( col, QtWidgets.QHeaderView.ResizeToContents) @property def pvlist(self): return self.model.pvlist @pvlist.setter def pvlist(self, pvlist): pvlist = list(sorted(set(pvlist))) unique_id = '/'.join(pvlist) pvlist_key = f'pvlist_{hash(unique_id)}' if pvlist_key == self._pvlist_key: return self._pvlist = pvlist self._pvlist_key = pvlist_key try: model = self.models[self._pvlist_key] except KeyError: model = DetectorFromPVListModel(pvlist=self._pvlist) self.models[self._pvlist_key] = model logger.info( 'New PV list (%d PVs) - searching for %d cam PVs, %d plugin PVs', len(pvlist), len(model.cams.pvs), len(model.plugins.pvs)) self._prefix = model.prefix self.proxy_model.setSourceModel(model) header = self.horizontalHeader() for col in range(3): header.setSectionResizeMode(col, QtWidgets.QHeaderView.ResizeToContents)