Added a AVI file load progress dialog to give feedback when loading large files.
This commit is contained in:
parent
a290718962
commit
674e3dc8f3
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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 )
|
||||
|
|
Loading…
Reference in New Issue