Beispiel #1
0
class ColorPicker(QtWidgets.QPushButton):
    """Custom color pick button to store and retrieve color values"""

    valueChanged = QtCore.Signal()

    def __init__(self):
        QtWidgets.QPushButton.__init__(self)

        self.clicked.connect(self.show_color_dialog)
        self._color = None

        self.color = [1, 1, 1]

    # region properties
    @property
    def color(self):
        return self._color

    @color.setter
    def color(self, values):
        """Set the color value and update the stylesheet

        Arguments:
            values (list): the color values; red, green, blue

        Returns:
            None

        """
        self._color = values
        self.valueChanged.emit()

        values = [int(x * 255) for x in values]
        self.setStyleSheet("background: rgb({},{},{})".format(*values))

    # endregion properties

    def show_color_dialog(self):
        """Display a color picker to change color.

        When a color has been chosen this updates the color of the button
        and its current value

        :return: the red, green and blue values
        :rtype: list
        """
        current = QtGui.QColor()
        current.setRgbF(*self._color)
        colors = QtWidgets.QColorDialog.getColor(current)
        if not colors:
            return
        self.color = [colors.redF(), colors.greenF(), colors.blueF()]
Beispiel #2
0
    def __init__(self, parent, filepath):
        super(IoAction, self).__init__(parent)

        action_label = os.path.basename(filepath)

        self.setText(action_label)
        self.setData(filepath)

        # check if file exists and disable when false
        self.setEnabled(os.path.isfile(filepath))

        # get icon from file
        info = QtCore.QFileInfo(filepath)
        icon_provider = QtWidgets.QFileIconProvider()
        self.setIcon(icon_provider.icon(info))

        self.triggered.connect(self.open_object_data)
Beispiel #3
0
 def show_token_menu(self, pos):
     """Show custom manu on position of widget"""
     menu = self.token_menu()
     globalpos = QtCore.QPoint(self.file_path.mapToGlobal(pos))
     menu.exec_(globalpos)
Beispiel #4
0
class ResolutionPlugin(capture_gui.plugin.Plugin):
    """Resolution widget.

    Allows to set scale based on set of options.

    """
    id = "Resolution"
    section = "app"
    order = 20

    resolution_changed = QtCore.Signal()

    ScaleWindow = "From Window"
    ScaleRenderSettings = "From Render Settings"
    ScaleCustom = "Custom"

    def __init__(self, parent=None):
        super(ResolutionPlugin, self).__init__(parent=parent)

        self._layout = QtWidgets.QVBoxLayout()
        self._layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(self._layout)

        # Scale
        self.mode = QtWidgets.QComboBox()
        self.mode.addItems(
            [self.ScaleWindow, self.ScaleRenderSettings, self.ScaleCustom])
        self.mode.setCurrentIndex(1)  # Default: From render settings

        # Custom width/height
        self.resolution = QtWidgets.QWidget()
        self.resolution.setContentsMargins(0, 0, 0, 0)
        resolution_layout = QtWidgets.QHBoxLayout()
        resolution_layout.setContentsMargins(0, 0, 0, 0)
        resolution_layout.setSpacing(6)

        self.resolution.setLayout(resolution_layout)
        width_label = QtWidgets.QLabel("Width")
        width_label.setFixedWidth(40)
        self.width = QtWidgets.QSpinBox()
        self.width.setMinimum(0)
        self.width.setMaximum(99999)
        self.width.setValue(1920)
        heigth_label = QtWidgets.QLabel("Height")
        heigth_label.setFixedWidth(40)
        self.height = QtWidgets.QSpinBox()
        self.height.setMinimum(0)
        self.height.setMaximum(99999)
        self.height.setValue(1080)

        resolution_layout.addWidget(width_label)
        resolution_layout.addWidget(self.width)
        resolution_layout.addWidget(heigth_label)
        resolution_layout.addWidget(self.height)

        self.scale_result = QtWidgets.QLineEdit()
        self.scale_result.setReadOnly(True)

        # Percentage
        self.percent_label = QtWidgets.QLabel("Scale")
        self.percent = QtWidgets.QDoubleSpinBox()
        self.percent.setMinimum(0.01)
        self.percent.setValue(1.0)  # default value
        self.percent.setSingleStep(0.05)

        self.percent_presets = QtWidgets.QHBoxLayout()
        self.percent_presets.setSpacing(4)
        for value in [0.25, 0.5, 0.75, 1.0, 2.0]:
            btn = QtWidgets.QPushButton(str(value))
            self.percent_presets.addWidget(btn)
            btn.setFixedWidth(35)
            btn.clicked.connect(partial(self.percent.setValue, value))

        self.percent_layout = QtWidgets.QHBoxLayout()
        self.percent_layout.addWidget(self.percent_label)
        self.percent_layout.addWidget(self.percent)
        self.percent_layout.addLayout(self.percent_presets)

        # Resulting scale display
        self._layout.addWidget(self.mode)
        self._layout.addWidget(self.resolution)
        self._layout.addLayout(self.percent_layout)
        self._layout.addWidget(self.scale_result)

        # refresh states
        self.on_mode_changed()
        self.on_resolution_changed()

        # connect signals
        self.mode.currentIndexChanged.connect(self.on_mode_changed)
        self.mode.currentIndexChanged.connect(self.on_resolution_changed)
        self.percent.valueChanged.connect(self.on_resolution_changed)
        self.width.valueChanged.connect(self.on_resolution_changed)
        self.height.valueChanged.connect(self.on_resolution_changed)

        # Connect options changed
        self.mode.currentIndexChanged.connect(self.options_changed)
        self.percent.valueChanged.connect(self.options_changed)
        self.width.valueChanged.connect(self.options_changed)
        self.height.valueChanged.connect(self.options_changed)

    def on_mode_changed(self):
        """Update the width/height enabled state when mode changes"""

        if self.mode.currentText() != self.ScaleCustom:
            self.width.setEnabled(False)
            self.height.setEnabled(False)
            self.resolution.hide()
        else:
            self.width.setEnabled(True)
            self.height.setEnabled(True)
            self.resolution.show()

    def _get_output_resolution(self):

        options = self.get_outputs()
        return int(options["width"]), int(options["height"])

    def on_resolution_changed(self):
        """Update the resulting resolution label"""

        width, height = self._get_output_resolution()
        label = "Result: {0}x{1}".format(width, height)

        self.scale_result.setText(label)

        # Update label
        self.label = "Resolution ({0}x{1})".format(width, height)
        self.label_changed.emit(self.label)

    def get_outputs(self):
        """Return width x height defined by the combination of settings

        Returns:
            dict: width and height key values

        """
        mode = self.mode.currentText()
        panel = lib.get_active_editor()

        if mode == self.ScaleCustom:
            width = self.width.value()
            height = self.height.value()

        elif mode == self.ScaleRenderSettings:
            # width height from render resolution
            width = cmds.getAttr("defaultResolution.width")
            height = cmds.getAttr("defaultResolution.height")

        elif mode == self.ScaleWindow:
            # width height from active view panel size
            if not panel:
                # No panel would be passed when updating in the UI as such
                # the resulting resolution can't be previewed. But this should
                # never happen when starting the capture.
                width = 0
                height = 0
            else:
                width = cmds.control(panel, query=True, width=True)
                height = cmds.control(panel, query=True, height=True)
        else:
            raise NotImplementedError("Unsupported scale mode: "
                                      "{0}".format(mode))

        scale = [width, height]
        percentage = self.percent.value()
        scale = [math.floor(x * percentage) for x in scale]

        return {"width": scale[0], "height": scale[1]}

    def get_inputs(self, as_preset):
        return {
            "mode": self.mode.currentText(),
            "width": self.width.value(),
            "height": self.height.value(),
            "percent": self.percent.value()
        }

    def apply_inputs(self, settings):
        # get value else fall back to default values
        mode = settings.get("mode", self.ScaleRenderSettings)
        width = int(settings.get("width", 1920))
        height = int(settings.get("height", 1080))
        percent = float(settings.get("percent", 1.0))

        # set values
        self.mode.setCurrentIndex(self.mode.findText(mode))
        self.width.setValue(width)
        self.height.setValue(height)
        self.percent.setValue(percent)