SVN commit 878755 by vkrause: Monitor the current item and update the views if necessary. Fixes changing the same item twice. M +74 -59 browserwidget.cpp M +3 -0 browserwidget.h --- trunk/KDE/kdepim/akonadi/clients/akonadiconsole/browserwidget.cpp #878754:878755 @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -68,7 +69,8 @@ mItemModel( 0 ), mCurrentCollection( 0 ), mNepomukModel( 0 ), - mStdActionManager( 0 ) + mStdActionManager( 0 ), + mMonitor( 0 ) { Q_ASSERT( xmlGuiWindow ); QVBoxLayout *layout = new QVBoxLayout( this ); @@ -159,73 +161,86 @@ kWarning( 5265 ) << "No item found!"; } else { const Item item = fetch->items().first(); - mCurrentItem = item; - if ( item.hasPayload() ) { - const KABC::Addressee addr = item.payload(); + setItem( item ); + } +} - contentUi.addresseeView->setAddressee( addr ); - contentUi.stack->setCurrentWidget( contentUi.addresseeViewPage ); - } else if ( item.mimeType().startsWith( "application/x-vnd.akonadi.calendar" ) ) { - contentUi.incidenceView->setItem( item ); - contentUi.stack->setCurrentWidget( contentUi.incidenceViewPage ); - } else { - contentUi.stack->setCurrentWidget( contentUi.unsupportedTypePage ); - } +void BrowserWidget::setItem( const Akonadi::Item &item ) +{ + mCurrentItem = item; + if ( item.hasPayload() ) { + const KABC::Addressee addr = item.payload(); - QByteArray data = item.payloadData(); - contentUi.dataView->setPlainText( data ); + contentUi.addresseeView->setAddressee( addr ); + contentUi.stack->setCurrentWidget( contentUi.addresseeViewPage ); + } else if ( item.mimeType().startsWith( "application/x-vnd.akonadi.calendar" ) ) { + contentUi.incidenceView->setItem( item ); + contentUi.stack->setCurrentWidget( contentUi.incidenceViewPage ); + } else { + contentUi.stack->setCurrentWidget( contentUi.unsupportedTypePage ); + } - contentUi.id->setText( QString::number( item.id() ) ); - contentUi.remoteId->setText( item.remoteId() ); - contentUi.mimeType->setText( item.mimeType() ); - contentUi.revision->setText( QString::number( item.revision() ) ); - contentUi.size->setText( QString::number( item.size() ) ); - contentUi.modificationtime->setText( item.modificationTime().toString() + ( " UTC" ) ); - QStringList flags; - foreach ( const Item::Flag &f, item.flags() ) - flags << QString::fromUtf8( f ); - contentUi.flags->setItems( flags ); + QByteArray data = item.payloadData(); + contentUi.dataView->setPlainText( data ); - Attribute::List list = item.attributes(); - mAttrModel = new QStandardItemModel( list.count(), 2 ); + contentUi.id->setText( QString::number( item.id() ) ); + contentUi.remoteId->setText( item.remoteId() ); + contentUi.mimeType->setText( item.mimeType() ); + contentUi.revision->setText( QString::number( item.revision() ) ); + contentUi.size->setText( QString::number( item.size() ) ); + contentUi.modificationtime->setText( item.modificationTime().toString() + ( " UTC" ) ); + QStringList flags; + foreach ( const Item::Flag &f, item.flags() ) + flags << QString::fromUtf8( f ); + contentUi.flags->setItems( flags ); + + Attribute::List list = item.attributes(); + mAttrModel = new QStandardItemModel( list.count(), 2 ); + QStringList labels; + labels << i18n( "Attribute" ) << i18n( "Value" ); + mAttrModel->setHorizontalHeaderLabels( labels ); + for ( int i = 0; i < list.count(); ++i ) { + QModelIndex index = mAttrModel->index( i, 0 ); + Q_ASSERT( index.isValid() ); + mAttrModel->setData( index, QString::fromLatin1( list[i]->type() ) ); + index = mAttrModel->index( i, 1 ); + Q_ASSERT( index.isValid() ); + mAttrModel->setData( index, QString::fromLatin1( list[i]->serialized() ) ); + mAttrModel->itemFromIndex( index )->setFlags( Qt::ItemIsEditable | mAttrModel->flags( index ) ); + } + contentUi.attrView->setModel( mAttrModel ); + + Nepomuk::Resource res( item.url() ); + delete mNepomukModel; + mNepomukModel = 0; + if ( res.isValid() ) { + QHash props = res.properties(); + mNepomukModel = new QStandardItemModel( props.count(), 2, this ); QStringList labels; - labels << i18n( "Attribute" ) << i18n( "Value" ); - mAttrModel->setHorizontalHeaderLabels( labels ); - for ( int i = 0; i < list.count(); ++i ) { - QModelIndex index = mAttrModel->index( i, 0 ); + labels << i18n( "Property" ) << i18n( "Value" ); + mNepomukModel->setHorizontalHeaderLabels( labels ); + int row = 0; + for ( QHash::ConstIterator it = props.begin(); it != props.end(); ++it, ++row ) { + QModelIndex index = mNepomukModel->index( row, 0 ); Q_ASSERT( index.isValid() ); - mAttrModel->setData( index, QString::fromLatin1( list[i]->type() ) ); - index = mAttrModel->index( i, 1 ); + mNepomukModel->setData( index, it.key().toString() ); + index = mNepomukModel->index( row, 1 ); Q_ASSERT( index.isValid() ); - mAttrModel->setData( index, QString::fromLatin1( list[i]->serialized() ) ); - mAttrModel->itemFromIndex( index )->setFlags( Qt::ItemIsEditable | mAttrModel->flags( index ) ); + mNepomukModel->setData( index, it.value().toString() ); } - contentUi.attrView->setModel( mAttrModel ); + contentUi.nepomukView->setEnabled( true ); + } else { + contentUi.nepomukView->setEnabled( false ); + } + contentUi.nepomukView->setModel( mNepomukModel ); - Nepomuk::Resource res( item.url() ); - delete mNepomukModel; - mNepomukModel = 0; - if ( res.isValid() ) { - QHash props = res.properties(); - mNepomukModel = new QStandardItemModel( props.count(), 2, this ); - QStringList labels; - labels << i18n( "Property" ) << i18n( "Value" ); - mNepomukModel->setHorizontalHeaderLabels( labels ); - int row = 0; - for ( QHash::ConstIterator it = props.begin(); it != props.end(); ++it, ++row ) { - QModelIndex index = mNepomukModel->index( row, 0 ); - Q_ASSERT( index.isValid() ); - mNepomukModel->setData( index, it.key().toString() ); - index = mNepomukModel->index( row, 1 ); - Q_ASSERT( index.isValid() ); - mNepomukModel->setData( index, it.value().toString() ); - } - contentUi.nepomukView->setEnabled( true ); - } else { - contentUi.nepomukView->setEnabled( false ); - } - contentUi.nepomukView->setModel( mNepomukModel ); - } + if ( mMonitor ) + mMonitor->deleteLater(); // might be the one calling us + mMonitor = new Monitor( this ); + mMonitor->setItemMonitored( item ); + mMonitor->itemFetchScope().fetchFullPayload(); + mMonitor->itemFetchScope().fetchAllAttributes(); + connect( mMonitor, SIGNAL(itemChanged(Akonadi::Item,QSet)), SLOT(setItem(Akonadi::Item)) ); } void BrowserWidget::modelChanged() --- trunk/KDE/kdepim/akonadi/clients/akonadiconsole/browserwidget.h #878754:878755 @@ -41,6 +41,7 @@ class ItemModel; class Job; class StandardActionManager; +class Monitor; } class BrowserWidget: public QWidget @@ -59,6 +60,7 @@ void saveResult( KJob* job ); void addAttribute(); void delAttribute(); + void setItem( const Akonadi::Item &item ); private: Akonadi::CollectionModel *mCollectionModel; @@ -71,6 +73,7 @@ QStandardItemModel *mAttrModel; QStandardItemModel *mNepomukModel; Akonadi::StandardActionManager *mStdActionManager; + Akonadi::Monitor *mMonitor; }; #endif