diff --git a/app/ui/Widget.py b/app/ui/Widget.py index 0e9de98..4aa98be 100644 --- a/app/ui/Widget.py +++ b/app/ui/Widget.py @@ -74,6 +74,7 @@ from qfluentwidgets import ( ScrollArea, Pivot, PivotItem, + FlyoutViewBase, ) from qfluentwidgets.common.overload import singledispatchmethod import os @@ -191,44 +192,6 @@ class ProgressRingMessageBox(MessageBoxBase): self.timer.deleteLater() -class SettingMessageBox(MessageBoxBase): - """设置二级菜单对话框""" - - def __init__( - self, - parent, - title: str, - setting_cards: List[Union[SettingCard, HeaderCardWidget]], - ): - super().__init__(parent) - - self.title = SubtitleLabel(title) - self.button_yes = PrimaryPushButton("确认", self) - self.v_layout = QVBoxLayout() - self.v_layout.addStretch() - self.v_layout.addWidget(self.button_yes) - - self.buttonGroup.hide() - - scrollArea = ScrollArea() - scrollArea.setWidgetResizable(True) - scrollArea.setContentsMargins(0, 0, 0, 0) - scrollArea.setStyleSheet("background: transparent; border: none;") - - content_widget = QWidget() - content_layout = QVBoxLayout(content_widget) - for setting_card in setting_cards: - content_layout.addWidget(setting_card) - scrollArea.setWidget(content_widget) - - # 将组件添加到布局中 - self.viewLayout.addWidget(self.title) - self.viewLayout.addWidget(scrollArea) - self.viewLayout.addLayout(self.v_layout) - - self.button_yes.clicked.connect(self.yesButton.click) - - class NoticeMessageBox(MessageBoxBase): """公告对话框""" @@ -309,6 +272,39 @@ class NoticeMessageBox(MessageBoxBase): self.Layout.addStretch(1) +class SettingFlyoutView(FlyoutViewBase): + """设置卡二级菜单弹出组件""" + + def __init__( + self, + parent, + title: str, + setting_cards: List[Union[SettingCard, HeaderCardWidget]], + ): + super().__init__(parent) + + self.title = SubtitleLabel(title) + + content_widget = QWidget() + content_layout = QVBoxLayout(content_widget) + content_layout.setSpacing(0) + content_layout.setContentsMargins(0, 0, 11, 0) + for setting_card in setting_cards: + content_layout.addWidget(setting_card) + + scrollArea = ScrollArea() + scrollArea.setWidgetResizable(True) + scrollArea.setContentsMargins(0, 0, 0, 0) + scrollArea.setStyleSheet("background: transparent; border: none;") + scrollArea.setWidget(content_widget) + + self.viewLayout = QVBoxLayout(self) + self.viewLayout.setSpacing(12) + self.viewLayout.setContentsMargins(20, 16, 9, 16) + self.viewLayout.addWidget(self.title) + self.viewLayout.addWidget(scrollArea) + + class SwitchSettingCard(SettingCard): """Setting card with switch button""" @@ -971,6 +967,72 @@ class TimeEditSettingCard(SettingCard): self.TimeEdit.setTime(QTime.fromString(value, "HH:mm")) +class UserNoticeSettingCard(PushAndSwitchButtonSettingCard): + """Setting card with User's Notice""" + + def __init__( + self, + icon: Union[str, QIcon, FluentIconBase], + title: str, + content: Union[str, None], + text: str, + qconfig: QConfig, + configItem: ConfigItem, + configItems: Dict[str, ConfigItem], + parent=None, + ): + + super().__init__(icon, title, content, text, qconfig, configItem, parent) + self.qconfig = qconfig + self.configItems = configItems + self.Lable = SubtitleLabel(self) + + if configItems: + for config_item in configItems.values(): + config_item.valueChanged.connect(self.setValues) + self.setValues() + + self.hBoxLayout.addWidget(self.Lable, 0, Qt.AlignRight) + self.hBoxLayout.addSpacing(16) + + def setValues(self): + + def short_str(s: str) -> str: + if len(s) <= 10: + return s + return s[:10] + "..." + + content_list = [] + + if self.configItems: + + if not ( + self.qconfig.get(self.configItems["IfSendStatistic"]) + or self.qconfig.get(self.configItems["IfSendSixStar"]) + ): + content_list.append("未启用任何通知项") + + if self.qconfig.get(self.configItems["IfSendStatistic"]): + content_list.append("统计信息已启用") + if self.qconfig.get(self.configItems["IfSendSixStar"]): + content_list.append("六星喜报已启用") + + if self.qconfig.get(self.configItems["IfSendMail"]): + content_list.append( + f"邮箱通知:{short_str(self.qconfig.get(self.configItems["ToAddress"]))}" + ) + if self.qconfig.get(self.configItems["IfServerChan"]): + content_list.append( + f"Server酱通知:{short_str(self.qconfig.get(self.configItems["ServerChanKey"]))}" + ) + if self.qconfig.get(self.configItems["IfCompanyWebHookBot"]): + content_list.append( + f"企业微信通知:{short_str(self.qconfig.get(self.configItems["CompanyWebHookBotUrl"]))}" + ) + + self.setContent(" | ".join(content_list)) + + class StatusSwitchSetting(SwitchButton): def __init__( diff --git a/app/ui/dispatch_center.py b/app/ui/dispatch_center.py index 8ecb47a..70c0747 100644 --- a/app/ui/dispatch_center.py +++ b/app/ui/dispatch_center.py @@ -333,28 +333,24 @@ class DispatchCenter(QWidget): self.setObjectName(name) - layout = QVBoxLayout() + self.top_bar = self.DispatchTopBar(self, name) + self.info = self.DispatchInfoCard(self) + + content_widget = QWidget() + content_layout = QVBoxLayout(content_widget) + content_layout.setContentsMargins(0, 0, 0, 0) + content_layout.addWidget(self.top_bar) + content_layout.addWidget(self.info) scrollArea = ScrollArea() scrollArea.setWidgetResizable(True) scrollArea.setContentsMargins(0, 0, 0, 0) scrollArea.setStyleSheet("background: transparent; border: none;") - - content_widget = QWidget() - content_layout = QVBoxLayout(content_widget) - - self.top_bar = self.DispatchTopBar(self, name) - self.info = self.DispatchInfoCard(self) - - content_layout.addWidget(self.top_bar) - content_layout.addWidget(self.info) - scrollArea.setWidget(content_widget) + layout = QVBoxLayout(self) layout.addWidget(scrollArea) - self.setLayout(layout) - class DispatchTopBar(CardWidget): def __init__(self, parent=None, name: str = None): diff --git a/app/ui/history.py b/app/ui/history.py index 6da7a8e..ddf5d95 100644 --- a/app/ui/history.py +++ b/app/ui/history.py @@ -61,21 +61,22 @@ class History(QWidget): super().__init__(parent) self.setObjectName("历史记录") + self.history_top_bar = self.HistoryTopBar(self) + self.history_top_bar.search_history.connect(self.reload_history) + content_widget = QWidget() self.content_layout = QVBoxLayout(content_widget) - self.history_top_bar = self.HistoryTopBar(self) - - self.history_top_bar.search_history.connect(self.reload_history) + self.content_layout.setContentsMargins(0, 0, 11, 0) scrollArea = ScrollArea() scrollArea.setWidgetResizable(True) scrollArea.setContentsMargins(0, 0, 0, 0) scrollArea.setStyleSheet("background: transparent; border: none;") scrollArea.setWidget(content_widget) - layout = QVBoxLayout() + + layout = QVBoxLayout(self) layout.addWidget(self.history_top_bar) layout.addWidget(scrollArea) - self.setLayout(layout) self.history_card_list = [] diff --git a/app/ui/home.py b/app/ui/home.py index 3bd08c5..9a60344 100644 --- a/app/ui/home.py +++ b/app/ui/home.py @@ -62,14 +62,6 @@ class Home(QWidget): self.banner = Banner() self.banner_text = TextBrowser() - widget = QWidget() - Layout = QVBoxLayout(widget) - - Layout.addWidget(self.banner) - Layout.addWidget(self.banner_text) - Layout.setStretch(0, 2) - Layout.setStretch(1, 3) - v_layout = QVBoxLayout(self.banner) v_layout.setContentsMargins(0, 0, 0, 15) v_layout.setSpacing(5) @@ -146,14 +138,22 @@ class Home(QWidget): # 将底部水平布局添加到垂直布局 v_layout.addLayout(h2_layout) - layout = QVBoxLayout() + content_widget = QWidget() + content_layout = QVBoxLayout(content_widget) + content_layout.setContentsMargins(0, 0, 0, 0) + content_layout.addWidget(self.banner) + content_layout.addWidget(self.banner_text) + content_layout.setStretch(0, 2) + content_layout.setStretch(1, 3) + scrollArea = ScrollArea() scrollArea.setWidgetResizable(True) scrollArea.setContentsMargins(0, 0, 0, 0) scrollArea.setStyleSheet("background: transparent; border: none;") - scrollArea.setWidget(widget) + scrollArea.setWidget(content_widget) + + layout = QVBoxLayout(self) layout.addWidget(scrollArea) - self.setLayout(layout) self.set_banner() diff --git a/app/ui/member_manager.py b/app/ui/member_manager.py index b8378e9..4e96e69 100644 --- a/app/ui/member_manager.py +++ b/app/ui/member_manager.py @@ -47,6 +47,8 @@ from qfluentwidgets import ( PushSettingCard, TableWidget, PrimaryToolButton, + Flyout, + FlyoutAnimationType, ) from PySide6.QtCore import Signal from datetime import datetime @@ -64,7 +66,7 @@ from .Widget import ( LineEditSettingCard, SpinBoxSettingCard, ComboBoxMessageBox, - SettingMessageBox, + SettingFlyoutView, EditableComboBoxSettingCard, PasswordLineEditSettingCard, UserLableSettingCard, @@ -73,6 +75,7 @@ from .Widget import ( PushAndSwitchButtonSettingCard, PushAndComboBoxSettingCard, StatusSwitchSetting, + UserNoticeSettingCard, PivotArea, ) @@ -565,29 +568,25 @@ class MemberManager(QWidget): self.setObjectName(f"脚本_{uid}") self.config = Config.member_dict[f"脚本_{uid}"]["Config"] - layout = QVBoxLayout() + self.app_setting = self.AppSettingCard(f"脚本_{uid}", self.config, self) + self.user_setting = self.UserManager(f"脚本_{uid}", self) + + content_widget = QWidget() + content_layout = QVBoxLayout(content_widget) + content_layout.setContentsMargins(0, 0, 11, 0) + content_layout.addWidget(self.app_setting) + content_layout.addWidget(self.user_setting) + content_layout.addStretch(1) scrollArea = ScrollArea() scrollArea.setWidgetResizable(True) scrollArea.setContentsMargins(0, 0, 0, 0) scrollArea.setStyleSheet("background: transparent; border: none;") - - content_widget = QWidget() - content_layout = QVBoxLayout(content_widget) - - self.app_setting = self.AppSettingCard(f"脚本_{uid}", self.config, self) - self.user_setting = self.UserManager(f"脚本_{uid}", self) - - content_layout.addWidget(self.app_setting) - content_layout.addWidget(self.user_setting) - content_layout.addStretch(1) - scrollArea.setWidget(content_widget) + layout = QVBoxLayout(self) layout.addWidget(scrollArea) - self.setLayout(layout) - class AppSettingCard(HeaderCardWidget): def __init__(self, name: str, config: MaaConfig, parent=None): @@ -1531,13 +1530,23 @@ class MemberManager(QWidget): ) # 新增单独通知卡片 - self.card_NotifySet = PushAndSwitchButtonSettingCard( + self.card_NotifySet = UserNoticeSettingCard( icon=FluentIcon.MAIL, title="用户单独通知设置", content="未启用任何通知项", text="设置", qconfig=self.config, configItem=self.config.Notify_Enabled, + configItems={ + "IfSendStatistic": self.config.Notify_IfSendStatistic, + "IfSendSixStar": self.config.Notify_IfSendSixStar, + "IfSendMail": self.config.Notify_IfSendMail, + "ToAddress": self.config.Notify_ToAddress, + "IfServerChan": self.config.Notify_IfServerChan, + "ServerChanKey": self.config.Notify_ServerChanKey, + "IfCompanyWebHookBot": self.config.Notify_IfCompanyWebHookBot, + "CompanyWebHookBotUrl": self.config.Notify_CompanyWebHookBotUrl, + }, parent=self, ) self.card_NotifyContent = self.NotifyContentSettingCard( @@ -1558,9 +1567,10 @@ class MemberManager(QWidget): self.card_CompanyWebhookBot, ] - self.NotifySetCard = SettingMessageBox( - self.window(), "用户通知设置", self.card_NotifySet_list + self.NotifySetCard = SettingFlyoutView( + self, "用户通知设置", self.card_NotifySet_list ) + self.NotifySetCard.setVisible(False) h1_layout = QHBoxLayout() h1_layout.addWidget(self.card_Name) @@ -1625,7 +1635,6 @@ class MemberManager(QWidget): self.switch_mode() self.switch_infrastructure() - self.set_notify(if_show=False) def switch_mode(self) -> None: @@ -1746,44 +1755,17 @@ class MemberManager(QWidget): }, ) - def set_notify(self, if_show: bool = True) -> None: + def set_notify(self) -> None: """设置用户通知相关配置""" - def short_str(s: str) -> str: - if len(s) <= 10: - return s - return s[:7] + "..." - - if if_show: - self.NotifySetCard.exec_() - - content_list = [] - - if not ( - self.config.get(self.config.Notify_IfSendStatistic) - or self.config.get(self.config.Notify_IfSendSixStar) - ): - content_list.append("未启用任何通知项") - - if self.config.get(self.config.Notify_IfSendStatistic): - content_list.append("统计信息已启用") - if self.config.get(self.config.Notify_IfSendSixStar): - content_list.append("六星喜报已启用") - - if self.config.get(self.config.Notify_IfSendMail): - content_list.append( - f"邮箱通知:{short_str(self.config.get(self.config.Notify_ToAddress))}" - ) - if self.config.get(self.config.Notify_IfServerChan): - content_list.append( - f"Server酱通知:{short_str(self.config.get(self.config.Notify_ServerChanKey))}" - ) - if self.config.get(self.config.Notify_IfCompanyWebHookBot): - content_list.append( - f"企业微信通知:{short_str(self.config.get(self.config.Notify_CompanyWebHookBotUrl))}" - ) - - self.card_NotifySet.setContent(" | ".join(content_list)) + self.NotifySetCard.setVisible(True) + Flyout.make( + self.NotifySetCard, + self.card_NotifySet, + self, + aniType=FlyoutAnimationType.PULL_UP, + isDeleteOnClose=False, + ) class NotifyContentSettingCard(HeaderCardWidget): @@ -1814,6 +1796,7 @@ class MemberManager(QWidget): Layout.addWidget(self.card_IfSendStatistic) Layout.addWidget(self.card_IfSendSixStar) self.viewLayout.addLayout(Layout) + self.viewLayout.setSpacing(3) self.viewLayout.setContentsMargins(3, 0, 3, 3) class EMailSettingCard(HeaderCardWidget): @@ -1846,6 +1829,7 @@ class MemberManager(QWidget): Layout.addWidget(self.card_IfSendMail) Layout.addWidget(self.card_ToAddress) self.viewLayout.addLayout(Layout) + self.viewLayout.setSpacing(3) self.viewLayout.setContentsMargins(3, 0, 3, 3) class ServerChanSettingCard(HeaderCardWidget): @@ -1898,6 +1882,7 @@ class MemberManager(QWidget): Layout.addWidget(self.card_ServerChanChannel) Layout.addWidget(self.card_ServerChanTag) self.viewLayout.addLayout(Layout) + self.viewLayout.setSpacing(3) self.viewLayout.setContentsMargins(3, 0, 3, 3) class CompanyWechatPushSettingCard(HeaderCardWidget): @@ -1908,7 +1893,7 @@ class MemberManager(QWidget): self.config = config - self.card_IfCompanyWechat = SwitchSettingCard( + self.card_IfCompanyWebHookBot = SwitchSettingCard( icon=FluentIcon.PAGE_RIGHT, title="推送用户企业微信机器人通知", content="是否启用用户企微机器人通知功能", @@ -1927,7 +1912,8 @@ class MemberManager(QWidget): ) Layout = QVBoxLayout() - Layout.addWidget(self.card_IfCompanyWechat) + Layout.addWidget(self.card_IfCompanyWebHookBot) Layout.addWidget(self.card_CompanyWebHookBotUrl) self.viewLayout.addLayout(Layout) + self.viewLayout.setSpacing(3) self.viewLayout.setContentsMargins(3, 0, 3, 3) diff --git a/app/ui/queue_manager.py b/app/ui/queue_manager.py index c450071..a8ff7a4 100644 --- a/app/ui/queue_manager.py +++ b/app/ui/queue_manager.py @@ -379,16 +379,6 @@ class QueueManager(QWidget): self.setObjectName(f"调度队列_{uid}") self.config = Config.queue_dict[f"调度队列_{uid}"]["Config"] - layout = QVBoxLayout() - - scrollArea = ScrollArea() - scrollArea.setWidgetResizable(True) - scrollArea.setContentsMargins(0, 0, 0, 0) - scrollArea.setStyleSheet("background: transparent; border: none;") - - content_widget = QWidget() - content_layout = QVBoxLayout(content_widget) - self.queue_set = self.QueueSetSettingCard(self.config, self) self.time = self.TimeSettingCard(self.config, self) self.task = self.TaskSettingCard(self.config, self) @@ -398,18 +388,24 @@ class QueueManager(QWidget): parent=self, ) + content_widget = QWidget() + content_layout = QVBoxLayout(content_widget) + content_layout.setContentsMargins(0, 0, 11, 0) content_layout.addWidget(self.queue_set) content_layout.addWidget(self.time) content_layout.addWidget(self.task) content_layout.addWidget(self.history) content_layout.addStretch(1) + scrollArea = ScrollArea() + scrollArea.setWidgetResizable(True) + scrollArea.setContentsMargins(0, 0, 0, 0) + scrollArea.setStyleSheet("background: transparent; border: none;") scrollArea.setWidget(content_widget) + layout = QVBoxLayout(self) layout.addWidget(scrollArea) - self.setLayout(layout) - class QueueSetSettingCard(HeaderCardWidget): def __init__(self, config: QueueConfig, parent=None): diff --git a/app/ui/setting.py b/app/ui/setting.py index 3dbcf7c..2f2be41 100644 --- a/app/ui/setting.py +++ b/app/ui/setting.py @@ -70,9 +70,6 @@ class Setting(QWidget): super().__init__(parent) self.setObjectName("设置") - content_widget = QWidget() - content_layout = QVBoxLayout(content_widget) - self.function = FunctionSettingCard(self) self.start = StartSettingCard(self) self.ui = UiSettingCard(self) @@ -93,6 +90,9 @@ class Setting(QWidget): ) self.other.card_Notice.clicked.connect(lambda: self.show_notice(if_show=True)) + content_widget = QWidget() + content_layout = QVBoxLayout(content_widget) + content_layout.setContentsMargins(0, 0, 11, 0) content_layout.addWidget(self.function) content_layout.addWidget(self.start) content_layout.addWidget(self.ui) @@ -106,9 +106,9 @@ class Setting(QWidget): scrollArea.setContentsMargins(0, 0, 0, 0) scrollArea.setStyleSheet("background: transparent; border: none;") scrollArea.setWidget(content_widget) - layout = QVBoxLayout() + + layout = QVBoxLayout(self) layout.addWidget(scrollArea) - self.setLayout(layout) def agree_bilibili(self) -> None: """授权bilibili游戏隐私政策"""