[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