Merge branch 'updater_dev' into dev

This commit is contained in:
DLmaster
2025-03-13 21:00:37 +08:00
11 changed files with 890 additions and 509 deletions

View File

@@ -25,13 +25,14 @@ v4.2
作者DLmaster_361
"""
from PySide6.QtWidgets import QWidget, QHBoxLayout
from PySide6.QtCore import Qt, QTime, QEvent
from PySide6.QtWidgets import QWidget, QWidget, QLabel, QHBoxLayout, QSizePolicy
from PySide6.QtCore import Qt, QTime, QEvent, QSize
from PySide6.QtGui import QIcon, QPixmap, QPainter, QPainterPath
from qfluentwidgets import (
LineEdit,
PasswordLineEdit,
MessageBoxBase,
MessageBox,
SubtitleLabel,
SettingCard,
SpinBox,
@@ -50,9 +51,13 @@ from qfluentwidgets import (
TeachingTip,
TransparentToolButton,
TeachingTipTailPosition,
ExpandSettingCard,
ToolButton,
PushButton,
)
from qfluentwidgets.common.overload import singledispatchmethod
import os
from urllib.parse import urlparse
from typing import Optional, Union, List
from app.services import Crypto
@@ -330,6 +335,142 @@ class TimeEditSettingCard(SettingCard):
self.TimeEdit.setTime(QTime.fromString(value, "HH:mm"))
class UrlItem(QWidget):
"""Url item"""
removed = Signal(QWidget)
def __init__(self, url: str, parent=None):
super().__init__(parent=parent)
self.url = url
self.hBoxLayout = QHBoxLayout(self)
self.folderLabel = QLabel(url, self)
self.removeButton = ToolButton(FluentIcon.CLOSE, self)
self.removeButton.setFixedSize(39, 29)
self.removeButton.setIconSize(QSize(12, 12))
self.setFixedHeight(53)
self.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed)
self.hBoxLayout.setContentsMargins(48, 0, 60, 0)
self.hBoxLayout.addWidget(self.folderLabel, 0, Qt.AlignLeft)
self.hBoxLayout.addSpacing(16)
self.hBoxLayout.addStretch(1)
self.hBoxLayout.addWidget(self.removeButton, 0, Qt.AlignRight)
self.hBoxLayout.setAlignment(Qt.AlignVCenter)
self.removeButton.clicked.connect(lambda: self.removed.emit(self))
class UrlListSettingCard(ExpandSettingCard):
"""Url list setting card"""
urlChanged = Signal(list)
def __init__(
self,
icon: Union[str, QIcon, FluentIconBase],
configItem: ConfigItem,
title: str,
content: str = None,
parent=None,
):
"""
Parameters
----------
configItem: RangeConfigItem
configuration item operated by the card
title: str
the title of card
content: str
the content of card
parent: QWidget
parent widget
"""
super().__init__(icon, title, content, parent)
self.configItem = configItem
self.addUrlButton = PushButton("添加代理网址", self)
self.urls: List[str] = qconfig.get(configItem).copy()
self.__initWidget()
def __initWidget(self):
self.addWidget(self.addUrlButton)
# initialize layout
self.viewLayout.setSpacing(0)
self.viewLayout.setAlignment(Qt.AlignTop)
self.viewLayout.setContentsMargins(0, 0, 0, 0)
for url in self.urls:
self.__addUrlItem(url)
self.addUrlButton.clicked.connect(self.__showUrlDialog)
def __showUrlDialog(self):
"""show url dialog"""
choice = LineEditMessageBox(
self.window(), "添加代理网址", "请输入代理网址", "明文"
)
if choice.exec() and self.__validate(choice.input.text()):
if choice.input.text()[-1] == "/":
url = choice.input.text()
else:
url = f"{choice.input.text()}/"
if url in self.urls:
return
self.__addUrlItem(url)
self.urls.append(url)
qconfig.set(self.configItem, self.urls)
self.urlChanged.emit(self.urls)
def __addUrlItem(self, url: str):
"""add url item"""
item = UrlItem(url, self.view)
item.removed.connect(self.__showConfirmDialog)
self.viewLayout.addWidget(item)
item.show()
self._adjustViewSize()
def __showConfirmDialog(self, item: UrlItem):
"""show confirm dialog"""
choice = MessageBox(
"确认",
f"确定要删除 {item.url} 代理网址吗?",
self.window(),
)
if choice.exec():
self.__removeUrl(item)
def __removeUrl(self, item: UrlItem):
"""remove folder"""
if item.url not in self.urls:
return
self.urls.remove(item.url)
self.viewLayout.removeWidget(item)
item.deleteLater()
self._adjustViewSize()
self.urlChanged.emit(self.urls)
qconfig.set(self.configItem, self.urls)
def __validate(self, value):
try:
result = urlparse(value)
return all([result.scheme, result.netloc])
except ValueError:
return False
class StatefulItemCard(CardWidget):
def __init__(self, item: list, parent=None):

View File

@@ -61,7 +61,7 @@ import shutil
from app.core import Config, MainInfoBar, TaskManager
from app.services import Crypto
from app.utils import Updater
from app.utils import DownloadManager
from .Widget import (
LineEditMessageBox,
LineEditSettingCard,
@@ -355,8 +355,19 @@ class MemberManager(QWidget):
while len(maa_version) < 4:
maa_version.append(0)
self.downloader = Updater(Path(folder), "MAA", maa_version, [])
self.downloader = DownloadManager(
Path(folder),
"MAA",
maa_version,
[],
{
"thread_numb": Config.global_config.get(
Config.global_config.update_ThreadNumb
)
},
)
self.downloader.show()
self.downloader.run()
def show_password(self):

View File

@@ -40,6 +40,7 @@ from qfluentwidgets import (
HyperlinkCard,
HeaderCardWidget,
SwitchSettingCard,
RangeSettingCard,
ExpandGroupSettingCard,
PushSettingCard,
ComboBoxSettingCard,
@@ -55,8 +56,13 @@ from pathlib import Path
from app.core import Config, MainInfoBar
from app.services import Crypto, System
from app.utils import Updater
from .Widget import LineEditMessageBox, LineEditSettingCard, PasswordLineEditSettingCard
from app.utils import DownloadManager
from .Widget import (
LineEditMessageBox,
LineEditSettingCard,
PasswordLineEditSettingCard,
UrlListSettingCard,
)
class Setting(QWidget):
@@ -335,6 +341,16 @@ class Setting(QWidget):
updater_version_remote = list(
map(int, version_remote["updater_version"].split("."))
)
remote_proxy_list = version_remote["proxy_list"]
Config.global_config.set(
Config.global_config.update_ProxyUrlList,
list(
set(
Config.global_config.get(Config.global_config.update_ProxyUrlList)
+ remote_proxy_list
)
),
)
# 有版本更新
if (main_version_remote > main_version_current) or (
@@ -368,17 +384,26 @@ class Setting(QWidget):
# 更新更新器
if updater_version_remote > updater_version_current:
# 创建更新进程
self.updater = Updater(
self.updater = DownloadManager(
Config.app_path,
"AUTO_MAA更新器",
main_version_remote,
updater_version_remote,
{
"proxy_list": Config.global_config.get(
Config.global_config.update_ProxyUrlList
),
"thread_numb": Config.global_config.get(
Config.global_config.update_ThreadNumb
),
},
)
# 完成更新器的更新后更新主程序
if main_version_remote > main_version_current:
self.updater.update_process.accomplish.connect(self.update_main)
self.updater.download_accomplish.connect(self.update_main)
# 显示更新页面
self.updater.show()
self.updater.run()
# 更新主程序
elif main_version_remote > main_version_current:
@@ -836,6 +861,19 @@ class UpdaterSettingCard(HeaderCardWidget):
content="选择AUTO_MAA的更新类别",
texts=["稳定版", "公测版"],
)
self.card_ThreadNumb = RangeSettingCard(
configItem=Config.global_config.update_ThreadNumb,
icon=FluentIcon.PAGE_RIGHT,
title="下载器线程数",
content="更新器的下载线程数,建议仅在下载速度较慢时适量拉高",
)
self.card_ProxyUrlList = UrlListSettingCard(
icon=FluentIcon.SETTING,
configItem=Config.global_config.update_ProxyUrlList,
title="代理地址列表",
content="更新器代理地址列表",
parent=self,
)
self.card_CheckUpdate = PushSettingCard(
text="检查更新",
icon=FluentIcon.UPDATE,
@@ -846,6 +884,8 @@ class UpdaterSettingCard(HeaderCardWidget):
Layout = QVBoxLayout()
Layout.addWidget(self.card_IfAutoUpdate)
Layout.addWidget(self.card_UpdateType)
Layout.addWidget(self.card_ThreadNumb)
Layout.addWidget(self.card_ProxyUrlList)
Layout.addWidget(self.card_CheckUpdate)
self.viewLayout.addLayout(Layout)