X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/b8a4e0fac2820ec8fc442c2abeea700ae4947e01..213705a22c07778934e3ac4da35ce2e60be9727e:/src/dolphincolumnview.cpp diff --git a/src/dolphincolumnview.cpp b/src/dolphincolumnview.cpp index 957b2064f..2d3bcb826 100644 --- a/src/dolphincolumnview.cpp +++ b/src/dolphincolumnview.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2007 by Peter Penz * + * Copyright (C) 2007-2009 by Peter Penz * * * * 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 * @@ -19,593 +19,458 @@ #include "dolphincolumnview.h" -#include "dolphincolumnwidget.h" +#include "dolphinmodel.h" +#include "dolphincolumnviewcontainer.h" #include "dolphincontroller.h" -#include "dolphinsettings.h" - +#include "dolphindirlister.h" +#include "dolphinsortfilterproxymodel.h" +#include "settings/dolphinsettings.h" +#include "dolphinviewautoscroller.h" #include "dolphin_columnmodesettings.h" - +#include "dolphin_generalsettings.h" +#include "draganddrophelper.h" +#include "folderexpander.h" +#include "tooltips/tooltipmanager.h" +#include "versioncontrolobserver.h" +#include "viewextensionsfactory.h" +#include "zoomlevelinfo.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include #include #include -#include -DolphinColumnView::DolphinColumnView(QWidget* parent, DolphinController* controller) : - QAbstractItemView(parent), - m_controller(controller), +DolphinColumnView::DolphinColumnView(QWidget* parent, + DolphinColumnViewContainer* container, + const KUrl& url) : + QListView(parent), m_active(false), - m_index(-1), - m_contentX(0), - m_columns(), - m_emptyViewport(0), - m_animation(0), - m_nameFilter() -{ - Q_ASSERT(controller != 0); - - setAcceptDrops(true); + m_container(container), + m_extensionsFactory(0), + m_url(url), + m_childUrl(), + m_font(), + m_decorationSize(), + m_dirLister(0), + m_dolphinModel(0), + m_proxyModel(0), + m_dropRect() +{ + setMouseTracking(true); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + setSelectionBehavior(SelectItems); + setSelectionMode(QAbstractItemView::ExtendedSelection); setDragDropMode(QAbstractItemView::DragDrop); setDropIndicatorShown(false); - setSelectionMode(ExtendedSelection); - setFocusPolicy(Qt::NoFocus); - setFrameShape(QFrame::NoFrame); + setSelectionRectVisible(true); + setEditTriggers(QAbstractItemView::NoEditTriggers); + + setVerticalScrollMode(QListView::ScrollPerPixel); + setHorizontalScrollMode(QListView::ScrollPerPixel); + + // apply the column mode settings to the widget + const ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); + Q_ASSERT(settings != 0); + + if (settings->useSystemFont()) { + m_font = KGlobalSettings::generalFont(); + } else { + m_font = QFont(settings->fontFamily(), + settings->fontSize(), + settings->fontWeight(), + settings->italicFont()); + } + + activate(); connect(this, SIGNAL(viewportEntered()), - controller, SLOT(emitViewportEntered())); - connect(controller, SIGNAL(zoomIn()), - this, SLOT(zoomIn())); - connect(controller, SIGNAL(zoomOut()), - this, SLOT(zoomOut())); - connect(controller, SIGNAL(activationChanged(bool)), - this, SLOT(updateColumnsBackground(bool))); - - const DolphinView* view = controller->dolphinView(); - connect(view, SIGNAL(sortingChanged(DolphinView::Sorting)), - this, SLOT(slotSortingChanged(DolphinView::Sorting))); - connect(view, SIGNAL(sortOrderChanged(Qt::SortOrder)), - this, SLOT(slotSortOrderChanged(Qt::SortOrder))); - connect(view, SIGNAL(showHiddenFilesChanged()), - this, SLOT(slotShowHiddenFilesChanged())); - connect(view, SIGNAL(showPreviewChanged()), + m_container->m_controller, SLOT(emitViewportEntered())); + connect(this, SIGNAL(entered(const QModelIndex&)), + this, SLOT(slotEntered(const QModelIndex&))); + + const DolphinView* dolphinView = m_container->m_controller->dolphinView(); + connect(dolphinView, SIGNAL(showPreviewChanged()), this, SLOT(slotShowPreviewChanged())); - connect(horizontalScrollBar(), SIGNAL(valueChanged(int)), - this, SLOT(moveContentHorizontally(int))); + m_dirLister = new DolphinDirLister(); + m_dirLister->setAutoUpdate(true); + m_dirLister->setMainWindow(window()); + m_dirLister->setDelayedMimeTypes(true); + const bool showHiddenFiles = m_container->m_controller->dolphinView()->showHiddenFiles(); + m_dirLister->setShowingDotFiles(showHiddenFiles); - m_animation = new QTimeLine(500, this); - connect(m_animation, SIGNAL(frameChanged(int)), horizontalScrollBar(), SLOT(setValue(int))); + m_dolphinModel = new DolphinModel(this); + m_dolphinModel->setDirLister(m_dirLister); + m_dolphinModel->setDropsAllowed(DolphinModel::DropOnDirectory); - DolphinColumnWidget* column = new DolphinColumnWidget(viewport(), this, m_controller->url()); - m_columns.append(column); - setActiveColumnIndex(0); + m_proxyModel = new DolphinSortFilterProxyModel(this); + m_proxyModel->setSourceModel(m_dolphinModel); + m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); - m_emptyViewport = new QFrame(viewport()); - m_emptyViewport->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); + m_proxyModel->setSorting(dolphinView->sorting()); + m_proxyModel->setSortOrder(dolphinView->sortOrder()); + m_proxyModel->setSortFoldersFirst(dolphinView->sortFoldersFirst()); - updateDecorationSize(); - updateColumnsBackground(true); -} + setModel(m_proxyModel); -DolphinColumnView::~DolphinColumnView() -{ -} + connect(KGlobalSettings::self(), SIGNAL(kdisplayFontChanged()), + this, SLOT(updateFont())); -QModelIndex DolphinColumnView::indexAt(const QPoint& point) const -{ - foreach (DolphinColumnWidget* column, m_columns) { - const QModelIndex index = column->indexAt(columnPosition(column, point)); - if (index.isValid()) { - return index; - } - } + /*FolderExpander* folderExpander = new FolderExpander(this, m_proxyModel); + folderExpander->setEnabled(DolphinSettings::instance().generalSettings()->autoExpandFolders()); + connect (folderExpander, SIGNAL(enterDir(const QModelIndex&)), + m_container->m_controller, SLOT(triggerItem(const QModelIndex&))); - return QModelIndex(); -} + new VersionControlObserver(this);*/ -KFileItem DolphinColumnView::itemAt(const QPoint& point) const -{ - foreach (DolphinColumnWidget* column, m_columns) { - KFileItem item = column->itemAt(columnPosition(column, point)); - if (!item.isNull()) { - return item; - } + DolphinController* controller = m_container->m_controller; + connect(controller, SIGNAL(zoomLevelChanged(int)), + this, SLOT(setZoomLevel(int))); + + const QString nameFilter = controller->nameFilter(); + if (!nameFilter.isEmpty()) { + m_proxyModel->setFilterRegExp(nameFilter); } - return KFileItem(); + updateDecorationSize(dolphinView->showPreview()); + m_extensionsFactory = new ViewExtensionsFactory(this, controller); } -void DolphinColumnView::scrollTo(const QModelIndex& index, ScrollHint hint) +DolphinColumnView::~DolphinColumnView() { - activeColumn()->scrollTo(index, hint); + delete m_proxyModel; + m_proxyModel = 0; + delete m_dolphinModel; + m_dolphinModel = 0; + m_dirLister = 0; // deleted by m_dolphinModel } -QRect DolphinColumnView::visualRect(const QModelIndex& index) const +void DolphinColumnView::setActive(bool active) { - return activeColumn()->visualRect(index); + if (active && (m_container->focusProxy() != this)) { + m_container->setFocusProxy(this); + } + + if (m_active != active) { + m_active = active; + + if (active) { + activate(); + } else { + deactivate(); + } + } } -void DolphinColumnView::invertSelection() +void DolphinColumnView::updateBackground() { - QItemSelectionModel* selectionModel = activeColumn()->selectionModel(); - const QAbstractItemModel* itemModel = selectionModel->model(); + // TODO: The alpha-value 150 is copied from DolphinView::setActive(). When + // cleaning up the cut-indication of DolphinColumnView with the code from + // DolphinView a common helper-class should be available which can be shared + // by all view implementations -> no hardcoded value anymore + const QPalette::ColorRole role = viewport()->backgroundRole(); + QColor color = viewport()->palette().color(role); + color.setAlpha((m_active && m_container->m_active) ? 255 : 150); - const QModelIndex topLeft = itemModel->index(0, 0); - const QModelIndex bottomRight = itemModel->index(itemModel->rowCount() - 1, - itemModel->columnCount() - 1); + QPalette palette = viewport()->palette(); + palette.setColor(role, color); + viewport()->setPalette(palette); - const QItemSelection selection(topLeft, bottomRight); - selectionModel->select(selection, QItemSelectionModel::Toggle); + update(); } -void DolphinColumnView::reload() +KFileItem DolphinColumnView::itemAt(const QPoint& pos) const { - foreach (DolphinColumnWidget* column, m_columns) { - column->reload(); + KFileItem item; + const QModelIndex index = indexAt(pos); + if (index.isValid() && (index.column() == DolphinModel::Name)) { + const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index); + item = m_dolphinModel->itemForIndex(dolphinModelIndex); } + return item; } -void DolphinColumnView::setRootUrl(const KUrl& url) +QStyleOptionViewItem DolphinColumnView::viewOptions() const { - removeAllColumns(); - m_columns[0]->setUrl(url); + QStyleOptionViewItem viewOptions = QListView::viewOptions(); + viewOptions.font = m_font; + viewOptions.decorationSize = m_decorationSize; + viewOptions.showDecorationSelected = true; + return viewOptions; } -void DolphinColumnView::setNameFilter(const QString& nameFilter) +void DolphinColumnView::startDrag(Qt::DropActions supportedActions) { - if (nameFilter != m_nameFilter) { - m_nameFilter = nameFilter; - foreach (DolphinColumnWidget* column, m_columns) { - column->setNameFilter(nameFilter); - } - } + DragAndDropHelper::instance().startDrag(this, supportedActions, m_container->m_controller); } -QString DolphinColumnView::nameFilter() const +void DolphinColumnView::dragEnterEvent(QDragEnterEvent* event) { - return m_nameFilter; + if (DragAndDropHelper::instance().isMimeDataSupported(event->mimeData())) { + event->acceptProposedAction(); + requestActivation(); + } } -KUrl DolphinColumnView::rootUrl() const +void DolphinColumnView::dragLeaveEvent(QDragLeaveEvent* event) { - return m_columns[0]->url(); + QListView::dragLeaveEvent(event); + setDirtyRegion(m_dropRect); } -void DolphinColumnView::showColumn(const KUrl& url) +void DolphinColumnView::dragMoveEvent(QDragMoveEvent* event) { - if (!rootUrl().isParentOf(url)) { - setRootUrl(url); - return; - } + QListView::dragMoveEvent(event); - int columnIndex = 0; - foreach (DolphinColumnWidget* column, m_columns) { - if (column->url() == url) { - // the column represents already the requested URL, hence activate it - requestActivation(column); - layoutColumns(); - return; - } else if (!column->url().isParentOf(url)) { - // the column is no parent of the requested URL, hence - // just delete all remaining columns - if (columnIndex > 0) { - QList::iterator start = m_columns.begin() + columnIndex; - QList::iterator end = m_columns.end(); - for (QList::iterator it = start; it != end; ++it) { - (*it)->deleteLater(); - } - m_columns.erase(start, end); - - const int maxIndex = m_columns.count() - 1; - Q_ASSERT(maxIndex >= 0); - if (m_index > maxIndex) { - m_index = maxIndex; - } - break; - } - } - ++columnIndex; - } + // TODO: remove this code when the issue #160611 is solved in Qt 4.4 + const QModelIndex index = indexAt(event->pos()); + setDirtyRegion(m_dropRect); - // Create missing columns. Assuming that the path is "/home/peter/Temp/" and - // the target path is "/home/peter/Temp/a/b/c/", then the columns "a", "b" and - // "c" will be created. - const int lastIndex = m_columns.count() - 1; - Q_ASSERT(lastIndex >= 0); - - const KUrl& activeUrl = m_columns[lastIndex]->url(); - Q_ASSERT(activeUrl.isParentOf(url)); - Q_ASSERT(activeUrl != url); - - QString path = activeUrl.url(KUrl::AddTrailingSlash); - const QString targetPath = url.url(KUrl::AddTrailingSlash); - - columnIndex = lastIndex; - int slashIndex = path.count('/'); - bool hasSubPath = (slashIndex >= 0); - while (hasSubPath) { - const QString subPath = targetPath.section('/', slashIndex, slashIndex); - if (subPath.isEmpty()) { - hasSubPath = false; - } else { - path += subPath + '/'; - ++slashIndex; - - const KUrl childUrl = KUrl(path); - m_columns[columnIndex]->setChildUrl(childUrl); - columnIndex++; - - DolphinColumnWidget* column = new DolphinColumnWidget(viewport(), this, childUrl); - const QString filter = nameFilter(); - if (!filter.isEmpty()) { - column->setNameFilter(filter); - } - column->setActive(false); - - m_columns.append(column); - - // Before invoking layoutColumns() the column must be set visible temporary. - // To prevent a flickering the initial geometry is set to a hidden position. - column->setGeometry(QRect(-1, -1, 1, 1)); - column->show(); - layoutColumns(); - updateScrollBar(); + m_dropRect.setSize(QSize()); // set as invalid + if (index.isValid()) { + m_container->m_controller->setItemView(this); + const KFileItem item = m_container->m_controller->itemForIndex(index); + if (!item.isNull() && item.isDir()) { + m_dropRect = visualRect(index); } } + setDirtyRegion(m_dropRect); - // set the last column as active column without modifying the controller - // and hence the history - activeColumn()->setActive(false); - m_index = columnIndex; - activeColumn()->setActive(true); - assureVisibleActiveColumn(); + if (DragAndDropHelper::instance().isMimeDataSupported(event->mimeData())) { + // accept url drops, independently from the destination item + event->acceptProposedAction(); + } } -void DolphinColumnView::editItem(const KFileItem& item) +void DolphinColumnView::dropEvent(QDropEvent* event) { - activeColumn()->editItem(item); + const QModelIndex index = indexAt(event->pos()); + m_container->m_controller->setItemView(this); + const KFileItem item = m_container->m_controller->itemForIndex(index); + m_container->m_controller->indicateDroppedUrls(item, url(), event); + QListView::dropEvent(event); } -KFileItemList DolphinColumnView::selectedItems() const +void DolphinColumnView::paintEvent(QPaintEvent* event) { - return activeColumn()->selectedItems(); -} + if (!m_childUrl.isEmpty()) { + // indicate the shown URL of the next column by highlighting the shown folder item + const QModelIndex dirIndex = m_dolphinModel->indexForUrl(m_childUrl); + const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex); + if (proxyIndex.isValid() && !selectionModel()->isSelected(proxyIndex)) { + const QRect itemRect = visualRect(proxyIndex); + QPainter painter(viewport()); + QColor color = KColorScheme(QPalette::Active, KColorScheme::View).foreground().color(); + color.setAlpha(32); + painter.setPen(Qt::NoPen); + painter.setBrush(color); + painter.drawRect(itemRect); + } + } -void DolphinColumnView::selectAll() -{ - activeColumn()->selectAll(); + QListView::paintEvent(event); } -bool DolphinColumnView::isIndexHidden(const QModelIndex& index) const +void DolphinColumnView::mousePressEvent(QMouseEvent* event) { - Q_UNUSED(index); - return false;//activeColumn()->isIndexHidden(index); + requestActivation(); + if (!indexAt(event->pos()).isValid()) { + if (QApplication::mouseButtons() & Qt::MidButton) { + m_container->m_controller->replaceUrlByClipboard(); + } + } else if (event->button() == Qt::LeftButton) { + // TODO: see comment in DolphinIconsView::mousePressEvent() + setState(QAbstractItemView::DraggingState); + } + QListView::mousePressEvent(event); } -QModelIndex DolphinColumnView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) +void DolphinColumnView::keyPressEvent(QKeyEvent* event) { - // Parts of this code have been taken from QColumnView::moveCursor(). - // Copyright (C) 1992-2007 Trolltech ASA. - - Q_UNUSED(modifiers); - if (model() == 0) { - return QModelIndex(); - } + QListView::keyPressEvent(event); + requestActivation(); - const QModelIndex current = currentIndex(); - if (isRightToLeft()) { - if (cursorAction == MoveLeft) { - cursorAction = MoveRight; - } else if (cursorAction == MoveRight) { - cursorAction = MoveLeft; - } - } - - switch (cursorAction) { - case MoveLeft: - if (m_index > 0) { - setActiveColumnIndex(m_index - 1); - m_controller->triggerUrlChangeRequest(activeColumn()->url()); + DolphinController* controller = m_container->m_controller; + controller->handleKeyPressEvent(event); + switch (event->key()) { + case Qt::Key_Right: { + // Special key handling for the column: A Key_Right should + // open a new column for the currently selected folder. + const QModelIndex index = currentIndex(); + const KFileItem item = controller->itemForIndex(index); + if (!item.isNull() && item.isDir()) { + controller->emitItemTriggered(item); } break; + } - case MoveRight: - if (m_index < m_columns.count() - 1) { - setActiveColumnIndex(m_index + 1); - m_controller->triggerUrlChangeRequest(m_columns[m_index]->url()); - } + case Qt::Key_Escape: + selectionModel()->setCurrentIndex(selectionModel()->currentIndex(), + QItemSelectionModel::Current | + QItemSelectionModel::Clear); break; default: break; } - - return QModelIndex(); -} - -void DolphinColumnView::setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags flags) -{ - Q_UNUSED(rect); - Q_UNUSED(flags); -} - -QRegion DolphinColumnView::visualRegionForSelection(const QItemSelection& selection) const -{ - Q_UNUSED(selection); - return QRegion(); -} - -int DolphinColumnView::horizontalOffset() const -{ - return -m_contentX; } -int DolphinColumnView::verticalOffset() const +void DolphinColumnView::contextMenuEvent(QContextMenuEvent* event) { - return 0; -} - -void DolphinColumnView::mousePressEvent(QMouseEvent* event) -{ - m_controller->requestActivation(); - QAbstractItemView::mousePressEvent(event); -} + if (!m_active) { + m_container->requestActivation(this); + Q_ASSERT(m_container->m_controller->itemView() == this); + m_container->m_controller->triggerUrlChangeRequest(m_url); + } + Q_ASSERT(m_active); -void DolphinColumnView::resizeEvent(QResizeEvent* event) -{ - QAbstractItemView::resizeEvent(event); - layoutColumns(); - updateScrollBar(); - assureVisibleActiveColumn(); + QListView::contextMenuEvent(event); + m_container->m_controller->triggerContextMenuRequest(event->pos()); } void DolphinColumnView::wheelEvent(QWheelEvent* event) { // let Ctrl+wheel events propagate to the DolphinView for icon zooming - if ((event->modifiers() & Qt::ControlModifier) == Qt::ControlModifier) { + if (event->modifiers() & Qt::ControlModifier) { event->ignore(); - return; + return; } - QAbstractItemView::wheelEvent(event); + + const int height = m_decorationSize.height(); + const int step = (height >= KIconLoader::SizeHuge) ? height / 10 : (KIconLoader::SizeHuge - height) / 2; + verticalScrollBar()->setSingleStep(step); + + QListView::wheelEvent(event); } -void DolphinColumnView::zoomIn() +void DolphinColumnView::leaveEvent(QEvent* event) { - if (isZoomInPossible()) { - ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); - switch (settings->iconSize()) { - case KIconLoader::SizeSmall: settings->setIconSize(KIconLoader::SizeMedium); break; - case KIconLoader::SizeMedium: settings->setIconSize(KIconLoader::SizeLarge); break; - default: Q_ASSERT(false); break; - } - updateDecorationSize(); - } + QListView::leaveEvent(event); + // if the mouse is above an item and moved very fast outside the widget, + // no viewportEntered() signal might be emitted although the mouse has been moved + // above the viewport + m_container->m_controller->emitViewportEntered(); } -void DolphinColumnView::zoomOut() +void DolphinColumnView::selectionChanged(const QItemSelection& selected, const QItemSelection& deselected) { - if (isZoomOutPossible()) { - ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); - switch (settings->iconSize()) { - case KIconLoader::SizeLarge: settings->setIconSize(KIconLoader::SizeMedium); break; - case KIconLoader::SizeMedium: settings->setIconSize(KIconLoader::SizeSmall); break; - default: Q_ASSERT(false); break; - } - updateDecorationSize(); - } + QListView::selectionChanged(selected, deselected); + + //QItemSelectionModel* selModel = m_container->selectionModel(); + //selModel->select(selected, QItemSelectionModel::Select); + //selModel->select(deselected, QItemSelectionModel::Deselect); } -void DolphinColumnView::moveContentHorizontally(int x) +void DolphinColumnView::currentChanged(const QModelIndex& current, const QModelIndex& previous) { - m_contentX = isRightToLeft() ? +x : -x; - layoutColumns(); + QListView::currentChanged(current, previous); + m_extensionsFactory->handleCurrentIndexChange(current, previous); } -void DolphinColumnView::updateDecorationSize() +void DolphinColumnView::setZoomLevel(int level) { + const int size = ZoomLevelInfo::iconSizeForZoomLevel(level); ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); - const int iconSize = settings->iconSize(); - const QSize size(iconSize, iconSize); - setIconSize(size); - foreach (QObject* object, viewport()->children()) { - if (object->inherits("QListView")) { - DolphinColumnWidget* widget = static_cast(object); - widget->setDecorationSize(size); - } + const bool showPreview = m_container->m_controller->dolphinView()->showPreview(); + if (showPreview) { + settings->setPreviewSize(size); + } else { + settings->setIconSize(size); } - m_controller->setZoomInPossible(isZoomInPossible()); - m_controller->setZoomOutPossible(isZoomOutPossible()); - - doItemsLayout(); + updateDecorationSize(showPreview); } -void DolphinColumnView::updateColumnsBackground(bool active) +void DolphinColumnView::slotEntered(const QModelIndex& index) { - if (active == m_active) { - return; - } - - m_active = active; - - // dim the background of the viewport - const QPalette::ColorRole role = viewport()->backgroundRole(); - QColor background = viewport()->palette().color(role); - background.setAlpha(0); // make background transparent - - QPalette palette = viewport()->palette(); - palette.setColor(role, background); - viewport()->setPalette(palette); - - foreach (DolphinColumnWidget* column, m_columns) { - column->updateBackground(); - } + m_container->m_controller->setItemView(this); + m_container->m_controller->emitItemEntered(index); } -void DolphinColumnView::slotSortingChanged(DolphinView::Sorting sorting) +void DolphinColumnView::requestActivation() { - foreach (DolphinColumnWidget* column, m_columns) { - column->setSorting(sorting); + m_container->m_controller->setItemView(this); + m_container->m_controller->requestActivation(); + if (!m_active) { + m_container->requestActivation(this); + m_container->m_controller->triggerUrlChangeRequest(m_url); + selectionModel()->clear(); } } -void DolphinColumnView::slotSortOrderChanged(Qt::SortOrder order) +void DolphinColumnView::updateFont() { - foreach (DolphinColumnWidget* column, m_columns) { - column->setSortOrder(order); - } -} + const ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); + Q_ASSERT(settings != 0); -void DolphinColumnView::slotShowHiddenFilesChanged() -{ - const bool show = m_controller->dolphinView()->showHiddenFiles(); - foreach (DolphinColumnWidget* column, m_columns) { - column->setShowHiddenFiles(show); + if (settings->useSystemFont()) { + m_font = KGlobalSettings::generalFont(); } } void DolphinColumnView::slotShowPreviewChanged() { - const bool show = m_controller->dolphinView()->showPreview(); - foreach (DolphinColumnWidget* column, m_columns) { - column->setShowPreview(show); - } + const DolphinView* view = m_container->m_controller->dolphinView(); + updateDecorationSize(view->showPreview()); } -bool DolphinColumnView::isZoomInPossible() const +void DolphinColumnView::activate() { - ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); - return settings->iconSize() < KIconLoader::SizeLarge; -} + setFocus(Qt::OtherFocusReason); -bool DolphinColumnView::isZoomOutPossible() const -{ - ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); - return settings->iconSize() > KIconLoader::SizeSmall; -} - -void DolphinColumnView::setActiveColumnIndex(int index) -{ - if (m_index == index) { - return; + if (KGlobalSettings::singleClick()) { + connect(this, SIGNAL(clicked(const QModelIndex&)), + m_container->m_controller, SLOT(triggerItem(const QModelIndex&))); + } else { + connect(this, SIGNAL(doubleClicked(const QModelIndex&)), + m_container->m_controller, SLOT(triggerItem(const QModelIndex&))); } - const bool hasActiveColumn = (m_index >= 0); - if (hasActiveColumn) { - m_columns[m_index]->setActive(false); + if (selectionModel() && selectionModel()->currentIndex().isValid()) { + selectionModel()->setCurrentIndex(selectionModel()->currentIndex(), QItemSelectionModel::SelectCurrent); } - m_index = index; - m_columns[m_index]->setActive(true); - - assureVisibleActiveColumn(); + updateBackground(); } -void DolphinColumnView::layoutColumns() +void DolphinColumnView::deactivate() { - const int gap = 4; - - ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); - const int columnWidth = settings->columnWidth(); - - QRect emptyViewportRect; - if (isRightToLeft()) { - int x = viewport()->width() - columnWidth + m_contentX; - foreach (DolphinColumnWidget* column, m_columns) { - column->setGeometry(QRect(x, 0, columnWidth - gap, viewport()->height())); - x -= columnWidth; - } - emptyViewportRect = QRect(0, 0, x + columnWidth - gap, viewport()->height()); - } else { - int x = m_contentX; - foreach (DolphinColumnWidget* column, m_columns) { - column->setGeometry(QRect(x, 0, columnWidth - gap, viewport()->height())); - x += columnWidth; - } - emptyViewportRect = QRect(x, 0, viewport()->width() - x - gap, viewport()->height()); - } - - if (emptyViewportRect.isValid()) { - m_emptyViewport->show(); - m_emptyViewport->setGeometry(emptyViewportRect); + clearFocus(); + if (KGlobalSettings::singleClick()) { + disconnect(this, SIGNAL(clicked(const QModelIndex&)), + m_container->m_controller, SLOT(triggerItem(const QModelIndex&))); } else { - m_emptyViewport->hide(); + disconnect(this, SIGNAL(doubleClicked(const QModelIndex&)), + m_container->m_controller, SLOT(triggerItem(const QModelIndex&))); } -} -void DolphinColumnView::updateScrollBar() -{ - ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); - const int contentWidth = m_columns.count() * settings->columnWidth(); - - horizontalScrollBar()->setPageStep(contentWidth); - horizontalScrollBar()->setRange(0, contentWidth - viewport()->width()); + const QModelIndex current = selectionModel()->currentIndex(); + selectionModel()->clear(); + selectionModel()->setCurrentIndex(current, QItemSelectionModel::NoUpdate); + updateBackground(); } -void DolphinColumnView::assureVisibleActiveColumn() +void DolphinColumnView::updateDecorationSize(bool showPreview) { - const int viewportWidth = viewport()->width(); - const int x = activeColumn()->x(); - ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); - const int width = settings->columnWidth(); - - if (x + width > viewportWidth) { - const int newContentX = m_contentX - x - width + viewportWidth; - if (isRightToLeft()) { - m_animation->setFrameRange(m_contentX, newContentX); - } else { - m_animation->setFrameRange(-m_contentX, -newContentX); - } - if (m_animation->state() != QTimeLine::Running) { - m_animation->start(); - } - } else if (x < 0) { - const int newContentX = m_contentX - x; - if (isRightToLeft()) { - m_animation->setFrameRange(m_contentX, newContentX); - } else { - m_animation->setFrameRange(-m_contentX, -newContentX); - } - if (m_animation->state() != QTimeLine::Running) { - m_animation->start(); - } - } -} - -void DolphinColumnView::requestActivation(DolphinColumnWidget* column) -{ - m_controller->setItemView(column); - if (column->isActive()) { - assureVisibleActiveColumn(); - } else { - int index = 0; - foreach (DolphinColumnWidget* currColumn, m_columns) { - if (currColumn == column) { - setActiveColumnIndex(index); - return; - } - ++index; - } - } -} + const int iconSize = showPreview ? settings->previewSize() : settings->iconSize(); + const QSize size(iconSize, iconSize); + setIconSize(size); -void DolphinColumnView::removeAllColumns() -{ - QList::iterator start = m_columns.begin() + 1; - QList::iterator end = m_columns.end(); - for (QList::iterator it = start; it != end; ++it) { - (*it)->deleteLater(); - } - m_columns.erase(start, end); - m_index = 0; - m_columns[0]->setActive(true); - assureVisibleActiveColumn(); -} + m_decorationSize = size; -QPoint DolphinColumnView::columnPosition(DolphinColumnWidget* column, const QPoint& point) const -{ - const QPoint topLeft = column->frameGeometry().topLeft(); - return QPoint(point.x() - topLeft.x(), point.y() - topLeft.y()); + doItemsLayout(); } #include "dolphincolumnview.moc"