X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/77a576335ca8ef6a8921b766c43b07b6eb65e80f..b1c9b5126d:/src/dolphincolumnview.cpp diff --git a/src/dolphincolumnview.cpp b/src/dolphincolumnview.cpp index 5af15c56b..3b3e86a75 100644 --- a/src/dolphincolumnview.cpp +++ b/src/dolphincolumnview.cpp @@ -19,35 +19,29 @@ #include "dolphincolumnview.h" -#include "dolphinmodel.h" #include "dolphincolumnwidget.h" #include "dolphincontroller.h" -#include "dolphindirlister.h" -#include "dolphinmodel.h" -#include "dolphinsortfilterproxymodel.h" -#include "dolphinsettings.h" +#include "settings/dolphinsettings.h" +#include "zoomlevelinfo.h" #include "dolphin_columnmodesettings.h" -#include -#include -#include +#include -#include -#include #include #include -#include #include DolphinColumnView::DolphinColumnView(QWidget* parent, DolphinController* controller) : QAbstractItemView(parent), m_controller(controller), - m_restoreActiveColumnFocus(false), + m_active(false), m_index(-1), m_contentX(0), m_columns(), - m_animation(0) + m_emptyViewport(0), + m_animation(0), + m_nameFilter() { Q_ASSERT(controller != 0); @@ -55,19 +49,26 @@ DolphinColumnView::DolphinColumnView(QWidget* parent, DolphinController* control setDragDropMode(QAbstractItemView::DragDrop); setDropIndicatorShown(false); setSelectionMode(ExtendedSelection); + setFocusPolicy(Qt::NoFocus); + setFrameShape(QFrame::NoFrame); + setLayoutDirection(Qt::LeftToRight); - connect(this, SIGNAL(entered(const QModelIndex&)), - controller, SLOT(emitItemEntered(const QModelIndex&))); connect(this, SIGNAL(viewportEntered()), controller, SLOT(emitViewportEntered())); - connect(controller, SIGNAL(zoomIn()), - this, SLOT(zoomIn())); - connect(controller, SIGNAL(zoomOut()), - this, SLOT(zoomOut())); - connect(controller, SIGNAL(showHiddenFilesChanged(bool)), - this, SLOT(slotShowHiddenFilesChanged(bool))); - connect(controller, SIGNAL(showPreviewChanged(bool)), - this, SLOT(slotShowPreviewChanged(bool))); + connect(controller, SIGNAL(zoomLevelChanged(int)), + this, SLOT(setZoomLevel(int))); + 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()), + this, SLOT(slotShowPreviewChanged())); connect(horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(moveContentHorizontally(int))); @@ -79,16 +80,11 @@ DolphinColumnView::DolphinColumnView(QWidget* parent, DolphinController* control m_columns.append(column); setActiveColumnIndex(0); - updateDecorationSize(); + m_emptyViewport = new QFrame(viewport()); + m_emptyViewport->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); - // dim the background of the viewport - QColor bgColor = KColorScheme(QPalette::Active, KColorScheme::View).background().color(); - const QColor fgColor = KColorScheme(QPalette::Active, KColorScheme::View).foreground().color(); - bgColor = KColorUtils::mix(bgColor, fgColor, 0.04); - - QPalette palette = viewport()->palette(); - palette.setColor(viewport()->backgroundRole(), bgColor); - viewport()->setPalette(palette); + updateDecorationSize(view->showPreview()); + updateColumnsBackground(true); } DolphinColumnView::~DolphinColumnView() @@ -98,9 +94,7 @@ DolphinColumnView::~DolphinColumnView() QModelIndex DolphinColumnView::indexAt(const QPoint& point) const { foreach (DolphinColumnWidget* column, m_columns) { - const QPoint topLeft = column->frameGeometry().topLeft(); - const QPoint adjustedPoint(point.x() - topLeft.x(), point.y() - topLeft.y()); - const QModelIndex index = column->indexAt(adjustedPoint); + const QModelIndex index = column->indexAt(columnPosition(column, point)); if (index.isValid()) { return index; } @@ -109,6 +103,18 @@ QModelIndex DolphinColumnView::indexAt(const QPoint& point) const return QModelIndex(); } +KFileItem DolphinColumnView::itemAt(const QPoint& point) const +{ + foreach (DolphinColumnWidget* column, m_columns) { + KFileItem item = column->itemAt(columnPosition(column, point)); + if (!item.isNull()) { + return item; + } + } + + return KFileItem(); +} + void DolphinColumnView::scrollTo(const QModelIndex& index, ScrollHint hint) { activeColumn()->scrollTo(index, hint); @@ -145,6 +151,21 @@ void DolphinColumnView::setRootUrl(const KUrl& url) m_columns[0]->setUrl(url); } +void DolphinColumnView::setNameFilter(const QString& nameFilter) +{ + if (nameFilter != m_nameFilter) { + m_nameFilter = nameFilter; + foreach (DolphinColumnWidget* column, m_columns) { + column->setNameFilter(nameFilter); + } + } +} + +QString DolphinColumnView::nameFilter() const +{ + return m_nameFilter; +} + KUrl DolphinColumnView::rootUrl() const { return m_columns[0]->url(); @@ -152,8 +173,7 @@ KUrl DolphinColumnView::rootUrl() const void DolphinColumnView::showColumn(const KUrl& url) { - const KUrl& rootUrl = m_columns[0]->url(); - if (!rootUrl.isParentOf(url)) { + if (!rootUrl().isParentOf(url)) { setRootUrl(url); return; } @@ -163,6 +183,7 @@ void DolphinColumnView::showColumn(const KUrl& url) 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 @@ -171,7 +192,7 @@ void DolphinColumnView::showColumn(const KUrl& url) QList::iterator start = m_columns.begin() + columnIndex; QList::iterator end = m_columns.end(); for (QList::iterator it = start; it != end; ++it) { - (*it)->deleteLater(); + deleteColumn(*it); } m_columns.erase(start, end); @@ -215,6 +236,10 @@ void DolphinColumnView::showColumn(const KUrl& url) 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); @@ -236,6 +261,21 @@ void DolphinColumnView::showColumn(const KUrl& url) assureVisibleActiveColumn(); } +void DolphinColumnView::editItem(const KFileItem& item) +{ + activeColumn()->editItem(item); +} + +KFileItemList DolphinColumnView::selectedItems() const +{ + return activeColumn()->selectedItems(); +} + +QMimeData* DolphinColumnView::selectionMimeData() const +{ + return activeColumn()->selectionMimeData(); +} + void DolphinColumnView::selectAll() { activeColumn()->selectAll(); @@ -270,12 +310,14 @@ QModelIndex DolphinColumnView::moveCursor(CursorAction cursorAction, Qt::Keyboar case MoveLeft: if (m_index > 0) { setActiveColumnIndex(m_index - 1); + m_controller->triggerUrlChangeRequest(activeColumn()->url()); } break; case MoveRight: if (m_index < m_columns.count() - 1) { setActiveColumnIndex(m_index + 1); + m_controller->triggerUrlChangeRequest(m_columns[m_index]->url()); } break; @@ -290,13 +332,12 @@ void DolphinColumnView::setSelection(const QRect& rect, QItemSelectionModel::Sel { Q_UNUSED(rect); Q_UNUSED(flags); - //activeColumn()->setSelection(rect, flags); } QRegion DolphinColumnView::visualRegionForSelection(const QItemSelection& selection) const { Q_UNUSED(selection); - return QRegion(); //activeColumn()->visualRegionForSelection(selection); + return QRegion(); } int DolphinColumnView::horizontalOffset() const @@ -311,7 +352,7 @@ int DolphinColumnView::verticalOffset() const void DolphinColumnView::mousePressEvent(QMouseEvent* event) { - m_controller->triggerActivation(); + m_controller->requestActivation(); QAbstractItemView::mousePressEvent(event); } @@ -320,32 +361,32 @@ void DolphinColumnView::resizeEvent(QResizeEvent* event) QAbstractItemView::resizeEvent(event); layoutColumns(); updateScrollBar(); + assureVisibleActiveColumn(); } -void DolphinColumnView::zoomIn() +void DolphinColumnView::wheelEvent(QWheelEvent* 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(); + // let Ctrl+wheel events propagate to the DolphinView for icon zooming + if ((event->modifiers() & Qt::ControlModifier) == Qt::ControlModifier) { + event->ignore(); + return; } + QAbstractItemView::wheelEvent(event); } -void DolphinColumnView::zoomOut() +void DolphinColumnView::setZoomLevel(int level) { - 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(); + const int size = ZoomLevelInfo::iconSizeForZoomLevel(level); + ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); + + const bool showPreview = m_controller->dolphinView()->showPreview(); + if (showPreview) { + settings->setPreviewSize(size); + } else { + settings->setIconSize(size); } + + updateDecorationSize(showPreview); } void DolphinColumnView::moveContentHorizontally(int x) @@ -354,48 +395,74 @@ void DolphinColumnView::moveContentHorizontally(int x) layoutColumns(); } -void DolphinColumnView::updateDecorationSize() +void DolphinColumnView::updateDecorationSize(bool showPreview) { ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); - const int iconSize = settings->iconSize(); + const int iconSize = showPreview ? settings->previewSize() : 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(QSize(iconSize, iconSize)); + widget->setDecorationSize(size); } } - m_controller->setZoomInPossible(isZoomInPossible()); - m_controller->setZoomOutPossible(isZoomOutPossible()); - doItemsLayout(); } -void DolphinColumnView::slotShowHiddenFilesChanged(bool show) +void DolphinColumnView::updateColumnsBackground(bool active) { + 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->setShowHiddenFiles(show); + column->updateBackground(); } } -void DolphinColumnView::slotShowPreviewChanged(bool show) +void DolphinColumnView::slotSortingChanged(DolphinView::Sorting sorting) { foreach (DolphinColumnWidget* column, m_columns) { - column->setShowPreview(show); + column->setSorting(sorting); } } -bool DolphinColumnView::isZoomInPossible() const +void DolphinColumnView::slotSortOrderChanged(Qt::SortOrder order) { - ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); - return settings->iconSize() < KIconLoader::SizeLarge; + foreach (DolphinColumnWidget* column, m_columns) { + column->setSortOrder(order); + } } -bool DolphinColumnView::isZoomOutPossible() const +void DolphinColumnView::slotShowHiddenFilesChanged() { - ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); - return settings->iconSize() > KIconLoader::SizeSmall; + const bool show = m_controller->dolphinView()->showHiddenFiles(); + foreach (DolphinColumnWidget* column, m_columns) { + column->setShowHiddenFiles(show); + } +} + +void DolphinColumnView::slotShowPreviewChanged() +{ + const bool show = m_controller->dolphinView()->showPreview(); + updateDecorationSize(show); + foreach (DolphinColumnWidget* column, m_columns) { + column->setShowPreview(show); + } } void DolphinColumnView::setActiveColumnIndex(int index) @@ -412,36 +479,45 @@ void DolphinColumnView::setActiveColumnIndex(int index) m_index = index; m_columns[m_index]->setActive(true); - m_controller->setUrl(m_columns[m_index]->url()); - assureVisibleActiveColumn(); } void DolphinColumnView::layoutColumns() { + 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, viewport()->height())); + 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, viewport()->height())); + 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); + } else { + m_emptyViewport->hide(); } } void DolphinColumnView::updateScrollBar() { - int contentWidth = 0; - foreach (DolphinColumnWidget* column, m_columns) { - contentWidth += column->width(); - } + ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); + const int contentWidth = m_columns.count() * settings->columnWidth(); horizontalScrollBar()->setPageStep(contentWidth); horizontalScrollBar()->setRange(0, contentWidth - viewport()->width()); @@ -451,7 +527,10 @@ void DolphinColumnView::assureVisibleActiveColumn() { const int viewportWidth = viewport()->width(); const int x = activeColumn()->x(); - const int width = activeColumn()->width(); + + ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); + const int width = settings->columnWidth(); + if (x + width > viewportWidth) { const int newContentX = m_contentX - x - width + viewportWidth; if (isRightToLeft()) { @@ -459,7 +538,9 @@ void DolphinColumnView::assureVisibleActiveColumn() } else { m_animation->setFrameRange(-m_contentX, -newContentX); } - m_animation->start(); + if (m_animation->state() != QTimeLine::Running) { + m_animation->start(); + } } else if (x < 0) { const int newContentX = m_contentX - x; if (isRightToLeft()) { @@ -467,12 +548,15 @@ void DolphinColumnView::assureVisibleActiveColumn() } else { m_animation->setFrameRange(-m_contentX, -newContentX); } - m_animation->start(); + if (m_animation->state() != QTimeLine::Running) { + m_animation->start(); + } } } void DolphinColumnView::requestActivation(DolphinColumnWidget* column) { + m_controller->setItemView(column); if (column->isActive()) { assureVisibleActiveColumn(); } else { @@ -492,7 +576,7 @@ 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(); + deleteColumn(*it); } m_columns.erase(start, end); m_index = 0; @@ -500,4 +584,29 @@ void DolphinColumnView::removeAllColumns() assureVisibleActiveColumn(); } +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()); +} + +void DolphinColumnView::deleteColumn(DolphinColumnWidget* column) +{ + if (column != 0) { + if (m_controller->itemView() == column) { + m_controller->setItemView(0); + } + // deleteWhenNotDragSource(column) does not necessarily delete column, + // and we want its preview generator destroyed immediately. + column->m_previewGenerator->deleteLater(); + column->m_previewGenerator = 0; + column->hide(); + // Prevent automatic destruction of column when this DolphinColumnView + // is destroyed. + column->setParent(0); + column->disconnect(); + emit requestColumnDeletion(column); + } +} + #include "dolphincolumnview.moc"