|
13 | 13 |
|
14 | 14 | import numpy as np |
15 | 15 | from enum import Enum |
16 | | -import qtpy |
| 16 | +from qtpy.QtCore import Qt |
17 | 17 | from pyqtgraph.Qt import QtGui, QtCore, QtWidgets |
18 | 18 | import pyqtgraph as pg |
19 | 19 | from pyqtgraph.graphicsItems.LegendItem import LegendItem, ItemSample |
@@ -224,62 +224,69 @@ def create_help_pltitm(): |
224 | 224 |
|
225 | 225 | return plt |
226 | 226 |
|
227 | | -def create_infowindow(comp_colour_pairs): |
228 | | - class InfoWindow(QtWidgets.QMainWindow): |
229 | | - ''' infowindow that is designed to be static ''' |
| 227 | +def create_infowindow(comp_colour_pairs, parent=None, key_handler=None): |
| 228 | + class InfoWindow(QtWidgets.QDialog): |
| 229 | + ''' infowindow that is designed to be static, uses QDialog ''' |
230 | 230 | class Ui_InfoWindow(object): |
231 | 231 | ''' info window widgets (auto-generated code) ''' |
232 | | - def setupUi(self, MainWindow): |
233 | | - MainWindow.setObjectName("MainWindow") |
234 | | - MainWindow.resize(259, 395) |
235 | | - MainWindow.setStyleSheet("background-color: rgb(0, 0, 0);") |
236 | | - self.centralwidget = QtWidgets.QWidget(MainWindow) |
237 | | - self.centralwidget.setObjectName("centralwidget") |
238 | | - self.verticalLayoutTechnicalReason = QtWidgets.QVBoxLayout(self.centralwidget) |
| 232 | + def setupUi(self, Dialog): |
| 233 | + Dialog.setObjectName("InfoWindow") |
| 234 | + Dialog.resize(259, 395) |
| 235 | + Dialog.setWindowTitle("Component list") |
| 236 | + Dialog.setStyleSheet("background-color: rgb(0, 0, 0);") |
| 237 | + self.verticalLayoutTechnicalReason = QtWidgets.QVBoxLayout(Dialog) |
239 | 238 | self.verticalLayoutTechnicalReason.setObjectName("verticalLayoutTechnicalReason") |
240 | | - self.scrollArea = QtWidgets.QScrollArea(self.centralwidget) |
| 239 | + self.scrollArea = QtWidgets.QScrollArea(Dialog) |
241 | 240 | self.scrollArea.setWidgetResizable(True) |
242 | 241 | self.scrollArea.setObjectName("scrollArea") |
243 | 242 | self.scrollAreaWidgetContents = QtWidgets.QWidget() |
244 | 243 | self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 239, 375)) |
245 | 244 | self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") |
246 | 245 | self.vlayout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) |
247 | 246 | self.vlayout.setObjectName("vlayout") |
248 | | - MainWindow.setCentralWidget(self.centralwidget) |
249 | | - |
| 247 | + |
250 | 248 | self.scrollArea.setWidget(self.scrollAreaWidgetContents) |
251 | 249 | self.verticalLayoutTechnicalReason.addWidget(self.scrollArea) |
252 | | - |
| 250 | + |
253 | 251 | self.labels = [] |
254 | 252 | try: # Prefer Qt6 style, fallback to Qt5 |
255 | 253 | self.spacerItem = QtWidgets.QSpacerItem(20, 448, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) |
256 | 254 | except: |
257 | 255 | self.spacerItem = QtWidgets.QSpacerItem(20, 448, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) |
258 | | - |
| 256 | + |
259 | 257 | def set_components(self, str_colour_pairs): |
260 | 258 | ''' colours are tri-tupples of rgb ''' |
261 | 259 | for pair in str_colour_pairs: |
262 | 260 | s = pair[0] |
263 | 261 | c = pair[1] |
264 | | - |
| 262 | + |
265 | 263 | lbl = QtWidgets.QLabel(self.ui.scrollAreaWidgetContents) |
266 | 264 | lbl.setText(s) |
267 | 265 | lbl.setStyleSheet("color: rgb(%d, %d, %d);" % c) |
268 | 266 | self.ui.labels.append(lbl) |
269 | 267 | self.ui.vlayout.addWidget(lbl) |
270 | | - |
| 268 | + |
271 | 269 | self.ui.vlayout.addItem(self.ui.spacerItem) |
272 | | - |
273 | | - def __init__(self, parent=None): |
| 270 | + |
| 271 | + def keyPressEvent(self, event): |
| 272 | + ''' forward all keypresses to the main window handler so that |
| 273 | + q/p/s/space/h etc. work without needing to switch focus back ''' |
| 274 | + if self._key_handler is not None: |
| 275 | + self._key_handler(event) |
| 276 | + else: |
| 277 | + super(InfoWindow, self).keyPressEvent(event) |
| 278 | + |
| 279 | + def __init__(self, parent=None, key_handler=None): |
274 | 280 | super(InfoWindow, self).__init__(parent) |
275 | | - |
| 281 | + self._key_handler = key_handler |
| 282 | + |
276 | 283 | # create ui and set info |
277 | 284 | self.ui = self.Ui_InfoWindow() |
278 | 285 | self.ui.setupUi(self) |
279 | | - |
280 | | - iw = InfoWindow() |
| 286 | + |
| 287 | + iw = InfoWindow(parent=parent, key_handler=key_handler) |
281 | 288 | iw.set_components(comp_colour_pairs) |
282 | | - |
| 289 | + |
283 | 290 | return iw |
284 | 291 |
|
285 | 292 | class McDisplay2DGui(object): |
@@ -371,10 +378,15 @@ def _key_handler(self, event): |
371 | 378 | self._display_nextray() |
372 | 379 | elif event.key() in [72, 16777264]: # h, F1 |
373 | 380 | if not self.iw_visible: |
374 | | - self.iw = create_infowindow(self._get_comp_color_pairs()) |
| 381 | + self.iw = create_infowindow(self._get_comp_color_pairs(), parent=self.mw, key_handler=self._key_handler) |
| 382 | + # position to the left of the main window, vertically aligned with its top |
| 383 | + mw_geo = self.mw.frameGeometry() |
| 384 | + iw_size = self.iw.sizeHint() |
| 385 | + self.iw.move(mw_geo.left() - round(1.5*iw_size.width()), mw_geo.top()) |
375 | 386 | self.iw.show() |
| 387 | + self.iw.raise_() |
| 388 | + self.iw.activateWindow() |
376 | 389 | self.iw_visible = True |
377 | | - self.mw.activateWindow() |
378 | 390 | else: |
379 | 391 | self.iw.hide() |
380 | 392 | self.iw_visible = False |
|
0 commit comments