Implemented piano roll save/load state functionality for Qt GUI. Fixed periodic autosave for Qt Tas editor.
This commit is contained in:
parent
148d6a4af5
commit
a7244cf343
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
|
@ -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>
|
||||||
|
|
|
@ -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 )
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue