# coding:utf-8 from PySide6.QtCore import Qt, Signal, QObject, QEvent from PySide6.QtGui import QColor from PySide6.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 = Signal() cancelSignal = Signal() def __init__(self, *args, **kwargs): pass 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 = Signal() cancelSignal = Signal() 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 = Signal() cancelSignal = Signal() 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)