1
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2026-03-07 17:32:48 +01:00

refactor(guided-tour): add support for QTableWidgetItem

This commit is contained in:
2026-01-22 16:21:57 +01:00
committed by wyzula-jan
parent 7bcdc31f11
commit 83489b7519

View File

@@ -12,9 +12,11 @@ from bec_lib.logger import bec_logger
from bec_qthemes import material_icon
from louie import saferef
from qtpy.QtCore import QEvent, QObject, QRect, Qt, Signal
from qtpy.QtGui import QAction, QColor, QPainter, QPen
from qtpy.QtGui import QAction, QColor, QKeySequence, QPainter, QPen, QShortcut
from qtpy.QtWidgets import (
QAbstractItemView,
QApplication,
QDialogButtonBox,
QFrame,
QHBoxLayout,
QLabel,
@@ -22,6 +24,7 @@ from qtpy.QtWidgets import (
QMenu,
QMenuBar,
QPushButton,
QSizePolicy,
QTableWidgetItem,
QToolBar,
QVBoxLayout,
@@ -117,6 +120,10 @@ class TutorialOverlay(QWidget):
layout.addLayout(top_layout)
layout.addWidget(self.label)
layout.addLayout(btn_layout)
# Escape closes the tour
QShortcut(QKeySequence(Qt.Key.Key_Escape), self, activated=self.close_btn.click)
return box
def paintEvent(self, event): # pylint: disable=unused-argument
@@ -225,6 +232,9 @@ class TutorialOverlay(QWidget):
self.message_box.show()
self.update()
# Update the focus policy of the buttons
self.back_btn.setEnabled(current_step > 1)
def eventFilter(self, obj, event):
if event.type() == QEvent.Type.Resize:
self.setGeometry(obj.rect())
@@ -480,7 +490,9 @@ class GuidedTour(QObject):
self.stop_tour()
return
highlight_rect = self._get_highlight_rect(main_window, target, step_title)
highlight_rect = self._get_highlight_rect(
main_window, target, step_title, direction=direction
)
if highlight_rect is None:
return
@@ -490,9 +502,6 @@ class GuidedTour(QObject):
self.overlay.show_step(highlight_rect, step_title, step_text, current_step, total_steps)
# Update button states
self.overlay.back_btn.setEnabled(self._current_index > 0)
# Update next button text and state
is_last_step = self._current_index >= len(self._tour_steps) - 1
if is_last_step:
@@ -539,7 +548,11 @@ class GuidedTour(QObject):
return target, step_text
def _get_highlight_rect(
self, main_window: QWidget, target: QWidget | QAction, step_title: str
self,
main_window: QWidget,
target: QWidget | QAction,
step_title: str,
direction: Literal["next"] | Literal["prev"] = "next",
) -> QRect | None:
"""
Get the QRect in main_window coordinates to highlight for the given target.
@@ -558,6 +571,7 @@ class GuidedTour(QObject):
self._advance_past_invalid_step(
step_title,
reason=f"Could not find visible widget or menu for QAction {target.text()!r}.",
direction=direction,
)
return None
return rect
@@ -566,13 +580,28 @@ class GuidedTour(QObject):
if self._visible_check:
if not target.isVisible():
self._advance_past_invalid_step(
step_title, reason=f"Widget {target!r} is not visible."
step_title, reason=f"Widget {target!r} is not visible.", direction=direction
)
return None
rect = target.rect()
top_left = target.mapTo(main_window, rect.topLeft())
return QRect(top_left, rect.size())
if isinstance(target, QTableWidgetItem):
table = target.tableWidget()
if self._visible_check:
if not table.isVisible():
self._advance_past_invalid_step(
step_title,
reason=f"Table widget {table!r} is not visible.",
direction=direction,
)
return None
table.scrollToItem(target, QAbstractItemView.ScrollHint.PositionAtCenter)
rect = table.visualItemRect(target)
top_left = table.viewport().mapTo(main_window, rect.topLeft())
return QRect(top_left, rect.size())
self._advance_past_invalid_step(
step_title, reason=f"Unsupported step target type: {type(target)}"
)