A fluent design widgets library based on C++ Qt/PyQt/PySide. Make Qt Great Again.
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.

164 lines
5.6 KiB

# coding:utf-8
from PyQt5.QtCore import Qt, pyqtSignal, QObject, QEvent
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import QLabel, QFrame, QVBoxLayout, QHBoxLayout, QPushButton
from qframelesswindow import FramelessDialog
from ...common.auto_wrap import TextWrap
from ...common.style_sheet import FluentStyleSheet
from ..widgets.button import PrimaryPushButton
from ..widgets.label import BodyLabel
from .mask_dialog_base import MaskDialogBase
class Ui_MessageBox:
""" Ui of message box """
yesSignal = pyqtSignal()
cancelSignal = pyqtSignal()
def _setUpUi(self, title, content, parent):
self.content = content
self.titleLabel = QLabel(title, parent)
self.contentLabel = BodyLabel(content, parent)
self.buttonGroup = QFrame(parent)
self.yesButton = PrimaryPushButton(self.tr('OK'), self.buttonGroup)
self.cancelButton = QPushButton(self.tr('Cancel'), self.buttonGroup)
self.vBoxLayout = QVBoxLayout(parent)
self.textLayout = QVBoxLayout()
self.buttonLayout = QHBoxLayout(self.buttonGroup)
self.__initWidget()
def __initWidget(self):
self.__setQss()
self.__initLayout()
# fixes https://github.com/zhiyiYo/PyQt-Fluent-Widgets/issues/19
self.yesButton.setAttribute(Qt.WA_LayoutUsesWidgetRect)
self.cancelButton.setAttribute(Qt.WA_LayoutUsesWidgetRect)
self.yesButton.setFocus()
self.buttonGroup.setFixedHeight(81)
self.contentLabel.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
self._adjustText()
self.yesButton.clicked.connect(self.__onYesButtonClicked)
self.cancelButton.clicked.connect(self.__onCancelButtonClicked)
def _adjustText(self):
if self.isWindow():
if self.parent():
w = max(self.titleLabel.width(), self.parent().width())
chars = max(min(w / 9, 140), 30)
else:
chars = 100
else:
w = max(self.titleLabel.width(), self.window().width())
chars = max(min(w / 9, 100), 30)
self.contentLabel.setText(TextWrap.wrap(self.content, chars, False)[0])
def __initLayout(self):
self.vBoxLayout.setSpacing(0)
self.vBoxLayout.setContentsMargins(0, 0, 0, 0)
self.vBoxLayout.addLayout(self.textLayout, 1)
self.vBoxLayout.addWidget(self.buttonGroup, 0, Qt.AlignBottom)
self.vBoxLayout.setSizeConstraint(QVBoxLayout.SetMinimumSize)
self.textLayout.setSpacing(12)
self.textLayout.setContentsMargins(24, 24, 24, 24)
self.textLayout.addWidget(self.titleLabel, 0, Qt.AlignTop)
self.textLayout.addWidget(self.contentLabel, 0, Qt.AlignTop)
self.buttonLayout.setSpacing(12)
self.buttonLayout.setContentsMargins(24, 24, 24, 24)
self.buttonLayout.addWidget(self.yesButton, 1, Qt.AlignVCenter)
self.buttonLayout.addWidget(self.cancelButton, 1, Qt.AlignVCenter)
def __onCancelButtonClicked(self):
self.reject()
self.cancelSignal.emit()
def __onYesButtonClicked(self):
self.accept()
self.yesSignal.emit()
def __setQss(self):
self.titleLabel.setObjectName("titleLabel")
self.contentLabel.setObjectName("contentLabel")
self.buttonGroup.setObjectName('buttonGroup')
self.cancelButton.setObjectName('cancelButton')
FluentStyleSheet.DIALOG.apply(self)
FluentStyleSheet.DIALOG.apply(self.contentLabel)
self.yesButton.adjustSize()
self.cancelButton.adjustSize()
def setContentCopyable(self, isCopyable: bool):
""" set whether the content is copyable """
if isCopyable:
self.contentLabel.setTextInteractionFlags(
Qt.TextInteractionFlag.TextSelectableByMouse)
else:
self.contentLabel.setTextInteractionFlags(
Qt.TextInteractionFlag.NoTextInteraction)
class Dialog(FramelessDialog, Ui_MessageBox):
""" Dialog box """
yesSignal = pyqtSignal()
cancelSignal = pyqtSignal()
def __init__(self, title: str, content: str, parent=None):
super().__init__(parent=parent)
self._setUpUi(title, content, self)
self.windowTitleLabel = QLabel(title, self)
self.setResizeEnabled(False)
self.resize(240, 192)
self.titleBar.hide()
self.vBoxLayout.insertWidget(0, self.windowTitleLabel, 0, Qt.AlignTop)
self.windowTitleLabel.setObjectName('windowTitleLabel')
FluentStyleSheet.DIALOG.apply(self)
self.setFixedSize(self.size())
def setTitleBarVisible(self, isVisible: bool):
self.windowTitleLabel.setVisible(isVisible)
class MessageBox(MaskDialogBase, Ui_MessageBox):
""" Message box """
yesSignal = pyqtSignal()
cancelSignal = pyqtSignal()
def __init__(self, title: str, content: str, parent=None):
super().__init__(parent=parent)
self._setUpUi(title, content, self.widget)
self.setShadowEffect(60, (0, 10), QColor(0, 0, 0, 50))
self.setMaskColor(QColor(0, 0, 0, 76))
self._hBoxLayout.removeWidget(self.widget)
self._hBoxLayout.addWidget(self.widget, 1, Qt.AlignCenter)
self.buttonGroup.setMinimumWidth(280)
self.widget.setFixedSize(
max(self.contentLabel.width(), self.titleLabel.width()) + 48,
self.contentLabel.y() + self.contentLabel.height() + 105
)
def eventFilter(self, obj, e: QEvent):
if obj is self.window():
if e.type() == QEvent.Resize:
self._adjustText()
return super().eventFilter(obj, e)