]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Allow the user to resize the columns.
authorPeter Penz <peter.penz19@gmail.com>
Sat, 9 Oct 2010 15:22:49 +0000 (15:22 +0000)
committerPeter Penz <peter.penz19@gmail.com>
Sat, 9 Oct 2010 15:22:49 +0000 (15:22 +0000)
BUG: 190030
BUG: 196717
FIXED-IN: 4.6.0

svn path=/trunk/KDE/kdebase/apps/; revision=1184247

src/views/dolphincolumnview.cpp
src/views/dolphincolumnview.h
src/views/dolphincolumnviewcontainer.cpp
src/views/dolphincolumnviewcontainer.h

index baae6610704154a175f2eb290cf14ddb5a3c98d4..309674122b362843581f3f182924eefb22dc1c4e 100644 (file)
 #include <kdirlister.h>
 #include <kfileitem.h>
 #include <kio/previewjob.h>
+#include <kicon.h>
 #include <kiconeffect.h>
 #include <kjob.h>
+#include <klocale.h>
 #include <konqmimedata.h>
 
 #include <QApplication>
 #include <QClipboard>
 #include <QHeaderView>
+#include <QLabel>
 #include <QPainter>
 #include <QPoint>
 #include <QScrollBar>
@@ -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<QMouseEvent*>(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<QMouseEvent*>(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);
index 4f439fc99798086d8ddf51d8da7b919315a0dd02..871610d81d9f5e90db6c6c582b1a7633367b4089 100644 (file)
@@ -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;
 };
 
index 461768bea2e03cecb71cfdfb1dbc7402e4b043e6..c3cab6dedff5677b634dd33e15419f28354946de 100644 (file)
@@ -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());
index c67fb3cff7ad59883ce9aab8123d357420165a0d..4b4158cbcc49f1f676ed3484ff5dcede9d6e4fba 100644 (file)
@@ -98,7 +98,6 @@ private slots:
 
 private:
     void layoutColumns();
-    void updateScrollBar();
 
     /**
      * Assures that the currently active column is fully visible