Various tweaks to improve the QFileSystemModel performance. Also slightly improved the initialization.
This commit is contained in:
parent
158588b3ec
commit
602e1691c4
File diff suppressed because it is too large
Load Diff
@ -1842,6 +1842,10 @@
|
||||
<source>Show Favorites</source>
|
||||
<translation>Favoriten anzeigen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Initializing directory outline, please be patient...</source>
|
||||
<translation>Verzeichnisbaum wird erzeugt, bitte warten...</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -1841,6 +1841,10 @@
|
||||
<source>Show Favorites</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Initializing directory outline, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -1851,6 +1851,10 @@ Ouvrir le dossier récursivement...</translation>
|
||||
<source>Show Favorites</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Initializing directory outline, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -1842,6 +1842,10 @@
|
||||
<source>Show Favorites</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Initializing directory outline, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -1841,6 +1841,10 @@
|
||||
<source>Show Favorites</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Initializing directory outline, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1847,6 +1847,10 @@
|
||||
<source>Show Favorites</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Initializing directory outline, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -1841,6 +1841,10 @@
|
||||
<source>Show Favorites</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Initializing directory outline, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -1842,6 +1842,10 @@
|
||||
<source>Show Favorites</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Initializing directory outline, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -1841,6 +1841,10 @@
|
||||
<source>Show Favorites</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Initializing directory outline, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
Binary file not shown.
@ -30,7 +30,7 @@
|
||||
#define VER_LAMEXP_MINOR_LO 4
|
||||
#define VER_LAMEXP_TYPE Beta
|
||||
#define VER_LAMEXP_PATCH 10
|
||||
#define VER_LAMEXP_BUILD 932
|
||||
#define VER_LAMEXP_BUILD 939
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Tool versions (minimum expected versions!)
|
||||
|
@ -94,7 +94,7 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
|
||||
m_qaacEncoderAvailable(lamexp_check_tool("qaac.exe") && lamexp_check_tool("libsoxrate.dll")),
|
||||
m_accepted(false),
|
||||
m_firstTimeShown(true),
|
||||
m_outputFolderViewInitialized(false),
|
||||
m_outputFolderViewInitialized(3),
|
||||
m_outputFolderViewCentering(false)
|
||||
{
|
||||
//Init the dialog, from the .ui file
|
||||
@ -161,6 +161,7 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
|
||||
outputFolderView->setAnimated(false);
|
||||
outputFolderView->setMouseTracking(false);
|
||||
outputFolderView->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
outputFolderView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
|
||||
outputFolderView->installEventFilter(this);
|
||||
outputFoldersEditorLabel->installEventFilter(this);
|
||||
outputFoldersFovoritesLabel->installEventFilter(this);
|
||||
@ -192,6 +193,11 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
|
||||
outputFolderLabel->installEventFilter(this);
|
||||
outputFolderView->setCurrentIndex(m_fileSystemModel->index(m_settings->outputDir()));
|
||||
outputFolderViewClicked(outputFolderView->currentIndex());
|
||||
m_outputFolderNoteBox = new QLabel(outputFolderView);
|
||||
m_outputFolderNoteBox->setAutoFillBackground(true);
|
||||
m_outputFolderNoteBox->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
||||
m_outputFolderNoteBox->setFrameShape(QFrame::StyledPanel);
|
||||
SET_FONT_BOLD(m_outputFolderNoteBox, true);
|
||||
refreshFavorites();
|
||||
|
||||
//Setup "Meta Data" tab
|
||||
@ -711,6 +717,7 @@ void MainWindow::changeEvent(QEvent *e)
|
||||
|
||||
//Manually re-translate widgets that UIC doesn't handle
|
||||
m_dropNoteLabel->setText(QString("» %1 «").arg(tr("You can drop in audio files here!")));
|
||||
m_outputFolderNoteBox->setText(tr("Initializing directory outline, please be patient..."));
|
||||
m_showDetailsContextAction->setText(tr("Show Details"));
|
||||
m_previewContextAction->setText(tr("Open File in External Application"));
|
||||
m_findFileContextAction->setText(tr("Browse File Location"));
|
||||
@ -826,8 +833,13 @@ void MainWindow::closeEvent(QCloseEvent *event)
|
||||
*/
|
||||
void MainWindow::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
QMainWindow::resizeEvent(event);
|
||||
if(event) QMainWindow::resizeEvent(event);
|
||||
m_dropNoteLabel->setGeometry(0, 0, sourceFileView->width(), sourceFileView->height());
|
||||
|
||||
if(QWidget *port = outputFolderView->viewport())
|
||||
{
|
||||
m_outputFolderNoteBox->setGeometry(16, (port->height() - 64) / 2, port->width() - 32, 64);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1390,6 +1402,8 @@ void MainWindow::closeButtonClicked(void)
|
||||
*/
|
||||
void MainWindow::tabPageChanged(int idx)
|
||||
{
|
||||
resizeEvent(NULL);
|
||||
|
||||
QList<QAction*> actions = m_tabActionGroup->actions();
|
||||
for(int i = 0; i < actions.count(); i++)
|
||||
{
|
||||
@ -1435,7 +1449,7 @@ void MainWindow::tabPageChanged(int idx)
|
||||
}
|
||||
else if(idx == tabWidget->indexOf(tabOutputDir))
|
||||
{
|
||||
if(!m_outputFolderViewInitialized)
|
||||
if(m_outputFolderViewInitialized > 0)
|
||||
{
|
||||
QTimer::singleShot(125, this, SLOT(initOutputFolderModel()));
|
||||
}
|
||||
@ -2517,8 +2531,9 @@ void MainWindow::makeFolderButtonClicked(void)
|
||||
QDir createdDir = basePath;
|
||||
if(createdDir.cd(newFolder))
|
||||
{
|
||||
outputFolderView->setCurrentIndex(m_fileSystemModel->index(createdDir.canonicalPath()));
|
||||
outputFolderViewClicked(outputFolderView->currentIndex());
|
||||
QModelIndex newIndex = m_fileSystemModel->index(createdDir.canonicalPath());
|
||||
outputFolderView->setCurrentIndex(newIndex);
|
||||
outputFolderViewClicked(newIndex);
|
||||
CENTER_CURRENT_OUTPUT_FOLDER_DELAYED;
|
||||
}
|
||||
}
|
||||
@ -2661,9 +2676,26 @@ void MainWindow::outputFolderEditFinished(void)
|
||||
*/
|
||||
void MainWindow::initOutputFolderModel(void)
|
||||
{
|
||||
m_fileSystemModel->setRootPath("");
|
||||
if(m_fileSystemModel) m_fileSystemModel->setRootPath("");
|
||||
CENTER_CURRENT_OUTPUT_FOLDER_DELAYED;
|
||||
m_outputFolderViewInitialized = true;
|
||||
QTimer::singleShot(125, this, SLOT(initOutputFolderModel_doAsync()));
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize file system model (do NOT call this one directly!)
|
||||
*/
|
||||
void MainWindow::initOutputFolderModel_doAsync(void)
|
||||
{
|
||||
if(m_outputFolderViewInitialized > 0)
|
||||
{
|
||||
m_outputFolderViewInitialized--;
|
||||
QTimer::singleShot(125, this, SLOT(initOutputFolderModel_doAsync()));
|
||||
}
|
||||
else
|
||||
{
|
||||
QTimer::singleShot(125, m_outputFolderNoteBox, SLOT(hide()));
|
||||
outputFolderView->setFocus();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -94,6 +94,7 @@ private slots:
|
||||
void importCueSheetActionTriggered(bool checked);
|
||||
void importCsvContextActionTriggered(void);
|
||||
void initOutputFolderModel(void);
|
||||
void initOutputFolderModel_doAsync(void);
|
||||
void languageActionActivated(QAction *action);
|
||||
void languageFromFileActionActivated(bool checked);
|
||||
void makeFolderButtonClicked(void);
|
||||
@ -165,7 +166,7 @@ private:
|
||||
|
||||
bool m_accepted;
|
||||
bool m_firstTimeShown;
|
||||
bool m_outputFolderViewInitialized;
|
||||
uint m_outputFolderViewInitialized;
|
||||
bool m_outputFolderViewCentering;
|
||||
|
||||
const bool m_neroEncoderAvailable;
|
||||
@ -186,6 +187,7 @@ private:
|
||||
SettingsModel *m_settings;
|
||||
QMenu *m_sourceFilesContextMenu;
|
||||
QMenu *m_outputFolderFavoritesMenu;
|
||||
QLabel *m_outputFolderNoteBox;
|
||||
|
||||
QAction *m_findFileContextAction;
|
||||
QAction *m_previewContextAction;
|
||||
|
@ -26,6 +26,9 @@
|
||||
#include <QFileIconProvider>
|
||||
#include <QDesktopServices>
|
||||
|
||||
#define IS_DIR(ATTR) (((ATTR) & FILE_ATTRIBUTE_DIRECTORY) && (!((ATTR) & FILE_ATTRIBUTE_HIDDEN)))
|
||||
#define NO_DOT_OR_DOTDOT(STR) (wcscmp((STR), L".") && wcscmp((STR), L".."))
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Dummy QFileIconProvider class
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@ -154,8 +157,78 @@ bool QFileSystemModelEx::hasChildren(const QModelIndex &parent) const
|
||||
{
|
||||
if(parent.isValid())
|
||||
{
|
||||
return (QDir(QFileSystemModel::filePath(parent)).entryList(QDir::Dirs | QDir::NoDotAndDotDot).count() > 0);
|
||||
return (QFileSystemModel::rowCount(parent) > 0) || hasSubfoldersCached(filePath(parent));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int QFileSystemModelEx::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
if(parent.isValid())
|
||||
{
|
||||
removeFromCache(filePath(parent));
|
||||
}
|
||||
|
||||
return QFileSystemModel::rowCount(parent);
|
||||
}
|
||||
|
||||
void QFileSystemModelEx::fetchMore(const QModelIndex &parent)
|
||||
{
|
||||
if(parent.isValid())
|
||||
{
|
||||
removeFromCache(filePath(parent));
|
||||
}
|
||||
|
||||
QFileSystemModel::fetchMore(parent);
|
||||
}
|
||||
|
||||
|
||||
/* ------------------------ */
|
||||
/* STATIC FUNCTIONS BELOW */
|
||||
/* ------------------------ */
|
||||
|
||||
QHash<const QString, bool> QFileSystemModelEx::s_hasFolderCache;
|
||||
QMutex QFileSystemModelEx::s_hasFolderMutex;
|
||||
|
||||
bool QFileSystemModelEx::hasSubfoldersCached(const QString &path)
|
||||
{
|
||||
QMutexLocker lock(&s_hasFolderMutex);
|
||||
|
||||
if(s_hasFolderCache.contains(path))
|
||||
{
|
||||
return s_hasFolderCache.value(path);
|
||||
}
|
||||
|
||||
bool bChildren = hasSubfolders(path);
|
||||
s_hasFolderCache.insert(path, bChildren);
|
||||
return bChildren;
|
||||
}
|
||||
|
||||
void QFileSystemModelEx::removeFromCache(const QString &path)
|
||||
{
|
||||
QMutexLocker lock(&s_hasFolderMutex);
|
||||
s_hasFolderCache.remove(path);
|
||||
}
|
||||
|
||||
bool QFileSystemModelEx::hasSubfolders(const QString &path)
|
||||
{
|
||||
bool bChildren = false; WIN32_FIND_DATAW findData;
|
||||
HANDLE h = FindFirstFileW(QWCHAR(QDir::toNativeSeparators(path + "/*")), &findData);
|
||||
if(h != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
if(NO_DOT_OR_DOTDOT(findData.cFileName))
|
||||
{
|
||||
bChildren = IS_DIR(findData.dwFileAttributes);
|
||||
}
|
||||
while((!bChildren) && FindNextFile(h, &findData))
|
||||
{
|
||||
if(NO_DOT_OR_DOTDOT(findData.cFileName))
|
||||
{
|
||||
bChildren = IS_DIR(findData.dwFileAttributes);
|
||||
}
|
||||
}
|
||||
FindClose(h);
|
||||
}
|
||||
return bChildren;
|
||||
}
|
||||
|
@ -22,6 +22,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <QFileSystemModel>
|
||||
#include <QMutex>
|
||||
|
||||
class QFileIconProviderEx;
|
||||
|
||||
@ -32,7 +33,16 @@ public:
|
||||
~QFileSystemModelEx();
|
||||
|
||||
virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const;
|
||||
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
virtual void fetchMore(const QModelIndex &parent);
|
||||
|
||||
private:
|
||||
QFileIconProviderEx *m_myIconProvider;
|
||||
|
||||
static QHash<const QString, bool> s_hasFolderCache;
|
||||
static QMutex s_hasFolderMutex;
|
||||
|
||||
static bool hasSubfolders(const QString &path);
|
||||
static bool hasSubfoldersCached(const QString &path);
|
||||
static void removeFromCache(const QString &path);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user