X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/585bb5994010c6bf64f7bb29ba4df903acc44a3e..39f89141b06c:/src/views/dolphincolumnview.cpp diff --git a/src/views/dolphincolumnview.cpp b/src/views/dolphincolumnview.cpp index 1fdc3e0b2..4b3a9f582 100644 --- a/src/views/dolphincolumnview.cpp +++ b/src/views/dolphincolumnview.cpp @@ -40,13 +40,16 @@ #include #include #include +#include #include #include +#include #include #include #include #include +#include #include #include #include @@ -64,7 +67,9 @@ DolphinColumnView::DolphinColumnView(QWidget* parent, m_decorationSize(), m_dirLister(0), m_dolphinModel(0), - m_proxyModel(0) + m_proxyModel(0), + m_resizeWidget(0), + m_resizeXOrigin(-1) { setMouseTracking(true); setAcceptDrops(true); @@ -76,6 +81,13 @@ DolphinColumnView::DolphinColumnView(QWidget* parent, setRootIsDecorated(false); setItemsExpandable(false); setEditTriggers(QAbstractItemView::NoEditTriggers); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + + 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); const ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); Q_ASSERT(settings != 0); @@ -90,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&)), @@ -105,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); @@ -268,17 +284,18 @@ void DolphinColumnView::dropEvent(QDropEvent* 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); } } @@ -379,6 +396,61 @@ bool DolphinColumnView::acceptsDrop(const QModelIndex& index) const 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); @@ -425,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);