@@ -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