fix: headwords dialog export function

sorted the exported headwords and remove duplicated items.
This commit is contained in:
Xiao YiFang 2022-12-31 14:01:48 +08:00
parent 101a673cf6
commit 9acbd3aa2f

View file

@ -17,6 +17,7 @@
#include <QRegularExpression> #include <QRegularExpression>
#include "wildcard.hh" #include "wildcard.hh"
#include "gddebug.hh" #include "gddebug.hh"
#include <QMessageBox>
#define AUTO_APPLY_LIMIT 150000 #define AUTO_APPLY_LIMIT 150000
@ -282,92 +283,95 @@ void DictHeadwords::saveHeadersToFile()
if( fileName.size() == 0) if( fileName.size() == 0)
return; return;
cfg.headwordsDialog.headwordsExportPath = QDir::toNativeSeparators(
QFileInfo( fileName ).absoluteDir().absolutePath() );
QFile file( fileName ); QFile file( fileName );
for(;;)
{
if ( !file.open( QFile::WriteOnly | QIODevice::Text ) ) if ( !file.open( QFile::WriteOnly | QIODevice::Text ) )
break;
int headwordsNumber = model->totalCount();
// Setup progress dialog
int n = headwordsNumber;
int step = 1;
while( n > 1000 )
{ {
step *= 10; QMessageBox::critical( this, "GoldenDict", tr( "Can not open exported file" ) );
n /= 10; return;
} }
QProgressDialog progress( tr( "Export headwords..."), tr( "Cancel" ), cfg.headwordsDialog.headwordsExportPath = QDir::toNativeSeparators(
0, n, this ); QFileInfo( fileName ).absoluteDir().absolutePath() );
QSet< QString > allHeadwords;
int headwordsNumber = model->totalCount();
//headwordsNumber*2 , read + write
QProgressDialog progress( tr( "Export headwords..." ), tr( "Cancel" ), 0, headwordsNumber*2, this );
progress.setWindowModality( Qt::WindowModal ); progress.setWindowModality( Qt::WindowModal );
int totalCount=0;
for( int i = 0; i < headwordsNumber && i < model->wordCount(); ++i )
{
if( progress.wasCanceled() )
break;
progress.setValue( totalCount++ );
QVariant value = model->getRow( i );
if( !value.canConvert< QString >() )
continue;
allHeadwords.insert( value.toString() );
}
// continue to write the remaining headword
int nodeIndex = model->getCurrentIndex();
auto headwords = model->getRemainRows( nodeIndex );
while( !headwords.isEmpty() )
{
if( progress.wasCanceled() )
break;
allHeadwords.unite(headwords);
totalCount += headwords.size();
progress.setValue( totalCount );
headwords = model->getRemainRows( nodeIndex );
}
qDebug()<<model->getCurrentIndex();
// Write UTF-8 BOM // Write UTF-8 BOM
QByteArray line; QByteArray line;
line.append( 0xEF ).append( 0xBB ).append( 0xBF ); line.append( 0xEF ).append( 0xBB ).append( 0xBF );
if ( file.write( line ) != line.size() ) file.write( line );
break;
QList< QString > sortedWords = allHeadwords.values();
sortedWords.sort();
// Write headwords // Write headwords
for( auto const & word : sortedWords )
int i;
for( i = 0; i < headwordsNumber&&i<model->wordCount(); ++i )
{ {
if( i % step == 0 )
progress.setValue( i / step );
if( progress.wasCanceled() ) if( progress.wasCanceled() )
break; break;
progress.setValue( totalCount++ );
QVariant value = model->getRow(i); line = word.toUtf8();
if( !value.canConvert< QString >() )
continue;
line = value.toString().toUtf8();
line.replace( '\n', ' ' ); line.replace( '\n', ' ' );
line.replace( '\r', ' ' ); line.replace( '\r', ' ' );
line += "\n"; line += "\n";
if ( file.write( line ) != line.size() ) if( file.write( line ) != line.size() )
break; break;
} }
//continue to write the remaining headword file.close();
int nodeIndex = model->getCurrentIndex();
auto headwords = model->getRemainRows(nodeIndex);
while(!headwords.isEmpty())
{
if( progress.wasCanceled() ) if( progress.wasCanceled() )
break; {
for(auto & w:headwords){ QMessageBox::warning( this, "GoldenDict", tr( "Export process is interrupted" ) );
//progress
if( ++i % step == 0 )
progress.setValue( i / step );
line = w.toUtf8();
line += "\n";
if ( file.write( line ) != line.size() )
break;
}
headwords = model->getRemainRows(nodeIndex);
}
if( i < headwordsNumber && !progress.wasCanceled() )
break;
file.close();
return;
}
gdWarning( "Headers export error: %s", file.errorString().toUtf8().data() ); gdWarning( "Headers export error: %s", file.errorString().toUtf8().data() );
file.close(); }
else
{
//completed.
progress.setValue(headwordsNumber*2);
progress.hide();
QMessageBox::information( this, "GoldenDict", tr( "Export finished" ) );
}
} }
void DictHeadwords::helpRequested() void DictHeadwords::helpRequested()