feat(core): 计划表功能上线

This commit is contained in:
DLmaster361
2025-05-25 21:12:22 +08:00
parent 740797a689
commit de1058a28c
9 changed files with 626 additions and 271 deletions

View File

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

View File

@@ -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):
"""清理残余进程"""

View File

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

View File

@@ -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"],
)

View File

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