@@ -7,31 +7,78 @@ class ExportWorker(QThread):
77 file_copied = Signal (str )
88 finished_export = Signal (str )
99
10- def __init__ (self , files , addon_content_path , dest_root , layout , addon_name , asset_stem ):
10+ def __init__ (self , files , addon_content_path , dest_root , layout , addon_name , asset_stem , export_to_zip = False , zip_name = "Export" ):
1111 super ().__init__ ()
1212 self .files = files
1313 self .addon_content_path = addon_content_path
1414 self .dest_root = dest_root
1515 self .layout = layout
1616 self .addon_name = addon_name
1717 self .asset_stem = asset_stem
18+ self .export_to_zip = export_to_zip
19+ self .zip_name = zip_name
1820
1921 def run (self ):
22+ import tempfile
23+ import zipfile
24+ SCANNABLE_EXTS = {'.vmdl' , '.vsmart' , '.vmat' , '.vpcf' , '.vsndevts' , '.vsnd' }
25+
26+ path_mapping = {}
27+ for src in self .files :
28+ old_rel = os .path .relpath (src , self .addon_content_path ).replace ('\\ ' , '/' )
29+ new_rel = self ._compute_dest_rel (src )
30+ path_mapping [old_rel ] = new_rel
31+
32+ if self .export_to_zip :
33+ temp_dir = tempfile .mkdtemp ()
34+ base_dir = temp_dir
35+ else :
36+ base_dir = self .dest_root
37+
2038 for i , src in enumerate (self .files ):
21- dest = self ._compute_dest (src )
39+ dest = self ._compute_dest (src , base_dir )
2240 os .makedirs (os .path .dirname (dest ), exist_ok = True )
2341 try :
24- shutil .copy2 (src , dest )
42+ ext = os .path .splitext (src )[1 ].lower ()
43+ if ext in SCANNABLE_EXTS :
44+ with open (src , 'r' , encoding = 'utf-8' , errors = 'ignore' ) as f :
45+ content = f .read ()
46+
47+ for old_rel in sorted (path_mapping .keys (), key = len , reverse = True ):
48+ new_rel = path_mapping [old_rel ]
49+ if old_rel != new_rel and old_rel in content :
50+ content = content .replace (old_rel , new_rel )
51+
52+ with open (dest , 'w' , encoding = 'utf-8' ) as f :
53+ f .write (content )
54+ else :
55+ shutil .copy2 (src , dest )
2556 self .file_copied .emit (src )
2657 except Exception as e :
2758 print (f"Error copying { src } to { dest } : { e } " )
2859 self .progress .emit (int ((i + 1 ) / len (self .files ) * 100 ))
60+
61+ if self .export_to_zip :
62+ zip_path = os .path .join (self .dest_root , self .zip_name )
63+ shutil .make_archive (zip_path , 'zip' , temp_dir )
64+ shutil .rmtree (temp_dir )
65+
2966 self .finished_export .emit (self .dest_root )
3067
31- def _compute_dest (self , src ):
32- rel = os .path .relpath (src , self .addon_content_path )
68+ def _compute_dest_rel (self , src ):
69+ rel = os .path .relpath (src , self .addon_content_path ). replace ( ' \\ ' , '/' )
3370 if self .layout == 'thirdparty' :
34- return os .path .join (self .dest_root ,
35- 'folder_thirdparty' , self .addon_name ,
36- self .asset_stem , rel )
37- return os .path .join (self .dest_root , rel )
71+ parts = rel .split ("/" , 1 )
72+ if len (parts ) == 2 :
73+ root_dir , rest = parts [0 ], parts [1 ]
74+ path_suffix = "thirdparty"
75+ if self .addon_name :
76+ path_suffix = f"{ path_suffix } /{ self .addon_name } "
77+ if self .asset_stem :
78+ path_suffix = f"{ path_suffix } /{ self .asset_stem } "
79+ return f"{ root_dir } /{ path_suffix } /{ rest } "
80+ return rel
81+
82+ def _compute_dest (self , src , base_dir ):
83+ rel = self ._compute_dest_rel (src )
84+ return os .path .normpath (os .path .join (base_dir , rel ))
0 commit comments