diff --git a/src/modules/plasmalnf/ThemeInfo.cpp b/src/modules/plasmalnf/ThemeInfo.cpp index f3f2a192a..2999a7cac 100644 --- a/src/modules/plasmalnf/ThemeInfo.cpp +++ b/src/modules/plasmalnf/ThemeInfo.cpp @@ -65,10 +65,11 @@ ThemesModel::roleNames() const void ThemesModel::setThemeImage( const QString& id, const QString& imagePath ) { - auto* theme = m_themes.findById( id ); + auto [ i, theme ] = m_themes.indexById( id ); if ( theme ) { theme->imagePath = imagePath; + emit dataChanged( index( i, 0 ), index( i, 0 ), { ImageRole } ); } } @@ -80,9 +81,13 @@ ThemesModel::setThemeImage( const QMap< QString, QString >& images ) return; } - for ( const auto& k : images ) + // Don't emit signals from each call, aggregate to one call (below this block) { - setThemeImage( k, images[ k ] ); + QSignalBlocker b( this ); + for ( const auto& k : images ) + { + setThemeImage( k, images[ k ] ); + } } emit dataChanged( index( 0, 0 ), index( m_themes.count() - 1 ), { ImageRole } ); } @@ -90,10 +95,11 @@ ThemesModel::setThemeImage( const QMap< QString, QString >& images ) void ThemesModel::showTheme( const QString& id, bool show ) { - auto* theme = m_themes.findById( id ); + auto [ i, theme ] = m_themes.indexById( id ); if ( theme ) { theme->show = show; + emit dataChanged( index( i, 0 ), index( i, 0 ), { ShownRole } ); } } @@ -105,6 +111,8 @@ ThemesModel::showOnlyThemes( const QMap< QString, QString >& onlyThese ) return; } + // No signal blocker block needed here because we're not calling showTheme() + // QSignalBlocker b( this ); for ( auto& t : m_themes ) { t.show = onlyThese.contains( t.id ); diff --git a/src/modules/plasmalnf/ThemeInfo.h b/src/modules/plasmalnf/ThemeInfo.h index 34c26dc6f..059858617 100644 --- a/src/modules/plasmalnf/ThemeInfo.h +++ b/src/modules/plasmalnf/ThemeInfo.h @@ -52,10 +52,10 @@ struct ThemeInfo class ThemeInfoList : public QList< ThemeInfo > { public: - std::pair< int, ThemeInfo* > indexById( const QString& id ) + std::pair< int, const ThemeInfo* > indexById( const QString& id ) const { int index = 0; - for ( ThemeInfo& i : *this ) + for ( const ThemeInfo& i : *this ) { if ( i.id == id ) { @@ -65,31 +65,26 @@ public: return { -1, nullptr }; } + std::pair< int, ThemeInfo* > indexById( const QString& id ) + { + // Call the const version and then munge the types + auto [ i, p ] = const_cast< const ThemeInfoList* >( this )->indexById( id ); + return { i, const_cast< ThemeInfo* >( p ) }; + } + /** @brief Looks for a given @p id in the list of themes, returns nullptr if not found. */ ThemeInfo* findById( const QString& id ) { - for ( ThemeInfo& i : *this ) - { - if ( i.id == id ) - { - return &i; - } - } - return nullptr; + auto [ i, p ] = indexById( id ); + return p; } /** @brief Looks for a given @p id in the list of themes, returns nullptr if not found. */ const ThemeInfo* findById( const QString& id ) const { - for ( const ThemeInfo& i : *this ) - { - if ( i.id == id ) - { - return &i; - } - } - return nullptr; + auto [ i, p ] = indexById( id ); + return p; } /** @brief Checks if a given @p id is in the list of themes. */