Beispiel #1
0
def _draw_flags_icon(mutable: bool, persistent: bool, icon_size: int) -> QPixmap:
    """
    Combines icons into a single large icon and renders it into a pixmap of specified size.
    This operation is quite resource-consuming (we're drawing pictures after all, ask Picasso),
    so we cache the results in a LRU cache.
    """
    icon_name = "edit" if mutable else "lock"
    mutability = get_icon_pixmap(icon_name, icon_size)

    # https://youtu.be/AX2uz2XYkbo?t=21s
    icon_name = "save" if persistent else "random-access-memory"
    persistence = get_icon_pixmap(icon_name, icon_size)

    icon_size_rect = QRect(0, 0, icon_size, icon_size)

    pixmap = QPixmap(icon_size * 2, icon_size)
    mask = QBitmap(pixmap.width(), pixmap.height())
    mask.clear()
    pixmap.setMask(mask)

    painter = QPainter(pixmap)
    painter.drawPixmap(icon_size_rect, mutability, icon_size_rect)
    painter.drawPixmap(
        QRect(icon_size, 0, icon_size, icon_size), persistence, icon_size_rect
    )
    return pixmap
Beispiel #2
0
    def _data_decoration(self, index: QModelIndex) -> typing.Union[QPixmap, QVariant]:
        row, column = index.row(), index.column()
        node = self._unwrap(index)

        if node.register is not None:
            if column == self.ColumnIndices.VALUE:
                try:
                    return get_icon_pixmap(
                        {
                            _Node.State.PENDING: "process",
                            _Node.State.SUCCESS: "ok",
                            _Node.State.ERROR: "error",
                        }[node.state],
                        self._icon_size,
                    )
                except KeyError:
                    pass

            if column == self.ColumnIndices.FLAGS:
                return _draw_flags_icon(
                    mutable=node.register.mutable,
                    persistent=node.register.persistent,
                    icon_size=self._icon_size,
                )

        return QVariant()
Beispiel #3
0
    def on_general_status_update(self, timestamp: float, s: GeneralStatusView):
        tssr = self._get_task_specific_status_report(TaskSpecificStatusReport.Fault, s)
        if tssr == self._last_displayed:
            return

        self._last_displayed = tssr

        pixmap = get_icon_pixmap(
            get_icon_name_for_task_id(tssr.failed_task_id), self._line_height
        )
        self._task_icon_display.setPixmap(pixmap)

        self._task_name_display.setText(str(tssr.failed_task_id).split(".")[-1])
        self._task_name_display.setToolTip(
            get_human_friendly_task_name(tssr.failed_task_id)
        )

        self._error_code_dec.setText(f"{tssr.failed_task_exit_code}")
        self._error_code_hex.setText(f"0x{tssr.failed_task_exit_code:02X}")
        self._error_code_bin.setText(f"0b{tssr.failed_task_exit_code:08b}")

        file_name = get_absolute_path(
            "view",
            "main_window",
            "telega_control_widget",
            "task_specific_status_widget",
            f"error_codes.yml",
            check_existence=True,
        )
        with open(file_name, "r") as f:
            error_codes = yaml.safe_load(f)

        failed_task_name = str(tssr.failed_task_id).split(".")[-1]

        error = error_codes[failed_task_name].get(
            tssr.failed_task_exit_code, "unknown error"
        )
        error_description = (
            error.get("description", "unknown error")
            if isinstance(error, dict)
            else error
        )
        error_comment = error.get("comment", "") if isinstance(error, dict) else ""

        self._error_description_display.setText(error_description)
        self._error_comment_display.setText(error_comment)
    def on_general_status_update(self, timestamp: float, s: GeneralStatusView):
        tssr = self._get_task_specific_status_report(
            TaskSpecificStatusReport.Fault, s)
        if tssr == self._last_displayed:
            return

        self._last_displayed = tssr

        pixmap = get_icon_pixmap(
            get_icon_name_for_task_id(tssr.failed_task_id), self._line_height)
        self._task_icon_display.setPixmap(pixmap)

        self._task_name_display.setText(
            str(tssr.failed_task_id).split('.')[-1])
        self._task_name_display.setToolTip(
            get_human_friendly_task_name(tssr.failed_task_id))

        self._error_code_dec.setText(f'{tssr.failed_task_exit_code}')
        self._error_code_hex.setText(f'0x{tssr.failed_task_exit_code:02X}')
        self._error_code_bin.setText(f'0b{tssr.failed_task_exit_code:08b}')

        file_name = get_absolute_path('view',
                                      'main_window',
                                      'telega_control_widget',
                                      'task_specific_status_widget',
                                      f'error_codes.yml',
                                      check_existence=True)
        with open(file_name, 'r') as f:
            error_codes = yaml.safe_load(f)

        failed_task_name = str(tssr.failed_task_id).split('.')[-1]

        error = error_codes[failed_task_name].get(tssr.failed_task_exit_code,
                                                  'unknown error')
        error_description = error.get('description',
                                      'unknown error') if isinstance(
                                          error, dict) else error
        error_comment = error.get('comment', '') if isinstance(error,
                                                               dict) else ''

        self._error_description_display.setText(error_description)
        self._error_comment_display.setText(error_comment)
Beispiel #5
0
    def headerData(self, section: int, orientation: int, role=None):
        if role == Qt.DisplayRole:
            if orientation == Qt.Horizontal:
                return self.COLUMNS[section][0]
            else:
                task_enum = list(self._data.entries.keys())[section]
                return get_human_friendly_task_name(task_enum, short=True)

        if role in (Qt.ToolTipRole, Qt.StatusTipRole):
            if orientation == Qt.Horizontal:
                return self.COLUMNS[section][1]
            else:
                task_enum = list(self._data.entries.keys())[section]
                return get_human_friendly_task_name(task_enum)

        if role == Qt.DecorationRole:
            if orientation == Qt.Vertical:
                task_enum = list(self._data.entries.keys())[section]
                try:
                    icon_name = get_icon_name_for_task_id(task_enum)
                except KeyError:
                    pass
                else:
                    return get_icon_pixmap(icon_name, self._icon_size)

        if role == Qt.TextAlignmentRole:
            return Qt.AlignCenter

        if role == Qt.FontRole:
            if orientation == Qt.Vertical:
                if (list(self._data.entries.keys())[section] ==
                        self._get_running_task_id()):
                    font = QFont()
                    font.setBold(True)
                    return font

        return QVariant()