From 2e2617627db9d90dbbf7ebb9894a6699d3486f03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E9=BC=A0Hatanezumi?= <13630961608@163.com> Date: Sat, 30 Sep 2023 13:18:59 +0800 Subject: [PATCH] v1.1.0 --- src/AutoProcess.py | 12 ++- src/__pycache__/AutoProcess.cpython-310.pyc | Bin 3572 -> 4012 bytes src/__pycache__/main.cpython-310.pyc | Bin 18482 -> 21120 bytes src/main.py | 101 ++++++++++++++++---- ui/MainWindow.py | 16 +++- ui/MainWindow.ui | 9 +- ui/__pycache__/MainWindow.cpython-310.pyc | Bin 8423 -> 8568 bytes 7 files changed, 114 insertions(+), 24 deletions(-) diff --git a/src/AutoProcess.py b/src/AutoProcess.py index 62bd22a..2ab2a82 100644 --- a/src/AutoProcess.py +++ b/src/AutoProcess.py @@ -75,4 +75,14 @@ def get_mod_path() -> tuple[str,str]: except: documents_path = os.path.join(os.path.splitdrive(os.environ['systemroot'])[0],os.environ['homepath'],'Documents') base_mod_path = os.path.join(documents_path,'Red Alert 3','Mods') - return (documents_path,base_mod_path) \ No newline at end of file + return (documents_path,base_mod_path) +def get_ARModLauncher_path() -> tuple[bool,str]: + try: + key = winreg.OpenKeyEx(winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\ARModLauncher.exe') + dir = winreg.QueryValueEx(key,'') + dir = os.path.split(dir[0])[0] + return (True,dir) + except FileNotFoundError: + return (False,'未找到AR启动器目录') + except Exception as err: + return (False,err) \ No newline at end of file diff --git a/src/__pycache__/AutoProcess.cpython-310.pyc b/src/__pycache__/AutoProcess.cpython-310.pyc index 8037a5701245913f06f35634725e17b96ce46005..e5743eaf5302b491be1a1ee872bd2c9bc9e9f043 100644 GIT binary patch delta 528 zcmY+9&ubGw6vyA2Y&PrSZVRRhO#@1W!cr*oT(zuibF!@@!C+XZB{OMLN;b?+NE;H< zLl5f7P&^bpv>;MM{DI)9dhpLEUbp@O-t|pIq3K2AeDBkbQ^dv3hwRiI)O7#9NRiMF zF3^g12;IDbBUG@(I3BY;&?(ge&Pby&w$evt4|!@FjxX3pZuGFuDo_FgRAzSyLFYr@ z=?ll&okQp|gs#oa9;2HBFm;*C$28jCy@MU_Gb`Pt(rTex35rYMa-$}rII63#(rEIi z6Nd|JDMeE~5HfB=%`j-SZrop2n{gNvmm_{}z1^&B3OOTogj}S5NFyG4Y&&|1i0G!EtR{#J2 delta 88 zcmZ1@|3#WFpO=@50SK%r8$az~Wc1#=o@oyk ot0tqLCjVq^{)EW|{7MocKy55c94s7+AgIKo#K*@k!zINB0OU0iU;qFB diff --git a/src/__pycache__/main.cpython-310.pyc b/src/__pycache__/main.cpython-310.pyc index 58e854f8c548f3206fd838592981756d72ede026..3de8a49b1e010e89aae0ebc3dbd67868743e8226 100644 GIT binary patch delta 7620 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 diff --git a/src/main.py b/src/main.py index 705f889..7018c6a 100644 --- a/src/main.py +++ b/src/main.py @@ -35,7 +35,7 @@ class CustomizeSingals(QObject): set_listView_Network = Signal(dict) set_Status_Tip = Signal(str) set_progressBar_Download = Signal(int) - download_finished = Signal(str) + download_finished = Signal(str,dict) download_err = Signal(Exception) set_new_version = Signal(str) get_new_version_err = Signal(str) @@ -85,7 +85,7 @@ class Process(): except Exception as err: singals.message_box.emit((WARNING,'出现错误',"获取信息失败:{}".format(err),QMessageBox.Ok,QMessageBox.Ok)) @staticmethod - def download(window:QMainWindow,url:str,path:str): + def download(window:QMainWindow,url:str,path:str,info:dict): signals = CustomizeSingals() signals.set_progressBar_Download.connect(window.set_progressBar_Download) signals.download_finished.connect(window.download_finished) @@ -93,20 +93,35 @@ class Process(): 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: + res = requests.get(url, stream=True,headers={"Accept-Encoding":"identity"},timeout=10) + size = 0#初始化已下载大小 + chunk_size = 1024#单次下载量 + content_size = int(res.headers['content-length'])#总大小 if res.status_code == 200: with open(path,'wb') as file: for data in res.iter_content(chunk_size=chunk_size): + if window.isdownloading is False: + file.close() + os.remove(path) + signals.set_progressBar_Download.emit(0) + return file.write(data) size += len(data) signals.set_progressBar_Download.emit(int(size / content_size * 100)) - signals.download_finished.emit(path) + signals.download_finished.emit(path,info) except Exception as err: signals.download_err.emit(err) + @staticmethod + def clear_localPage_everything(window:QMainWindow): + ''' + 清除本地页面中能显示的所有的物体的内容 + ''' + window.comboBox_mods.clear() + window.listView_local_qsl.setStringList([]) + window.listView_loaded_qsl.setStringList([]) + window.lineEdit_nowpath.setText('') + window.label_nowdir.setText('') class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self, parent=None) -> None: #基础设置 @@ -115,7 +130,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): if os.path.exists(os.path.join(os.getcwd(),'ui','ra3.ico')): self.icon = QIcon(os.path.join(os.getcwd(),'ui','ra3.ico')) self.setWindowIcon(self.icon) - self.version = '1.0.3' + self.version = '1.1.0' #-------------------------- #连接信号 self.comboBox_mods.currentIndexChanged.connect(self.__comboBox_mods_changed)#下拉框内容改变 @@ -134,6 +149,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.pushButton_changeDir_RA3.clicked.connect(self.__on_pushButton_changeDir_RA3_clicked)#切换到RA3目录按钮被按下 self.pushButton_changeDir_mod.clicked.connect(self.__on_pushButton_changeDir_mod_clicked)#切换到mod目录被按下 self.pushButton_localRefresh.clicked.connect(self.__on_pushButton_localRefresh_clicked)#本地刷新按钮被按下 + self.pushButton_changeDir_ARModLauncher.clicked.connect(self.__on_pushButton_changeDir_ARModLauncher_clicked)#切换到AR启动器目录按钮被按下 #-------------------------- #变量注册(全局变量) self.select_mod = '' @@ -145,6 +161,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.cloud_mods = {} self.cloud_mod_source = (None,{}) self.isdownloading = False + self.selected_mod_info = {} + self.download_info = (None,None)#第一个参数为线程,第二个参数为保存地址 self.ra3_path = AutoProcess.get_ra3_path() if self.ra3_path[0] is False: self.ra3_path = '' @@ -152,6 +170,12 @@ class MainWindow(QMainWindow, Ui_MainWindow): QMessageBox.warning(self,'获取RA3目录失败','无法获取RA3目录,原因:{}'.format(self.ra3_path[1]),QMessageBox.StandardButton.Ok,QMessageBox.StandardButton.Ok) else: self.ra3_path = self.ra3_path[1] + self.ARModLauncher_path = AutoProcess.get_ARModLauncher_path() + if self.ARModLauncher_path[0] is False: + self.ARModLauncher_path = '' + self.pushButton_changeDir_ARModLauncher.setEnabled(False) + else: + self.ARModLauncher_path = os.path.join(self.ARModLauncher_path[1],'Resources','CustomContent') #-------------------------- #初始化内容 self.mods = AutoProcess.get_mods(self.base_mod_path) @@ -161,7 +185,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): 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_local.setModel(self.listView_local_qsl) self.listView_loaded.setModel(self.listView_loaded_qsl) self.listView_Network.setModel(self.listView_Network_qsl) #显示当前目录 @@ -197,7 +221,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): #显示保存到文件夹 self.lineEdit_savedir.setText(os.path.split(mod_path)[0]) def __on_pushButton_R_clicked(self): - currentIndex = self.listView_loacl.currentIndex().row() + currentIndex = self.listView_local.currentIndex().row() if currentIndex == -1: return select_mod_name = self.listView_local_qsl.stringList()[currentIndex] @@ -289,6 +313,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): elif mode == CRITICAL: QMessageBox.Critical(self,title,text,Button,defaultButton) def set_network_page(self,res:dict): + self.selected_mod_info = res self.label_name.setText('名称:'+res['name']) self.label_author.setText('作者:'+res['author']) self.label_version.setText('版本:'+res['version']) @@ -305,7 +330,10 @@ class MainWindow(QMainWindow, Ui_MainWindow): t.start() def __on_pushButton_Download_clicked(self): if self.isdownloading: - QMessageBox.information(self,'无法下载','当前有下载任务在进行',QMessageBox.Ok,QMessageBox.Ok) + select = QMessageBox.question(self,'是否终止','确定要终止下载?已下载的进度不会被保存',QMessageBox.Yes|QMessageBox.Cancel,QMessageBox.Cancel) + if select == QMessageBox.Yes: + self.isdownloading = False + self.pushButton_Download.setText('下载') return currentText = self.comboBox_download.currentText() if self.cloud_mod_source[0] != self.listView_Network_qsl.stringList()[self.listView_Network.currentIndex().row()]: @@ -319,25 +347,59 @@ class MainWindow(QMainWindow, Ui_MainWindow): 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) + self.pushButton_Download.setText('终止') + t = Thread(target=Process.download,args=(self,link,os.path.join(save_path,file_name),self.selected_mod_info),daemon=True) + self.download_info = (t,os.path.join(save_path,file_name)) t.start() def set_progressBar_Download(self,value:int): self.progressBar_Download.setValue(value) - def download_finished(self,path:str): + def download_finished(self,path:str,info:dict): self.isdownloading = False self.progressBar_Download.setValue(0) - select = QMessageBox.question(self,'下载成功','下载成功,是否自动解压?',QMessageBox.Ok|QMessageBox.Cancel,QMessageBox.Cancel) - if select == QMessageBox.Ok: + in_ARModLauncher_path = False + self.pushButton_Download.setText('下载') + outpath = os.path.split(path)[0] + if os.path.split(path)[0] == self.ARModLauncher_path: + in_ARModLauncher_path = True + outpath = os.path.join(outpath,os.path.split(path)[1].split('.')[0]) + select = QMessageBox.question(self,'下载成功','下载成功,是否自动解压?',QMessageBox.Yes|QMessageBox.Cancel,QMessageBox.Yes) + if select == QMessageBox.Yes: try: + if not os.path.exists(outpath): + os.mkdir(outpath) with py7zr.SevenZipFile(file=path,mode='r') as file: - file.extractall(path=os.path.split(path)[0]) + file.extractall(path=outpath) except Exception as err: QMessageBox.warning(self,'解压失败','解压失败,原因:{}'.format(err),QMessageBox.Ok,QMessageBox.Ok) return else: - QMessageBox.information(self,'解压成功','解压成功',QMessageBox.Ok,QMessageBox.Ok) + QMessageBox.information(self,'解压成功','解压成功',QMessageBox.Ok,QMessageBox.Ok) + if in_ARModLauncher_path: + select = QMessageBox.question(self,'是否生成配置文件','检测到当前位于AR启动器的目录中,是否生成可以被AR启动器识别的附属mod配置文件?',QMessageBox.Yes|QMessageBox.Cancel,QMessageBox.Yes) + if select == QMessageBox.Yes: + try: + mods = [i for i in os.listdir(outpath) if os.path.splitext(i)[-1].lower() == '.skudef'] + info_keys = info.keys() + mod_info = {} + mod_info['Id'] = os.path.split(path)[1].split('.')[0] + mod_info['Version'] = info['version'] if 'version' in info_keys else 'None' + mod_info['DisplayName_CN'] = info['name'] if 'name' in info_keys else 'None' + mod_info['DisplayName_EN'] = info['name_EN'] if 'name_EN' in info_keys else 'None' + mod_info['FilePath'] = os.path.join(os.path.split(path)[1].split('.')[0],mods[0])#仅添加第一个找到的skudef文件 + mod_info['Desc_CN'] = info['introduce'] if 'introduce' in info_keys else 'None' + mod_info['Desc_EN'] = info['introduce_EN'] if 'introduce_EN' in info_keys else 'None' + with open(os.path.join(outpath,'config.json'),'w') as file: + json.dump(mod_info,file) + except Exception as err: + QMessageBox.warning(self,'生成失败','生成失败,原因:{}'.format(err),QMessageBox.Ok,QMessageBox.Ok) + return + else: + QMessageBox.information(self,'生成成功','生成成功',QMessageBox.Ok,QMessageBox.Ok) def download_err(self,err:Exception): self.isdownloading = False + os.remove(self.download_info[1]) + self.progressBar_Download.setValue(0) + self.pushButton_Download.setText('下载') QMessageBox.warning(self,'下载失败','下载失败,原因:{}'.format(err),QMessageBox.Ok,QMessageBox.Ok) def set_new_version(self,version:str): self.label_about_newverison.setText("最新版本:"+version) @@ -394,6 +456,11 @@ class MainWindow(QMainWindow, Ui_MainWindow): return else: self.comboBox_mods.setCurrentIndex(currentIndex) + def __on_pushButton_changeDir_ARModLauncher_clicked(self): + if self.ARModLauncher_path == '': + self.pushButton_changeDir_ARModLauncher.setEnabled(False) + return + self.lineEdit_savedir.setText(self.ARModLauncher_path) def init(): app = QApplication(sys.argv) main_window = MainWindow() diff --git a/ui/MainWindow.py b/ui/MainWindow.py index a0a7e69..66c8363 100644 --- a/ui/MainWindow.py +++ b/ui/MainWindow.py @@ -3,7 +3,7 @@ ################################################################################ ## Form generated from reading UI file 'MainWindow.ui' ## -## Created by: Qt User Interface Compiler version 6.4.2 +## Created by: Qt User Interface Compiler version 6.5.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -43,11 +43,11 @@ class Ui_MainWindow(object): 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.listView_local = QListView(self.tab_local) + self.listView_local.setObjectName(u"listView_local") + self.listView_local.setEditTriggers(QAbstractItemView.NoEditTriggers) - self.verticalLayout_3.addWidget(self.listView_loacl) + self.verticalLayout_3.addWidget(self.listView_local) self.horizontalLayout.addLayout(self.verticalLayout_3) @@ -276,6 +276,11 @@ class Ui_MainWindow(object): self.verticalLayout_8.addLayout(self.horizontalLayout_7) + self.pushButton_changeDir_ARModLauncher = QPushButton(self.tab_Network) + self.pushButton_changeDir_ARModLauncher.setObjectName(u"pushButton_changeDir_ARModLauncher") + + self.verticalLayout_8.addWidget(self.pushButton_changeDir_ARModLauncher) + self.verticalSpacer_3 = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.verticalLayout_8.addItem(self.verticalSpacer_3) @@ -398,6 +403,7 @@ class Ui_MainWindow(object): 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_changeDir_ARModLauncher.setText(QCoreApplication.translate("MainWindow", u"\u5207\u6362\u5230AR\u542f\u52a8\u5668\u76ee\u5f55", 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)) diff --git a/ui/MainWindow.ui b/ui/MainWindow.ui index 3b18ca3..8379ec7 100644 --- a/ui/MainWindow.ui +++ b/ui/MainWindow.ui @@ -38,7 +38,7 @@ - + QAbstractItemView::NoEditTriggers @@ -323,6 +323,13 @@ + + + + 切换到AR启动器目录 + + + diff --git a/ui/__pycache__/MainWindow.cpython-310.pyc b/ui/__pycache__/MainWindow.cpython-310.pyc index 6fbd21bddc5b62b9350ec8c2f207f2caa4b1cf2d..fcfc9a7fab035c96d0b66495deea7fe4b9b94523 100644 GIT binary patch delta 1271 zcmZ`&OKTHR6rMY2HKa}YOe$$jUuYX!1PLgDkEZFv)>NT|)-+A0lbLBAO_Mm86f1#3 zyRi7c;u(3ZAr+B(?UkYnPfR#1-N#sQ71NIaKEhygsJRuKk=DjI|d zntLElkg9S8knRcq3V`dp;R>jeV$Yrq0qQ8769h*P9Ns;uApTn6UYdg16x4dD$3ikX zTL@4Hcpv4G0#q1(v{$dAmEKfV=1BW3GgZl#IN&^eP3&0QM&*~G0>E?xf zG7)4V$aap?Rboknd8@rfXC=z|z%hmMR{PSd+OPQHJ9nK`kBUyBpaYRHXQ`gNk$%w# zpa`5bvPTs$GJQE=BQvWfiBCL|XKBX+bb2$bA~g!NGP)BbmP7P0<3Pos`6WX#M{>QH zn#iGI+j;#%Qj%&)XGLa=abLz>+g(=Rwa>OHQ+r!Fn~C;j6(yDAgeaekNPRJx^Nx2iPt-4*!D5>IF$wVgjESOY?#xa~`=9Xn798H*-c(#`#26 z!b$rXmwb(I)xi0rq$2Z)iI^CX6uFz|7x7#Bq~$)qpQj=8;SR?DdZQ&BL#V8htwi`$ z!xPk_g%0(wo))!SK`JXE(J3-{lX1y9wH_{CM?bdKJTerGRKenp&J5R4^tJxS*ID$n z=|1`jZq+32oZ?oG?ZRC;rps*CZZ{4imlLKhtls!>=W${6rFXQj_M&ieqwsKJ`_c2l z>vjC4=_%^Q%ZJ~2$oAv}31cLrNw`XaLPC~=1ro^CS>Xbr-3 z#4s5@fO=$M9W4Ija^PRCTKwH*#(!Kv=Yt*LE;DVjj?>LfBxtvqkE7~RW25%I#q|%* CD`}em delta 1142 zcmZ9L&rcIU6vubAMM%>Yg0^6*v?b9Nswg4xN22nhLM^o>h6J#M?rwJ$>{2P&F36z? ziCj&H8N5#qo;>MZjEP782~OVp3yj?K&CIqGn)LPizVmr+=Iu^T=YG!y>w$nzg3om3 zHjd}N1REao-FfHv)q6036L{3VW8Q`DFpys=&15R9mIh($Tg_Wa_{WG74R$IKWpjY#2SBsl?#{-m=0LZ-9S+K z1quU&fodO0P?%F0SSt}N5Yi1gZ)eQ*7zVwGBj>sroM&%O488$s1G=_{6J0ml8u73+ zH|wMK_&)yvLoYW$d3mqbO~l`16`U$`DsUQ6ljWk4ZZ(lmW*@DI`((eN+rq`tk~H>$ zYzB{HO?OU%{T?Sh7)7Y=WG^qs>EghiVcAt(t1azlx?w3(Rtm1UWkNXVYZ&&jR@*hK zElA0?(4(s-1K?$hZQIgnD^tqYgvOn( z!!t7RMf}Nl3)zUu7~u$(TAr57uUmrlxNelYh}?)a82>og;S*haih8ie9XmzGy7aiv zeDG1{Z*&n6_4;R&CjOD16KoJ`iG?}~J1jI>^2OEP}X#d~#SOYAj54VqWq-79`uTOYmEYd~CyA4S1_#g5nWWcCN)I(7;)9cdeKh F`41$xGvELK