diff --git a/containments/desktop/package/contents/ui/FolderViewLayer.qml b/containments/desktop/package/contents/ui/FolderViewLayer.qml --- a/containments/desktop/package/contents/ui/FolderViewLayer.qml +++ b/containments/desktop/package/contents/ui/FolderViewLayer.qml @@ -308,7 +308,7 @@ Folder.LabelGenerator { id: labelGenerator - url: folderView.model.resolvedUrl + folderModel: folderView.model rtl: (Qt.application.layoutDirection == Qt.RightToLeft) labelMode: plasmoid.configuration.labelMode labelText: plasmoid.configuration.labelText diff --git a/containments/desktop/plugins/folder/foldermodel.h b/containments/desktop/plugins/folder/foldermodel.h --- a/containments/desktop/plugins/folder/foldermodel.h +++ b/containments/desktop/plugins/folder/foldermodel.h @@ -167,6 +167,8 @@ QStringList filterMimeTypes() const; void setFilterMimeTypes(const QStringList &mimeList); + KFileItem rootItem() const; + Q_INVOKABLE void up(); Q_INVOKABLE void cd(int row); diff --git a/containments/desktop/plugins/folder/foldermodel.cpp b/containments/desktop/plugins/folder/foldermodel.cpp --- a/containments/desktop/plugins/folder/foldermodel.cpp +++ b/containments/desktop/plugins/folder/foldermodel.cpp @@ -497,6 +497,11 @@ } } +KFileItem FolderModel::rootItem() const +{ + return m_dirModel->dirLister()->rootItem(); +} + void FolderModel::up() { const QUrl &up = KIO::upUrl(resolvedUrl()); @@ -890,7 +895,7 @@ // So we get to run mostLocalUrl() over the current URL. if (item.isNull()) { - item = m_dirModel->dirLister()->rootItem(); + item = rootItem(); } if (item.isNull()) { @@ -1367,7 +1372,7 @@ bool enable = false; const QString pasteText = KIO::pasteActionText(QApplication::clipboard()->mimeData(), - &enable, m_dirModel->dirLister()->rootItem()); + &enable, rootItem()); if (enable) { paste->setText(pasteText); @@ -1411,7 +1416,7 @@ menu->addAction(m_actionCollection.action(QStringLiteral("emptyTrash"))); menu->addSeparator(); - KFileItemListProperties itemProperties(KFileItemList() << m_dirModel->dirLister()->rootItem()); + KFileItemListProperties itemProperties(KFileItemList() << rootItem()); m_fileItemActions->setItemListProperties(itemProperties); menu->addAction(m_fileItemActions->preferredOpenWithAction(QString())); diff --git a/containments/desktop/plugins/folder/labelgenerator.h b/containments/desktop/plugins/folder/labelgenerator.h --- a/containments/desktop/plugins/folder/labelgenerator.h +++ b/containments/desktop/plugins/folder/labelgenerator.h @@ -21,14 +21,16 @@ #define LABELGENERATOR_H #include +#include class KFilePlacesModel; +class FolderModel; class LabelGenerator : public QObject { Q_OBJECT - Q_PROPERTY(QString url READ url WRITE setUrl NOTIFY urlChanged) + Q_PROPERTY(FolderModel *folderModel READ folderModel WRITE setFolderModel NOTIFY folderModelChanged) Q_PROPERTY(bool rtl READ rtl WRITE setRtl NOTIFY rtlChanged) Q_PROPERTY(int labelMode READ labelMode WRITE setLabelMode NOTIFY labelModeChanged) Q_PROPERTY(QString labelText READ labelText WRITE setLabelText NOTIFY labelTextChanged) @@ -38,8 +40,8 @@ LabelGenerator(QObject *parent = 0); ~LabelGenerator(); - QString url() const; - void setUrl(const QString &url); + FolderModel *folderModel() const; + void setFolderModel(FolderModel *folderModel); bool rtl() const; void setRtl(bool rtl); @@ -53,15 +55,15 @@ QString displayLabel(); Q_SIGNALS: - void urlChanged(); + void folderModelChanged(); void rtlChanged(); void labelModeChanged(); void labelTextChanged(); void displayLabelChanged(); private: KFilePlacesModel* m_placesModel; - QString m_url; + QPointer m_folderModel; bool m_rtl; int m_labelMode; QString m_labelText; diff --git a/containments/desktop/plugins/folder/labelgenerator.cpp b/containments/desktop/plugins/folder/labelgenerator.cpp --- a/containments/desktop/plugins/folder/labelgenerator.cpp +++ b/containments/desktop/plugins/folder/labelgenerator.cpp @@ -24,6 +24,8 @@ #include #include +#include "foldermodel.h" + LabelGenerator::LabelGenerator(QObject* parent) : QObject(parent), m_placesModel(new KFilePlacesModel(this)), m_rtl(false) @@ -34,16 +36,24 @@ { } -QString LabelGenerator::url() const +FolderModel *LabelGenerator::folderModel() const { - return m_url; + return m_folderModel.data(); } -void LabelGenerator::setUrl(const QString &url) +void LabelGenerator::setFolderModel(FolderModel *folderModel) { - if (url != m_url) { - m_url = url; - emit urlChanged(); + if (m_folderModel.data() != folderModel) { + if (m_folderModel.data()) { + disconnect(m_folderModel.data(), 0, this, 0); + } + + m_folderModel = folderModel; + + connect(m_folderModel.data(), &FolderModel::listingCompleted, this, &LabelGenerator::displayLabelChanged); + connect(m_folderModel.data(), &FolderModel::listingCanceled, this, &LabelGenerator::displayLabelChanged); + + emit folderModelChanged(); emit displayLabelChanged(); } } @@ -92,44 +102,48 @@ QString LabelGenerator::displayLabel() { + if (!m_folderModel) { + return QString(); + } + + QUrl url = m_folderModel->resolvedUrl(); + if (m_labelMode == 1 /* Default */) { - if (m_url == QLatin1String("desktop:/")) { - return i18n("Desktop Folder"); - } else { - QUrl url(m_url); + if (url.path().length() <= 1) { + const KFileItem &rootItem = m_folderModel->rootItem(); - if (m_url.startsWith('~')) { - url = QUrl::fromLocalFile(KShell::tildeExpand(m_url)); + if (rootItem.text() != QLatin1String(".")) { + return rootItem.text(); } + } - QString label(url.toDisplayString(QUrl::PreferLocalFile | QUrl::StripTrailingSlash)); - - const QModelIndex index = m_placesModel->closestItem(url); + QString label(url.toDisplayString(QUrl::PreferLocalFile | QUrl::StripTrailingSlash)); - if (index.isValid()) { - QString root = m_placesModel->url(index).toDisplayString(QUrl::PreferLocalFile | QUrl::StripTrailingSlash); + const QModelIndex index = m_placesModel->closestItem(url); - label = label.right(label.length() - root.length()); + if (index.isValid()) { + QString root = m_placesModel->url(index).toDisplayString(QUrl::PreferLocalFile | QUrl::StripTrailingSlash); - if (!label.isEmpty()) { - if (label.at(0) == '/') { - label.remove(0, 1); - } + label = label.right(label.length() - root.length()); - if (m_rtl) { - label.prepend(" < "); - } else { - label.prepend(" > "); - } + if (!label.isEmpty()) { + if (label.at(0) == '/') { + label.remove(0, 1); } - label.prepend(m_placesModel->text(index)); + if (m_rtl) { + label.prepend(" < "); + } else { + label.prepend(" > "); + } } - return label; + label.prepend(m_placesModel->text(index)); } + + return label; } else if (m_labelMode == 2 /* Full path */) { - return QUrl(m_url).toDisplayString(QUrl::PreferLocalFile | QUrl::StripTrailingSlash); + return QUrl(url).toDisplayString(QUrl::PreferLocalFile | QUrl::StripTrailingSlash); } else if (m_labelMode == 3 /* Custom title */) { return m_labelText; }