示例#1
0
    def data(self, index, role=Qt.DisplayRole):
        if role == Qt.DisplayRole or role == Qt.EditRole:
            key = self._columns[index.column()]
            tnum = sorted(self._tool_table)[index.row() + 1]
            return self._tool_table[tnum][key]

        elif role == Qt.TextAlignmentRole:
            col = self._columns[index.column()]
            if col == 'R':  # Remark
                return Qt.AlignVCenter | Qt.AlignLeft
            elif col in 'TPQ':  # Integers (Tool, Pocket, Orient)
                return Qt.AlignVCenter | Qt.AlignCenter
            else:  # All the other floats
                return Qt.AlignVCenter | Qt.AlignRight

        elif role == Qt.TextColorRole:
            tnum = sorted(self._tool_table)[index.row() + 1]
            if self.stat.tool_in_spindle == tnum:
                return QBrush(self.current_tool_color)
            else:
                return QStandardItemModel.data(self, index, role)

        elif role == Qt.BackgroundRole and self.current_tool_bg is not None:
            tnum = sorted(self._tool_table)[index.row() + 1]
            if self.stat.tool_in_spindle == tnum:
                return QBrush(self.current_tool_bg)
            else:
                return QStandardItemModel.data(self, index, role)

        return QStandardItemModel.data(self, index, role)
示例#2
0
    def data(self, index, role=Qt.DisplayRole):
        row, col = index.row(), index.column()

        #all_active_codes = [self.active_g_codes, self.active_m_codes]

        if role == Qt.DisplayRole or role == Qt.EditRole:
            if self.active_codes_only:
                a_code = self.active_g_codes[row]
            else:
                a_code = GM_CODES.keys()[row]

            if col == 0:
                return a_code
            elif col == 1:
                return GM_CODES[a_code]

        if self.active_codes_only:
            if role == Qt.TextColorRole:
                return QBrush(self.active_code_color)

            elif role == Qt.BackgroundRole and self.active_code_bg is not None:
                return QBrush(self.active_code_bg)
        else:
            if role == Qt.TextColorRole:
                if GM_CODES.keys()[row] in self.active_g_codes:
                    return QBrush(self.active_code_color)

            elif role == Qt.BackgroundRole and self.active_code_bg is not None:
                if GM_CODES.keys()[row] in self.active_g_codes:
                    return QBrush(self.active_code_bg)

        return QStandardItemModel.data(self, index, role)
示例#3
0
    def data(self, index, role=Qt.DisplayRole):
        if (role == Qt.DisplayRole
                or role == Qt.EditRole) and index.row() < len(self._holes):
            return self._holes[index.row()][index.column()]
        elif role == Qt.TextAlignmentRole:
            return Qt.AlignVCenter | Qt.AlignRight

        return QStandardItemModel.data(self, index, role)
示例#4
0
    def data(self, index, role=Qt.DisplayRole):
        if role == Qt.DisplayRole or role == Qt.EditRole:

            column_index = self._columns[index.column()]
            index_column = self._column_labels.index(column_index)

            return self._offset_table[index.row()][index_column]

        elif role == Qt.TextAlignmentRole:
            return Qt.AlignVCenter | Qt.AlignRight

        elif role == Qt.TextColorRole:

            offset = index.row() + 1

            if self.ot.current_index == offset:

                return QBrush(self.current_row_color)

            else:

                return QStandardItemModel.data(self, index, role)

        return QStandardItemModel.data(self, index, role)
示例#5
0
    def data(self, index, role=Qt.DisplayRole):
        row, col = index.row(), index.column()

        if role == Qt.DisplayRole or role == Qt.EditRole:
            data = DATA[row]
            code = data['code']
            if col == 0:
                return code
            elif col == 1:
                if code == 'G64':
                    return data['description'].format()
                return data['description']

        elif role == Qt.TextColorRole:
            if DATA[row]['code'] in self.gcodes:
                return QBrush(self.active_code_color)

        elif role == Qt.BackgroundRole and self.active_code_bg is not None:
            if DATA[row]['code'] in self.gcodes:
                return QBrush(self.active_code_bg)

        return QStandardItemModel.data(self, index, role)
示例#6
0
文件: main.py 项目: lnls-sirius/hla
class LogTable(QTreeView, PyDMWidget):
    """Log Table."""

    updated = Signal()

    def __init__(self, parent=None, channels=list(), label2width=dict(),
                 is_status=False):
        # QTableView.__init__(self, parent)
        QTreeView.__init__(self, parent)
        PyDMWidget.__init__(self)

        # setup table
        self._is_status = is_status
        self._date_fmt = ' %Y/%m/%d '
        self._time_fmt = ' %H:%M:%S '
        self.headerLabels = label2width.keys()
        self._model = QStandardItemModel()
        self._model.setHorizontalHeaderLabels(self.headerLabels)
        self.setModel(self._model)
        self.setUniformRowHeights(True)
        self.setHeader(QHeaderView(Qt.Horizontal))
        for idx, width in enumerate(label2width.values()):
            self.header().resizeSection(idx, width)
        self.header().resizeSections(QHeaderView.Fixed)
        self.header().setStretchLastSection(True)
        self.setSortingEnabled(True)
        self.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.setItemDelegateForColumn(2, LogItemDelegate(self))
        self.setSelectionBehavior(QAbstractItemView.SelectItems)
        self.setSelectionMode(QAbstractItemView.SingleSelection)
        self.setStyleSheet("gridline-color: #ffffff;")

        # set channels
        self.address2conn = dict()
        self.address2channels = dict()
        for address in channels:
            self.address2conn[address] = False
            channel = SiriusConnectionSignal(
                address=address,
                connection_slot=self.connection_changed,
                value_slot=self.value_changed,
                severity_slot=self.alarm_severity_changed)
            channel.connect()
            self.address2channels[address] = channel
            self._channels.append(channel)

    @Slot(bool)
    def connection_changed(self, conn):
        """Reimplement connection_changed to handle all channels."""
        address = self.sender().address
        self.address2conn[address] = conn
        allconn = True
        for conn in self.address2conn.values():
            allconn &= conn
        self.setState(allconn)
        self._connected = allconn

    def add_log_slot(self, updated):
        new_value = self._get_newitem_data(updated)
        if not new_value:
            return
        self.add_log(new_value)

    def add_log(self, new_value):
        if self._is_status:
            self.remove_log(new_value)

        datetime_now = _datetime.now()
        item_data = [QStandardItem(text) for text in (
            datetime_now.date().strftime(self._date_fmt),
            datetime_now.time().strftime(self._time_fmt),
            new_value['logtype'], new_value['psname'],
            new_value['propty'], new_value['value'])]
        for item in item_data:
            item.setTextAlignment(Qt.AlignCenter)

        self._model.insertRow(0, item_data)
        if self._model.rowCount() > 10000:
            self._model.removeRow(self._model.rowCount()-1)
        self.updated.emit()

    def remove_log_slot(self, updated):
        new_value = self._get_newitem_data(updated)
        if not new_value:
            return
        self.remove_log(new_value)

    def remove_log(self, new_value):
        for row in range(self._model.rowCount()):
            logtype = self._model.data(self._model.index(row, 2))
            if logtype != new_value['logtype']:
                continue
            psname = self._model.data(self._model.index(row, 3))
            if psname != new_value['psname']:
                continue
            propty = self._model.data(self._model.index(row, 4))
            if propty != new_value['propty']:
                continue
            self._model.removeRow(row)
        self.updated.emit()

    def alarm_severity_changed(self, new_alarm_severity):
        """Reimplement alarm_severity_changed."""
        if self.sender():
            pv_diff = _PVName(self.sender().address)
            val_diff = self.address2channels[pv_diff].value

            pv_opmd = pv_diff.substitute(
                propty_name='OpMode', propty_suffix='Sts')
            val_opmd = self.address2channels[pv_opmd].value
            is_slowref = val_opmd == _PSConst.States.SlowRef

            new_value = {'logtype': 'WARN', 'psname': pv_diff.device_name,
                         'propty': pv_diff.propty_name, 'value': str(val_diff)}
            if new_alarm_severity in [_Sev.MINOR_ALARM, _Sev.MAJOR_ALARM] and \
                    is_slowref:
                self.add_log(new_value)
            elif self._is_status:
                self.remove_log(new_value)

            super().alarm_severity_changed(new_alarm_severity)

    def _get_newitem_data(self, updated):
        pv, value = updated
        pv = _PVName(pv)
        if isinstance(value, _np.ndarray):
            _log.warning('PSDiag window received a numpy array to ' +
                         pv+' ('+str(value)+')!')
            return

        if value is None:
            return
        if 'conn' in self.sender().objectName():
            str_value = 'disconnected'
            logtype = 'DISCONN'
        elif pv.propty_name == 'PwrState':
            str_value = _PSEnums.PWRSTATE_STS[value]
            logtype = 'ERR'
        elif pv.propty_name == 'OpMode':
            str_value = _PSEnums.STATES[value]
            logtype = 'WARN'
        else:
            str_value = str(value)
            logtype = 'ERR'

        return {'logtype': logtype,
                'psname': pv.device_name,
                'propty': '' if logtype == 'DISCONN' else pv.propty_name,
                'value': str_value}

    def mouseDoubleClickEvent(self, ev):
        """Trigger open PS detail window."""
        idx = self.selectedIndexes()
        text = self._model.data(self._model.index(idx[0].row(), 3))
        text = _PVName(text)
        if text.dis == 'PS':
            _run_newprocess(['sirius-hla-as-ps-detail.py', text])
        elif text.dis == 'PU':
            _run_newprocess(['sirius-hla-as-pu-detail.py', text])
        super().mouseDoubleClickEvent(ev)