From 8d69e43f720f47e4e3a608db3a66dd76f47830ba Mon Sep 17 00:00:00 2001 From: DLmaster361 Date: Thu, 22 May 2025 23:20:38 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat(ui):=20=E5=88=9D=E6=AD=A5=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=91=A8=E8=AE=A1=E5=88=92=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/config.py | 222 +++++++++++++++--------------------- app/ui/Widget.py | 188 ++++++++++++++++++++++++++++++- app/ui/main_window.py | 9 ++ app/ui/member_manager.py | 10 +- app/ui/plan_manager.py | 236 ++++++++------------------------------- app/ui/queue_manager.py | 6 +- app/ui/setting.py | 4 +- 7 files changed, 334 insertions(+), 341 deletions(-) diff --git a/app/core/config.py b/app/core/config.py index 3c5781c..e28c9e9 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -33,6 +33,7 @@ import sys import shutil import re import base64 +import calendar from datetime import datetime, timedelta, date from collections import defaultdict from pathlib import Path @@ -469,117 +470,49 @@ class MaaPlanConfig(LQConfig): self.Info_Name = ConfigItem("Info", "Name", "新表格") - self.Global_MedicineNumb = ConfigItem( - "Global", "MedicineNumb", 0, RangeValidator(0, 1024) - ) - self.Global_SeriesNumb = OptionsConfigItem( - "Global", - "SeriesNumb", - "0", - OptionsValidator(["0", "6", "5", "4", "3", "2", "1", "-1"]), - ) - self.Global_GameId = ConfigItem("Global", "GameId", "-") - self.Global_GameId_1 = ConfigItem("Global", "GameId_1", "-") - self.Global_GameId_2 = ConfigItem("Global", "GameId_2", "-") - self.Global_GameId_Remain = ConfigItem("Global", "GameId_Remain", "-") + self.config_item_dict: dict[str, Dict[str, ConfigItem]] = {} - self.Monday_MedicineNumb = ConfigItem( - "Monday", "MedicineNumb", 0, RangeValidator(0, 1024) - ) - self.Monday_SeriesNumb = OptionsConfigItem( + for group in [ + "ALL", "Monday", - "SeriesNumb", - "0", - OptionsValidator(["0", "6", "5", "4", "3", "2", "1", "-1"]), - ) - self.Monday_GameId = ConfigItem("Monday", "GameId", "-") - self.Monday_GameId_1 = ConfigItem("Monday", "GameId_1", "-") - self.Monday_GameId_2 = ConfigItem("Monday", "GameId_2", "-") - self.Monday_GameId_Remain = ConfigItem("Monday", "GameId_Remain", "-") - - self.Tuesday_MedicineNumb = ConfigItem( - "Tuesday", "MedicineNumb", 0, RangeValidator(0, 1024) - ) - self.Tuesday_SeriesNumb = OptionsConfigItem( "Tuesday", - "SeriesNumb", - "0", - OptionsValidator(["0", "6", "5", "4", "3", "2", "1", "-1"]), - ) - self.Tuesday_GameId = ConfigItem("Tuesday", "GameId", "-") - self.Tuesday_GameId_1 = ConfigItem("Tuesday", "GameId_1", "-") - self.Tuesday_GameId_2 = ConfigItem("Tuesday", "GameId_2", "-") - self.Tuesday_GameId_Remain = ConfigItem("Tuesday", "GameId_Remain", "-") - - self.Wednesday_MedicineNumb = ConfigItem( - "Wednesday", "MedicineNumb", 0, RangeValidator(0, 1024) - ) - self.Wednesday_SeriesNumb = OptionsConfigItem( "Wednesday", - "SeriesNumb", - "0", - OptionsValidator(["0", "6", "5", "4", "3", "2", "1", "-1"]), - ) - self.Wednesday_GameId = ConfigItem("Wednesday", "GameId", "-") - self.Wednesday_GameId_1 = ConfigItem("Wednesday", "GameId_1", "-") - self.Wednesday_GameId_2 = ConfigItem("Wednesday", "GameId_2", "-") - self.Wednesday_GameId_Remain = ConfigItem("Wednesday", "GameId_Remain", "-") - - self.Thursday_MedicineNumb = ConfigItem( - "Thursday", "MedicineNumb", 0, RangeValidator(0, 1024) - ) - self.Thursday_SeriesNumb = OptionsConfigItem( "Thursday", - "SeriesNumb", - "0", - OptionsValidator(["0", "6", "5", "4", "3", "2", "1", "-1"]), - ) - self.Thursday_GameId = ConfigItem("Thursday", "GameId", "-") - self.Thursday_GameId_1 = ConfigItem("Thursday", "GameId_1", "-") - self.Thursday_GameId_2 = ConfigItem("Thursday", "GameId_2", "-") - self.Thursday_GameId_Remain = ConfigItem("Thursday", "GameId_Remain", "-") - - self.Friday_MedicineNumb = ConfigItem( - "Friday", "MedicineNumb", 0, RangeValidator(0, 1024) - ) - self.Friday_SeriesNumb = OptionsConfigItem( "Friday", - "SeriesNumb", - "0", - OptionsValidator(["0", "6", "5", "4", "3", "2", "1", "-1"]), - ) - self.Friday_GameId = ConfigItem("Friday", "GameId", "-") - self.Friday_GameId_1 = ConfigItem("Friday", "GameId_1", "-") - self.Friday_GameId_2 = ConfigItem("Friday", "GameId_2", "-") - self.Friday_GameId_Remain = ConfigItem("Friday", "GameId_Remain", "-") - - self.Saturday_MedicineNumb = ConfigItem( - "Saturday", "MedicineNumb", 0, RangeValidator(0, 1024) - ) - self.Saturday_SeriesNumb = OptionsConfigItem( "Saturday", - "SeriesNumb", - "0", - OptionsValidator(["0", "6", "5", "4", "3", "2", "1", "-1"]), - ) - self.Saturday_GameId = ConfigItem("Saturday", "GameId", "-") - self.Saturday_GameId_1 = ConfigItem("Saturday", "GameId_1", "-") - self.Saturday_GameId_2 = ConfigItem("Saturday", "GameId_2", "-") - self.Saturday_GameId_Remain = ConfigItem("Saturday", "GameId_Remain", "-") - - self.Sunday_MedicineNumb = ConfigItem( - "Sunday", "MedicineNumb", 0, RangeValidator(0, 1024) - ) - self.Sunday_SeriesNumb = OptionsConfigItem( "Sunday", - "SeriesNumb", - "0", - OptionsValidator(["0", "6", "5", "4", "3", "2", "1", "-1"]), - ) - self.Sunday_GameId = ConfigItem("Sunday", "GameId", "-") - self.Sunday_GameId_1 = ConfigItem("Sunday", "GameId_1", "-") - self.Sunday_GameId_2 = ConfigItem("Sunday", "GameId_2", "-") - self.Sunday_GameId_Remain = ConfigItem("Sunday", "GameId_Remain", "-") + ]: + self.config_item_dict[group] = {} + + self.config_item_dict[group]["MedicineNumb"] = ConfigItem( + group, "MedicineNumb", 0, RangeValidator(0, 1024) + ) + self.config_item_dict[group]["SeriesNumb"] = OptionsConfigItem( + group, + "SeriesNumb", + "0", + OptionsValidator(["0", "6", "5", "4", "3", "2", "1", "-1"]), + ) + self.config_item_dict[group]["GameId"] = ConfigItem(group, "GameId", "-") + self.config_item_dict[group]["GameId_1"] = ConfigItem( + group, "GameId_1", "-" + ) + self.config_item_dict[group]["GameId_2"] = ConfigItem( + group, "GameId_2", "-" + ) + self.config_item_dict[group]["GameId_Remain"] = ConfigItem( + group, "GameId_Remain", "-" + ) + + for name in [ + "MedicineNumb", + "SeriesNumb", + "GameId", + "GameId_1", + "GameId_2", + "GameId_Remain", + ]: + setattr(self, f"{group}_{name}", self.config_item_dict[group][name]) class AppConfig(GlobalConfig): @@ -610,7 +543,13 @@ class AppConfig(GlobalConfig): self.silence_list = [] self.gameid_dict = { "ALL": {"value": [], "text": []}, - "Today": {"value": [], "text": []}, + "Monday": {"value": [], "text": []}, + "Tuesday": {"value": [], "text": []}, + "Wednesday": {"value": [], "text": []}, + "Thursday": {"value": [], "text": []}, + "Friday": {"value": [], "text": []}, + "Saturday": {"value": [], "text": []}, + "Sunday": {"value": [], "text": []}, } self.power_sign = "NoAction" self.if_ignore_silence = False @@ -732,39 +671,42 @@ class AppConfig(GlobalConfig): "近/特芯片组", ] - # 生成本日关卡信息 - days = self.server_date().isoweekday() + # # 生成本日关卡信息 + # days = self.server_date().isoweekday() - gameid_list = [ - {"value": "-", "text": "当前/上次", "days": [1, 2, 3, 4, 5, 6, 7]}, - {"value": "1-7", "text": "1-7", "days": [1, 2, 3, 4, 5, 6, 7]}, - {"value": "R8-11", "text": "R8-11", "days": [1, 2, 3, 4, 5, 6, 7]}, - { - "value": "12-17-HARD", - "text": "12-17-HARD", - "days": [1, 2, 3, 4, 5, 6, 7], - }, - {"value": "CE-6", "text": "龙门币-6/5", "days": [2, 4, 6, 7]}, - {"value": "AP-5", "text": "红票-5", "days": [1, 4, 6, 7]}, - {"value": "CA-5", "text": "技能-5", "days": [2, 3, 5, 7]}, - {"value": "LS-6", "text": "经验-6/5", "days": [1, 2, 3, 4, 5, 6, 7]}, - {"value": "SK-5", "text": "碳-5", "days": [1, 3, 5, 6]}, - {"value": "PR-A-1", "text": "奶/盾芯片", "days": [1, 4, 5, 7]}, - {"value": "PR-A-2", "text": "奶/盾芯片组", "days": [1, 4, 5, 7]}, - {"value": "PR-B-1", "text": "术/狙芯片", "days": [1, 2, 5, 6]}, - {"value": "PR-B-2", "text": "术/狙芯片组", "days": [1, 2, 5, 6]}, - {"value": "PR-C-1", "text": "先/辅芯片", "days": [3, 4, 6, 7]}, - {"value": "PR-C-2", "text": "先/辅芯片组", "days": [3, 4, 6, 7]}, - {"value": "PR-D-1", "text": "近/特芯片", "days": [2, 3, 6, 7]}, - {"value": "PR-D-2", "text": "近/特芯片组", "days": [2, 3, 6, 7]}, - ] + # 生成每日关卡信息 + for day in range(1, 8): - for gameid_info in gameid_list: - if days in gameid_info["days"]: - gameid_dict["value"].append(gameid_info["value"]) - gameid_dict["text"].append(gameid_info["text"]) + gameid_list = [ + {"value": "-", "text": "当前/上次", "days": [1, 2, 3, 4, 5, 6, 7]}, + {"value": "1-7", "text": "1-7", "days": [1, 2, 3, 4, 5, 6, 7]}, + {"value": "R8-11", "text": "R8-11", "days": [1, 2, 3, 4, 5, 6, 7]}, + { + "value": "12-17-HARD", + "text": "12-17-HARD", + "days": [1, 2, 3, 4, 5, 6, 7], + }, + {"value": "CE-6", "text": "龙门币-6/5", "days": [2, 4, 6, 7]}, + {"value": "AP-5", "text": "红票-5", "days": [1, 4, 6, 7]}, + {"value": "CA-5", "text": "技能-5", "days": [2, 3, 5, 7]}, + {"value": "LS-6", "text": "经验-6/5", "days": [1, 2, 3, 4, 5, 6, 7]}, + {"value": "SK-5", "text": "碳-5", "days": [1, 3, 5, 6]}, + {"value": "PR-A-1", "text": "奶/盾芯片", "days": [1, 4, 5, 7]}, + {"value": "PR-A-2", "text": "奶/盾芯片组", "days": [1, 4, 5, 7]}, + {"value": "PR-B-1", "text": "术/狙芯片", "days": [1, 2, 5, 6]}, + {"value": "PR-B-2", "text": "术/狙芯片组", "days": [1, 2, 5, 6]}, + {"value": "PR-C-1", "text": "先/辅芯片", "days": [3, 4, 6, 7]}, + {"value": "PR-C-2", "text": "先/辅芯片组", "days": [3, 4, 6, 7]}, + {"value": "PR-D-1", "text": "近/特芯片", "days": [2, 3, 6, 7]}, + {"value": "PR-D-2", "text": "近/特芯片组", "days": [2, 3, 6, 7]}, + ] - self.gameid_dict["Today"] = gameid_dict + for gameid_info in gameid_list: + if day in gameid_info["days"]: + gameid_dict["value"].append(gameid_info["value"]) + gameid_dict["text"].append(gameid_info["text"]) + + self.gameid_dict[calendar.day_name[day - 1]] = gameid_dict self.gameid_refreshed.emit() @@ -1207,7 +1149,7 @@ class AppConfig(GlobalConfig): maa_plan_config.load(maa_plan_dir / "config.json", maa_plan_config) maa_plan_config.save() - self.member_dict[maa_plan_dir.name] = { + self.plan_dict[maa_plan_dir.name] = { "Type": "Maa", "Path": maa_plan_dir, "Config": maa_plan_config, @@ -1264,6 +1206,16 @@ class AppConfig(GlobalConfig): if queue["Config"].get(queue["Config"].queue_Member_10) == old: queue["Config"].set(queue["Config"].queue_Member_10, new) + def change_plan(self, old: str, new: str) -> None: + """修改脚本管理所有下属用户的计划表配置参数""" + + for member in self.member_dict.values(): + + for user in member["UserData"].values(): + + if user["Config"].get(user["Config"].Info_GameIdMode) == old: + user["Config"].set(user["Config"].Info_GameIdMode, new) + def change_user_info( self, name: str, user_data: Dict[str, Dict[str, Union[str, Path, dict]]] ) -> None: diff --git a/app/ui/Widget.py b/app/ui/Widget.py index 4aa98be..e308046 100644 --- a/app/ui/Widget.py +++ b/app/ui/Widget.py @@ -1065,6 +1065,190 @@ class StatusSwitchSetting(SwitchButton): self.setChecked(isChecked) +class ComboBoxSetting(ComboBox): + + def __init__( + self, + texts: List[str], + qconfig: QConfig, + configItem: OptionsConfigItem, + parent=None, + ): + + super().__init__(parent) + self.qconfig = qconfig + self.configItem = configItem + + self.optionToText = {o: t for o, t in zip(configItem.options, texts)} + for text, option in zip(texts, configItem.options): + self.addItem(text, userData=option) + + self.setCurrentText(self.optionToText[self.qconfig.get(configItem)]) + self.currentIndexChanged.connect(self._onCurrentIndexChanged) + configItem.valueChanged.connect(self.setValue) + + def _onCurrentIndexChanged(self, index: int): + + self.qconfig.set(self.configItem, self.itemData(index)) + + def setValue(self, value): + if value not in self.optionToText: + return + + self.setCurrentText(self.optionToText[value]) + self.qconfig.set(self.configItem, value) + + +class NoOptionComboBoxSetting(ComboBox): + + def __init__( + self, + value: List[str], + texts: List[str], + qconfig: QConfig, + configItem: OptionsConfigItem, + parent=None, + ): + + super().__init__(parent) + self.qconfig = qconfig + self.configItem = configItem + + self.optionToText = {o: t for o, t in zip(value, texts)} + for text, option in zip(texts, value): + self.addItem(text, userData=option) + + self.setCurrentText(self.optionToText[self.qconfig.get(configItem)]) + self.currentIndexChanged.connect(self._onCurrentIndexChanged) + configItem.valueChanged.connect(self.setValue) + + def _onCurrentIndexChanged(self, index: int): + + self.qconfig.set(self.configItem, self.itemData(index)) + + def setValue(self, value): + if value not in self.optionToText: + return + + self.setCurrentText(self.optionToText[value]) + self.qconfig.set(self.configItem, value) + + def reLoadOptions(self, value: List[str], texts: List[str]): + + self.currentIndexChanged.disconnect() + self.clear() + self.optionToText = {o: t for o, t in zip(value, texts)} + for text, option in zip(texts, value): + self.addItem(text, userData=option) + self.setCurrentText(self.optionToText[self.qconfig.get(self.configItem)]) + self.currentIndexChanged.connect(self._onCurrentIndexChanged) + + +class EditableComboBoxSetting(EditableComboBox): + + def __init__( + self, + value: List[str], + texts: List[str], + qconfig: QConfig, + configItem: OptionsConfigItem, + parent=None, + ): + + super().__init__(parent) + self.qconfig = qconfig + self.configItem = configItem + + self.optionToText = {o: t for o, t in zip(value, texts)} + for text, option in zip(texts, value): + self.addItem(text, userData=option) + + if qconfig.get(configItem) not in self.optionToText: + self.optionToText[qconfig.get(configItem)] = qconfig.get(configItem) + self.addItem(qconfig.get(configItem), userData=qconfig.get(configItem)) + + self.setCurrentText(self.optionToText[qconfig.get(configItem)]) + self.currentIndexChanged.connect(self._onCurrentIndexChanged) + configItem.valueChanged.connect(self.setValue) + + def _onCurrentIndexChanged(self, index: int): + + self.qconfig.set( + self.configItem, + (self.itemData(index) if self.itemData(index) else self.itemText(index)), + ) + + def setValue(self, value): + if value not in self.optionToText: + self.optionToText[value] = value + if self.findText(value) == -1: + self.addItem(value, userData=value) + else: + self.setItemData(self.findText(value), value) + + self.setCurrentText(self.optionToText[value]) + self.qconfig.set(self.configItem, value) + + def reLoadOptions(self, value: List[str], texts: List[str]): + + self.currentIndexChanged.disconnect() + self.clear() + self.optionToText = {o: t for o, t in zip(value, texts)} + for text, option in zip(texts, value): + self.addItem(text, userData=option) + if self.qconfig.get(self.configItem) not in self.optionToText: + self.optionToText[self.qconfig.get(self.configItem)] = self.qconfig.get( + self.configItem + ) + self.addItem( + self.qconfig.get(self.configItem), + userData=self.qconfig.get(self.configItem), + ) + self.setCurrentText(self.optionToText[self.qconfig.get(self.configItem)]) + self.currentIndexChanged.connect(self._onCurrentIndexChanged) + + def _onReturnPressed(self): + if not self.text(): + return + + index = self.findText(self.text()) + if index >= 0 and index != self.currentIndex(): + self._currentIndex = index + self.currentIndexChanged.emit(index) + elif index == -1: + self.addItem(self.text()) + self.setCurrentIndex(self.count() - 1) + self.currentIndexChanged.emit(self.count() - 1) + + +class SpinBoxSetting(SpinBox): + + def __init__( + self, + range: tuple[int, int], + qconfig: QConfig, + configItem: ConfigItem, + parent=None, + ): + + super().__init__(parent) + self.qconfig = qconfig + self.configItem = configItem + self.setRange(range[0], range[1]) + + if configItem: + self.set_value(qconfig.get(configItem)) + configItem.valueChanged.connect(self.set_value) + + self.valueChanged.connect(self.set_value) + + def set_value(self, value: int): + if self.configItem: + self.qconfig.set(self.configItem, value) + + self.setValue(value) + + class HistoryCard(HeaderCardWidget): def __init__(self, qconfig: QConfig, configItem: ConfigItem, parent=None): @@ -1184,9 +1368,7 @@ class UrlListSettingCard(ExpandSettingCard): """show confirm dialog""" choice = MessageBox( - "确认", - f"确定要删除 {item.url} 代理网址吗?", - self.window(), + "确认", f"确定要删除 {item.url} 代理网址吗?", self.window() ) if choice.exec(): self.__removeUrl(item) diff --git a/app/ui/main_window.py b/app/ui/main_window.py index 1f31457..9fc9a69 100644 --- a/app/ui/main_window.py +++ b/app/ui/main_window.py @@ -49,6 +49,7 @@ from app.core import Config, TaskManager, MainTimer, MainInfoBar from app.services import Notify, Crypto, System from .home import Home from .member_manager import MemberManager +from .plan_manager import PlanManager from .queue_manager import QueueManager from .dispatch_center import DispatchCenter from .history import History @@ -81,6 +82,7 @@ class AUTO_MAA(MSFluentWindow): # 创建主窗口 self.home = Home(self) self.member_manager = MemberManager(self) + self.plan_manager = PlanManager(self) self.queue_manager = QueueManager(self) self.dispatch_center = DispatchCenter(self) self.history = History(self) @@ -100,6 +102,13 @@ class AUTO_MAA(MSFluentWindow): FluentIcon.ROBOT, NavigationItemPosition.TOP, ) + self.addSubInterface( + self.plan_manager, + FluentIcon.CALENDAR, + "计划管理", + FluentIcon.CALENDAR, + NavigationItemPosition.TOP, + ) self.addSubInterface( self.queue_manager, FluentIcon.BOOK_SHELF, diff --git a/app/ui/member_manager.py b/app/ui/member_manager.py index 4e96e69..cf4e1d6 100644 --- a/app/ui/member_manager.py +++ b/app/ui/member_manager.py @@ -197,11 +197,7 @@ class MemberManager(QWidget): ) return None - choice = MessageBox( - "确认", - f"确定要删除 {name} 实例吗?", - self.window(), - ) + choice = MessageBox("确认", f"确定要删除 {name} 实例吗?", self.window()) if choice.exec(): self.member_manager.clear_SettingBox() @@ -866,9 +862,7 @@ class MemberManager(QWidget): return None choice = MessageBox( - "确认", - f"确定要删除 {name} 吗?", - self.window(), + "确认", f"确定要删除 {name} 吗?", self.window() ) if choice.exec(): diff --git a/app/ui/plan_manager.py b/app/ui/plan_manager.py index b0fab53..f236b88 100644 --- a/app/ui/plan_manager.py +++ b/app/ui/plan_manager.py @@ -28,49 +28,28 @@ v4.3 from loguru import logger from PySide6.QtWidgets import ( QWidget, - QFileDialog, - QHBoxLayout, QVBoxLayout, QStackedWidget, - QTableWidgetItem, QHeaderView, ) -from PySide6.QtGui import QIcon from qfluentwidgets import ( Action, - ScrollArea, FluentIcon, MessageBox, HeaderCardWidget, CommandBar, - ExpandGroupSettingCard, - PushSettingCard, TableWidget, - PrimaryToolButton, ) -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, MaaPlanConfig, Network +from app.core import Config, MainInfoBar, MaaPlanConfig from app.services import Crypto -from .downloader import DownloadManager from .Widget import ( - LineEditMessageBox, - LineEditSettingCard, - SpinBoxSettingCard, ComboBoxMessageBox, - EditableComboBoxSettingCard, - PasswordLineEditSettingCard, - UserLableSettingCard, - ComboBoxSettingCard, - SwitchSettingCard, - PushAndSwitchButtonSettingCard, - PushAndComboBoxSettingCard, + SpinBoxSetting, + EditableComboBoxSetting, + ComboBoxSetting, PivotArea, ) @@ -142,7 +121,7 @@ class PlanManager(QWidget): "Config": maa_plan_config, } - self.plan_manager.add_MaaSettingBox(index) + self.plan_manager.add_MaaPlanSettingBox(index) self.plan_manager.switch_SettingBox(index) logger.success(f"计划管理 计划_{index} 添加成功") @@ -169,11 +148,7 @@ class PlanManager(QWidget): ) return None - choice = MessageBox( - "确认", - f"确定要删除 {name} 吗?", - self.window(), - ) + choice = MessageBox("确认", f"确定要删除 {name} 吗?", self.window()) if choice.exec(): self.plan_manager.clear_SettingBox() @@ -185,7 +160,7 @@ class PlanManager(QWidget): Config.plan_dict[f"计划_{i}"]["Path"].rename( Config.plan_dict[f"计划_{i}"]["Path"].with_name(f"计划_{i-1}") ) - Config.change_queue(f"计划_{i}", f"计划_{i-1}") + Config.change_plan(f"计划_{i}", f"计划_{i-1}") self.plan_manager.show_SettingBox(max(int(name[3:]) - 1, 1)) @@ -225,15 +200,15 @@ class PlanManager(QWidget): Config.plan_dict[name]["Path"].rename( Config.plan_dict[name]["Path"].with_name("计划_0") ) - Config.change_queue(name, "计划_0") + Config.change_plan(name, "计划_0") Config.plan_dict[f"计划_{index-1}"]["Path"].rename( Config.plan_dict[name]["Path"] ) - Config.change_queue(f"计划_{index-1}", name) + Config.change_plan(f"计划_{index-1}", name) Config.plan_dict[name]["Path"].with_name("计划_0").rename( Config.plan_dict[f"计划_{index-1}"]["Path"] ) - Config.change_queue("计划_0", f"计划_{index-1}") + Config.change_plan("计划_0", f"计划_{index-1}") self.plan_manager.show_SettingBox(index - 1) @@ -273,27 +248,21 @@ class PlanManager(QWidget): Config.plan_dict[name]["Path"].rename( Config.plan_dict[name]["Path"].with_name("计划_0") ) - Config.change_queue(name, "计划_0") + Config.change_plan(name, "计划_0") Config.plan_dict[f"计划_{index+1}"]["Path"].rename( Config.plan_dict[name]["Path"] ) - Config.change_queue(f"计划_{index+1}", name) + Config.change_plan(f"计划_{index+1}", name) Config.plan_dict[name]["Path"].with_name("计划_0").rename( Config.plan_dict[f"计划_{index+1}"]["Path"] ) - Config.change_queue("计划_0", f"计划_{index+1}") + Config.change_plan("计划_0", f"计划_{index+1}") self.plan_manager.show_SettingBox(index + 1) logger.success(f"计划表 {name} 右移成功") MainInfoBar.push_info_bar("success", "操作成功", f"右移计划表 {name}", 3000) - def refresh_dashboard(self): - """刷新所有计划表的用户仪表盘""" - - for script in self.plan_manager.script_list: - script.user_setting.user_manager.user_dashboard.load_info() - class PlanSettingBox(QWidget): """计划管理子页面组""" @@ -331,7 +300,7 @@ class PlanManager(QWidget): for name, info in Config.plan_dict.items(): if info["Type"] == "Maa": - self.add_MaaSettingBox(int(name[3:])) + self.add_MaaPlanSettingBox(int(name[3:])) self.switch_SettingBox(index) @@ -378,20 +347,23 @@ class PlanManager(QWidget): self.config = Config.plan_dict[f"计划_{uid}"]["Config"] self.dashboard = TableWidget(self) - self.dashboard.setColumnCount(11) + self.dashboard.setColumnCount(8) + self.dashboard.setRowCount(6) self.dashboard.setHorizontalHeaderLabels( + ["全局", "周一", "周二", "周三", "周四", "周五", "周六", "周日"] + ) + self.dashboard.setVerticalHeaderLabels( [ "吃理智药", "连战次数", "关卡选择", - "备选关卡 - 1", - "备选关卡 - 2", - "剩余理智关卡", + "备选 - 1", + "备选 - 2", + "剩余理智", ] ) self.dashboard.setEditTriggers(TableWidget.NoEditTriggers) - self.dashboard.verticalHeader().setVisible(False) - for col in range(6): + for col in range(8): self.dashboard.horizontalHeader().setSectionResizeMode( col, QHeaderView.ResizeMode.Stretch ) @@ -399,143 +371,33 @@ class PlanManager(QWidget): self.viewLayout.addWidget(self.dashboard) self.viewLayout.setContentsMargins(3, 0, 3, 3) - Config.PASSWORD_refreshed.connect(self.load_info) + for col, (group, name_dict) in enumerate( + self.config.config_item_dict.items() + ): - def load_info(self): + for row, (name, configItem) in enumerate(name_dict.items()): - self.user_data = Config.plan_dict[self.name]["UserData"] - - self.dashboard.setRowCount(len(self.user_data)) - - for name, info in self.user_data.items(): - - config = info["Config"] - - text_list = [] - if not config.get(config.Data_IfPassCheck): - text_list.append("未通过人工排查") - text_list.append( - f"今日已代理{config.get(config.Data_ProxyTimes)}次" - if Config.server_date().strftime("%Y-%m-%d") - == config.get(config.Data_LastProxyDate) - else "今日未进行代理" - ) - text_list.append( - "本周剿灭已完成" - if datetime.strptime( - config.get(config.Data_LastAnnihilationDate), - "%Y-%m-%d", - ).isocalendar()[:2] - == Config.server_date().isocalendar()[:2] - else "本周剿灭未完成" - ) - - button = PrimaryToolButton(FluentIcon.CHEVRON_RIGHT, self) - button.setFixedSize(32, 32) - button.clicked.connect(partial(self.switch_to.emit, name)) - - self.dashboard.setItem( - int(name[3:]) - 1, - 0, - QTableWidgetItem(config.get(config.Info_Name)), - ) - self.dashboard.setItem( - int(name[3:]) - 1, - 1, - QTableWidgetItem(config.get(config.Info_Id)), - ) - self.dashboard.setItem( - int(name[3:]) - 1, - 2, - QTableWidgetItem( - Crypto.AUTO_decryptor( - config.get(config.Info_Password), - Config.PASSWORD, + if name == "MedicineNumb": + setting_item = SpinBoxSetting( + range=(0, 1024), + qconfig=self.config, + configItem=configItem, + parent=self, ) - if Config.PASSWORD - else "******" - ), - ) - self.dashboard.setItem( - int(name[3:]) - 1, - 3, - QTableWidgetItem( - "启用" - if config.get(config.Info_Status) - and config.get(config.Info_RemainedDay) != 0 - else "禁用" - ), - ) - self.dashboard.setItem( - int(name[3:]) - 1, - 4, - QTableWidgetItem(" | ".join(text_list)), - ) - self.dashboard.setItem( - int(name[3:]) - 1, - 5, - QTableWidgetItem(str(config.get(config.Info_MedicineNumb))), - ) - self.dashboard.setItem( - int(name[3:]) - 1, - 6, - QTableWidgetItem( - Config.gameid_dict["ALL"]["text"][ - Config.gameid_dict["ALL"]["value"].index( - config.get(config.Info_GameId) - ) - ] - if config.get(config.Info_GameId) - in Config.gameid_dict["ALL"]["value"] - else config.get(config.Info_GameId) - ), - ) - self.dashboard.setItem( - int(name[3:]) - 1, - 7, - QTableWidgetItem( - Config.gameid_dict["ALL"]["text"][ - Config.gameid_dict["ALL"]["value"].index( - config.get(config.Info_GameId_1) - ) - ] - if config.get(config.Info_GameId_1) - in Config.gameid_dict["ALL"]["value"] - else config.get(config.Info_GameId_1) - ), - ) - self.dashboard.setItem( - int(name[3:]) - 1, - 8, - QTableWidgetItem( - Config.gameid_dict["ALL"]["text"][ - Config.gameid_dict["ALL"]["value"].index( - config.get(config.Info_GameId_2) - ) - ] - if config.get(config.Info_GameId_2) - in Config.gameid_dict["ALL"]["value"] - else config.get(config.Info_GameId_2) - ), - ) - self.dashboard.setItem( - int(name[3:]) - 1, - 9, - QTableWidgetItem( - "不使用" - if config.get(config.Info_GameId_Remain) == "-" - else ( - ( - Config.gameid_dict["ALL"]["text"][ - Config.gameid_dict["ALL"]["value"].index( - config.get(config.Info_GameId_Remain) - ) - ] - ) - if config.get(config.Info_GameId_Remain) - in Config.gameid_dict["ALL"]["value"] - else config.get(config.Info_GameId_Remain) + elif name == "SeriesNumb": + setting_item = ComboBoxSetting( + texts=["AUTO", "6", "5", "4", "3", "2", "1", "不选择"], + qconfig=self.config, + configItem=configItem, + parent=self, ) - ), - ) - self.dashboard.setCellWidget(int(name[3:]) - 1, 10, button) + elif "GameId" in name: + setting_item = EditableComboBoxSetting( + value=Config.gameid_dict[group]["value"], + texts=Config.gameid_dict[group]["text"], + qconfig=self.config, + configItem=configItem, + parent=self, + ) + + self.dashboard.setCellWidget(row, col, setting_item) diff --git a/app/ui/queue_manager.py b/app/ui/queue_manager.py index a8ff7a4..5120167 100644 --- a/app/ui/queue_manager.py +++ b/app/ui/queue_manager.py @@ -136,11 +136,7 @@ class QueueManager(QWidget): ) return None - choice = MessageBox( - "确认", - f"确定要删除 {name} 吗?", - self.window(), - ) + choice = MessageBox("确认", f"确定要删除 {name} 吗?", self.window()) if choice.exec(): self.queue_manager.clear_SettingBox() diff --git a/app/ui/setting.py b/app/ui/setting.py index 2f2be41..e26ead3 100644 --- a/app/ui/setting.py +++ b/app/ui/setting.py @@ -252,9 +252,7 @@ class Setting(QWidget): choice.exec() else: choice = MessageBox( - "确认", - "您没有输入管理密钥,是否取消修改管理密钥?", - self.window(), + "确认", "您没有输入管理密钥,是否取消修改管理密钥?", self.window() ) if choice.exec(): break From de1058a28c25b9cde2c08b9f8d47799f2e2afba2 Mon Sep 17 00:00:00 2001 From: DLmaster361 Date: Sun, 25 May 2025 21:12:22 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat(core):=20=E8=AE=A1=E5=88=92=E8=A1=A8?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=B8=8A=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/config.py | 157 +++++++++++++------------ app/models/MAA.py | 3 + app/services/notification.py | 6 +- app/ui/Widget.py | 183 +++++++++++++++++++++++++++-- app/ui/main_window.py | 215 +++++++++++++++++------------------ app/ui/member_manager.py | 194 +++++++++++++++++++++++-------- app/ui/plan_manager.py | 128 ++++++++++++++++++--- app/ui/queue_manager.py | 6 +- resources/version.json | 5 +- 9 files changed, 626 insertions(+), 271 deletions(-) diff --git a/app/core/config.py b/app/core/config.py index 6070b52..c27f409 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -388,9 +388,7 @@ class MaaUserConfig(LQConfig): self.Info_Mode = OptionsConfigItem( "Info", "Mode", "简洁", OptionsValidator(["简洁", "详细"]) ) - self.Info_GameIdMode = OptionsConfigItem( - "Info", "GameIdMode", "固定", OptionsValidator(["固定"]) - ) + self.Info_GameIdMode = ConfigItem("Info", "GameIdMode", "固定") self.Info_Server = OptionsConfigItem( "Info", "Server", "Official", OptionsValidator(["Official", "Bilibili"]) ) @@ -461,6 +459,29 @@ class MaaUserConfig(LQConfig): "Notify", "CompanyWebHookBotUrl", "" ) + def get_plan_info(self) -> Dict[str, Union[str, int]]: + """获取当前的计划下信息""" + + if self.get(self.Info_GameIdMode) == "固定": + return { + "MedicineNumb": self.get(self.Info_MedicineNumb), + "SeriesNumb": self.get(self.Info_SeriesNumb), + "GameId": self.get(self.Info_GameId), + "GameId_1": self.get(self.Info_GameId_1), + "GameId_2": self.get(self.Info_GameId_2), + "GameId_Remain": self.get(self.Info_GameId_Remain), + } + elif "计划" in self.get(self.Info_GameIdMode): + plan = Config.plan_dict[self.get(self.Info_GameIdMode)]["Config"] + return { + "MedicineNumb": plan.get(plan.get_current_info("MedicineNumb")), + "SeriesNumb": plan.get(plan.get_current_info("SeriesNumb")), + "GameId": plan.get(plan.get_current_info("GameId")), + "GameId_1": plan.get(plan.get_current_info("GameId_1")), + "GameId_2": plan.get(plan.get_current_info("GameId_2")), + "GameId_Remain": plan.get(plan.get_current_info("GameId_Remain")), + } + class MaaPlanConfig(LQConfig): """MAA计划表配置""" @@ -468,7 +489,10 @@ class MaaPlanConfig(LQConfig): def __init__(self) -> None: super().__init__() - self.Info_Name = ConfigItem("Info", "Name", "新表格") + self.Info_Name = ConfigItem("Info", "Name", "") + self.Info_Mode = OptionsConfigItem( + "Info", "Mode", "ALL", OptionsValidator(["ALL", "Weekly"]) + ) self.config_item_dict: dict[str, Dict[str, ConfigItem]] = {} @@ -514,6 +538,18 @@ class MaaPlanConfig(LQConfig): ]: setattr(self, f"{group}_{name}", self.config_item_dict[group][name]) + def get_current_info(self, name: str) -> ConfigItem: + """获取当前的计划表配置项""" + + if self.get(self.Info_Mode) == "ALL": + return self.config_item_dict["ALL"][name] + elif self.get(self.Info_Mode) == "Weekly": + today = datetime.now().strftime("%A") + if today in self.config_item_dict: + return self.config_item_dict[today][name] + else: + return self.config_item_dict["ALL"][name] + class AppConfig(GlobalConfig): @@ -615,7 +651,7 @@ class AppConfig(GlobalConfig): logger.warning(f"无法从MAA服务器获取活动关卡信息:{Network.error_message}") gameid_infos = [] - gameid_dict = {"value": [], "text": []} + ss_gameid_dict = {"value": [], "text": []} for gameid_info in gameid_infos: @@ -628,85 +664,48 @@ class AppConfig(GlobalConfig): gameid_info["Activity"]["UtcExpireTime"], "%Y/%m/%d %H:%M:%S" ) ): - gameid_dict["value"].append(gameid_info["Value"]) - gameid_dict["text"].append(gameid_info["Value"]) - - # 生成全部关卡信息 - self.gameid_dict["ALL"]["value"] = gameid_dict["value"] + [ - "-", - "1-7", - "R8-11", - "12-17-HARD", - "CE-6", - "AP-5", - "CA-5", - "LS-6", - "SK-5", - "PR-A-1", - "PR-A-2", - "PR-B-1", - "PR-B-2", - "PR-C-1", - "PR-C-2", - "PR-D-1", - "PR-D-2", - ] - self.gameid_dict["ALL"]["text"] = gameid_dict["text"] + [ - "当前/上次", - "1-7", - "R8-11", - "12-17-HARD", - "龙门币-6/5", - "红票-5", - "技能-5", - "经验-6/5", - "碳-5", - "奶/盾芯片", - "奶/盾芯片组", - "术/狙芯片", - "术/狙芯片组", - "先/辅芯片", - "先/辅芯片组", - "近/特芯片", - "近/特芯片组", - ] - - # # 生成本日关卡信息 - # days = self.server_date().isoweekday() + ss_gameid_dict["value"].append(gameid_info["Value"]) + ss_gameid_dict["text"].append(gameid_info["Value"]) # 生成每日关卡信息 - for day in range(1, 8): + gameid_daily_info = [ + {"value": "-", "text": "当前/上次", "days": [1, 2, 3, 4, 5, 6, 7]}, + {"value": "1-7", "text": "1-7", "days": [1, 2, 3, 4, 5, 6, 7]}, + {"value": "R8-11", "text": "R8-11", "days": [1, 2, 3, 4, 5, 6, 7]}, + { + "value": "12-17-HARD", + "text": "12-17-HARD", + "days": [1, 2, 3, 4, 5, 6, 7], + }, + {"value": "CE-6", "text": "龙门币-6/5", "days": [2, 4, 6, 7]}, + {"value": "AP-5", "text": "红票-5", "days": [1, 4, 6, 7]}, + {"value": "CA-5", "text": "技能-5", "days": [2, 3, 5, 7]}, + {"value": "LS-6", "text": "经验-6/5", "days": [1, 2, 3, 4, 5, 6, 7]}, + {"value": "SK-5", "text": "碳-5", "days": [1, 3, 5, 6]}, + {"value": "PR-A-1", "text": "奶/盾芯片", "days": [1, 4, 5, 7]}, + {"value": "PR-A-2", "text": "奶/盾芯片组", "days": [1, 4, 5, 7]}, + {"value": "PR-B-1", "text": "术/狙芯片", "days": [1, 2, 5, 6]}, + {"value": "PR-B-2", "text": "术/狙芯片组", "days": [1, 2, 5, 6]}, + {"value": "PR-C-1", "text": "先/辅芯片", "days": [3, 4, 6, 7]}, + {"value": "PR-C-2", "text": "先/辅芯片组", "days": [3, 4, 6, 7]}, + {"value": "PR-D-1", "text": "近/特芯片", "days": [2, 3, 6, 7]}, + {"value": "PR-D-2", "text": "近/特芯片组", "days": [2, 3, 6, 7]}, + ] - gameid_list = [ - {"value": "-", "text": "当前/上次", "days": [1, 2, 3, 4, 5, 6, 7]}, - {"value": "1-7", "text": "1-7", "days": [1, 2, 3, 4, 5, 6, 7]}, - {"value": "R8-11", "text": "R8-11", "days": [1, 2, 3, 4, 5, 6, 7]}, - { - "value": "12-17-HARD", - "text": "12-17-HARD", - "days": [1, 2, 3, 4, 5, 6, 7], - }, - {"value": "CE-6", "text": "龙门币-6/5", "days": [2, 4, 6, 7]}, - {"value": "AP-5", "text": "红票-5", "days": [1, 4, 6, 7]}, - {"value": "CA-5", "text": "技能-5", "days": [2, 3, 5, 7]}, - {"value": "LS-6", "text": "经验-6/5", "days": [1, 2, 3, 4, 5, 6, 7]}, - {"value": "SK-5", "text": "碳-5", "days": [1, 3, 5, 6]}, - {"value": "PR-A-1", "text": "奶/盾芯片", "days": [1, 4, 5, 7]}, - {"value": "PR-A-2", "text": "奶/盾芯片组", "days": [1, 4, 5, 7]}, - {"value": "PR-B-1", "text": "术/狙芯片", "days": [1, 2, 5, 6]}, - {"value": "PR-B-2", "text": "术/狙芯片组", "days": [1, 2, 5, 6]}, - {"value": "PR-C-1", "text": "先/辅芯片", "days": [3, 4, 6, 7]}, - {"value": "PR-C-2", "text": "先/辅芯片组", "days": [3, 4, 6, 7]}, - {"value": "PR-D-1", "text": "近/特芯片", "days": [2, 3, 6, 7]}, - {"value": "PR-D-2", "text": "近/特芯片组", "days": [2, 3, 6, 7]}, - ] + for day in range(0, 8): - for gameid_info in gameid_list: - if day in gameid_info["days"]: - gameid_dict["value"].append(gameid_info["value"]) - gameid_dict["text"].append(gameid_info["text"]) + today_gameid_dict = {"value": [], "text": []} - self.gameid_dict[calendar.day_name[day - 1]] = gameid_dict + for gameid_info in gameid_daily_info: + + if day in gameid_info["days"] or day == 0: + today_gameid_dict["value"].append(gameid_info["value"]) + today_gameid_dict["text"].append(gameid_info["text"]) + + self.gameid_dict[calendar.day_name[day - 1] if day > 0 else "ALL"] = { + "value": today_gameid_dict["value"] + ss_gameid_dict["value"], + "text": today_gameid_dict["text"] + ss_gameid_dict["text"], + } self.gameid_refreshed.emit() diff --git a/app/models/MAA.py b/app/models/MAA.py index 5b1ceef..edbef87 100644 --- a/app/models/MAA.py +++ b/app/models/MAA.py @@ -102,6 +102,9 @@ class MaaManager(QObject): "Path": info["Path"], "Config": info["Config"].toDict(), } + planed_info = info["Config"].get_plan_info() + for key, value in planed_info.items(): + self.data[name]["Config"]["Info"][key] = value self.data = dict(sorted(self.data.items(), key=lambda x: int(x[0][3:]))) diff --git a/app/services/notification.py b/app/services/notification.py index 4cb60bb..7d17545 100644 --- a/app/services/notification.py +++ b/app/services/notification.py @@ -254,7 +254,7 @@ class Notification(QWidget): self.push_info_bar.emit( "error", "企业微信群机器人通知推送失败", - f'使用企业微信群机器人推送通知时出错:{info["errmsg"]}', + f"使用企业微信群机器人推送通知时出错:{err}", -1, ) return None @@ -267,10 +267,10 @@ class Notification(QWidget): self.push_info_bar.emit( "error", "企业微信群机器人通知推送失败", - f'使用企业微信群机器人推送通知时出错:{info["errmsg"]}', + f"使用企业微信群机器人推送通知时出错:{err}", -1, ) - return f'使用企业微信群机器人推送通知时出错:{info["errmsg"]}' + return f"使用企业微信群机器人推送通知时出错:{err}" def send_test_notification(self): """发送测试通知到所有已启用的通知渠道""" diff --git a/app/ui/Widget.py b/app/ui/Widget.py index ea5f8d0..db85a2d 100644 --- a/app/ui/Widget.py +++ b/app/ui/Widget.py @@ -477,7 +477,7 @@ class LineEditSettingCard(SettingCard): def __textChanged(self, content: str): - self.configItem.valueChanged.disconnect() + self.configItem.valueChanged.disconnect(self.setValue) self.qconfig.set(self.configItem, content.strip()) self.configItem.valueChanged.connect(self.setValue) @@ -485,7 +485,7 @@ class LineEditSettingCard(SettingCard): def setValue(self, content: str): - self.LineEdit.textChanged.disconnect() + self.LineEdit.textChanged.disconnect(self.__textChanged) self.LineEdit.setText(content.strip()) self.LineEdit.textChanged.connect(self.__textChanged) @@ -527,7 +527,7 @@ class PasswordLineEditSettingCard(SettingCard): def __textChanged(self, content: str): - self.configItem.valueChanged.disconnect() + self.configItem.valueChanged.disconnect(self.setValue) if self.algorithm == "DPAPI": self.qconfig.set(self.configItem, Crypto.win_encryptor(content)) elif self.algorithm == "AUTO": @@ -538,7 +538,7 @@ class PasswordLineEditSettingCard(SettingCard): def setValue(self, content: str): - self.LineEdit.textChanged.disconnect() + self.LineEdit.textChanged.disconnect(self.__textChanged) if self.algorithm == "DPAPI": self.LineEdit.setText(Crypto.win_decryptor(content)) elif self.algorithm == "AUTO": @@ -756,7 +756,7 @@ class NoOptionComboBoxSettingCard(SettingCard): value: List[str], texts: List[str], qconfig: QConfig, - configItem: OptionsConfigItem, + configItem: ConfigItem, parent=None, ): @@ -789,7 +789,7 @@ class NoOptionComboBoxSettingCard(SettingCard): def reLoadOptions(self, value: List[str], texts: List[str]): - self.comboBox.currentIndexChanged.disconnect() + self.comboBox.currentIndexChanged.disconnect(self._onCurrentIndexChanged) self.comboBox.clear() self.optionToText = {o: t for o, t in zip(value, texts)} for text, option in zip(texts, value): @@ -811,7 +811,7 @@ class EditableComboBoxSettingCard(SettingCard): value: List[str], texts: List[str], qconfig: QConfig, - configItem: OptionsConfigItem, + configItem: ConfigItem, parent=None, ): @@ -861,7 +861,7 @@ class EditableComboBoxSettingCard(SettingCard): def reLoadOptions(self, value: List[str], texts: List[str]): - self.comboBox.currentIndexChanged.disconnect() + self.comboBox.currentIndexChanged.disconnect(self._onCurrentIndexChanged) self.comboBox.clear() self.optionToText = {o: t for o, t in zip(value, texts)} for text, option in zip(texts, value): @@ -899,6 +899,169 @@ class EditableComboBoxSettingCard(SettingCard): self.currentIndexChanged.emit(self.count() - 1) +class SpinBoxWithPlanSettingCard(SpinBoxSettingCard): + + textChanged = Signal(int) + + def __init__( + self, + icon: Union[str, QIcon, FluentIconBase], + title: str, + content: Union[str, None], + range: tuple[int, int], + qconfig: QConfig, + configItem: ConfigItem, + parent=None, + ): + + super().__init__(icon, title, content, range, qconfig, configItem, parent) + + self.configItem_plan = None + + self.LineEdit = LineEdit(self) + self.LineEdit.setMinimumWidth(150) + self.LineEdit.setReadOnly(True) + self.LineEdit.setVisible(False) + + self.hBoxLayout.insertWidget(5, self.LineEdit, 0, Qt.AlignRight) + + def setText(self, value: int) -> None: + self.LineEdit.setText(str(value)) + + def switch_mode(self, mode: str) -> None: + """切换模式""" + + if mode == "固定": + + self.LineEdit.setVisible(False) + self.SpinBox.setVisible(True) + + elif mode == "计划": + + self.SpinBox.setVisible(False) + self.LineEdit.setVisible(True) + + def change_plan(self, configItem_plan: ConfigItem) -> None: + """切换计划""" + + if self.configItem_plan is not None: + self.configItem_plan.valueChanged.disconnect(self.setText) + self.configItem_plan = configItem_plan + self.configItem_plan.valueChanged.connect(self.setText) + self.setText(self.qconfig.get(self.configItem_plan)) + + +class ComboBoxWithPlanSettingCard(ComboBoxSettingCard): + + def __init__( + self, + icon: Union[str, QIcon, FluentIconBase], + title: str, + content: Union[str, None], + texts: List[str], + qconfig: QConfig, + configItem: OptionsConfigItem, + parent=None, + ): + + super().__init__(icon, title, content, texts, qconfig, configItem, parent) + + self.configItem_plan = None + + self.LineEdit = LineEdit(self) + self.LineEdit.setMinimumWidth(150) + self.LineEdit.setReadOnly(True) + self.LineEdit.setVisible(False) + + self.hBoxLayout.insertWidget(5, self.LineEdit, 0, Qt.AlignRight) + + def setText(self, value: str) -> None: + + if value not in self.optionToText: + self.optionToText[value] = value + + self.LineEdit.setText(self.optionToText[value]) + + def switch_mode(self, mode: str) -> None: + """切换模式""" + + if mode == "固定": + + self.LineEdit.setVisible(False) + self.comboBox.setVisible(True) + + elif mode == "计划": + + self.comboBox.setVisible(False) + self.LineEdit.setVisible(True) + + def change_plan(self, configItem_plan: ConfigItem) -> None: + """切换计划""" + + if self.configItem_plan is not None: + self.configItem_plan.valueChanged.disconnect(self.setText) + self.configItem_plan = configItem_plan + self.configItem_plan.valueChanged.connect(self.setText) + self.setText(self.qconfig.get(self.configItem_plan)) + + +class EditableComboBoxWithPlanSettingCard(EditableComboBoxSettingCard): + + def __init__( + self, + icon: Union[str, QIcon, FluentIconBase], + title: str, + content: Union[str, None], + value: List[str], + texts: List[str], + qconfig: QConfig, + configItem: ConfigItem, + parent=None, + ): + + super().__init__( + icon, title, content, value, texts, qconfig, configItem, parent + ) + + self.configItem_plan = None + + self.LineEdit = LineEdit(self) + self.LineEdit.setMinimumWidth(150) + self.LineEdit.setReadOnly(True) + self.LineEdit.setVisible(False) + + self.hBoxLayout.insertWidget(5, self.LineEdit, 0, Qt.AlignRight) + + def setText(self, value: str) -> None: + + if value not in self.optionToText: + self.optionToText[value] = value + + self.LineEdit.setText(self.optionToText[value]) + + def switch_mode(self, mode: str) -> None: + """切换模式""" + + if mode == "固定": + + self.LineEdit.setVisible(False) + self.comboBox.setVisible(True) + + elif mode == "计划": + + self.comboBox.setVisible(False) + self.LineEdit.setVisible(True) + + def change_plan(self, configItem_plan: ConfigItem) -> None: + """切换计划""" + + if self.configItem_plan is not None: + self.configItem_plan.valueChanged.disconnect(self.setText) + self.configItem_plan = configItem_plan + self.configItem_plan.valueChanged.connect(self.setText) + self.setText(self.qconfig.get(self.configItem_plan)) + + class TimeEditSettingCard(SettingCard): enabledChanged = Signal(bool) @@ -1154,7 +1317,7 @@ class NoOptionComboBoxSetting(ComboBox): def reLoadOptions(self, value: List[str], texts: List[str]): - self.currentIndexChanged.disconnect() + self.currentIndexChanged.disconnect(self._onCurrentIndexChanged) self.clear() self.optionToText = {o: t for o, t in zip(value, texts)} for text, option in zip(texts, value): @@ -1210,7 +1373,7 @@ class EditableComboBoxSetting(EditableComboBox): def reLoadOptions(self, value: List[str], texts: List[str]): - self.currentIndexChanged.disconnect() + self.currentIndexChanged.disconnect(self._onCurrentIndexChanged) self.clear() self.optionToText = {o: t for o, t in zip(value, texts)} for text, option in zip(texts, value): diff --git a/app/ui/main_window.py b/app/ui/main_window.py index 9fc9a69..76aac32 100644 --- a/app/ui/main_window.py +++ b/app/ui/main_window.py @@ -81,8 +81,8 @@ class AUTO_MAA(MSFluentWindow): # 创建主窗口 self.home = Home(self) - self.member_manager = MemberManager(self) self.plan_manager = PlanManager(self) + self.member_manager = MemberManager(self) self.queue_manager = QueueManager(self) self.dispatch_center = DispatchCenter(self) self.history = History(self) @@ -137,23 +137,7 @@ class AUTO_MAA(MSFluentWindow): FluentIcon.SETTING, NavigationItemPosition.BOTTOM, ) - self.stackedWidget.currentChanged.connect( - lambda index: ( - self.queue_manager.reload_member_name() if index == 2 else None - ) - ) - self.stackedWidget.currentChanged.connect( - lambda index: ( - self.dispatch_center.pivot.setCurrentItem("主调度台") - if index == 3 - else None - ) - ) - self.stackedWidget.currentChanged.connect( - lambda index: ( - self.dispatch_center.update_top_bar() if index == 3 else None - ) - ) + self.stackedWidget.currentChanged.connect(self.__currentChanged) # 创建系统托盘及其菜单 self.tray = QSystemTrayIcon( @@ -250,43 +234,6 @@ class AUTO_MAA(MSFluentWindow): else: self.setStyleSheet("background-color: #ffffff;") - def start_up_task(self) -> None: - """启动时任务""" - - # 清理旧日志 - self.clean_old_logs() - - # 清理安装包 - if (Config.app_path / "AUTO_MAA-Setup.exe").exists(): - try: - (Config.app_path / "AUTO_MAA-Setup.exe").unlink() - except Exception: - pass - - # 检查密码 - self.setting.check_PASSWORD() - - # 获取主题图像 - if Config.get(Config.function_HomeImageMode) == "主题图像": - self.home.get_home_image() - - # 直接运行主任务 - if Config.get(Config.start_IfRunDirectly): - - self.start_main_task() - - # 获取公告 - self.setting.show_notice(if_first=True) - - # 检查更新 - if Config.get(Config.update_IfAutoUpdate): - self.setting.check_update(if_first=True) - - # 直接最小化 - if Config.get(Config.start_IfMinimizeDirectly): - - self.titleBar.minBtn.click() - def set_min_method(self) -> None: """设置最小化方法""" @@ -305,61 +252,6 @@ class AUTO_MAA(MSFluentWindow): if reason == QSystemTrayIcon.DoubleClick: self.show_ui("显示主窗口") - def clean_old_logs(self): - """ - 删除超过用户设定天数的日志文件(基于目录日期) - """ - - if Config.get(Config.function_HistoryRetentionTime) == 0: - logger.info("由于用户设置日志永久保留,跳过日志清理") - return - - deleted_count = 0 - - for date_folder in (Config.app_path / "history").iterdir(): - if not date_folder.is_dir(): - continue # 只处理日期文件夹 - - try: - # 只检查 `YYYY-MM-DD` 格式的文件夹 - folder_date = datetime.strptime(date_folder.name, "%Y-%m-%d") - if datetime.now() - folder_date > timedelta( - days=Config.get(Config.function_HistoryRetentionTime) - ): - shutil.rmtree(date_folder, ignore_errors=True) - deleted_count += 1 - logger.info(f"已删除超期日志目录: {date_folder}") - except ValueError: - logger.warning(f"非日期格式的目录: {date_folder}") - - logger.info(f"清理完成: {deleted_count} 个日期目录") - - def start_main_task(self) -> None: - """启动主任务""" - - if "调度队列_1" in Config.queue_dict: - - logger.info("自动添加任务:调度队列_1") - TaskManager.add_task( - "自动代理_主调度台", - "调度队列_1", - Config.queue_dict["调度队列_1"]["Config"].toDict(), - ) - - elif "脚本_1" in Config.member_dict: - - logger.info("自动添加任务:脚本_1") - TaskManager.add_task( - "自动代理_主调度台", "自定义队列", {"Queue": {"Member_1": "脚本_1"}} - ) - - else: - - logger.warning("启动主任务失败:未找到有效的主任务配置文件") - MainInfoBar.push_info_bar( - "warning", "启动主任务失败", "“调度队列_1”与“脚本_1”均不存在", -1 - ) - def show_ui( self, mode: str, if_quick: bool = False, if_start: bool = False ) -> None: @@ -440,6 +332,109 @@ class AUTO_MAA(MSFluentWindow): self.window().hide() self.tray.show() + def start_up_task(self) -> None: + """启动时任务""" + + # 清理旧日志 + self.clean_old_logs() + + # 清理安装包 + if (Config.app_path / "AUTO_MAA-Setup.exe").exists(): + try: + (Config.app_path / "AUTO_MAA-Setup.exe").unlink() + except Exception: + pass + + # 检查密码 + self.setting.check_PASSWORD() + + # 获取主题图像 + if Config.get(Config.function_HomeImageMode) == "主题图像": + self.home.get_home_image() + + # 直接运行主任务 + if Config.get(Config.start_IfRunDirectly): + + self.start_main_task() + + # 获取公告 + self.setting.show_notice(if_first=True) + + # 检查更新 + if Config.get(Config.update_IfAutoUpdate): + self.setting.check_update(if_first=True) + + # 直接最小化 + if Config.get(Config.start_IfMinimizeDirectly): + + self.titleBar.minBtn.click() + + def clean_old_logs(self): + """ + 删除超过用户设定天数的日志文件(基于目录日期) + """ + + if Config.get(Config.function_HistoryRetentionTime) == 0: + logger.info("由于用户设置日志永久保留,跳过日志清理") + return + + deleted_count = 0 + + for date_folder in (Config.app_path / "history").iterdir(): + if not date_folder.is_dir(): + continue # 只处理日期文件夹 + + try: + # 只检查 `YYYY-MM-DD` 格式的文件夹 + folder_date = datetime.strptime(date_folder.name, "%Y-%m-%d") + if datetime.now() - folder_date > timedelta( + days=Config.get(Config.function_HistoryRetentionTime) + ): + shutil.rmtree(date_folder, ignore_errors=True) + deleted_count += 1 + logger.info(f"已删除超期日志目录: {date_folder}") + except ValueError: + logger.warning(f"非日期格式的目录: {date_folder}") + + logger.info(f"清理完成: {deleted_count} 个日期目录") + + def start_main_task(self) -> None: + """启动主任务""" + + if "调度队列_1" in Config.queue_dict: + + logger.info("自动添加任务:调度队列_1") + TaskManager.add_task( + "自动代理_主调度台", + "调度队列_1", + Config.queue_dict["调度队列_1"]["Config"].toDict(), + ) + + elif "脚本_1" in Config.member_dict: + + logger.info("自动添加任务:脚本_1") + TaskManager.add_task( + "自动代理_主调度台", "自定义队列", {"Queue": {"Member_1": "脚本_1"}} + ) + + else: + + logger.warning("启动主任务失败:未找到有效的主任务配置文件") + MainInfoBar.push_info_bar( + "warning", "启动主任务失败", "“调度队列_1”与“脚本_1”均不存在", -1 + ) + + def __currentChanged(self, index: int) -> None: + """切换界面时任务""" + + if index == 1: + self.member_manager.reload_plan_name() + elif index == 3: + self.queue_manager.reload_member_name() + elif index == 4: + self.dispatch_center.pivot.setCurrentItem("主调度台") + self.dispatch_center.update_top_bar() + def closeEvent(self, event: QCloseEvent): """清理残余进程""" diff --git a/app/ui/member_manager.py b/app/ui/member_manager.py index cf4e1d6..6adeead 100644 --- a/app/ui/member_manager.py +++ b/app/ui/member_manager.py @@ -67,7 +67,10 @@ from .Widget import ( SpinBoxSettingCard, ComboBoxMessageBox, SettingFlyoutView, - EditableComboBoxSettingCard, + NoOptionComboBoxSettingCard, + ComboBoxWithPlanSettingCard, + EditableComboBoxWithPlanSettingCard, + SpinBoxWithPlanSettingCard, PasswordLineEditSettingCard, UserLableSettingCard, ComboBoxSettingCard, @@ -183,7 +186,7 @@ class MemberManager(QWidget): name = self.member_manager.pivot.currentRouteKey() - if name == None: + if name is None: logger.warning("删除脚本实例时未选择脚本实例") MainInfoBar.push_info_bar( "warning", "未选择脚本实例", "请选择一个脚本实例", 5000 @@ -223,7 +226,7 @@ class MemberManager(QWidget): name = self.member_manager.pivot.currentRouteKey() - if name == None: + if name is None: logger.warning("向左移动脚本实例时未选择脚本实例") MainInfoBar.push_info_bar( "warning", "未选择脚本实例", "请选择一个脚本实例", 5000 @@ -271,7 +274,7 @@ class MemberManager(QWidget): name = self.member_manager.pivot.currentRouteKey() - if name == None: + if name is None: logger.warning("向右移动脚本实例时未选择脚本实例") MainInfoBar.push_info_bar( "warning", "未选择脚本实例", "请选择一个脚本实例", 5000 @@ -472,11 +475,57 @@ class MemberManager(QWidget): self.key.setIcon(FluentIcon.HIDE) self.key.setChecked(False) + def reload_plan_name(self): + """刷新计划表名称""" + + plan_list = [ + ["固定"] + [_ for _ in Config.plan_dict.keys()], + ["固定"] + + [ + ( + k + if v["Config"].get(v["Config"].Info_Name) == "" + else f"{k} - {v["Config"].get(v["Config"].Info_Name)}" + ) + for k, v in Config.plan_dict.items() + ], + ] + for member in self.member_manager.script_list: + + if isinstance(member, MemberManager.MemberSettingBox.MaaSettingBox): + + for user_setting in member.user_setting.user_manager.script_list: + + user_setting.card_GameIdMode.comboBox.currentIndexChanged.disconnect( + user_setting.switch_gameid_mode + ) + user_setting.card_GameIdMode.reLoadOptions( + plan_list[0], plan_list[1] + ) + user_setting.card_GameIdMode.comboBox.currentIndexChanged.connect( + user_setting.switch_gameid_mode + ) + + self.refresh_plan_info() + def refresh_dashboard(self): """刷新所有脚本实例的用户仪表盘""" - for script in self.member_manager.script_list: - script.user_setting.user_manager.user_dashboard.load_info() + for member in self.member_manager.script_list: + + if isinstance(member, MemberManager.MemberSettingBox.MaaSettingBox): + member.user_setting.user_manager.user_dashboard.load_info() + + def refresh_plan_info(self): + """刷新所有计划信息""" + + for member in self.member_manager.script_list: + + if isinstance(member, MemberManager.MemberSettingBox.MaaSettingBox): + + member.user_setting.user_manager.user_dashboard.load_info() + for user_setting in member.user_setting.user_manager.script_list: + user_setting.switch_gameid_mode() class MemberSettingBox(QWidget): """脚本管理子页面组""" @@ -841,7 +890,7 @@ class MemberManager(QWidget): name = self.user_manager.pivot.currentRouteKey() - if name == None: + if name is None: logger.warning("未选择用户") MainInfoBar.push_info_bar( "warning", "未选择用户", "请先选择一个用户", 5000 @@ -900,7 +949,7 @@ class MemberManager(QWidget): name = self.user_manager.pivot.currentRouteKey() - if name == None: + if name is None: logger.warning("未选择用户") MainInfoBar.push_info_bar( "warning", "未选择用户", "请先选择一个用户", 5000 @@ -959,7 +1008,7 @@ class MemberManager(QWidget): name = self.user_manager.pivot.currentRouteKey() - if name == None: + if name is None: logger.warning("未选择用户") MainInfoBar.push_info_bar( "warning", "未选择用户", "请先选择一个用户", 5000 @@ -1195,6 +1244,8 @@ class MemberManager(QWidget): else "本周剿灭未完成" ) + gameid_info = config.get_plan_info() + button = PrimaryToolButton( FluentIcon.CHEVRON_RIGHT, self ) @@ -1243,9 +1294,7 @@ class MemberManager(QWidget): self.dashboard.setItem( int(name[3:]) - 1, 5, - QTableWidgetItem( - str(config.get(config.Info_MedicineNumb)) - ), + QTableWidgetItem(str(gameid_info["MedicineNumb"])), ) self.dashboard.setItem( int(name[3:]) - 1, @@ -1253,12 +1302,12 @@ class MemberManager(QWidget): QTableWidgetItem( Config.gameid_dict["ALL"]["text"][ Config.gameid_dict["ALL"]["value"].index( - config.get(config.Info_GameId) + gameid_info["GameId"] ) ] - if config.get(config.Info_GameId) + if gameid_info["GameId"] in Config.gameid_dict["ALL"]["value"] - else config.get(config.Info_GameId) + else gameid_info["GameId"] ), ) self.dashboard.setItem( @@ -1267,12 +1316,12 @@ class MemberManager(QWidget): QTableWidgetItem( Config.gameid_dict["ALL"]["text"][ Config.gameid_dict["ALL"]["value"].index( - config.get(config.Info_GameId_1) + gameid_info["GameId_1"] ) ] - if config.get(config.Info_GameId_1) + if gameid_info["GameId_1"] in Config.gameid_dict["ALL"]["value"] - else config.get(config.Info_GameId_1) + else gameid_info["GameId_1"] ), ) self.dashboard.setItem( @@ -1281,12 +1330,12 @@ class MemberManager(QWidget): QTableWidgetItem( Config.gameid_dict["ALL"]["text"][ Config.gameid_dict["ALL"]["value"].index( - config.get(config.Info_GameId_2) + gameid_info["GameId_2"] ) ] - if config.get(config.Info_GameId_2) + if gameid_info["GameId_2"] in Config.gameid_dict["ALL"]["value"] - else config.get(config.Info_GameId_2) + else gameid_info["GameId_2"] ), ) self.dashboard.setItem( @@ -1294,22 +1343,20 @@ class MemberManager(QWidget): 9, QTableWidgetItem( "不使用" - if config.get(config.Info_GameId_Remain) == "-" + if gameid_info["GameId_Remain"] == "-" else ( ( Config.gameid_dict["ALL"]["text"][ Config.gameid_dict["ALL"][ "value" ].index( - config.get( - config.Info_GameId_Remain - ) + gameid_info["GameId_Remain"] ) ] ) - if config.get(config.Info_GameId_Remain) + if gameid_info["GameId_Remain"] in Config.gameid_dict["ALL"]["value"] - else config.get(config.Info_GameId_Remain) + else gameid_info["GameId_Remain"] ) ), ) @@ -1333,6 +1380,19 @@ class MemberManager(QWidget): f"用户_{uid}" ]["Path"] + plan_list = [ + ["固定"] + [_ for _ in Config.plan_dict.keys()], + ["固定"] + + [ + ( + k + if v["Config"].get(v["Config"].Info_Name) == "" + else f"{k} - {v["Config"].get(v["Config"].Info_Name)}" + ) + for k, v in Config.plan_dict.items() + ], + ] + self.card_Name = LineEditSettingCard( icon=FluentIcon.PEOPLE, title="用户名", @@ -1360,15 +1420,17 @@ class MemberManager(QWidget): configItem=self.config.Info_Mode, parent=self, ) - self.card_GameIdMode = ComboBoxSettingCard( + self.card_GameIdMode = NoOptionComboBoxSettingCard( icon=FluentIcon.DICTIONARY, title="关卡配置模式", content="刷理智关卡号的配置模式", - texts=["固定"], + value=plan_list[0], + texts=plan_list[1], qconfig=self.config, configItem=self.config.Info_GameIdMode, parent=self, ) + self.card_GameIdMode.comboBox.setMinimumWidth(0) self.card_Server = ComboBoxSettingCard( icon=FluentIcon.PROJECTOR, title="服务器", @@ -1446,7 +1508,7 @@ class MemberManager(QWidget): configItem=self.config.Info_Notes, parent=self, ) - self.card_MedicineNumb = SpinBoxSettingCard( + self.card_MedicineNumb = SpinBoxWithPlanSettingCard( icon=FluentIcon.GAME, title="吃理智药", content="吃理智药次数,输入0以关闭", @@ -1455,7 +1517,7 @@ class MemberManager(QWidget): configItem=self.config.Info_MedicineNumb, parent=self, ) - self.card_SeriesNumb = ComboBoxSettingCard( + self.card_SeriesNumb = ComboBoxWithPlanSettingCard( icon=FluentIcon.GAME, title="连战次数", content="连战次数较大时建议搭配剩余理智关卡使用", @@ -1465,7 +1527,7 @@ class MemberManager(QWidget): parent=self, ) self.card_SeriesNumb.comboBox.setMinimumWidth(150) - self.card_GameId = EditableComboBoxSettingCard( + self.card_GameId = EditableComboBoxWithPlanSettingCard( icon=FluentIcon.GAME, title="关卡选择", content="按下回车以添加自定义关卡号", @@ -1475,7 +1537,7 @@ class MemberManager(QWidget): configItem=self.config.Info_GameId, parent=self, ) - self.card_GameId_1 = EditableComboBoxSettingCard( + self.card_GameId_1 = EditableComboBoxWithPlanSettingCard( icon=FluentIcon.GAME, title="备选关卡 - 1", content="按下回车以添加自定义关卡号", @@ -1485,7 +1547,7 @@ class MemberManager(QWidget): configItem=self.config.Info_GameId_1, parent=self, ) - self.card_GameId_2 = EditableComboBoxSettingCard( + self.card_GameId_2 = EditableComboBoxWithPlanSettingCard( icon=FluentIcon.GAME, title="备选关卡 - 2", content="按下回车以添加自定义关卡号", @@ -1495,18 +1557,20 @@ class MemberManager(QWidget): configItem=self.config.Info_GameId_2, parent=self, ) - self.card_GameId_Remain = EditableComboBoxSettingCard( - icon=FluentIcon.GAME, - title="剩余理智关卡", - content="按下回车以添加自定义关卡号", - value=Config.gameid_dict["ALL"]["value"], - texts=[ - "不使用" if _ == "当前/上次" else _ - for _ in Config.gameid_dict["ALL"]["text"] - ], - qconfig=self.config, - configItem=self.config.Info_GameId_Remain, - parent=self, + self.card_GameId_Remain = ( + EditableComboBoxWithPlanSettingCard( + icon=FluentIcon.GAME, + title="剩余理智关卡", + content="按下回车以添加自定义关卡号", + value=Config.gameid_dict["ALL"]["value"], + texts=[ + "不使用" if _ == "当前/上次" else _ + for _ in Config.gameid_dict["ALL"]["text"] + ], + qconfig=self.config, + configItem=self.config.Info_GameId_Remain, + parent=self, + ) ) self.card_UserLable = UserLableSettingCard( @@ -1624,10 +1688,14 @@ class MemberManager(QWidget): self.set_infrastructure ) self.card_NotifySet.clicked.connect(self.set_notify) + self.card_GameIdMode.comboBox.currentIndexChanged.connect( + self.switch_gameid_mode + ) Config.gameid_refreshed.connect(self.refresh_gameid) Config.PASSWORD_refreshed.connect(self.refresh_password) self.switch_mode() + self.switch_gameid_mode() self.switch_infrastructure() def switch_mode(self) -> None: @@ -1646,6 +1714,40 @@ class MemberManager(QWidget): self.card_Annihilation.button.setVisible(True) self.card_Routine.setVisible(True) + def switch_gameid_mode(self) -> None: + + for card, name in zip( + [ + self.card_MedicineNumb, + self.card_SeriesNumb, + self.card_GameId, + self.card_GameId_1, + self.card_GameId_2, + self.card_GameId_Remain, + ], + [ + "MedicineNumb", + "SeriesNumb", + "GameId", + "GameId_1", + "GameId_2", + "GameId_Remain", + ], + ): + + card.switch_mode( + self.config.get(self.config.Info_GameIdMode)[:2] + ) + if ( + self.config.get(self.config.Info_GameIdMode) + != "固定" + ): + card.change_plan( + Config.plan_dict[ + self.config.get(self.config.Info_GameIdMode) + ]["Config"].get_current_info(name) + ) + def switch_infrastructure(self) -> None: if ( diff --git a/app/ui/plan_manager.py b/app/ui/plan_manager.py index f236b88..f96cad3 100644 --- a/app/ui/plan_manager.py +++ b/app/ui/plan_manager.py @@ -40,13 +40,14 @@ from qfluentwidgets import ( CommandBar, TableWidget, ) -from typing import List +from typing import List, Dict, Union import shutil from app.core import Config, MainInfoBar, MaaPlanConfig -from app.services import Crypto from .Widget import ( ComboBoxMessageBox, + LineEditSettingCard, + ComboBoxSettingCard, SpinBoxSetting, EditableComboBoxSetting, ComboBoxSetting, @@ -134,7 +135,7 @@ class PlanManager(QWidget): name = self.plan_manager.pivot.currentRouteKey() - if name == None: + if name is None: logger.warning("删除计划表时未选择计划表") MainInfoBar.push_info_bar( "warning", "未选择计划表", "请选择一个计划表", 5000 @@ -172,7 +173,7 @@ class PlanManager(QWidget): name = self.plan_manager.pivot.currentRouteKey() - if name == None: + if name is None: logger.warning("向左移动计划表时未选择计划表") MainInfoBar.push_info_bar( "warning", "未选择计划表", "请选择一个计划表", 5000 @@ -220,7 +221,7 @@ class PlanManager(QWidget): name = self.plan_manager.pivot.currentRouteKey() - if name == None: + if name is None: logger.warning("向右移动计划表时未选择计划表") MainInfoBar.push_info_bar( "warning", "未选择计划表", "请选择一个计划表", 5000 @@ -321,6 +322,7 @@ class PlanManager(QWidget): """清空所有子界面""" for sub_interface in self.script_list: + Config.gameid_refreshed.disconnect(sub_interface.refresh_gameid) self.stackedWidget.removeWidget(sub_interface) sub_interface.deleteLater() self.script_list.clear() @@ -344,15 +346,35 @@ class PlanManager(QWidget): super().__init__(parent) self.setObjectName(f"计划_{uid}") + self.setTitle("MAA计划表") self.config = Config.plan_dict[f"计划_{uid}"]["Config"] - self.dashboard = TableWidget(self) - self.dashboard.setColumnCount(8) - self.dashboard.setRowCount(6) - self.dashboard.setHorizontalHeaderLabels( + self.card_Name = LineEditSettingCard( + icon=FluentIcon.EDIT, + title="计划表名称", + content="用于标识计划表的名称", + text="请输入计划表名称", + qconfig=self.config, + configItem=self.config.Info_Name, + parent=self, + ) + self.card_Mode = ComboBoxSettingCard( + icon=FluentIcon.DICTIONARY, + title="计划模式", + content="全局模式下计划内容固定,周计划模式下计划按周一到周日切换", + texts=["全局", "周计划"], + qconfig=self.config, + configItem=self.config.Info_Mode, + parent=self, + ) + + self.table = TableWidget(self) + self.table.setColumnCount(8) + self.table.setRowCount(6) + self.table.setHorizontalHeaderLabels( ["全局", "周一", "周二", "周三", "周四", "周五", "周六", "周日"] ) - self.dashboard.setVerticalHeaderLabels( + self.table.setVerticalHeaderLabels( [ "吃理智药", "连战次数", @@ -362,37 +384,60 @@ class PlanManager(QWidget): "剩余理智", ] ) - self.dashboard.setEditTriggers(TableWidget.NoEditTriggers) + self.table.setAlternatingRowColors(False) + self.table.setEditTriggers(TableWidget.NoEditTriggers) for col in range(8): - self.dashboard.horizontalHeader().setSectionResizeMode( + self.table.horizontalHeader().setSectionResizeMode( col, QHeaderView.ResizeMode.Stretch ) + for row in range(6): + self.table.verticalHeader().setSectionResizeMode( + row, QHeaderView.ResizeMode.ResizeToContents + ) - self.viewLayout.addWidget(self.dashboard) - self.viewLayout.setContentsMargins(3, 0, 3, 3) + self.item_dict: Dict[ + str, + Dict[ + str, + Union[SpinBoxSetting, ComboBoxSetting, EditableComboBoxSetting], + ], + ] = {} for col, (group, name_dict) in enumerate( self.config.config_item_dict.items() ): + self.item_dict[group] = {} + for row, (name, configItem) in enumerate(name_dict.items()): if name == "MedicineNumb": - setting_item = SpinBoxSetting( + self.item_dict[group][name] = SpinBoxSetting( range=(0, 1024), qconfig=self.config, configItem=configItem, parent=self, ) elif name == "SeriesNumb": - setting_item = ComboBoxSetting( + self.item_dict[group][name] = ComboBoxSetting( texts=["AUTO", "6", "5", "4", "3", "2", "1", "不选择"], qconfig=self.config, configItem=configItem, parent=self, ) + elif name == "GameId_Remain": + self.item_dict[group][name] = EditableComboBoxSetting( + value=Config.gameid_dict[group]["value"], + texts=[ + "不使用" if _ == "当前/上次" else _ + for _ in Config.gameid_dict[group]["text"] + ], + qconfig=self.config, + configItem=configItem, + parent=self, + ) elif "GameId" in name: - setting_item = EditableComboBoxSetting( + self.item_dict[group][name] = EditableComboBoxSetting( value=Config.gameid_dict[group]["value"], texts=Config.gameid_dict[group]["text"], qconfig=self.config, @@ -400,4 +445,51 @@ class PlanManager(QWidget): parent=self, ) - self.dashboard.setCellWidget(row, col, setting_item) + self.table.setCellWidget(row, col, self.item_dict[group][name]) + + Layout = QVBoxLayout() + Layout.addWidget(self.card_Name) + Layout.addWidget(self.card_Mode) + Layout.addWidget(self.table) + + self.viewLayout.addLayout(Layout) + self.viewLayout.setSpacing(3) + self.viewLayout.setContentsMargins(3, 0, 3, 3) + + self.card_Mode.comboBox.currentIndexChanged.connect(self.switch_mode) + Config.gameid_refreshed.connect(self.refresh_gameid) + + self.switch_mode() + + def switch_mode(self) -> None: + """切换计划模式""" + + for group, name_dict in self.item_dict.items(): + for name, setting_item in name_dict.items(): + setting_item.setEnabled( + (group == "ALL") + == (self.config.get(self.config.Info_Mode) == "ALL") + ) + + def refresh_gameid(self): + + for group, name_dict in self.item_dict.items(): + + for name, setting_item in name_dict.items(): + + if name == "GameId_Remain": + + setting_item.reLoadOptions( + Config.gameid_dict[group]["value"], + [ + "不使用" if _ == "当前/上次" else _ + for _ in Config.gameid_dict[group]["text"] + ], + ) + + elif "GameId" in name: + + setting_item.reLoadOptions( + Config.gameid_dict[group]["value"], + Config.gameid_dict[group]["text"], + ) diff --git a/app/ui/queue_manager.py b/app/ui/queue_manager.py index 5120167..ee013b6 100644 --- a/app/ui/queue_manager.py +++ b/app/ui/queue_manager.py @@ -122,7 +122,7 @@ class QueueManager(QWidget): name = self.queue_manager.pivot.currentRouteKey() - if name == None: + if name is None: logger.warning("未选择调度队列") MainInfoBar.push_info_bar( "warning", "未选择调度队列", "请先选择一个调度队列", 5000 @@ -160,7 +160,7 @@ class QueueManager(QWidget): name = self.queue_manager.pivot.currentRouteKey() - if name == None: + if name is None: logger.warning("未选择调度队列") MainInfoBar.push_info_bar( "warning", "未选择调度队列", "请先选择一个调度队列", 5000 @@ -205,7 +205,7 @@ class QueueManager(QWidget): name = self.queue_manager.pivot.currentRouteKey() - if name == None: + if name is None: logger.warning("未选择调度队列") MainInfoBar.push_info_bar( "warning", "未选择调度队列", "请先选择一个调度队列", 5000 diff --git a/resources/version.json b/resources/version.json index 622187a..97ed255 100644 --- a/resources/version.json +++ b/resources/version.json @@ -4,7 +4,8 @@ "4.3.8.4": { "新增功能": [ "支持为每一个用户执行独立通知", - "输入文本框适配文本插入操作" + "输入文本框适配文本插入操作", + "计划表功能上线" ] }, "4.3.8.3": { @@ -23,7 +24,7 @@ "日志分析忽略MAA超时提示" ], "程序优化": [ - "配置类定义方法更新,预载入计划表相关配置" + "配置类定义方法更新" ] }, "4.3.8.1": { From 078736337d34d2dd780fb32ca0e2e0f77dd9122d Mon Sep 17 00:00:00 2001 From: DLmaster361 Date: Sun, 25 May 2025 23:31:37 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=9B=B7=E7=94=B5?= =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E5=99=A8=E9=9D=99=E9=BB=98=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=AD=A3=E5=B8=B8=E8=AF=86=E5=88=AB=E6=A8=A1?= =?UTF-8?q?=E6=8B=9F=E5=99=A8=E6=98=AF=E5=90=A6=E9=9A=90=E8=97=8F=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/timer.py | 11 +++++++++++ app/models/MAA.py | 6 +++--- resources/version.json | 6 +++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/core/timer.py b/app/core/timer.py index 09e3d81..c09bd7f 100644 --- a/app/core/timer.py +++ b/app/core/timer.py @@ -29,6 +29,7 @@ from loguru import logger from PySide6.QtWidgets import QWidget from PySide6.QtCore import QTimer from datetime import datetime +from pathlib import Path import pyautogui from .config import Config @@ -97,6 +98,16 @@ class _MainTimer(QWidget): ): windows = System.get_window_info() + + # 排除雷电名为新通知的窗口 + windows = [ + window + for window in windows + if not ( + window[0] == "新通知" and Path(window[1]) in Config.silence_list + ) + ] + if any( str(emulator_path) in window for window in windows diff --git a/app/models/MAA.py b/app/models/MAA.py index edbef87..c3ccf2a 100644 --- a/app/models/MAA.py +++ b/app/models/MAA.py @@ -567,9 +567,6 @@ class MaaManager(QObject): break time.sleep(1) - # 移除静默进程标记 - Config.silence_list.remove(self.emulator_path) - # 任务结束后释放ADB try: subprocess.run( @@ -908,6 +905,9 @@ class MaaManager(QObject): break time.sleep(1) + # 移除静默进程标记 + Config.silence_list.remove(self.emulator_path) + if "-" in self.ADB_address: ADB_ip = f"{self.ADB_address.split("-")[0]}-" ADB_port = int(self.ADB_address.split("-")[1]) diff --git a/resources/version.json b/resources/version.json index 97ed255..46119a3 100644 --- a/resources/version.json +++ b/resources/version.json @@ -5,7 +5,11 @@ "新增功能": [ "支持为每一个用户执行独立通知", "输入文本框适配文本插入操作", - "计划表功能上线" + "计划表功能上线", + "静默控制时长从全任务内缩短至搜索ADB时段内" + ], + "修复bug": [ + "修复雷电模拟器静默模式无法正常识别模拟器是否隐藏相关问题" ] }, "4.3.8.3": { From a752b67ca16c61fe93a3487bd9edef5990cc7367 Mon Sep 17 00:00:00 2001 From: DLmaster361 Date: Mon, 26 May 2025 16:05:46 +0800 Subject: [PATCH 4/4] =?UTF-8?q?feat(ui):=20UI=E7=95=8C=E9=9D=A2=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=87=AA=E5=8A=A8=E6=97=A5=E5=B8=B8=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=BA=8F=E5=88=97=E8=AE=BE=E7=BD=AE=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/config.py | 16 +++- app/models/MAA.py | 99 +++++++++++----------- app/ui/Widget.py | 179 ++++++++++++++++++++++++++------------- app/ui/member_manager.py | 133 ++++++++++++++++++++++++++--- resources/version.json | 3 +- 5 files changed, 310 insertions(+), 120 deletions(-) diff --git a/app/core/config.py b/app/core/config.py index c27f409..4e72895 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -434,7 +434,21 @@ class MaaUserConfig(LQConfig): "Data", "CustomInfrastPlanIndex", "0" ) - # 新增用户单独通知字段 + self.Task_IfWakeUp = ConfigItem("Task", "IfWakeUp", True, BoolValidator()) + self.Task_IfRecruiting = ConfigItem( + "Task", "IfRecruiting", True, BoolValidator() + ) + self.Task_IfBase = ConfigItem("Task", "IfBase", True, BoolValidator()) + self.Task_IfCombat = ConfigItem("Task", "IfCombat", True, BoolValidator()) + self.Task_IfMall = ConfigItem("Task", "IfMall", True, BoolValidator()) + self.Task_IfMission = ConfigItem("Task", "IfMission", True, BoolValidator()) + self.Task_IfAutoRoguelike = ConfigItem( + "Task", "IfAutoRoguelike", False, BoolValidator() + ) + self.Task_IfReclamation = ConfigItem( + "Task", "IfReclamation", False, BoolValidator() + ) + self.Notify_Enabled = ConfigItem("Notify", "Enabled", False, BoolValidator()) self.Notify_IfSendStatistic = ConfigItem( "Notify", "IfSendStatistic", False, BoolValidator() diff --git a/app/models/MAA.py b/app/models/MAA.py index c3ccf2a..d43de4e 100644 --- a/app/models/MAA.py +++ b/app/models/MAA.py @@ -274,9 +274,23 @@ class MaaManager(QObject): ) # 解析任务构成 - if user_data["Info"]["Mode"] == "简洁": + if mode == "Routine": + + self.task_dict = { + "WakeUp": str(user_data["Task"]["IfWakeUp"]), + "Recruiting": str(user_data["Task"]["IfRecruiting"]), + "Base": str(user_data["Task"]["IfBase"]), + "Combat": str(user_data["Task"]["IfCombat"]), + "Mission": str(user_data["Task"]["IfMission"]), + "Mall": str(user_data["Task"]["IfMall"]), + "AutoRoguelike": str(user_data["Task"]["IfAutoRoguelike"]), + "Reclamation": str(user_data["Task"]["IfReclamation"]), + } + + elif mode == "Annihilation": + + if user_data["Info"]["Mode"] == "简洁": - if mode == "Annihilation": self.task_dict = { "WakeUp": "True", "Recruiting": "False", @@ -288,52 +302,40 @@ class MaaManager(QObject): "Reclamation": "False", } - elif mode == "Routine": + elif user_data["Info"]["Mode"] == "详细": + + with (self.data[user[2]]["Path"] / f"{mode}/gui.json").open( + mode="r", encoding="utf-8" + ) as f: + data = json.load(f) + self.task_dict = { - "WakeUp": "True", - "Recruiting": "True", - "Base": "True", - "Combat": "True", - "Mission": "True", - "Mall": "True", - "AutoRoguelike": "False", - "Reclamation": "False", + "WakeUp": data["Configurations"]["Default"][ + "TaskQueue.WakeUp.IsChecked" + ], + "Recruiting": data["Configurations"]["Default"][ + "TaskQueue.Recruiting.IsChecked" + ], + "Base": data["Configurations"]["Default"][ + "TaskQueue.Base.IsChecked" + ], + "Combat": data["Configurations"]["Default"][ + "TaskQueue.Combat.IsChecked" + ], + "Mission": data["Configurations"]["Default"][ + "TaskQueue.Mission.IsChecked" + ], + "Mall": data["Configurations"]["Default"][ + "TaskQueue.Mall.IsChecked" + ], + "AutoRoguelike": data["Configurations"]["Default"][ + "TaskQueue.AutoRoguelike.IsChecked" + ], + "Reclamation": data["Configurations"]["Default"][ + "TaskQueue.Reclamation.IsChecked" + ], } - elif user_data["Info"]["Mode"] == "详细": - - with (self.data[user[2]]["Path"] / f"{mode}/gui.json").open( - mode="r", encoding="utf-8" - ) as f: - data = json.load(f) - - self.task_dict = { - "WakeUp": data["Configurations"]["Default"][ - "TaskQueue.WakeUp.IsChecked" - ], - "Recruiting": data["Configurations"]["Default"][ - "TaskQueue.Recruiting.IsChecked" - ], - "Base": data["Configurations"]["Default"][ - "TaskQueue.Base.IsChecked" - ], - "Combat": data["Configurations"]["Default"][ - "TaskQueue.Combat.IsChecked" - ], - "Mission": data["Configurations"]["Default"][ - "TaskQueue.Mission.IsChecked" - ], - "Mall": data["Configurations"]["Default"][ - "TaskQueue.Mall.IsChecked" - ], - "AutoRoguelike": data["Configurations"]["Default"][ - "TaskQueue.AutoRoguelike.IsChecked" - ], - "Reclamation": data["Configurations"]["Default"][ - "TaskQueue.Reclamation.IsChecked" - ], - } - # 尝试次数循环 for i in range(self.set["RunSet"]["RunTimesLimit"]): @@ -1275,6 +1277,9 @@ class MaaManager(QObject): ]["Id"] # 按预设设定任务 + data["Configurations"]["Default"][ + "TaskQueue.WakeUp.IsChecked" + ] = "True" # 开始唤醒 data["Configurations"]["Default"]["TaskQueue.Recruiting.IsChecked"] = ( self.task_dict["Recruiting"] ) # 自动公招 @@ -1299,10 +1304,6 @@ class MaaManager(QObject): if user_data["Info"]["Mode"] == "简洁": - data["Configurations"]["Default"][ - "TaskQueue.WakeUp.IsChecked" - ] = "True" # 开始唤醒 - data["Configurations"]["Default"]["Start.ClientType"] = user_data[ "Info" ][ diff --git a/app/ui/Widget.py b/app/ui/Widget.py index db85a2d..16b40be 100644 --- a/app/ui/Widget.py +++ b/app/ui/Widget.py @@ -82,6 +82,7 @@ from qfluentwidgets import ( Pivot, PivotItem, FlyoutViewBase, + PushSettingCard, ) from qfluentwidgets.common.overload import singledispatchmethod @@ -306,6 +307,8 @@ class SettingFlyoutView(FlyoutViewBase): self.viewLayout.addWidget(self.title) self.viewLayout.addWidget(scrollArea) + self.setVisible(False) + class SwitchSettingCard(SettingCard): """Setting card with switch button""" @@ -557,57 +560,6 @@ class PasswordLineEditSettingCard(SettingCard): self.LineEdit.textChanged.connect(self.__textChanged) -class UserLableSettingCard(SettingCard): - """Setting card with User's Lable""" - - def __init__( - self, - icon: Union[str, QIcon, FluentIconBase], - title: str, - content: Union[str, None], - qconfig: QConfig, - configItems: Dict[str, ConfigItem], - parent=None, - ): - - super().__init__(icon, title, content, parent) - self.qconfig = qconfig - self.configItems = configItems - self.Lable = SubtitleLabel(self) - - if configItems: - for configItem in configItems.values(): - configItem.valueChanged.connect(self.setValue) - self.setValue() - - self.hBoxLayout.addWidget(self.Lable, 0, Qt.AlignRight) - self.hBoxLayout.addSpacing(16) - - def setValue(self): - if self.configItems: - - text_list = [] - if not self.qconfig.get(self.configItems["IfPassCheck"]): - text_list.append("未通过人工排查") - text_list.append( - f"今日已代理{self.qconfig.get(self.configItems["ProxyTimes"])}次" - if Config.server_date().strftime("%Y-%m-%d") - == self.qconfig.get(self.configItems["LastProxyDate"]) - else "今日未进行代理" - ) - text_list.append( - "本周剿灭已完成" - if datetime.strptime( - self.qconfig.get(self.configItems["LastAnnihilationDate"]), - "%Y-%m-%d", - ).isocalendar()[:2] - == Config.server_date().isocalendar()[:2] - else "本周剿灭未完成" - ) - - self.Lable.setText(" | ".join(text_list)) - - class PushAndSwitchButtonSettingCard(SettingCard): """Setting card with push & switch button""" @@ -1128,6 +1080,115 @@ class TimeEditSettingCard(SettingCard): self.TimeEdit.setTime(QTime.fromString(value, "HH:mm")) +class UserLableSettingCard(SettingCard): + """Setting card with User's Lable""" + + def __init__( + self, + icon: Union[str, QIcon, FluentIconBase], + title: str, + content: Union[str, None], + qconfig: QConfig, + configItems: Dict[str, ConfigItem], + parent=None, + ): + + super().__init__(icon, title, content, parent) + self.qconfig = qconfig + self.configItems = configItems + self.Lable = SubtitleLabel(self) + + if configItems: + for configItem in configItems.values(): + configItem.valueChanged.connect(self.setValue) + self.setValue() + + self.hBoxLayout.addWidget(self.Lable, 0, Qt.AlignRight) + self.hBoxLayout.addSpacing(16) + + def setValue(self): + + text_list = [] + + if self.configItems: + + if not self.qconfig.get(self.configItems["IfPassCheck"]): + text_list.append("未通过人工排查") + text_list.append( + f"今日已代理{self.qconfig.get(self.configItems["ProxyTimes"])}次" + if Config.server_date().strftime("%Y-%m-%d") + == self.qconfig.get(self.configItems["LastProxyDate"]) + else "今日未进行代理" + ) + text_list.append( + "本周剿灭已完成" + if datetime.strptime( + self.qconfig.get(self.configItems["LastAnnihilationDate"]), + "%Y-%m-%d", + ).isocalendar()[:2] + == Config.server_date().isocalendar()[:2] + else "本周剿灭未完成" + ) + + self.Lable.setText(" | ".join(text_list)) + + +class UserTaskSettingCard(PushSettingCard): + """Setting card with User's Task""" + + def __init__( + self, + icon: Union[str, QIcon, FluentIconBase], + title: str, + content: Union[str, None], + text: str, + qconfig: QConfig, + configItems: Dict[str, ConfigItem], + parent=None, + ): + + super().__init__(text, icon, title, content, 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): + + text_list = [] + + if self.configItems: + + if self.qconfig.get(self.configItems["IfWakeUp"]): + text_list.append("开始唤醒") + if self.qconfig.get(self.configItems["IfRecruiting"]): + text_list.append("自动公招") + if self.qconfig.get(self.configItems["IfBase"]): + text_list.append("基建换班") + if self.qconfig.get(self.configItems["IfCombat"]): + text_list.append("刷理智") + if self.qconfig.get(self.configItems["IfMall"]): + text_list.append("获取信用及购物") + if self.qconfig.get(self.configItems["IfMission"]): + text_list.append("领取奖励") + if self.qconfig.get(self.configItems["IfAutoRoguelike"]): + text_list.append("自动肉鸽") + if self.qconfig.get(self.configItems["IfReclamation"]): + text_list.append("生息演算") + + if text_list: + self.setContent(f"任务序列:{" - ".join(text_list)}") + else: + self.setContent("未启用任何任务项") + + class UserNoticeSettingCard(PushAndSwitchButtonSettingCard): """Setting card with User's Notice""" @@ -1184,7 +1245,7 @@ class UserNoticeSettingCard(PushAndSwitchButtonSettingCard): # 普通字符串:末尾3字符 return f"***{s[-3:]}" if len(s) > 3 else s - content_list = [] + text_list = [] if self.configItems: @@ -1192,27 +1253,27 @@ class UserNoticeSettingCard(PushAndSwitchButtonSettingCard): self.qconfig.get(self.configItems["IfSendStatistic"]) or self.qconfig.get(self.configItems["IfSendSixStar"]) ): - content_list.append("未启用任何通知项") + text_list.append("未启用任何通知项") if self.qconfig.get(self.configItems["IfSendStatistic"]): - content_list.append("统计信息已启用") + text_list.append("统计信息已启用") if self.qconfig.get(self.configItems["IfSendSixStar"]): - content_list.append("六星喜报已启用") + text_list.append("六星喜报已启用") if self.qconfig.get(self.configItems["IfSendMail"]): - content_list.append( + text_list.append( f"邮箱通知:{short_str(self.qconfig.get(self.configItems["ToAddress"]))}" ) if self.qconfig.get(self.configItems["IfServerChan"]): - content_list.append( + text_list.append( f"Server酱通知:{short_str(self.qconfig.get(self.configItems["ServerChanKey"]))}" ) if self.qconfig.get(self.configItems["IfCompanyWebHookBot"]): - content_list.append( + text_list.append( f"企业微信通知:{short_str(self.qconfig.get(self.configItems["CompanyWebHookBotUrl"]))}" ) - self.setContent(" | ".join(content_list)) + self.setContent(" | ".join(text_list)) class StatusSwitchSetting(SwitchButton): diff --git a/app/ui/member_manager.py b/app/ui/member_manager.py index 6adeead..82865af 100644 --- a/app/ui/member_manager.py +++ b/app/ui/member_manager.py @@ -73,6 +73,7 @@ from .Widget import ( SpinBoxWithPlanSettingCard, PasswordLineEditSettingCard, UserLableSettingCard, + UserTaskSettingCard, ComboBoxSettingCard, SwitchSettingCard, PushAndSwitchButtonSettingCard, @@ -1587,7 +1588,106 @@ class MemberManager(QWidget): parent=self, ) - # 新增单独通知卡片 + # 单独任务卡片 + self.card_TaskSet = UserTaskSettingCard( + icon=FluentIcon.LIBRARY, + title="自动日常代理任务序列", + content="未启用任何任务项", + text="设置", + qconfig=self.config, + configItems={ + "IfWakeUp": self.config.Task_IfWakeUp, + "IfRecruiting": self.config.Task_IfRecruiting, + "IfBase": self.config.Task_IfBase, + "IfCombat": self.config.Task_IfCombat, + "IfMall": self.config.Task_IfMall, + "IfMission": self.config.Task_IfMission, + "IfAutoRoguelike": self.config.Task_IfAutoRoguelike, + "IfReclamation": self.config.Task_IfReclamation, + }, + parent=self, + ) + self.card_IfWakeUp = SwitchSettingCard( + icon=FluentIcon.TILES, + title="开始唤醒", + content="", + qconfig=self.config, + configItem=self.config.Task_IfWakeUp, + parent=self, + ) + self.card_IfRecruiting = SwitchSettingCard( + icon=FluentIcon.TILES, + title="自动公招", + content="", + qconfig=self.config, + configItem=self.config.Task_IfRecruiting, + parent=self, + ) + self.card_IfBase = SwitchSettingCard( + icon=FluentIcon.TILES, + title="基建换班", + content="", + qconfig=self.config, + configItem=self.config.Task_IfBase, + parent=self, + ) + self.card_IfCombat = SwitchSettingCard( + icon=FluentIcon.TILES, + title="刷理智", + content="", + qconfig=self.config, + configItem=self.config.Task_IfCombat, + parent=self, + ) + self.card_IfMall = SwitchSettingCard( + icon=FluentIcon.TILES, + title="获取信用及购物", + content="", + qconfig=self.config, + configItem=self.config.Task_IfMall, + parent=self, + ) + self.card_IfMission = SwitchSettingCard( + icon=FluentIcon.TILES, + title="领取奖励", + content="", + qconfig=self.config, + configItem=self.config.Task_IfMission, + parent=self, + ) + self.card_IfAutoRoguelike = SwitchSettingCard( + icon=FluentIcon.TILES, + title="自动肉鸽", + content="", + qconfig=self.config, + configItem=self.config.Task_IfAutoRoguelike, + parent=self, + ) + self.card_IfReclamation = SwitchSettingCard( + icon=FluentIcon.TILES, + title="生息演算", + content="", + qconfig=self.config, + configItem=self.config.Task_IfReclamation, + parent=self, + ) + + self.TaskSetCard = SettingFlyoutView( + self, + "自动日常代理任务序列设置", + [ + self.card_IfWakeUp, + self.card_IfRecruiting, + self.card_IfBase, + self.card_IfCombat, + self.card_IfMall, + self.card_IfMission, + self.card_IfAutoRoguelike, + self.card_IfReclamation, + ], + ) + + # 单独通知卡片 self.card_NotifySet = UserNoticeSettingCard( icon=FluentIcon.MAIL, title="用户单独通知设置", @@ -1618,17 +1718,16 @@ class MemberManager(QWidget): self.CompanyWechatPushSettingCard(self.config, self) ) - self.card_NotifySet_list = [ - self.card_NotifyContent, - self.card_EMail, - self.card_ServerChan, - self.card_CompanyWebhookBot, - ] - self.NotifySetCard = SettingFlyoutView( - self, "用户通知设置", self.card_NotifySet_list + self, + "用户通知设置", + [ + self.card_NotifyContent, + self.card_EMail, + self.card_ServerChan, + self.card_CompanyWebhookBot, + ], ) - self.NotifySetCard.setVisible(False) h1_layout = QHBoxLayout() h1_layout.addWidget(self.card_Name) @@ -1667,6 +1766,7 @@ class MemberManager(QWidget): Layout.addLayout(h6_layout) Layout.addLayout(h7_layout) Layout.addLayout(h8_layout) + Layout.addWidget(self.card_TaskSet) Layout.addWidget(self.card_NotifySet) self.viewLayout.addLayout(Layout) @@ -1687,6 +1787,7 @@ class MemberManager(QWidget): self.card_InfrastMode.clicked.connect( self.set_infrastructure ) + self.card_TaskSet.clicked.connect(self.set_task) self.card_NotifySet.clicked.connect(self.set_notify) self.card_GameIdMode.comboBox.currentIndexChanged.connect( self.switch_gameid_mode @@ -1851,6 +1952,18 @@ class MemberManager(QWidget): }, ) + def set_task(self) -> None: + """设置用户任务序列相关配置""" + + self.TaskSetCard.setVisible(True) + Flyout.make( + self.TaskSetCard, + self.card_TaskSet, + self, + aniType=FlyoutAnimationType.PULL_UP, + isDeleteOnClose=False, + ) + def set_notify(self) -> None: """设置用户通知相关配置""" diff --git a/resources/version.json b/resources/version.json index 46119a3..bc0525c 100644 --- a/resources/version.json +++ b/resources/version.json @@ -6,7 +6,8 @@ "支持为每一个用户执行独立通知", "输入文本框适配文本插入操作", "计划表功能上线", - "静默控制时长从全任务内缩短至搜索ADB时段内" + "静默控制时长从全任务内缩短至搜索ADB时段内", + "UI界面添加自动日常代理任务序列设置项" ], "修复bug": [ "修复雷电模拟器静默模式无法正常识别模拟器是否隐藏相关问题"