aboutsummaryrefslogtreecommitdiff
path: root/kodereviewer/models/diff_file.py
diff options
context:
space:
mode:
Diffstat (limited to 'kodereviewer/models/diff_file.py')
-rw-r--r--kodereviewer/models/diff_file.py87
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()