|
2 | 2 |
|
3 | 3 | from PySide6 import QtCore, QtGui |
4 | 4 | from PySide6.QtWidgets import (QWidget, QPushButton, QHBoxLayout, QVBoxLayout, |
5 | | - QFormLayout, QComboBox, QSpinBox, |
| 5 | + QFormLayout, QComboBox, QSpinBox, QLabel, |
6 | 6 | QDoubleSpinBox, QSizePolicy, QMessageBox, |
7 | 7 | QCheckBox, QRubberBand, QMenu, QDialog, |
8 | 8 | QTabWidget, QTableView, QHeaderView) |
|
21 | 21 | from .custom_widgets import HorizontalLine |
22 | 22 |
|
23 | 23 |
|
| 24 | +class PlotUpdateOverlay(QWidget): |
| 25 | + |
| 26 | + def __init__(self, parent=None): |
| 27 | + super().__init__(parent) |
| 28 | + self.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents, True) |
| 29 | + self.setAttribute(QtCore.Qt.WA_StyledBackground, True) |
| 30 | + self.setFocusPolicy(QtCore.Qt.NoFocus) |
| 31 | + self.setStyleSheet("background-color: rgba(20, 20, 20, 140);") |
| 32 | + |
| 33 | + layout = QVBoxLayout(self) |
| 34 | + layout.setContentsMargins(0, 0, 0, 0) |
| 35 | + layout.setAlignment(QtCore.Qt.AlignCenter) |
| 36 | + |
| 37 | + self.label = QLabel("Generating Plot...", self) |
| 38 | + self.label.setAlignment(QtCore.Qt.AlignCenter) |
| 39 | + font = self.label.font() |
| 40 | + font.setPointSize(max(12, font.pointSize() + 6)) |
| 41 | + font.setWeight(QtGui.QFont.DemiBold) |
| 42 | + self.label.setFont(font) |
| 43 | + self.label.setStyleSheet("color: white;") |
| 44 | + layout.addWidget(self.label) |
| 45 | + |
| 46 | + self.hide() |
| 47 | + |
| 48 | + def set_message(self, message: str): |
| 49 | + self.label.setText(message) |
| 50 | + |
| 51 | + |
24 | 52 |
|
25 | 53 | class PlotImage(FigureCanvas): |
26 | 54 |
|
@@ -59,6 +87,7 @@ def __init__(self, model: PlotModel, parent, main_window): |
59 | 87 | self._last_data_indicator_value = None |
60 | 88 |
|
61 | 89 | self.menu = QMenu(self) |
| 90 | + self.update_overlay = PlotUpdateOverlay(self) |
62 | 91 |
|
63 | 92 | def enterEvent(self, event): |
64 | 93 | self.setCursor(QtCore.Qt.CrossCursor) |
@@ -122,6 +151,24 @@ def _resize(self): |
122 | 151 | self.resize(self.parent.width() * z, |
123 | 152 | self.parent.height() * z) |
124 | 153 |
|
| 154 | + def resizeEvent(self, event): |
| 155 | + super().resizeEvent(event) |
| 156 | + if self.update_overlay is not None: |
| 157 | + self.update_overlay.setGeometry(self.rect()) |
| 158 | + |
| 159 | + def showUpdatingOverlay(self, message: str = "Generating Plot..."): |
| 160 | + if self.update_overlay is None: |
| 161 | + return |
| 162 | + self.update_overlay.set_message(message) |
| 163 | + self.update_overlay.setGeometry(self.rect()) |
| 164 | + self.update_overlay.raise_() |
| 165 | + self.update_overlay.show() |
| 166 | + |
| 167 | + def hideUpdatingOverlay(self): |
| 168 | + if self.update_overlay is None: |
| 169 | + return |
| 170 | + self.update_overlay.hide() |
| 171 | + |
125 | 172 | def saveImage(self, filename): |
126 | 173 | """Save an image of the current view |
127 | 174 |
|
|
0 commit comments