first commit

This commit is contained in:
Hatanezumi 2023-03-22 22:39:37 +08:00
commit 3c202b5ef1
10 changed files with 1187 additions and 0 deletions

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# RA3附属mod下载管理器
## 介绍
本程序能快速配置skudef文件或是下载附属mod

10
run.py Normal file
View File

@ -0,0 +1,10 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
@Author : Hatanezumi
@Contact : Hatanezumi@chunshengserver.cn
'''
from src import main
if __name__ == '__main__':
main.init()

49
src/AutoProcess.py Normal file
View File

@ -0,0 +1,49 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
@Author : Hatanezumi
@Contact : Hatanezumi@chunshengserver.cn
'''
import os
import json
import requests
def get_mods(base_path:str) -> tuple[bool,str|list[str]]:
if os.path.exists(base_path) is False:
return (False,'未找到{}'.format(base_path))
mod_dirs = [os.path.join(base_path,i) for i in os.listdir(base_path) if os.path.isdir(os.path.join(base_path,i))]
mods = [os.path.join(base_path,i) for i in os.listdir(base_path) if os.path.splitext(i)[-1].lower() == '.skudef']
if len(mod_dirs) == 0 and len(mods) == 0:
return (False,'mod文件夹下无mod')
for mod_dir in mod_dirs:
mod = [os.path.join(mod_dir,i) for i in os.listdir(mod_dir) if os.path.splitext(i)[-1].lower() == '.skudef']
mods += mod
if len(mods) == 0:
return (False,'mod文件夹下无mod')
else:
return (True,mods)
def save_skudef(skufile_path:str,mods:list) -> tuple[bool,str|None]:
try:
with open(skufile_path,'r',encoding='utf-8') as file:
texts = file.readlines()
texts = [text for text in texts if not text.startswith('add-big')]
mods = ['add-big {}\n'.format(mod) for mod in mods]
first_text = texts.pop(0)
texts = mods + texts
texts.insert(0,first_text)
texts[-1] = texts[-1].removesuffix('\n')
with open(skufile_path,'w',encoding='utf-8') as file:
file.writelines(texts)
return (True,None)
except Exception as err:
return (False,err)
def get_cloud(path:str, target, arg):
try:
req = requests.get(path)
if req.status_code != 200:
target(arg,False,"返回值为:{}".format(req.status_code))
return
res = json.loads(req.content)
target(arg,True,res)
except Exception as err:
target(arg,False,err)

Binary file not shown.

Binary file not shown.

341
src/main.py Normal file
View File

@ -0,0 +1,341 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
@Author : Hatanezumi
@Contact : Hatanezumi@chunshengserver.cn
'''
import os
import sys
import py7zr
import requests
import webbrowser
from PySide2.QtWidgets import QApplication, QMessageBox, QFileDialog, QInputDialog, QMainWindow, QComboBox
from PySide2.QtCore import Qt, QStringListModel, Signal, QObject
from PySide2.QtGui import QColor,QIcon, QTextCursor
from ui.MainWindow import Ui_MainWindow
from threading import Thread
from src import AutoProcess
#常量
INIT = 100
REFRESH = 101
GETMODS = 200
GETMODINFO = 201
GETNEWVERSION = 202
GETOTHER = 210
INFO = 300
WARNING = 301
CRITICAL = 302
class CustomizeSingals(QObject):
message_box = Signal(tuple)
set_network_page = Signal(dict)
set_listView_Network = Signal(dict)
set_Status_Tip = Signal(str)
set_progressBar_Download = Signal(int)
download_finished = Signal(str)
download_err = Signal(Exception)
set_new_version = Signal(str)
get_new_version_err = Signal(str)
class Process():
@staticmethod
def set_comboBox(comboBox:QComboBox, texts:list):
comboBox.clear()
comboBox.addItems(texts)
@staticmethod
def get_cloud_data(arg, state:bool, res):
'''
arg:(窗口,模式,获取的内容)
'''
try:
window, mode, source = arg
singals = CustomizeSingals()
singals.message_box.connect(window.message_box)
singals.set_listView_Network.connect(window.set_listView_Network)
singals.set_network_page.connect(window.set_network_page)
singals.set_Status_Tip.connect(window.set_Status_Tip)
singals.set_new_version.connect(window.set_new_version)
singals.get_new_version_err.connect(window.get_new_version_err)
if not state:
if mode == INIT:
if source == GETMODS:
singals.set_Status_Tip.emit('获取云AR信息失败:{}'.format(res))
elif source == GETNEWVERSION:
singals.get_new_version_err.emit(res)
return
elif mode == REFRESH:
if source == GETMODS:
singals.message_box.emit(WARNING,'出现错误',"获取云AR信息失败:{}".format(res),QMessageBox.Ok,QMessageBox.Ok)
elif source == GETMODINFO:
singals.message_box.emit(WARNING,'出现错误',"获取mod信息失败:{}".format(res),QMessageBox.Ok,QMessageBox.Ok)
if source == GETMODS:
singals.set_listView_Network.emit(res)
elif source == GETMODINFO:
singals.set_network_page.emit(res)
elif source == GETNEWVERSION:
singals.set_new_version.emit(res['version'])
except Exception as err:
singals.message_box.emit((WARNING,'出现错误',"获取信息失败:{}".format(err),QMessageBox.Ok,QMessageBox.Ok))
@staticmethod
def download(window:QMainWindow,url:str,path:str):
signals = CustomizeSingals()
signals.set_progressBar_Download.connect(window.set_progressBar_Download)
signals.download_finished.connect(window.download_finished)
signals.download_err.connect(window.download_err)
if not os.path.exists(os.path.split(path)[0]):
signals.download_err.emit('目录不存在:{}'.format(os.path.split(path)[0]))
return
res = requests.get(url, stream=True,headers={"Accept-Encoding":"identity"})
size = 0#初始化已下载大小
chunk_size = 1024#单次下载量
content_size = int(res.headers['content-length'])#总大小
try:
if res.status_code == 200:
with open(path,'wb') as file:
for data in res.iter_content(chunk_size=chunk_size):
file.write(data)
size += len(data)
signals.set_progressBar_Download.emit(int(size / content_size * 100))
signals.download_finished.emit(path)
except Exception as err:
signals.download_err.emit(err)
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None) -> None:
#基础设置
super().__init__(parent)
self.setupUi(self)
self.version = '1.0.0'
#--------------------------
#连接信号
self.comboBox_mods.currentIndexChanged.connect(self.__comboBox_mods_changed)#下拉框内容改变
self.pushButton_R.clicked.connect(self.__on_pushButton_R_clicked)#右移按钮被按下
self.pushButton_L.clicked.connect(self.__on_pushButton_L_clicked)#左移按钮被按下
self.pushButton_up.clicked.connect(self.__on_pushButton_up_clicked)#上移按钮被按下
self.pushButton_down.clicked.connect(self.__on_pushButton_down_clicked)#下移按钮被按下
self.pushButton_save.clicked.connect(self.__on_pushButton_save_clicked)#保存按钮被按下
self.pushButton_nowpath.clicked.connect(self.__on_pushButton_nowpath_clicked)#选择当前目录按钮被按下
self.pushButton_add.clicked.connect(self.__on_pushButton_add_clicked)#添加文件按钮被按下
self.pushButton_savedir.clicked.connect(self.__on_pushButton_savedir_clicked)#保存到按钮被按下
self.listView_Network.clicked.connect(self.__on_listView_Network_clicked)#网络列表被按下
self.pushButton_refresh.clicked.connect(self.__on_pushButton_refresh_clicked)#刷新按钮被按下
self.pushButton_Download.clicked.connect(self.__on_pushButton_Download_clicked)#下载按钮被按下
self.pushButton_release.clicked.connect(self.__on_pushButton_release_clicked)#发布页按钮被按下
#--------------------------
#变量注册(全局变量)
self.select_mod = ''
self.listView_loaded_qsl = QStringListModel()
self.listView_local_qsl = QStringListModel()
self.listView_Network_qsl = QStringListModel()
self.fileDialog = QFileDialog(self)
self.base_mod_path = os.path.join(os.path.splitdrive(os.environ['systemroot'])[0],os.environ['homepath'],'Documents','Red Alert 3','Mods')
self.cloud_mods = {}
self.cloud_mod_source = (None,{})
self.isdownloading = False
#--------------------------
#初始化内容
self.mods = AutoProcess.get_mods(self.base_mod_path)
if self.mods[0] is False:
QMessageBox.warning(self,'获取mod列表失败',self.mods[1],QMessageBox.Ok,QMessageBox.Ok)
else:
Process.set_comboBox(self.comboBox_mods,[os.path.splitext(os.path.split(mod_name)[1])[0] for mod_name in self.mods[1]])
self.label_about_verison.setText('当前版本:{}'.format(self.version))
#绑定模型
self.listView_loacl.setModel(self.listView_local_qsl)
self.listView_loaded.setModel(self.listView_loaded_qsl)
self.listView_Network.setModel(self.listView_Network_qsl)
#显示当前目录
self.lineEdit_nowpath.setText(self.base_mod_path)
#获取云信息
t = Thread(target=AutoProcess.get_cloud,args=('https://cloud.armorrush.com/Hatanezumi/RA3_affiliated_mods/raw/branch/master/mods.json',Process.get_cloud_data,(self,INIT,GETMODS)),daemon=True)
t.start()
#获取更新信息
t = Thread(target=AutoProcess.get_cloud,args=('https://www.chunshengserver.cn/files/RA3mods/RA3_affiliated_mod_downloader.json',Process.get_cloud_data,(self,INIT,GETNEWVERSION)),daemon=True)
t.start()
def __comboBox_mods_changed(self):
if self.mods[0] is False:
return
# currentText = self.comboBox_mods.currentText()#为了保证数据安全采用字符串匹配的方式
# find = False
# for mod_path in self.mods[1]:
# if os.path.split(mod_path)[1].removesuffix('.skudef') == currentText:
# self.select_mod = mod_path
# find = True
# break
# if find is False:
# return
#显示本地列表内容
currentIndex = self.comboBox_mods.currentIndex()#因为有重复的名称,所以采用索引匹配
mod_path = self.mods[1][currentIndex]
files = os.listdir(os.path.split(mod_path)[0])
files_big = [file for file in files if os.path.splitext(file)[1] == '.big' or os.path.splitext(file)[1] == '.lyi']
self.listView_local_qsl.setStringList(files_big)
#显示skudef文件内容
with open(mod_path,'r',encoding='utf-8') as file:
file_text = file.readlines()
file_loads = []
for text in file_text:
if text.startswith('add-big'):
file_loads.append(text.split(' ',1)[1].removesuffix('\n'))
self.listView_loaded_qsl.setStringList(file_loads)
#显示当前文件夹
self.label_nowdir.setText('当前文件夹:{}'.format(os.path.split(os.path.split(mod_path)[0])[1]))
#显示保存到文件夹
self.lineEdit_savedir.setText(os.path.split(mod_path)[0])
def __on_pushButton_R_clicked(self):
currentIndex = self.listView_loacl.currentIndex().row()
if currentIndex == -1:
return
select_mod_name = self.listView_local_qsl.stringList()[currentIndex]
if select_mod_name in self.listView_loaded_qsl.stringList():
return
new_listView_loaded_qsl = self.listView_loaded_qsl.stringList()
new_listView_loaded_qsl.insert(0,select_mod_name)
self.listView_loaded_qsl.setStringList(new_listView_loaded_qsl)
def __on_pushButton_L_clicked(self):
currentIndex = self.listView_loaded.currentIndex().row()
if currentIndex == -1:
return
new_listView_loaded_qsl = self.listView_loaded_qsl.stringList()
new_listView_loaded_qsl.pop(currentIndex)
self.listView_loaded_qsl.setStringList(new_listView_loaded_qsl)
def __on_pushButton_up_clicked(self):
currentIndex = self.listView_loaded.currentIndex().row()
if currentIndex == -1 or currentIndex == 0:
return
new_listView_loaded_qsl = self.listView_loaded_qsl.stringList()
mod_name = new_listView_loaded_qsl.pop(currentIndex)
new_listView_loaded_qsl.insert(currentIndex - 1,mod_name)
self.listView_loaded_qsl.setStringList(new_listView_loaded_qsl)
def __on_pushButton_down_clicked(self):
currentIndex = self.listView_loaded.currentIndex().row()
if currentIndex == -1 or currentIndex == len(self.listView_loaded_qsl.stringList()) - 1:
return
new_listView_loaded_qsl = self.listView_loaded_qsl.stringList()
mod_name = new_listView_loaded_qsl.pop(currentIndex)
new_listView_loaded_qsl.insert(currentIndex + 1,mod_name)
self.listView_loaded_qsl.setStringList(new_listView_loaded_qsl)
def __on_pushButton_save_clicked(self):
mods = self.listView_loaded_qsl.stringList()
currentIndex = self.comboBox_mods.currentIndex()
skudef_path = self.mods[1][currentIndex]
res = AutoProcess.save_skudef(skudef_path,mods)
if res[0]:
QMessageBox.information(self,'保存成功','保存成功',QMessageBox.Ok,QMessageBox.Ok)
else:
select = QMessageBox.critical(self,'保存失败','保存失败:{}'.format(res[1]),QMessageBox.Ok|QMessageBox.Retry,QMessageBox.Ok)
if select == QMessageBox.Retry:
self.__on_pushButton_save_clicked()
def __on_pushButton_nowpath_clicked(self):
currentIndex = self.comboBox_mods.currentIndex()
mod_path = self.mods[1][currentIndex]
select_path = self.fileDialog.getExistingDirectory(self,dir=os.path.split(os.path.split(mod_path)[0])[0])
if select_path == '':
return
mods = AutoProcess.get_mods(select_path)
if mods[0] is False:
QMessageBox.warning(self,'获取mod列表失败',mods[1],QMessageBox.Ok,QMessageBox.Ok)
else:
self.base_mod_path = select_path
self.mods = mods
Process.set_comboBox(self.comboBox_mods,[os.path.splitext(os.path.split(mod_name)[1])[0] for mod_name in mods[1]])
#显示当前目录
self.lineEdit_nowpath.setText(select_path)
def __on_pushButton_add_clicked(self):
add_file_name, select = QInputDialog.getText(self,'请输入要添加的big文件名','请输入要添加的big文件名,要带".big"后缀\n如果不了解请勿随意添加')
if not select:
return
if add_file_name == '':
QMessageBox.warning(self,'错误的输入','输入内容不能为空!',QMessageBox.Ok,QMessageBox.Ok)
return
self.listView_loaded_qsl.setStringList([add_file_name]+self.listView_loaded_qsl.stringList())
def __on_pushButton_savedir_clicked(self):
now_path = self.lineEdit_savedir.text()
if not os.path.exists(now_path):
now_path = self.base_mod_path
select_path = self.fileDialog.getExistingDirectory(self,dir=now_path)
if select_path == '':
return
self.lineEdit_savedir.setText(select_path)
def __on_listView_Network_clicked(self):
currentIndex = self.listView_Network.currentIndex().row()
select_mod_name = self.listView_Network_qsl.stringList()[currentIndex]
if select_mod_name not in self.cloud_mods.keys():
return
t = Thread(target=AutoProcess.get_cloud,args=(self.cloud_mods[select_mod_name],Process.get_cloud_data,(self,REFRESH,GETMODINFO)),daemon=True)
t.start()
def message_box(self,arg):
mode, title, text, Button, defaultButton = arg
self.__message_box(mode,title,text,Button,defaultButton)
def __message_box(self,mode:int,title:str,text:str,Button:QMessageBox.StandardButton,defaultButton:QMessageBox.StandardButton):
if mode == INFO:
QMessageBox.information(self,title,text,Button,defaultButton)
elif mode == WARNING:
QMessageBox.warning(self,title,text,Button,defaultButton)
elif mode == CRITICAL:
QMessageBox.Critical(self,title,text,Button,defaultButton)
def set_network_page(self,res:dict):
self.label_name.setText('名称:'+res['name'])
self.label_author.setText('作者:'+res['author'])
self.label_version.setText('版本:'+res['version'])
self.plainTextEdit_introduce.setPlainText(res['introduce'])
self.cloud_mod_source = (res['name'],res['source'])
Process.set_comboBox(self.comboBox_download,[i['name'] for i in res['source']])
def set_listView_Network(self,res:dict):
self.listView_Network_qsl.setStringList(res.keys())
self.cloud_mods = res
def set_Status_Tip(self,text:str):
self.setStatusTip(text)
def __on_pushButton_refresh_clicked(self):
t = Thread(target=AutoProcess.get_cloud,args=('https://cloud.armorrush.com/Hatanezumi/RA3_affiliated_mods/raw/branch/master/mods.json',Process.get_cloud_data,(self,REFRESH,GETMODS)),daemon=True)
t.start()
def __on_pushButton_Download_clicked(self):
if self.isdownloading:
QMessageBox.information(self,'无法下载','当前有下载任务在进行',QMessageBox.Ok,QMessageBox.Ok)
return
currentText = self.comboBox_download.currentText()
if self.cloud_mod_source[0] != self.listView_Network_qsl.stringList()[self.listView_Network.currentIndex().row()]:
return
link = ''
for source in self.cloud_mod_source[1]:
if source['name'] == currentText:
link = source['link']
if link == '':
return
file_name = link.split('/')[-1]
save_path = self.lineEdit_savedir.text()
self.isdownloading = True
t = Thread(target=Process.download,args=(self,link,os.path.join(save_path,file_name)),daemon=True)
t.start()
def set_progressBar_Download(self,value:int):
self.progressBar_Download.setValue(value)
def download_finished(self,path:str):
self.isdownloading = False
self.progressBar_Download.value(0)
select = QMessageBox.information(self,'下载成功','下载成功,是否自动解压?',QMessageBox.Ok|QMessageBox.Cancel,QMessageBox.Cancel)
if select == QMessageBox.Ok:
try:
with py7zr.SevenZipFile(file=path,mode='r') as file:
file.extractall(path=os.path.split(path)[0])
except Exception as err:
QMessageBox.warning(self,'解压失败','解压失败,原因:{}'.format(err),QMessageBox.Ok,QMessageBox.Ok)
return
else:
QMessageBox.warning(self,'解压成功','解压成功',QMessageBox.Ok,QMessageBox.Ok)
def download_err(self,err:Exception):
self.isdownloading = False
QMessageBox.warning(self,'下载失败','下载失败,原因:{}'.format(err),QMessageBox.Ok,QMessageBox.Ok)
def set_new_version(self,version:str):
self.label_about_newverison.setText("最新版本:"+version)
version_int = int(version.replace('.',''))
self_version = int(self.version.replace('.',''))
if version_int > self_version:
self.label_about_newverison.setText("<font color=red>最新版本:"+version+"(有更新!请点击发布页下载)</font>")
def get_new_version_err(self,err:str):
self.label_about_newverison.setText("<font color=red>最新版本:连接到纯世蜉生失败,原因:{}</font>".format(err))
def __on_pushButton_release_clicked(self):
webbrowser.open('https://cloud.armorrush.com/Hatanezumi')
def init():
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())

375
ui/MainWindow.py Normal file
View File

@ -0,0 +1,375 @@
# -*- coding: utf-8 -*-
################################################################################
## Form generated from reading UI file 'MainWindow.ui'
##
## Created by: Qt User Interface Compiler version 5.15.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(819, 576)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.verticalLayout = QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName(u"verticalLayout")
self.tabWidget_Main = QTabWidget(self.centralwidget)
self.tabWidget_Main.setObjectName(u"tabWidget_Main")
self.tab_local = QWidget()
self.tab_local.setObjectName(u"tab_local")
self.horizontalLayout = QHBoxLayout(self.tab_local)
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.verticalLayout_3 = QVBoxLayout()
self.verticalLayout_3.setObjectName(u"verticalLayout_3")
self.label_local = QLabel(self.tab_local)
self.label_local.setObjectName(u"label_local")
self.verticalLayout_3.addWidget(self.label_local)
self.listView_loacl = QListView(self.tab_local)
self.listView_loacl.setObjectName(u"listView_loacl")
self.listView_loacl.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.verticalLayout_3.addWidget(self.listView_loacl)
self.horizontalLayout.addLayout(self.verticalLayout_3)
self.verticalLayout_2 = QVBoxLayout()
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
self.pushButton_R = QPushButton(self.tab_local)
self.pushButton_R.setObjectName(u"pushButton_R")
self.verticalLayout_2.addWidget(self.pushButton_R)
self.horizontalLayout.addLayout(self.verticalLayout_2)
self.verticalLayout_11 = QVBoxLayout()
self.verticalLayout_11.setObjectName(u"verticalLayout_11")
self.label_loaded = QLabel(self.tab_local)
self.label_loaded.setObjectName(u"label_loaded")
self.verticalLayout_11.addWidget(self.label_loaded)
self.listView_loaded = QListView(self.tab_local)
self.listView_loaded.setObjectName(u"listView_loaded")
self.listView_loaded.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.verticalLayout_11.addWidget(self.listView_loaded)
self.horizontalLayout.addLayout(self.verticalLayout_11)
self.verticalLayout_12 = QVBoxLayout()
self.verticalLayout_12.setObjectName(u"verticalLayout_12")
self.pushButton_up = QPushButton(self.tab_local)
self.pushButton_up.setObjectName(u"pushButton_up")
self.verticalLayout_12.addWidget(self.pushButton_up)
self.pushButton_down = QPushButton(self.tab_local)
self.pushButton_down.setObjectName(u"pushButton_down")
self.verticalLayout_12.addWidget(self.pushButton_down)
self.pushButton_add = QPushButton(self.tab_local)
self.pushButton_add.setObjectName(u"pushButton_add")
self.verticalLayout_12.addWidget(self.pushButton_add)
self.pushButton_L = QPushButton(self.tab_local)
self.pushButton_L.setObjectName(u"pushButton_L")
self.verticalLayout_12.addWidget(self.pushButton_L)
self.horizontalLayout.addLayout(self.verticalLayout_12)
self.verticalLayout_4 = QVBoxLayout()
self.verticalLayout_4.setObjectName(u"verticalLayout_4")
self.horizontalLayout_6 = QHBoxLayout()
self.horizontalLayout_6.setObjectName(u"horizontalLayout_6")
self.label_nowpath = QLabel(self.tab_local)
self.label_nowpath.setObjectName(u"label_nowpath")
self.horizontalLayout_6.addWidget(self.label_nowpath)
self.lineEdit_nowpath = QLineEdit(self.tab_local)
self.lineEdit_nowpath.setObjectName(u"lineEdit_nowpath")
self.lineEdit_nowpath.setReadOnly(True)
self.horizontalLayout_6.addWidget(self.lineEdit_nowpath)
self.pushButton_nowpath = QPushButton(self.tab_local)
self.pushButton_nowpath.setObjectName(u"pushButton_nowpath")
self.horizontalLayout_6.addWidget(self.pushButton_nowpath)
self.verticalLayout_4.addLayout(self.horizontalLayout_6)
self.comboBox_mods = QComboBox(self.tab_local)
self.comboBox_mods.setObjectName(u"comboBox_mods")
self.verticalLayout_4.addWidget(self.comboBox_mods)
self.label_nowdir = QLabel(self.tab_local)
self.label_nowdir.setObjectName(u"label_nowdir")
self.verticalLayout_4.addWidget(self.label_nowdir)
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
self.verticalLayout_4.addItem(self.verticalSpacer)
self.pushButton_save = QPushButton(self.tab_local)
self.pushButton_save.setObjectName(u"pushButton_save")
self.verticalLayout_4.addWidget(self.pushButton_save)
self.horizontalLayout.addLayout(self.verticalLayout_4)
self.tabWidget_Main.addTab(self.tab_local, "")
self.tab_Network = QWidget()
self.tab_Network.setObjectName(u"tab_Network")
self.horizontalLayout_2 = QHBoxLayout(self.tab_Network)
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
self.listView_Network = QListView(self.tab_Network)
self.listView_Network.setObjectName(u"listView_Network")
self.listView_Network.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.horizontalLayout_2.addWidget(self.listView_Network)
self.verticalLayout_7 = QVBoxLayout()
self.verticalLayout_7.setObjectName(u"verticalLayout_7")
self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
self.verticalLayout_7.addItem(self.verticalSpacer_2)
self.pushButton_refresh = QPushButton(self.tab_Network)
self.pushButton_refresh.setObjectName(u"pushButton_refresh")
self.verticalLayout_7.addWidget(self.pushButton_refresh)
self.horizontalLayout_2.addLayout(self.verticalLayout_7)
self.verticalLayout_6 = QVBoxLayout()
self.verticalLayout_6.setObjectName(u"verticalLayout_6")
self.label_name = QLabel(self.tab_Network)
self.label_name.setObjectName(u"label_name")
self.verticalLayout_6.addWidget(self.label_name)
self.label_author = QLabel(self.tab_Network)
self.label_author.setObjectName(u"label_author")
self.verticalLayout_6.addWidget(self.label_author)
self.label_version = QLabel(self.tab_Network)
self.label_version.setObjectName(u"label_version")
self.verticalLayout_6.addWidget(self.label_version)
self.horizontalLayout_3 = QHBoxLayout()
self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
self.label_introduce = QLabel(self.tab_Network)
self.label_introduce.setObjectName(u"label_introduce")
self.horizontalLayout_3.addWidget(self.label_introduce)
self.plainTextEdit_introduce = QPlainTextEdit(self.tab_Network)
self.plainTextEdit_introduce.setObjectName(u"plainTextEdit_introduce")
self.plainTextEdit_introduce.setLineWrapMode(QPlainTextEdit.NoWrap)
self.horizontalLayout_3.addWidget(self.plainTextEdit_introduce)
self.verticalLayout_6.addLayout(self.horizontalLayout_3)
self.horizontalLayout_2.addLayout(self.verticalLayout_6)
self.line = QFrame(self.tab_Network)
self.line.setObjectName(u"line")
self.line.setFrameShape(QFrame.VLine)
self.line.setFrameShadow(QFrame.Sunken)
self.horizontalLayout_2.addWidget(self.line)
self.verticalLayout_8 = QVBoxLayout()
self.verticalLayout_8.setObjectName(u"verticalLayout_8")
self.horizontalLayout_4 = QHBoxLayout()
self.horizontalLayout_4.setObjectName(u"horizontalLayout_4")
self.label_savedir = QLabel(self.tab_Network)
self.label_savedir.setObjectName(u"label_savedir")
self.horizontalLayout_4.addWidget(self.label_savedir)
self.lineEdit_savedir = QLineEdit(self.tab_Network)
self.lineEdit_savedir.setObjectName(u"lineEdit_savedir")
self.lineEdit_savedir.setReadOnly(False)
self.horizontalLayout_4.addWidget(self.lineEdit_savedir)
self.pushButton_savedir = QPushButton(self.tab_Network)
self.pushButton_savedir.setObjectName(u"pushButton_savedir")
self.horizontalLayout_4.addWidget(self.pushButton_savedir)
self.verticalLayout_8.addLayout(self.horizontalLayout_4)
self.horizontalLayout_7 = QHBoxLayout()
self.horizontalLayout_7.setObjectName(u"horizontalLayout_7")
self.label_source = QLabel(self.tab_Network)
self.label_source.setObjectName(u"label_source")
self.horizontalLayout_7.addWidget(self.label_source)
self.comboBox_download = QComboBox(self.tab_Network)
self.comboBox_download.setObjectName(u"comboBox_download")
self.horizontalLayout_7.addWidget(self.comboBox_download)
self.horizontalLayout_7.setStretch(1, 10)
self.verticalLayout_8.addLayout(self.horizontalLayout_7)
self.verticalSpacer_3 = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
self.verticalLayout_8.addItem(self.verticalSpacer_3)
self.progressBar_Download = QProgressBar(self.tab_Network)
self.progressBar_Download.setObjectName(u"progressBar_Download")
self.progressBar_Download.setValue(0)
self.verticalLayout_8.addWidget(self.progressBar_Download)
self.pushButton_Download = QPushButton(self.tab_Network)
self.pushButton_Download.setObjectName(u"pushButton_Download")
self.verticalLayout_8.addWidget(self.pushButton_Download)
self.horizontalLayout_2.addLayout(self.verticalLayout_8)
self.tabWidget_Main.addTab(self.tab_Network, "")
self.tab_about = QWidget()
self.tab_about.setObjectName(u"tab_about")
self.horizontalLayout_5 = QHBoxLayout(self.tab_about)
self.horizontalLayout_5.setObjectName(u"horizontalLayout_5")
self.verticalLayout_9 = QVBoxLayout()
self.verticalLayout_9.setObjectName(u"verticalLayout_9")
self.label_about_author = QLabel(self.tab_about)
self.label_about_author.setObjectName(u"label_about_author")
self.verticalLayout_9.addWidget(self.label_about_author)
self.label_about_contact = QLabel(self.tab_about)
self.label_about_contact.setObjectName(u"label_about_contact")
self.verticalLayout_9.addWidget(self.label_about_contact)
self.horizontalLayout_5.addLayout(self.verticalLayout_9)
self.line_2 = QFrame(self.tab_about)
self.line_2.setObjectName(u"line_2")
self.line_2.setFrameShape(QFrame.VLine)
self.line_2.setFrameShadow(QFrame.Sunken)
self.horizontalLayout_5.addWidget(self.line_2)
self.verticalLayout_10 = QVBoxLayout()
self.verticalLayout_10.setObjectName(u"verticalLayout_10")
self.label_about_verison = QLabel(self.tab_about)
self.label_about_verison.setObjectName(u"label_about_verison")
self.verticalLayout_10.addWidget(self.label_about_verison)
self.label_about_newverison = QLabel(self.tab_about)
self.label_about_newverison.setObjectName(u"label_about_newverison")
self.verticalLayout_10.addWidget(self.label_about_newverison)
self.pushButton_release = QPushButton(self.tab_about)
self.pushButton_release.setObjectName(u"pushButton_release")
self.verticalLayout_10.addWidget(self.pushButton_release)
self.horizontalLayout_5.addLayout(self.verticalLayout_10)
self.tabWidget_Main.addTab(self.tab_about, "")
self.verticalLayout.addWidget(self.tabWidget_Main)
MainWindow.setCentralWidget(self.centralwidget)
self.statusBar = QStatusBar(MainWindow)
self.statusBar.setObjectName(u"statusBar")
MainWindow.setStatusBar(self.statusBar)
self.retranslateUi(MainWindow)
self.tabWidget_Main.setCurrentIndex(0)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"RA3\u9644\u5c5emod\u4e0b\u8f7d\u5668", None))
#if QT_CONFIG(statustip)
MainWindow.setStatusTip("")
#endif // QT_CONFIG(statustip)
self.label_local.setText(QCoreApplication.translate("MainWindow", u"\u5f53\u524d\u6587\u4ef6\u5939\u4e0b\u7684big\u6587\u4ef6", None))
self.pushButton_R.setText(QCoreApplication.translate("MainWindow", u"\u2192", None))
self.label_loaded.setText(QCoreApplication.translate("MainWindow", u"\u5f53\u524d\u52a0\u8f7d\u7684\u6587\u4ef6", None))
self.pushButton_up.setText(QCoreApplication.translate("MainWindow", u"\u2191", None))
self.pushButton_down.setText(QCoreApplication.translate("MainWindow", u"\u2193", None))
self.pushButton_add.setText(QCoreApplication.translate("MainWindow", u"+", None))
self.pushButton_L.setText(QCoreApplication.translate("MainWindow", u"-", None))
self.label_nowpath.setText(QCoreApplication.translate("MainWindow", u"\u5f53\u524d\u76ee\u5f55:", None))
self.pushButton_nowpath.setText(QCoreApplication.translate("MainWindow", u"...", None))
self.label_nowdir.setText(QCoreApplication.translate("MainWindow", u"\u5f53\u524d\u6587\u4ef6\u5939:", None))
self.pushButton_save.setText(QCoreApplication.translate("MainWindow", u"\u4fdd\u5b58", None))
self.tabWidget_Main.setTabText(self.tabWidget_Main.indexOf(self.tab_local), QCoreApplication.translate("MainWindow", u"\u672c\u5730", None))
self.pushButton_refresh.setText(QCoreApplication.translate("MainWindow", u"\u5237\u65b0", None))
self.label_name.setText(QCoreApplication.translate("MainWindow", u"\u540d\u79f0:", None))
self.label_author.setText(QCoreApplication.translate("MainWindow", u"\u4f5c\u8005:", None))
self.label_version.setText(QCoreApplication.translate("MainWindow", u"\u7248\u672c:", None))
self.label_introduce.setText(QCoreApplication.translate("MainWindow", u"\u4ecb\u7ecd:", None))
self.label_savedir.setText(QCoreApplication.translate("MainWindow", u"\u4fdd\u5b58\u5230:", None))
self.pushButton_savedir.setText(QCoreApplication.translate("MainWindow", u"...", None))
self.label_source.setText(QCoreApplication.translate("MainWindow", u"\u4e0b\u8f7d\u6e90:", None))
self.pushButton_Download.setText(QCoreApplication.translate("MainWindow", u"\u4e0b\u8f7d", None))
self.tabWidget_Main.setTabText(self.tabWidget_Main.indexOf(self.tab_Network), QCoreApplication.translate("MainWindow", u"\u7f51\u7edc", None))
self.label_about_author.setText(QCoreApplication.translate("MainWindow", u"\u4f5c\u8005:\u7530\u9f20-Hatanezumi", None))
self.label_about_contact.setText(QCoreApplication.translate("MainWindow", u"\u8054\u7cfb:Hatanezumi@chunshengserver.cn", None))
self.label_about_verison.setText(QCoreApplication.translate("MainWindow", u"\u5f53\u524d\u7248\u672c:", None))
self.label_about_newverison.setText(QCoreApplication.translate("MainWindow", u"\u6700\u65b0\u7248\u672c:", None))
self.pushButton_release.setText(QCoreApplication.translate("MainWindow", u"\u53d1\u5e03\u9875", None))
self.tabWidget_Main.setTabText(self.tabWidget_Main.indexOf(self.tab_about), QCoreApplication.translate("MainWindow", u"\u5173\u4e8e", None))
#if QT_CONFIG(statustip)
self.statusBar.setStatusTip("")
#endif // QT_CONFIG(statustip)
#if QT_CONFIG(accessibility)
self.statusBar.setAccessibleName("")
#endif // QT_CONFIG(accessibility)
#if QT_CONFIG(accessibility)
self.statusBar.setAccessibleDescription("")
#endif // QT_CONFIG(accessibility)
# retranslateUi

404
ui/MainWindow.ui Normal file
View File

@ -0,0 +1,404 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>819</width>
<height>576</height>
</rect>
</property>
<property name="windowTitle">
<string>RA3附属mod下载器</string>
</property>
<property name="statusTip">
<string/>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget_Main">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab_local">
<attribute name="title">
<string>本地</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="label_local">
<property name="text">
<string>当前文件夹下的big文件</string>
</property>
</widget>
</item>
<item>
<widget class="QListView" name="listView_loacl">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QPushButton" name="pushButton_R">
<property name="text">
<string>→</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QLabel" name="label_loaded">
<property name="text">
<string>当前加载的文件</string>
</property>
</widget>
</item>
<item>
<widget class="QListView" name="listView_loaded">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_12">
<item>
<widget class="QPushButton" name="pushButton_up">
<property name="text">
<string>↑</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_down">
<property name="text">
<string>↓</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_add">
<property name="text">
<string>+</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_L">
<property name="text">
<string>-</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLabel" name="label_nowpath">
<property name="text">
<string>当前目录:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_nowpath">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_nowpath">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QComboBox" name="comboBox_mods"/>
</item>
<item>
<widget class="QLabel" name="label_nowdir">
<property name="text">
<string>当前文件夹:</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_save">
<property name="text">
<string>保存</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_Network">
<attribute name="title">
<string>网络</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QListView" name="listView_Network">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_refresh">
<property name="text">
<string>刷新</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QLabel" name="label_name">
<property name="text">
<string>名称:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_author">
<property name="text">
<string>作者:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_version">
<property name="text">
<string>版本:</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_introduce">
<property name="text">
<string>介绍:</string>
</property>
</widget>
</item>
<item>
<widget class="QPlainTextEdit" name="plainTextEdit_introduce">
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_savedir">
<property name="text">
<string>保存到:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_savedir">
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_savedir">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7" stretch="0,10">
<item>
<widget class="QLabel" name="label_source">
<property name="text">
<string>下载源:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBox_download"/>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QProgressBar" name="progressBar_Download">
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_Download">
<property name="text">
<string>下载</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_about">
<attribute name="title">
<string>关于</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<layout class="QVBoxLayout" name="verticalLayout_9">
<item>
<widget class="QLabel" name="label_about_author">
<property name="text">
<string>作者:田鼠-Hatanezumi</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_about_contact">
<property name="text">
<string>联系:Hatanezumi@chunshengserver.cn</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
<widget class="QLabel" name="label_about_verison">
<property name="text">
<string>当前版本:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_about_newverison">
<property name="text">
<string>最新版本:</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_release">
<property name="text">
<string>发布页</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QStatusBar" name="statusBar">
<property name="statusTip">
<string/>
</property>
<property name="accessibleName">
<string/>
</property>
<property name="accessibleDescription">
<string/>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

Binary file not shown.

5
ui/自动格式转换.py Normal file
View File

@ -0,0 +1,5 @@
import os
files = [file for file in os.listdir() if os.path.splitext(file)[1] == '.ui']
for file in files:
os.system('pyside2-uic {} > {}'.format(file,os.path.splitext(file)[0] + '.py'))