diff --git a/app/core/config.py b/app/core/config.py index 1b24bed..d5f8628 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -260,8 +260,10 @@ class QueueConfig(QConfig): self.queueSet_AfterAccomplish = OptionsConfigItem( "QueueSet", "AfterAccomplish", - "None", - OptionsValidator(["None", "KillSelf", "Sleep", "Hibernate", "Shutdown"]), + "NoAction", + OptionsValidator( + ["NoAction", "KillSelf", "Sleep", "Hibernate", "Shutdown"] + ), ) self.time_TimeEnabled_0 = ConfigItem( @@ -627,6 +629,7 @@ class AppConfig(GlobalConfig): gameid_refreshed = Signal() PASSWORD_refreshed = Signal() user_info_changed = Signal() + power_sign_changed = Signal() def __init__(self) -> None: super().__init__() @@ -649,7 +652,7 @@ class AppConfig(GlobalConfig): "ALL": {"value": [], "text": []}, "Today": {"value": [], "text": []}, } - self.power_signal = None + self.power_sign = "NoAction" self.if_ignore_silence = False self.if_database_opened = False @@ -1311,6 +1314,12 @@ class AppConfig(GlobalConfig): self.user_info_changed.emit() + def set_power_sign(self, sign: str) -> None: + """设置当前电源状态""" + + self.power_sign = sign + self.power_sign_changed.emit() + def save_history(self, key: str, content: dict) -> None: """保存历史记录""" diff --git a/app/core/task_manager.py b/app/core/task_manager.py index ae398d2..ce97f21 100644 --- a/app/core/task_manager.py +++ b/app/core/task_manager.py @@ -265,11 +265,13 @@ class _TaskManager(QObject): Config.queue_dict[name]["Config"].get( Config.queue_dict[name]["Config"].queueSet_AfterAccomplish ) - != "None" - and not Config.power_signal + != "NoAction" + and Config.power_sign == "NoAction" ): - Config.power_signal = Config.queue_dict[name]["Config"].get( - Config.queue_dict[name]["Config"].queueSet_AfterAccomplish + Config.set_power_sign( + Config.queue_dict[name]["Config"].get( + Config.queue_dict[name]["Config"].queueSet_AfterAccomplish + ) ) def check_maa_version(self, v: str): diff --git a/app/core/timer.py b/app/core/timer.py index 0d16f95..09e3d81 100644 --- a/app/core/timer.py +++ b/app/core/timer.py @@ -116,25 +116,25 @@ class _MainTimer(QWidget): def check_power(self): - if Config.power_signal and not Config.running_list: + if Config.power_sign != "NoAction" and not Config.running_list: from app.ui import ProgressRingMessageBox mode_book = { - "Shutdown": "关机", - "Hibernate": "休眠", + "KillSelf": "退出软件", "Sleep": "睡眠", - "KillSelf": "关闭AUTO_MAA", + "Hibernate": "休眠", + "Shutdown": "关机", } choice = ProgressRingMessageBox( - Config.main_window, f"{mode_book[Config.power_signal]}倒计时" + Config.main_window, f"{mode_book[Config.power_sign]}倒计时" ) if choice.exec(): - System.set_power(Config.power_signal) - Config.power_signal = None + System.set_power(Config.power_sign) + Config.set_power_sign("NoAction") else: - Config.power_signal = None + Config.set_power_sign("NoAction") MainTimer = _MainTimer() diff --git a/app/services/system.py b/app/services/system.py index 3ccf18f..eee6a58 100644 --- a/app/services/system.py +++ b/app/services/system.py @@ -87,7 +87,7 @@ class _SystemHandler: if sys.platform.startswith("win"): - if mode == "None": + if mode == "NoAction": logger.info("不执行系统电源操作") @@ -115,7 +115,7 @@ class _SystemHandler: elif sys.platform.startswith("linux"): - if mode == "None": + if mode == "NoAction": logger.info("不执行系统电源操作") diff --git a/app/ui/Widget.py b/app/ui/Widget.py index 520adce..cf7f201 100644 --- a/app/ui/Widget.py +++ b/app/ui/Widget.py @@ -71,6 +71,9 @@ from qfluentwidgets import ( SwitchButton, IndicatorPosition, Slider, + ScrollArea, + Pivot, + PivotItem, ) from qfluentwidgets.common.overload import singledispatchmethod import os @@ -1128,6 +1131,84 @@ class QuantifiedItemCard(CardWidget): self.Layout.addWidget(self.Numb) +class PivotArea(ScrollArea): + def __init__(self, parent=None): + super().__init__(parent) + + # 创建中间容器并设置布局 + self.center_container = QWidget() + self.center_layout = QHBoxLayout(self.center_container) + self.center_layout.setContentsMargins(0, 0, 0, 0) + self.center_layout.setSpacing(0) + self.center_container.setStyleSheet("background: transparent; border: none;") + self.center_container.setFixedHeight(45) + + self.pivot = self._Pivot(self) + self.pivot.ItemNumbChanged.connect( + lambda: QTimer.singleShot( + 100, + lambda: ( + self.center_container.setFixedWidth( + max(self.width() - 2, self.pivot.width()) + ) + ), + ) + ) + + self.center_layout.addStretch(1) + self.center_layout.addWidget(self.pivot) + self.center_layout.addStretch(1) + + self.setWidgetResizable(False) + self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + self.viewport().setCursor(Qt.ArrowCursor) + self.setStyleSheet("background: transparent; border: none;") + self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) + self.setWidget(self.center_container) + + def wheelEvent(self, event): + scroll_bar = self.horizontalScrollBar() + if scroll_bar.maximum() > 0: + delta = event.angleDelta().y() + scroll_bar.setValue(scroll_bar.value() - delta // 15) + event.ignore() + + def resizeEvent(self, event): + super().resizeEvent(event) + + self.center_container.setFixedWidth(max(self.width() - 2, self.pivot.width())) + QTimer.singleShot( + 100, + lambda: ( + self.center_container.setFixedWidth( + max(self.width() - 2, self.pivot.width()) + ) + ), + ) + + class _Pivot(Pivot): + + ItemNumbChanged = Signal() + + def __init__(self, parent=None): + super().__init__(parent) + + def insertWidget( + self, index: int, routeKey: str, widget: PivotItem, onClick=None + ): + super().insertWidget(index, routeKey, widget, onClick) + self.ItemNumbChanged.emit() + + def removeWidget(self, routeKey: str): + super().removeWidget(routeKey) + self.ItemNumbChanged.emit() + + def clear(self): + super().clear() + self.ItemNumbChanged.emit() + + class QuickExpandGroupCard(ExpandGroupSettingCard): """全局配置""" diff --git a/app/ui/dispatch_center.py b/app/ui/dispatch_center.py index 1e9086a..8ecb47a 100644 --- a/app/ui/dispatch_center.py +++ b/app/ui/dispatch_center.py @@ -33,8 +33,8 @@ from PySide6.QtWidgets import ( QHBoxLayout, ) from qfluentwidgets import ( + BodyLabel, CardWidget, - Pivot, ScrollArea, FluentIcon, HeaderCardWidget, @@ -44,13 +44,12 @@ from qfluentwidgets import ( SubtitleLabel, PushButton, ) -from PySide6.QtCore import Qt from PySide6.QtGui import QTextCursor from typing import List, Dict from app.core import Config, TaskManager, Task, MainInfoBar -from .Widget import StatefulItemCard, ComboBoxMessageBox +from .Widget import StatefulItemCard, ComboBoxMessageBox, PivotArea class DispatchCenter(QWidget): @@ -60,13 +59,29 @@ class DispatchCenter(QWidget): self.setObjectName("调度中枢") - self.pivot = Pivot(self) + self.multi_button = PushButton(FluentIcon.ADD, "添加任务", self) + self.multi_button.setToolTip("添加任务") + self.multi_button.clicked.connect(self.start_multi_task) + + self.power_combox = ComboBox() + self.power_combox.addItem("无动作", userData="NoAction") + self.power_combox.addItem("退出软件", userData="KillSelf") + self.power_combox.addItem("睡眠", userData="Sleep") + self.power_combox.addItem("休眠", userData="Hibernate") + self.power_combox.addItem("关机", userData="Shutdown") + self.power_combox.setCurrentText("无动作") + self.power_combox.currentIndexChanged.connect(self.set_power_sign) + + self.pivotArea = PivotArea(self) + self.pivot = self.pivotArea.pivot + self.stackedWidget = QStackedWidget(self) - self.Layout = QVBoxLayout(self) + self.stackedWidget.setContentsMargins(0, 0, 0, 0) + self.stackedWidget.setStyleSheet("background: transparent; border: none;") - self.script_list: Dict[str, DispatchBox] = {} + self.script_list: Dict[str, DispatchCenter.DispatchBox] = {} - dispatch_box = DispatchBox("主调度台", self) + dispatch_box = self.DispatchBox("主调度台", self) self.script_list["主调度台"] = dispatch_box self.stackedWidget.addWidget(self.script_list["主调度台"]) self.pivot.addItem( @@ -76,7 +91,15 @@ class DispatchCenter(QWidget): icon=FluentIcon.CAFE, ) - self.Layout.addWidget(self.pivot, 0, Qt.AlignHCenter) + h_layout = QHBoxLayout() + h_layout.addWidget(self.multi_button) + h_layout.addWidget(self.pivotArea) + h_layout.addWidget(BodyLabel("全部完成后", self)) + h_layout.addWidget(self.power_combox) + h_layout.setContentsMargins(11, 5, 11, 0) + + self.Layout = QVBoxLayout(self) + self.Layout.addLayout(h_layout) self.Layout.addWidget(self.stackedWidget) self.Layout.setContentsMargins(0, 0, 0, 0) @@ -87,7 +110,7 @@ class DispatchCenter(QWidget): def add_board(self, task: Task) -> None: """添加一个调度台界面""" - dispatch_box = DispatchBox(task.name, self) + dispatch_box = self.DispatchBox(task.name, self) dispatch_box.top_bar.main_button.clicked.connect( lambda: TaskManager.stop_task(task.name) @@ -123,7 +146,6 @@ class DispatchCenter(QWidget): self.script_list["主调度台"].top_bar.Lable.show() self.script_list["主调度台"].top_bar.object.hide() self.script_list["主调度台"].top_bar.mode.hide() - self.script_list["主调度台"].top_bar.multi_button.show() self.script_list["主调度台"].top_bar.main_button.clicked.disconnect() self.script_list["主调度台"].top_bar.main_button.setText("中止任务") self.script_list["主调度台"].top_bar.main_button.clicked.connect( @@ -154,7 +176,6 @@ class DispatchCenter(QWidget): self.script_list["主调度台"].top_bar.Lable.hide() self.script_list["主调度台"].top_bar.object.show() self.script_list["主调度台"].top_bar.mode.show() - self.script_list["主调度台"].top_bar.multi_button.hide() self.script_list["主调度台"].top_bar.main_button.clicked.disconnect() self.script_list["主调度台"].top_bar.main_button.setText("开始任务") self.script_list["主调度台"].top_bar.main_button.clicked.connect( @@ -208,301 +229,327 @@ class DispatchCenter(QWidget): self.script_list["主调度台"].top_bar.mode.addItems(["自动代理", "人工排查"]) self.script_list["主调度台"].top_bar.mode.setCurrentIndex(0) + def update_power_sign(self) -> None: + """更新电源设置""" -class DispatchBox(QWidget): + mode_book = { + "NoAction": "无动作", + "KillSelf": "退出软件", + "Sleep": "睡眠", + "Hibernate": "休眠", + "Shutdown": "关机", + } + self.power_combox.currentIndexChanged.disconnect() + self.power_combox.setCurrentText(mode_book[Config.power_sign]) + self.power_combox.currentIndexChanged.connect(self.set_power_sign) - def __init__(self, name: str, parent=None): - super().__init__(parent) + def set_power_sign(self) -> None: + """设置所有任务完成后动作""" - self.setObjectName(name) + if not Config.running_list: - layout = QVBoxLayout() - - scrollArea = ScrollArea() - scrollArea.setWidgetResizable(True) - - 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.addWidget(scrollArea) - - self.setLayout(layout) - - class DispatchTopBar(CardWidget): - - def __init__(self, parent=None, name: str = None): - super().__init__(parent) - - Layout = QHBoxLayout(self) - - if name == "主调度台": - - self.Lable = SubtitleLabel("", self) - self.Lable.hide() - self.object = ComboBox() - self.object.setPlaceholderText("请选择调度对象") - self.mode = ComboBox() - self.mode.setPlaceholderText("请选择调度模式") - - self.multi_button = PushButton("添加任务") - self.multi_button.clicked.connect(self.start_multi_task) - self.main_button = PushButton("开始任务") - self.main_button.clicked.connect(self.start_main_task) - self.multi_button.hide() - - Layout.addWidget(self.Lable) - Layout.addWidget(self.object) - Layout.addWidget(self.mode) - Layout.addStretch(1) - Layout.addWidget(self.multi_button) - Layout.addWidget(self.main_button) - - else: - - self.Lable = SubtitleLabel(name, self) - self.main_button = PushButton("中止任务") - - Layout.addWidget(self.Lable) - Layout.addStretch(1) - Layout.addWidget(self.main_button) - - def start_main_task(self): - """开始任务""" - - if self.object.currentIndex() == -1: - logger.warning("未选择调度对象") - MainInfoBar.push_info_bar( - "warning", "未选择调度对象", "请选择后再开始任务", 5000 - ) - return None - - if self.mode.currentIndex() == -1: - logger.warning("未选择调度模式") - MainInfoBar.push_info_bar( - "warning", "未选择调度模式", "请选择后再开始任务", 5000 - ) - return None - - if self.object.currentData() in Config.running_list: - logger.warning(f"任务已存在:{self.object.currentData()}") - MainInfoBar.push_info_bar( - "warning", "任务已存在", self.object.currentData(), 5000 - ) - return None - - if "调度队列" in self.object.currentData(): - - logger.info(f"用户添加任务:{self.object.currentData()}") - TaskManager.add_task( - f"{self.mode.currentText()}_主调度台", - self.object.currentData(), - Config.queue_dict[self.object.currentData()]["Config"].toDict(), - ) - - elif "脚本" in self.object.currentData(): - - if Config.member_dict[self.object.currentData()]["Type"] == "Maa": - - logger.info(f"用户添加任务:{self.object.currentData()}") - TaskManager.add_task( - f"{self.mode.currentText()}_主调度台", - "自定义队列", - {"Queue": {"Member_1": self.object.currentData()}}, - ) - - def start_multi_task(self): - """开始任务""" - - # 获取所有可用的队列和实例 - text_list = [] - data_list = [] - for name, info in Config.queue_dict.items(): - if name in Config.running_list: - continue - text_list.append( - "队列" - if info["Config"].get(info["Config"].queueSet_Name) == "" - else f"队列 - {info["Config"].get(info["Config"].queueSet_Name)}" - ) - data_list.append(name) - - for name, info in Config.member_dict.items(): - if name in Config.running_list: - continue - text_list.append( - f"实例 - {info['Type']}" - if info["Config"].get(info["Config"].MaaSet_Name) == "" - else f"实例 - {info['Type']} - {info["Config"].get(info["Config"].MaaSet_Name)}" - ) - data_list.append(name) - - choice = ComboBoxMessageBox( - self.window(), - "选择一个对象以添加相应多开任务", - ["选择调度对象"], - [text_list], - [data_list], + self.power_combox.currentIndexChanged.disconnect() + self.power_combox.setCurrentText("无动作") + self.power_combox.currentIndexChanged.connect(self.set_power_sign) + logger.warning("没有正在运行的任务,无法设置任务完成后动作") + MainInfoBar.push_info_bar( + "warning", + "没有正在运行的任务", + "无法设置任务完成后动作", + 5000, ) - if choice.exec() and choice.input[0].currentIndex() != -1: + else: - if choice.input[0].currentData() in Config.running_list: - logger.warning(f"任务已存在:{choice.input[0].currentData()}") - MainInfoBar.push_info_bar( - "warning", "任务已存在", choice.input[0].currentData(), 5000 - ) - return None + Config.set_power_sign(self.power_combox.currentData()) - if "调度队列" in choice.input[0].currentData(): + def start_multi_task(self) -> None: + """开始任务""" + + # 获取所有可用的队列和实例 + text_list = [] + data_list = [] + for name, info in Config.queue_dict.items(): + if name in Config.running_list: + continue + text_list.append( + "队列" + if info["Config"].get(info["Config"].queueSet_Name) == "" + else f"队列 - {info["Config"].get(info["Config"].queueSet_Name)}" + ) + data_list.append(name) + + for name, info in Config.member_dict.items(): + if name in Config.running_list: + continue + text_list.append( + f"实例 - {info['Type']}" + if info["Config"].get(info["Config"].MaaSet_Name) == "" + else f"实例 - {info['Type']} - {info["Config"].get(info["Config"].MaaSet_Name)}" + ) + data_list.append(name) + + choice = ComboBoxMessageBox( + self.window(), + "选择一个对象以添加相应多开任务", + ["选择调度对象"], + [text_list], + [data_list], + ) + + if choice.exec() and choice.input[0].currentIndex() != -1: + + if choice.input[0].currentData() in Config.running_list: + logger.warning(f"任务已存在:{choice.input[0].currentData()}") + MainInfoBar.push_info_bar( + "warning", "任务已存在", choice.input[0].currentData(), 5000 + ) + return None + + if "调度队列" in choice.input[0].currentData(): + + logger.info(f"用户添加任务:{choice.input[0].currentData()}") + TaskManager.add_task( + "自动代理_新调度台", + choice.input[0].currentData(), + Config.queue_dict[choice.input[0].currentData()]["Config"].toDict(), + ) + + elif "脚本" in choice.input[0].currentData(): + + if Config.member_dict[choice.input[0].currentData()]["Type"] == "Maa": logger.info(f"用户添加任务:{choice.input[0].currentData()}") TaskManager.add_task( "自动代理_新调度台", - choice.input[0].currentData(), - Config.queue_dict[choice.input[0].currentData()][ - "Config" - ].toDict(), + f"自定义队列 - {choice.input[0].currentData()}", + {"Queue": {"Member_1": choice.input[0].currentData()}}, ) - elif "脚本" in choice.input[0].currentData(): + class DispatchBox(QWidget): - if ( - Config.member_dict[choice.input[0].currentData()]["Type"] - == "Maa" - ): - - logger.info(f"用户添加任务:{choice.input[0].currentData()}") - TaskManager.add_task( - "自动代理_新调度台", - f"自定义队列 - {choice.input[0].currentData()}", - {"Queue": {"Member_1": choice.input[0].currentData()}}, - ) - - class DispatchInfoCard(HeaderCardWidget): - - def __init__(self, parent=None): + def __init__(self, name: str, parent=None): super().__init__(parent) - self.setTitle("调度信息") + self.setObjectName(name) - self.task = self.TaskInfoCard(self) - self.user = self.UserInfoCard(self) - self.log_text = self.LogCard(self) + layout = QVBoxLayout() - self.viewLayout.addWidget(self.task) - self.viewLayout.addWidget(self.user) - self.viewLayout.addWidget(self.log_text) + scrollArea = ScrollArea() + scrollArea.setWidgetResizable(True) + scrollArea.setContentsMargins(0, 0, 0, 0) + scrollArea.setStyleSheet("background: transparent; border: none;") - self.viewLayout.setStretch(0, 1) - self.viewLayout.setStretch(1, 1) - self.viewLayout.setStretch(2, 5) + content_widget = QWidget() + content_layout = QVBoxLayout(content_widget) - def update_board(self, task_list: list, user_list: list, log: str): - """更新调度信息""" + self.top_bar = self.DispatchTopBar(self, name) + self.info = self.DispatchInfoCard(self) - self.task.update_task(task_list) - self.user.update_user(user_list) - self.log_text.text.setText(log) + content_layout.addWidget(self.top_bar) + content_layout.addWidget(self.info) - class TaskInfoCard(HeaderCardWidget): + scrollArea.setWidget(content_widget) + + layout.addWidget(scrollArea) + + self.setLayout(layout) + + class DispatchTopBar(CardWidget): + + def __init__(self, parent=None, name: str = None): + super().__init__(parent) + + Layout = QHBoxLayout(self) + + if name == "主调度台": + + self.Lable = SubtitleLabel("", self) + self.Lable.hide() + self.object = ComboBox() + self.object.setPlaceholderText("请选择调度对象") + self.mode = ComboBox() + self.mode.setPlaceholderText("请选择调度模式") + + self.main_button = PushButton("开始任务") + self.main_button.clicked.connect(self.start_main_task) + + Layout.addWidget(self.Lable) + Layout.addWidget(self.object) + Layout.addWidget(self.mode) + Layout.addStretch(1) + Layout.addWidget(self.main_button) + + else: + + self.Lable = SubtitleLabel(name, self) + self.main_button = PushButton("中止任务") + + Layout.addWidget(self.Lable) + Layout.addStretch(1) + Layout.addWidget(self.main_button) + + def start_main_task(self): + """开始任务""" + + if self.object.currentIndex() == -1: + logger.warning("未选择调度对象") + MainInfoBar.push_info_bar( + "warning", "未选择调度对象", "请选择后再开始任务", 5000 + ) + return None + + if self.mode.currentIndex() == -1: + logger.warning("未选择调度模式") + MainInfoBar.push_info_bar( + "warning", "未选择调度模式", "请选择后再开始任务", 5000 + ) + return None + + if self.object.currentData() in Config.running_list: + logger.warning(f"任务已存在:{self.object.currentData()}") + MainInfoBar.push_info_bar( + "warning", "任务已存在", self.object.currentData(), 5000 + ) + return None + + if "调度队列" in self.object.currentData(): + + logger.info(f"用户添加任务:{self.object.currentData()}") + TaskManager.add_task( + f"{self.mode.currentText()}_主调度台", + self.object.currentData(), + Config.queue_dict[self.object.currentData()]["Config"].toDict(), + ) + + elif "脚本" in self.object.currentData(): + + if Config.member_dict[self.object.currentData()]["Type"] == "Maa": + + logger.info(f"用户添加任务:{self.object.currentData()}") + TaskManager.add_task( + f"{self.mode.currentText()}_主调度台", + "自定义队列", + {"Queue": {"Member_1": self.object.currentData()}}, + ) + + class DispatchInfoCard(HeaderCardWidget): def __init__(self, parent=None): super().__init__(parent) - self.setTitle("任务队列") - self.Layout = QVBoxLayout() - self.viewLayout.addLayout(self.Layout) - self.viewLayout.setContentsMargins(3, 0, 3, 3) + self.setTitle("调度信息") - self.task_cards: List[StatefulItemCard] = [] + self.task = self.TaskInfoCard(self) + self.user = self.UserInfoCard(self) + self.log_text = self.LogCard(self) - def create_task(self, task_list: list): - """创建任务队列""" + self.viewLayout.addWidget(self.task) + self.viewLayout.addWidget(self.user) + self.viewLayout.addWidget(self.log_text) - while self.Layout.count() > 0: - item = self.Layout.takeAt(0) - if item.spacerItem(): - self.Layout.removeItem(item.spacerItem()) - elif item.widget(): - item.widget().deleteLater() + self.viewLayout.setStretch(0, 1) + self.viewLayout.setStretch(1, 1) + self.viewLayout.setStretch(2, 5) - self.task_cards = [] + def update_board(self, task_list: list, user_list: list, log: str): + """更新调度信息""" - for task in task_list: + self.task.update_task(task_list) + self.user.update_user(user_list) + self.log_text.text.setText(log) - self.task_cards.append(StatefulItemCard(task)) - self.Layout.addWidget(self.task_cards[-1]) + class TaskInfoCard(HeaderCardWidget): - self.Layout.addStretch(1) + def __init__(self, parent=None): + super().__init__(parent) + self.setTitle("任务队列") - def update_task(self, task_list: list): - """更新任务队列""" + self.Layout = QVBoxLayout() + self.viewLayout.addLayout(self.Layout) + self.viewLayout.setContentsMargins(3, 0, 3, 3) - for i in range(len(task_list)): + self.task_cards: List[StatefulItemCard] = [] - self.task_cards[i].update_status(task_list[i][1]) + def create_task(self, task_list: list): + """创建任务队列""" - class UserInfoCard(HeaderCardWidget): + while self.Layout.count() > 0: + item = self.Layout.takeAt(0) + if item.spacerItem(): + self.Layout.removeItem(item.spacerItem()) + elif item.widget(): + item.widget().deleteLater() - def __init__(self, parent=None): - super().__init__(parent) - self.setTitle("用户队列") + self.task_cards = [] - self.Layout = QVBoxLayout() - self.viewLayout.addLayout(self.Layout) - self.viewLayout.setContentsMargins(3, 0, 3, 3) + for task in task_list: - self.user_cards: List[StatefulItemCard] = [] + self.task_cards.append(StatefulItemCard(task)) + self.Layout.addWidget(self.task_cards[-1]) - def create_user(self, user_list: list): - """创建用户队列""" + self.Layout.addStretch(1) - while self.Layout.count() > 0: - item = self.Layout.takeAt(0) - if item.spacerItem(): - self.Layout.removeItem(item.spacerItem()) - elif item.widget(): - item.widget().deleteLater() + def update_task(self, task_list: list): + """更新任务队列""" - self.user_cards = [] + for i in range(len(task_list)): - for user in user_list: + self.task_cards[i].update_status(task_list[i][1]) - self.user_cards.append(StatefulItemCard(user)) - self.Layout.addWidget(self.user_cards[-1]) + class UserInfoCard(HeaderCardWidget): - self.Layout.addStretch(1) + def __init__(self, parent=None): + super().__init__(parent) + self.setTitle("用户队列") - def update_user(self, user_list: list): - """更新用户队列""" + self.Layout = QVBoxLayout() + self.viewLayout.addLayout(self.Layout) + self.viewLayout.setContentsMargins(3, 0, 3, 3) - for i in range(len(user_list)): + self.user_cards: List[StatefulItemCard] = [] - self.user_cards[i].Label.setText(user_list[i][0]) - self.user_cards[i].update_status(user_list[i][1]) + def create_user(self, user_list: list): + """创建用户队列""" - class LogCard(HeaderCardWidget): + while self.Layout.count() > 0: + item = self.Layout.takeAt(0) + if item.spacerItem(): + self.Layout.removeItem(item.spacerItem()) + elif item.widget(): + item.widget().deleteLater() - def __init__(self, parent=None): - super().__init__(parent) - self.setTitle("日志") + self.user_cards = [] - self.text = TextBrowser() - self.viewLayout.setContentsMargins(3, 0, 3, 3) - self.viewLayout.addWidget(self.text) + for user in user_list: - self.text.textChanged.connect(self.to_end) + self.user_cards.append(StatefulItemCard(user)) + self.Layout.addWidget(self.user_cards[-1]) - def to_end(self): - """滚动到底部""" + self.Layout.addStretch(1) - self.text.moveCursor(QTextCursor.End) - self.text.ensureCursorVisible() + def update_user(self, user_list: list): + """更新用户队列""" + + for i in range(len(user_list)): + + self.user_cards[i].Label.setText(user_list[i][0]) + self.user_cards[i].update_status(user_list[i][1]) + + class LogCard(HeaderCardWidget): + + def __init__(self, parent=None): + super().__init__(parent) + self.setTitle("日志") + + self.text = TextBrowser() + self.viewLayout.setContentsMargins(3, 0, 3, 3) + self.viewLayout.addWidget(self.text) + + self.text.textChanged.connect(self.to_end) + + def to_end(self): + """滚动到底部""" + + self.text.moveCursor(QTextCursor.End) + self.text.ensureCursorVisible() diff --git a/app/ui/downloader.py b/app/ui/downloader.py index e14343e..678f6f7 100644 --- a/app/ui/downloader.py +++ b/app/ui/downloader.py @@ -21,11 +21,10 @@ """ AUTO_MAA AUTO_MAA更新器 -v1.2 +v4.3 作者:DLmaster_361 """ -import json import zipfile import requests import subprocess diff --git a/app/ui/history.py b/app/ui/history.py index 808c114..6da7a8e 100644 --- a/app/ui/history.py +++ b/app/ui/history.py @@ -69,6 +69,8 @@ class History(QWidget): scrollArea = ScrollArea() scrollArea.setWidgetResizable(True) + scrollArea.setContentsMargins(0, 0, 0, 0) + scrollArea.setStyleSheet("background: transparent; border: none;") scrollArea.setWidget(content_widget) layout = QVBoxLayout() layout.addWidget(self.history_top_bar) diff --git a/app/ui/home.py b/app/ui/home.py index c3c847e..3bd08c5 100644 --- a/app/ui/home.py +++ b/app/ui/home.py @@ -149,6 +149,8 @@ class Home(QWidget): layout = QVBoxLayout() scrollArea = ScrollArea() scrollArea.setWidgetResizable(True) + scrollArea.setContentsMargins(0, 0, 0, 0) + scrollArea.setStyleSheet("background: transparent; border: none;") scrollArea.setWidget(widget) layout.addWidget(scrollArea) self.setLayout(layout) diff --git a/app/ui/main_window.py b/app/ui/main_window.py index 9a20e48..9509809 100644 --- a/app/ui/main_window.py +++ b/app/ui/main_window.py @@ -192,6 +192,7 @@ class AUTO_MAA(MSFluentWindow): self.set_min_method() Config.user_info_changed.connect(self.member_manager.refresh_dashboard) + Config.power_sign_changed.connect(self.dispatch_center.update_power_sign) TaskManager.create_gui.connect(self.dispatch_center.add_board) TaskManager.connect_gui.connect(self.dispatch_center.connect_main_board) Notify.push_info_bar.connect(MainInfoBar.push_info_bar) diff --git a/app/ui/member_manager.py b/app/ui/member_manager.py index 32a00d6..1e7c407 100644 --- a/app/ui/member_manager.py +++ b/app/ui/member_manager.py @@ -38,7 +38,6 @@ from PySide6.QtWidgets import ( from PySide6.QtGui import QIcon from qfluentwidgets import ( Action, - Pivot, ScrollArea, FluentIcon, MessageBox, @@ -49,7 +48,7 @@ from qfluentwidgets import ( TableWidget, PrimaryToolButton, ) -from PySide6.QtCore import Qt, Signal +from PySide6.QtCore import Signal from datetime import datetime from functools import partial from pathlib import Path @@ -72,6 +71,7 @@ from .Widget import ( SwitchSettingCard, PushAndSwitchButtonSettingCard, PushAndComboBoxSettingCard, + PivotArea, ) @@ -485,13 +485,17 @@ class MemberManager(QWidget): self.setObjectName("脚本管理页面组") - self.pivot = Pivot(self) + self.pivotArea = PivotArea(self) + self.pivot = self.pivotArea.pivot + self.stackedWidget = QStackedWidget(self) - self.Layout = QVBoxLayout(self) + self.stackedWidget.setContentsMargins(0, 0, 0, 0) + self.stackedWidget.setStyleSheet("background: transparent; border: none;") self.script_list: List[MemberManager.MemberSettingBox.MaaSettingBox] = [] - self.Layout.addWidget(self.pivot, 0, Qt.AlignHCenter) + self.Layout = QVBoxLayout(self) + self.Layout.addWidget(self.pivotArea) self.Layout.addWidget(self.stackedWidget) self.Layout.setContentsMargins(0, 0, 0, 0) @@ -563,6 +567,8 @@ class MemberManager(QWidget): 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) @@ -1011,9 +1017,14 @@ class MemberManager(QWidget): self.setObjectName("用户管理") self.name = name - self.pivot = Pivot(self) + self.pivotArea = PivotArea(self) + self.pivot = self.pivotArea.pivot + self.stackedWidget = QStackedWidget(self) - self.Layout = QVBoxLayout(self) + self.stackedWidget.setContentsMargins(0, 0, 0, 0) + self.stackedWidget.setStyleSheet( + "background: transparent; border: none;" + ) self.script_list: List[ MemberManager.MemberSettingBox.MaaSettingBox.UserManager.UserSettingBox.UserMemberSettingBox @@ -1024,7 +1035,8 @@ class MemberManager(QWidget): self.stackedWidget.addWidget(self.user_dashboard) self.pivot.addItem(routeKey="用户仪表盘", text="用户仪表盘") - self.Layout.addWidget(self.pivot, 0, Qt.AlignHCenter) + self.Layout = QVBoxLayout(self) + self.Layout.addWidget(self.pivotArea) self.Layout.addWidget(self.stackedWidget) self.Layout.setContentsMargins(0, 0, 0, 0) diff --git a/app/ui/queue_manager.py b/app/ui/queue_manager.py index b49b6c7..c450071 100644 --- a/app/ui/queue_manager.py +++ b/app/ui/queue_manager.py @@ -34,14 +34,12 @@ from PySide6.QtWidgets import ( ) from qfluentwidgets import ( Action, - Pivot, ScrollArea, FluentIcon, MessageBox, HeaderCardWidget, CommandBar, ) -from PySide6.QtCore import Qt from typing import List from app.core import QueueConfig, Config, MainInfoBar @@ -52,6 +50,7 @@ from .Widget import ( TimeEditSettingCard, NoOptionComboBoxSettingCard, HistoryCard, + PivotArea, ) @@ -305,15 +304,19 @@ class QueueManager(QWidget): self.setObjectName("调度队列管理") - self.pivot = Pivot(self) + self.pivotArea = PivotArea() + self.pivot = self.pivotArea.pivot + self.stackedWidget = QStackedWidget(self) - self.Layout = QVBoxLayout(self) + self.stackedWidget.setContentsMargins(0, 0, 0, 0) + self.stackedWidget.setStyleSheet("background: transparent; border: none;") self.script_list: List[ QueueManager.QueueSettingBox.QueueMemberSettingBox ] = [] - self.Layout.addWidget(self.pivot, 0, Qt.AlignHCenter) + self.Layout = QVBoxLayout(self) + self.Layout.addWidget(self.pivotArea) self.Layout.addWidget(self.stackedWidget) self.Layout.setContentsMargins(0, 0, 0, 0) @@ -380,6 +383,8 @@ class QueueManager(QWidget): 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) diff --git a/app/ui/setting.py b/app/ui/setting.py index 904f8e4..3dbcf7c 100644 --- a/app/ui/setting.py +++ b/app/ui/setting.py @@ -103,6 +103,8 @@ class Setting(QWidget): scrollArea = ScrollArea() scrollArea.setWidgetResizable(True) + scrollArea.setContentsMargins(0, 0, 0, 0) + scrollArea.setStyleSheet("background: transparent; border: none;") scrollArea.setWidget(content_widget) layout = QVBoxLayout() layout.addWidget(scrollArea) diff --git a/app/utils/package.py b/app/utils/package.py index 0bf49bf..47478d7 100644 --- a/app/utils/package.py +++ b/app/utils/package.py @@ -66,7 +66,6 @@ if __name__ == "__main__": version = json.load(f) main_version_numb = list(map(int, version["main_version"].split("."))) - updater_version_numb = list(map(int, version["updater_version"].split("."))) print("Packaging AUTO_MAA main program ...") @@ -139,6 +138,6 @@ if __name__ == "__main__": all_version_info[key] = value.copy() (root_path / "version_info.txt").write_text( - f"{version_text(main_version_numb)}\n{version_text(updater_version_numb)}\n\n{version_info_markdown(all_version_info)}", + f"{version_text(main_version_numb)}\n\n\n{version_info_markdown(all_version_info)}", encoding="utf-8", ) diff --git a/resources/version.json b/resources/version.json index 05e7015..30d83e3 100644 --- a/resources/version.json +++ b/resources/version.json @@ -4,10 +4,14 @@ "version_info": { "4.3.8.1": { "新增功能": [ - "自定义基建显示配置名称" + "自定义基建显示配置名称", + "主调度台添加仅一次电源任务" ], "修复bug": [ "电源相关选项改为所有任务完成后生效" + ], + "程序优化": [ + "UI样式优化,进一步适配win10主题" ] }, "4.3.7.0": {