diff --git a/.github/workflows/build-app.yml b/.github/workflows/build-app.yml
index a172b12..a372406 100644
--- a/.github/workflows/build-app.yml
+++ b/.github/workflows/build-app.yml
@@ -73,8 +73,6 @@ jobs:
run: |
$MAIN_VERSION=(Get-Content -Path "version_info.txt" -TotalCount 1).Trim()
"AUTO_MAA_version=$MAIN_VERSION" | Out-File -FilePath $env:GITHUB_ENV -Append
- $UPDATER_VERSION=(Get-Content -Path "version_info.txt" -TotalCount 2 | Select-Object -Index 1).Trim()
- "updater_version=$UPDATER_VERSION" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
@@ -111,8 +109,11 @@ jobs:
NAME="$(sed 's/\r$//g' <(head -n 1 version_info.txt))"
TAGNAME="$(sed 's/\r$//g' <(head -n 1 version_info.txt))"
NOTES_MAIN="$(sed 's/\r$//g' <(tail -n +3 version_info.txt))"
- NOTES_TAIL="\`\`\`本release通过GitHub Actions自动构建\`\`\`"
- NOTES="$NOTES_MAIN
$NOTES_TAIL"
+ NOTES="$NOTES_MAIN
+
+ [已有 Mirror酱 CDK ?前往 Mirror酱 高速下载](https://mirrorchyan.com/zh/projects?rid=AUTO_MAA)
+
+ \`\`\`本release通过GitHub Actions自动构建\`\`\`"
if [ "${{ github.ref_name }}" == "main" ]; then
PRERELEASE_FLAG=""
else
diff --git a/app/core/config.py b/app/core/config.py
index f9b27a9..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(
@@ -622,11 +624,12 @@ class MaaUserConfig(QConfig):
class AppConfig(GlobalConfig):
- VERSION = "4.3.7.0"
+ VERSION = "4.3.8.1"
gameid_refreshed = Signal()
PASSWORD_refreshed = Signal()
user_info_changed = Signal()
+ power_sign_changed = Signal()
def __init__(self) -> None:
super().__init__()
@@ -649,6 +652,7 @@ class AppConfig(GlobalConfig):
"ALL": {"value": [], "text": []},
"Today": {"value": [], "text": []},
}
+ self.power_sign = "NoAction"
self.if_ignore_silence = False
self.if_database_opened = False
@@ -1310,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 868f611..ce97f21 100644
--- a/app/core/task_manager.py
+++ b/app/core/task_manager.py
@@ -265,28 +265,14 @@ class _TaskManager(QObject):
Config.queue_dict[name]["Config"].get(
Config.queue_dict[name]["Config"].queueSet_AfterAccomplish
)
- != "None"
+ != "NoAction"
+ and Config.power_sign == "NoAction"
):
-
- from app.ui import ProgressRingMessageBox
-
- mode_book = {
- "Shutdown": "关机",
- "Hibernate": "休眠",
- "Sleep": "睡眠",
- "KillSelf": "关闭AUTO_MAA",
- }
-
- choice = ProgressRingMessageBox(
- Config.main_window,
- f"{mode_book[Config.queue_dict[name]["Config"].get(Config.queue_dict[name]["Config"].queueSet_AfterAccomplish)]}倒计时",
- )
- if choice.exec():
- System.set_power(
- 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):
"""检查MAA版本"""
diff --git a/app/core/timer.py b/app/core/timer.py
index f019076..09e3d81 100644
--- a/app/core/timer.py
+++ b/app/core/timer.py
@@ -46,6 +46,7 @@ class _MainTimer(QWidget):
self.Timer = QTimer()
self.Timer.timeout.connect(self.timed_start)
self.Timer.timeout.connect(self.set_silence)
+ self.Timer.timeout.connect(self.check_power)
self.Timer.start(1000)
self.LongTimer = QTimer()
self.LongTimer.timeout.connect(self.long_timed_task)
@@ -113,5 +114,27 @@ class _MainTimer(QWidget):
logger.warning(f"FailSafeException: {e}")
self.if_FailSafeException = True
+ def check_power(self):
+
+ if Config.power_sign != "NoAction" and not Config.running_list:
+
+ from app.ui import ProgressRingMessageBox
+
+ mode_book = {
+ "KillSelf": "退出软件",
+ "Sleep": "睡眠",
+ "Hibernate": "休眠",
+ "Shutdown": "关机",
+ }
+
+ choice = ProgressRingMessageBox(
+ Config.main_window, f"{mode_book[Config.power_sign]}倒计时"
+ )
+ if choice.exec():
+ System.set_power(Config.power_sign)
+ Config.set_power_sign("NoAction")
+ else:
+ Config.set_power_sign("NoAction")
+
MainTimer = _MainTimer()
diff --git a/app/models/MAA.py b/app/models/MAA.py
index afe5cab..0557f8c 100644
--- a/app/models/MAA.py
+++ b/app/models/MAA.py
@@ -965,7 +965,7 @@ class MaaManager(QObject):
else:
self.maa_result = "MAA部分任务执行失败"
- elif "请「检查连接设置」或「尝试重启模拟器与 ADB」或「重启电脑」" in log:
+ elif "请 「检查连接设置」 → 「尝试重启模拟器与 ADB」 → 「重启电脑」" in log:
self.maa_result = "MAA的ADB连接异常"
elif "未检测到任何模拟器" in log:
@@ -991,7 +991,7 @@ class MaaManager(QObject):
elif mode == "人工排查":
if "完成任务: StartUp" in log:
self.maa_result = "Success!"
- elif "请「检查连接设置」或「尝试重启模拟器与 ADB」或「重启电脑」" in log:
+ elif "请 「检查连接设置」 → 「尝试重启模拟器与 ADB」 → 「重启电脑」" in log:
self.maa_result = "MAA的ADB连接异常"
elif "未检测到任何模拟器" in log:
self.maa_result = "MAA未检测到任何模拟器"
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 6f31289..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,12 +48,13 @@ 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
from typing import List
import shutil
+import json
from app.core import Config, MainInfoBar, TaskManager, MaaConfig, MaaUserConfig, Network
from app.services import Crypto
@@ -71,6 +71,7 @@ from .Widget import (
SwitchSettingCard,
PushAndSwitchButtonSettingCard,
PushAndComboBoxSettingCard,
+ PivotArea,
)
@@ -484,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)
@@ -562,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)
@@ -1010,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
@@ -1023,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)
@@ -1398,7 +1411,7 @@ class MemberManager(QWidget):
self.card_InfrastMode = PushAndComboBoxSettingCard(
icon=FluentIcon.CAFE,
title="基建模式",
- content="配置文件仅在自定义基建中生效",
+ content="自定义基建配置文件未生效",
text="选择配置文件",
texts=[
"常规模式",
@@ -1549,6 +1562,9 @@ class MemberManager(QWidget):
self.card_Mode.comboBox.currentIndexChanged.connect(
self.switch_mode
)
+ self.card_InfrastMode.comboBox.currentIndexChanged.connect(
+ self.switch_infrastructure
+ )
self.card_Annihilation.clicked.connect(
lambda: self.set_maa("Annihilation")
)
@@ -1562,6 +1578,7 @@ class MemberManager(QWidget):
Config.PASSWORD_refreshed.connect(self.refresh_password)
self.switch_mode()
+ self.switch_infrastructure()
def switch_mode(self) -> None:
@@ -1579,6 +1596,27 @@ class MemberManager(QWidget):
self.card_Annihilation.button.setVisible(True)
self.card_Routine.setVisible(True)
+ def switch_infrastructure(self) -> None:
+
+ if (
+ self.config.get(self.config.Info_InfrastMode)
+ == "Custom"
+ ):
+ self.card_InfrastMode.button.setVisible(True)
+ with (
+ self.user_path
+ / "Infrastructure/infrastructure.json"
+ ).open(mode="r", encoding="utf-8") as f:
+ infrastructure = json.load(f)
+ self.card_InfrastMode.setContent(
+ f"当前基建配置:{infrastructure.get("title","未命名")}"
+ )
+ else:
+ self.card_InfrastMode.button.setVisible(False)
+ self.card_InfrastMode.setContent(
+ "自定义基建配置文件未生效"
+ )
+
def refresh_gameid(self):
self.card_GameId.reLoadOptions(
@@ -1634,6 +1672,7 @@ class MemberManager(QWidget):
self.user_path
/ "Infrastructure/infrastructure.json",
)
+ self.switch_infrastructure()
else:
logger.warning("未选择自定义基建文件")
MainInfoBar.push_info_bar(
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 101808e..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 ...")
@@ -120,7 +119,7 @@ if __name__ == "__main__":
shutil.make_archive(
base_name=root_path / f"AUTO_MAA_{version_text(main_version_numb)}",
format="zip",
- root_dir=root_path / "AUTO_MAA",
+ root_dir=root_path / "AUTO_MAA_Setup",
base_dir=".",
)
@@ -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/main.py b/main.py
index f605263..d38ec7d 100644
--- a/main.py
+++ b/main.py
@@ -43,6 +43,7 @@ def main():
window = AUTO_MAA()
window.show_ui("显示主窗口")
+ window.show_ui("配置托盘")
window.start_up_task()
sys.exit(application.exec())
diff --git a/resources/version.json b/resources/version.json
index d786155..698872b 100644
--- a/resources/version.json
+++ b/resources/version.json
@@ -1,7 +1,19 @@
{
- "main_version": "4.3.7.0",
- "updater_version": "1.0.0.0",
+ "main_version": "4.3.8.1",
"version_info": {
+ "4.3.8.1": {
+ "新增功能": [
+ "自定义基建显示配置名称",
+ "主调度台添加仅一次电源任务"
+ ],
+ "修复bug": [
+ "电源相关选项改为所有任务完成后生效",
+ "适配MAAv5.16.3的ADB报错信息更改"
+ ],
+ "程序优化": [
+ "UI样式优化,进一步适配win10主题"
+ ]
+ },
"4.3.7.0": {
"新增功能": [
"下载器支持完整mirrorc列表"