[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdepim/akregator_port] akregator2/src: Use batch jobs for all mass flag changes.
From:       Frank Osterfeld <osterfeld () kde ! org>
Date:       2012-04-01 18:10:56
Message-ID: 20120401181056.7F5F9A60A9 () git ! kde ! org
[Download RAW message or body]

Git commit 9761319a5800f1eda279f14814cfed20f03bc8bd by Frank Osterfeld.
Committed on 01/04/2012 at 20:09.
Pushed by osterfeld into branch 'akregator_port'.

Use batch jobs for all mass flag changes.
Only send items that actually changes, otherwise the modify job seems to do nothing.

M  +36   -18   akregator2/src/mainwidget.cpp
M  +12   -1    akregator2/src/modifycommands.cpp

http://commits.kde.org/kdepim/9761319a5800f1eda279f14814cfed20f03bc8bd

diff --git a/akregator2/src/mainwidget.cpp b/akregator2/src/mainwidget.cpp
index c74d3e2..8c58d4e 100644
--- a/akregator2/src/mainwidget.cpp
+++ b/akregator2/src/mainwidget.cpp
@@ -923,46 +923,64 @@ void Akregator2::MainWidget::slotArticleToggleKeepFlag( bool )
             break;
     }
 
+
+    QList<Akonadi::Item> aitems;
+
+
     Q_FOREACH ( const KRss::Item& i, items )
     {
-        KRss::Item modifiedItem = i;
-        if ( allFlagsSet )
-            modifiedItem.setStatus( i.status() & ~KRss::Item::Important );
-        else
-            modifiedItem.setStatus( i.status() | KRss::Item::Important );
-
-        Akonadi::ItemModifyJob* job = new Akonadi::ItemModifyJob( \
                modifiedItem.akonadiItem(), m_session );
-        connect( job, SIGNAL(finished(KJob*)), this, SLOT(slotJobFinished(KJob*)) );
-        job->setIgnorePayload( true );
-        job->start();
+        if ( !allFlagsSet && !i.isImportant() ) {
+            Akonadi::Item modifiedItem( i.id() );
+            KRss::Item::setStatus( modifiedItem, i.status() | KRss::Item::Important \
); +            aitems.append( modifiedItem );
+        } else if ( allFlagsSet && i.isImportant() ) {
+            Akonadi::Item modifiedItem( i.id() );
+            KRss::Item::setStatus( modifiedItem, i.status() & ~KRss::Item::Important \
); +            aitems.append( modifiedItem );
+        }
     }
+
+    Akonadi::ItemModifyJob* job = new Akonadi::ItemModifyJob( aitems, m_session );
+    connect( job, SIGNAL(finished(KJob*)), this, SLOT(slotJobFinished(KJob*)) );
+    job->setIgnorePayload( true );
+    job->start();
+
 }
 
 namespace {
 
 static void setSelectedArticleStatus( Akonadi::Session* session, QObject* rec, const \
Akregator2::AbstractSelectionController* controller, Akregator2::ArticleStatus status \
)  {
-    const QList<KRss::Item> items = controller->selectedItems();
+    QList<KRss::Item> items = controller->selectedItems();
 
     if (items.isEmpty())
         return;
 
+    QList<Akonadi::Item> aitems;
+
     Q_FOREACH ( const KRss::Item& i, items )
     {
-        KRss::Item modifiedItem = i;
+        Akonadi::Item aitem( i.akonadiItem().id() );
         switch ( status ) {
         case Akregator2::Read:
-            modifiedItem.setStatus( i.status() & ~KRss::Item::Unread );
+            if ( !i.isRead() ) {
+                KRss::Item::setStatus( aitem, i.status() & ~KRss::Item::Unread );
+                aitems.append( aitem );
+            }
             break;
         case Akregator2::Unread:
-            modifiedItem.setStatus( i.status() | KRss::Item::Unread );
+            if ( i.isRead() ) {
+                KRss::Item::setStatus( aitem, i.status() | KRss::Item::Unread );
+                aitems.append( aitem );
+            }
             break;
         }
-        Akonadi::ItemModifyJob* job = new Akonadi::ItemModifyJob( \
                modifiedItem.akonadiItem(), session );
-        rec->connect( job, SIGNAL(finished(KJob*)), rec, \
                SLOT(slotJobFinished(KJob*)) );
-        job->setIgnorePayload( true );
-        job->start();
     }
+
+    Akonadi::ItemModifyJob* job = new Akonadi::ItemModifyJob( aitems, session );
+    rec->connect( job, SIGNAL(finished(KJob*)), rec, SLOT(slotJobFinished(KJob*)) );
+    job->setIgnorePayload( true );
+    job->start();
 }
 
 }
diff --git a/akregator2/src/modifycommands.cpp b/akregator2/src/modifycommands.cpp
index f49faa0..4e0bbca 100644
--- a/akregator2/src/modifycommands.cpp
+++ b/akregator2/src/modifycommands.cpp
@@ -26,6 +26,7 @@
 
 #include <krss/feedcollection.h>
 #include <krss/item.h>
+#include <KRss/RssItem>
 
 #include <Akonadi/Collection>
 #include <Akonadi/CollectionFetchJob>
@@ -38,6 +39,8 @@
 
 #include <QPointer>
 
+#include <algorithm>
+
 using namespace Akonadi;
 using namespace Akregator2;
 
@@ -109,7 +112,12 @@ void MarkAsReadCommand::collectionsFetched( KJob* j ) {
     }
 }
 
-#include <QDebug>
+struct ItemIsRead {
+    bool operator()( const Akonadi::Item& item ) const {
+        return !KRss::RssItem::isUnread( item );
+    }
+};
+
 
 void MarkAsReadCommand::itemsFetched( KJob* j ) {
     --d->pendingFetches;
@@ -122,11 +130,14 @@ void MarkAsReadCommand::itemsFetched( KJob* j ) {
         const ItemFetchJob * const fjob = qobject_cast<const ItemFetchJob*>( j );
         Q_ASSERT( fjob );
         Akonadi::Item::List items = fjob->items();
+
+        items.erase( std::remove_if( items.begin(), items.end(), ItemIsRead() ), \
items.end() );  if ( !items.isEmpty() ) {
             Akonadi::Item::List::Iterator it = items.begin();
             for ( ; it != items.end(); ++it )
                 KRss::Item::setStatus( *it, KRss::Item::status( *it ) & \
~KRss::Item::Unread );  ItemModifyJob* mjob = new ItemModifyJob( items, d->session );
+            mjob->setIgnorePayload( true );
             connect( mjob, SIGNAL(finished(KJob*)), this, SLOT(itemsModified(KJob*)) \
);  ++d->pendingModifies;
             mjob->start();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic