chore(ui): 优化二级菜单显示效果

This commit is contained in:
DLmaster361
2025-05-21 01:00:38 +08:00
parent 59ff9bf818
commit 86df9e7a50
7 changed files with 182 additions and 141 deletions

View File

@@ -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__(

View File

@@ -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):

View File

@@ -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 = []

View File

@@ -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()

View File

@@ -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)

View File

@@ -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):

View File

@@ -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游戏隐私政策"""