From d1c672237288068a5e3777d16277221912bc0088 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Tue, 6 Nov 2012 22:37:56 -0600 Subject: Add ability to set progressbar orientation --- src/kernel/qstyle.cpp | 6 +++ src/styles/qcommonstyle.cpp | 3 +- src/widgets/qprogressbar.cpp | 116 ++++++++++++++++++++++++++++++++----------- src/widgets/qprogressbar.h | 8 +++ 4 files changed, 102 insertions(+), 31 deletions(-) diff --git a/src/kernel/qstyle.cpp b/src/kernel/qstyle.cpp index 843027d..4e689c2 100644 --- a/src/kernel/qstyle.cpp +++ b/src/kernel/qstyle.cpp @@ -2606,6 +2606,12 @@ QPixmap QStyle::stylePixmap(StylePixmap sp, const QWidget *w, const QStyleOption QStyleControlElementData::QStyleControlElementData() { activePainter = 0; + tickMarkSetting = 0; + comboBoxLineEditFlags = 0; + frameStyle = 0; + comboBoxListBoxFlags = 0; + parentWidgetFlags = 0; + topLevelWidgetFlags = 0; } #endif // QT_NO_STYLE diff --git a/src/styles/qcommonstyle.cpp b/src/styles/qcommonstyle.cpp index 2052ef1..a0e64d0 100644 --- a/src/styles/qcommonstyle.cpp +++ b/src/styles/qcommonstyle.cpp @@ -159,7 +159,7 @@ QStringList getObjectTypeListForObject(const QObject* object) { } QStyle::ControlElementFlags getControlElementFlagsForObject(const QObject* object, QStringList objectTypeList, const QStyleOption& opt, bool populateReliantFields) { - QStyle::ControlElementFlags cef = (QStyle::ControlElementFlags)0; + QStyle::ControlElementFlags cef = QStyle::CEF_None; if (object) { if (objectTypeList.contains("QPushButton")) { @@ -405,6 +405,7 @@ QStyleControlElementData populateControlElementDataFromWidget(const QWidget* wid ceData.totalSteps = pb->totalSteps(); ceData.progressText = pb->progressString(); ceData.percentageVisible = pb->percentageVisible(); + ceData.orientation = pb->orientation(); } } if (ceData.widgetObjectTypes.contains("QHeader")) { diff --git a/src/widgets/qprogressbar.cpp b/src/widgets/qprogressbar.cpp index 3d0f403..d5011da 100644 --- a/src/widgets/qprogressbar.cpp +++ b/src/widgets/qprogressbar.cpp @@ -44,6 +44,7 @@ #include "qdrawutil.h" #include "qpixmap.h" #include "qstyle.h" +#include "qwmatrix.h" #include "../kernel/qinternal_p.h" #if defined(QT_ACCESSIBILITY_SUPPORT) #include "qaccessible.h" @@ -102,7 +103,8 @@ QProgressBar::QProgressBar( QWidget *parent, const char *name, WFlags f ) center_indicator( TRUE ), auto_indicator( TRUE ), percentage_visible( TRUE ), - d( 0 ) + d( 0 ), + m_orientation( Horizontal ) { setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); initFrame(); @@ -133,7 +135,8 @@ QProgressBar::QProgressBar( int totalSteps, center_indicator( TRUE ), auto_indicator( TRUE ), percentage_visible( TRUE ), - d( 0 ) + d( 0 ), + m_orientation( Horizontal ) { setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); initFrame(); @@ -234,9 +237,15 @@ QSize QProgressBar::sizeHint() const constPolish(); QFontMetrics fm = fontMetrics(); int cw = style().pixelMetric(QStyle::PM_ProgressBarChunkWidth, this); - return style().sizeFromContents(QStyle::CT_ProgressBar, this, + QSize sh = style().sizeFromContents(QStyle::CT_ProgressBar, this, QSize( cw * 7 + fm.width( '0' ) * 4, fm.height() + 8)); + if (m_orientation == Qt::Horizontal) { + return sh; + } + else { + return QSize(sh.height(), sh.width()); + } } @@ -321,6 +330,22 @@ void QProgressBar::styleChange( QStyle& old ) QFrame::styleChange( old ); } +Qt::Orientation QProgressBar::orientation() const +{ + return m_orientation; +} + +void QProgressBar::setOrientation(Orientation orient) +{ + m_orientation = orient; + if (m_orientation == Qt::Horizontal) { + setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + } + else { + setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding ) ); + } +} + /*! This method is called to generate the text displayed in the center @@ -371,40 +396,71 @@ bool QProgressBar::setIndicator( QString & indicator, int progress, */ void QProgressBar::drawContents( QPainter *p ) { - const QRect bar = contentsRect(); + const QRect bar = contentsRect(); + + QSharedDoubleBuffer buffer( p, bar.x(), bar.y(), bar.width(), bar.height() ); + + QPoint pn = backgroundOffset(); + buffer.painter()->setBrushOrigin( -pn.x(), -pn.y() ); + + const QPixmap *bpm = paletteBackgroundPixmap(); + if ( bpm ) { + buffer.painter()->fillRect( bar, QBrush( paletteBackgroundColor(), *bpm ) ); + } + else { + buffer.painter()->fillRect( bar, paletteBackgroundColor() ); + } + buffer.painter()->setFont( p->font() ); - QSharedDoubleBuffer buffer( p, bar.x(), bar.y(), bar.width(), bar.height() ); + QStyle::SFlags flags = QStyle::Style_Default; + if (isEnabled()) { + flags |= QStyle::Style_Enabled; + } + if (hasFocus()) { + flags |= QStyle::Style_HasFocus; + } + if (hasMouse()) { + flags |= QStyle::Style_MouseOver; + } - QPoint pn = backgroundOffset(); - buffer.painter()->setBrushOrigin( -pn.x(), -pn.y() ); + style().drawControl(QStyle::CE_ProgressBarGroove, buffer.painter(), this, + QStyle::visualRect(style().subRect(QStyle::SR_ProgressBarGroove, this), this ), + colorGroup(), flags); - const QPixmap *bpm = paletteBackgroundPixmap(); - if ( bpm ) - buffer.painter()->fillRect( bar, QBrush( paletteBackgroundColor(), *bpm ) ); - else - buffer.painter()->fillRect( bar, paletteBackgroundColor() ); - buffer.painter()->setFont( p->font() ); + QWMatrix oldMatrix = buffer.painter()->worldMatrix(); - QStyle::SFlags flags = QStyle::Style_Default; - if (isEnabled()) - flags |= QStyle::Style_Enabled; - if (hasFocus()) - flags |= QStyle::Style_HasFocus; - if (hasMouse()) - flags |= QStyle::Style_MouseOver; + QStyleControlElementData ceData = populateControlElementDataFromWidget(this, QStyleOption()); + QStyle::ControlElementFlags elementFlags = getControlElementFlagsForObject(this, ceData.widgetObjectTypes, QStyleOption()); - style().drawControl(QStyle::CE_ProgressBarGroove, buffer.painter(), this, - QStyle::visualRect(style().subRect(QStyle::SR_ProgressBarGroove, this), this ), - colorGroup(), flags); + // Draw contents + if (m_orientation == Qt::Vertical) { + // If oriented vertically, apply a 90 degree rotation matrix to the painter + QWMatrix m; - style().drawControl(QStyle::CE_ProgressBarContents, buffer.painter(), this, - QStyle::visualRect(style().subRect(QStyle::SR_ProgressBarContents, this), this ), - colorGroup(), flags); +// // Upside down +// m.rotate(90.0); +// m.translate(0, (bar.width())*(-1.0)); + + // Right side up + m.rotate(-90.0); + m.translate((bar.height())*(-1.0), 0); - if (percentageVisible()) - style().drawControl(QStyle::CE_ProgressBarLabel, buffer.painter(), this, - QStyle::visualRect(style().subRect(QStyle::SR_ProgressBarLabel, this), this ), - colorGroup(), flags); + buffer.painter()->setWorldMatrix(m, TRUE); + + ceData.rect = QRect(ceData.rect.y(), ceData.rect.x(), ceData.rect.height(), ceData.rect.width()); + } + + style().drawControl(QStyle::CE_ProgressBarContents, buffer.painter(), ceData, elementFlags, + QStyle::visualRect(style().subRect(QStyle::SR_ProgressBarContents, ceData, elementFlags, this), ceData, elementFlags), + colorGroup(), flags, QStyleOption(), this); + + buffer.painter()->setWorldMatrix(oldMatrix, TRUE); + + if (percentageVisible()) { + style().drawControl(QStyle::CE_ProgressBarLabel, buffer.painter(), this, + QStyle::visualRect(style().subRect(QStyle::SR_ProgressBarLabel, this), this ), + colorGroup(), flags); + } } #endif diff --git a/src/widgets/qprogressbar.h b/src/widgets/qprogressbar.h index 2c4f039..ac69914 100644 --- a/src/widgets/qprogressbar.h +++ b/src/widgets/qprogressbar.h @@ -60,6 +60,7 @@ class Q_EXPORT QProgressBar : public QFrame Q_PROPERTY( bool centerIndicator READ centerIndicator WRITE setCenterIndicator ) Q_PROPERTY( bool indicatorFollowsStyle READ indicatorFollowsStyle WRITE setIndicatorFollowsStyle ) Q_PROPERTY( bool percentageVisible READ percentageVisible WRITE setPercentageVisible ) + Q_PROPERTY( Orientation orientation READ orientation WRITE setOrientation ) public: QProgressBar( QWidget* parent=0, const char* name=0, WFlags f=0 ); @@ -111,6 +112,13 @@ private: // Disabled copy constructor and operator= QProgressBar( const QProgressBar & ); QProgressBar &operator=( const QProgressBar & ); #endif + +public: + virtual void setOrientation ( Orientation ); + Orientation orientation () const; + +private: + Orientation m_orientation; }; -- cgit v1.2.1