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

List:       kde-commits
Subject:    [kdepim/work/akonadi-ports] /: Fixes for EntityTreeModel-based feed
From:       Frank Osterfeld <frank.osterfeld () kdab ! com>
Date:       2011-09-16 22:40:55
Message-ID: 20110916224055.532D0A607A () git ! kde ! org
[Download RAW message or body]

Git commit 085e518b557468c20a4e33c7f6508c5022f433fa by Frank Osterfeld.
Committed on 17/09/2011 at 00:39.
Pushed by osterfeld into branch 'work/akonadi-ports'.

Fixes for EntityTreeModel-based feed and item views

M  +32   -31   akregator/src/articlelistview.cpp
M  +2    -1    akregator/src/articlelistview.h
M  +3    -0    akregator/src/mainwidget.cpp
M  +46   -41   akregator/src/selectioncontroller.cpp
M  +0    -1    akregator/src/selectioncontroller.h
M  +38   -25   krss/krss/feeditemmodel.cpp
M  +2    -2    krss/krss/feeditemmodel.h
M  +5    -0    krss/krss/item.cpp
M  +5    -0    krss/krss/item.h
M  +2    -2    krss/krss/ui/feedlistdelegate.cpp
M  +2    -2    krss/krss/ui/feedlistview.cpp
M  +3    -1    krss/krss/ui/feedlistview.h

http://commits.kde.org/kdepim/085e518b557468c20a4e33c7f6508c5022f433fa

diff --git a/akregator/src/articlelistview.cpp b/akregator/src/articlelistview.cpp
index e6d85f6..3de97a0 100644
--- a/akregator/src/articlelistview.cpp
+++ b/akregator/src/articlelistview.cpp
@@ -28,7 +28,7 @@
 
 #include <utils/filtercolumnsproxymodel.h>
 
-#include <krss/itemmodel.h>
+#include <krss/feeditemmodel.h>
 
 #include <KIcon>
 #include <KLocale>
@@ -49,7 +49,7 @@
 
 using namespace boost;
 using namespace Akregator;
-using KRss::ItemModel;
+using KRss::FeedItemModel;
 
 FilterDeletedProxyModel::FilterDeletedProxyModel( QObject* parent ) : \
QSortFilterProxyModel( parent )  {
@@ -58,7 +58,7 @@ FilterDeletedProxyModel::FilterDeletedProxyModel( QObject* parent ) \
: QSortFilte  
 bool FilterDeletedProxyModel::filterAcceptsRow( int source_row, const QModelIndex& \
source_parent ) const  {
-    return !sourceModel()->index( source_row, 0, source_parent ).data( \
ItemModel::IsDeletedRole ).toBool(); +    return !sourceModel()->index( source_row, \
0, source_parent ).data( FeedItemModel::IsDeletedRole ).toBool();  }
 
 SortColorizeProxyModel::SortColorizeProxyModel( QObject* parent ) : \
QSortFilterProxyModel( parent ), m_keepFlagIcon( KIcon( "mail-mark-important" ) ) @@ \
-67,10 +67,10 @@ SortColorizeProxyModel::SortColorizeProxyModel( QObject* parent ) : \
QSortFilterP  
 bool SortColorizeProxyModel::filterAcceptsRow ( int source_row, const QModelIndex& \
source_parent ) const  {
+#ifdef KRSS_PORT_DISABLED
     if ( source_parent.isValid() )
         return false;
 
-#ifdef KRSS_PORT_DISABLED
     for ( uint i = 0; i < m_matchers.size(); ++i )
     {
         if ( !static_cast<ItemModel*>( sourceModel() )->rowMatches( source_row, \
m_matchers[i] ) ) @@ -99,10 +99,7 @@ QVariant SortColorizeProxyModel::data( const \
QModelIndex& idx, int role ) const  {
         case Qt::ForegroundRole:
         {
-            if ( sourceIdx.data( ItemModel::IsNewRole ).toBool() )
-                return Settings::useCustomColors() ?
-                    Settings::colorNewArticles() : Qt::red;
-            if ( sourceIdx.data( ItemModel::IsUnreadRole ).toBool() )
+            if ( sourceIdx.data( FeedItemModel::IsUnreadRole ).toBool() )
                 return Settings::useCustomColors() ?
                     Settings::colorUnreadArticles() : Qt::blue;
 
@@ -112,9 +109,9 @@ QVariant SortColorizeProxyModel::data( const QModelIndex& idx, \
int role ) const  break;
         case Qt::DecorationRole:
         {
-            if ( sourceIdx.column() == ItemModel::ItemTitleColumn )
+            if ( sourceIdx.column() == FeedItemModel::ItemTitleColumn )
             {
-                return sourceIdx.data( ItemModel::IsImportantRole ).toBool() ? \
m_keepFlagIcon : QVariant(); +                return sourceIdx.data( \
FeedItemModel::IsImportantRole ).toBool() ? m_keepFlagIcon : QVariant();  }
         }
         break;
@@ -122,42 +119,46 @@ QVariant SortColorizeProxyModel::data( const QModelIndex& idx, \
int role ) const  return sourceIdx.data( role );
 }
 
-namespace {
+static bool isRead( const QModelIndex& idx )
+{
 
-    static bool isRead( const QModelIndex& idx )
-    {
-        if ( !idx.isValid() )
-            return false;
-        return idx.data( ItemModel::IsReadRole ).toBool();
-    }
+    return idx.isValid()
+            ? idx.data( FeedItemModel::IsReadRole ).toBool()
+            : false;
 }
 
 void ArticleListView::setItemModel( QAbstractItemModel* model )
 {
+    setModel( model );
+#if 0
     if ( !model ) {
         setModel( model );
         return;
     }
 
+    delete m_proxy;
     m_proxy = new SortColorizeProxyModel( model );
     m_proxy->setSourceModel( model );
-    m_proxy->setSortRole( ItemModel::SortRole );
+    m_proxy->setSortRole( FeedItemModel::SortRole );
     m_proxy->setFilters( m_matchers );
+#if 0
     FilterDeletedProxyModel* const proxy2 = new FilterDeletedProxyModel( model );
-    proxy2->setSortRole( ItemModel::SortRole );
+    proxy2->setSortRole( FeedItemModel::SortRole );
     proxy2->setSourceModel( m_proxy );
+#endif
 
     FilterColumnsProxyModel* const columnsProxy = new FilterColumnsProxyModel( model \
                );
-    columnsProxy->setSortRole( ItemModel::SortRole );
-    columnsProxy->setSourceModel( proxy2 );
+    columnsProxy->setSortRole( FeedItemModel::SortRole );
+    columnsProxy->setSourceModel( m_proxy );
 
-    columnsProxy->setColumnEnabled( ItemModel::ItemTitleColumn );
-    columnsProxy->setColumnEnabled( ItemModel::FeedTitleColumn );
-    columnsProxy->setColumnEnabled( ItemModel::DateColumn );
-    columnsProxy->setColumnEnabled( ItemModel::AuthorsColumn );
+    columnsProxy->setColumnEnabled( FeedItemModel::ItemTitleColumn );
+    columnsProxy->setColumnEnabled( FeedItemModel::FeedTitleColumn );
+    columnsProxy->setColumnEnabled( FeedItemModel::DateColumn );
+    columnsProxy->setColumnEnabled( FeedItemModel::AuthorsColumn );
 
     setModel( columnsProxy );
     header()->setContextMenuPolicy( Qt::CustomContextMenu );
+#endif
 }
 
 void ArticleListView::showHeaderMenu(const QPoint& pos)
@@ -298,7 +299,7 @@ void ArticleListView::setIsAggregation( bool aggregation )
 }
 
 ArticleListView::ArticleListView( QWidget* parent )
-    : QTreeView(parent),
+    : Akonadi::EntityTreeView(parent),
     m_columnMode( FeedMode )
 {
     setSortingEnabled( true );
@@ -324,11 +325,11 @@ ArticleListView::ArticleListView( QWidget* parent )
 void ArticleListView::mousePressEvent( QMouseEvent *ev )
 {
     // let's push the event, so we can use currentIndex() to get the newly selected \
                article..
-    QTreeView::mousePressEvent( ev );
+    EntityTreeView::mousePressEvent( ev );
 
     if( ev->button() == Qt::MidButton ) {
         QModelIndex idx( currentIndex() );
-        const KUrl url = currentIndex().data( ItemModel::LinkRole ).value<KUrl>();
+        const KUrl url = currentIndex().data( FeedItemModel::LinkRole \
).value<KUrl>();  
         emit signalMouseButtonPressed( ev->button(), url );
     }
@@ -365,7 +366,7 @@ void ArticleListView::contextMenuEvent( QContextMenuEvent* event \
)  
 void ArticleListView::paintEvent( QPaintEvent* e )
 {
-    QTreeView::paintEvent( e );
+    EntityTreeView::paintEvent( e );
 
 #ifdef __GNUC__
 #warning The distinction between empty node and 0 items after filtering is hard to \
port to interview @@ -416,7 +417,7 @@ void ArticleListView::setModel( \
QAbstractItemModel* m )  m_feedHeaderState = state;
     }
 
-    QTreeView::setModel( m );
+    EntityTreeView::setModel( m );
 
     if ( m )
     {
@@ -425,7 +426,7 @@ void ArticleListView::setModel( QAbstractItemModel* m )
 
         // Ensure at least one column is visible
         if ( header()->hiddenSectionCount() == header()->count() ) {
-            header()->showSection( ItemModel::ItemTitleColumn );
+            header()->showSection( FeedItemModel::ItemTitleColumn );
         }
     }
 }
diff --git a/akregator/src/articlelistview.h b/akregator/src/articlelistview.h
index c10ed69..7ca074f 100644
--- a/akregator/src/articlelistview.h
+++ b/akregator/src/articlelistview.h
@@ -28,6 +28,7 @@
 #include "akregator_export.h"
 #include "abstractselectioncontroller.h"
 
+#include <Akonadi/EntityTreeView>
 #include <QPointer>
 #include <QSortFilterProxyModel>
 #include <QTreeView>
@@ -83,7 +84,7 @@ private:
 };
 
 
-class AKREGATORPART_EXPORT ArticleListView : public QTreeView, public ArticleLister
+class AKREGATORPART_EXPORT ArticleListView : public Akonadi::EntityTreeView, public \
ArticleLister  {
     Q_OBJECT
 
diff --git a/akregator/src/mainwidget.cpp b/akregator/src/mainwidget.cpp
index f914ade..436b034 100644
--- a/akregator/src/mainwidget.cpp
+++ b/akregator/src/mainwidget.cpp
@@ -281,6 +281,8 @@ Akregator::MainWidget::MainWidget( Part *part, QWidget *parent, \
ActionManagerImp  m_articleSplitter->setSizes( sp2sizes );
 
     KConfigGroup conf(Settings::self()->config(), "General");
+
+#ifdef KRSS_PORT_DISABLED
     if(!conf.readEntry("Disable Introduction", false))
     {
         m_articleListView->hide();
@@ -289,6 +291,7 @@ Akregator::MainWidget::MainWidget( Part *part, QWidget *parent, \
ActionManagerImp  m_mainFrame->slotSetTitle(i18n("About"));
         m_displayingAboutPage = true;
     }
+#endif
 
     m_markReadTimer = new QTimer(this);
     m_markReadTimer->setSingleShot(true);
diff --git a/akregator/src/selectioncontroller.cpp \
b/akregator/src/selectioncontroller.cpp index 6e36ed1..d1534bc 100644
--- a/akregator/src/selectioncontroller.cpp
+++ b/akregator/src/selectioncontroller.cpp
@@ -35,11 +35,16 @@
 #include <krss/tagprovider.h>
 #include <krss/treenode.h>
 #include <krss/treenodevisitor.h>
+#include <krss/feedpropertiescollectionattribute.h>
+#include <krss/rssitem.h>
 
 #include <Akonadi/ChangeRecorder>
+#include <Akonadi/CollectionFetchScope>
 #include <Akonadi/EntityDisplayAttribute>
 #include <Akonadi/EntityMimeTypeFilterModel>
 #include <Akonadi/EntityTreeModel>
+#include <Akonadi/Item>
+#include <Akonadi/ItemFetchJob>
 #include <Akonadi/ItemFetchScope>
 #include <Akonadi/Session>
 
@@ -78,7 +83,6 @@ static shared_ptr<KRss::TreeNode> subscriptionForIndex( const \
QModelIndex& index  
 Akregator::SelectionController::SelectionController( QObject* parent )
     : AbstractSelectionController( parent ),
-    m_feedList(),
     m_feedSelector(),
     m_articleLister( 0 ),
     m_singleDisplay( 0 ),
@@ -86,76 +90,72 @@ Akregator::SelectionController::SelectionController( QObject* \
parent )  m_itemModel( 0 ),
     m_selectedSubscription()
 {
-    Akonadi::ItemFetchScope scope;
-    scope.fetchFullPayload( true );
-    scope.fetchAttribute<Akonadi::EntityDisplayAttribute>();
+    Akonadi::ItemFetchScope iscope;
+    iscope.fetchFullPayload( true );
+    iscope.fetchAttribute<Akonadi::EntityDisplayAttribute>();
 
+    Akonadi::CollectionFetchScope cscope;
+    cscope.setIncludeStatistics( true );
+    cscope.setContentMimeTypes( QStringList() << \
                QLatin1String("application/rss+xml") );
     Akonadi::Session* session = new Akonadi::Session( QByteArray( "Akregator-" ) + \
QByteArray::number( qrand() ) );  Akonadi::ChangeRecorder* recorder = new \
Akonadi::ChangeRecorder;  recorder->setSession( session );
     recorder->fetchCollection( true );
-    recorder->setItemFetchScope( scope );
+    recorder->setCollectionFetchScope( cscope );
+    recorder->setItemFetchScope( iscope );
     recorder->setCollectionMonitored( Akonadi::Collection::root() );
     recorder->setMimeTypeMonitored( QLatin1String( "application/rss+xml" ) );
-    m_itemModel = new FeedItemModel( recorder );
+    m_itemModel = new FeedItemModel( recorder, this );
 }
 
 
 void Akregator::SelectionController::setFeedSelector( QAbstractItemView* \
feedSelector )  {
-    if ( m_feedSelector == feedSelector )
-        return;
-
-    if ( m_feedSelector ) {
-        m_feedSelector->disconnect( this );
-        m_feedSelector->selectionModel()->disconnect( this );
-    }
-
+    Q_ASSERT( !m_feedSelector );
     m_feedSelector = feedSelector;
-
     init();
 }
 
 void Akregator::SelectionController::setArticleLister( Akregator::ArticleLister* \
lister )  {
-    if ( m_articleLister == lister )
-        return;
-
-    if ( m_articleLister )
-        m_articleLister->articleSelectionModel()->disconnect( this );
-    if ( m_articleLister && m_articleLister->itemView() )
-        m_articleLister->itemView()->disconnect( this );
-
+    Q_ASSERT( !m_articleLister );
     m_articleLister = lister;
     init();
 }
 
 void Akregator::SelectionController::init() {
-
-    if (  !m_feedSelector || !m_articleLister || !m_articleLister->itemView() )
+    if (  !m_feedSelector || !m_articleLister )
         return;
 
-    Akonadi::EntityMimeTypeFilterModel* filterProxy = new \
Akonadi::EntityMimeTypeFilterModel( m_feedSelector ); +    Q_ASSERT( \
m_articleLister->itemView() ); +    Q_ASSERT( !m_feedSelector->model() );
+
+    Akonadi::EntityMimeTypeFilterModel* filterProxy = new \
Akonadi::EntityMimeTypeFilterModel( this ); +    \
                filterProxy->addMimeTypeInclusionFilter( \
                Akonadi::Collection::mimeType() );
     filterProxy->setHeaderGroup( Akonadi::EntityTreeModel::CollectionTreeHeaders );
     filterProxy->setSourceModel( m_itemModel );
-
-    m_feedSelector->setModel( filterProxy );
+    filterProxy->setDynamicSortFilter( true );
 
     connect( m_feedSelector, SIGNAL(customContextMenuRequested(QPoint)),
              this, SLOT(subscriptionContextMenuRequested(QPoint)) );
     connect( m_feedSelector->selectionModel(), \
SIGNAL(currentChanged(QModelIndex,QModelIndex)),  this, \
SLOT(selectedSubscriptionChanged(QModelIndex)) );  
+    m_feedSelector->setModel( filterProxy );
+
     KSelectionProxyModel* selectionProxy = new KSelectionProxyModel( \
                m_feedSelector->selectionModel() );
     selectionProxy->setFilterBehavior( \
KSelectionProxyModel::ChildrenOfExactSelection );  selectionProxy->setSourceModel( \
m_itemModel );  
     Akonadi::EntityMimeTypeFilterModel* filterProxy2 = new \
                Akonadi::EntityMimeTypeFilterModel;
     filterProxy2->setHeaderGroup( Akonadi::EntityTreeModel::ItemListHeaders );
-    filterProxy2->setSourceModel( selectionProxy );
+    filterProxy2->addMimeTypeInclusionFilter( QLatin1String("application/rss+xml") \
);  filterProxy2->setSortRole( FeedItemModel::SortRole );
+    filterProxy2->setDynamicSortFilter( true );
+    filterProxy2->setSourceModel( selectionProxy );
     m_articleLister->setItemModel( filterProxy2 );
-
+    connect( m_articleLister->articleSelectionModel(), \
SIGNAL(selectionChanged(QItemSelection, QItemSelection)), +                this, \
                SLOT(itemSelectionChanged()) );
     connect( m_articleLister->itemView(), SIGNAL(doubleClicked(QModelIndex)),
              this, SLOT(itemIndexDoubleClicked(QModelIndex))  );
 }
@@ -186,29 +186,28 @@ shared_ptr<KRss::TreeNode> \
Akregator::SelectionController::selectedSubscription(  
 void Akregator::SelectionController::setFeedList( const shared_ptr<KRss::FeedList>& \
feedList )  {
+#ifdef KRSS_PORT_DISABLED
+
     if ( m_feedList == feedList )
         return;
 
     m_feedList = feedList;
 
 
-#ifdef KRSS_PORT_DISABLED
     if ( m_folderExpansionHandler ) {
         m_folderExpansionHandler->setFeedList( m_feedList );
         m_folderExpansionHandler->setModel( m_subscriptionModel );
     }
-#endif
 
     if ( m_feedSelector ) {
         Akonadi::EntityMimeTypeFilterModel* filterProxy = new \
                Akonadi::EntityMimeTypeFilterModel( m_feedSelector );
         filterProxy->setHeaderGroup( Akonadi::EntityTreeModel::CollectionTreeHeaders \
);  filterProxy->setSourceModel( m_itemModel );
         m_feedSelector->setModel( filterProxy );
-        disconnect( m_feedSelector->selectionModel(), \
                SIGNAL(currentChanged(QModelIndex,QModelIndex)),
-                    this, SLOT(selectedSubscriptionChanged(QModelIndex)) );
         connect( m_feedSelector->selectionModel(), \
SIGNAL(currentChanged(QModelIndex,QModelIndex)),  this, \
SLOT(selectedSubscriptionChanged(QModelIndex)) );  }
+#endif
 }
 
 void Akregator::SelectionController::setFolderExpansionHandler( \
Akregator::FolderExpansionHandler* handler ) @@ -278,27 +277,33 @@ void \
Akregator::SelectionController::subscriptionContextMenuRequested( const QPo  
 void Akregator::SelectionController::itemSelectionChanged()
 {
-    const KRss::Item item = currentItem();
+    const Akonadi::Item item = \
m_articleLister->articleSelectionModel()->currentIndex().data( \
Akonadi::EntityTreeModel::ItemRole ).value<Akonadi::Item>(); +    if ( \
!item.isValid() ) +        return;
     Akonadi::ItemFetchScope scope;
-    scope.fetchPayloadPart( KRss::Item::HeadersPart );
-    scope.fetchPayloadPart( KRss::Item::ContentPart );
-    KRss::ItemFetchJob* job = new KRss::ItemFetchJob( this );
+    scope.fetchFullPayload();
+    scope.fetchAttribute<Akonadi::EntityDisplayAttribute>();
+    Akonadi::ItemFetchJob* job = new Akonadi::ItemFetchJob( item );
     job->setFetchScope( scope );
-    job->setItem( item );
     connect( job, SIGNAL(finished(KJob*)), this, SLOT(fullItemFetched(KJob*)) );
     job->start();
 }
 
 void Akregator::SelectionController::fullItemFetched( KJob* j )
 {
-    KRss::ItemFetchJob* job = qobject_cast<KRss::ItemFetchJob*>( j );
+    Akonadi::ItemFetchJob* job = qobject_cast<Akonadi::ItemFetchJob*>( j );
     assert( job );
     if ( job->error() ) {
         //PENDING(frank) TODO handle error
+        return;
     }
 
-    const KRss::Item item = job->item();
+    Q_ASSERT( job->items().size() == 1 );
 
+    const Akonadi::Item aitem = job->items().first();
+    if ( !aitem.hasPayload<KRss::RssItem>() )
+        return;
+    const KRss::Item item( aitem );
     if ( m_singleDisplay )
         m_singleDisplay->showItem( item );
 
diff --git a/akregator/src/selectioncontroller.h \
b/akregator/src/selectioncontroller.h index fd399e3..a89285b 100644
--- a/akregator/src/selectioncontroller.h
+++ b/akregator/src/selectioncontroller.h
@@ -98,7 +98,6 @@ private:
     void init();
 
 private:
-    boost::shared_ptr<KRss::FeedList> m_feedList;
     QPointer<QAbstractItemView> m_feedSelector;
     Akregator::ArticleLister* m_articleLister;
     Akregator::SingleArticleDisplay* m_singleDisplay;
diff --git a/krss/krss/feeditemmodel.cpp b/krss/krss/feeditemmodel.cpp
index 1023ca0..6c421c0 100644
--- a/krss/krss/feeditemmodel.cpp
+++ b/krss/krss/feeditemmodel.cpp
@@ -49,7 +49,7 @@ FeedItemModel::~FeedItemModel() {
 
 QVariant FeedItemModel::entityData( const Akonadi::Item &akonadiItem, int column, \
int role ) const {  if ( !akonadiItem.hasPayload<RssItem>() )
-        return QVariant();
+        return EntityTreeModel::entityData( akonadiItem, column, role );
 
     const RssItem item = akonadiItem.payload<RssItem>();
     if ( role == SortRole && column == DateColumn )
@@ -73,8 +73,9 @@ QVariant FeedItemModel::entityData( const Akonadi::Item \
&akonadiItem, int column  authors += person.name();
                 }
                 return authors;
+#else
+                return EntityTreeModel::entityData( akonadiItem, column, role );
 #endif
-                return QVariant();
             }
             case DateColumn:
                 if ( role == SortRole )
@@ -87,11 +88,11 @@ QVariant FeedItemModel::entityData( const Akonadi::Item \
&akonadiItem, int column  return d->m_feed->title();
 #endif
             default:
-                return QVariant();
+                return EntityTreeModel::entityData( akonadiItem, column, role );
         }
     }
 
-    if ( role == ItemRole ) {
+    if ( role == FeedItemModel::ItemRole ) {
         QVariant var;
         var.setValue( akonadiItem );
         return var;
@@ -117,44 +118,52 @@ QVariant FeedItemModel::entityData( const Akonadi::Item \
&akonadiItem, int column  
     //PENDING(frank) TODO: use configurable colors
     if ( role == Qt::ForegroundRole ) {
-        if ( RssItem::isNew( akonadiItem ) )
-            return Qt::red;
         if ( RssItem::isUnread( akonadiItem ) )
             return Qt::blue;
     }
 
-    if ( role == Qt::DecorationRole && column == ItemTitleColumn )
-        return RssItem::isImportant( akonadiItem ) ? d->importantIcon : QVariant();
-    return QVariant();
+    if ( role == Qt::DecorationRole && column == ItemTitleColumn && \
RssItem::isImportant( akonadiItem ) ) +        return d->importantIcon;
+
+    return EntityTreeModel::entityData( akonadiItem, column, role );
 }
 
 QVariant FeedItemModel::entityData( const Collection &collection, int column, int \
                role ) const {
-    if ( role == Qt::DisplayRole && column == FeedTitleColumn ) {
-        const QString title = FeedCollection( collection ).title();
-        if ( !title.isEmpty() )
-            return title;
+    if ( role == Qt::DisplayRole || role == SortRole ) {
+        switch ( column ) {
+        case FeedTitleColumn:
+        {
+            const QString title = FeedCollection( collection ).title();
+            if ( !title.isEmpty() )
+                return title;
+            break;
+        }
+        default:
+            break;
+        }
     }
     return EntityTreeModel::entityData( collection, column, role );
 }
 
 int FeedItemModel::entityColumnCount( EntityTreeModel::HeaderGroup headerSet ) const \
                {
-    if ( headerSet == ItemListHeaders )
+    switch ( headerSet ) {
+    case ItemListHeaders:
         return ItemColumnCount;
-    else
+    case CollectionTreeHeaders:
         return FeedColumnCount;
+    default:
+        break;
+    }
+    return EntityTreeModel::entityColumnCount( headerSet );
 }
 
 QVariant FeedItemModel::entityHeaderData( int section, Qt::Orientation orientation, \
int role, EntityTreeModel::HeaderGroup headerSet ) const {  Q_ASSERT( section >= 0 );
-    if ( orientation != Qt::Horizontal )
-        return QVariant();
-    if ( role != Qt::DisplayRole )
-        return QVariant();
+    if ( orientation != Qt::Horizontal || role != Qt::DisplayRole )
+        return EntityTreeModel::entityHeaderData( section, orientation, role, \
headerSet );  switch ( headerSet ) {
         case ItemListHeaders:
         {
-            if ( section >= ItemColumnCount )
-                return QVariant();
             switch ( section ) {
             case ItemTitleColumn:
                 return i18n("Title");
@@ -164,23 +173,27 @@ QVariant FeedItemModel::entityHeaderData( int section, \
Qt::Orientation orientati  return i18n("Date");
             case FeedTitleForItemColumn:
                 return i18n("Feed");
+            default:
+                break;
             }
         }
 
         case CollectionTreeHeaders:
         {
-            if ( section >= FeedColumnCount )
-                return QVariant();
-            switch ( section ) {
+          switch ( section ) {
             case FeedTitleColumn:
                 return i18n("Title");
             case UnreadCountColumn:
                 return i18n("Unread");
             case TotalCountColumn:
                 return i18n("Total");
+            default:
+                break;
             }
         }
+        default:
+            break;
     }
-    return QVariant();
+    return EntityTreeModel::entityHeaderData( section, orientation, role, headerSet \
);  }
 
diff --git a/krss/krss/feeditemmodel.h b/krss/krss/feeditemmodel.h
index 357d611..d682566 100644
--- a/krss/krss/feeditemmodel.h
+++ b/krss/krss/feeditemmodel.h
@@ -50,8 +50,8 @@ public:
         FeedColumnCount
     };
 
-    enum Role {
-        ItemRole =EntityTreeModel::UserRole,
+    enum ItemRoles {
+        ItemRole=EntityTreeModel::UserRole,
         SortRole,
         IsNewRole,
         IsUnreadRole,
diff --git a/krss/krss/item.cpp b/krss/krss/item.cpp
index c86c8a0..fbb0676 100644
--- a/krss/krss/item.cpp
+++ b/krss/krss/item.cpp
@@ -49,6 +49,11 @@ Item::Item() : d( new Private )
 {
 }
 
+Item::Item( const Akonadi::Item& aitem ) : d( new Private )
+{
+    d->akonadiItem = aitem;
+}
+
 Item::Item( const Item& other ) : d( other.d )
 {
 }
diff --git a/krss/krss/item.h b/krss/krss/item.h
index 5bd82b7..864ef92 100644
--- a/krss/krss/item.h
+++ b/krss/krss/item.h
@@ -34,6 +34,10 @@ template <class T> class QList;
 template <class K, class T> class QHash;
 class QString;
 
+namespace Akonadi {
+    class Item;
+}
+
 namespace KRss {
 
 class Category;
@@ -62,6 +66,7 @@ public:
 
 public:
     Item();
+    explicit Item( const Akonadi::Item& aitem );
     Item( const Item& other );
     ~Item();
 
diff --git a/krss/krss/ui/feedlistdelegate.cpp b/krss/krss/ui/feedlistdelegate.cpp
index d8167e3..e095ba9 100644
--- a/krss/krss/ui/feedlistdelegate.cpp
+++ b/krss/krss/ui/feedlistdelegate.cpp
@@ -24,7 +24,7 @@
 */
 
 #include "feedlistdelegate.h"
-#include "krss/feedlistmodel.h"
+#include <Akonadi/EntityTreeModel>
 
 #include <KDebug>
 #include <KGlobalSettings>
@@ -62,7 +62,7 @@ void FeedListDelegate::paint( QPainter *painter,
                               const QModelIndex &index ) const
 {
     QStyleOptionViewItem newOption = option;
-    if ( index.data( FeedListModel::HasUnreadRole ).toBool() )
+    if ( index.data( Akonadi::EntityTreeModel::UnreadCountRole ).toInt() > 0 )
     { // feed has unread articles
         newOption.font.setBold(true);
     }
diff --git a/krss/krss/ui/feedlistview.cpp b/krss/krss/ui/feedlistview.cpp
index aa3d3ab..521a5c8 100644
--- a/krss/krss/ui/feedlistview.cpp
+++ b/krss/krss/ui/feedlistview.cpp
@@ -198,7 +198,7 @@ void FeedListView::Private::saveHeaderSettings()
 }
 
 FeedListView::FeedListView( QWidget *parent )
-    :  QTreeView( parent ), d( new Private( this ) )
+    :  Akonadi::EntityTreeView( parent ), d( new Private( this ) )
 {
     setSelectionMode( QAbstractItemView::SingleSelection );
     setSelectionBehavior( QAbstractItemView::SelectRows );
@@ -237,7 +237,7 @@ void FeedListView::setModel( QAbstractItemModel* m )
     if ( model() )
         d->headerState = header()->saveState();
 
-    QTreeView::setModel( m );
+    EntityTreeView::setModel( m );
 
     if ( m )
         header()->restoreState( d->headerState );
diff --git a/krss/krss/ui/feedlistview.h b/krss/krss/ui/feedlistview.h
index 611cb88..d448573 100644
--- a/krss/krss/ui/feedlistview.h
+++ b/krss/krss/ui/feedlistview.h
@@ -21,6 +21,8 @@
 
 #include "krss/krss_export.h"
 
+#include <Akonadi/EntityTreeView>
+
 #include <QtGui/QTreeView>
 #include <boost/shared_ptr.hpp>
 
@@ -31,7 +33,7 @@ namespace KRss {
 class Tag;
 class TreeNode;
 
-class KRSS_EXPORT FeedListView : public QTreeView
+class KRSS_EXPORT FeedListView : public Akonadi::EntityTreeView
 {
     Q_OBJECT
 


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

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