# coding: utf-8 from PySide6.QtWidgets import QWidget from PySide6.QtDesigner import (QDesignerCustomWidgetInterface, QDesignerFormWindowInterface, QExtensionFactory, QPyDesignerContainerExtension) from qfluentwidgets import (ScrollArea, SmoothScrollArea, SingleDirectionScrollArea, OpacityAniStackedWidget, PopUpAniStackedWidget) from qframelesswindow import FramelessMainWindow, FramelessWindow from plugin_base import PluginBase class ContainerPlugin(PluginBase): def group(self): return super().group() + ' (Container)' def isContainer(self): return True class FramelessMainWindowPlugin(ContainerPlugin, QDesignerCustomWidgetInterface): """ Frameless main window plugin """ def createWidget(self, parent): return FramelessMainWindow(parent) def icon(self): return super().icon("TitleBar") def name(self): return "FramelessMainWindow" class FramelessWindowPlugin(ContainerPlugin, QDesignerCustomWidgetInterface): """ Frameless window plugin """ def createWidget(self, parent): return FramelessWindow(parent) def icon(self): return super().icon("TitleBar") def name(self): return "FramelessWindow" class ScrollAreaPluginBase(ContainerPlugin): """ Scroll area plugin base """ def domXml(self): return f""" true """ class ScrollAreaPlugin(ScrollAreaPluginBase, QDesignerCustomWidgetInterface): """ Scroll area plugin """ def createWidget(self, parent): return ScrollArea(parent) def icon(self): return super().icon("ScrollViewer") def name(self): return "ScrollArea" def toolTip(self): return "Smooth scroll area" class SmoothScrollAreaPlugin(ScrollAreaPluginBase, QDesignerCustomWidgetInterface): """ Smooth scroll area plugin """ def createWidget(self, parent): return SmoothScrollArea(parent) def icon(self): return super().icon("ScrollViewer") def name(self): return "SmoothScrollArea" class SingleDirectionScrollAreaPlugin(ScrollAreaPluginBase, QDesignerCustomWidgetInterface): """ Single direction scroll area plugin """ def createWidget(self, parent): return SingleDirectionScrollArea(parent) def icon(self): return super().icon("ScrollViewer") def name(self): return "SingleDirectionScrollArea" class StackedWidgetPlugin(ContainerPlugin): def domXml(self): return f""" ' ' """ def onCurrentIndexChanged(self, index): widget = self.sender() form = QDesignerFormWindowInterface.findFormWindow(widget) if form: form.emitSelectionChanged() class StackedWidgetExtension(QPyDesignerContainerExtension): """ Stacked widget extension """ def __init__(self, stacked, parent=None) -> None: super().__init__(parent) self.stacked = stacked def addWidget(self, widget) -> None: self.stacked.addWidget(widget) def count(self): return self.stacked.count() def currentIndex(self): return self.stacked.currentIndex() def insertWidget(self, index, widget): self.stacked.insertWidget(index, widget) def remove(self, index): self.stacked.removeWidget(self.stacked.widget(index)) def setCurrentIndex(self, index): self.stacked.setCurrentIndex(index) def widget(self, index): return self.stacked.widget(index) class StackedWidgetExtensionFactory(QExtensionFactory): """ Stacked widget extension factory """ widgets = [] IID = "org.qt-project.Qt.Designer.Container" def createExtension(self, object, iid, parent): if iid != StackedWidgetExtensionFactory.IID: return None if object.__class__.__name__ not in self.widgets: return None return StackedWidgetExtension(object, parent) @classmethod def register(cls, Plugin): if Plugin.__name__ not in cls.widgets: cls.widgets.append(Plugin().name()) Plugin.Factory = cls return Plugin @StackedWidgetExtensionFactory.register class OpacityAniStackedWidgetPlugin(StackedWidgetPlugin, QDesignerCustomWidgetInterface): """ opacity ani stacked widget plugin """ def createWidget(self, parent): w = OpacityAniStackedWidget(parent) w.currentChanged.connect(self.onCurrentIndexChanged) return w def icon(self): return super().icon("StackPanel") def name(self): return "OpacityAniStackedWidget" @StackedWidgetExtensionFactory.register class PopUpAniStackedWidgetPlugin(StackedWidgetPlugin, QDesignerCustomWidgetInterface): """ pop up ani stacked widget plugin """ def createWidget(self, parent): w = PopUpAniStackedWidget(parent) w.currentChanged.connect(self.onCurrentIndexChanged) return w def icon(self): return super().icon("StackPanel") def name(self): return "PopUpAniStackedWidget"