def set_data(self, data: List[dict], headers: Optional[List[str]] = None): """Set the data in the table, given a list of dicts. Parameters ---------- data : List[dict] A list of dicts where each dict in the list is a row, and each key in the dict is a header, by default None. (call set_data later to add data) headers : list of str, optional If provided, will be used in order as the headers of the table. All items in ``headers`` must be present in at least one of the dicts. by default headers will be the set of all keys in all dicts in ``source`` """ if not isinstance(data, list) or any( not isinstance(i, dict) for i in data ): raise ValueError("'data' argument must be a list of dicts") nrows = len(data) _headers = sorted(set().union(*data)) if headers: for h in headers: if h not in _headers: raise ValueError( trans._( "Argument 'headers' got item '{h}', which was not found in any of the items in 'data'".format( h=h ) ) ) _headers = headers self.setRowCount(nrows) self.setColumnCount(len(_headers)) for row, elem in enumerate(data): for key, value in elem.items(): value = value or '' try: col = _headers.index(key) except ValueError: continue item = QTableWidgetItem(value) # underline links if email_pattern.match(value) or url_pattern.match(value): font = QFont() font.setUnderline(True) item.setFont(font) self.setItem(row, col, item) self.setHorizontalHeaderLabels(_headers) self.resize_to_fit()
def get_preview_items(self, level): previewItem = QTableWidgetItem("Log message") previewItem.setBackground(QBrush(level.bg, Qt.SolidPattern)) previewItem.setForeground(QBrush(level.fg, Qt.SolidPattern)) previewItemDark = QTableWidgetItem("Log message") previewItemDark.setBackground(QBrush(level.bgDark, Qt.SolidPattern)) previewItemDark.setForeground(QBrush(level.fgDark, Qt.SolidPattern)) font = QFont(CONFIG.logger_table_font, CONFIG.logger_table_font_size) fontDark = QFont(font) if 'bold' in level.styles: font.setBold(True) if 'italic' in level.styles: font.setItalic(True) if 'underline' in level.styles: font.setUnderline(True) if 'bold' in level.stylesDark: fontDark.setBold(True) if 'italic' in level.stylesDark: fontDark.setItalic(True) if 'underline' in level.stylesDark: fontDark.setUnderline(True) previewItem.setFont(font) previewItemDark.setFont(fontDark) return previewItem, previewItemDark
def data(self, index, role=Qt.DisplayRole): if not index.isValid(): return None result = None record = self.records[index.row()] if getattr(record, '_cutelog', False): return self.data_internal(index, record, role) if role == Qt.DisplayRole: column_name = self.table_header[index.column()].name if self.extra_mode and column_name == "message": result = self.get_extra(record.message, record) else: result = getattr(record, column_name, None) elif role == Qt.SizeHintRole: if self.extra_mode and self.table_header[ index.column()].name == 'message': return QSize( 1, CONFIG.logger_row_height * (1 + len(self.get_fields_for_extra(record)))) else: return QSize(1, CONFIG.logger_row_height) elif role == Qt.DecorationRole: if self.table_header[index.column()].name == 'message': if record.exc_text: mode = CONFIG['exception_indication'] should = mode in (Exc_Indication.MSG_ICON, Exc_Indication.ICON_AND_RED_BG) if should: result = self.parent_widget.style().standardIcon( QStyle.SP_BrowserStop) elif role == Qt.FontRole: level = self.levels.get(record.levelname, NO_LEVEL) styles = level.styles if not self.dark_theme else level.stylesDark result = QFont(CONFIG.logger_table_font, CONFIG.logger_table_font_size) if styles: if 'bold' in styles: result.setBold(True) if 'italic' in styles: result.setItalic(True) if 'underline' in styles: result.setUnderline(True) elif role == Qt.ForegroundRole: level = self.levels.get(record.levelname, NO_LEVEL) if not self.dark_theme: result = level.fg else: result = level.fgDark elif role == Qt.BackgroundRole: if record.exc_text: mode = CONFIG['exception_indication'] should = mode in (Exc_Indication.RED_BG, Exc_Indication.ICON_AND_RED_BG) if should: if not self.dark_theme: color = QColor(255, 180, 180) else: color = Qt.darkRed result = QBrush(color, Qt.DiagCrossPattern) return result level = self.levels.get(record.levelname, NO_LEVEL) if not self.dark_theme: result = level.bg else: result = level.bgDark elif role == SearchRole: result = record.message return result