feature: follow the file and show always the end when new data comes
This commit is contained in:
@@ -14,6 +14,9 @@ class BigScrollBar(QWidget):
|
||||
code involved. We work around this by converting the python int
|
||||
into a string."""
|
||||
|
||||
user_interaction = Signal()
|
||||
"""signals that the user changed a value (the opposite is that some code changed the value) """
|
||||
|
||||
class ScrollEvent(enum.IntEnum):
|
||||
PageUp = 1
|
||||
PageDown = 2
|
||||
@@ -138,21 +141,27 @@ class BigScrollBar(QWidget):
|
||||
trigger_repeat_action = True
|
||||
match self.repeat_action_control:
|
||||
case QStyle.SubControl.SC_ScrollBarAddPage:
|
||||
self.user_interaction.emit()
|
||||
self.scroll_event.emit(self.ScrollEvent.PageDown)
|
||||
case QStyle.SubControl.SC_ScrollBarSubPage:
|
||||
self.user_interaction.emit()
|
||||
self.scroll_event.emit(self.ScrollEvent.PageUp)
|
||||
if self.value <= self.minimum:
|
||||
trigger_repeat_action = False
|
||||
case QStyle.SubControl.SC_ScrollBarAddLine:
|
||||
self.user_interaction.emit()
|
||||
self.scroll_event.emit(self.ScrollEvent.LinesDown)
|
||||
case QStyle.SubControl.SC_ScrollBarSubLine:
|
||||
self.user_interaction.emit()
|
||||
self.scroll_event.emit(self.ScrollEvent.LinesUp)
|
||||
if self.value <= self.minimum:
|
||||
trigger_repeat_action = False
|
||||
case QStyle.SubControl.SC_ScrollBarFirst:
|
||||
self.user_interaction.emit()
|
||||
self.set_value(self.minimum)
|
||||
trigger_repeat_action = False
|
||||
case QStyle.SubControl.SC_ScrollBarLast:
|
||||
self.user_interaction.emit()
|
||||
self.set_value(self.maximum)
|
||||
trigger_repeat_action = False
|
||||
case _:
|
||||
@@ -180,6 +189,7 @@ class BigScrollBar(QWidget):
|
||||
if not r.contains(event.position().toPoint()):
|
||||
new_position = self.snap_back_position
|
||||
|
||||
self.user_interaction.emit()
|
||||
# print(f"move to value: {new_position}")
|
||||
self.set_value(new_position)
|
||||
|
||||
@@ -227,7 +237,10 @@ class BigScrollBar(QWidget):
|
||||
self.repeat_action_timer.stop()
|
||||
#self.update()
|
||||
|
||||
def set_value(self, value: int):
|
||||
def set_value(self, value: int, emit_change_event=True):
|
||||
changed = self.value != value
|
||||
self.value = value
|
||||
self.value_changed.emit(str(self.value))
|
||||
if emit_change_event and changed:
|
||||
# print(f"emitting value changed: {self.value}")
|
||||
self.value_changed.emit(str(self.value))
|
||||
self.update()
|
||||
|
||||
@@ -77,10 +77,11 @@ class FileWatchdogThread(QRunnable):
|
||||
class BigText(QWidget):
|
||||
trigger_update = Signal()
|
||||
|
||||
def __init__(self, model: LogFileModel, show_range_slider=True):
|
||||
def __init__(self, model: LogFileModel, show_range_slider=True, show_follow_action=True):
|
||||
super(BigText, self).__init__()
|
||||
|
||||
self.show_range_slider = show_range_slider
|
||||
self.show_follow_action = show_follow_action
|
||||
self.model = model
|
||||
|
||||
self.grid = QGridLayout()
|
||||
@@ -102,6 +103,7 @@ class BigText(QWidget):
|
||||
# self.v_scroll_bar.setPageStep(1)
|
||||
self.v_scroll_bar.value_changed.connect(self.big_text.v_scroll_value_changed)
|
||||
self.v_scroll_bar.scroll_event.connect(self.big_text.v_scroll_event)
|
||||
self.v_scroll_bar.user_interaction.connect(self.big_text.user_scroll_interaction)
|
||||
|
||||
if show_range_slider:
|
||||
self.range_limit = RangeSlider()
|
||||
@@ -154,6 +156,8 @@ class InnerBigText(QWidget):
|
||||
_range_start = 0
|
||||
_range_end = -1
|
||||
|
||||
_follow = False
|
||||
|
||||
def __init__(self, parent: BigText, model: LogFileModel, v_scaled_scrollbar: ScaledScrollBar):
|
||||
super(InnerBigText, self).__init__()
|
||||
self.char_height = None
|
||||
@@ -262,6 +266,12 @@ class InnerBigText(QWidget):
|
||||
manage_highlighting.setShortcut("CTRL+H")
|
||||
menu.addAction(manage_highlighting)
|
||||
|
||||
if self.parent.show_follow_action:
|
||||
follow = QAction(_("&Follow"), self, triggered=self._toggle_follow)
|
||||
follow.setCheckable(True)
|
||||
follow.setChecked(self._follow)
|
||||
menu.addAction(follow)
|
||||
|
||||
if self.parent.show_range_slider:
|
||||
menu.addSeparator()
|
||||
|
||||
@@ -309,8 +319,12 @@ class InnerBigText(QWidget):
|
||||
self.parent.range_limit.set_range_start(0)
|
||||
self.parent.range_limit.set_range_end(self.model.byte_count())
|
||||
|
||||
def user_scroll_interaction(self):
|
||||
self._follow = False
|
||||
|
||||
def scroll_by_lines(self, scroll_lines: int):
|
||||
self.scroll_lines = scroll_lines
|
||||
self._follow = False
|
||||
self.update()
|
||||
self.parent.v_scroll_bar.set_value(self._byte_offset)
|
||||
|
||||
@@ -565,6 +579,11 @@ class InnerBigText(QWidget):
|
||||
self._update_highlight_selected_text()
|
||||
self.update()
|
||||
|
||||
def _toggle_follow(self):
|
||||
self._follow = not self._follow
|
||||
print(f"follow={self._follow}")
|
||||
self.update()
|
||||
|
||||
def _update_highlight_selected_text(self):
|
||||
start_byte = self.selection_highlight.min_byte()
|
||||
end_byte = self.selection_highlight.max_byte()
|
||||
@@ -601,7 +620,7 @@ class InnerBigText(QWidget):
|
||||
# "Noto Sans Mono"
|
||||
# "Noto Color Emoji"
|
||||
# "Andale Mono"
|
||||
qfont = QFont("Noto Sans Mono", self.model.settings.getint_session('general', "font_size"))
|
||||
qfont = QFont("Monospace", self.model.settings.getint_session('general', "font_size"))
|
||||
qfont.setStyleHint(QFont.StyleHint.Monospace)
|
||||
painter.setFont(qfont)
|
||||
self.font_metric = painter.fontMetrics()
|
||||
@@ -613,6 +632,11 @@ class InnerBigText(QWidget):
|
||||
lines_to_show = math.ceil(self.lines_shown())
|
||||
# print("%s / %s = %s" %(self.height(), float(self.char_height), lines_to_show))
|
||||
|
||||
if self._range_end >= 0 and self._follow:
|
||||
self.scroll_lines = 0
|
||||
self._byte_offset = self.model.byte_count() - 1
|
||||
self.parent.v_scroll_bar.set_value(self._byte_offset)
|
||||
|
||||
self.lines = self.model.data(self._byte_offset, self.scroll_lines, lines_to_show, self._range_start,
|
||||
self._range_end)
|
||||
# print("lines_to_show: %d returned: %d" % (lines_to_show, len(self.lines)))
|
||||
|
||||
Reference in New Issue
Block a user