From 905b0f8d082238aa2cc6d6b07d3b5d0575a144d2 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Mon, 25 May 2020 16:02:30 +1000 Subject: [PATCH] Speed up message bar operations when many messages are shown Avoid unnecessary calls to setStyleSheet, which is slow when many message bar items exists Refs #29698 --- python/gui/auto_generated/qgsmessagebaritem.sip.in | 1 + src/gui/qgsmessagebar.cpp | 8 +++++++- src/gui/qgsmessagebar.h | 1 + src/gui/qgsmessagebaritem.cpp | 10 +++++++--- src/gui/qgsmessagebaritem.h | 5 ++++- 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/python/gui/auto_generated/qgsmessagebaritem.sip.in b/python/gui/auto_generated/qgsmessagebaritem.sip.in index c49e19f1fce3..133452ec7c4b 100644 --- a/python/gui/auto_generated/qgsmessagebaritem.sip.in +++ b/python/gui/auto_generated/qgsmessagebaritem.sip.in @@ -96,6 +96,7 @@ has no effect. %End signals: + void styleChanged( const QString &styleSheet ); %Docstring emitted when the message level has changed diff --git a/src/gui/qgsmessagebar.cpp b/src/gui/qgsmessagebar.cpp index d0a7815d4098..36db1529d836 100644 --- a/src/gui/qgsmessagebar.cpp +++ b/src/gui/qgsmessagebar.cpp @@ -260,7 +260,13 @@ void QgsMessageBar::showItem( QgsMessageBarItem *item ) } connect( mCurrentItem, &QgsMessageBarItem::styleChanged, this, &QWidget::setStyleSheet ); - setStyleSheet( item->getStyleSheet() ); + + if ( item->level() != mPrevLevel ) + { + setStyleSheet( item->getStyleSheet() ); + mPrevLevel = item->level(); + } + show(); emit widgetAdded( item ); diff --git a/src/gui/qgsmessagebar.h b/src/gui/qgsmessagebar.h index f97488b890ef..79f2fbae514f 100644 --- a/src/gui/qgsmessagebar.h +++ b/src/gui/qgsmessagebar.h @@ -164,6 +164,7 @@ class GUI_EXPORT QgsMessageBar: public QFrame QTimer *mCountdownTimer = nullptr; QProgressBar *mCountProgress = nullptr; QString mCountStyleSheet; + Qgis::MessageLevel mPrevLevel = Qgis::MessageLevel::None; private slots: //! updates count of items in widget list diff --git a/src/gui/qgsmessagebaritem.cpp b/src/gui/qgsmessagebaritem.cpp index 8993426c9a32..8dc00ff36736 100644 --- a/src/gui/qgsmessagebaritem.cpp +++ b/src/gui/qgsmessagebaritem.cpp @@ -220,9 +220,13 @@ QString QgsMessageBarItem::title() const QgsMessageBarItem *QgsMessageBarItem::setLevel( Qgis::MessageLevel level ) { - mLevel = level; - writeContent(); - emit styleChanged( mStyleSheet ); + if ( level != mLevel ) + { + mLevel = level; + writeContent(); + emit styleChanged( mStyleSheet ); + } + return this; } diff --git a/src/gui/qgsmessagebaritem.h b/src/gui/qgsmessagebaritem.h index b7d238fc2dfe..d6b117377207 100644 --- a/src/gui/qgsmessagebaritem.h +++ b/src/gui/qgsmessagebaritem.h @@ -104,7 +104,10 @@ class GUI_EXPORT QgsMessageBarItem : public QWidget void dismiss(); signals: - //! emitted when the message level has changed + + /** + * emitted when the message level has changed + */ void styleChanged( const QString &styleSheet ); private slots: