Win - TASEdit updates - display readonly in-window and allow saving greenzone.

This commit is contained in:
mart0258 2009-12-18 05:40:38 +00:00
parent 28cc8f5aae
commit f0b33ec203
4 changed files with 88 additions and 5 deletions

View File

@ -158,6 +158,19 @@ void UpdateTasEdit()
lastCursor = newCursor;
}
static int old_movie_readonly=-1;
if (old_movie_readonly != movie_readonly)
{
old_movie_readonly = movie_readonly;
if (movie_readonly)
{
SetWindowText(hwndTasEdit, "TAS Editor");
} else
{
SetWindowText(hwndTasEdit, "TAS Editor (Recording)");
}
}
}
void RedrawList()

View File

@ -63,9 +63,12 @@ bool TASEDIT_PROJECT::SaveProject()
std::ofstream ofs;
//ofs << GetProjectName() << std::endl;
//ofs << GetFM2Name() << std::endl;
ofs.open(filename);
ofs.open(filename, std::ios_base::binary);
currMovieData.dump(&ofs, true);
ofs.put('\0'); // TODO: Add main branch name.
currMovieData.dumpGreenzone(&ofs, true);
ofs.close();
changed=false;
@ -78,14 +81,18 @@ extern bool LoadFM2(MovieData& movieData, std::istream* fp, int size, bool stopA
bool TASEDIT_PROJECT::LoadProject(std::string PFN)
{
const char* filename = PFN.c_str();
//char buf[4096];
SetProjectName(PFN);
std::ifstream ifs;
ifs.open(filename);
//ifs.getline(ifs, 4090);
//ifs.getline(ifs, 4090);
ifs.open(filename, std::ios_base::binary);
LoadFM2(currMovieData, &ifs, INT_MAX, false);
LoadSubtitles(currMovieData);
char asdf;
ifs.get(asdf); // TODO: Add main branch name.
currMovieData.loadGreenzone(&ifs, true);
poweron(true);
ifs.close();

View File

@ -380,6 +380,10 @@ void MovieData::installValue(std::string& key, std::string& val)
StringToBytes(val,&savestate[0],len); // decodes either base64 or hex
}
}
else if (key == "length")
{
installInt(val, loadFrameCount);
}
}
int MovieData::dump(std::ostream *os, bool binary)
@ -408,6 +412,10 @@ int MovieData::dump(std::ostream *os, bool binary)
if(savestate.size() != 0)
*os << "savestate " << BytesToString(&savestate[0],savestate.size()) << endl;
if(FCEUMOV_Mode(MOVIEMODE_TASEDIT))
*os << "length " << this->records.size() << endl;
if(binary)
{
//put one | to start the binary dump
@ -423,6 +431,51 @@ int MovieData::dump(std::ostream *os, bool binary)
return end-start;
}
int MovieData::dumpGreenzone(std::ostream *os, bool binary)
{
int start = os->tellp();
int frame, size;
for (int i=0; i<(int)records.size(); ++i)
{
if (records[i].savestate.empty())
continue;
frame=i;
size=records[i].savestate.size();
write32le(frame, os);
write32le(size, os);
os->write(&records[i].savestate[0], size);
}
frame=-1;
size=currMovieData.greenZoneCount;
write32le(frame, os);
write32le(size, os);
int end= os->tellp();
return end-start;
}
int MovieData::loadGreenzone(std::istream *is, bool binary)
{
int frame, size;
while(1)
{
if (!read32le((uint32 *)&frame, is)) {size=0; break;}
if (!read32le((uint32 *)&size, is)) {size=0; break;}
if (frame==-1) break;
int pos = is->tellg();
FCEUSS_LoadFP(is, SSLOADPARAM_NOBACKUP);
is->seekg(pos+size);
}
greenZoneCount=size;
UpdateTasEdit();
return 1;
}
int FCEUMOV_GetFrame(void)
{
return currFrameCounter;
@ -495,6 +548,9 @@ static void LoadFM2_binarychunk(MovieData& movieData, std::istream* fp, int size
int todo = std::min(size, flen);
int numRecords = todo/recordsize;
if (movieData.loadFrameCount!=-1 && movieData.loadFrameCount<numRecords)
numRecords=movieData.loadFrameCount;
movieData.records.resize(numRecords);
for(int i=0;i<numRecords;i++)
{
@ -505,6 +561,9 @@ static void LoadFM2_binarychunk(MovieData& movieData, std::istream* fp, int size
//yuck... another custom text parser.
bool LoadFM2(MovieData& movieData, std::istream* fp, int size, bool stopAfterHeader)
{
// Non-TAS projects consume until EOF
movieData.installValue(std::string("length"), std::string("-1"));
//first, look for an fcm signature
char fcmbuf[3];
std::ios::pos_type curr = fp->tellg();

View File

@ -183,6 +183,7 @@ public:
//----TasEdit stuff---
int greenZoneCount;
int loadFrameCount;
//----
int getNumRecords() { return records.size(); }
@ -218,6 +219,9 @@ public:
void truncateAt(int frame);
void installValue(std::string& key, std::string& val);
int dump(std::ostream* os, bool binary);
int dumpGreenzone(std::ostream *os, bool binary);
int loadGreenzone(std::istream *is, bool binary);
void clearRecordRange(int start, int len);
void insertEmpty(int at, int frames);