Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/pyqt_reactive/widgets/log_viewer.py
Original file line number Diff line number Diff line change
Expand Up @@ -613,7 +613,7 @@ def _precompute_search_matches(self, model) -> None:
needle = self._search_text if self._case_sensitive else self._search_text.lower()
for row in range(model.rowCount()):
index = model.index(row, 0)
text = index.data(Qt.DisplayRole)
text = index.data(Qt.ItemDataRole.DisplayRole)
if text:
haystack = text if self._case_sensitive else text.lower()
if needle in haystack:
Expand Down Expand Up @@ -912,7 +912,7 @@ def sizeHint(self, option, index): # type: ignore[override]
width = metrics.horizontalAdvance("M") * max_chars + 8
return QSize(width, self._fixed_row_height)

text = index.data(Qt.DisplayRole)
text = index.data(Qt.ItemDataRole.DisplayRole)
if text is None:
return super().sizeHint(option, index)

Expand Down
24 changes: 23 additions & 1 deletion tests/test_log_viewer_lifecycle.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,39 @@

from pathlib import Path

from PyQt6.QtCore import qInstallMessageHandler
from PyQt6.QtCore import Qt, qInstallMessageHandler
from PyQt6.QtWidgets import QStyleOptionViewItem

from pyqt_reactive.protocols import register_log_discovery_provider
from pyqt_reactive.utils.log_highlighter import build_log_line_html
from pyqt_reactive.widgets.log_viewer import (
LogFileInfo,
LogFileLoader,
LogItemDelegate,
LogListModel,
LogViewerWindow,
)


def test_log_delegate_uses_pyqt6_item_data_role(qtbot) -> None:
"""Search and sizing must use PyQt6's scoped item-data enum."""

model = LogListModel()
model.append_lines(["alpha", "matching line"])
delegate = LogItemDelegate()
delegate.set_search_state("matching", case_sensitive=False)

delegate._precompute_search_matches(model)
hint = delegate.sizeHint(QStyleOptionViewItem(), model.index(1, 0))

assert delegate._search_match_rows == {1}
assert (
model.data(model.index(1, 0), Qt.ItemDataRole.DisplayRole)
== "matching line"
)
assert hint.isValid()


def test_log_line_html_uses_authoritative_highlight_segments() -> None:
rendered = build_log_line_html(
"2026-07-29 20:00:00,000 - worker - ERROR - value < 2"
Expand Down
Loading