1 |
#include "packagewizard.h" |
2 |
|
3 |
PackageWizard::PackageWizard(QString workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger) |
4 |
{ |
5 |
this->workspaceWizardLocation=workspaceWizardLocation; |
6 |
this->vagoSettings=vagoSettings; |
7 |
this->myLogger=myLogger; |
8 |
this->packagesLocation=this->workspaceWizardLocation+"/Packages"; |
9 |
} |
10 |
|
11 |
int PackageWizard::exec(){ |
12 |
QWizard myWizard; |
13 |
|
14 |
myWizard.setWindowIcon(QIcon(":/new/icons/package.png")); |
15 |
|
16 |
//Center and resize QWizard (http://www.thedazzlersinc.com/source/2012/06/04/qt-center-window-in-screen/) |
17 |
myWizard.resize(640,480); |
18 |
QRect position = myWizard.frameGeometry(); |
19 |
position.moveCenter(QDesktopWidget().availableGeometry().center()); |
20 |
myWizard.move(position.topLeft()); |
21 |
// |
22 |
|
23 |
PackagePage2 *page2 = new PackagePage2(this->myLogger); |
24 |
PackagePage3 *page3 = new PackagePage3(); |
25 |
PackagePage4 *page4 = new PackagePage4(); |
26 |
PackagePageFinal *pageFinal = new PackagePageFinal(this->vagoSettings); |
27 |
|
28 |
myWizard.addPage(createIntroPage()); |
29 |
myWizard.addPage(page2); |
30 |
myWizard.addPage(page3); |
31 |
myWizard.addPage(page4); |
32 |
myWizard.addPage(pageFinal); |
33 |
|
34 |
myWizard.setWindowTitle("AIE2 Package Creator"); |
35 |
|
36 |
//If wizard finished with sucess |
37 |
if(myWizard.exec()){ //modal and wait for finalization |
38 |
createPackage(myWizard, page4); |
39 |
} |
40 |
|
41 |
return 0; |
42 |
} |
43 |
|
44 |
QWizardPage* PackageWizard::createIntroPage() { |
45 |
QWizardPage *page = new QWizardPage; |
46 |
page->setTitle("Introduction"); |
47 |
|
48 |
QLabel *label = new QLabel("Welcome to the Anniversary Edition Installer 2 (AIE2) package" |
49 |
" creator wizard.\n" |
50 |
"This wizard will allow you to create in a few and simple steps a package for AIE2."); |
51 |
label->setWordWrap(true); |
52 |
|
53 |
QVBoxLayout *layout = new QVBoxLayout; |
54 |
layout->addWidget(label); |
55 |
page->setLayout(layout); |
56 |
|
57 |
return page; |
58 |
} |
59 |
|
60 |
void PackageWizard::createPackage(const QWizard &myWizard, PackagePage4 *page4){ |
61 |
const QString aeVersion="2.0"; |
62 |
|
63 |
//Get info page 2 |
64 |
QString modName=myWizard.field("leModName").toString(); |
65 |
QString authors=myWizard.field("leAuthors").toString(); |
66 |
QString version=myWizard.field("leVersion").toString(); |
67 |
QString description=myWizard.field("ptDescription").toString(); |
68 |
QString packageNumber=myWizard.field("lePackageNumber").toString(); |
69 |
bool bslReplace=myWizard.field("rbReplace").toBool(); |
70 |
|
71 |
//Get info page 3 |
72 |
QString dependentPackages=myWizard.field("leDependentPackages").toString(); |
73 |
QString incompatiblePackages=myWizard.field("leIncompatiblePackages").toString(); |
74 |
QString unlockLevels=myWizard.field("leUnlockLevels").toString(); |
75 |
|
76 |
//Get info page 4 |
77 |
const DropTableWidget *commonTable=page4->commonTable; |
78 |
const DropTableWidget *windowsTable=page4->windowsTable; |
79 |
const DropTableWidget *macTable=page4->macTable; |
80 |
|
81 |
//Get info from final page |
82 |
bool openFolder=myWizard.field("cbOpenFolder").toBool(); |
83 |
bool createZip=myWizard.field("cbCreateZip").toBool(); |
84 |
//Remember the final page choices to next time |
85 |
this->vagoSettings->setValue("PackageCreator/OpenFolder",openFolder); |
86 |
this->vagoSettings->setValue("PackageCreator/CreateZip",createZip); |
87 |
|
88 |
const QString packageName=packageNumber+Util::fullTrim(modName); |
89 |
|
90 |
// Start package creation... |
91 |
|
92 |
// Create Packages folder if it doesn't exist |
93 |
if(!QDir(this->packagesLocation).exists()){ |
94 |
QDir().mkpath(this->packagesLocation); |
95 |
} |
96 |
|
97 |
QString modDir=this->packagesLocation+"/"+packageName+"/"; |
98 |
|
99 |
QDir().mkdir(modDir); |
100 |
|
101 |
bool bslExist=false; |
102 |
|
103 |
if(commonTable->rowCount()>0){ |
104 |
copyPackageFolders(commonTable,"common",modDir,bslExist); |
105 |
} |
106 |
|
107 |
if(windowsTable->rowCount()>0){ |
108 |
copyPackageFolders(windowsTable,"win_only",modDir,bslExist); |
109 |
} |
110 |
|
111 |
if(macTable->rowCount()>0){ |
112 |
copyPackageFolders(macTable,"mac_only",modDir,bslExist); |
113 |
} |
114 |
|
115 |
QFile *modInfo = new QFile(modDir+"Mod_Info.cfg"); |
116 |
|
117 |
if (!modInfo->open(QIODevice::WriteOnly | QIODevice::Text)){ //open to write |
118 |
Util::showErrorPopUp("Couldn't create Mod_Info.cfg file."); |
119 |
myLogger->writeString("Couldn't create Mod_Info.cfg file when creating AE Package."); |
120 |
return; |
121 |
} |
122 |
|
123 |
QTextStream *modWriteStream = new QTextStream (modInfo); |
124 |
*modWriteStream << "AEInstallVersion -> "+aeVersion+"\n"; |
125 |
*modWriteStream << "NameOfMod -> "+modName+"\n"; |
126 |
*modWriteStream << "ModVersion -> "+version+"\n"; |
127 |
*modWriteStream << "Creator -> "+authors+"\n"; |
128 |
*modWriteStream << "Readme -> "+description.replace("\n"," \\n ")+"\n"; |
129 |
if(!incompatiblePackages.isEmpty()){ |
130 |
*modWriteStream << "IncompatibleWith -> "+incompatiblePackages+"\n"; |
131 |
} |
132 |
if(!dependentPackages.isEmpty()){ |
133 |
*modWriteStream << "DependsOn -> "+dependentPackages+"\n"; |
134 |
} |
135 |
|
136 |
if(bslExist){ |
137 |
if(bslReplace){ |
138 |
*modWriteStream << "HasBsl -> Yes\n"; |
139 |
} |
140 |
else{ |
141 |
*modWriteStream << "HasBsl -> Addon\n"; |
142 |
} |
143 |
} |
144 |
|
145 |
if(!unlockLevels.isEmpty()){ |
146 |
*modWriteStream << "UnlockLevel -> "+unlockLevels+"\n"; |
147 |
} |
148 |
|
149 |
*modWriteStream << "Vago -> "+GlobalVars::AppVersion; |
150 |
|
151 |
delete modWriteStream; //it auto closes the files/streams |
152 |
delete modInfo; |
153 |
|
154 |
//Create zipped package using PKZIP 2.0 (http://osdab.42cows.org/snippets/zip.php?mode=advanced) |
155 |
if(createZip){ |
156 |
Zip uz; |
157 |
|
158 |
Zip::ErrorCode ec = uz.createArchive(this->packagesLocation+"/"+packageName+".zip"); |
159 |
checkForZipError(ec); |
160 |
|
161 |
ec=uz.addDirectory(modDir); |
162 |
checkForZipError(ec); |
163 |
|
164 |
ec = uz.closeArchive(); |
165 |
checkForZipError(ec); |
166 |
} |
167 |
|
168 |
if(openFolder){ |
169 |
QDesktopServices::openUrl(QUrl("file:///"+this->packagesLocation)); |
170 |
} |
171 |
} |
172 |
|
173 |
void PackageWizard::copyPackageFolders(const DropTableWidget *myTable, QString tableDir, QString modDir, bool &bslExist){ |
174 |
|
175 |
QString sourceFolder; |
176 |
bool onisExist=false; |
177 |
QString path; |
178 |
|
179 |
for(int i=0; i<myTable->rowCount(); i++){ |
180 |
|
181 |
sourceFolder=myTable->item(i,2)->text(); |
182 |
|
183 |
if(myTable->item(i,1)->text()==".oni"){ |
184 |
path=modDir+"oni/"+tableDir; |
185 |
if(!onisExist){ |
186 |
onisExist=true; |
187 |
} |
188 |
} |
189 |
else if(myTable->item(i,1)->text()==".bsl"){ |
190 |
path=modDir+"bsl/"+tableDir; |
191 |
if(!bslExist){ |
192 |
bslExist=true; |
193 |
} |
194 |
} |
195 |
else{ |
196 |
path=modDir+"patches/"+tableDir; |
197 |
if(!bslExist){ |
198 |
bslExist=true; |
199 |
} |
200 |
} |
201 |
QDir().mkpath(path); //create path if doesn't exist |
202 |
if(!Util::cpDir(sourceFolder,path+Util::cutName(sourceFolder))){//copy contents (creates dest destination automatically if not exists yet) |
203 |
QString errorString="An error occurred while copping the folder/files to the package folder: \n" |
204 |
"Copying from "+sourceFolder+"\n to "+path+Util::cutName(sourceFolder); |
205 |
Util::showErrorLogPopUp(errorString); |
206 |
this->myLogger->writeString(errorString); |
207 |
} |
208 |
} |
209 |
} |
210 |
|
211 |
/** |
212 |
Convenience function for checking for zipping errors |
213 |
*/ |
214 |
void PackageWizard::checkForZipError(Zip::ErrorCode ec){ |
215 |
if (ec != Zip::Ok){ |
216 |
const QString error="Error found while zipping the package. Error number = "+QString::number(ec); |
217 |
Util::showErrorPopUp(error); |
218 |
this->myLogger->writeString(error); |
219 |
} |
220 |
} |