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

List:       kde-commits
Subject:    KDE/kdepimlibs/akonadi/kmime
From:       Andras Mantia <amantia () kde ! org>
Date:       2010-09-20 12:56:48
Message-ID: 20100920130206.B06E9AC876 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1177528 by amantia:

Support message mark toggling. 
BUG: 249716

 M  +19 -3     markascommand.cpp  
 M  +3 -2      markascommand_p.h  
 M  +65 -2     standardmailactionmanager.cpp  


--- trunk/KDE/kdepimlibs/akonadi/kmime/markascommand.cpp #1177527:1177528
@@ -24,15 +24,17 @@
 #include <akonadi/itemfetchscope.h>
 #include <akonadi/itemmodifyjob.h>
 
-MarkAsCommand::MarkAsCommand( const Akonadi::MessageStatus& targetStatus, const \
Akonadi::Item::List& msgList, QObject* parent): CommandBase( parent ) \
+MarkAsCommand::MarkAsCommand( const Akonadi::MessageStatus& targetStatus, const \
Akonadi::Item::List& msgList, bool invert, QObject* parent): CommandBase( parent )  {
+  mInvertMark = invert;
   mMessages = msgList;
   mTargetStatus = targetStatus;
   mFolderListJobCount = 0;
 }
 
-MarkAsCommand::MarkAsCommand(const Akonadi::MessageStatus &targetStatus, const \
Akonadi::Collection::List& folders, QObject* parent): CommandBase( parent ) \
+MarkAsCommand::MarkAsCommand(const Akonadi::MessageStatus &targetStatus, const \
Akonadi::Collection::List& folders, bool invert, QObject* parent): CommandBase( \
parent )  {
+  mInvertMark = invert;
   mFolders = folders;
   mTargetStatus = targetStatus;
   mFolderListJobCount = mFolders.size();  
@@ -55,6 +57,11 @@
   foreach( const Akonadi::Item &item, fjob->items() ) {
     Akonadi::MessageStatus status;
     status.setStatusFromFlags( item.flags() );
+    if ( mInvertMark ) {
+      if ( status & mTargetStatus ) {
+        mMessages.append( item );
+      }      
+    } else 
     if (! (status & mTargetStatus) )
     {
       mMessages.append( item );
@@ -106,7 +113,17 @@
     Akonadi::MessageStatus itemStatus;
     itemStatus.setStatusFromFlags( it.flags() );
 
+    if ( mInvertMark ) {
+      
+      if ( mTargetStatus & Akonadi::MessageStatus::statusRead() ) {
+        itemStatus.setUnread();
+      } else if ( mTargetStatus & Akonadi::MessageStatus::statusUnread() ) {
+        itemStatus.setRead();
+      } else
+        itemStatus.toggle( mTargetStatus );
+    } else {
     itemStatus.set( mTargetStatus );
+    }
       /*if ( itemStatus != oldStatus )*/ {
       item.setFlags( itemStatus.statusFlags() );
       // Store back modified item
@@ -126,7 +143,6 @@
     emitResult( Failed );
   }
   if ( mMarkJobCount == 0 && mFolderListJobCount == 0 ) {
-    qDebug() << "MARK ALL AS DONE";
     emitResult( OK );
   }
 }
--- trunk/KDE/kdepimlibs/akonadi/kmime/markascommand_p.h #1177527:1177528
@@ -33,8 +33,8 @@
 {
   Q_OBJECT
 public:
-  MarkAsCommand( const Akonadi::MessageStatus& targetStatus, const \
                Akonadi::Item::List & msgList, QObject* parent = 0 );
-  MarkAsCommand( const Akonadi::MessageStatus& targetStatus, const \
Akonadi::Collection::List& folders, QObject* parent = 0 ); +  MarkAsCommand( const \
Akonadi::MessageStatus& targetStatus, const Akonadi::Item::List & msgList, bool \
invert = false, QObject* parent = 0 ); +  MarkAsCommand( const \
Akonadi::MessageStatus& targetStatus, const Akonadi::Collection::List& folders, bool \
invert = false, QObject* parent = 0 );  void execute();
 
 private Q_SLOTS:
@@ -49,6 +49,7 @@
   Akonadi::MessageStatus mTargetStatus;
   int mMarkJobCount;
   int mFolderListJobCount;
+  int mInvertMark;
 };
 
 #endif // MARKASCOMMAND_H
--- trunk/KDE/kdepimlibs/akonadi/kmime/standardmailactionmanager.cpp #1177527:1177528
@@ -180,10 +180,63 @@
 
     void updateActions()
     {
-      //TODO
+      if ( !mItemSelectionModel ||  mItemSelectionModel->selectedIndexes().isEmpty() \
) +        return;
+
+      bool allMarkedAsImportant = true;
+      bool allMarkedAsRead = true;
+      bool allMarkedAsActionItem = true;
+
+      Q_FOREACH( QModelIndex index, mItemSelectionModel->selectedRows() ) {
+        const Item item = index.data( EntityTreeModel::ItemRole ).value<Item>();
+        Akonadi::MessageStatus status;
+        status.setStatusFromFlags( item.flags() );
+        if ( !status.isImportant() )
+          allMarkedAsImportant = false;
+        if ( !status.isRead() )
+          allMarkedAsRead= false;
+        if ( !status.isToAct() )
+          allMarkedAsActionItem = false;
+    }
+
+      QAction *action = mParent->action( \
Akonadi::StandardMailActionManager::MarkMailAsRead ); +      updateMarkAction( \
action, allMarkedAsRead); +      if ( allMarkedAsRead )
+         action->setText( i18n("&Mark Mail as Unread") );
+      else
+        action->setText( i18n("&Mark Mail as Read") );
+
+      action = mParent->action( \
Akonadi::StandardMailActionManager::MarkMailAsImportant ); +      updateMarkAction( \
action, allMarkedAsImportant ); +      if ( allMarkedAsImportant )
+        action->setText( i18n("Remove Important Mark") );
+      else
+        action->setText( i18n("&Mark Mail as Important") );
+
+      action = mParent->action( \
Akonadi::StandardMailActionManager::MarkMailAsActionItem ); +      updateMarkAction( \
action, allMarkedAsActionItem ); +      if ( allMarkedAsActionItem )
+        action->setText( i18n("Remove Action Item Mark") );
+      else
+        action->setText( i18n("&Mark Mail as Action Item") );
+   
       emit mParent->actionStateUpdated();
     }
 
+    void updateMarkAction( QAction* action, bool allMarked )
+    {
+      QByteArray data = action->data().toByteArray();
+      if ( allMarked ) {
+        if ( !data.startsWith( '!' ) )
+          data.prepend( '!' );
+      } else {
+        if ( data.startsWith( '!' ) )
+          data = data.mid( 1 );
+      }
+      action->setData( data );
+    }
+
+
     Collection selectedCollection() const
     {
       if ( !mCollectionSelectionModel )
@@ -233,6 +286,11 @@
       QByteArray typeStr = action->data().toByteArray();
       kDebug() << "Mark mail as: " << typeStr;
 
+      bool invert = false;
+      if ( typeStr.startsWith( '!' ) ) {
+        invert = true;
+        typeStr = typeStr.mid(1);
+      }
       StandardMailActionManager::Type type = MarkMailAsRead;
       if ( typeStr == "U" )
         type = MarkMailAsUnread;
@@ -260,7 +318,7 @@
       Akonadi::MessageStatus targetStatus;
       targetStatus.setStatusFromStr( QLatin1String( typeStr ) );
 
-      MarkAsCommand *command = new MarkAsCommand( targetStatus, items, mParent );
+      MarkAsCommand *command = new MarkAsCommand( targetStatus, items, invert, \
mParent );  command->execute();
     }
 
@@ -399,6 +457,11 @@
   connect( selectionModel, SIGNAL( selectionChanged( const QItemSelection&, const \
QItemSelection& ) ),  SLOT( updateActions() ) );
 
+  //to catch item modifications, listen to the model's dataChanged signal as well
+  connect( selectionModel->model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+           SLOT( updateActions() ) );
+
+
   d->updateActions();
 }
 


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

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