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
{
KUrl mUrl;
QList<KDirLister*> mDirListers;
KDirLister* mDirLister;
int rowForUrl(const KUrl &url) const
{
@ -77,36 +76,32 @@ struct RecursiveDirModelPrivate
return mList;
}
void listDir(RecursiveDirModel* parent, const KUrl &url);
private:
KFileItemList mList;
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)
: QAbstractListModel(parent)
, 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()
@ -116,30 +111,20 @@ RecursiveDirModel::~RecursiveDirModel()
KUrl RecursiveDirModel::url() const
{
return d->mUrl;
return d->mDirLister->url();
}
void RecursiveDirModel::setUrl(const KUrl& url)
{
foreach (KDirLister* lister, d->mDirListers) {
lister->stop();
}
qDeleteAll(d->mDirListers);
d->mDirListers.clear();
beginResetModel();
d->clear();
endResetModel();
d->mUrl = url;
d->listDir(this, url);
d->mDirLister->openUrl(url, true);
}
int RecursiveDirModel::rowCount(const QModelIndex& parent) const
{
if (parent.isValid()) {
return 0;
} else {
return d->list().count();
}
return d->list().count();
}
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)
{
QList<KUrl> dirUrls;
KFileItemList fileList;
Q_FOREACH(const KFileItem& item, newList) {
if (item.isFile()) {
if (d->rowForUrl(item.url()) == -1) {
fileList << item;
}
} else if (item.isReadable()) {
dirUrls << item.url();
}
}
@ -187,10 +169,6 @@ void RecursiveDirModel::slotItemsAdded(const KFileItemList& newList)
}
endInsertRows();
}
Q_FOREACH(const KUrl& url, dirUrls) {
d->listDir(this, url);
}
}
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) {
if (!lister->isFinished()) {
return;
}
}
emit completed();
beginResetModel();
d->clear();
endResetModel();
}
} // namespace

View file

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