#include "CProjectOverviewDialog.h" #include "ui_CProjectOverviewDialog.h" #include "CEditorApplication.h" #include "CExportGameDialog.h" #include "UICommon.h" #include "Editor/ResourceBrowser/CResourceBrowser.h" #include #include #include #include CProjectOverviewDialog::CProjectOverviewDialog(QWidget *pParent) : QDialog(pParent) , mpUI(new Ui::CProjectOverviewDialog) , mpProject(nullptr) { mpUI->setupUi(this); connect(mpUI->OpenProjectButton, SIGNAL(clicked()), this, SLOT(OpenProject())); connect(mpUI->ExportGameButton, SIGNAL(clicked()), this, SLOT(ExportGame())); connect(mpUI->LoadWorldButton, SIGNAL(clicked()), this, SLOT(LoadWorld())); connect(mpUI->LaunchEditorButton, SIGNAL(clicked()), this, SLOT(LaunchEditor())); connect(mpUI->ViewResourcesButton, SIGNAL(clicked()), this, SLOT(LaunchResourceBrowser())); connect(mpUI->CookPackageButton, SIGNAL(clicked()), this, SLOT(CookPackage())); connect(mpUI->CookAllDirtyPackagesButton, SIGNAL(clicked(bool)), this, SLOT(CookAllDirtyPackages())); connect(gpEdApp, SIGNAL(AssetsModified()), this, SLOT(SetupPackagesList())); } CProjectOverviewDialog::~CProjectOverviewDialog() { delete mpUI; } void CProjectOverviewDialog::InternalLoadProject(const QString& rkPath) { // Load project TWideString Path = TO_TWIDESTRING(rkPath); CGameProject *pNewProj = CGameProject::LoadProject(Path); if (pNewProj) { if (mpProject) delete mpProject; mpProject = pNewProj; mpProject->SetActive(); SetupWorldsList(); SetupPackagesList(); emit ActiveProjectChanged(mpProject); } else Log::Error("Failed to load project"); } void CProjectOverviewDialog::OpenProject() { // Open project file QString ProjPath = UICommon::OpenFileDialog(this, "Open Project", "Game Project (*.prj)"); if (!ProjPath.isEmpty()) InternalLoadProject(ProjPath); } void CProjectOverviewDialog::ExportGame() { QString IsoPath = UICommon::OpenFileDialog(this, "Select ISO", "*.iso *.gcm *.tgc *.wbfs"); if (IsoPath.isEmpty()) return; QString ExportDir = UICommon::OpenDirDialog(this, "Select output export directory"); if (ExportDir.isEmpty()) return; CExportGameDialog ExportDialog(IsoPath, ExportDir, this); if (ExportDialog.HasValidDisc()) ExportDialog.exec(); if (ExportDialog.ExportSucceeded()) { int OpenChoice = QMessageBox::information(this, "Export complete", "Export finished successfully! Open new project?", QMessageBox::Yes, QMessageBox::No); if (OpenChoice == QMessageBox::Yes) InternalLoadProject(ExportDialog.ProjectPath()); } } void CProjectOverviewDialog::SetupWorldsList() { ASSERT(mpProject != nullptr && mpProject->IsActive()); std::list WorldIDs; mpProject->GetWorldList(WorldIDs); mWorldEntries.clear(); mpUI->WorldsList->clear(); for (auto It = WorldIDs.begin(); It != WorldIDs.end(); It++) { CAssetID ID = *It; CResourceEntry *pEntry = gpResourceStore->FindEntry(ID); if (!pEntry) { Log::Error("Couldn't find entry for world: " + ID.ToString()); continue; } mWorldEntries << pEntry; mpUI->WorldsList->addItem(TO_QSTRING(pEntry->Name())); } mpUI->AreasGroupBox->setEnabled(false); mpUI->LoadWorldButton->setEnabled(!mWorldEntries.isEmpty()); } void CProjectOverviewDialog::SetupPackagesList() { ASSERT(mpProject != nullptr && mpProject->IsActive()); mpUI->PackagesList->clear(); for (u32 iPkg = 0; iPkg < mpProject->NumPackages(); iPkg++) { CPackage *pPackage = mpProject->PackageByIndex(iPkg); ASSERT(pPackage != nullptr); QString PackageName = TO_QSTRING(pPackage->Name()); if (pPackage->NeedsRecook()) PackageName += '*'; mpUI->PackagesList->addItem(PackageName); } } void CProjectOverviewDialog::LoadWorld() { // Find world u32 WorldIdx = mpUI->WorldsList->currentRow(); CResourceEntry *pWorldEntry = mWorldEntries[WorldIdx]; mpWorld = pWorldEntry->Load(); mAreaEntries.clear(); mpUI->AreaComboBox->clear(); if (mpWorld) { for (u32 iArea = 0; iArea < mpWorld->NumAreas(); iArea++) { CResourceEntry *pAreaEntry = gpResourceStore->FindEntry( mpWorld->AreaResourceID(iArea) ); if (pAreaEntry) { mAreaEntries << pAreaEntry; mpUI->AreaComboBox->addItem(TO_QSTRING(pAreaEntry->Name())); } } } mpUI->AreasGroupBox->setEnabled(true); mpUI->AreaComboBox->setEnabled(!mAreaEntries.isEmpty()); mpUI->LaunchEditorButton->setEnabled(!mAreaEntries.isEmpty()); gpResourceStore->DestroyUnreferencedResources(); } void CProjectOverviewDialog::LaunchEditor() { // Load area u32 AreaIdx = mpUI->AreaComboBox->currentIndex(); CResourceEntry *pAreaEntry = mAreaEntries[AreaIdx]; CGameArea *pArea = (CGameArea*) pAreaEntry->Load(); if (pArea) { pArea->SetWorldIndex(AreaIdx); mpWorld->SetAreaLayerInfo(pArea); gpEdApp->WorldEditor()->SetArea(mpWorld, pArea); gpEdApp->WorldEditor()->showMaximized(); } else Log::Error("Failed to load area"); gpResourceStore->DestroyUnreferencedResources(); } void CProjectOverviewDialog::LaunchResourceBrowser() { gpEdApp->ResourceBrowser()->show(); gpEdApp->ResourceBrowser()->raise(); } void CProjectOverviewDialog::CookPackage() { u32 PackageIdx = mpUI->PackagesList->currentRow(); CPackage *pPackage = mpProject->PackageByIndex(PackageIdx); pPackage->Cook(); SetupPackagesList(); } void CProjectOverviewDialog::CookAllDirtyPackages() { gpEdApp->CookAllDirtyPackages(); SetupPackagesList(); }