Skip to main content
`Ctrl`+`K`

# Source code for silx.gui.plot3d.tools.GroupPropertiesWidget

    # /*##########################################################################
    #
    # Copyright (c) 2018-2021 European Synchrotron Radiation Facility
    #
    # Permission is hereby granted, free of charge, to any person obtaining a copy
    # of this software and associated documentation files (the "Software"), to deal
    # in the Software without restriction, including without limitation the rights
    # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    # copies of the Software, and to permit persons to whom the Software is
    # furnished to do so, subject to the following conditions:
    #
    # The above copyright notice and this permission notice shall be included in
    # all copies or substantial portions of the Software.
    #
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    # THE SOFTWARE.
    #
    # ###########################################################################*/
    """:class:`GroupPropertiesWidget` allows to reset properties in a GroupItem."""

    __authors__ = ["T. Vincent"]
    __license__ = "MIT"
    __date__ = "24/04/2018"

    from ....gui import qt
    from ....gui.colors import Colormap
    from ....gui.dialog.ColormapDialog import ColormapDialog

    from ..items import SymbolMixIn, ColormapMixIn

    class GroupPropertiesWidget(qt.QWidget):
        """Set properties of all items in a :class:`GroupItem`

        :param QWidget parent:
        """

        MAX_MARKER_SIZE = 20
        """Maximum value for marker size"""

        MAX_LINE_WIDTH = 10
        """Maximum value for line width"""

        def __init__(self, parent=None):
            super(GroupPropertiesWidget, self).__init__(parent)
            self._group = None
            self.setEnabled(False)

            # Set widgets
            layout = qt.QFormLayout(self)
            self.setLayout(layout)

            # Colormap
            colormapButton = qt.QPushButton("Set...")
            colormapButton.setToolTip("Set colormap for all items")
            colormapButton.clicked.connect(self._colormapButtonClicked)
            layout.addRow("Colormap", colormapButton)

            self._markerComboBox = qt.QComboBox(self)
            self._markerComboBox.addItems(SymbolMixIn.getSupportedSymbolNames())

            # Marker
            markerButton = qt.QPushButton("Set")
            markerButton.setToolTip("Set marker for all items")
            markerButton.clicked.connect(self._markerButtonClicked)

            markerLayout = qt.QHBoxLayout()
            markerLayout.setContentsMargins(0, 0, 0, 0)
            markerLayout.addWidget(self._markerComboBox, 1)
            markerLayout.addWidget(markerButton, 0)

            layout.addRow("Marker", markerLayout)

            # Marker size
            self._markerSizeSlider = qt.QSlider()
            self._markerSizeSlider.setOrientation(qt.Qt.Horizontal)
            self._markerSizeSlider.setSingleStep(1)
            self._markerSizeSlider.setRange(1, self.MAX_MARKER_SIZE)
            self._markerSizeSlider.setValue(1)

            markerSizeButton = qt.QPushButton("Set")
            markerSizeButton.setToolTip("Set marker size for all items")
            markerSizeButton.clicked.connect(self._markerSizeButtonClicked)

            markerSizeLayout = qt.QHBoxLayout()
            markerSizeLayout.setContentsMargins(0, 0, 0, 0)
            markerSizeLayout.addWidget(qt.QLabel("1"))
            markerSizeLayout.addWidget(self._markerSizeSlider, 1)
            markerSizeLayout.addWidget(qt.QLabel(str(self.MAX_MARKER_SIZE)))
            markerSizeLayout.addWidget(markerSizeButton, 0)

            layout.addRow("Marker Size", markerSizeLayout)

            # Line width
            self._lineWidthSlider = qt.QSlider()
            self._lineWidthSlider.setOrientation(qt.Qt.Horizontal)
            self._lineWidthSlider.setSingleStep(1)
            self._lineWidthSlider.setRange(1, self.MAX_LINE_WIDTH)
            self._lineWidthSlider.setValue(1)

            lineWidthButton = qt.QPushButton("Set")
            lineWidthButton.setToolTip("Set line width for all items")
            lineWidthButton.clicked.connect(self._lineWidthButtonClicked)

            lineWidthLayout = qt.QHBoxLayout()
            lineWidthLayout.setContentsMargins(0, 0, 0, 0)
            lineWidthLayout.addWidget(qt.QLabel("1"))
            lineWidthLayout.addWidget(self._lineWidthSlider, 1)
            lineWidthLayout.addWidget(qt.QLabel(str(self.MAX_LINE_WIDTH)))
            lineWidthLayout.addWidget(lineWidthButton, 0)

            layout.addRow("Line Width", lineWidthLayout)

            self._colormapDialog = None  # To store dialog
            self._colormap = Colormap()

        def getGroup(self):
            """Returns the :class:`GroupItem` this widget is attached to.

            :rtype: Union[GroupItem, None]
            """
            return self._group

        def setGroup(self, group):
            """Set the :class:`GroupItem` this widget is attached to.

            :param GroupItem group: GroupItem to control (or None)
            """
            self._group = group
            if group is not None:
                self.setEnabled(True)

        def _colormapButtonClicked(self, checked=False):
            """Handle colormap button clicked"""
            group = self.getGroup()
            if group is None:
                return

            if self._colormapDialog is None:
                self._colormapDialog = ColormapDialog(self)
                self._colormapDialog.setColormap(self._colormap)

            previousColormap = self._colormapDialog.getColormap()
            if self._colormapDialog.exec():
                colormap = self._colormapDialog.getColormap()

                for item in group.visit():
                    if isinstance(item, ColormapMixIn):
                        itemCmap = item.getColormap()
                        cmapName = colormap.getName()
                        if cmapName is not None:
                            itemCmap.setName(colormap.getName())
                        else:
                            itemCmap.setColormapLUT(colormap.getColormapLUT())
                        itemCmap.setNormalization(colormap.getNormalization())
                        itemCmap.setGammaNormalizationParameter(
                            colormap.getGammaNormalizationParameter()
                        )
                        itemCmap.setVRange(colormap.getVMin(), colormap.getVMax())
            else:
                # Reset colormap
                self._colormapDialog.setColormap(previousColormap)

        def _markerButtonClicked(self, checked=False):
            """Handle marker set button clicked"""
            group = self.getGroup()
            if group is None:
                return

            marker = self._markerComboBox.currentText()
            for item in group.visit():
                if isinstance(item, SymbolMixIn):
                    item.setSymbol(marker)

        def _markerSizeButtonClicked(self, checked=False):
            """Handle marker size set button clicked"""
            group = self.getGroup()
            if group is None:
                return

            markerSize = self._markerSizeSlider.value()
            for item in group.visit():
                if isinstance(item, SymbolMixIn):
                    item.setSymbolSize(markerSize)

        def _lineWidthButtonClicked(self, checked=False):
            """Handle line width set button clicked"""
            group = self.getGroup()
            if group is None:
                return

            lineWidth = self._lineWidthSlider.value()
            for item in group.visit():
                if hasattr(item, "setLineWidth"):
                    item.setLineWidth(lineWidth)