From 0ace3112137b78cf7d150e9974e69ccfe6838533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=80lex=20Fiestas?= Date: Mon, 17 Jun 2013 11:21:32 +0200 Subject: Added SH_Widget_Animate in QStyle Added SH_Widget_Animate in QStyle styleHint, and use it to determine whether widgets should be animated or not. In this patch QTabBar, QColumnView,QTreeView and QWidgetAnimator are patched to obey the new Hint. Change-Id: Iefdbddc52c7843f6653dbfb5462125942489b4d9 Reviewed-by: Olivier Goffart --- src/widgets/itemviews/qcolumnview.cpp | 11 +++++++---- src/widgets/itemviews/qtreeview.cpp | 1 + src/widgets/styles/qcommonstyle.cpp | 11 +++++++++++ src/widgets/styles/qstyle.cpp | 4 ++++ src/widgets/styles/qstyle.h | 1 + src/widgets/widgets/qtabbar_p.h | 5 +++++ src/widgets/widgets/qwidgetanimator.cpp | 28 ++++++++++++++++------------ 7 files changed, 45 insertions(+), 16 deletions(-) diff --git a/src/widgets/itemviews/qcolumnview.cpp b/src/widgets/itemviews/qcolumnview.cpp index 5aee78fab4..32a3dddca1 100644 --- a/src/widgets/itemviews/qcolumnview.cpp +++ b/src/widgets/itemviews/qcolumnview.cpp @@ -332,11 +332,14 @@ void QColumnView::scrollTo(const QModelIndex &index, ScrollHint hint) } #ifndef QT_NO_ANIMATION - d->currentAnimation.setEndValue(newScrollbarValue); - d->currentAnimation.start(); -#else - horizontalScrollBar()->setValue(newScrollbarValue); + if (style()->styleHint(QStyle::SH_Widget_Animate, 0, this)) { + d->currentAnimation.setEndValue(newScrollbarValue); + d->currentAnimation.start(); + } else #endif //QT_NO_ANIMATION + { + horizontalScrollBar()->setValue(newScrollbarValue); + } } /*! diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp index 38f0aa6a9e..bbbfb817f0 100644 --- a/src/widgets/itemviews/qtreeview.cpp +++ b/src/widgets/itemviews/qtreeview.cpp @@ -2986,6 +2986,7 @@ void QTreeViewPrivate::initialize() header->setDefaultAlignment(Qt::AlignLeft|Qt::AlignVCenter); q->setHeader(header); #ifndef QT_NO_ANIMATION + animationsEnabled = q->style()->styleHint(QStyle::SH_Widget_Animate, 0, q); QObject::connect(&animatedOperation, SIGNAL(finished()), q, SLOT(_q_endAnimatedOperation())); #endif //QT_NO_ANIMATION } diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp index 262275611c..f5b61ea6f3 100644 --- a/src/widgets/styles/qcommonstyle.cpp +++ b/src/widgets/styles/qcommonstyle.cpp @@ -65,6 +65,7 @@ #include #include #include +#include "qtreeview.h" #include #include #include @@ -5113,6 +5114,16 @@ int QCommonStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget ret = 2000; break; #endif + case SH_Widget_Animate: +#ifndef QT_NO_TREEVIEW + if (qobject_cast(widget)) { + ret = false; + } else +#endif + { + ret = true; + } + break; default: ret = 0; break; diff --git a/src/widgets/styles/qstyle.cpp b/src/widgets/styles/qstyle.cpp index 826a05db51..8d8eb3aa46 100644 --- a/src/widgets/styles/qstyle.cpp +++ b/src/widgets/styles/qstyle.cpp @@ -1900,6 +1900,10 @@ void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment, a tooltip is shown (notice: shown, not hidden). When a new wake isn't needed, a user-requested tooltip will be shown nearly instantly. + \value SH_Widget_Animate Determines if the widget should show animations or not, for example + a transition between checked and unchecked statuses in a checkbox. + This enum value has been introduced in Qt 5.2. + \sa styleHint() */ diff --git a/src/widgets/styles/qstyle.h b/src/widgets/styles/qstyle.h index d4e1be4787..fffd423c8a 100644 --- a/src/widgets/styles/qstyle.h +++ b/src/widgets/styles/qstyle.h @@ -700,6 +700,7 @@ public: SH_Menu_SupportsSections, SH_ToolTip_WakeUpDelay, SH_ToolTip_FallAsleepDelay, + SH_Widget_Animate, // Add new style hint values here SH_CustomBase = 0xf0000000 diff --git a/src/widgets/widgets/qtabbar_p.h b/src/widgets/widgets/qtabbar_p.h index 7468144146..8c6e70b8d7 100644 --- a/src/widgets/widgets/qtabbar_p.h +++ b/src/widgets/widgets/qtabbar_p.h @@ -138,6 +138,10 @@ public: } *animation; void startAnimation(QTabBarPrivate *priv, int duration) { + if (!priv->isAnimated()) { + priv->moveTabFinished(priv->tabList.indexOf(*this)); + return; + } if (!animation) animation = new TabBarAnimation(this, priv); animation->setStartValue(dragOffset); @@ -162,6 +166,7 @@ public: int indexAtPos(const QPoint &p) const; + inline bool isAnimated() const { Q_Q(const QTabBar); return q->style()->styleHint(QStyle::SH_Widget_Animate, 0, q); } inline bool validIndex(int index) const { return index >= 0 && index < tabList.count(); } void setCurrentNextEnabledIndex(int offset); diff --git a/src/widgets/widgets/qwidgetanimator.cpp b/src/widgets/widgets/qwidgetanimator.cpp index bbd96ca29a..1209ade536 100644 --- a/src/widgets/widgets/qwidgetanimator.cpp +++ b/src/widgets/widgets/qwidgetanimator.cpp @@ -91,24 +91,28 @@ void QWidgetAnimator::animate(QWidget *widget, const QRect &_final_geometry, boo QRect(QPoint(-500 - widget->width(), -500 - widget->height()), widget->size()); #ifndef QT_NO_ANIMATION - AnimationMap::const_iterator it = m_animation_map.constFind(widget); - if (it != m_animation_map.constEnd() && (*it)->endValue().toRect() == final_geometry) - return; + //If the QStyle has animations, animate + if (widget->style()->styleHint(QStyle::SH_Widget_Animate, 0, widget)) { + AnimationMap::const_iterator it = m_animation_map.constFind(widget); + if (it != m_animation_map.constEnd() && (*it)->endValue().toRect() == final_geometry) + return; - QPropertyAnimation *anim = new QPropertyAnimation(widget, "geometry", widget); - anim->setDuration(animate ? 200 : 0); - anim->setEasingCurve(QEasingCurve::InOutQuad); - anim->setEndValue(final_geometry); - m_animation_map[widget] = anim; - connect(anim, SIGNAL(finished()), SLOT(animationFinished())); - anim->start(QPropertyAnimation::DeleteWhenStopped); -#else + QPropertyAnimation *anim = new QPropertyAnimation(widget, "geometry", widget); + anim->setDuration(animate ? 200 : 0); + anim->setEasingCurve(QEasingCurve::InOutQuad); + anim->setEndValue(final_geometry); + m_animation_map[widget] = anim; + connect(anim, SIGNAL(finished()), SLOT(animationFinished())); + anim->start(QPropertyAnimation::DeleteWhenStopped); + } else +#endif //QT_NO_ANIMATION + { //we do it in one shot widget->setGeometry(final_geometry); #ifndef QT_NO_MAINWINDOW m_mainWindowLayout->animationFinished(widget); #endif //QT_NO_MAINWINDOW -#endif //QT_NO_ANIMATION + } } bool QWidgetAnimator::animating() const -- cgit v1.2.3