plotpy.widgets.selectdialog — PlotPy 2.7 Manual (original) (raw)
-*- coding: utf-8
""" Select dialog
The selectdialog
module provides a dialog box to select an area of the plot
using a tool:
* :py:class:`.widgets.selectdialog.SelectDialog`: dialog box
* :py:func:`.widgets.selectdialog.select_with_shape_tool`: function to
select an area with a shape tool and return the rectangle
* :py:func:`.widgets.selectdialog.set_items_unselectable`: function to set
items unselectable except for the given item
Example: get segment
.. literalinclude:: ../../plotpy/tests/tools/test_get_segment.py
Example: get rectangle
.. literalinclude:: ../../plotpy/tests/tools/test_get_rectangle.py
Example: get rectangle with SVG
.. literalinclude:: ../../plotpy/tests/tools/test_get_rectangle_with_svg.py
Reference
.. autoclass:: SelectDialog :members: .. autofunction:: select_with_shape_tool .. autofunction:: set_items_unselectable """
from future import annotations
from typing import TYPE_CHECKING, Any
from guidata.configtools import get_icon from guidata.qthelpers import exec_dialog from qtpy import QtWidgets as QW from qtpy.QtWidgets import QWidget # only to help intersphinx find QWidget from qwt.plot import QwtPlotItem
from plotpy.items import AbstractShape, ImageItem from plotpy.panels.base import PanelWidget from plotpy.plot import BasePlot, PlotDialog, PlotOptions from plotpy.tools import RectangularShapeTool, SelectTool
if TYPE_CHECKING: from plotpy.panels.base import PanelWidget
[docs] class SelectDialog(PlotDialog): """Plot dialog box to select an area of the plot using a tool
Args:
parent: parent widget
toolbar: show/hide toolbar
options: plot options
panels: additionnal panels
auto_tools: If True, the plot tools are automatically registered.
If False, the user must register the tools manually.
title: The window title
icon: The window icon
edit: If True, the plot is editable
"""
def __init__(
self,
parent: QWidget | None = None,
toolbar: bool = False,
options: PlotOptions | dict[str, Any] | None = None,
panels: list[PanelWidget] | None = None,
auto_tools: bool = True,
title: str = "PlotPy",
icon: str = "plotpy.svg",
edit: bool = False,
) -> None:
super().__init__(
parent, toolbar, options, panels, auto_tools, title, icon, edit
)
self.sel_tool: RectangularShapeTool | None = None
[docs] def set_image_and_tool( self, item: ImageItem, toolclass: RectangularShapeTool, **kwargs ) -> None: """Set the image item to be displayed and the tool to be used
Args:
item: Image item
toolclass: Tool class
kwargs: Keyword arguments for the tool class
"""
default = self.manager.add_tool(SelectTool)
self.manager.set_default_tool(default)
self.sel_tool: RectangularShapeTool = self.manager.add_tool(
toolclass,
switch_to_default_tool=True,
**kwargs,
) # pylint: disable=attribute-defined-outside-init
self.sel_tool.activate()
set_ok_btn_enabled = self.button_box.button(QW.QDialogButtonBox.Ok).setEnabled
set_ok_btn_enabled(False)
self.sel_tool.SIG_TOOL_JOB_FINISHED.connect(lambda: set_ok_btn_enabled(True))
plot = self.get_plot()
plot.add_item(item)
plot.set_active_item(item)
item.set_selectable(False)
item.set_readonly(True)
plot.unselect_item(item)
[docs] def get_new_shape(self) -> AbstractShape: """Get newly created shape
Returns:
Newly created shape
"""
return self.sel_tool.get_last_final_shape()
[docs] def set_items_unselectable(plot: BasePlot, except_item: QwtPlotItem = None) -> None: """Set items unselectable except for the given item""" for item_i in plot.get_items(): if except_item is None: item_i.set_selectable(False) else: item_i.set_selectable(item_i is except_item)
[docs] def select_with_shape_tool( parent: QW.QWidget, toolclass: RectangularShapeTool, item: ImageItem, title: str = None, size: tuple[int, int] = None, other_items: list[QwtPlotItem] = [], tooldialogclass: SelectDialog = SelectDialog, toolbar: bool = False, options: PlotOptions | dict[str, Any] | None = None, icon=None, **kwargs, ) -> AbstractShape: """Select an area with a shape tool and return the rectangle
Args:
parent: Parent widget
toolclass: Tool class
item: Image item
title: Dialog title
size: Dialog size
other_items: Other items to be displayed
tooldialogclass: Tool dialog class
toolbar: show/hide toolbar
options: plot options
icon: Icon
kwargs: Keyword arguments for the tool class
Returns:
Selected shape
"""
if title is None:
title = "Select an area then press OK to accept"
if icon is not None:
icon = get_icon(icon) if isinstance(icon, str) else icon
win: SelectDialog = tooldialogclass(
parent, title=title, edit=True, toolbar=toolbar, options=options, icon=icon
)
win.set_image_and_tool(item, toolclass, **kwargs)
plot = win.get_plot()
for other_item in other_items:
plot.add_item(other_item)
set_items_unselectable(plot)
if size is not None:
win.resize(*size)
win.show()
if exec_dialog(win):
return win.get_new_shape()
return None