X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/652d08c9242ed51d86dba3b2afda9d3b2e9a9cd7..39f89141b06c:/src/views/dolphincolumnview.cpp diff --git a/src/views/dolphincolumnview.cpp b/src/views/dolphincolumnview.cpp index 7e2b522b4..4b3a9f582 100644 --- a/src/views/dolphincolumnview.cpp +++ b/src/views/dolphincolumnview.cpp @@ -23,6 +23,7 @@ #include "dolphincolumnviewcontainer.h" #include "dolphinviewcontroller.h" #include "dolphindirlister.h" +#include "dolphinfileitemdelegate.h" #include "dolphinsortfilterproxymodel.h" #include "settings/dolphinsettings.h" #include "dolphinviewautoscroller.h" @@ -39,12 +40,16 @@ #include #include #include +#include #include #include +#include #include #include #include +#include +#include #include #include #include @@ -52,7 +57,7 @@ DolphinColumnView::DolphinColumnView(QWidget* parent, DolphinColumnViewContainer* container, const KUrl& url) : - QListView(parent), + DolphinTreeView(parent), m_active(false), m_container(container), m_extensionsFactory(0), @@ -63,22 +68,27 @@ DolphinColumnView::DolphinColumnView(QWidget* parent, m_dirLister(0), m_dolphinModel(0), m_proxyModel(0), - m_dropRect() + m_resizeWidget(0), + m_resizeXOrigin(-1) { setMouseTracking(true); - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + setAcceptDrops(true); + setUniformRowHeights(true); setSelectionBehavior(SelectItems); setSelectionMode(QAbstractItemView::ExtendedSelection); setDragDropMode(QAbstractItemView::DragDrop); setDropIndicatorShown(false); - setSelectionRectVisible(true); + setRootIsDecorated(false); + setItemsExpandable(false); setEditTriggers(QAbstractItemView::NoEditTriggers); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - setVerticalScrollMode(QListView::ScrollPerPixel); - setHorizontalScrollMode(QListView::ScrollPerPixel); + m_resizeWidget = new QLabel(this); + m_resizeWidget->setPixmap(KIcon("transform-move").pixmap(KIconLoader::SizeSmall)); + m_resizeWidget->setToolTip(i18nc("@info:tooltip", "Resize column")); + setCornerWidget(m_resizeWidget); + m_resizeWidget->installEventFilter(this); - // apply the column mode settings to the widget const ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); Q_ASSERT(settings != 0); @@ -92,6 +102,9 @@ DolphinColumnView::DolphinColumnView(QWidget* parent, m_font.setPointSizeF(settings->fontSize()); } + setMinimumWidth(settings->fontSize() * 10); + setMaximumWidth(settings->columnWidth()); + connect(this, SIGNAL(viewportEntered()), m_container->m_dolphinViewController, SLOT(emitViewportEntered())); connect(this, SIGNAL(entered(const QModelIndex&)), @@ -107,6 +120,7 @@ DolphinColumnView::DolphinColumnView(QWidget* parent, m_dirLister->setDelayedMimeTypes(true); const bool showHiddenFiles = m_container->m_dolphinViewController->view()->showHiddenFiles(); m_dirLister->setShowingDotFiles(showHiddenFiles); + connect(m_dirLister, SIGNAL(completed()), this, SLOT(slotDirListerCompleted())); m_dolphinModel = new DolphinModel(this); m_dolphinModel->setDirLister(m_dirLister); @@ -138,6 +152,7 @@ DolphinColumnView::DolphinColumnView(QWidget* parent, DolphinViewController* dolphinViewController = m_container->m_dolphinViewController; m_extensionsFactory = new ViewExtensionsFactory(this, dolphinViewController, viewModeController); + m_extensionsFactory->fileItemDelegate()->setMinimizedNameColumn(true); m_dirLister->openUrl(url, KDirLister::NoFlags); } @@ -202,7 +217,7 @@ void DolphinColumnView::setSelectionModel(QItemSelectionModel* model) this, SLOT(requestActivation())); } - QListView::setSelectionModel(model); + DolphinTreeView::setSelectionModel(model); connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(requestActivation())); @@ -210,7 +225,7 @@ void DolphinColumnView::setSelectionModel(QItemSelectionModel* model) QStyleOptionViewItem DolphinColumnView::viewOptions() const { - QStyleOptionViewItem viewOptions = QListView::viewOptions(); + QStyleOptionViewItem viewOptions = DolphinTreeView::viewOptions(); viewOptions.font = m_font; viewOptions.fontMetrics = QFontMetrics(m_font); viewOptions.decorationSize = m_decorationSize; @@ -218,9 +233,23 @@ QStyleOptionViewItem DolphinColumnView::viewOptions() const return viewOptions; } +bool DolphinColumnView::event(QEvent* event) +{ + if (event->type() == QEvent::Polish) { + // Hide all columns except of the 'Name' column + for (int i = DolphinModel::Name + 1; i < DolphinModel::ExtraColumnCount; ++i) { + hideColumn(i); + } + header()->hide(); + } + + return DolphinTreeView::event(event); +} + void DolphinColumnView::startDrag(Qt::DropActions supportedActions) { DragAndDropHelper::instance().startDrag(this, supportedActions, m_container->m_dolphinViewController); + DolphinTreeView::startDrag(supportedActions); } void DolphinColumnView::dragEnterEvent(QDragEnterEvent* event) @@ -229,31 +258,12 @@ void DolphinColumnView::dragEnterEvent(QDragEnterEvent* event) event->acceptProposedAction(); requestActivation(); } -} - -void DolphinColumnView::dragLeaveEvent(QDragLeaveEvent* event) -{ - QListView::dragLeaveEvent(event); - setDirtyRegion(m_dropRect); + DolphinTreeView::dragEnterEvent(event); } void DolphinColumnView::dragMoveEvent(QDragMoveEvent* event) { - QListView::dragMoveEvent(event); - - // TODO: remove this code when the issue #160611 is solved in Qt 4.4 - const QModelIndex index = indexAt(event->pos()); - setDirtyRegion(m_dropRect); - - m_dropRect.setSize(QSize()); // set as invalid - if (index.isValid()) { - m_container->m_dolphinViewController->setItemView(this); - const KFileItem item = m_container->m_dolphinViewController->itemForIndex(index); - if (!item.isNull() && item.isDir()) { - m_dropRect = visualRect(index); - } - } - setDirtyRegion(m_dropRect); + DolphinTreeView::dragMoveEvent(event); if (DragAndDropHelper::instance().isMimeDataSupported(event->mimeData())) { // accept url drops, independently from the destination item @@ -265,48 +275,46 @@ void DolphinColumnView::dropEvent(QDropEvent* event) { const QModelIndex index = indexAt(event->pos()); m_container->m_dolphinViewController->setItemView(this); - const KFileItem item = m_container->m_dolphinViewController->itemForIndex(index); + const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index); + const KFileItem item = m_dolphinModel->itemForIndex(dolphinModelIndex); m_container->m_dolphinViewController->indicateDroppedUrls(item, url(), event); - QListView::dropEvent(event); + DolphinTreeView::dropEvent(event); } void DolphinColumnView::paintEvent(QPaintEvent* event) { if (!m_childUrl.isEmpty()) { - // indicate the shown URL of the next column by highlighting the shown folder item + // 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); + + QStyleOptionViewItemV4 option; + option.initFrom(this); + option.rect = visualRect(proxyIndex); + option.state = QStyle::State_Enabled | QStyle::State_HasFocus; + option.viewItemPosition = QStyleOptionViewItemV4::OnlyOne; + style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this); } } - QListView::paintEvent(event); + DolphinTreeView::paintEvent(event); } void DolphinColumnView::mousePressEvent(QMouseEvent* event) { requestActivation(); - if (!indexAt(event->pos()).isValid()) { - if (QApplication::mouseButtons() & Qt::MidButton) { - m_container->m_dolphinViewController->replaceUrlByClipboard(); - } - } else if (event->button() == Qt::LeftButton) { - // TODO: see comment in DolphinIconsView::mousePressEvent() - setState(QAbstractItemView::DraggingState); + if (!indexAt(event->pos()).isValid() && (QApplication::mouseButtons() & Qt::MidButton)) { + m_container->m_dolphinViewController->replaceUrlByClipboard(); } - QListView::mousePressEvent(event); + + DolphinTreeView::mousePressEvent(event); } void DolphinColumnView::keyPressEvent(QKeyEvent* event) { - QListView::keyPressEvent(event); + DolphinTreeView::keyPressEvent(event); DolphinViewController* controller = m_container->m_dolphinViewController; controller->handleKeyPressEvent(event); @@ -314,8 +322,8 @@ void DolphinColumnView::keyPressEvent(QKeyEvent* event) 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); + const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(currentIndex()); + const KFileItem item = m_dolphinModel->itemForIndex(dolphinModelIndex); if (!item.isNull() && item.isDir()) { controller->emitItemTriggered(item); } @@ -336,7 +344,7 @@ void DolphinColumnView::keyPressEvent(QKeyEvent* event) void DolphinColumnView::contextMenuEvent(QContextMenuEvent* event) { requestActivation(); - QListView::contextMenuEvent(event); + DolphinTreeView::contextMenuEvent(event); m_container->m_dolphinViewController->triggerContextMenuRequest(event->pos()); } @@ -344,12 +352,12 @@ void DolphinColumnView::wheelEvent(QWheelEvent* event) { const int step = m_decorationSize.height(); verticalScrollBar()->setSingleStep(step); - QListView::wheelEvent(event); + DolphinTreeView::wheelEvent(event); } void DolphinColumnView::leaveEvent(QEvent* event) { - QListView::leaveEvent(event); + DolphinTreeView::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 @@ -358,10 +366,91 @@ void DolphinColumnView::leaveEvent(QEvent* event) void DolphinColumnView::currentChanged(const QModelIndex& current, const QModelIndex& previous) { - QListView::currentChanged(current, previous); + DolphinTreeView::currentChanged(current, previous); m_extensionsFactory->handleCurrentIndexChange(current, previous); } +QRect DolphinColumnView::visualRect(const QModelIndex& index) const +{ + QRect rect = DolphinTreeView::visualRect(index); + + const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index); + const KFileItem item = m_dolphinModel->itemForIndex(dolphinModelIndex); + if (!item.isNull()) { + const int width = DolphinFileItemDelegate::nameColumnWidth(item.text(), viewOptions()); + rect.setWidth(width); + } + + return rect; +} + +bool DolphinColumnView::acceptsDrop(const QModelIndex& index) const +{ + if (index.isValid() && (index.column() == DolphinModel::Name)) { + // Accept drops above directories + const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index); + const KFileItem item = m_dolphinModel->itemForIndex(dolphinModelIndex); + return !item.isNull() && item.isDir(); + } + + return false; +} + +bool DolphinColumnView::eventFilter(QObject* watched, QEvent* event) +{ + if (watched == m_resizeWidget) { + switch (event->type()) { + case QEvent::MouseButtonPress: { + // Initiate the resizing of the column + QMouseEvent* mouseEvent = static_cast(event); + m_resizeXOrigin = mouseEvent->globalX(); + m_resizeWidget->setMouseTracking(true); + event->accept(); + return true; + } + + case QEvent::MouseButtonDblClick: { + // Reset the column width to the default value + const ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); + setMaximumWidth(settings->columnWidth()); + m_container->layoutColumns(); + m_resizeWidget->setMouseTracking(false); + m_resizeXOrigin = -1; + event->accept(); + return true; + } + + case QEvent::MouseMove: { + // Resize the column and trigger a relayout of the container + QMouseEvent* mouseEvent = static_cast(event); + int requestedWidth = maximumWidth() - m_resizeXOrigin + mouseEvent->globalX();; + if (requestedWidth < minimumWidth()) { + requestedWidth = minimumWidth(); + } + setMaximumWidth(requestedWidth); + + m_container->layoutColumns(); + + m_resizeXOrigin = mouseEvent->globalX(); + + event->accept(); + return true; + } + + case QEvent::MouseButtonRelease: { + // The resizing has been finished + m_resizeWidget->setMouseTracking(false); + m_resizeXOrigin = -1; + event->accept(); + return true; + } + + default: + break; + } + } + return DolphinTreeView::eventFilter(watched, event); +} void DolphinColumnView::setZoomLevel(int level) { const int size = ZoomLevelInfo::iconSizeForZoomLevel(level); @@ -408,6 +497,34 @@ void DolphinColumnView::slotShowPreviewChanged() updateDecorationSize(view->showPreview()); } +void DolphinColumnView::slotDirListerCompleted() +{ + if (!m_childUrl.isEmpty()) { + return; + } + + // Try to optimize the width of the column, so that no name gets clipped + const int requiredWidth = sizeHintForColumn(DolphinModel::Name); + + const ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); + if (requiredWidth > settings->columnWidth()) { + int frameAroundContents = 0; + if (style()->styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents)) { + // TODO: Using 2 PM_DefaultFrameWidths are not sufficient. Check Qt-code + // for other pixelmetrics that should be added... + frameAroundContents = style()->pixelMetric(QStyle::PM_DefaultFrameWidth) * 4; + } + + const int scrollBarWidth = style()->pixelMetric(QStyle::PM_ScrollBarExtent, 0, verticalScrollBar()); + + setMaximumWidth(requiredWidth + frameAroundContents + scrollBarWidth); + m_container->layoutColumns(); + if (m_active) { + m_container->assureVisibleActiveColumn(); + } + } +} + void DolphinColumnView::activate() { setFocus(Qt::OtherFocusReason);