diff --git a/kmmimeparttree.cpp b/kmmimeparttree.cpp index bfe68c280..3448a081b 100644 --- a/kmmimeparttree.cpp +++ b/kmmimeparttree.cpp @@ -23,13 +23,13 @@ KMMimePartTree::KMMimePartTree( KMReaderWin* readerWin, QWidget* parent, const char* name ) : KListView( parent, name ), - mReaderWin( readerWin ) + mReaderWin( readerWin ), mSizeColumn(0) { setStyleDependantFrameWidth(); addColumn( i18n("Description") ); addColumn( i18n("Type") ); addColumn( i18n("Encoding") ); - addColumn( i18n("Size") ); + mSizeColumn = addColumn( i18n("Size") ); setColumnAlignment( 3, Qt::AlignRight ); restoreLayoutIfPresent(); @@ -192,6 +192,23 @@ void KMMimePartTree::styleChange( QStyle& oldStyle ) KListView::styleChange( oldStyle ); } +//----------------------------------------------------------------------------- +void KMMimePartTree::correctSize( QListViewItem * item ) +{ + if (!item) return; + + KIO::filesize_t totalSize = 0; + QListViewItem * myChild = item->firstChild(); + while ( myChild ) + { + totalSize += static_cast(myChild)->origSize(); + myChild = myChild->nextSibling(); + } + if ( totalSize > static_cast(item)->origSize() ) + item->setText( mSizeColumn, KIO::convertSize(totalSize) ); + if ( item->parent() ) + correctSize( item->parent() ); +} //============================================================================= KMMimePartTreeItem::KMMimePartTreeItem( KMMimePartTree * parent, @@ -204,11 +221,13 @@ KMMimePartTreeItem::KMMimePartTreeItem( KMMimePartTree * parent, QString::null, // set by setIconAndTextForType() encoding, KIO::convertSize( size ) ), - mPartNode( node ) + mPartNode( node ), mOrigSize(size) { if( node ) node->setMimePartTreeItem( this ); setIconAndTextForType( mimetype ); + if ( parent ) + parent->correctSize(this); } KMMimePartTreeItem::KMMimePartTreeItem( KMMimePartTreeItem * parent, @@ -222,7 +241,7 @@ KMMimePartTreeItem::KMMimePartTreeItem( KMMimePartTreeItem * parent, QString::null, // set by setIconAndTextForType() encoding, KIO::convertSize( size ) ), - mPartNode( node ) + mPartNode( node ), mOrigSize(size) { if( revertOrder && nextSibling() ){ QListViewItem* sib = nextSibling(); @@ -233,6 +252,8 @@ KMMimePartTreeItem::KMMimePartTreeItem( KMMimePartTreeItem * parent, if( node ) node->setMimePartTreeItem( this ); setIconAndTextForType( mimetype ); + if ( listView() ) + static_cast(listView())->correctSize(this); } void KMMimePartTreeItem::setIconAndTextForType( const QString & mime ) @@ -252,5 +273,4 @@ void KMMimePartTreeItem::setIconAndTextForType( const QString & mime ) } - #include "kmmimeparttree.moc" diff --git a/kmmimeparttree.h b/kmmimeparttree.h index b51fcc212..a1b31d707 100644 --- a/kmmimeparttree.h +++ b/kmmimeparttree.h @@ -22,6 +22,8 @@ public: const char* name = 0 ); virtual ~KMMimePartTree(); + void correctSize( QListViewItem * item ); + protected slots: void itemClicked( QListViewItem* ); void itemRightClicked( QListViewItem*, const QPoint& ); @@ -45,6 +47,7 @@ protected: protected: KMReaderWin* mReaderWin; KMMimePartTreeItem* mCurrentContextMenuItem; + int mSizeColumn; }; class KMMimePartTreeItem :public QListViewItem @@ -65,10 +68,14 @@ public: bool revertOrder = false ); partNode* node() const { return mPartNode; } + KIO::filesize_t origSize() const { return mOrigSize; } + void setOrigSize( KIO::filesize_t size ) { mOrigSize = size; } + private: void setIconAndTextForType( const QString & mimetype ); partNode* mPartNode; + KIO::filesize_t mOrigSize; }; #endif // KMMIMEPARTTREE_H