Implemented piano roll save/load state functionality for Qt GUI. Fixed periodic autosave for Qt Tas editor.

This commit is contained in:
mjbudd77 2021-11-28 18:56:22 -05:00
parent 148d6a4af5
commit a7244cf343
5 changed files with 103 additions and 12 deletions

BIN
icons/taseditor-icon32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -29,5 +29,6 @@
<file>icons/find.png</file> <file>icons/find.png</file>
<file>icons/cloud.png</file> <file>icons/cloud.png</file>
<file>icons/branch_spritesheet.png</file> <file>icons/branch_spritesheet.png</file>
<file>icons/taseditor-icon32.png</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -86,6 +86,11 @@ enum DRAG_MODES
#define GREEN_BLUE_ARROW_IMAGE_ID (BLUE_ARROW_IMAGE_ID | GREEN_ARROW_IMAGE_ID) #define GREEN_BLUE_ARROW_IMAGE_ID (BLUE_ARROW_IMAGE_ID | GREEN_ARROW_IMAGE_ID)
#define MARKER_DRAG_COUNTDOWN_MAX 14 #define MARKER_DRAG_COUNTDOWN_MAX 14
#define PIANO_ROLL_ID_LEN 11
// resources
static char pianoRollSaveID[PIANO_ROLL_ID_LEN] = "PIANO_ROLL";
static char pianoRollSkipSaveID[PIANO_ROLL_ID_LEN] = "PIANO_ROLX";
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
//---- Main TAS Editor Window //---- Main TAS Editor Window
@ -173,6 +178,7 @@ TasEditorWindow::TasEditorWindow(QWidget *parent)
clipboard = QGuiApplication::clipboard(); clipboard = QGuiApplication::clipboard();
setWindowTitle("TAS Editor"); setWindowTitle("TAS Editor");
//setWindowIcon( QIcon(":icons/taseditor-icon32.png") );
resize(512, 512); resize(512, 512);
@ -3193,6 +3199,69 @@ void QPianoRoll::reset(void)
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void QPianoRoll::save(EMUFILE *os, bool really_save)
{
if (really_save)
{
updateLinesCount();
// write "PIANO_ROLL" string
os->fwrite(pianoRollSaveID, PIANO_ROLL_ID_LEN);
// write current top item
int top_item = lineOffset;
write32le(top_item, os);
}
else
{
// write "PIANO_ROLX" string
os->fwrite(pianoRollSkipSaveID, PIANO_ROLL_ID_LEN);
}
}
//----------------------------------------------------------------------------
// returns true if couldn't load
bool QPianoRoll::load(EMUFILE *is, unsigned int offset)
{
reset();
updateLinesCount();
if (offset)
{
if (is->fseek(offset, SEEK_SET)) goto error;
}
else
{
// scroll to the beginning
//ListView_EnsureVisible(hwndList, 0, FALSE);
lineOffset = 0;
return false;
}
// read "PIANO_ROLL" string
char save_id[PIANO_ROLL_ID_LEN];
if ((int)is->fread(save_id, PIANO_ROLL_ID_LEN) < PIANO_ROLL_ID_LEN) goto error;
if (!strcmp(pianoRollSkipSaveID, save_id))
{
// string says to skip loading Piano Roll
FCEU_printf("No Piano Roll data in the file\n");
// scroll to the beginning
//ListView_EnsureVisible(hwndList, 0, FALSE);
lineOffset = 0;
return false;
}
if (strcmp(pianoRollSaveID, save_id)) goto error; // string is not valid
// read current top item and scroll Piano Roll there
int top_item;
if (!read32le(&top_item, is)) goto error;
//ListView_EnsureVisible(hwndList, currMovieData.getNumRecords() - 1, FALSE);
//ListView_EnsureVisible(hwndList, top_item, FALSE);
ensureTheLineIsVisible( currMovieData.getNumRecords() - 1 );
ensureTheLineIsVisible( top_item );
return false;
error:
FCEU_printf("Error loading Piano Roll data\n");
// scroll to the beginning
//ListView_EnsureVisible(hwndList, 0, FALSE);
lineOffset = 0;
return true;
}
//----------------------------------------------------------------------------
void QPianoRoll::setScrollBars( QScrollBar *h, QScrollBar *v ) void QPianoRoll::setScrollBars( QScrollBar *h, QScrollBar *v )
{ {
hbar = h; vbar = v; hbar = h; vbar = v;
@ -3431,9 +3500,22 @@ void QPianoRoll::drawArrow( QPainter *painter, int xl, int yl, int value )
} }
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void QPianoRoll::updateLinesCount(void)
{
// update the number of items in the list
int movie_size = currMovieData.getNumRecords();
maxLineOffset = movie_size - viewLines + 5;
if ( maxLineOffset < 0 )
{
maxLineOffset = 0;
}
}
//----------------------------------------------------------------------------
bool QPianoRoll::lineIsVisible( int lineNum ) bool QPianoRoll::lineIsVisible( int lineNum )
{ {
int lineEnd = lineOffset + viewLines; int lineEnd = lineOffset + viewLines - 1;
return ( (lineNum >= lineOffset) && (lineNum < lineEnd) ); return ( (lineNum >= lineOffset) && (lineNum < lineEnd) );
} }
@ -3444,7 +3526,9 @@ void QPianoRoll::ensureTheLineIsVisible( int lineNum )
{ {
int scrollOfs; int scrollOfs;
lineOffset = lineNum - 3; //printf("Seeking Frame %i\n", lineNum );
lineOffset = lineNum;
if ( lineOffset < 0 ) if ( lineOffset < 0 )
{ {

View File

@ -135,6 +135,8 @@ class QPianoRoll : public QWidget
~QPianoRoll(void); ~QPianoRoll(void);
void reset(void); void reset(void);
void save(EMUFILE *os, bool really_save);
bool load(EMUFILE *is, unsigned int offset);
void setScrollBars( QScrollBar *h, QScrollBar *v ); void setScrollBars( QScrollBar *h, QScrollBar *v );
QFont getFont(void){ return font; }; QFont getFont(void){ return font; };
@ -143,6 +145,7 @@ class QPianoRoll : public QWidget
bool lineIsVisible( int lineNum ); bool lineIsVisible( int lineNum );
void updateLinesCount(void);
void handleColumnSet(int column, bool altPressed); void handleColumnSet(int column, bool altPressed);
void centerListAroundLine(int rowIndex); void centerListAroundLine(int rowIndex);
void ensureTheLineIsVisible( int lineNum ); void ensureTheLineIsVisible( int lineNum );
@ -447,6 +450,7 @@ class TasEditorWindow : public QDialog
friend class PLAYBACK; friend class PLAYBACK;
friend class HISTORY; friend class HISTORY;
friend class MARKERS_MANAGER; friend class MARKERS_MANAGER;
friend class TASEDITOR_PROJECT;
friend class QPianoRoll; friend class QPianoRoll;
}; };

View File

@ -64,14 +64,14 @@ void TASEDITOR_PROJECT::update()
// if it's time to autosave - pop Save As dialog // if it's time to autosave - pop Save As dialog
if (changed && /*taseditorWindow.TASEditorIsInFocus &&*/ taseditorConfig->autosaveEnabled && !projectFile.empty() && clock() >= nextSaveShedule /*&& pianoRoll.dragMode == DRAG_MODE_NONE*/) if (changed && /*taseditorWindow.TASEditorIsInFocus &&*/ taseditorConfig->autosaveEnabled && !projectFile.empty() && clock() >= nextSaveShedule /*&& pianoRoll.dragMode == DRAG_MODE_NONE*/)
{ {
//if (taseditorConfig->autosaveSilent) if (taseditorConfig->autosaveSilent)
//{ {
// saveProject(); tasWin->saveProject();
//} }
//else else
//{ {
// saveProjectAs(); tasWin->saveProjectAs();
//} }
// in case user pressed Cancel, postpone saving to next time // in case user pressed Cancel, postpone saving to next time
sheduleNextAutosave(); sheduleNextAutosave();
} }
@ -80,8 +80,10 @@ void TASEDITOR_PROJECT::update()
bool TASEDITOR_PROJECT::save(const char* differentName, bool inputInBinary, bool saveMarkers, bool saveBookmarks, int saveGreenzone, bool saveHistory, bool savePianoRoll, bool saveSelection) bool TASEDITOR_PROJECT::save(const char* differentName, bool inputInBinary, bool saveMarkers, bool saveBookmarks, int saveGreenzone, bool saveHistory, bool savePianoRoll, bool saveSelection)
{ {
if (!differentName && getProjectFile().empty()) if (!differentName && getProjectFile().empty())
{
// no different name specified, and there's no current filename of the project // no different name specified, and there's no current filename of the project
return false; return false;
}
// check MD5 // check MD5
char md5OfMovie[256]; char md5OfMovie[256];
@ -160,7 +162,7 @@ bool TASEDITOR_PROJECT::save(const char* differentName, bool inputInBinary, bool
unsigned int historyOffset = ofs->ftell(); unsigned int historyOffset = ofs->ftell();
history->save(ofs, saveHistory); history->save(ofs, saveHistory);
unsigned int pianoRollOffset = ofs->ftell(); unsigned int pianoRollOffset = ofs->ftell();
//pianoRoll.save(ofs, savePianoRoll); tasWin->pianoRoll->save(ofs, savePianoRoll);
unsigned int selectionOffset = ofs->ftell(); unsigned int selectionOffset = ofs->ftell();
selection->save(ofs, saveSelection); selection->save(ofs, saveSelection);
// now write offsets (pointers) // now write offsets (pointers)
@ -319,7 +321,7 @@ bool TASEDITOR_PROJECT::load(const char* fullName)
pointerOffset += sizeof(unsigned int); pointerOffset += sizeof(unsigned int);
else else
dataOffset = 0; dataOffset = 0;
//pianoRoll.load(&ifs, dataOffset); tasWin->pianoRoll->load(&ifs, dataOffset);
if (numberOfPointers-- && !(ifs.fseek(pointerOffset, SEEK_SET)) && read32le(&dataOffset, &ifs)) if (numberOfPointers-- && !(ifs.fseek(pointerOffset, SEEK_SET)) && read32le(&dataOffset, &ifs))
pointerOffset += sizeof(unsigned int); pointerOffset += sizeof(unsigned int);