OSDN Git Service

[plasmalnf] Signal more changes to the model
authorAdriaan de Groot <groot@kde.org>
Tue, 17 Nov 2020 10:17:47 +0000 (11:17 +0100)
committerAdriaan de Groot <groot@kde.org>
Tue, 17 Nov 2020 10:17:47 +0000 (11:17 +0100)
- also individual changes need to be signalled
- use QSignalBlocker to avoid spamming changes when calling
  aggregate change methods
- refactor findById() so that also a row number can be
  obtained, which is needed for the change signals.

src/modules/plasmalnf/ThemeInfo.cpp
src/modules/plasmalnf/ThemeInfo.h

index f3f2a19..2999a7c 100644 (file)
@@ -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 );
index 34c26dc..0598586 100644 (file)
@@ -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. */