Load file metadata asynchronously

Synchronous load of metadata resulted in big delays when opening a
directory with substantial amount of files.

Closes: https://mirror.git.trinitydesktop.org/gitea/TDE/gwenview/issues/17
Signed-off-by: Alexander Golubev <fatzer2@gmail.com>
pull/22/head
Alexander Golubev 4 months ago
parent 6ca60fdaa3
commit 8c522cac34

@ -48,6 +48,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include <kurldrag.h> #include <kurldrag.h>
#include <tdeio/job.h> #include <tdeio/job.h>
#include <tdeio/file.h> #include <tdeio/file.h>
#include <tdeio/metainfojob.h>
// Local // Local
#include "archive.h" #include "archive.h"
@ -188,6 +189,9 @@ public:
TQComboBox* mFilterComboBox; TQComboBox* mFilterComboBox;
TQCheckBox* mShowFilterBarCheckBox; TQCheckBox* mShowFilterBarCheckBox;
TDEIO::MetaInfoJob* mMetaInfoJob;
KFileItemList mMetaInfoTodo;
void initFilterBar() { void initFilterBar() {
mFilterBar=new FilterBar(that); mFilterBar=new FilterBar(that);
mFilterBar->setSizePolicy(TQSizePolicy::Preferred, TQSizePolicy::Fixed); mFilterBar->setSizePolicy(TQSizePolicy::Preferred, TQSizePolicy::Fixed);
@ -266,6 +270,7 @@ FileViewController::FileViewController(TQWidget* parent,TDEActionCollection* act
d->initFilterBar(); d->initFilterBar();
d->initFilterCombo(); d->initFilterCombo();
d->mStack=new TQWidgetStack(this); d->mStack=new TQWidgetStack(this);
d->mMetaInfoJob=NULL;
TQVBoxLayout *layout=new TQVBoxLayout(this); TQVBoxLayout *layout=new TQVBoxLayout(this);
layout->addWidget(d->mToolBar); layout->addWidget(d->mToolBar);
@ -470,6 +475,7 @@ FileViewController::~FileViewController() {
FileViewConfig::setToDateFilter(d->mFilterBar->mToDateEdit->date()); FileViewConfig::setToDateFilter(d->mFilterBar->mToDateEdit->date());
FileViewConfig::writeConfig(); FileViewConfig::writeConfig();
stopMetaInfoUpdate();
delete mDirLister; delete mDirLister;
delete d; delete d;
} }
@ -1022,6 +1028,12 @@ void FileViewController::dirListerDeleteItem(KFileItem* item) {
if (!newShownItem) newShownItem=findPreviousImage(); if (!newShownItem) newShownItem=findPreviousImage();
} }
// Remove item from metadata todo list and job's pending update lists
d->mMetaInfoTodo.remove(item);
if (d->mMetaInfoJob) {
d->mMetaInfoJob->removeItem(item);
}
currentFileView()->removeItem(item); currentFileView()->removeItem(item);
if (shownItem==item) { if (shownItem==item) {
@ -1040,21 +1052,24 @@ void FileViewController::dirListerNewItems(const KFileItemList& items) {
LOG(""); LOG("");
mThumbnailsNeedUpdate=true; mThumbnailsNeedUpdate=true;
currentFileView()->addItemList(items); currentFileView()->addItemList(items);
loadMetaInfo(items);
} }
void FileViewController::dirListerRefreshItems(const KFileItemList& list) { void FileViewController::dirListerRefreshItems(const KFileItemList& list) {
LOG(""); LOG("");
const KFileItem* item=currentFileView()->shownFileItem();
KFileItemListIterator it(list); KFileItemListIterator it(list);
for (; *it!=0L; ++it) { for (; *it!=0L; ++it) {
currentFileView()->updateView(*it); updateViewItem(*it);
if (*it==item) {
emit shownFileItemRefreshed(item);
}
} }
} }
void FileViewController::updateViewItem(const KFileItem *item) {
currentFileView()->updateView(item);
if (item==currentFileView()->shownFileItem()) {
emit shownFileItemRefreshed(item);
}
}
void FileViewController::refreshItems(const KURL::List& urls) { void FileViewController::refreshItems(const KURL::List& urls) {
LOG(""); LOG("");
@ -1145,6 +1160,7 @@ void FileViewController::dirListerCanceled() {
if (mMode!=FILE_LIST) { if (mMode!=FILE_LIST) {
mFileThumbnailView->stopThumbnailUpdate(); mFileThumbnailView->stopThumbnailUpdate();
} }
stopMetaInfoUpdate();
browseToFileNameToSelect(); browseToFileNameToSelect();
} }
@ -1316,5 +1332,45 @@ KFileItem* FileViewController::findItemByFileName(const TQString& fileName) cons
return 0L; return 0L;
} }
//-----------------------------------------------------------------------------
//
// MetaInfo loading
//
//-----------------------------------------------------------------------------
void FileViewController::loadMetaInfo(const KFileItemList& items) {
if(d->mMetaInfoTodo.isEmpty()) {
d->mMetaInfoTodo = items;
} else {
for(const auto& item: items) {
d->mMetaInfoTodo.append(item);
}
}
if(!d->mMetaInfoJob) {
nextMetaInfoJob();
}
}
void FileViewController::nextMetaInfoJob() {
if( !d->mMetaInfoTodo.isEmpty() ) {
d->mMetaInfoJob = new TDEIO::MetaInfoJob(d->mMetaInfoTodo);
connect( d->mMetaInfoJob, TQ_SIGNAL(result(TDEIO::Job *)),
this, TQ_SLOT(nextMetaInfoJob()) );
connect( d->mMetaInfoJob, TQ_SIGNAL( gotMetaInfo(const KFileItem *)),
this, TQ_SLOT(updateViewItem(const KFileItem *)) );
d->mMetaInfoTodo.clear();
} else {
d->mMetaInfoJob = NULL;
}
}
void FileViewController::stopMetaInfoUpdate() {
d->mMetaInfoTodo.clear();
if(d->mMetaInfoJob) {
d->mMetaInfoJob->kill();
d->mMetaInfoJob = 0;
}
}
} // namespace } // namespace

@ -174,6 +174,7 @@ private slots:
void toggleShowDotFiles(); void toggleShowDotFiles();
void setSorting(); void setSorting();
void updateSortMenu(TQDir::SortSpec); void updateSortMenu(TQDir::SortSpec);
void updateViewItem(const KFileItem *item);
// Dir lister slots // Dir lister slots
void dirListerDeleteItem(KFileItem* item); void dirListerDeleteItem(KFileItem* item);
@ -184,6 +185,11 @@ private slots:
void dirListerCanceled(); void dirListerCanceled();
void dirListerCompleted(); void dirListerCompleted();
// Metadata info loader jobs
void loadMetaInfo(const KFileItemList& items);
void nextMetaInfoJob();
void stopMetaInfoUpdate();
void openDropURLMenu(TQDropEvent*, KFileItem*); void openDropURLMenu(TQDropEvent*, KFileItem*);
void prefetchDone(); void prefetchDone();

@ -30,7 +30,7 @@ namespace Gwenview {
namespace TimeUtils { namespace TimeUtils {
time_t getTime(const KFileItem* item) { time_t getTime(const KFileItem* item) {
const KFileMetaInfo& info = item->metaInfo(); const KFileMetaInfo& info = item->metaInfo(/*autogen=*/false);
if (info.isValid()) { if (info.isValid()) {
TQVariant value = info.value("Date/time"); TQVariant value = info.value("Date/time");
TQDateTime dt = value.toDateTime(); TQDateTime dt = value.toDateTime();

@ -29,7 +29,7 @@ namespace Gwenview {
namespace TimeUtils { namespace TimeUtils {
/** /**
* Returns the time of an item, using EXIF info if available * Returns the time of an item, using EXIF info if available and already loaded
*/ */
time_t getTime(const KFileItem*); time_t getTime(const KFileItem*);

Loading…
Cancel
Save