From acc2b77512ce0d8d708dda14dec1464f3eed830c Mon Sep 17 00:00:00 2001 From: tpearson Date: Fri, 14 May 2010 02:06:47 +0000 Subject: Second batch of kdepim stability and functionality repairs git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1126473 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kaddressbook/features/resourceselection.cpp | 87 +++++++++++++++++++++++------ 1 file changed, 71 insertions(+), 16 deletions(-) (limited to 'kaddressbook/features/resourceselection.cpp') diff --git a/kaddressbook/features/resourceselection.cpp b/kaddressbook/features/resourceselection.cpp index c7e89dbf5..c18d8b168 100644 --- a/kaddressbook/features/resourceselection.cpp +++ b/kaddressbook/features/resourceselection.cpp @@ -82,7 +82,10 @@ class ResourceItem : public QCheckListItem void createSubresourceItems(); - void setChecked( bool state ) { mChecked = state; } + void setChecked( bool state ) { + mChecked = state; + setOn(state); + } bool checked() const { return mChecked; } KABC::Resource *resource() const { return mResource; } QString resourceIdentifier() const { return mResourceIdentifier; } @@ -117,15 +120,6 @@ void ResourceItem::createSubresourceItems() mSubItemsCreated = true; } -// TODO: connect this to some signalResourceModified -// void ResourceItem::setGuiState() -// { -// if ( mIsSubresource ) -// setOn( mResource->subresourceActive( mResourceIdentifier ) ); -// else -// setOn( mResource->isActive() ); -// } - void ResourceItem::stateChange( bool active ) { //kdDebug(5720) << k_funcinfo << this << " " << text( 0 ) << " active=" << active << endl; @@ -216,13 +210,18 @@ void ResourceSelection::edit() if ( !item ) return; - KRES::ConfigDialog dlg( this, QString( "contact" ), item->resource() ); + // view items can change during "edit", e.g. sub resources being removed -> + // sub resource item removed + // thus keep their data rather than their pointer + KABC::Resource *resource = item->resource(); + + KRES::ConfigDialog dlg( this, QString( "contact" ), resource ); if ( dlg.exec() ) { - mManager->change( item->resource() ); - item->resource()->asyncLoad(); + mManager->change( resource ); + resource->asyncLoad(); - mLastResource = item->resource()->identifier(); + mLastResource = resource->identifier(); updateView(); } } @@ -300,7 +299,7 @@ void ResourceSelection::updateView() KRES::Manager::Iterator it; for ( it = mManager->begin(); it != mManager->end(); ++it ) { - new ResourceItem( mListView, *it ); + ResourceItem *item = new ResourceItem( mListView, *it ); KPIM::ResourceABC* resource = dynamic_cast( *it ); if ( resource ) { disconnect( resource, 0, this, 0 ); @@ -313,8 +312,15 @@ void ResourceSelection::updateView() const QString &, const QString & ) ), SLOT( slotSubresourceRemoved( KPIM::ResourceABC *, const QString &, const QString & ) ) ); + + connect( resource, SIGNAL( signalSubresourceChanged( KPIM::ResourceABC *, + const QString &, const QString & ) ), + SLOT( slotSubresourceChanged( KPIM::ResourceABC *, + const QString &, const QString & ) ) ); + //connect( resource, SIGNAL( resourceSaved( KPIM::ResourceABC * ) ), // SLOT( closeResource( KPIM::ResourceABC * ) ) ); + item->createSubresourceItems(); } } @@ -345,7 +351,13 @@ void ResourceSelection::slotSubresourceAdded( KPIM::ResourceABC *resource, return; ResourceItem *item = static_cast( i ); - (void)new ResourceItem( resource, item, subResource ); + // Make sure all other sub items have already been created + item->createSubresourceItems(); + + // check if we already have an item for it + if ( !findSubResourceItem( resource, subResource ) ) { + (void)new ResourceItem( resource, item, subResource ); + } } // Remove an entry @@ -353,6 +365,30 @@ void ResourceSelection::slotSubresourceRemoved( KPIM::ResourceABC* resource, const QString& /*type*/, const QString& subResource ) { + ResourceItem *item = findSubResourceItem( resource, subResource ); + delete item; + core()->addressBook()->emitAddressBookChanged(); + updateView(); +} + +// change an entry +void ResourceSelection::slotSubresourceChanged( KPIM::ResourceABC* resource, + const QString& type, + const QString& subResource ) +{ + kdDebug(5720) << resource->resourceName() << subResource; + + ResourceItem *item = findSubResourceItem( resource, subResource ); + if ( item == 0 ) { + kdWarning(5720) << "Changed before it was added?"; + slotSubresourceAdded( resource, type, subResource ); + return; + } + + item->setText( 0, resource->subresourceLabel( subResource ) ); + item->setChecked( resource->subresourceActive( subResource ) ? true : false ); + // TODO + //emitResourcesChanged(); core()->addressBook()->emitAddressBookChanged(); updateView(); } @@ -362,6 +398,25 @@ ResourceItem* ResourceSelection::selectedItem() const return static_cast( mListView->selectedItem() ); } +ResourceItem* ResourceSelection::findSubResourceItem( KPIM::ResourceABC *resource, + const QString &subResource ) +{ + QListViewItemIterator parentIt( mListView ); + for ( ; *parentIt; ++parentIt ) { + if ( static_cast(*parentIt)->resource() != resource ) + continue; + + QListViewItemIterator childIt( *parentIt ); + for ( ; *childIt; ++childIt ) { + ResourceItem *item = static_cast(*childIt); + if ( item->resourceIdentifier() == subResource ) + return item; + } + } + + return 0; +} + void ResourceSelection::initGUI() { QBoxLayout *topLayout = new QVBoxLayout( this ); -- cgit v1.2.1