示例#1
0
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)
示例#2
0
文件: main.py 项目: pcdshub/adviewer
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)