You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

204 lines
5.4 KiB

# 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"""
<widget class="{self.name()}" name="{self.name()}">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents" />
</widget>
"""
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"""
<widget class="{self.name()}" name="{self.name()}">'
<widget class="QWidget" name="page" />'
</widget>
"""
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"