From 48b26a3141c2293ec33d1cda9df1226bf74c39ef Mon Sep 17 00:00:00 2001 From: Till Adam Date: Sun, 5 Sep 2004 09:47:30 +0000 Subject: [PATCH] Fix the flicker in a better way which makes closed subfolder count updating work again. We now keep a map of Folders to FolderTreeItems, the linear search is just too painfull for something that is called this often. svn path=/trunk/kdepim/; revision=344093 --- kmfoldertree.cpp | 20 +++++++------------- kmfoldertree.h | 21 +++++++++++++++++++-- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/kmfoldertree.cpp b/kmfoldertree.cpp index 0e13b1d2b..d7f8a05e0 100644 --- a/kmfoldertree.cpp +++ b/kmfoldertree.cpp @@ -71,7 +71,8 @@ KMFolderTreeItem::KMFolderTreeItem( KFolderTreeItem *parent, const QString & nam setPixmap( 0, normalIcon() ); } -KMFolderTreeItem::~KMFolderTreeItem() { +KMFolderTreeItem::~KMFolderTreeItem() +{ } static KFolderTreeItem::Protocol protocolFor( KMFolderType t ) { @@ -195,6 +196,9 @@ void KMFolderTreeItem::init() } if ( !mFolder->isSystemFolder() ) setRenameEnabled( 0, false ); + + KMFolderTree* tree = static_cast( listView() ); + tree->insertIntoFolderToItemMap( mFolder, this ); } void KMFolderTreeItem::adjustUnreadCount( int newUnreadCount ) { @@ -459,6 +463,7 @@ void KMFolderTree::reload(bool openFolders) if ( fti->isSelected() ) selected = fti->folder(); } + mFolderToItem.clear(); clear(); // construct the root of the local folders @@ -682,6 +687,7 @@ void KMFolderTree::slotFolderRemoved(KMFolder *aFolder) if (!qlvi) qlvi = fti->itemBelow(); doFolderSelected( qlvi ); } + removeFromFolderToItemMap( aFolder ); delete fti; } @@ -869,18 +875,6 @@ void KMFolderTree::resizeEvent(QResizeEvent* e) KListView::resizeEvent(e); } -//----------------------------------------------------------------------------- -QListViewItem* KMFolderTree::indexOfFolder(const KMFolder* folder) -{ - QListViewItem *i = firstChild(); - while ( i ) { - if ( static_cast(i)->folder() == folder ) - return i; - i = i->itemBelow(); - } - return 0; -} - //----------------------------------------------------------------------------- // show context menu void KMFolderTree::slotContextMenuRequested( QListViewItem *lvi, diff --git a/kmfoldertree.h b/kmfoldertree.h index 52b4e9878..de4f12ab6 100644 --- a/kmfoldertree.h +++ b/kmfoldertree.h @@ -113,8 +113,14 @@ public: virtual void addDirectory( KMFolderDir *fdir, KMFolderTreeItem* parent ); /** Find index of given folder. Returns 0 if not found */ - virtual QListViewItem* indexOfFolder(const KMFolder*); - + virtual QListViewItem* indexOfFolder( const KMFolder* folder ) const + { + if ( mFolderToItem.contains( folder ) ) + return mFolderToItem[ folder ]; + else + return 0; + } + /** create a folderlist */ void createFolderList( QStringList *str, QValueList > *folders, @@ -157,6 +163,16 @@ public: /** Select the folder and make sure it's visible */ void showFolder( KMFolder* ); + void insertIntoFolderToItemMap( const KMFolder *folder, KMFolderTreeItem* item ) + { + mFolderToItem.insert( folder, item ); + } + + void removeFromFolderToItemMap( const KMFolder *folder ) + { + mFolderToItem.remove( folder ); + } + signals: /** The selected folder has changed */ void folderSelected(KMFolder*); @@ -314,6 +330,7 @@ private: bool mShowPopupAfterDnD; KMMainWidget *mMainWidget; bool mReloading; + QMap mFolderToItem; }; #endif