From: Peter Penz Date: Sat, 9 Oct 2010 15:22:49 +0000 (+0000) Subject: Allow the user to resize the columns. X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/708312d759e8a56d62dd9d6ac2a0d0f12d617817 Allow the user to resize the columns. BUG: 190030 BUG: 196717 FIXED-IN: 4.6.0 svn path=/trunk/KDE/kdebase/apps/; revision=1184247 --- diff --git a/src/views/dolphincolumnview.cpp b/src/views/dolphincolumnview.cpp index baae66107..309674122 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&)), @@ -380,6 +395,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); diff --git a/src/views/dolphincolumnview.h b/src/views/dolphincolumnview.h index 4f439fc99..871610d81 100644 --- a/src/views/dolphincolumnview.h +++ b/src/views/dolphincolumnview.h @@ -34,6 +34,7 @@ class DolphinModel; class DolphinSortFilterProxyModel; class DolphinDirLister; class KFileItem; +class QLabel; class SelectionManager; class ViewExtensionsFactory; @@ -102,6 +103,7 @@ protected: virtual void currentChanged(const QModelIndex& current, const QModelIndex& previous); virtual QRect visualRect(const QModelIndex& index) const; virtual bool acceptsDrop(const QModelIndex& index) const; + virtual bool eventFilter(QObject* watched, QEvent* event); private slots: void setZoomLevel(int level); @@ -136,6 +138,9 @@ private: DolphinModel* m_dolphinModel; DolphinSortFilterProxyModel* m_proxyModel; + QLabel* m_resizeWidget; + int m_resizeXOrigin; + friend class DolphinColumnViewContainer; }; diff --git a/src/views/dolphincolumnviewcontainer.cpp b/src/views/dolphincolumnviewcontainer.cpp index 461768bea..c3cab6ded 100644 --- a/src/views/dolphincolumnviewcontainer.cpp +++ b/src/views/dolphincolumnviewcontainer.cpp @@ -79,7 +79,6 @@ DolphinColumnViewContainer::DolphinColumnViewContainer(QWidget* parent, m_emptyViewport->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); updateColumnsBackground(true); - } DolphinColumnViewContainer::~DolphinColumnViewContainer() @@ -171,7 +170,6 @@ void DolphinColumnViewContainer::showColumn(const KUrl& url) column->setGeometry(QRect(-1, -1, 1, 1)); column->show(); layoutColumns(); - updateScrollBar(); } } @@ -199,7 +197,6 @@ void DolphinColumnViewContainer::resizeEvent(QResizeEvent* event) { QScrollArea::resizeEvent(event); layoutColumns(); - updateScrollBar(); assureVisibleActiveColumn(); } @@ -249,40 +246,40 @@ void DolphinColumnViewContainer::updateActiveUrl() void DolphinColumnViewContainer::layoutColumns() { - const int gap = 4; - - ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); - const int columnWidth = settings->columnWidth(); - + // Layout the position of the columns corresponding to their maximum width QRect emptyViewportRect; if (isRightToLeft()) { + int columnWidth = m_columns[0]->maximumWidth(); int x = viewport()->width() - columnWidth + m_contentX; foreach (DolphinColumnView* column, m_columns) { - column->setGeometry(QRect(x, 0, columnWidth - gap, viewport()->height())); + columnWidth = column->maximumWidth(); + column->setGeometry(QRect(x, 0, columnWidth, viewport()->height())); x -= columnWidth; } - emptyViewportRect = QRect(0, 0, x + columnWidth - gap, viewport()->height()); + emptyViewportRect = QRect(0, 0, x + columnWidth, viewport()->height()); } else { int x = m_contentX; foreach (DolphinColumnView* column, m_columns) { - column->setGeometry(QRect(x, 0, columnWidth - gap, viewport()->height())); + const int columnWidth = column->maximumWidth(); + column->setGeometry(QRect(x, 0, columnWidth, viewport()->height())); x += columnWidth; } - emptyViewportRect = QRect(x, 0, viewport()->width() - x - gap, viewport()->height()); + emptyViewportRect = QRect(x, 0, viewport()->width() - x, viewport()->height()); } + // Show an empty viewport if the columns don't cover the whole viewport if (emptyViewportRect.isValid()) { m_emptyViewport->show(); m_emptyViewport->setGeometry(emptyViewportRect); } else { m_emptyViewport->hide(); } -} -void DolphinColumnViewContainer::updateScrollBar() -{ - ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); - const int contentWidth = m_columns.count() * settings->columnWidth(); + // Update the horizontal position indicator + int contentWidth = 0; + foreach (DolphinColumnView* column, m_columns) { + contentWidth += column->maximumWidth(); + } horizontalScrollBar()->setPageStep(contentWidth); horizontalScrollBar()->setRange(0, contentWidth - viewport()->width()); diff --git a/src/views/dolphincolumnviewcontainer.h b/src/views/dolphincolumnviewcontainer.h index c67fb3cff..4b4158cbc 100644 --- a/src/views/dolphincolumnviewcontainer.h +++ b/src/views/dolphincolumnviewcontainer.h @@ -98,7 +98,6 @@ private slots: private: void layoutColumns(); - void updateScrollBar(); /** * Assures that the currently active column is fully visible