Skip to content

Commit e5fbdec

Browse files
committed
Added copy coordinates and messages to pyqtgraph
1 parent a3a12b0 commit e5fbdec

1 file changed

Lines changed: 55 additions & 1 deletion

File tree

plottr/plot/pyqtgraph/autoplot.py

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,16 @@ def __init__(self, parent: Optional[PlotWidgetContainer]) -> None:
271271
layout.setContentsMargins(0, 0, 0, 0)
272272
layout.setSpacing(0)
273273

274+
self.statusLabel = QtWidgets.QLabel("Click on plot to copy coordinates")
275+
self.statusLabel.setAlignment(QtCore.Qt.AlignCenter)
276+
self.statusLabel.setStyleSheet("color: gray;")
277+
278+
self.clipboardMessageActive = False
279+
self.hintMessage = "Click on plot to copy coordinates"
280+
self.clipboardResetTimer = QtCore.QTimer(self)
281+
self.clipboardResetTimer.setSingleShot(True)
282+
self.clipboardResetTimer.timeout.connect(self.clearClipboardMessage)
283+
274284
self.setLayout(layout)
275285
self.setMinimumSize(*getcfg('main', 'pyqtgraph', 'minimum_plot_size',
276286
default=(400, 400)))
@@ -327,6 +337,11 @@ def _plotData(self, **kwargs: Any) -> None:
327337
self.figConfig.optionsChanged.connect(self._refreshPlot)
328338
self.figConfig.figCopied.connect(self.onfigCopied)
329339
self.figConfig.figSaved.connect(self.onfigSaved)
340+
self.layout().addWidget(self.statusLabel)
341+
342+
if kwargs.get('clearWidget', True):
343+
for subplot in self.fmWidget.subPlots:
344+
self._connectPlotEvents(subplot)
330345

331346
if self.data.has_meta('title'):
332347
self.fmWidget.setTitle(self.data.meta_val('title'))
@@ -356,6 +371,45 @@ def _plotData(self, **kwargs: Any) -> None:
356371
def _refreshPlot(self) -> None:
357372
self._plotData()
358373

374+
def showClipboardMessage(self, message: str) -> None:
375+
self.clipboardMessageActive = True
376+
self.statusLabel.setText(message)
377+
self.clipboardResetTimer.start(1500)
378+
379+
def clearClipboardMessage(self) -> None:
380+
self.clipboardMessageActive = False
381+
self.statusLabel.setText(self.hintMessage)
382+
383+
def setStatusMessage(self, message: str) -> None:
384+
if not self.clipboardMessageActive:
385+
self.statusLabel.setText(message if message else self.hintMessage)
386+
387+
def _connectPlotEvents(self, subplot: PlotBase) -> None:
388+
subplot.plot.scene().sigMouseMoved.connect(
389+
lambda pos, sp=subplot: self._onMouseMoved(sp, pos)
390+
)
391+
subplot.plot.scene().sigMouseClicked.connect(
392+
lambda event, sp=subplot: self._onPlotClicked(sp, event)
393+
)
394+
395+
def _onMouseMoved(self, subplot: PlotBase, pos: Any) -> None:
396+
vb = subplot.plot.getViewBox()
397+
local = vb.mapFromScene(pos)
398+
if vb.boundingRect().contains(local):
399+
pt = vb.mapSceneToView(pos)
400+
self.setStatusMessage(f'({pt.x():.8g}, {pt.y():.8g})')
401+
else:
402+
self.setStatusMessage('')
403+
404+
def _onPlotClicked(self, subplot: PlotBase, event: Any) -> None:
405+
vb = subplot.plot.getViewBox()
406+
local = vb.mapFromScene(event.scenePos())
407+
if vb.boundingRect().contains(local):
408+
pt = vb.mapSceneToView(event.scenePos())
409+
coord_str = '({:.8g}, {:.8g})'.format(pt.x(), pt.y())
410+
QtWidgets.QApplication.clipboard().setText(coord_str)
411+
self.showClipboardMessage(f"Copied {coord_str} to clipboard")
412+
359413
@Slot()
360414
def onfigCopied(self) -> None:
361415
"""
@@ -366,6 +420,7 @@ def onfigCopied(self) -> None:
366420
screenshot = self.fmWidget.grab(rectangle=QtCore.QRect(QtCore.QPoint(0, 0), QtCore.QSize(-1, -1)))
367421
clipboard = QtWidgets.QApplication.clipboard()
368422
clipboard.setImage(screenshot.toImage())
423+
self.showClipboardMessage("Figure copied to clipboard")
369424

370425
@Slot()
371426
def onfigSaved(self) -> None:
@@ -449,7 +504,6 @@ def __init__(self, options: FigureOptions,
449504
self.copyFig = self.addAction('Copy Figure', self._copyFig)
450505
self.saveFig = self.addAction('Save Figure', self._saveFig)
451506

452-
453507
def _setOption(self, option: str, value: Any) -> None:
454508
setattr(self.options, option, value)
455509
self.optionsChanged.emit()

0 commit comments

Comments
 (0)