gwenview: use the new recursive listing feature of KDirLister

requires the following commit from kdelibs:
5d60973ab442fb6c3ccad7027d96da18f4fdeaea

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2023-07-04 22:27:23 +03:00
parent 6983e81516
commit c55b482da9
2 changed files with 26 additions and 51 deletions

View file

@ -36,8 +36,7 @@ namespace Gwenview
struct RecursiveDirModelPrivate struct RecursiveDirModelPrivate
{ {
KUrl mUrl; KDirLister* mDirLister;
QList<KDirLister*> mDirListers;
int rowForUrl(const KUrl &url) const int rowForUrl(const KUrl &url) const
{ {
@ -77,36 +76,32 @@ struct RecursiveDirModelPrivate
return mList; return mList;
} }
void listDir(RecursiveDirModel* parent, const KUrl &url);
private: private:
KFileItemList mList; KFileItemList mList;
QHash<KUrl, int> mRowForUrl; QHash<KUrl, int> mRowForUrl;
}; };
void RecursiveDirModelPrivate::listDir(RecursiveDirModel* parent, const KUrl &url)
{
KDirLister* dirLister = new KDirLister(parent);
parent->connect(
dirLister, SIGNAL(itemsAdded(KFileItemList)),
parent, SLOT(slotItemsAdded(KFileItemList))
);
parent->connect(
dirLister, SIGNAL(itemsDeleted(KFileItemList)),
parent, SLOT(slotItemsDeleted(KFileItemList))
);
parent->connect(
dirLister, SIGNAL(completed()),
parent, SLOT(slotCompleted())
);
mDirListers.append(dirLister);
dirLister->openUrl(url);
}
RecursiveDirModel::RecursiveDirModel(QObject* parent) RecursiveDirModel::RecursiveDirModel(QObject* parent)
: QAbstractListModel(parent) : QAbstractListModel(parent)
, d(new RecursiveDirModelPrivate) , d(new RecursiveDirModelPrivate)
{ {
d->mDirLister = new KDirLister(this);
connect(
d->mDirLister, SIGNAL(itemsAdded(KFileItemList)),
this, SLOT(slotItemsAdded(KFileItemList))
);
connect(
d->mDirLister, SIGNAL(itemsDeleted(KFileItemList)),
this, SLOT(slotItemsDeleted(KFileItemList))
);
connect(
d->mDirLister, SIGNAL(clear()),
this, SLOT(slotClear())
);
connect(
d->mDirLister, SIGNAL(completed()),
this, SIGNAL(completed())
);
} }
RecursiveDirModel::~RecursiveDirModel() RecursiveDirModel::~RecursiveDirModel()
@ -116,30 +111,20 @@ RecursiveDirModel::~RecursiveDirModel()
KUrl RecursiveDirModel::url() const KUrl RecursiveDirModel::url() const
{ {
return d->mUrl; return d->mDirLister->url();
} }
void RecursiveDirModel::setUrl(const KUrl& url) void RecursiveDirModel::setUrl(const KUrl& url)
{ {
foreach (KDirLister* lister, d->mDirListers) { d->mDirLister->openUrl(url, true);
lister->stop();
}
qDeleteAll(d->mDirListers);
d->mDirListers.clear();
beginResetModel();
d->clear();
endResetModel();
d->mUrl = url;
d->listDir(this, url);
} }
int RecursiveDirModel::rowCount(const QModelIndex& parent) const int RecursiveDirModel::rowCount(const QModelIndex& parent) const
{ {
if (parent.isValid()) { if (parent.isValid()) {
return 0; return 0;
} else {
return d->list().count();
} }
return d->list().count();
} }
QVariant RecursiveDirModel::data(const QModelIndex& index, int role) const QVariant RecursiveDirModel::data(const QModelIndex& index, int role) const
@ -168,15 +153,12 @@ QVariant RecursiveDirModel::data(const QModelIndex& index, int role) const
void RecursiveDirModel::slotItemsAdded(const KFileItemList& newList) void RecursiveDirModel::slotItemsAdded(const KFileItemList& newList)
{ {
QList<KUrl> dirUrls;
KFileItemList fileList; KFileItemList fileList;
Q_FOREACH(const KFileItem& item, newList) { Q_FOREACH(const KFileItem& item, newList) {
if (item.isFile()) { if (item.isFile()) {
if (d->rowForUrl(item.url()) == -1) { if (d->rowForUrl(item.url()) == -1) {
fileList << item; fileList << item;
} }
} else if (item.isReadable()) {
dirUrls << item.url();
} }
} }
@ -187,10 +169,6 @@ void RecursiveDirModel::slotItemsAdded(const KFileItemList& newList)
} }
endInsertRows(); endInsertRows();
} }
Q_FOREACH(const KUrl& url, dirUrls) {
d->listDir(this, url);
}
} }
void RecursiveDirModel::slotItemsDeleted(const KFileItemList& list) void RecursiveDirModel::slotItemsDeleted(const KFileItemList& list)
@ -211,14 +189,11 @@ void RecursiveDirModel::slotItemsDeleted(const KFileItemList& list)
} }
} }
void RecursiveDirModel::slotCompleted() void RecursiveDirModel::slotClear()
{ {
foreach (const KDirLister* lister, d->mDirListers) { beginResetModel();
if (!lister->isFinished()) { d->clear();
return; endResetModel();
}
}
emit completed();
} }
} // namespace } // namespace

View file

@ -58,7 +58,7 @@ Q_SIGNALS:
private Q_SLOTS: private Q_SLOTS:
void slotItemsAdded(const KFileItemList&); void slotItemsAdded(const KFileItemList&);
void slotItemsDeleted(const KFileItemList&); void slotItemsDeleted(const KFileItemList&);
void slotCompleted(); void slotClear();
private: private:
RecursiveDirModelPrivate* const d; RecursiveDirModelPrivate* const d;
}; };