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)
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)
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)
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)
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)
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)