diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp
index f2f44eab4f..6ca9fce6c1 100644
--- a/src/kitemviews/kfileitemmodel.cpp
+++ b/src/kitemviews/kfileitemmodel.cpp
@@ -636,7 +636,11 @@ void KFileItemModel::expandParentDirectories(const QUrl &url)
// does not care whether the parent-URL has already been
// expanded.
QUrl urlToExpand = m_dirLister->url();
- const QStringList subDirs = url.path().mid(pos).split(QDir::separator());
+
+ // first subdir can be empty, if m_dirLister->url().path() does not end with '/'
+ // this happens if baseUrl is not root but a home directory, see FoldersPanel,
+ // so using QString::SkipEmptyParts
+ const QStringList subDirs = url.path().mid(pos).split(QDir::separator(), QString::SkipEmptyParts);
for (int i = 0; i < subDirs.count() - 1; ++i) {
urlToExpand.setPath(urlToExpand.path() + '/' + subDirs.at(i));
m_urlsToExpand.insert(urlToExpand);
diff --git a/src/panels/folders/dolphin_folderspanelsettings.kcfg b/src/panels/folders/dolphin_folderspanelsettings.kcfg
index 8b8ca66f82..d7d479fa16 100644
--- a/src/panels/folders/dolphin_folderspanelsettings.kcfg
+++ b/src/panels/folders/dolphin_folderspanelsettings.kcfg
@@ -10,6 +10,10 @@
false
+
+
+ true
+
true
diff --git a/src/panels/folders/folderspanel.cpp b/src/panels/folders/folderspanel.cpp
index 8b759d813d..cb35fd2185 100644
--- a/src/panels/folders/folderspanel.cpp
+++ b/src/panels/folders/folderspanel.cpp
@@ -50,6 +50,7 @@
#include
#include "dolphindebug.h"
+#include "global.h"
FoldersPanel::FoldersPanel(QWidget* parent) :
Panel(parent),
@@ -82,6 +83,17 @@ bool FoldersPanel::showHiddenFiles() const
return FoldersPanelSettings::hiddenFilesShown();
}
+void FoldersPanel::setLimitFoldersPanelToHome(bool enable)
+{
+ FoldersPanelSettings::setLimitFoldersPanelToHome(enable);
+ reloadTree();
+}
+
+bool FoldersPanel::limitFoldersPanelToHome() const
+{
+ return FoldersPanelSettings::limitFoldersPanelToHome();
+}
+
void FoldersPanel::setAutoScrolling(bool enable)
{
// TODO: Not supported yet in Dolphin 2.0
@@ -122,6 +134,14 @@ bool FoldersPanel::urlChanged()
return true;
}
+void FoldersPanel::reloadTree()
+{
+ if (m_controller) {
+ loadTree(url());
+ }
+}
+
+
void FoldersPanel::showEvent(QShowEvent* event)
{
if (event->spontaneous()) {
@@ -304,8 +324,13 @@ void FoldersPanel::loadTree(const QUrl& url)
QUrl baseUrl;
if (url.isLocalFile()) {
- // Use the root directory as base for local URLs (#150941)
- baseUrl = QUrl::fromLocalFile(QDir::rootPath());
+ const bool isInHomeFolder = Dolphin::homeUrl().isParentOf(url) || (Dolphin::homeUrl() == url);
+ if (FoldersPanelSettings::limitFoldersPanelToHome() && isInHomeFolder) {
+ baseUrl = Dolphin::homeUrl();
+ } else {
+ // Use the root directory as base for local URLs (#150941)
+ baseUrl = QUrl::fromLocalFile(QDir::rootPath());
+ }
} else {
// Clear the path for non-local URLs and use it as base
baseUrl = url;
@@ -320,9 +345,13 @@ void FoldersPanel::loadTree(const QUrl& url)
const int index = m_model->index(url);
if (index >= 0) {
updateCurrentItem(index);
+ } else if (url == baseUrl) {
+ // clear the selection when visiting the base url
+ updateCurrentItem(-1);
} else {
m_updateCurrentItem = true;
m_model->expandParentDirectories(url);
+
// slotLoadingCompleted() will be invoked after the model has
// expanded the url
}
diff --git a/src/panels/folders/folderspanel.h b/src/panels/folders/folderspanel.h
index 7c591cc20c..5f0b9a3788 100644
--- a/src/panels/folders/folderspanel.h
+++ b/src/panels/folders/folderspanel.h
@@ -43,7 +43,9 @@ public:
virtual ~FoldersPanel();
void setShowHiddenFiles(bool show);
+ void setLimitFoldersPanelToHome(bool enable);
bool showHiddenFiles() const;
+ bool limitFoldersPanelToHome() const;
void setAutoScrolling(bool enable);
bool autoScrolling() const;
@@ -81,6 +83,7 @@ private slots:
*/
void startFadeInAnimation();
+
private:
/**
* Initializes the base URL of the tree and expands all
@@ -89,6 +92,8 @@ private:
*/
void loadTree(const QUrl& url);
+ void reloadTree();
+
/**
* Sets the item with the index \a index as current item, selects
* the item and assures that the item will be visible.
diff --git a/src/panels/folders/treeviewcontextmenu.cpp b/src/panels/folders/treeviewcontextmenu.cpp
index 51fc229c19..6381a88ff1 100644
--- a/src/panels/folders/treeviewcontextmenu.cpp
+++ b/src/panels/folders/treeviewcontextmenu.cpp
@@ -43,6 +43,7 @@
#include
#include
#include
+#include "global.h"
TreeViewContextMenu::TreeViewContextMenu(FoldersPanel* parent,
const KFileItem& fileInfo) :
@@ -124,6 +125,17 @@ void TreeViewContextMenu::open()
popup->addAction(showHiddenFilesAction);
connect(showHiddenFilesAction, &QAction::toggled, this, &TreeViewContextMenu::setShowHiddenFiles);
+ // insert 'Limit to Home Directory'
+ const QUrl url = m_fileItem.url();
+ const bool showLimitToHomeDirectory = url.isLocalFile() && (Dolphin::homeUrl().isParentOf(url) || (Dolphin::homeUrl() == url));
+ if (showLimitToHomeDirectory) {
+ QAction* limitFoldersPanelToHomeAction = new QAction(i18nc("@action:inmenu", "Limit to Home Directory"), this);
+ limitFoldersPanelToHomeAction->setCheckable(true);
+ limitFoldersPanelToHomeAction->setChecked(m_parent->limitFoldersPanelToHome());
+ popup->addAction(limitFoldersPanelToHomeAction);
+ connect(limitFoldersPanelToHomeAction, &QAction::toggled, this, &TreeViewContextMenu::setLimitFoldersPanelToHome);
+ }
+
// insert 'Automatic Scrolling'
QAction* autoScrollingAction = new QAction(i18nc("@action:inmenu", "Automatic Scrolling"), this);
autoScrollingAction->setCheckable(true);
@@ -229,6 +241,11 @@ void TreeViewContextMenu::setShowHiddenFiles(bool show)
m_parent->setShowHiddenFiles(show);
}
+void TreeViewContextMenu::setLimitFoldersPanelToHome(bool enable)
+{
+ m_parent->setLimitFoldersPanelToHome(enable);
+}
+
void TreeViewContextMenu::setAutoScrolling(bool enable)
{
m_parent->setAutoScrolling(enable);
diff --git a/src/panels/folders/treeviewcontextmenu.h b/src/panels/folders/treeviewcontextmenu.h
index 598ffaed6a..93ddd7aef9 100644
--- a/src/panels/folders/treeviewcontextmenu.h
+++ b/src/panels/folders/treeviewcontextmenu.h
@@ -78,6 +78,12 @@ private slots:
*/
void setShowHiddenFiles(bool show);
+ /**
+ * Sets the 'Limit folders panel to home' setting for the
+ * folders panel to \a enable.
+ */
+ void setLimitFoldersPanelToHome(bool enable);
+
/**
* Sets the 'Automatic Scrolling' setting for the
* folders panel to \a enable.