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