diff options
Diffstat (limited to 'kodereviewer/models/diff_file.py')
-rw-r--r-- | kodereviewer/models/diff_file.py | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/kodereviewer/models/diff_file.py b/kodereviewer/models/diff_file.py new file mode 100644 index 0000000..c84eeca --- /dev/null +++ b/kodereviewer/models/diff_file.py @@ -0,0 +1,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() |