Added a AVI file load progress dialog to give feedback when loading large files.

This commit is contained in:
mjbudd77 2021-10-03 10:55:55 -04:00
parent a290718962
commit 674e3dc8f3
3 changed files with 69 additions and 5 deletions

View File

@ -62,6 +62,8 @@ AviRiffViewerDialog::AviRiffViewerDialog(QWidget *parent)
avi = NULL;
lastChunk = NULL;
riffSize = 0;
progressDialog = NULL;
memset( strhType, 0, sizeof(strhType) );
setWindowTitle("AVI RIFF Viewer");
@ -274,6 +276,8 @@ void AviRiffViewerDialog::openAviFileDialog(void)
//----------------------------------------------------------------------------
int AviRiffViewerDialog::openFile( const char *filepath )
{
int ret;
if ( avi )
{
closeFile();
@ -286,12 +290,31 @@ int AviRiffViewerDialog::openFile( const char *filepath )
return -1;
}
progressDialog = new QProgressDialog( tr("Loading AVI File"), tr("Cancel"), 0, 1000, this );
progressDialog->setWindowModality(Qt::WindowModal);
itemStack.clear();
lastChunk = NULL;
memset( strhType, 0, sizeof(strhType) );
riffSize = 0;
avi->setRiffWalkCallback( ::riffWalkCallback, this );
avi->riffwalk();
ret = avi->riffwalk();
if ( ret )
{
if ( progressDialog->wasCanceled() )
{
QMessageBox::information( this, tr("AVI Load Canceled"), tr("AVI Load Canceled By User.") );
}
else
{
progressDialog->reset();
QMessageBox::critical( this, tr("AVI Load Error"), tr("AVI format errors detected. Unable to load file.") );
}
closeFile();
}
delete progressDialog; progressDialog = NULL;
return 0;
}
@ -310,12 +333,33 @@ int AviRiffViewerDialog::riffWalkCallback( int type, long long int fpos, const c
{
AviRiffTreeItem *item, *groupItem;
if ( riffSize > 0 )
{
int prog;
prog = (1000llu * fpos) / riffSize;
if ( prog > 1000 )
{
prog = 1000;
}
if ( progressDialog )
{
if (progressDialog->wasCanceled())
{
return -1;
}
progressDialog->setValue( prog );
}
}
switch ( type )
{
case gwavi_t::RIFF_START:
{
item = new AviRiffTreeItem(type, fpos, fourcc, size);
riffSize = size;
itemStack.push_back(item);
riffTree->addTopLevelItem(item);

View File

@ -21,6 +21,7 @@
#include <QTreeView>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QProgressDialog>
#include <QTabWidget>
#include <QMenuBar>
#include <QAction>
@ -80,8 +81,10 @@ protected:
AviRiffTreeItem *lastChunk;
std::list <AviRiffTreeItem*> itemStack;
char strhType[8];
size_t riffSize;
QTabWidget *tabs;
QProgressDialog *progressDialog;
private:
public slots:

View File

@ -673,6 +673,11 @@ int gwavi_t::riffwalk(void)
return -1;
fourcc[4] = 0;
if ( strcmp( fourcc, "RIFF") != 0 )
{
return -1;
}
//printf("RIFF Begin: '%s'\n", fourcc );
if (read_uint(in, fileSize) == -1)
@ -692,7 +697,10 @@ int gwavi_t::riffwalk(void)
if ( riffWalkCallback )
{
riffWalkCallback( RIFF_START, fpos, fourcc, fileSize, riffWalkUserData );
if ( riffWalkCallback( RIFF_START, fpos, fourcc, fileSize, riffWalkUserData ) )
{
return -1;
}
}
while ( size >= 4 )
@ -731,7 +739,10 @@ int gwavi_t::riffwalk(void)
if ( riffWalkCallback )
{
riffWalkCallback( RIFF_END, fpos, fourcc, fileSize, riffWalkUserData );
if ( riffWalkCallback( RIFF_END, fpos, fourcc, fileSize, riffWalkUserData ) )
{
return -1;
}
}
return 0;
}
@ -830,7 +841,10 @@ unsigned int gwavi_t::readList(int lvl)
{
fpos = ftell(in);
riffWalkCallback( LIST_END, fpos, listType, listSize, riffWalkUserData );
if ( riffWalkCallback( LIST_END, fpos, listType, listSize, riffWalkUserData ) )
{
return 0;
}
}
return bytesRead+4;
}
@ -856,7 +870,10 @@ unsigned int gwavi_t::readChunk(const char *id, int lvl)
if ( riffWalkCallback )
{
riffWalkCallback( CHUNK_START, fpos-4, id, chunkSize, riffWalkUserData );
if ( riffWalkCallback( CHUNK_START, fpos-4, id, chunkSize, riffWalkUserData ) )
{
return 0;
}
}
if ( chunkSize == 0 )