aboutsummaryrefslogtreecommitdiff
path: root/kodereviewer/models/diff_file.py
blob: c84eeca076054f3a2af6ca596dc8f6a9c4438b55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
"""Model used for line numbers in Editor.qml"""

import logging
from enum import auto, IntEnum
from typing import Optional

import rich
from PySide6.QtCore import QAbstractListModel, QByteArray, QModelIndex, QObject, QPersistentModelIndex, QStandardPaths, QUrl, Qt, Signal, Slot, Property
from PySide6.QtQuick import QQuickTextDocument
from PySide6.QtQml import QmlElement

from kodereviewer.diff_parser import Diff, DiffBlock

QML_IMPORT_NAME = "org.deprecated.kodereviewer"
QML_IMPORT_MAJOR_VERSION = 1

logger = logging.getLogger(__name__)


@QmlElement
class DiffFileModel(QAbstractListModel):

    _diff_str: str
    _diff: Diff
    blocks: list[DiffBlock] = []

    class Roles(IntEnum):
        Content = Qt.ItemDataRole.UserRole + 1
        LineCount = auto()

    def __init__(self, *args, **kwargs):
        self._diff_str = ''
        super().__init__(*args, **kwargs)


    def get_diff(self):
        return self._diff_str

    def set_diff(self, diff):
        if diff == self._diff_str:
            return
        self._diff_str = diff
        self._diff = Diff(diff)
        self.diffChanged.emit()
        self.resetModel()

    diffChanged = Signal()
    diff = Property(QObject, fget=get_diff, fset=set_diff,
                        notify=diffChanged)

    def data(self,
             index: QModelIndex | QPersistentModelIndex,
             role: int = Qt.ItemDataRole.DisplayRole) -> object:

        if not index.isValid():
            logger.debug('index not valid')
            return

        if self._diff_str is None:
            return

        row = index.row()
        if row < 0 or row > self.rowCount():
            logger.debug(f'row: {row}')
            return

        block = self.blocks[row]

        if role == self.Roles.Content:
            return block.content
        if role == self.Roles.LineCount:
            return len(block.content.split("\n"))

    def rowCount(self, parent: QModelIndex | QPersistentModelIndex = QModelIndex()) -> int:
        return len(self.blocks)

    def roleNames(self) -> dict[int, QByteArray]:
        return {
            self.Roles.Content: QByteArray(b'content'),
        }


    @Slot()
    def resetModel(self) -> None:
        logger.debug('reseting model?')
        self.beginResetModel()
        self.endResetModel()