/***************************************************************************
- * Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at> *
+ * Copyright (C) 2006-2010 by Peter Penz <peter.penz19@gmail.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
#include "folderspanel.h"
-#include "dolphinmodel.h"
-#include "dolphinsortfilterproxymodel.h"
-#include "dolphinview.h"
#include "settings/dolphinsettings.h"
#include "dolphin_folderspanelsettings.h"
#include "dolphin_generalsettings.h"
-#include "draganddrophelper.h"
-#include "folderexpander.h"
-#include "renamedialog.h"
#include "paneltreeview.h"
#include "treeviewcontextmenu.h"
-#include <kfileplacesmodel.h>
-#include <kdirlister.h>
-#include <kfileitem.h>
+#include <KFilePlacesModel>
+#include <KDirLister>
+#include <KFileItem>
#include <konq_operations.h>
#include <QApplication>
-#include <QItemSelection>
-#include <QTreeView>
#include <QBoxLayout>
+#include <QItemSelection>
#include <QModelIndex>
+#include <QPointer>
+#include <QTreeView>
#include <QScrollBar>
#include <QTimer>
+#include <views/draganddrophelper.h>
+#include <views/dolphinmodel.h>
+#include <views/dolphinsortfilterproxymodel.h>
+#include <views/dolphinview.h>
+#include <views/folderexpander.h>
+#include <views/renamedialog.h>
+
FoldersPanel::FoldersPanel(QWidget* parent) :
Panel(parent),
m_setLeafVisible(false),
m_dirLister = 0; // deleted by m_dolphinModel
}
-QSize FoldersPanel::sizeHint() const
-{
- return QSize(200, 400);
-}
-
void FoldersPanel::setShowHiddenFiles(bool show)
{
FoldersPanelSettings::setShowHiddenFiles(show);
- if (m_dirLister != 0) {
+ if (m_dirLister) {
m_dirLister->setShowingDotFiles(show);
m_dirLister->openUrl(m_dirLister->url(), KDirLister::Reload);
}
return FoldersPanelSettings::showHiddenFiles();
}
+void FoldersPanel::setAutoScrolling(bool enable)
+{
+ m_treeView->setAutoHorizontalScroll(enable);
+ FoldersPanelSettings::setAutoScrolling(enable);
+}
+
+bool FoldersPanel::autoScrolling() const
+{
+ return FoldersPanelSettings::autoScrolling();
+}
+
void FoldersPanel::rename(const KFileItem& item)
{
if (DolphinSettings::instance().generalSettings()->renameInline()) {
const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex);
m_treeView->edit(proxyIndex);
} else {
- KFileItemList items;
- items.append(item);
- QPointer<RenameDialog> dialog = new RenameDialog(this, items);
- if (dialog->exec() == QDialog::Accepted) {
- const QString newName = dialog->newName();
- if (!newName.isEmpty()) {
- KUrl newUrl = item.url();
- newUrl.setFileName(newName);
- KonqOperations::rename(this, item.url(), newUrl);
- }
- }
- delete dialog;
+ RenameDialog* dialog = new RenameDialog(this, KFileItemList() << item);
+ dialog->setAttribute(Qt::WA_DeleteOnClose);
+ dialog->show();
+ dialog->raise();
+ dialog->activateWindow();
}
}
-void FoldersPanel::setUrl(const KUrl& url)
+bool FoldersPanel::urlChanged()
{
- if (!url.isValid() || (url == Panel::url())) {
- return;
+ if (!url().isValid() || url().protocol().contains("search")) {
+ // Skip results shown by a search, as possible identical
+ // directory names are useless without parent-path information.
+ return false;
}
- Panel::setUrl(url);
- if (m_dirLister != 0) {
+ if (m_dirLister) {
m_setLeafVisible = true;
- loadTree(url);
+ loadTree(url());
}
+
+ return true;
}
void FoldersPanel::showEvent(QShowEvent* event)
return;
}
- if (m_dirLister == 0) {
+ if (!m_dirLister) {
// 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->setDelayedMimeTypes(true);
m_dirLister->setAutoErrorHandlingEnabled(false, this);
m_dirLister->setShowingDotFiles(FoldersPanelSettings::showHiddenFiles());
+ connect(m_dirLister, SIGNAL(completed()), this, SLOT(slotDirListerCompleted()));
- Q_ASSERT(m_dolphinModel == 0);
+ Q_ASSERT(!m_dolphinModel);
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);
+ Q_ASSERT(!m_proxyModel);
m_proxyModel = new DolphinSortFilterProxyModel(this);
m_proxyModel->setSourceModel(m_dolphinModel);
- Q_ASSERT(m_treeView == 0);
+ Q_ASSERT(!m_treeView);
m_treeView = new PanelTreeView(this);
m_treeView->setModel(m_proxyModel);
m_proxyModel->setSorting(DolphinView::SortByName);
m_proxyModel->setSortOrder(Qt::AscendingOrder);
+ m_treeView->setAutoHorizontalScroll(FoldersPanelSettings::autoScrolling());
new FolderExpander(m_treeView, m_proxyModel);
connect(m_treeView, SIGNAL(pressed(const QModelIndex&)),
this, SLOT(updateMouseButtons()));
+ connect(m_treeView->horizontalScrollBar(), SIGNAL(sliderMoved(int)),
+ this, SLOT(slotHorizontalScrollBarMoved(int)));
+ connect(m_treeView->verticalScrollBar(), SIGNAL(valueChanged(int)),
+ this, SLOT(slotVerticalScrollBarMoved(int)));
+
QVBoxLayout* layout = new QVBoxLayout(this);
layout->setMargin(0);
layout->addWidget(m_treeView);
if (index.isValid()) {
const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index);
item = m_dolphinModel->itemForIndex(dolphinModelIndex);
- emit changeSelection(KFileItemList());
}
- TreeViewContextMenu contextMenu(this, item);
- contextMenu.open();
+ QPointer<TreeViewContextMenu> contextMenu = new TreeViewContextMenu(this, item);
+ contextMenu->open();
+ delete contextMenu;
}
void FoldersPanel::keyPressEvent(QKeyEvent* event)
{
m_treeView->setExpanded(index, true);
selectLeafDirectory();
- m_treeView->resizeColumnToContents(DolphinModel::Name);
}
void FoldersPanel::scrollToLeaf()
m_mouseButtons = QApplication::mouseButtons();
}
+void FoldersPanel::slotDirListerCompleted()
+{
+ m_treeView->resizeColumnToContents(DolphinModel::Name);
+}
+
+void FoldersPanel::slotHorizontalScrollBarMoved(int value)
+{
+ Q_UNUSED(value);
+ // Disable the auto-scrolling until the vertical scrollbar has
+ // been moved by the user.
+ m_treeView->setAutoHorizontalScroll(false);
+}
+
+void FoldersPanel::slotVerticalScrollBarMoved(int value)
+{
+ Q_UNUSED(value);
+ // Enable the auto-scrolling again (it might have been disabled by
+ // moving the horizontal scrollbar).
+ m_treeView->setAutoHorizontalScroll(FoldersPanelSettings::autoScrolling());
+}
+
void FoldersPanel::loadTree(const KUrl& url)
{
- Q_ASSERT(m_dirLister != 0);
+ Q_ASSERT(m_dirLister);
m_leafDir = url;
KUrl baseUrl;
{
const QModelIndex dirIndex = m_dolphinModel->indexForUrl(m_leafDir);
const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex);
- if (!proxyIndex.isValid()) {
- return;
- }
- if (m_setLeafVisible) {
- // Invoke m_treeView->scrollTo(proxyIndex) asynchronously by
- // scrollToLeaf(). This assures that the scrolling is done after
- // the horizontal scrollbar gets visible (otherwise the scrollbar
- // might hide the leaf).
- QTimer::singleShot(100, this, SLOT(scrollToLeaf()));
- m_setLeafVisible = false;
+ if (proxyIndex.isValid()) {
+ QItemSelectionModel* selModel = m_treeView->selectionModel();
+ selModel->setCurrentIndex(proxyIndex, QItemSelectionModel::ClearAndSelect);
+
+ if (m_setLeafVisible) {
+ // Invoke scrollToLeaf() asynchronously. This assures that
+ // the horizontal scrollbar is shown after resizing the column
+ // (otherwise the scrollbar might hide the leaf).
+ QTimer::singleShot(0, this, SLOT(scrollToLeaf()));
+ m_setLeafVisible = false;
+ }
}
-
- QItemSelectionModel* selModel = m_treeView->selectionModel();
- selModel->setCurrentIndex(proxyIndex, QItemSelectionModel::ClearAndSelect);
}
#include "folderspanel.moc"