From 72af0270a36971ec97d7e9897e7ca94343e7ec61 Mon Sep 17 00:00:00 2001 From: mjbudd77 Date: Sat, 8 Jan 2022 14:40:12 -0500 Subject: [PATCH] Added a progress dialog for saving Qt TAS projects to disk. --- src/drivers/Qt/TasEditor/bookmarks.cpp | 8 ++ src/drivers/Qt/TasEditor/branches.cpp | 4 + src/drivers/Qt/TasEditor/greenzone.cpp | 21 +++-- src/drivers/Qt/TasEditor/history.cpp | 13 ++- src/drivers/Qt/TasEditor/markers_manager.cpp | 7 +- src/drivers/Qt/TasEditor/selection.cpp | 17 +++- .../Qt/TasEditor/taseditor_project.cpp | 85 ++++++++++++++----- src/drivers/Qt/TasEditor/taseditor_project.h | 2 + 8 files changed, 127 insertions(+), 30 deletions(-) diff --git a/src/drivers/Qt/TasEditor/bookmarks.cpp b/src/drivers/Qt/TasEditor/bookmarks.cpp index 4947a38d..33770117 100644 --- a/src/drivers/Qt/TasEditor/bookmarks.cpp +++ b/src/drivers/Qt/TasEditor/bookmarks.cpp @@ -393,11 +393,19 @@ void BOOKMARKS::save(EMUFILE *os, bool really_save) { if (really_save) { + setTasProjectProgressBarText("Saving Bookmarks..."); + setTasProjectProgressBar( 0, TOTAL_BOOKMARKS ); + // write "BOOKMARKS" string os->fwrite(bookmarks_save_id, BOOKMARKS_ID_LEN); // write all 10 bookmarks for (int i = 0; i < TOTAL_BOOKMARKS; ++i) + { + setTasProjectProgressBar( i, TOTAL_BOOKMARKS ); bookmarksArray[i].save(os); + } + setTasProjectProgressBar( TOTAL_BOOKMARKS, TOTAL_BOOKMARKS ); + // write branches branches->save(os); } else diff --git a/src/drivers/Qt/TasEditor/branches.cpp b/src/drivers/Qt/TasEditor/branches.cpp index 74bf5dbb..ac23b69f 100644 --- a/src/drivers/Qt/TasEditor/branches.cpp +++ b/src/drivers/Qt/TasEditor/branches.cpp @@ -440,6 +440,9 @@ void BRANCHES::update() void BRANCHES::save(EMUFILE *os) { + setTasProjectProgressBarText("Saving Branches..."); + setTasProjectProgressBar( 0, TOTAL_BOOKMARKS ); + // write cloud time os->fwrite(cloudTimestamp, TIMESTAMP_LENGTH); // write current branch and flag of changes since it @@ -469,6 +472,7 @@ void BRANCHES::save(EMUFILE *os) write32le(cachedFirstDifferences[i][t], os); } } + setTasProjectProgressBar( TOTAL_BOOKMARKS, TOTAL_BOOKMARKS ); } // returns true if couldn't load bool BRANCHES::load(EMUFILE *is) diff --git a/src/drivers/Qt/TasEditor/greenzone.cpp b/src/drivers/Qt/TasEditor/greenzone.cpp index 73472c7a..c8dcb5f2 100644 --- a/src/drivers/Qt/TasEditor/greenzone.cpp +++ b/src/drivers/Qt/TasEditor/greenzone.cpp @@ -236,6 +236,7 @@ void GREENZONE::save(EMUFILE *os, int save_type) { if (save_type != GREENZONE_SAVING_MODE_NO) { + setTasProjectProgressBarText("Saving Greenzone..."); collectCurrentState(); // in case the project is being saved before the greenzone.update() was called within current frame runGreenzoneCleaning(); if (greenzoneSize > (int)savestates.size()) @@ -248,9 +249,11 @@ void GREENZONE::save(EMUFILE *os, int save_type) write32le(greenzoneSize, os); // write Playback cursor position write32le(currFrameCounter, os); + + setTasProjectProgressBar( 0, greenzoneSize ); } int frame, size; - int last_tick = 0; + int last_tick = -1; switch (save_type) { @@ -262,7 +265,8 @@ void GREENZONE::save(EMUFILE *os, int save_type) // update TASEditor progressbar from time to time if (frame / PROGRESSBAR_UPDATE_RATE > last_tick) { - playback->setProgressbar(frame, greenzoneSize); + setTasProjectProgressBar( frame, greenzoneSize ); + //playback->setProgressbar(frame, greenzoneSize); last_tick = frame / PROGRESSBAR_UPDATE_RATE; } if (!savestates[frame].size()) continue; @@ -286,7 +290,8 @@ void GREENZONE::save(EMUFILE *os, int save_type) // update TASEditor progressbar from time to time if (frame / PROGRESSBAR_UPDATE_RATE > last_tick) { - playback->setProgressbar(frame, greenzoneSize); + setTasProjectProgressBar( frame, greenzoneSize ); + //playback->setProgressbar(frame, greenzoneSize); last_tick = frame / PROGRESSBAR_UPDATE_RATE; } if (!savestates[frame].size()) continue; @@ -311,7 +316,8 @@ void GREENZONE::save(EMUFILE *os, int save_type) // update TASEditor progressbar from time to time if (frame / PROGRESSBAR_UPDATE_RATE > last_tick) { - playback->setProgressbar(frame, greenzoneSize); + setTasProjectProgressBar( frame, greenzoneSize ); + //playback->setProgressbar(frame, greenzoneSize); last_tick = frame / PROGRESSBAR_UPDATE_RATE; } if (!savestates[frame].size()) continue; @@ -345,6 +351,10 @@ void GREENZONE::save(EMUFILE *os, int save_type) break; } } + if (save_type != GREENZONE_SAVING_MODE_NO) + { + setTasProjectProgressBar( greenzoneSize, greenzoneSize ); + } } // returns true if couldn't load bool GREENZONE::load(EMUFILE *is, unsigned int offset) @@ -357,7 +367,8 @@ bool GREENZONE::load(EMUFILE *is, unsigned int offset) if (offset) { if (is->fseek(offset, SEEK_SET)) goto error; - } else + } + else { reset(); playback->restartPlaybackFromZeroGround(); // reset Playback cursor to frame 0 diff --git a/src/drivers/Qt/TasEditor/history.cpp b/src/drivers/Qt/TasEditor/history.cpp index 4f3797ea..61f2dc18 100644 --- a/src/drivers/Qt/TasEditor/history.cpp +++ b/src/drivers/Qt/TasEditor/history.cpp @@ -989,7 +989,11 @@ void HISTORY::save(EMUFILE *os, bool really_save) { if (really_save) { - int real_pos, last_tick = 0; + int real_pos, last_tick = -1; + + setTasProjectProgressBarText("Saving History..."); + setTasProjectProgressBar( 0, historyTotalItems ); + // write "HISTORY" string os->fwrite(historySaveID, HISTORY_ID_LEN); // write vars @@ -1004,11 +1008,14 @@ void HISTORY::save(EMUFILE *os, bool really_save) os->fwrite(¤tBranchNumberBackups[real_pos], 1); if (i / SAVING_HISTORY_PROGRESSBAR_UPDATE_RATE > last_tick) { - playback->setProgressbar(i, historyTotalItems); + setTasProjectProgressBar( i, historyTotalItems ); + //playback->setProgressbar(i, historyTotalItems); last_tick = i / PROGRESSBAR_UPDATE_RATE; } } - } else + setTasProjectProgressBar( historyTotalItems, historyTotalItems ); + } + else { // write "HISTORX" string os->fwrite(historySkipSaveID, HISTORY_ID_LEN); diff --git a/src/drivers/Qt/TasEditor/markers_manager.cpp b/src/drivers/Qt/TasEditor/markers_manager.cpp index f6b67b82..69a8a1b2 100644 --- a/src/drivers/Qt/TasEditor/markers_manager.cpp +++ b/src/drivers/Qt/TasEditor/markers_manager.cpp @@ -64,11 +64,16 @@ void MARKERS_MANAGER::save(EMUFILE *os, bool really_save) { if (really_save) { + setTasProjectProgressBarText("Saving Markers..."); + setTasProjectProgressBar( 0, 100 ); + // write "MARKERS" string os->fwrite(markers_save_id, MARKERS_ID_LEN); markers.resetCompressedStatus(); // must recompress data, because most likely it has changed since last compression markers.save(os); - } else + setTasProjectProgressBar( 100, 100 ); + } + else { // write "MARKERX" string, meaning that Markers are not saved os->fwrite(markers_skipsave_id, MARKERS_ID_LEN); diff --git a/src/drivers/Qt/TasEditor/selection.cpp b/src/drivers/Qt/TasEditor/selection.cpp index 76083a23..5fb396ef 100644 --- a/src/drivers/Qt/TasEditor/selection.cpp +++ b/src/drivers/Qt/TasEditor/selection.cpp @@ -263,6 +263,11 @@ void SELECTION::save(EMUFILE *os, bool really_save) { if (really_save) { + int last_tick = -1; + + setTasProjectProgressBarText("Saving Selection..."); + setTasProjectProgressBar( 0, historyTotalItems ); + // write "SELECTION" string os->fwrite(selection_save_id, SELECTION_ID_LEN); // write vars @@ -272,10 +277,20 @@ void SELECTION::save(EMUFILE *os, bool really_save) for (int i = 0; i < historyTotalItems; ++i) { saveSelection(rowsSelectionHistory[(historyStartPos + i) % historySize], os); + + if (i / SAVING_HISTORY_PROGRESSBAR_UPDATE_RATE > last_tick) + { + setTasProjectProgressBar( i, historyTotalItems ); + //playback->setProgressbar(i, historyTotalItems); + last_tick = i / PROGRESSBAR_UPDATE_RATE; + } } // write clipboard_selection saveSelection(splicer->getClipboardSelection(), os); - } else + + setTasProjectProgressBar( historyTotalItems, historyTotalItems ); + } + else { // write "SELECTIOX" string os->fwrite(selection_skipsave_id, SELECTION_ID_LEN); diff --git a/src/drivers/Qt/TasEditor/taseditor_project.cpp b/src/drivers/Qt/TasEditor/taseditor_project.cpp index b73b00c6..de9f82ab 100644 --- a/src/drivers/Qt/TasEditor/taseditor_project.cpp +++ b/src/drivers/Qt/TasEditor/taseditor_project.cpp @@ -17,6 +17,7 @@ Project - Manager of working project ------------------------------------------------------------------------------------ */ #include +#include #include "fceu.h" #include "movie.h" @@ -32,6 +33,8 @@ extern void FCEU_PrintError(const char *format, ...); extern bool saveProject(bool save_compact = false); extern bool saveProjectAs(bool save_compact = false); +static QProgressDialog *progressDialog = NULL; + TASEDITOR_PROJECT::TASEDITOR_PROJECT() { } @@ -95,37 +98,51 @@ bool TASEDITOR_PROJECT::save(const char* differentName, bool inputInBinary, bool if (count1 && count2) { // ask user if he wants to fix the checksum before saving - char message[2048] = {0}; - strcpy(message, "Movie ROM:\n"); - strncat(message, currMovieData.romFilename.c_str(), 2047 - strlen(message)); - strncat(message, "\nMD5: ", 2047 - strlen(message)); - strncat(message, md5OfMovie, 2047 - strlen(message)); - strncat(message, "\n\nCurrent ROM:\n", 2047 - strlen(message)); - strncat(message, GameInfo->filename, 2047 - strlen(message)); - strncat(message, "\nMD5: ", 2047 - strlen(message)); - strncat(message, md5OfRom, 2047 - strlen(message)); - strncat(message, "\n\nFix the movie header before saving? ", 2047 - strlen(message)); - //int answer = MessageBox(taseditorWindow.hwndTASEditor, message, "ROM Checksum Mismatch", MB_YESNOCANCEL); - //if (answer == IDCANCEL) - //{ - // // cancel saving - // return false; - //} else if (answer == IDYES) - //{ + std::string message; + message.assign("Movie ROM:\n"); + message.append(currMovieData.romFilename.c_str()); + message.append("\nMD5: "); + message.append(md5OfMovie); + message.append("\n\nCurrent ROM:\n"); + message.append(GameInfo->filename); + message.append("\nMD5: "); + message.append(md5OfRom); + message.append("\n\nFix the movie header before saving? "); + + int ans = QMessageBox::warning( tasWin, QObject::tr("ROM Checksum Mismatch"), QObject::tr(message.c_str()), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Cancel ); + + if ( QMessageBox::Cancel == ans ) + { // cancel saving + return false; + } + else if ( QMessageBox::Yes == ans ) + { // change ROM data in the movie to current ROM currMovieData.romFilename = GameInfo->filename; currMovieData.romChecksum = GameInfo->MD5; - //} + } } } // open file for write EMUFILE_FILE* ofs = 0; if (differentName) + { ofs = FCEUD_UTF8_fstream(differentName, "wb"); + } else + { ofs = FCEUD_UTF8_fstream(getProjectFile().c_str(), "wb"); + } if (ofs) { + progressDialog = new QProgressDialog( QObject::tr("Saving TAS Project"), QObject::tr("Cancel"), 0, 100, tasWin ); + progressDialog->setWindowModality(Qt::WindowModal); + progressDialog->setWindowTitle( QObject::tr("Saving TAS Project") ); + progressDialog->setAutoReset(false); + progressDialog->setAutoClose(false); + progressDialog->setMinimumDuration(500); + progressDialog->setValue(0); + // change cursor to hourglass //SetCursor(LoadCursor(0, IDC_WAIT)); // save fm2 data to the project file @@ -171,14 +188,20 @@ bool TASEDITOR_PROJECT::save(const char* differentName, bool inputInBinary, bool write32le(selectionOffset, ofs); // finish delete ofs; - playback->updateProgressbar(); + //playback->updateProgressbar(); // also set project.changed to false, unless it was SaveCompact if (!differentName) reset(); // restore cursor + + if ( progressDialog ) + { + delete progressDialog; progressDialog = NULL; + } //taseditorWindow.mustUpdateMouseCursor = true; return true; - } else + } + else { return false; } @@ -455,3 +478,25 @@ void setInputType(MovieData& md, int newInputType) taseditorConfig->lastExportedInputType = newInputType; } } + +void setTasProjectProgressBarText( const char *txt ) +{ + if ( progressDialog ) + { + progressDialog->setLabelText( QObject::tr(txt) ); + } +} + +void setTasProjectProgressBar( int cur, int max ) +{ + if ( progressDialog ) + { + //printf("Set Progress %i / %i \n", cur, max ); + + if ( max != progressDialog->maximum() ) + { + progressDialog->setMaximum(max); + } + progressDialog->setValue(cur); + } +} diff --git a/src/drivers/Qt/TasEditor/taseditor_project.h b/src/drivers/Qt/TasEditor/taseditor_project.h index c86552d4..ca734ed1 100644 --- a/src/drivers/Qt/TasEditor/taseditor_project.h +++ b/src/drivers/Qt/TasEditor/taseditor_project.h @@ -79,3 +79,5 @@ private: int getInputType(MovieData& md); void setInputType(MovieData& md, int new_input_type); +void setTasProjectProgressBar( int cur, int max ); +void setTasProjectProgressBarText( const char *txt );