void MainWindow::on_action_doTestWld_triggered() { /* FIXME!!! Implement the right world map testing via interprocess with ability to start player at absolutely any position on it */ if(activeChildWindow() == WND_World) { WorldEdit *we = activeWldEditWin(); if(!we->isUntitled() && we->isModified()) { QMessageBox::StandardButton reply = QMessageBox::question(this, tr("World map testing of saved file"), tr("File is not saved!\n" "Do you want to save file or you want to run test " "of copy which is currently saved on the disk?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Abort); if(reply == QMessageBox::Yes) { if(!we->save()) return; } else if(reply != QMessageBox::No) return; } on_action_doSafeTest_triggered(); } }
void WorldItemBox::MusicList_itemClicked(const QModelIndex &item) { if(!item.isValid()) return;//Ignore invalid //placeLevel if ((mw()->activeChildWindow() == MainWindow::WND_World) && (ui->WLD_MusicList->hasFocus())) { WorldEdit * edit = mw()->activeWldEditWin(); if(!edit) return; if(!m_musicboxModel->data(item, ItemBoxListModel::ItemBox_ItemIsValid).toBool()) return; int id = m_musicboxModel->data(item, ItemBoxListModel::ItemBox_ItemId).toInt(); QString customMusicFile; if((uint64_t)id == mw()->configs.music_w_custom_id) { if(edit->isUntitled()) { QMessageBox::information(this, tr("Please, save file"), tr("Please, save file first, if you want to select custom music file."), QMessageBox::Ok); return; } QString dirPath = edit->WldData.meta.path; MusicFileList musicList(dirPath, ""); if(musicList.exec() == QDialog::Accepted) customMusicFile = musicList.SelectedFile; else return; } WldPlacingItems::musicSet.music_file = customMusicFile; mw()->SwitchPlacingItem(ItemTypes::WLD_MusicBox, id); //Play selected music edit->currentMusic = id; edit->currentCustomMusic = customMusicFile; LvlMusPlay::setMusic(LvlMusPlay::WorldMusic, edit->currentMusic, edit->currentCustomMusic); mw()->setMusic(); } }
void MainWindow::on_actionNewWorld_map_triggered() { //Check if data configs are valid if( configs.check() ) { WriteToLog(QtCriticalMsg, QString("Error! *.INI configs not loaded")); QMessageBox::warning(this, tr("Configuration is loaded with errors"), tr("Cannot create world map file:\nConfiguration package loaded with errors.").arg(ConfStatus::configPath)); //Show configuration status window on_actionCurConfig_triggered(); return; } WorldEdit *child = createWldChild(); if(child->newFile(configs, GlobalSettings::LvlOpts)) { child->show(); child->updateGeometry(); child->ResetPosition(); updateMenus(true); on_actionSelect_triggered(); } else { child->show(); if(activeChildWindow()==3) activeWldEditWin()->WldData.modified = false; ui->centralWidget->activeSubWindow()->close(); } }
bool MainWindow::getCurrentSceneCoordinates(qreal &x, qreal &y) { if(activeChildWindow() == 1) { LevelEdit* edit = activeLvlEditWin(); if(!edit) return false; QPointF coor = edit->getGraphicsView()->mapToScene(0,0); x = coor.x(); y = coor.y(); return true; } else if(activeChildWindow() == 3) { WorldEdit* edit = activeWldEditWin(); if(!edit) return false; QPointF coor = edit->getGraphicsView()->mapToScene(0,0); x = coor.x(); y = coor.y(); return true; } return false; }
void MainWindow::OpenFile(QString FilePath, bool addToRecentList) { if(m_isFileReloading) return; m_isFileReloading = true; BoolReseter rst(&m_isFileReloading); Q_UNUSED(rst); if(!m_isAppInited) return; qApp->setActiveWindow(this); //Check if data configs are valid if( configs.check() ) { LogCritical(QString("Error! *.INI configs not loaded")); QMessageBox::warning(this, tr("Configuration is loaded with errors"), tr("Cannot open file:\n" "Configuration package loaded with errors.") .arg(ConfStatus::configPath)); //Show configuration status window on_actionCurConfig_triggered(); return; } QMdiSubWindow *newSubWin = NULL; QMdiSubWindow *existing = findOpenedFileWin(FilePath); if (existing) { ui->centralWidget->setActiveSubWindow(existing); return; } QFile file(FilePath); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file: %1").arg(file.errorString()), QMessageBox::Ok); return; } QFileInfo in_1(FilePath); GlobalSettings::openPath = in_1.absoluteDir().absolutePath(); if((in_1.suffix().toLower() == "lvl")||(in_1.suffix().toLower() == "lvlx")) { LevelData FileData; LogDebug("> parsing level file format"); if( !FileFormats::OpenLevelFile(FilePath, FileData) ) { formatErrorMsgBox(FilePath, FileData.meta.ERROR_info, FileData.meta.ERROR_linenum, FileData.meta.ERROR_linedata); return; } LogDebug("File was read!"); FileData.meta.filename = util::getBaseFilename(in_1.fileName()); FileData.meta.path = in_1.absoluteDir().absolutePath(); FileData.playmusic = GlobalSettings::autoPlayMusic; file.close(); LogDebug("Creating of sub-window"); LevelEdit *child = createLvlChild(&newSubWin); if ( child->loadFile(FilePath, FileData, configs, GlobalSettings::LvlOpts) ) { child->show(); updateMenus(newSubWin, true); child->updateGeometry(); child->ResetPosition(); dock_LvlItemBox->setLvlItemBoxes(false, false); statusBar()->showMessage(tr("Level file loaded"), 2000); SetCurrentLevelSection(0); dock_LvlWarpProps->init(); dock_LvlLayers->setLayersBox(); if(GlobalSettings::autoPlayMusic) ui->actionPlayMusic->setChecked(true); on_actionPlayMusic_triggered(ui->actionPlayMusic->isChecked()); } else { LogDebug(">>File loading aborted"); //child->show(); child->LvlData.meta.modified = false; newSubWin->close(); LogDebug(">>Windows closed"); } } else if((in_1.suffix().toLower() == "wld")||(in_1.suffix().toLower() == "wldx")) { WorldData FileData; if( !FileFormats::OpenWorldFile( FilePath, FileData ) ) { formatErrorMsgBox(FilePath, FileData.meta.ERROR_info, FileData.meta.ERROR_linenum, FileData.meta.ERROR_linedata); return; } file.close(); WorldEdit *child = createWldChild(&newSubWin); if ( child->loadFile(FilePath, FileData, configs, GlobalSettings::LvlOpts) ) { child->show(); updateMenus(newSubWin, true); child->updateGeometry(); child->ResetPosition(); dock_WldItemBox->setWldItemBoxes(false, false); dock_WldSettingsBox->setCurrentWorldSettings(); if(FileData.HubStyledWorld) { dock_WldSettingsBox->setVisible(true); dock_WldSettingsBox->raise(); } statusBar()->showMessage(tr("World map file loaded"), 2000); } else { LogDebug(">>File loading aborted"); child->close(); newSubWin->close(); LogDebug(">>Windows closed"); } } else if(in_1.suffix().toLower() == "txt") { NPCConfigFile FileData; if( !FileFormats::ReadNpcTXTFileF(FilePath, FileData) ) { QMessageBox::critical(this, QObject::tr("File open error"), tr("Can't read the file"), QMessageBox::Ok); return; } if( !FileData.unknownLines.isEmpty() ) { QMessageBox::warning(this, QObject::tr("Unknown values are presented"), QObject::tr("Your file have an unknown values which will be removed\n" " when you will save file") + QString("\n====================================\n" "%1").arg(FileData.unknownLines), QMessageBox::Ok); } NpcEdit *child = createNPCChild(&newSubWin); if (child->loadFile(FilePath, FileData)) { statusBar()->showMessage(tr("NPC Config loaded"), 2000); child->show(); updateMenus(newSubWin, true); } else { child->close(); newSubWin->close(); } } else if(in_1.suffix().toLower() == "sav") { GamesaveData FileData; QString statistics; if(!FileFormats::ReadSMBX64SavFileF( FilePath, FileData)) { formatErrorMsgBox( FilePath, FileData.meta.ERROR_info, FileData.meta.ERROR_linenum, FileData.meta.ERROR_linedata ); return; } statistics+= QString("SMBX Game Save file version %1\n\n").arg(FileData.meta.RecentFormatVersion); if(FileData.gameCompleted) statistics+= " ====This game was completed====\n\n"; statistics+= QString("Lives: %1, Coins:%2, ").arg(FileData.lives).arg(FileData.coins); statistics+= QString("Total stars: %1, Gotten stars: %2\n") .arg(FileData.totalStars) .arg(FileData.gottenStars.size()); statistics+= QString("Position X=%1, Y=%2\n") .arg(FileData.worldPosX) .arg(FileData.worldPosY); if(FileData.musicID>0) { long item=configs.getMusWldI(FileData.musicID); if(item>=0) { statistics+= QString("Current music: %1\n\n").arg(configs.main_music_wld[item].name); } } statistics += "\n===========Players:============\n"; for(int i=0; i<FileData.characterStates.size();i++) { if(i<configs.main_characters.size()) statistics += QString("%1:\n").arg(configs.main_characters[i].name); else statistics += QString("<unknown character>:\n"); statistics += QString("Health: %1, ").arg(FileData.characterStates[i].health); statistics += QString("Power-UP: %1, ").arg(FileData.characterStates[i].state); switch(FileData.characterStates[i].mountType) { case 0: break; case 1: statistics += QString("Mounted vehicle: Shoe - "); switch(FileData.characterStates[i].mountID) { case 1: statistics += QString("Kuribo's (green)");break; case 2: statistics += QString("Podoboo's (red)");break; case 3: statistics += QString("Lakitu's (blue)");break; default: statistics += QString("of God Power :D");break; } break; case 3: statistics += QString("Mounted vehicle: Yoshi");break; default: statistics += QString("Mounted vehicle: <unknown>");break; } if( (FileData.characterStates[i].itemID>0) && configs.main_npc.contains(FileData.characterStates[i].itemID) ) { statistics += QString("%2Has item: %1") .arg(configs.main_npc[FileData.characterStates[i].itemID].setup.name) .arg(FileData.characterStates[i].mountType > 0 ? ", ":""); } if(i<FileData.characterStates.size()-1) statistics += "\n----------------------------\n"; } statistics += "\n=========================\n"; if( !FileData.meta.ReadFileValid ) return; QMessageBox::information(this, tr("Game save statistics"), statistics, QMessageBox::Ok); } else { QMessageBox::warning(this, tr("Bad file"), tr("This file have unknown extension"), QMessageBox::Ok); return; } // Add to recent fileList if(addToRecentList){ AddToRecentFiles(FilePath); SyncRecentFiles(); } }
//Reload opened file data void MainWindow::on_actionReload_triggered() { if(_is_reloading) return; _is_reloading=true; BoolReseter rst(&_is_reloading); Q_UNUSED(rst); QString filePath; QRect wnGeom; if (activeChildWindow()==1) { LevelData FileData; filePath = activeLvlEditWin()->curFile; if(activeLvlEditWin()->isUntitled) { QMessageBox::warning(this, tr("File not saved"), tr("File doesn't saved on disk."), QMessageBox::Ok); return; } if (!QFileInfo(filePath).exists() ) { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file.\nFile not exist."), QMessageBox::Ok); return; } if(activeLvlEditWin()->LvlData.modified) { QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Reload file and custom stuff"), tr("Do you want to save before reload stuff?"), QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel); if((ret==QMessageBox::Cancel)||(ret==0)) return; else if(ret==QMessageBox::Yes) save(); } //Open level file FileData = FileFormats::OpenLevelFile(filePath); if( !FileData.ReadFileValid ){ statusBar()->showMessage(tr("Reloading error"), 2000); return;} FileData.playmusic = GlobalSettings::autoPlayMusic; activeLvlEditWin()->LvlData.modified = false; QFile file(filePath+".meta"); if(QFileInfo(filePath+".meta").exists()) { if (file.open(QIODevice::ReadOnly)) { QString metaRaw; QTextStream meta(&file); meta.setCodec("UTF-8"); metaRaw = meta.readAll(); if(FileData.metaData.script) { delete FileData.metaData.script; FileData.metaData.script = NULL; } FileData.metaData = FileFormats::ReadNonSMBX64MetaData(metaRaw, filePath+".meta"); } else { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file."), QMessageBox::Ok); } } //Remember last section ID and positions! int lastSection=0; QMap<int, QPair<long, long> > sectionPoss; lastSection = activeLvlEditWin()->LvlData.CurSection; SetCurrentLevelSection(lastSection);//Need to remember position of current section for(int i=0; i<activeLvlEditWin()->LvlData.sections.size(); i++) { LevelSection sct = activeLvlEditWin()->LvlData.sections[i]; sectionPoss[sct.id]=QPair<long, long >(sct.PositionX, sct.PositionY); } activeLvlEditWin()->close();//Close old widget without closing of sub-window //Get pointer to current sub-window QMdiSubWindow *window = ui->centralWidget->activeSubWindow(); //Get geometry of current subwindow wnGeom = ui->centralWidget->activeSubWindow()->geometry(); //delete window->widget(); LevelEdit *chLvlWin = new LevelEdit(window); connect(chLvlWin, SIGNAL(forceReload()), this, SLOT(on_actionReload_triggered())); window->setWidget(chLvlWin); GraphicsWorkspace* gr = static_cast<GraphicsWorkspace *>(chLvlWin->getGraphicsView()); connect(gr, SIGNAL(zoomValueChanged(QString)), zoom, SLOT(setText(QString))); //ui->centralWidget->activeSubWindow()->close(); LevelEdit *child = chLvlWin;//createLvlChild(); LvlMusPlay::setNoMusic(); setMusic(false); if ((bool) (child->loadFile(filePath, FileData, configs, GlobalSettings::LvlOpts))) { child->show(); ui->centralWidget->activeSubWindow()->setGeometry(wnGeom); child->updateGeometry(); child->ResetPosition(); statusBar()->showMessage(tr("Level file reloaded"), 2000); LvlMusPlay::musicForceReset=true; //reset musics updateMenus(true); child->setFocus(); //Restore saved section positions for(int i=0; i<child->LvlData.sections.size(); i++) { if(sectionPoss.contains(child->LvlData.sections[i].id)) { child->LvlData.sections[i].PositionX=sectionPoss[child->LvlData.sections[i].id].first; child->LvlData.sections[i].PositionY=sectionPoss[child->LvlData.sections[i].id].second; } } SetCurrentLevelSection(lastSection); if(GlobalSettings::autoPlayMusic) ui->actionPlayMusic->setChecked(true); } else { WriteToLog(QtDebugMsg, ">>File loading aborted"); child->show(); WriteToLog(QtDebugMsg, ">>Window showed"); if(activeChildWindow()==1) activeLvlEditWin()->LvlData.modified = false; WriteToLog(QtDebugMsg, ">>Option set"); ui->centralWidget->activeSubWindow()->close(); WriteToLog(QtDebugMsg, ">>Windows closed"); } } else if (activeChildWindow()==2) { filePath = activeNpcEditWin()->curFile; QFile fileIn(filePath); if(activeNpcEditWin()->isUntitled) { QMessageBox::warning(this, tr("File not saved"), tr("File doesn't saved on disk."), QMessageBox::Ok); return; } if(activeNpcEditWin()->isModyfied) { QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Reload file and custom stuff"), tr("Do you want to save before reload stuff?"), QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel); if((ret==QMessageBox::Cancel)||(ret==0)) return; else if(ret==QMessageBox::Yes) save(); } if (!fileIn.open(QIODevice::ReadOnly)) { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file."), QMessageBox::Ok); return; } NPCConfigFile FileData = FileFormats::ReadNpcTXTFile(fileIn); if( !FileData.ReadFileValid ) return; wnGeom = ui->centralWidget->activeSubWindow()->geometry(); activeNpcEditWin()->isModyfied = false; activeNpcEditWin()->close(); //NpcEdit *child = createNPCChild(); QMdiSubWindow *npcWindow = ui->centralWidget->activeSubWindow(); NpcEdit *child = new NpcEdit(&configs, npcWindow); npcWindow->setWidget(child); if (child->loadFile(filePath, FileData)) { statusBar()->showMessage(tr("NPC Config reloaded"), 2000); child->show(); ui->centralWidget->activeSubWindow()->setGeometry(wnGeom); updateMenus(true); } else { child->close(); npcWindow->close(); } } else if (activeChildWindow()==3) { WorldData FileData; filePath = activeWldEditWin()->curFile; if(activeWldEditWin()->isUntitled) { QMessageBox::warning(this, tr("File not saved"), tr("File doesn't saved on disk."), QMessageBox::Ok); return; } if (!QFileInfo(filePath).exists() ) { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file.\nFile not exist."), QMessageBox::Ok); return; } if(activeWldEditWin()->WldData.modified){ QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Reload file and custom stuff"), tr("Do you want to save before reload stuff?"), QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel); if((ret==QMessageBox::Cancel)||(ret==0)) return; else if(ret==QMessageBox::Yes) save(); } FileData = FileFormats::OpenWorldFile(filePath); if( !FileData.ReadFileValid ){ statusBar()->showMessage(tr("Reloading error"), 2000); return;} FileData.filename = QFileInfo(filePath).baseName(); FileData.path = QFileInfo(filePath).absoluteDir().absolutePath(); FileData.playmusic = GlobalSettings::autoPlayMusic; activeWldEditWin()->WldData.modified = false; QFile file(filePath+".meta"); if(QFileInfo(filePath+".meta").exists()) { if (file.open(QIODevice::ReadOnly)) { QString metaRaw; QTextStream meta(&file); meta.setCodec("UTF-8"); metaRaw = meta.readAll(); FileData.metaData = FileFormats::ReadNonSMBX64MetaData(metaRaw, filePath+".meta"); } else { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file."), QMessageBox::Ok); } } wnGeom = ui->centralWidget->activeSubWindow()->geometry(); QMdiSubWindow *worldWindow = ui->centralWidget->activeSubWindow(); long posX = activeWldEditWin()->scene->_viewPort->horizontalScrollBar()->value(); long posY = activeWldEditWin()->scene->_viewPort->verticalScrollBar()->value(); activeWldEditWin()->close(); WorldEdit *child = new WorldEdit(worldWindow); connect(child, SIGNAL(forceReload()), this, SLOT(on_actionReload_triggered())); worldWindow->setWidget(child); GraphicsWorkspace* gr = static_cast<GraphicsWorkspace *>(child->getGraphicsView()); connect(gr, SIGNAL(zoomValueChanged(QString)), zoom, SLOT(setText(QString))); if ( (bool)(child->loadFile(filePath, FileData, configs, GlobalSettings::LvlOpts)) ) { child->show(); ui->centralWidget->activeSubWindow()->setGeometry(wnGeom); child->updateGeometry(); child->ResetPosition(); updateMenus(true); dock_WldSettingsBox->setCurrentWorldSettings(); if(FileData.HubStyledWorld) { dock_WldSettingsBox->setVisible(true); dock_WldSettingsBox->raise(); } child->scene->_viewPort->horizontalScrollBar()->setValue(posX); child->scene->_viewPort->verticalScrollBar()->setValue(posY); statusBar()->showMessage(tr("World map file loaded"), 2000); } else { WriteToLog(QtDebugMsg, ">>File loading aborted"); child->show(); WriteToLog(QtDebugMsg, ">>Window showed"); if(activeChildWindow()==3) activeWldEditWin()->WldData.modified = false; WriteToLog(QtDebugMsg, ">>Option set"); ui->centralWidget->activeSubWindow()->close(); WriteToLog(QtDebugMsg, ">>Windows closed"); } } dock_LvlItemBox->clearFilter(); }
void MainWindow::OpenFile(QString FilePath, bool addToRecentList) { if(_is_reloading) return; _is_reloading=true; BoolReseter rst(&_is_reloading); Q_UNUSED(rst); if(!continueLoad) return; qApp->setActiveWindow(this); //Check if data configs are valid if( configs.check() ) { WriteToLog(QtCriticalMsg, QString("Error! *.INI configs not loaded")); QMessageBox::warning(this, tr("Configuration is loaded with errors"), tr("Cannot open file:\nConfiguration package loaded with errors.").arg(ConfStatus::configPath)); //Show configuration status window on_actionCurConfig_triggered(); return; } QMdiSubWindow *existing = findOpenedFileWin(FilePath); if (existing) { ui->centralWidget->setActiveSubWindow(existing); return; } QFile file(FilePath); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file."), QMessageBox::Ok); return; } QFileInfo in_1(FilePath); GlobalSettings::openPath = in_1.absoluteDir().absolutePath(); if((in_1.suffix().toLower() == "lvl")||(in_1.suffix().toLower() == "lvlx")) { LevelData FileData; WriteToLog(QtDebugMsg, "> parsing level file format"); FileData = FileFormats::OpenLevelFile(FilePath); if( !FileData.ReadFileValid ) return; WriteToLog(QtDebugMsg, "File was read!"); FileData.filename = in_1.baseName(); FileData.path = in_1.absoluteDir().absolutePath(); FileData.playmusic = GlobalSettings::autoPlayMusic; file.close(); WriteToLog(QtDebugMsg, "> Opem meta-file"); file.setFileName(FilePath+".meta"); if(QFileInfo(FilePath+".meta").exists()) { WriteToLog(QtDebugMsg, "> meta-file found, open them!"); if (file.open(QIODevice::ReadOnly)) { QString metaRaw; QTextStream meta(&file); meta.setCodec("UTF-8"); metaRaw = meta.readAll(); if(FileData.metaData.script != NULL) { delete FileData.metaData.script; FileData.metaData.script = NULL; } FileData.metaData = FileFormats::ReadNonSMBX64MetaData(metaRaw, FilePath+".meta"); WriteToLog(QtDebugMsg, "Meta-File was read!"); } else { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file."), QMessageBox::Ok); } } WriteToLog(QtDebugMsg, "Creating of sub-window"); LevelEdit *child = createLvlChild(); if ( (bool)(child->loadFile(FilePath, FileData, configs, GlobalSettings::LvlOpts)) ) { child->show(); child->updateGeometry(); child->ResetPosition(); statusBar()->showMessage(tr("Level file loaded"), 2000); updateMenus(true); SetCurrentLevelSection(0); dock_LvlWarpProps->init(); dock_LvlLayers->setLayersBox(); if(GlobalSettings::autoPlayMusic) ui->actionPlayMusic->setChecked(true); on_actionPlayMusic_triggered(ui->actionPlayMusic->isChecked()); } else { WriteToLog(QtDebugMsg, ">>File loading aborted"); child->show(); if(activeChildWindow()==1) activeLvlEditWin()->LvlData.modified = false; ui->centralWidget->activeSubWindow()->close(); WriteToLog(QtDebugMsg, ">>Windows closed"); } } else if((in_1.suffix().toLower() == "wld")||(in_1.suffix().toLower() == "wldx")) { WorldData FileData; FileData= FileFormats::OpenWorldFile(FilePath); if( !FileData.ReadFileValid ) return; file.close(); file.setFileName(FilePath+".meta"); if(QFileInfo(FilePath+".meta").exists()) { if (file.open(QIODevice::ReadOnly)) { QString metaRaw; QTextStream meta(&file); meta.setCodec("UTF-8"); metaRaw = meta.readAll(); FileData.metaData = FileFormats::ReadNonSMBX64MetaData(metaRaw, FilePath+".meta"); } else { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file."), QMessageBox::Ok); } } WorldEdit *child = createWldChild(); if ( (bool)(child->loadFile(FilePath, FileData, configs, GlobalSettings::LvlOpts)) ) { child->show(); child->updateGeometry(); child->ResetPosition(); updateMenus(true); dock_WldSettingsBox->setCurrentWorldSettings(); if(FileData.HubStyledWorld) { dock_WldSettingsBox->setVisible(true); dock_WldSettingsBox->raise(); } statusBar()->showMessage(tr("World map file loaded"), 2000); } else { child->close(); } //QMessageBox::information(this, tr("Dummy"), //tr("Sorry, the World Maps support is not inplemented in this version."), //QMessageBox::Ok); } else if(in_1.suffix().toLower() == "txt") { NPCConfigFile FileData = FileFormats::ReadNpcTXTFile(file); if( !FileData.ReadFileValid ) return; NpcEdit *child = createNPCChild(); if (child->loadFile(FilePath, FileData)) { statusBar()->showMessage(tr("NPC Config loaded"), 2000); child->show(); updateMenus(true); } else { child->close(); } } else if(in_1.suffix().toLower() == "sav") { GamesaveData FileData; QTextStream in(&file); //Read File in.setAutoDetectUnicode(true); in.setLocale(QLocale::system()); in.setCodec(QTextCodec::codecForLocale()); QString statistics; FileData = FileFormats::ReadSMBX64SavFile( in.readAll(), file.fileName() ); statistics+= QString("SMBX Game Save file version %1\n\n").arg(FileData.version); if(FileData.gameCompleted) statistics+= " ====This game was completed====\n\n"; statistics+= QString("Lives: %1, Coins:%2, ").arg(FileData.lives).arg(FileData.coins); statistics+= QString("Total stars: %1, Gotten stars: %2\n") .arg(FileData.totalStars) .arg(FileData.gottenStars.size()); statistics+= QString("Position X=%1, Y=%2\n") .arg(FileData.worldPosX) .arg(FileData.worldPosY); if(FileData.musicID>0) { long item=configs.getMusWldI(FileData.musicID); if(item>=0) { statistics+= QString("Current music: %1\n\n").arg(configs.main_music_wld[item].name); } } statistics += "\n===========Players:============\n"; for(int i=0; i<FileData.characterStates.size();i++) { if(i<configs.characters.size()) statistics += QString("%1:\n").arg(configs.characters[i].name); else statistics += QString("<unknown character>:\n"); statistics += QString("Health: %1, ").arg(FileData.characterStates[i].health); statistics += QString("Power-UP: %1, ").arg(FileData.characterStates[i].state); switch(FileData.characterStates[i].mountType) { case 0: break; case 1: statistics += QString("Mounted transport: Shoe - "); switch(FileData.characterStates[i].mountID) { case 1: statistics += QString("Kuribo's (green)");break; case 2: statistics += QString("Podoboo's (red)");break; case 3: statistics += QString("Lakitu's (blue)");break; default: statistics += QString("of God Power :D");break; } break; case 3: statistics += QString("Mounted transport: Yoshi");break; default: statistics += QString("Mounted transport: <unknown>");break; } if(FileData.characterStates[i].itemID>0) { int item= configs.getNpcI(FileData.characterStates[i].itemID); if(item>=0) { statistics += QString("%2Has item: %1").arg(configs.main_npc[item].name) .arg(FileData.characterStates[i].mountType>0?", ":""); } } if(i<FileData.characterStates.size()-1) statistics += "\n----------------------------\n"; } statistics += "\n=========================\n"; if( !FileData.ReadFileValid ) return; QMessageBox::information(this, tr("Game save statistics"), statistics, QMessageBox::Ok); } else { QMessageBox::warning(this, tr("Bad file"), tr("This file have unknown extension"), QMessageBox::Ok); return; } // Add to recent fileList if(addToRecentList){ AddToRecentFiles(FilePath); SyncRecentFiles(); } }
void CrashHandler::attemptCrashsave() { QDir crashSave; crashSave.setCurrent(AppPathManager::userAppDir()); /* * For case if crash happened while ... attempt to load crashed files! * This avoids looping crashes because backup files are causing crash too! */ if(crashSave.exists("__crashsave")) { LogCriticalNC("We are detected that crash has been occouped on attempt to load or initialize backup files. Backup directory has been renamed into \"__crashsave_danger\"."); LogCriticalNC("Please attach all files in that directory and, if possible, additional contents (custom images, sounds, musics, configs and scripts) while reporting this crash."); QDir dupeDir(AppPathManager::userAppDir() + "/__crashsave_danger"); if(dupeDir.exists()) dupeDir.removeRecursively(); crashSave.rename("__crashsave", "__crashsave_danger"); return; } crashSave.mkdir("__crashsave"); crashSave.cd("__crashsave"); int untitledCounter = 0; MainWindow *mw = MainWinConnect::pMainWin; if(!mw) return; QList<QMdiSubWindow *> listOfAllSubWindows = mw->allEditWins(); for(QMdiSubWindow *subWin : listOfAllSubWindows) { if(mw->activeChildWindow(subWin) == MainWindow::WND_Level) { LevelEdit *lvledit = mw->activeLvlEditWin(subWin); if(!lvledit) continue; QString fName = lvledit->currentFile(); if(lvledit->isUntitled()) fName = QString("Untitled_Crash") + QString::number(untitledCounter++) + QString(".lvlx"); else fName = fName.section("/", -1) + QString(".lvlx"); LevelData &lvl = lvledit->LvlData; lvl.metaData.crash.used = true; lvl.metaData.crash.untitled = lvl.meta.untitled; lvl.metaData.crash.modifyed = lvl.meta.modified; lvl.metaData.crash.strictModeSMBX64 = lvl.meta.smbx64strict; lvl.metaData.crash.fmtID = lvl.meta.RecentFormat; lvl.metaData.crash.fmtVer = lvl.meta.RecentFormatVersion; lvl.metaData.crash.filename = lvl.meta.filename; lvl.metaData.crash.path = lvl.meta.path; lvl.metaData.crash.fullPath = lvledit->curFile; //Forcely save data into PGE-X format lvl.meta.RecentFormat = LevelData::PGEX; lvledit->saveFile(crashSave.absoluteFilePath(fName), false); } else if(mw->activeChildWindow(subWin) == MainWindow::WND_NpcTxt) { NpcEdit *npcedit = mw->activeNpcEditWin(subWin); if(!npcedit) continue; QString fName = npcedit->currentFile(); if(npcedit->isUntitled()) fName = QString("Untitled_Crash") + QString::number(untitledCounter++) + QString(".txt"); else fName = fName.section("/", -1); npcedit->saveFile(crashSave.absoluteFilePath(fName), false); } else if(mw->activeChildWindow(subWin) == MainWindow::WND_World) { WorldEdit *worldedit = mw->activeWldEditWin(subWin); if(!worldedit) continue; QString fName = worldedit->currentFile(); if(worldedit->isUntitled()) fName = QString("Untitled_Crash") + QString::number(untitledCounter++) + QString(".wldx"); else fName = fName.section("/", -1) + QString(".wldx"); WorldData &wld = worldedit->WldData; wld.metaData.crash.used = true; wld.metaData.crash.untitled = wld.meta.untitled; wld.metaData.crash.modifyed = wld.meta.modified; wld.metaData.crash.strictModeSMBX64 = wld.meta.smbx64strict; wld.metaData.crash.fmtID = wld.meta.RecentFormat; wld.metaData.crash.fmtVer = wld.meta.RecentFormatVersion; wld.metaData.crash.filename = wld.meta.filename; wld.metaData.crash.path = wld.meta.path; wld.metaData.crash.fullPath = worldedit->curFile; //Forcely save data into PGE-X format wld.meta.RecentFormat = WorldData::PGEX; worldedit->saveFile(crashSave.absoluteFilePath(fName), false); } } }
void MainWindow::on_actionFill_triggered(bool checked) { resetEditmodeButtons(); ui->PlacingToolbar->setVisible(true); if (activeChildWindow()==1) { leveledit * edit = activeLvlEditWin(); LvlPlacingItems::placingMode = (checked ? LvlPlacingItems::PMODE_FloodFill : LvlPlacingItems::PMODE_Brush ); ui->actionSquareFill->setChecked(false); ui->actionLine->setChecked(false); switch(edit->scene->placingItem) { case LvlScene::PLC_Block: edit->scene->setItemPlacer(0, LvlPlacingItems::blockSet.id ); break; case LvlScene::PLC_BGO: edit->scene->setItemPlacer(1, LvlPlacingItems::bgoSet.id ); break; default: break; } edit->setFocus(); } else if (activeChildWindow()==3) { WorldEdit * edit = activeWldEditWin(); WldPlacingItems::placingMode = (checked ? WldPlacingItems::PMODE_FloodFill : WldPlacingItems::PMODE_Brush ); ui->actionSquareFill->setChecked(false); ui->actionLine->setChecked(false); switch(edit->scene->placingItem) { case WldScene::PLC_Tile: edit->scene->setItemPlacer(0, WldPlacingItems::TileSet.id ); WriteToLog(QtDebugMsg, QString("Tile Line draw -> %1").arg(checked)); break; case WldScene::PLC_Scene: edit->scene->setItemPlacer(1, WldPlacingItems::SceneSet.id ); WriteToLog(QtDebugMsg, QString("Scenery Line draw -> %1").arg(checked)); break; case WldScene::PLC_Path: edit->scene->setItemPlacer(2, WldPlacingItems::PathSet.id ); WriteToLog(QtDebugMsg, QString("Path Line draw -> %1").arg(checked)); break; case WldScene::PLC_Level: edit->scene->setItemPlacer(3, WldPlacingItems::LevelSet.id ); WriteToLog(QtDebugMsg, QString("Path Line draw -> %1").arg(checked)); break; default: break; } edit->setFocus(); } }
//Reload opened file data void MainWindow::on_actionReload_triggered() { if(m_isFileReloading) return; m_isFileReloading = true; BoolReseter rst(&m_isFileReloading); Q_UNUSED(rst); QString filePath; QRect wnGeom; int activeWindow = activeChildWindow(LastActiveSubWindow); if(activeWindow == WND_Level) { LevelEdit *lvlEdit = activeLvlEditWin(LastActiveSubWindow); LevelData FileData; filePath = lvlEdit->curFile; if(lvlEdit->isUntitled) { QMessageBox::warning(this, tr("File not saved"), tr("File doesn't saved on disk."), QMessageBox::Ok); return; } if(!QFileInfo(filePath).exists()) { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file!\nFile not exist."), QMessageBox::Ok); return; } if(lvlEdit->LvlData.meta.modified) { QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Reload file and custom stuff"), tr("Do you want to save before reload stuff?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); if((ret == QMessageBox::Cancel) || (ret == 0)) return; else if(ret == QMessageBox::Yes) save(); } //Open level file if(!FileFormats::OpenLevelFile(filePath, FileData)) { formatErrorMsgBox(filePath, FileData.meta.ERROR_info, FileData.meta.ERROR_linenum, FileData.meta.ERROR_linedata); statusBar()->showMessage(tr("Reloading error"), 2000); return; } FileData.playmusic = GlobalSettings::autoPlayMusic; lvlEdit->LvlData.meta.modified = false; //Remember last section ID and positions! int lastSection = 0; QHash<int, QPair<long, long> > sectionPoss; lastSection = lvlEdit->LvlData.CurSection; SetCurrentLevelSection(lastSection); //Need to remember position of current section for(int i = 0; i < lvlEdit->LvlData.sections.size(); i++) { LevelSection sct = lvlEdit->LvlData.sections[i]; sectionPoss[sct.id] = QPair<long, long >(sct.PositionX, sct.PositionY); } long posX = lvlEdit->scene->m_viewPort->horizontalScrollBar()->value(); long posY = lvlEdit->scene->m_viewPort->verticalScrollBar()->value(); lvlEdit->close();//Close old widget without closing of sub-window //Get geometry of current subwindow wnGeom = LastActiveSubWindow->geometry(); //delete window->widget(); LevelEdit *chLvlWin = new LevelEdit(this, LastActiveSubWindow); connect(chLvlWin, SIGNAL(forceReload()), this, SLOT(on_actionReload_triggered())); LastActiveSubWindow->setWidget(chLvlWin); GraphicsWorkspace *gr = static_cast<GraphicsWorkspace *>(chLvlWin->getGraphicsView()); connect(gr, SIGNAL(zoomValueChanged(QString)), zoom, SLOT(setText(QString))); //LastActiveSubWindow->close(); LevelEdit *child = chLvlWin;//createLvlChild(); LvlMusPlay::setNoMusic(); setMusic(); if(static_cast<bool>(child->loadFile(filePath, FileData, configs, GlobalSettings::LvlOpts))) { child->show(); LastActiveSubWindow->setGeometry(wnGeom); child->updateGeometry(); child->ResetPosition(); statusBar()->showMessage(tr("Level file reloaded"), 2000); LvlMusPlay::musicForceReset = true; //reset musics updateMenus(LastActiveSubWindow, true); child->setFocus(); //Restore saved section positions for(int i = 0; i < child->LvlData.sections.size(); i++) { if(sectionPoss.contains(child->LvlData.sections[i].id)) { QPair<long, long> &sct = sectionPoss[child->LvlData.sections[i].id]; child->LvlData.sections[i].PositionX = sct.first; child->LvlData.sections[i].PositionY = sct.second; } } SetCurrentLevelSection(lastSection); child->scene->m_viewPort->horizontalScrollBar()->setValue(static_cast<int>(posX)); child->scene->m_viewPort->verticalScrollBar()->setValue(static_cast<int>(posY)); if(GlobalSettings::autoPlayMusic) ui->actionPlayMusic->setChecked(true); child->showCustomStuffWarnings(); } else { LogDebug(">>File loading aborted"); LogDebug(">>Window showed"); child->LvlData.meta.modified = false; LogDebug(">>Option set"); LastActiveSubWindow->close(); LogDebug(">>Windows closed"); } } else if(activeWindow == WND_NpcTxt) { NpcEdit *npcEdit = activeNpcEditWin(LastActiveSubWindow); filePath = npcEdit->curFile; if(npcEdit->isUntitled) { QMessageBox::warning(this, tr("File not saved"), tr("File doesn't saved on disk."), QMessageBox::Ok); return; } if(npcEdit->isModyfied) { QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Reload file and custom stuff"), tr("Do you want to save before reload stuff?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); if((ret == QMessageBox::Cancel) || (ret == 0)) return; else if(ret == QMessageBox::Yes) save(); } // if (!fileIn.open(QIODevice::ReadOnly)) { // QMessageBox::critical(this, tr("File open error"), // tr("Can't open the file!"), QMessageBox::Ok); // return; // } NPCConfigFile FileData; if(!FileFormats::ReadNpcTXTFileF(filePath, FileData)) { QMessageBox::critical(this, QObject::tr("File open error"), tr("Can't read the file"), QMessageBox::Ok); return; } wnGeom = LastActiveSubWindow->geometry(); npcEdit->isModyfied = false; npcEdit->close(); //NpcEdit *child = createNPCChild(); //QMdiSubWindow *npcWindow = LastActiveSubWindow; NpcEdit *child = new NpcEdit(&configs, LastActiveSubWindow); LastActiveSubWindow->setWidget(child); if(child->loadFile(filePath, FileData)) { statusBar()->showMessage(tr("NPC Config reloaded"), 2000); child->show(); LastActiveSubWindow->setGeometry(wnGeom); updateMenus(LastActiveSubWindow, true); } else { child->close(); LastActiveSubWindow->close(); } } else if(activeWindow == WND_World) { WorldEdit *wldEdit = activeWldEditWin(LastActiveSubWindow); WorldData FileData; filePath = wldEdit->curFile; if(wldEdit->isUntitled) { QMessageBox::warning(this, tr("File not saved"), tr("File doesn't saved on disk."), QMessageBox::Ok); return; } if(!QFileInfo(filePath).exists()) { QMessageBox::critical(this, tr("File open error"), tr("Can't open the file!\nFile not exist."), QMessageBox::Ok); return; } if(wldEdit->WldData.meta.modified) { QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Reload file and custom stuff"), tr("Do you want to save before reload stuff?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); if((ret == QMessageBox::Cancel) || (ret == 0)) return; else if(ret == QMessageBox::Yes) save(); } if(!FileFormats::OpenWorldFile(filePath, FileData)) { formatErrorMsgBox(filePath, FileData.meta.ERROR_info, FileData.meta.ERROR_linenum, FileData.meta.ERROR_linedata); statusBar()->showMessage(tr("Reloading error"), 2000); return; } QFileInfo finfo(filePath); FileData.meta.filename = util::getBaseFilename(finfo.fileName()); FileData.meta.path = finfo.absoluteDir().absolutePath(); FileData.playmusic = GlobalSettings::autoPlayMusic; wldEdit->WldData.meta.modified = false; wnGeom = LastActiveSubWindow->geometry(); QMdiSubWindow *worldWindow = LastActiveSubWindow; long posX = wldEdit->scene->m_viewPort->horizontalScrollBar()->value(); long posY = wldEdit->scene->m_viewPort->verticalScrollBar()->value(); wldEdit->close(); WorldEdit *child = new WorldEdit(this, worldWindow); connect(child, &WorldEdit::forceReload, this, &MainWindow::on_actionReload_triggered); worldWindow->setWidget(child); GraphicsWorkspace *gr = static_cast<GraphicsWorkspace *>(child->getGraphicsView()); connect(gr, SIGNAL(zoomValueChanged(QString)), zoom, SLOT(setText(QString))); if(bool(child->loadFile(filePath, FileData, configs, GlobalSettings::LvlOpts))) { child->show(); LastActiveSubWindow->setGeometry(wnGeom); child->updateGeometry(); child->ResetPosition(); updateMenus(LastActiveSubWindow, true); dock_WldSettingsBox->setCurrentWorldSettings(); if(FileData.HubStyledWorld) { dock_WldSettingsBox->setVisible(true); dock_WldSettingsBox->raise(); } child->scene->m_viewPort->horizontalScrollBar()->setValue(static_cast<int>(posX)); child->scene->m_viewPort->verticalScrollBar()->setValue(static_cast<int>(posY)); statusBar()->showMessage(tr("World map file loaded"), 2000); child->showCustomStuffWarnings(); } else { LogDebug(">>File loading aborted"); //child->show(); LogDebug(">>Window showed"); child->WldData.meta.modified = false; LogDebug(">>Option set"); LastActiveSubWindow->close(); LogDebug(">>Windows closed"); } } dock_LvlItemBox->clearFilter(); }
/*! * \brief Starts level testing in PGE Engine without interprocess communication (File saving is needed) */ void MainWindow::on_action_doSafeTest_triggered() { pge_engine_alphatestingNotify(this); QString command = ApplicationPath + QStringLiteral("/") + PGE_ENGINE_EXE; QMutexLocker mlocker(&engine_mutex); Q_UNUSED(mlocker); if(!findEngine(this, command)) return; if(engine_proc.state() == QProcess::Running) { if(QMessageBox::warning(this, tr("Engine already runned"), tr("Engine is already testing another level.\n" "Do you want to abort current testing process?"), QMessageBox::Abort | QMessageBox::Cancel) == QMessageBox::Abort) { engine_proc.terminate(); engine_proc.close(); } return; } QStringList args; args << "--debug"; args << "--config=\"" + configs.config_dir + "\""; SETTINGS_TestSettings t = GlobalSettings::testing; args << QString("--num-players=%1").arg(t.numOfPlayers); args << QString("--p1c=%1").arg(t.p1_char); args << QString("--p1s=%1").arg(t.p1_state); args << QString("--p2c=%1").arg(t.p2_char); args << QString("--p2s=%1").arg(t.p2_state); if(t.xtra_chuck) args << "--debug-chucknorris"; if(t.xtra_god) args << "--debug-pagan-god"; if(t.xtra_flyup) args << "--debug-superman"; if(t.xtra_worldfreedom) args << "--debug-worldfreedom"; if(t.xtra_physdebug) args << "--debug-physics"; if(t.xtra_debug) args << "--debug-print=yes"; else args << "--debug-print=no"; if(activeChildWindow() == WND_Level) { LevelEdit *le = activeLvlEditWin(); if(le->isUntitled()) { QMessageBox::warning(this, tr("Save file first"), tr("To run testing of saved file, please save them into disk first!\n" "You can run testing without saving of file if you will use \"Run testing\" menu item."), QMessageBox::Ok); return; } args << le->curFile; } else if(activeChildWindow() == WND_World) { WorldEdit *we = activeWldEditWin(); if(we->isUntitled()) { QMessageBox::warning(this, tr("Save file first"), tr("To run testing of saved file, please save them into disk first!\n" "You can run testing without saving of file if you will use \"Run testing\" menu item."), QMessageBox::Ok); return; } args << we->curFile; } engine_proc.start(command, args); if(engine_proc.waitForStarted()) { //Stop music playback in the PGE Editor! stopMusicForTesting(); } }