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

List:       kde-commits
Subject:    KDE/kdepim/mobile
From:       Tobias Koenig <tokoe () kde ! org>
Date:       2010-11-25 16:46:05
Message-ID: 20101125164605.42026AC8A2 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1200761 by tokoe:

Implement sorting for the following options:
 - by date/time
 - by date/time (most recent)
 - by sender/receiver
 - by subject
 - by size

Descending sorting seems to be bugyy right now, and
the comparison for smart sender/receiver doesn't work yet


 M  +48 -12    lib/threadgroupermodel.cpp  
 M  +9 -5      lib/threadgroupermodel.h  
 M  +28 -3     mail/mainview.cpp  
 M  +4 -0      mail/mainview.h  
 M  +4 -2      mail/messagelistsettingscontroller.cpp  
 M  +1 -1      mail/messagelistsettingscontroller.h  


--- trunk/KDE/kdepim/mobile/lib/threadgroupermodel.cpp #1200760:1200761
@@ -41,7 +41,7 @@
 {
   public:
     ThreadGrouperModelPrivate( ThreadGrouperModel *qq )
-      : q_ptr( qq ), m_order( ThreadGrouperModel::ThreadsWithNewRepliesOrder )
+      : q_ptr( qq ), m_sortingOption( ThreadGrouperModel::SortByDateTimeMostRecent )
     {
     }
 
@@ -60,7 +60,7 @@
     mutable QHash<QByteArray, QSet<QByteArray> > m_parentChildrenMap; // maps a \
thread leader item to all its descendant items  mutable QHash<QByteArray, \
Akonadi::Item> m_items;  
-    ThreadGrouperModel::OrderScheme m_order;
+    ThreadGrouperModel::SortingOption m_sortingOption;
 };
 
 static QByteArray identifierForMessage( const KMime::Message::Ptr &message, \
Akonadi::Item::Id id ) @@ -151,21 +151,55 @@
     const KMime::Message::Ptr leftThreadRootMessage = \
                leftThreadRootItem.payload<KMime::Message::Ptr>();
     const KMime::Message::Ptr rightThreadRootMessage = \
rightThreadRootItem.payload<KMime::Message::Ptr>();  
-    if ( m_grouper->m_order == ThreadGrouperModel::ThreadsWithNewRepliesOrder ) {
+    switch ( m_grouper->m_sortingOption ) {
+      case ThreadGrouperModel::SortByDateTime:
+        {
+          const KDateTime leftThreadRootDateTime = \
leftThreadRootMessage->date()->dateTime(); +          const KDateTime \
rightThreadRootDateTime = rightThreadRootMessage->date()->dateTime(); +          if ( \
leftThreadRootDateTime != rightThreadRootDateTime ) { +            return \
leftThreadRootDateTime > rightThreadRootDateTime; +          }
+        }
+        break;
+      case ThreadGrouperModel::SortByDateTimeMostRecent:
+        {
       const KDateTime leftNewest = m_grouper->getMostRecentUpdate( \
                leftThreadRootMessage, leftThreadRootItem.id() );
       const KDateTime rightNewest = m_grouper->getMostRecentUpdate( \
rightThreadRootMessage, rightThreadRootItem.id() );  
       if ( leftNewest != rightNewest ) {
         return leftNewest > rightNewest;
       }
-    } else {
-      const KDateTime leftThreadRootDateTime = \
                leftThreadRootMessage->date()->dateTime();
-      const KDateTime rightThreadRootDateTime = \
                rightThreadRootMessage->date()->dateTime();
-      if ( leftThreadRootDateTime != rightThreadRootDateTime ) {
-        return leftThreadRootDateTime > rightThreadRootDateTime;
       }
+        break;
+      case ThreadGrouperModel::SortBySenderReceiver:
+        {
+          const QString leftSender = \
leftThreadRootMessage->sender()->asUnicodeString(); +          const QString \
rightSender = rightThreadRootMessage->sender()->asUnicodeString(); +
+          if ( leftSender != rightSender )
+            return leftSender < rightSender;
     }
+        break;
+      case ThreadGrouperModel::SortBySubject:
+        {
+          const QString leftSubject = \
leftThreadRootMessage->subject()->asUnicodeString(); +          const QString \
rightSubject = rightThreadRootMessage->subject()->asUnicodeString();  
+          if ( leftSubject != rightSubject )
+            return leftSubject < rightSubject;
+        }
+        break;
+      case ThreadGrouperModel::SortBySize:
+        {
+          const qint64 leftSize = leftThreadRootItem.size();
+          const qint64 rightSize = rightThreadRootItem.size();
+
+          if ( leftSize != rightSize )
+            return leftSize < rightSize;
+        }
+        break;
+    }
+
     return leftThreadRootItem.id() < rightThreadRootItem.id();
   }
 
@@ -247,16 +281,18 @@
   delete d_ptr;
 }
 
-void ThreadGrouperModel::setThreadOrder( ThreadGrouperModel::OrderScheme order )
+void ThreadGrouperModel::setSortingOption( ThreadGrouperModel::SortingOption option \
)  {
   Q_D( ThreadGrouperModel );
-  d->m_order = order;
+  d->m_sortingOption = option;
+
+  invalidate();
 }
 
-ThreadGrouperModel::OrderScheme ThreadGrouperModel::threadOrder() const
+ThreadGrouperModel::SortingOption ThreadGrouperModel::sortingOption() const
 {
   Q_D( const ThreadGrouperModel );
-  return d->m_order;
+  return d->m_sortingOption;
 }
 
 Akonadi::Item ThreadGrouperModelPrivate::threadRoot( const QModelIndex &index ) \
                const
--- trunk/KDE/kdepim/mobile/lib/threadgroupermodel.h #1200760:1200761
@@ -41,16 +41,20 @@
       ThreadIdRole = Akonadi::EntityTreeModel::UserRole + 30
     };
 
-    enum OrderScheme {
-      ThreadsWithNewRepliesOrder,
-      ThreadsStartedOrder
+    enum SortingOption
+    {
+      SortByDateTime,
+      SortByDateTimeMostRecent,
+      SortBySenderReceiver,
+      SortBySubject,
+      SortBySize
     };
 
     ThreadGrouperModel( QObject* parent = 0 );
     virtual ~ThreadGrouperModel();
 
-    void setThreadOrder( OrderScheme order );
-    OrderScheme threadOrder() const;
+    void setSortingOption( SortingOption option );
+    SortingOption sortingOption() const;
 
     virtual void setSourceModel( QAbstractItemModel *sourceModel );
 
--- trunk/KDE/kdepim/mobile/mail/mainview.cpp #1200760:1200761
@@ -191,10 +191,10 @@
 QAbstractItemModel* MainView::createItemModelContext(QDeclarativeContext* context, \
QAbstractItemModel* model)  {
 
-  ThreadGrouperModel *grouper = new ThreadGrouperModel(this);
-  grouper->setSourceModel(model);
+  m_threadGrouperModel = new ThreadGrouperModel(this);
+  m_threadGrouperModel->setSourceModel(model);
 
-  model = grouper;
+  model = m_threadGrouperModel;
 
   QAbstractProxyModel *itemFilterModel = createItemFilterModel();
   if ( itemFilterModel ) {
@@ -322,6 +322,8 @@
   mMessageListSettingsController = new MessageListSettingsController( this );
   actionCollection()->addAction( "messagelist_change_settings", \
mMessageListSettingsController->editAction() );  rootContext()->setContextProperty( \
"messageListSettings", mMessageListSettingsController ); +  connect( \
mMessageListSettingsController, SIGNAL( settingsChanged( const MessageListSettings& ) \
), +           this, SLOT( messageListSettingsChanged( const MessageListSettings& ) ) \
);  
   QTime time;
   if ( debugTiming ) {
@@ -1556,6 +1558,29 @@
   }
 }
 
+void MainView::messageListSettingsChanged( const MessageListSettings &settings )
+{
+  switch ( settings.sortingOption() ) {
+    case MessageListSettings::SortByDateTime:
+      m_threadGrouperModel->setSortingOption( ThreadGrouperModel::SortByDateTime );
+      break;
+    case MessageListSettings::SortByDateTimeMostRecent:
+      m_threadGrouperModel->setSortingOption( \
ThreadGrouperModel::SortByDateTimeMostRecent ); +      break;
+    case MessageListSettings::SortBySenderReceiver:
+      m_threadGrouperModel->setSortingOption( \
ThreadGrouperModel::SortBySenderReceiver ); +      break;
+    case MessageListSettings::SortBySubject:
+      m_threadGrouperModel->setSortingOption( ThreadGrouperModel::SortBySubject );
+      break;
+    case MessageListSettings::SortBySize:
+      m_threadGrouperModel->setSortingOption( ThreadGrouperModel::SortBySize );
+      break;
+  }
+
+  m_threadGrouperModel->sort( 0, settings.sortingOrder() );
+}
+
 // #############################################################
 
 #include "mainview.moc"
--- trunk/KDE/kdepim/mobile/mail/mainview.h #1200760:1200761
@@ -46,9 +46,11 @@
 class FilterModel;
 class KJob;
 class KSelectionProxyModel;
+class MessageListSettings;
 class MessageListSettingsController;
 class QStandardItemModel;
 class TemplateEmailModel;
+class ThreadGrouperModel;
 class ThreadModel;
 
 class MainView : public KDeclarativeMainView
@@ -168,6 +170,7 @@
     void showMessageSource();
     void selectOverrideEncoding();
     void toggleShowExtendedHeaders( bool );
+    void messageListSettingsChanged( const MessageListSettings& );
 
   private:
     void reply( quint64 id, MessageComposer::ReplyStrategy replyStrategy, bool \
quoteOriginal = true ); @@ -185,6 +188,7 @@
     TemplateEmailModel *mEmailTemplateModel;
     QItemSelectionModel *mTemplateSelectionModel;
     KSelectionProxyModel *m_threadContentsModel;
+    ThreadGrouperModel *m_threadGrouperModel;
     ThreadModel *m_threadsModel;
     FilterModel *mFilterModel;
     Akonadi::QuotaColorProxyModel *mQuotaColorProxyModel;
--- trunk/KDE/kdepim/mobile/mail/messagelistsettingscontroller.cpp #1200760:1200761
@@ -71,7 +71,7 @@
 
   mSettings = MessageListSettings::fromConfig( mCollectionId );
 
-  emit settingsChanged();
+  emit settingsChanged( mSettings );
 }
 
 void MessageListSettingsController::editSettings()
@@ -82,6 +82,7 @@
   ui.setupUi( dialog.mainWidget() );
 
   ui.mSortingOption->setCurrentIndex( static_cast<int>( mSettings.sortingOption() ) \
); +  ui.mSortingOrder->setCurrentIndex( mSettings.sortingOrder() == \
Qt::AscendingOrder ? 0 : 1 );  ui.mGroupingOption->setCurrentIndex( static_cast<int>( \
mSettings.groupingOption() ) );  ui.mUseThreading->setChecked( \
mSettings.useThreading() );  ui.mSaveForCollection->setChecked( \
mSettings.saveForCollection() ); @@ -90,11 +91,12 @@
     return;
 
   mSettings.setSortingOption( static_cast<MessageListSettings::SortingOption>( \
ui.mSortingOption->currentIndex() ) ); +  mSettings.setSortingOrder( \
ui.mSortingOrder->currentIndex() == 0 ? Qt::AscendingOrder : Qt::DescendingOrder );  \
mSettings.setGroupingOption( static_cast<MessageListSettings::GroupingOption>( \
ui.mGroupingOption->currentIndex() ) );  mSettings.setUseThreading( \
ui.mUseThreading->isChecked() );  mSettings.setSaveForCollection( \
ui.mSaveForCollection->isChecked() );  
   MessageListSettings::toConfig( mCollectionId, mSettings );
 
-  emit settingsChanged();
+  emit settingsChanged( mSettings );
 }
--- trunk/KDE/kdepim/mobile/mail/messagelistsettingscontroller.h #1200760:1200761
@@ -48,7 +48,7 @@
     void setCollection( const Akonadi::Collection &collection );
 
   Q_SIGNALS:
-    void settingsChanged();
+    void settingsChanged( const MessageListSettings &settings );
 
   private Q_SLOTS:
     void editSettings();


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

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