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