Ejemplo n.º 1
0
    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()
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
    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