summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Bastian <thierry.bastian@nokia.com>2009-07-01 10:14:29 (GMT)
committerThierry Bastian <thierry.bastian@nokia.com>2009-07-01 15:16:10 (GMT)
commitd0299745e511640df3e0a26e8c447d0960ac4546 (patch)
tree860cd92c3dcfbc0fa91337a1e1410c8c35312953
parentfef6f4469d4c856abdaaefe1d914c120396ff365 (diff)
downloadQt-d0299745e511640df3e0a26e8c447d0960ac4546.zip
Qt-d0299745e511640df3e0a26e8c447d0960ac4546.tar.gz
Qt-d0299745e511640df3e0a26e8c447d0960ac4546.tar.bz2
QMainWindow: cleanup of code in QWidgetAnimator
-rw-r--r--src/gui/widgets/qdockarealayout.cpp10
-rw-r--r--src/gui/widgets/qmainwindowlayout.cpp50
-rw-r--r--src/gui/widgets/qmainwindowlayout_p.h11
-rw-r--r--src/gui/widgets/qtoolbararealayout.cpp2
-rw-r--r--src/gui/widgets/qwidgetanimator.cpp79
-rw-r--r--src/gui/widgets/qwidgetanimator_p.h21
6 files changed, 66 insertions, 107 deletions
diff --git a/src/gui/widgets/qdockarealayout.cpp b/src/gui/widgets/qdockarealayout.cpp
index f245d64..b905ccd 100644
--- a/src/gui/widgets/qdockarealayout.cpp
+++ b/src/gui/widgets/qdockarealayout.cpp
@@ -1488,7 +1488,7 @@ bool QDockAreaLayoutInfo::hasFixedSize() const
void QDockAreaLayoutInfo::apply(bool animate)
{
- QWidgetAnimator *widgetAnimator = mainWindowLayout()->widgetAnimator;
+ QWidgetAnimator &widgetAnimator = mainWindowLayout()->widgetAnimator;
#ifndef QT_NO_TABBAR
if (tabbed) {
@@ -1521,7 +1521,7 @@ void QDockAreaLayoutInfo::apply(bool animate)
}
}
- widgetAnimator->animate(tabBar, tab_rect, animate);
+ widgetAnimator.animate(tabBar, tab_rect, animate);
}
#endif // QT_NO_TABBAR
@@ -1544,7 +1544,7 @@ void QDockAreaLayoutInfo::apply(bool animate)
QWidget *w = item.widgetItem->widget();
QRect geo = w->geometry();
- widgetAnimator->animate(w, r, animate);
+ widgetAnimator.animate(w, r, animate);
if (!w->isHidden()) {
QDockWidget *dw = qobject_cast<QDockWidget*>(w);
if (!r.isValid() && geo.right() >= 0 && geo.bottom() >= 0) {
@@ -3064,13 +3064,13 @@ void QDockAreaLayout::splitDockWidget(QDockWidget *after,
void QDockAreaLayout::apply(bool animate)
{
- QWidgetAnimator *widgetAnimator
+ QWidgetAnimator &widgetAnimator
= qobject_cast<QMainWindowLayout*>(mainWindow->layout())->widgetAnimator;
for (int i = 0; i < QInternal::DockCount; ++i)
docks[i].apply(animate);
if (centralWidgetItem != 0 && !centralWidgetItem->isEmpty()) {
- widgetAnimator->animate(centralWidgetItem->widget(), centralWidgetRect,
+ widgetAnimator.animate(centralWidgetItem->widget(), centralWidgetRect,
animate);
}
diff --git a/src/gui/widgets/qmainwindowlayout.cpp b/src/gui/widgets/qmainwindowlayout.cpp
index 526e7a5..0318f53 100644
--- a/src/gui/widgets/qmainwindowlayout.cpp
+++ b/src/gui/widgets/qmainwindowlayout.cpp
@@ -1361,7 +1361,7 @@ QLayoutItem *QMainWindowLayout::takeAt(int index)
if (QLayoutItem *ret = layoutState.takeAt(index, &x)) {
// the widget might in fact have been destroyed by now
if (QWidget *w = ret->widget()) {
- widgetAnimator->abort(w);
+ widgetAnimator.abort(w);
if (w == pluggingWidget)
pluggingWidget = 0;
}
@@ -1542,25 +1542,9 @@ bool QMainWindowLayout::plug(QLayoutItem *widgetItem)
}
}
#endif
- widgetAnimator->animate(widget, globalRect,
- dockOptions & QMainWindow::AnimatedDocks);
+ widgetAnimator.animate(widget, globalRect, true);
} else {
-#ifndef QT_NO_DOCKWIDGET
- if (QDockWidget *dw = qobject_cast<QDockWidget*>(widget))
- dw->d_func()->plug(currentGapRect);
-#endif
-#ifndef QT_NO_TOOLBAR
- if (QToolBar *tb = qobject_cast<QToolBar*>(widget))
- tb->d_func()->plug(currentGapRect);
-#endif
- applyState(layoutState);
- savedState.clear();
-#ifndef QT_NO_DOCKWIDGET
- parentWidget()->update(layoutState.dockAreaLayout.separatorRegion());
-#endif
- currentGapPos.clear();
- updateGapIndicator();
- pluggingWidget = 0;
+ animationFinished(widget);
}
return true;
@@ -1667,6 +1651,11 @@ QMainWindowLayout::QMainWindowLayout(QMainWindow *mainwindow)
#endif
#endif
#endif // QT_NO_DOCKWIDGET
+ , widgetAnimator(this)
+ , pluggingWidget(0)
+#ifndef QT_NO_RUBBERBAND
+ , gapIndicator(QRubberBand::Rectangle, mainwindow)
+#endif //QT_NO_RUBBERBAND
{
#ifndef QT_NO_DOCKWIDGET
#ifndef QT_NO_TABBAR
@@ -1680,20 +1669,13 @@ QMainWindowLayout::QMainWindowLayout(QMainWindow *mainwindow)
#endif // QT_NO_DOCKWIDGET
#ifndef QT_NO_RUBBERBAND
- gapIndicator = new QRubberBand(QRubberBand::Rectangle, mainwindow);
// For accessibility to identify this special widget.
- gapIndicator->setObjectName(QLatin1String("qt_rubberband"));
-
- gapIndicator->hide();
+ gapIndicator.setObjectName(QLatin1String("qt_rubberband"));
+ gapIndicator.hide();
#endif
pluggingWidget = 0;
setObjectName(mainwindow->objectName() + QLatin1String("_layout"));
- widgetAnimator = new QWidgetAnimator(this);
- connect(widgetAnimator, SIGNAL(finished(QWidget*)),
- this, SLOT(animationFinished(QWidget*)), Qt::QueuedConnection);
- connect(widgetAnimator, SIGNAL(finishedAll()),
- this, SLOT(allAnimationsFinished()));
}
QMainWindowLayout::~QMainWindowLayout()
@@ -1795,13 +1777,13 @@ QLayoutItem *QMainWindowLayout::unplug(QWidget *widget)
void QMainWindowLayout::updateGapIndicator()
{
#ifndef QT_NO_RUBBERBAND
- if (widgetAnimator->animating() || currentGapPos.isEmpty()) {
- gapIndicator->hide();
+ if (widgetAnimator.animating() || currentGapPos.isEmpty()) {
+ gapIndicator.hide();
} else {
- if (gapIndicator->geometry() != currentGapRect)
- gapIndicator->setGeometry(currentGapRect);
- if (!gapIndicator->isVisible())
- gapIndicator->show();
+ if (gapIndicator.geometry() != currentGapRect)
+ gapIndicator.setGeometry(currentGapRect);
+ if (!gapIndicator.isVisible())
+ gapIndicator.show();
}
#endif
}
diff --git a/src/gui/widgets/qmainwindowlayout_p.h b/src/gui/widgets/qmainwindowlayout_p.h
index 26f8633..5c5965a 100644
--- a/src/gui/widgets/qmainwindowlayout_p.h
+++ b/src/gui/widgets/qmainwindowlayout_p.h
@@ -59,10 +59,12 @@
#include "QtGui/qlayout.h"
#include "QtGui/qtabbar.h"
+#include "QtGui/qrubberband.h"
#include "QtCore/qvector.h"
#include "QtCore/qset.h"
#include "QtCore/qbasictimer.h"
#include "private/qlayoutengine_p.h"
+#include "private/qwidgetanimator_p.h"
#include "qdockarealayout_p.h"
#include "qtoolbararealayout_p.h"
@@ -89,7 +91,6 @@ typedef const struct __CFString * CFStringRef;
QT_BEGIN_NAMESPACE
class QToolBar;
-class QWidgetAnimator;
class QRubberBand;
/* This data structure represents the state of all the tool-bars and dock-widgets. It's value based
@@ -278,12 +279,12 @@ public:
// animations
- QWidgetAnimator *widgetAnimator;
+ QWidgetAnimator widgetAnimator;
QList<int> currentGapPos;
QRect currentGapRect;
QWidget *pluggingWidget;
#ifndef QT_NO_RUBBERBAND
- QRubberBand *gapIndicator;
+ QRubberBand gapIndicator;
#endif
QList<int> hover(QLayoutItem *widgetItem, const QPoint &mousePos);
@@ -295,10 +296,10 @@ public:
void applyState(QMainWindowLayoutState &newState, bool animate = true);
void restore(bool keepSavedState = false);
void updateHIToolBarStatus();
-
-private slots:
void animationFinished(QWidget *widget);
void allAnimationsFinished();
+
+private slots:
#ifndef QT_NO_DOCKWIDGET
#ifndef QT_NO_TABBAR
void tabChanged();
diff --git a/src/gui/widgets/qtoolbararealayout.cpp b/src/gui/widgets/qtoolbararealayout.cpp
index db2afd6..0c11700 100644
--- a/src/gui/widgets/qtoolbararealayout.cpp
+++ b/src/gui/widgets/qtoolbararealayout.cpp
@@ -932,7 +932,7 @@ void QToolBarAreaLayout::apply(bool animate)
if (visible && dock.o == Qt::Horizontal)
geo = QStyle::visualRect(dir, line.rect, geo);
- layout->widgetAnimator->animate(widget, geo, animate);
+ layout->widgetAnimator.animate(widget, geo, animate);
}
}
}
diff --git a/src/gui/widgets/qwidgetanimator.cpp b/src/gui/widgets/qwidgetanimator.cpp
index c67be4a..56b3f43 100644
--- a/src/gui/widgets/qwidgetanimator.cpp
+++ b/src/gui/widgets/qwidgetanimator.cpp
@@ -39,12 +39,8 @@
**
****************************************************************************/
-#include <QtCore/qtimer.h>
-#include <QtCore/qdatetime.h>
#include <QtGui/qwidget.h>
-#include <QtGui/qtextedit.h>
-#include <QtGui/private/qwidget_p.h>
-#include <qdebug.h>
+#include <QtGui/private/qmainwindowlayout_p.h>
#include "qwidgetanimator_p.h"
@@ -75,18 +71,12 @@ static inline int animateHelper(int start, int stop, int step, int steps)
return start + g_animate_function[x]*(stop - start)/1000;
}
-QWidgetAnimator::QWidgetAnimator(QObject *parent)
- : QObject(parent)
+QWidgetAnimator::QWidgetAnimator(QMainWindowLayout *layout) : m_mainWindowLayout(layout)
{
- m_time = new QTime();
- m_timer = new QTimer(this);
- m_timer->setInterval(g_animation_interval);
- connect(m_timer, SIGNAL(timeout()), this, SLOT(animationStep()));
}
QWidgetAnimator::~QWidgetAnimator()
{
- delete m_time;
}
void QWidgetAnimator::abort(QWidget *w)
@@ -94,8 +84,8 @@ void QWidgetAnimator::abort(QWidget *w)
if (m_animation_map.remove(w) == 0)
return;
if (m_animation_map.isEmpty()) {
- m_timer->stop();
- emit finishedAll();
+ m_timer.stop();
+ m_mainWindowLayout->allAnimationsFinished();
}
}
@@ -107,32 +97,21 @@ void QWidgetAnimator::animate(QWidget *widget, const QRect &_final_geometry, boo
if (r.right() < 0 || r.bottom() < 0)
r = QRect();
- if (r.isNull() || final_geometry.isNull())
+ if (r.isNull() || final_geometry.isNull() || r == final_geometry)
animate = false;
AnimationMap::const_iterator it = m_animation_map.constFind(widget);
- if (it == m_animation_map.constEnd()) {
- if (r == final_geometry) {
- emit finished(widget);
- return;
- }
- } else {
- if ((*it).r2 == final_geometry)
- return;
- }
+ if (it != m_animation_map.constEnd() && (*it).r2 == final_geometry)
+ return;
if (animate) {
AnimationItem item(widget, r, final_geometry);
m_animation_map[widget] = item;
- if (!m_timer->isActive()) {
- m_timer->start();
- m_time->start();
+ if (!m_timer.isActive()) {
+ m_timer.start(g_animation_interval, this);
+ m_time.start();
}
} else {
- m_animation_map.remove(widget);
- if (m_animation_map.isEmpty())
- m_timer->stop();
-
if (!final_geometry.isValid() && !widget->isWindow()) {
// Make the wigdet go away by sending it to negative space
QSize s = widget->size();
@@ -140,18 +119,19 @@ void QWidgetAnimator::animate(QWidget *widget, const QRect &_final_geometry, boo
}
widget->setGeometry(final_geometry);
- emit finished(widget);
-
- if (m_animation_map.isEmpty())
- emit finishedAll();
-
- return;
+ if (m_animation_map.remove(widget)) {
+ m_mainWindowLayout->animationFinished(widget);
+ if (m_animation_map.isEmpty()) {
+ m_timer.stop();
+ m_mainWindowLayout->allAnimationsFinished();
+ }
+ }
}
}
-void QWidgetAnimator::animationStep()
+void QWidgetAnimator::timerEvent(QTimerEvent *)
{
- int steps = (1 + m_time->restart())/g_animation_interval;
+ int steps = (1 + m_time.restart())/g_animation_interval;
AnimationMap::iterator it = m_animation_map.begin();
while (it != m_animation_map.end()) {
AnimationItem &item = *it;
@@ -159,35 +139,34 @@ void QWidgetAnimator::animationStep()
item.step = qMin(item.step + steps, g_animation_steps);
int x = animateHelper(item.r1.left(), item.r2.left(),
- item.step, g_animation_steps);
+ item.step, g_animation_steps);
int y = animateHelper(item.r1.top(), item.r2.top(),
- item.step, g_animation_steps);
+ item.step, g_animation_steps);
int w = animateHelper(item.r1.width(), item.r2.width(),
- item.step, g_animation_steps);
+ item.step, g_animation_steps);
int h = animateHelper(item.r1.height(), item.r2.height(),
- item.step, g_animation_steps);
+ item.step, g_animation_steps);
item.widget->setGeometry(x, y, w, h);
if (item.step == g_animation_steps) {
- emit finished(item.widget);
- AnimationMap::iterator tmp = it;
- ++it;
- m_animation_map.erase(tmp);
+ QWidget *widget = item.widget;
+ it = m_animation_map.erase(it);
+ m_mainWindowLayout->animationFinished(widget);
} else {
++it;
}
}
if (m_animation_map.isEmpty()) {
- m_timer->stop();
- emit finishedAll();
+ m_timer.stop();
+ m_mainWindowLayout->allAnimationsFinished();
}
}
bool QWidgetAnimator::animating() const
{
- return m_timer->isActive();
+ return m_timer.isActive();
}
bool QWidgetAnimator::animating(QWidget *widget)
diff --git a/src/gui/widgets/qwidgetanimator_p.h b/src/gui/widgets/qwidgetanimator_p.h
index 6ee150b..0c68e00 100644
--- a/src/gui/widgets/qwidgetanimator_p.h
+++ b/src/gui/widgets/qwidgetanimator_p.h
@@ -56,18 +56,18 @@
#include <qobject.h>
#include <qrect.h>
#include <qmap.h>
+#include <qbasictimer.h>
+#include <qdatetime.h>
QT_BEGIN_NAMESPACE
class QWidget;
-class QTimer;
-class QTime;
+class QMainWindowLayout;
class QWidgetAnimator : public QObject
{
- Q_OBJECT
public:
- QWidgetAnimator(QObject *parent = 0);
+ QWidgetAnimator(QMainWindowLayout *layout);
~QWidgetAnimator();
void animate(QWidget *widget, const QRect &final_geometry, bool animate);
bool animating() const;
@@ -75,12 +75,8 @@ public:
void abort(QWidget *widget);
-signals:
- void finished(QWidget *widget);
- void finishedAll();
-
-private slots:
- void animationStep();
+protected:
+ void timerEvent(QTimerEvent *e);
private:
struct AnimationItem {
@@ -93,8 +89,9 @@ private:
};
typedef QMap<QWidget*, AnimationItem> AnimationMap;
AnimationMap m_animation_map;
- QTimer *m_timer;
- QTime *m_time;
+ QBasicTimer m_timer;
+ QTime m_time;
+ QMainWindowLayout *m_mainWindowLayout;
};
QT_END_NAMESPACE