src/gui/itemviews/qcolumnviewgrip.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gui/itemviews/qcolumnviewgrip.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,194 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT_NO_QCOLUMNVIEW
+
+#include "qcolumnviewgrip_p.h"
+#include <qstyleoption.h>
+#include <qpainter.h>
+#include <qbrush.h>
+#include <qevent.h>
+#include <qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+/*
+    \internal
+    class QColumnViewGrip
+
+    QColumnViewGrip is created to go inside QAbstractScrollArea's corner.
+    When the mouse it moved it will resize the scroll area and emit's a signal.
+ */
+
+/*
+    \internal
+    \fn void QColumnViewGrip::gripMoved()
+    Signal that is emitted when the grip moves the parent widget.
+ */
+
+/*!
+    Creates a new QColumnViewGrip with the given \a parent to view a model.
+    Use setModel() to set the model.
+*/
+QColumnViewGrip::QColumnViewGrip(QWidget *parent)
+:  QWidget(*new QColumnViewGripPrivate, parent, 0)
+{
+#ifndef QT_NO_CURSOR
+    setCursor(Qt::SplitHCursor);
+#endif
+}
+
+/*!
+  \internal
+*/
+QColumnViewGrip::QColumnViewGrip(QColumnViewGripPrivate & dd, QWidget *parent, Qt::WFlags f)
+:  QWidget(dd, parent, f)
+{
+}
+
+/*!
+  Destroys the view.
+*/
+QColumnViewGrip::~QColumnViewGrip()
+{
+}
+
+/*!
+    Attempt to resize the parent object by \a offset
+    returns the amount of offset that it was actually able to resized
+*/
+int QColumnViewGrip::moveGrip(int offset)
+{
+    QWidget *parentWidget = (QWidget*)parent();
+
+    // first resize the parent
+    int oldWidth = parentWidget->width();
+    int newWidth = oldWidth;
+    if (isRightToLeft())
+       newWidth -= offset;
+    else
+       newWidth += offset;
+    newWidth = qMax(parentWidget->minimumWidth(), newWidth);
+    parentWidget->resize(newWidth, parentWidget->height());
+
+    // Then have the view move the widget
+    int realOffset = parentWidget->width() - oldWidth;
+    int oldX = parentWidget->x();
+    if (realOffset != 0)
+        emit gripMoved(realOffset);
+    if (isRightToLeft())
+        realOffset = -1 * (oldX - parentWidget->x());
+    return realOffset;
+}
+
+/*!
+    \reimp
+*/
+void QColumnViewGrip::paintEvent(QPaintEvent *event)
+{
+    QPainter painter(this);
+    QStyleOption opt;
+    opt.initFrom(this);
+    style()->drawControl(QStyle::CE_ColumnViewGrip, &opt, &painter, this);
+    event->accept();
+}
+
+/*!
+    \reimp
+    Resize the parent window to the sizeHint
+*/
+void QColumnViewGrip::mouseDoubleClickEvent(QMouseEvent *event)
+{
+    Q_UNUSED(event);
+    QWidget *parentWidget = (QWidget*)parent();
+    int offset = parentWidget->sizeHint().width() - parentWidget->width();
+    if (isRightToLeft())
+        offset *= -1;
+    moveGrip(offset);
+    event->accept();
+}
+
+/*!
+    \reimp
+    Begin watching for mouse movements
+*/
+void QColumnViewGrip::mousePressEvent(QMouseEvent *event)
+{
+    Q_D(QColumnViewGrip);
+    d->originalXLocation = event->globalX();
+    event->accept();
+}
+
+/*!
+    \reimp
+    Calculate the movement of the grip and moveGrip() and emit gripMoved
+*/
+void QColumnViewGrip::mouseMoveEvent(QMouseEvent *event)
+{
+    Q_D(QColumnViewGrip);
+    int offset = event->globalX() - d->originalXLocation;
+    d->originalXLocation = moveGrip(offset) + d->originalXLocation;
+    event->accept();
+}
+
+/*!
+    \reimp
+    Stop watching for mouse movements
+*/
+void QColumnViewGrip::mouseReleaseEvent(QMouseEvent *event)
+{
+    Q_D(QColumnViewGrip);
+    d->originalXLocation = -1;
+    event->accept();
+}
+
+/*
+ * private object implementation
+ */
+QColumnViewGripPrivate::QColumnViewGripPrivate()
+:  QWidgetPrivate(),
+originalXLocation(-1)
+{
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_QCOLUMNVIEW