- if (m_dirLister == 0) {
- // Postpone the creating of the dir lister to the first show event.
- // This assures that no performance and memory overhead is given when the TreeView is not
- // used at all (see FoldersPanel::setUrl()).
- m_dirLister = new KDirLister();
- m_dirLister->setDirOnlyMode(true);
- m_dirLister->setAutoUpdate(true);
- m_dirLister->setMainWindow(window());
- m_dirLister->setDelayedMimeTypes(true);
- m_dirLister->setAutoErrorHandlingEnabled(false, this);
- m_dirLister->setShowingDotFiles(FoldersPanelSettings::showHiddenFiles());
-
- Q_ASSERT(m_dolphinModel == 0);
- m_dolphinModel = new DolphinModel(this);
- m_dolphinModel->setDirLister(m_dirLister);
- m_dolphinModel->setDropsAllowed(DolphinModel::DropOnDirectory);
- connect(m_dolphinModel, SIGNAL(expand(const QModelIndex&)),
- this, SLOT(expandToDir(const QModelIndex&)));
-
- Q_ASSERT(m_proxyModel == 0);
- m_proxyModel = new DolphinSortFilterProxyModel(this);
- m_proxyModel->setSourceModel(m_dolphinModel);
-
- Q_ASSERT(m_treeView == 0);
- m_treeView = new PanelTreeView(this);
- m_treeView->setModel(m_proxyModel);
- m_proxyModel->setSorting(DolphinView::SortByName);
- m_proxyModel->setSortOrder(Qt::AscendingOrder);
-
- new FolderExpander(m_treeView, m_proxyModel);
-
- connect(m_treeView, SIGNAL(clicked(const QModelIndex&)),
- this, SLOT(updateActiveView(const QModelIndex&)));
- connect(m_treeView, SIGNAL(urlsDropped(const QModelIndex&, QDropEvent*)),
- this, SLOT(dropUrls(const QModelIndex&, QDropEvent*)));
- connect(m_treeView, SIGNAL(pressed(const QModelIndex&)),
- this, SLOT(updateMouseButtons()));
-
- QVBoxLayout* layout = new QVBoxLayout(this);
- layout->setMargin(0);
- layout->addWidget(m_treeView);
+ if (!m_controller) {
+ // Postpone the creating of the controller to the first show event.
+ // This assures that no performance and memory overhead is given when the folders panel is not
+ // used at all and stays invisible.
+ KFileItemListView *view = new KFileItemListView();
+ view->setWidgetCreator(new KItemListWidgetCreator<FoldersItemListWidget>());
+ view->setSupportsItemExpanding(true);
+ // Set the opacity to 0 initially. The opacity will be increased after the loading of the initial tree
+ // has been finished in slotLoadingCompleted(). This prevents an unnecessary animation-mess when
+ // opening the folders panel.
+ view->setOpacity(0);
+
+ connect(view, &KFileItemListView::roleEditingFinished, this, &FoldersPanel::slotRoleEditingFinished);
+
+ m_model = new KFileItemModel(this);
+ m_model->setShowDirectoriesOnly(true);
+ m_model->setShowHiddenFiles(FoldersPanelSettings::hiddenFilesShown());
+ // Use a QueuedConnection to give the view the possibility to react first on the
+ // finished loading.
+ connect(m_model, &KFileItemModel::directoryLoadingCompleted, this, &FoldersPanel::slotLoadingCompleted, Qt::QueuedConnection);
+
+ m_controller = new KItemListController(m_model, view, this);
+ m_controller->setSelectionBehavior(KItemListController::SingleSelection);
+ m_controller->setAutoActivationBehavior(KItemListController::ExpansionOnly);
+ m_controller->setMouseDoubleClickAction(KItemListController::ActivateAndExpandItem);
+ m_controller->setAutoActivationDelay(750);
+ m_controller->setSingleClickActivationEnforced(true);
+
+ connect(m_controller, &KItemListController::itemActivated, this, &FoldersPanel::slotItemActivated);
+ connect(m_controller, &KItemListController::itemMiddleClicked, this, &FoldersPanel::slotItemMiddleClicked);
+ connect(m_controller, &KItemListController::itemContextMenuRequested, this, &FoldersPanel::slotItemContextMenuRequested);
+ connect(m_controller, &KItemListController::viewContextMenuRequested, this, &FoldersPanel::slotViewContextMenuRequested);
+ connect(m_controller, &KItemListController::itemDropEvent, this, &FoldersPanel::slotItemDropEvent);
+
+ KItemListContainer *container = new KItemListContainer(m_controller, this);
+#ifndef QT_NO_ACCESSIBILITY
+ view->setAccessibleParentsObject(container);
+#endif
+ container->setEnabledFrame(false);
+
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->addWidget(container);