Exemplo n.º 1
0
def get_widget_image(w: QWidget, scale: float) -> QPixmap:
    """
    Get an image (QPixmap) of the given widget. Does not save the image to
    disk; the caller is responsible for saving the image.

    :param scale: the DPI-scaling factor to render the image at
    """

    r = w.rect()

    # Create a QPixmap and render the view widget to it
    img = QPixmap(_scaled_size(r, scale))
    img.setDevicePixelRatio(scale)
    w.render(img, QPoint(), QRegion(r))

    return img
Exemplo n.º 2
0
class ChipEditor(QWidget):
    def __init__(self):
        super().__init__()
        self.viewer = ChipSceneViewer()

        actionsLayout = QHBoxLayout()
        self._actionsWidget = QWidget(self.viewer)
        self._actionsWidget.setLayout(actionsLayout)

        self._lockButton = QToolButton()
        self._lockButton.setText("Done")
        self._lockButton.clicked.connect(lambda: self.SetEditing(False))
        self._editButton = QToolButton()
        self._editButton.setText("Edit")
        self._editButton.clicked.connect(lambda: self.SetEditing(True))

        self._plusButton = QToolButton()
        self._plusButton.setText("+")
        self._plusButton.setPopupMode(QToolButton.InstantPopup)

        actionsLayout.addWidget(self._plusButton)
        actionsLayout.addWidget(self._lockButton)
        actionsLayout.addWidget(self._editButton)

        menu = QMenu(self._plusButton)
        menu.addAction("Valve").triggered.connect(self.AddValve)
        menu.addAction("Program Preset...").triggered.connect(
            self.SelectProgramPreset)
        menu.addAction("Image...").triggered.connect(self.BrowseForImage)

        self._plusButton.setMenu(menu)

        layout = QHBoxLayout()
        layout.addWidget(self.viewer)
        self.setLayout(layout)

        self._mode = Mode.VIEWING

        AppGlobals.Instance().onChipOpened.connect(self.LoadChip)

    def AddValve(self):
        newValve = Valve()
        newValve.solenoidNumber = AppGlobals.Chip().NextSolenoidNumber()
        AppGlobals.Chip().valves.append(newValve)
        AppGlobals.Instance().onChipModified.emit()
        self.viewer.CenterItem(self.viewer.AddItem(ValveChipItem(newValve)))

    def BrowseForImage(self):
        filename, filterType = QFileDialog.getOpenFileName(
            self,
            "Browse for Image",
            filter="Images (*.png *.bmp *.jpg *.jpeg *.tif *.tiff)")
        if filename:
            newImage = Image(Path(filename))
            AppGlobals.Chip().images.append(newImage)
            AppGlobals.Instance().onChipModified.emit()
            self.viewer.CenterItem(self.viewer.AddItem(
                ImageChipItem(newImage)))

    def SelectProgramPreset(self):
        if not AppGlobals.Chip().programs:
            return

        presetSelection, confirmed = QInputDialog.getItem(
            self, "Program Preset", "Program",
            [program.name for program in AppGlobals.Chip().programs], 0, False)
        if confirmed:
            selected = [
                program for program in AppGlobals.Chip().programs
                if program.name == presetSelection
            ][0]
            newPreset = ProgramPreset(selected)
            AppGlobals.Chip().programPresets.append(newPreset)
            AppGlobals.Instance().onChipModified.emit()
            self.viewer.CenterItem(
                self.viewer.AddItem(ProgramPresetItem(newPreset)))

    def SetEditing(self, editing):
        self.viewer.SetEditing(editing)

        self._lockButton.setVisible(editing)
        self._plusButton.setVisible(editing)
        self._editButton.setVisible(not editing)

        AppGlobals.Chip().editingMode = editing

        self.FloatWidgets()

    def resizeEvent(self, event: PySide6.QtGui.QResizeEvent) -> None:
        super().resizeEvent(event)
        self.FloatWidgets()

    def FloatWidgets(self):
        self._actionsWidget.adjustSize()
        self._actionsWidget.move(self.viewer.rect().topRight() -
                                 self._actionsWidget.rect().topRight())

    def LoadChip(self):
        self.viewer.RemoveAll()

        for valve in AppGlobals.Chip().valves:
            self.viewer.AddItem(ValveChipItem(valve))
        for image in AppGlobals.Chip().images:
            self.viewer.AddItem(ImageChipItem(image))
        for preset in AppGlobals.Chip().programPresets:
            self.viewer.AddItem(ProgramPresetItem(preset))

        self.viewer.Recenter()

        self.SetEditing(AppGlobals.Chip().editingMode)