#include "dolphinsortfilterproxymodel.h"
#include "dolphinviewautoscroller.h"
#include "draganddrophelper.h"
-#include "selectionmanager.h"
+#include "viewextensionsfactory.h"
#include "viewproperties.h"
#include "zoomlevelinfo.h"
#include <klocale.h>
#include <kmenu.h>
-#include <QAbstractProxyModel>
#include <QAction>
#include <QApplication>
#include <QHeaderView>
#include <QPainter>
#include <QScrollBar>
-DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* controller) :
+DolphinDetailsView::DolphinDetailsView(QWidget* parent,
+ DolphinController* controller,
+ DolphinSortFilterProxyModel* proxyModel) :
QTreeView(parent),
m_autoResize(true),
m_expandingTogglePressed(false),
m_useDefaultIndexAt(true),
m_ignoreScrollTo(false),
m_controller(controller),
- m_selectionManager(0),
- m_autoScroller(0),
+ m_extensionsFactory(0),
m_expandableFoldersAction(0),
+ m_expandedUrls(),
m_font(),
m_decorationSize(),
m_band()
setRootIsDecorated(settings->expandableFolders());
setItemsExpandable(settings->expandableFolders());
setEditTriggers(QAbstractItemView::NoEditTriggers);
+ setModel(proxyModel);
setMouseTracking(true);
- m_autoScroller = new DolphinViewAutoScroller(this);
const ViewProperties props(controller->url());
setSortIndicatorSection(props.sorting());
controller, SLOT(triggerItem(const QModelIndex&)));
}
- if (DolphinSettings::instance().generalSettings()->showSelectionToggle()) {
- m_selectionManager = new SelectionManager(this);
- connect(m_selectionManager, SIGNAL(selectionChanged()),
- this, SLOT(requestActivation()));
- connect(m_controller, SIGNAL(urlChanged(const KUrl&)),
- m_selectionManager, SLOT(reset()));
- }
-
connect(this, SIGNAL(entered(const QModelIndex&)),
this, SLOT(slotEntered(const QModelIndex&)));
connect(this, SIGNAL(viewportEntered()),
connect(view, SIGNAL(showPreviewChanged()),
this, SLOT(slotShowPreviewChanged()));
- updateDecorationSize(view->showPreview());
setFocus();
viewport()->installEventFilter(this);
m_expandableFoldersAction->setCheckable(true);
connect(m_expandableFoldersAction, SIGNAL(toggled(bool)),
this, SLOT(setFoldersExpandable(bool)));
+
+ connect(this, SIGNAL(expanded(const QModelIndex&)), this, SLOT(slotExpanded(const QModelIndex&)));
+ connect(this, SIGNAL(collapsed(const QModelIndex&)), this, SLOT(slotCollapsed(const QModelIndex&)));
+
+ updateDecorationSize(view->showPreview());
+
+ m_extensionsFactory = new ViewExtensionsFactory(this, controller);
+ m_extensionsFactory->fileItemDelegate()->setMinimizedNameColumn(true);
+ m_extensionsFactory->setAutoFolderExpandingEnabled(settings->expandableFolders());
}
DolphinDetailsView::~DolphinDetailsView()
{
}
+QSet<KUrl> DolphinDetailsView::expandedUrls() const
+{
+ return m_expandedUrls;
+}
+
bool DolphinDetailsView::event(QEvent* event)
{
if (event->type() == QEvent::Polish) {
void DolphinDetailsView::wheelEvent(QWheelEvent* event)
{
- if (m_selectionManager != 0) {
- m_selectionManager->reset();
- }
-
- // let Ctrl+wheel events propagate to the DolphinView for icon zooming
- if (event->modifiers() & Qt::ControlModifier) {
- event->ignore();
- return;
- }
-
const int height = m_decorationSize.height();
const int step = (height >= KIconLoader::SizeHuge) ? height / 10 : (KIconLoader::SizeHuge - height) / 2;
verticalScrollBar()->setSingleStep(step);
void DolphinDetailsView::currentChanged(const QModelIndex& current, const QModelIndex& previous)
{
QTreeView::currentChanged(current, previous);
- m_autoScroller->handleCurrentIndexChange(current, previous);
+ m_extensionsFactory->handleCurrentIndexChange(current, previous);
// Stay consistent with QListView: When changing the current index by key presses,
// also change the selection.
if (m_keyPressed) {
- selectionModel()->select(current, QItemSelectionModel::ClearAndSelect);
+ setCurrentIndex(current);
}
}
updateDecorationSize(showPreview);
}
-
void DolphinDetailsView::slotShowPreviewChanged()
{
const DolphinView* view = m_controller->dolphinView();
setItemsExpandable(expandable);
}
+void DolphinDetailsView::slotExpanded(const QModelIndex& index)
+{
+ KFileItem item = m_controller->itemForIndex(index);
+ if (!item.isNull()) {
+ m_expandedUrls.insert(item.url());
+ }
+}
+
+void DolphinDetailsView::slotCollapsed(const QModelIndex& index)
+{
+ KFileItem item = m_controller->itemForIndex(index);
+ if (!item.isNull()) {
+ m_expandedUrls.remove(item.url());
+ }
+}
+
+void DolphinDetailsView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
+{
+ removeExpandedIndexes(parent, start, end);
+ QTreeView::rowsAboutToBeRemoved(parent, start, end);
+}
+
+void DolphinDetailsView::removeExpandedIndexes(const QModelIndex& parent, int start, int end)
+{
+ if (m_expandedUrls.isEmpty()) {
+ return;
+ }
+
+ for (int row = start; row <= end; row++) {
+ const QModelIndex index = model()->index(row, 0, parent);
+ if (isExpanded(index)) {
+ slotCollapsed(index);
+ removeExpandedIndexes(index, 0, model()->rowCount(index) - 1);
+ }
+ }
+}
+
void DolphinDetailsView::updateDecorationSize(bool showPreview)
{
DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings();
setIconSize(QSize(iconSize, iconSize));
m_decorationSize = QSize(iconSize, iconSize);
- if (m_selectionManager != 0) {
- m_selectionManager->reset();
- }
-
doItemsLayout();
}