1
/****************************************************************************
3
** Copyright (C) 1992-2005 Trolltech AS. All rights reserved.
5
** This file is part of the widgets module of the Qt Toolkit.
7
** This file may be distributed under the terms of the Q Public License
8
** as defined by Trolltech AS of Norway and appearing in the file
9
** LICENSE.QPL included in the packaging of this file.
11
** This file may be distributed and/or modified under the terms of the
12
** GNU General Public License version 2 as published by the Free Software
13
** Foundation and appearing in the file LICENSE.GPL included in the
14
** packaging of this file.
16
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
17
** information about Qt Commercial License Agreements.
18
** See http://www.trolltech.com/qpl/ for QPL licensing information.
19
** See http://www.trolltech.com/gpl/ for GPL licensing information.
21
** Contact info@trolltech.com if any conditions of this licensing are
24
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
25
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27
****************************************************************************/
29
#include "qdockseparator_p.h"
31
#include "qdockwidgetlayout_p.h"
33
#include "qmainwindow.h"
34
#include "qmainwindowlayout_p.h"
36
#include <qapplication.h>
40
#include <qstyleoption.h>
43
QDockSeparator::QDockSeparator(QDockWidgetLayout *d, QWidget *parent)
44
: QWidget(parent), hover(0), state(0)
47
void QDockSeparator::setDock(QDockWidgetLayout *d)
51
orientation = dock->orientation;
52
setCursor((orientation == Qt::Horizontal) ? Qt::SplitVCursor : Qt::SplitHCursor);
55
bool QDockSeparator::event(QEvent *event)
57
switch(event->type()) {
58
case QEvent::HoverEnter:
62
case QEvent::HoverLeave:
69
return QWidget::event(event);
72
void QDockSeparator::mousePressEvent(QMouseEvent *event)
74
if (event->button() != Qt::LeftButton)
78
state = new DragState;
80
// we map from global coordinates to avoid nasty effects when
81
// event compression kicks in
82
state->origin = parentWidget()->mapFromGlobal(event->globalPos());
84
// clear focus... it will be restored when the mouse button is released
85
state->prevFocus = qApp->focusWidget();
87
state->prevFocus->clearFocus();
89
qobject_cast<QMainWindowLayout*>(parentWidget()->layout())->saveLayoutInfo();
92
void QDockSeparator::mouseMoveEvent(QMouseEvent *event)
96
// we map from global coordinates to avoid nasty effects when
97
// event compression kicks in
98
QMainWindow *mw = qobject_cast<QMainWindow *>(parentWidget());
99
QPoint p = mw->mapFromGlobal(event->globalPos());
100
int delta = pick_perp(orientation, p - state->origin);
102
// constrain the mouse move event
103
if (qobject_cast<QMainWindowLayout *>(mw->layout())->constrain(dock, delta) != 0)
104
qobject_cast<QMainWindowLayout *>(mw->layout())->relayout();
107
void QDockSeparator::mouseReleaseEvent(QMouseEvent *event)
109
if (event->button() != Qt::LeftButton)
112
QMainWindowLayout *l = qobject_cast<QMainWindowLayout*>(parentWidget()->layout());
115
l->discardLayoutInfo();
117
Q_ASSERT(state != 0);
120
if (state->prevFocus)
121
state->prevFocus->setFocus();
127
void QDockSeparator::paintEvent(QPaintEvent *)
131
opt.state = QStyle::State_None;
133
opt.state |= QStyle::State_Enabled;
134
if (orientation == Qt::Horizontal)
135
opt.state |= QStyle::State_Horizontal;
137
opt.state |= QStyle::State_MouseOver;
139
opt.palette = palette();
140
style()->drawPrimitive(QStyle::PE_IndicatorDockWidgetResizeHandle, &opt, &p, this);