--------------Boundary-00=_VZ05QVACS8IR897KQ1IZ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit On Friday 18 January 2002 01:36, Dirk Mueller wrote: > On Don, 17 Jan 2002, Waldo Bastian wrote: > > > I don't know the level of caching that QMovie does internally (e.g. whether it > > keeps decoded frames around). > > it does not. > > > If it does then caching might save you some CPU > > cycles there but I doubt that it does. Better let the disk cache do its work. > > yeah, but if you don't have it in the disk cache and heavy I/O going on > it's looking jumpy. thats where caching the thing in iconview for some > limited time is good. I implemented the cache now - and checked with strace() that it didn't open the folder.mng animation more than once. Having it cached in the iconview saves a pointer in each iconview item anyway, which is a good memory saving. Yes, the disk cache was working quite well, but it's indeed only performant on a relatively idle machine. The new patches attached implement all the requests I got: * fixed bug with the Trash (KFileItem bug) + some KFileItem restructuring (bitfield) * moved movie to the iconview * d pointer in kiconviewitem * configuration option, with all the code needed for dynamic updates * fixed a bug that made the previous patch break the delayed-mimetype-determination I don't think the movie takes much memory - does it ? If yes, discarding the movie if unused after some time (how much?) should be implemented, that might be the only missing thing now. Difficult choice - the usual memory vs speed tradeoff. Ok, it's not a very small patch anymore, but I have tested it quite intensively now (including checking with strace to check the disk accesses). The question of the default setting (on or off) remains - but in fact with KPersonalizer the question is rather void: all that's needed is that someone makes KPersonalizer save the value for animated icons depending on the level of gimmicks selected (kdeglobals, [DesktopIcon], Animated=true or false). Can someone take care of that ? I don't know KPersonalizer at all. Ah, forgot to include the am_edit patch again, see previous mail ;) -- David FAURE, david@mandrakesoft.com, faure@kde.org http://people.mandrakesoft.com/~david, http://www.konqueror.org KDE 3.0: Konquering the Desktops --------------Boundary-00=_VZ05QVACS8IR897KQ1IZ Content-Type: text/x-diff; charset="iso-8859-1"; name="animated_icons_iconview.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="animated_icons_iconview.diff" Index: konq_iconview.cc =================================================================== RCS file: /home/kde/kdebase/konqueror/iconview/konq_iconview.cc,v retrieving revision 1.373 diff -u -p -r1.373 konq_iconview.cc --- konq_iconview.cc 2002/01/16 10:30:43 1.373 +++ konq_iconview.cc 2002/01/18 14:09:55 @@ -663,7 +663,7 @@ void KonqKfmIconView::slotNewItems( cons item->setKey( key ); - //kdDebug() << "KonqKfmIconView::slotNewItems " << _fileitem->url().url() << " " << _fileitem->mimeTypePtr()->name() << endl; + //kdDebug() << "KonqKfmIconView::slotNewItems " << (*it)->url().url() << " " << (*it)->mimeTypePtr()->name() << " mimetypeknown:" << (*it)->isMimeTypeKnown() << endl; if ( !(*it)->isMimeTypeKnown() ) m_mimeTypeResolver->m_lstPendingMimeIconItems.append( item ); @@ -742,11 +742,13 @@ void KonqKfmIconView::slotSelectionChang void KonqKfmIconView::determineIcon( KFileIVI * item ) { + // kdDebug() << "KonqKfmIconView::determineIcon " << item->item()->name() << endl; int oldSerial = item->pixmap()->serialNumber(); (void) item->item()->determineMimeType(); item->setIcon( iconSize(), item->state(), true, true ); + item->setMouseOverAnimation( item->item()->iconName() ); } void KonqKfmIconView::mimeTypeDeterminationFinished() --------------Boundary-00=_VZ05QVACS8IR897KQ1IZ Content-Type: text/x-diff; charset="iso-8859-1"; name="animated_icons_kcontrol.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="animated_icons_kcontrol.diff" Index: icons.cpp =================================================================== RCS file: /home/kde/kdebase/kcontrol/icons/icons.cpp,v retrieving revision 1.16 diff -u -p -r1.16 icons.cpp --- icons.cpp 2001/10/23 22:48:28 1.16 +++ icons.cpp 2002/01/18 13:59:48 @@ -89,13 +89,17 @@ KIconConfig::KIconConfig(QWidget *parent mpDPCheck = new QCheckBox(i18n("Double-sized pixels"), m_pTab1); connect(mpDPCheck, SIGNAL(toggled(bool)), SLOT(slotDPCheck(bool))); - grid->addWidget(mpDPCheck, 1, 0, Qt::AlignLeft); + grid->addMultiCellWidget(mpDPCheck, 1, 1, 0, 1, Qt::AlignLeft); mpAlphaBCheck = new QCheckBox(i18n("Blend alpha channel"), m_pTab1); connect(mpAlphaBCheck, SIGNAL(toggled(bool)), SLOT(slotAlphaBCheck(bool))); - grid->addWidget(mpAlphaBCheck, 2, 0, Qt::AlignLeft); + grid->addMultiCellWidget(mpAlphaBCheck, 2, 2, 0, 1, Qt::AlignLeft); disableAlphaBlending = (QPixmap::defaultDepth()<=8); + mpAnimatedCheck = new QCheckBox(i18n("Animate icons"), m_pTab1); + connect(mpAnimatedCheck, SIGNAL(toggled(bool)), SLOT(slotAnimatedCheck(bool))); + grid->addMultiCellWidget(mpAnimatedCheck, 3, 3, 0, 1, Qt::AlignLeft); + top->activate(); init(); @@ -168,12 +172,17 @@ void KIconConfig::initDefaults() mbDP[i] = false; mbAlphaB[i] = false; mbChanged[i] = true; + mbAnimated[i] = false; mSizes[i] = mpTheme->defaultSize(i); mEffects[i][0] = mDefaultEffect[0]; mEffects[i][1] = mDefaultEffect[1]; mEffects[i][2] = mDefaultEffect[2]; } + // Animate desktop icons by default + int group = mGroups.findIndex( "Desktop" ); + if ( group != -1 ) + mbAnimated[group] = true; // This is the new default in KDE 2.2, in sync with the kiconeffect of kdelibs Nolden 2001/06/11 int activeState = mStates.findIndex( "Active" ); @@ -215,6 +224,7 @@ void KIconConfig::read() mSizes[i] = mpConfig->readNumEntry("Size", mSizes[i]); mbDP[i] = mpConfig->readBoolEntry("DoublePixels", mbDP[i]); mbAlphaB[i] = mpConfig->readBoolEntry("AlphaBlending", mbAlphaB[i]); + mbAnimated[i] = mpConfig->readBoolEntry("Animated", mbAnimated[i]); for (it2=mStates.begin(), j=0; it2!=mStates.end(); it2++, j++) { @@ -264,6 +274,7 @@ void KIconConfig::apply() } mpDPCheck->setChecked(mbDP[mUsage]); mpAlphaBCheck->setChecked(mbAlphaB[mUsage]); + mpAnimatedCheck->setChecked(mbAnimated[mUsage]); } void KIconConfig::preview(int i) @@ -313,6 +324,7 @@ void KIconConfig::save() mpConfig->writeEntry("Size", mSizes[i], true, true); mpConfig->writeEntry("DoublePixels", mbDP[i], true, true); mpConfig->writeEntry("AlphaBlending", mbAlphaB[i], true, true); + mpConfig->writeEntry("Animated", mbAnimated[i], true, true); for (it2=mStates.begin(), j=0; it2!=mStates.end(); it2++, j++) { QString tmp; @@ -373,13 +385,15 @@ void KIconConfig::slotUsage(int index) mpDPCheck->setEnabled(false); if (!disableAlphaBlending) mpAlphaBCheck->setEnabled(true); + mpAnimatedCheck->setEnabled(false); } else { mpSizeBox->setEnabled(true); mpDPCheck->setEnabled(true); if (!disableAlphaBlending) - mpAlphaBCheck->setEnabled( (mUsage==KIcon::Desktop)? true : false); + mpAlphaBCheck->setEnabled( mUsage==KIcon::Desktop ); + mpAnimatedCheck->setEnabled( mUsage==KIcon::Desktop ); } if (disableAlphaBlending) mpAlphaBCheck->setEnabled(false); @@ -440,6 +454,13 @@ void KIconConfig::slotAlphaBCheck(bool c // take effect when restarting KDE. // preview(); + emit changed(true); + mbChanged[mUsage] = true; +} + +void KIconConfig::slotAnimatedCheck(bool check) +{ + mbAnimated[mUsage] = check; emit changed(true); mbChanged[mUsage] = true; } Index: icons.h =================================================================== RCS file: /home/kde/kdebase/kcontrol/icons/icons.h,v retrieving revision 1.6 diff -u -p -r1.6 icons.h --- icons.h 2001/07/20 17:57:50 1.6 +++ icons.h 2002/01/18 13:59:48 @@ -75,6 +75,7 @@ private slots: void slotSize(int index); void slotDPCheck(bool check); void slotAlphaBCheck(bool check); + void slotAnimatedCheck(bool check); private: void preview(int i); @@ -86,7 +87,7 @@ private: void apply(); - bool mbDP[6], mbAlphaB[6], mbChanged[6]; + bool mbDP[6], mbAlphaB[6], mbChanged[6], mbAnimated[6]; int mSizes[6]; QValueList mAvSizes[6]; @@ -107,7 +108,7 @@ private: QListBox *mpUsageList; QComboBox *mpSizeBox; - QCheckBox *mpDPCheck, *wordWrapCB, *underlineCB, *mpAlphaBCheck; + QCheckBox *mpDPCheck, *wordWrapCB, *underlineCB, *mpAlphaBCheck, *mpAnimatedCheck; bool disableAlphaBlending; QTabWidget *m_pTabWidget; QWidget *m_pTab1; --------------Boundary-00=_VZ05QVACS8IR897KQ1IZ Content-Type: text/x-diff; charset="iso-8859-1"; name="animated_icons_kdelibs.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="animated_icons_kdelibs.diff" Index: kiconview.cpp =================================================================== RCS file: /home/kde/kdelibs/kdeui/kiconview.cpp,v retrieving revision 1.50 diff -u -p -r1.50 kiconview.cpp --- kiconview.cpp 2001/12/10 23:10:28 1.50 +++ kiconview.cpp 2002/01/18 14:08:54 @@ -19,6 +19,7 @@ #include #include #include +#include #include "kiconview.h" #include "kwordwrap.h" @@ -31,6 +32,8 @@ #include #include #include +#include +#include #ifdef Q_WS_X11 #include @@ -41,11 +44,16 @@ class KIconView::KIconViewPrivate public: KIconViewPrivate() { mode = KIconView::Execute; - doAutoSelect = TRUE; + doAutoSelect = true; + doAnimations = true; fm = 0L; + m_movie = 0L; } KIconView::Mode mode; bool doAutoSelect; + bool doAnimations; + QMovie* m_movie; + QString movieFileName; QFontMetrics *fm; QPixmapCache maskCache; }; @@ -60,8 +68,11 @@ KIconView::KIconView( QWidget *parent, c connect( this, SIGNAL( onItem( QIconViewItem * ) ), this, SLOT( slotOnItem( QIconViewItem * ) ) ); slotSettingsChanged( KApplication::SETTINGS_MOUSE ); + slotIconChanged( KIcon::Desktop ); connect( kapp, SIGNAL( settingsChanged(int) ), SLOT( slotSettingsChanged(int) ) ); + connect( kapp, SIGNAL( iconChanged(int) ), SLOT( slotIconChanged(int) ) ); kapp->addKipcEventMask( KIPC::SettingsChanged ); + kapp->addKipcEventMask( KIPC::IconChanged ); m_pCurrentItem = 0L; @@ -72,6 +83,7 @@ KIconView::KIconView( QWidget *parent, c KIconView::~KIconView() { + delete d->m_movie; delete d->fm; delete d; } @@ -89,24 +101,72 @@ KIconView::Mode KIconView::mode() const void KIconView::slotOnItem( QIconViewItem *item ) { - if ( item && m_bChangeCursorOverItem && m_bUseSingle ) - viewport()->setCursor( KCursor().handCursor() ); + if ( item ) { + if ( m_bUseSingle ) { + if ( m_bChangeCursorOverItem ) + viewport()->setCursor( KCursor().handCursor() ); - if ( item && (m_autoSelectDelay > -1) && m_bUseSingle ) { - m_pAutoSelect->start( m_autoSelectDelay, true ); - m_pCurrentItem = item; + if ( (m_autoSelectDelay > -1) ) { + m_pAutoSelect->start( m_autoSelectDelay, true ); + } + } + if ( d->doAnimations && m_pCurrentItem != item ) { + KIconViewItem *kivi = dynamic_cast( item ); + if ( kivi && kivi->hasAnimation() ) + { + // Check if cached movie can be used + if ( d->m_movie && d->movieFileName == kivi->mouseOverAnimation() ) + { + d->m_movie->restart(); + } + else + { + // If the file can't be loaded (e.g. no mng support), the movie will + // simply never call updatePixmap, so no problem. + QMovie movie = KGlobal::iconLoader()->loadMovie( kivi->mouseOverAnimation(), KIcon::Desktop, kivi->iconSize() ); + if ( !movie.isNull() ) + { + delete d->m_movie; + d->m_movie = new QMovie( movie ); // shallow copy, don't worry + d->m_movie->connectUpdate( this, SLOT( slotMovieUpdate() ) ); + d->movieFileName = kivi->mouseOverAnimation(); + } + else + { + // No movie available, remember it + kivi->setMouseOverAnimation( QString::null ); + } + } + } + } + m_pCurrentItem = item; } } void KIconView::slotOnViewport() { - if ( m_bChangeCursorOverItem ) + if ( m_bUseSingle && m_bChangeCursorOverItem ) viewport()->unsetCursor(); + if ( m_pCurrentItem && d->doAnimations && d->m_movie ) { + d->m_movie->pause(); + //delete d->m_movie; + //d->m_movie = 0L; + // TODO a timer to delete the movie after some time if unused? + } m_pAutoSelect->stop(); m_pCurrentItem = 0L; } +void KIconView::slotMovieUpdate() +{ + Q_ASSERT( d ); + Q_ASSERT( d->m_movie ); + KIconViewItem *kivi = dynamic_cast( m_pCurrentItem ); + if ( kivi && d->m_movie ) // seems stopAnimation triggers one last update + kivi->setPixmap( d->m_movie->framePixmap() ); +} + void KIconView::slotSettingsChanged(int category) { if ( category != KApplication::SETTINGS_MOUSE ) @@ -143,6 +203,14 @@ void KIconView::slotSettingsChanged(int viewport()->unsetCursor(); } +void KIconView::slotIconChanged( int group ) +{ + if ( group != KIcon::Desktop ) + return; + KConfigGroup cfgGroup( KGlobal::config(), "DesktopIcons" ); + d->doAnimations = cfgGroup.readBoolEntry( "Animated", true /*default*/ ); +} + void KIconView::slotAutoSelect() { // check that the item still exists @@ -340,15 +408,24 @@ QPixmap KIconView::selectedIconPixmap( Q ///////////// +struct KIconViewItem::KIconViewItemPrivate +{ + QString m_animatedIcon; + // Warning: if you add anything here, remove the "create d on demand + // and delete d in setMouseOverAnimation(QString::null)" code +}; + void KIconViewItem::init() { m_wordWrap = 0L; + d = 0L; // currently created on demand calcRect(); } KIconViewItem::~KIconViewItem() { delete m_wordWrap; + delete d; } void KIconViewItem::calcRect( const QString& text_ ) @@ -556,6 +633,32 @@ void KIconViewItem::paintItem( QPainter m_wordWrap->drawText( p, textX, textY, align ); p->restore(); +} + +bool KIconViewItem::hasAnimation() const +{ + return d && !d->m_animatedIcon.isEmpty(); +} + +void KIconViewItem::setMouseOverAnimation( const QString& movieFileName ) +{ + if ( movieFileName.isEmpty() ) { + // Only valid because we have nothing else in 'd' + delete d; + d = 0L; + } else { + if (!d) + d = new KIconViewItemPrivate; + //kdDebug() << "KIconViewItem::setMouseOverAnimation " << movieFileName << endl; + d->m_animatedIcon = movieFileName; + } +} + +QString KIconViewItem::mouseOverAnimation() const +{ + if (!d) + return QString::null; + return d->m_animatedIcon; } #include "kiconview.moc" Index: kiconview.h =================================================================== RCS file: /home/kde/kdelibs/kdeui/kiconview.h,v retrieving revision 1.28 diff -u -p -r1.28 kiconview.h --- kiconview.h 2001/12/10 23:10:28 1.28 +++ kiconview.h 2002/01/18 14:08:54 @@ -117,8 +117,9 @@ signals: protected slots: void slotOnItem( QIconViewItem *item ); void slotOnViewport(); - + void slotMovieUpdate(); void slotSettingsChanged(int); + void slotIconChanged( int ); /** * Auto selection happend. @@ -134,14 +135,6 @@ protected: virtual void contentsMouseDoubleClickEvent ( QMouseEvent * e ); virtual void contentsMouseReleaseEvent( QMouseEvent *e ); - bool m_bUseSingle; - bool m_bChangeCursorOverItem; - - QIconViewItem* m_pCurrentItem; - - QTimer* m_pAutoSelect; - int m_autoSelectDelay; - private slots: void slotMouseButtonClicked( int btn, QIconViewItem *item, const QPoint &pos ); @@ -155,6 +148,14 @@ private: */ QPixmap selectedIconPixmap( QPixmap *pix, const QColor &col ) const; + bool m_bUseSingle; + bool m_bChangeCursorOverItem; + + QIconViewItem* m_pCurrentItem; + + QTimer* m_pAutoSelect; + int m_autoSelectDelay; + class KIconViewPrivate; KIconViewPrivate *d; }; @@ -164,6 +165,8 @@ class KWordWrap; * KIconViewItem exists to improve the word-wrap functionality of QIconViewItem * Use KIconViewItem instead of QIconViewItem for any iconview item you might have :) * + * This class also provides support for animated icons. + * * @short A variant of QIconViewItem that wraps words better. * @author David Faure */ @@ -188,12 +191,36 @@ public: KIconViewItem( QIconView *parent, QIconViewItem *after, const QString &text, const QPicture &picture ) : QIconViewItem( parent, after, text, picture ) { init(); } virtual ~KIconViewItem(); + + /** + * Return the theorical size in pixels, if setSize() was called. + * 0 means the globally configured default size. + */ + int iconSize() const { return m_size; } + + /** + * Enable an animation on mouseover, if there is an available mng. + * @param movieFileName the base name for the mng, e.g. "folder". + * Nothing happens if there is no animation available. + */ + void setMouseOverAnimation( const QString& movieFileName ); + QString mouseOverAnimation() const; + bool hasAnimation() const; + protected: + /** + * Set the theorical size in pixels - this is only useful for derived classes + */ + void setIconSize( int size ) { m_size = size; } + void init(); virtual void calcRect( const QString& text_ = QString::null ); virtual void paintItem( QPainter *p, const QColorGroup &c ); private: + int m_size; // theorical size in pixels. Zero means the globally configured default size. KWordWrap* m_wordWrap; + class KIconViewItemPrivate; + KIconViewItemPrivate* d; }; #endif --------------Boundary-00=_VZ05QVACS8IR897KQ1IZ Content-Type: text/x-diff; charset="iso-8859-1"; name="animated_icons_libkonq.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="animated_icons_libkonq.diff" Index: kfileivi.cc =================================================================== RCS file: /home/kde/kdebase/libkonq/kfileivi.cc,v retrieving revision 1.63 diff -u -p -r1.63 kfileivi.cc --- kfileivi.cc 2002/01/10 14:46:47 1.63 +++ kfileivi.cc 2002/01/18 14:00:03 @@ -26,6 +26,7 @@ #include #include #include +#include #undef Bool @@ -43,15 +44,20 @@ struct KFileIVI::Private KFileIVI::KFileIVI( KonqIconViewWidget *iconview, KFileItem* fileitem, int size ) : KIconViewItem( iconview, fileitem->text(), fileitem->pixmap( size, KIcon::DefaultState ) ), - m_size(size), m_state( KIcon::DefaultState ), + m_state( KIcon::DefaultState ), m_bDisabled( false ), m_bThumbnail( false ), m_fileitem( fileitem ) { + setIconSize( size ); setDropEnabled( S_ISDIR( m_fileitem->mode() ) ); d = new KFileIVI::Private; // Cache entry for the icon effects d->icons.reset( *pixmap(), QIconSet::Large ); d->state = KIcon::DefaultState; + + // iconName() requires the mimetype to be known + if ( fileitem->isMimeTypeKnown() ) + setMouseOverAnimation( fileitem->iconName() ); } KFileIVI::~KFileIVI() @@ -87,7 +93,7 @@ void KFileIVI::invalidateThumb( int stat void KFileIVI::setIcon( int size, int state, bool recalc, bool redraw ) { - m_size = size; + setIconSize( size ); m_bThumbnail = false; if ( m_bDisabled ) m_state = KIcon::DisabledState; @@ -113,7 +119,7 @@ void KFileIVI::setIcon( int size, int st // called with any state and not just normal state. So we just // create a dummy empty iconset as base object. d->icons = QIconSet(); - d->icons.setPixmap( m_fileitem->pixmap( m_size, m_state ), + d->icons.setPixmap( m_fileitem->pixmap( iconSize(), m_state ), QIconSet::Large, mode ); d->state = m_state; QIconViewItem::setPixmap( d->icons.pixmap( QIconSet::Large, mode ), @@ -126,7 +132,7 @@ void KFileIVI::setDisabled( bool disable { m_bDisabled = disabled; m_state = m_bDisabled ? KIcon::DisabledState : KIcon::DefaultState; - QIconViewItem::setPixmap( m_fileitem->pixmap( m_size, m_state ), false, true ); + QIconViewItem::setPixmap( m_fileitem->pixmap( iconSize(), m_state ), false, true ); } } @@ -186,7 +192,7 @@ void KFileIVI::setEffect( int group, int else { if( d->icons.isGenerated( QIconSet::Large, mode ) ) - d->icons.setPixmap( m_fileitem->pixmap( m_size, state ), + d->icons.setPixmap( m_fileitem->pixmap( iconSize(), state ), QIconSet::Large, mode ); } QIconViewItem::setPixmap( d->icons.pixmap( QIconSet::Large, mode ) ); @@ -197,7 +203,7 @@ void KFileIVI::setEffect( int group, int void KFileIVI::refreshIcon( bool redraw ) { if ( !isThumbnail()) - setIcon( m_size, m_state, true, redraw ); + setIcon( iconSize(), m_state, true, redraw ); } bool KFileIVI::acceptDrop( const QMimeSource *mime ) const Index: kfileivi.h =================================================================== RCS file: /home/kde/kdebase/libkonq/kfileivi.h,v retrieving revision 1.41 diff -u -p -r1.41 kfileivi.h --- kfileivi.h 2002/01/10 14:46:47 1.41 +++ kfileivi.h 2002/01/18 14:00:03 @@ -138,7 +138,7 @@ private: virtual void setPixmap ( const QPixmap & icon ) { KIconViewItem::setPixmap( icon ); } virtual void setPixmap ( const QPixmap & icon, bool recalc, bool redraw = TRUE ) { KIconViewItem::setPixmap( icon, recalc, redraw ); } - int m_size, m_state; + int m_state; bool m_bDisabled; bool m_bThumbnail; /** Pointer to the file item in KDirLister's list */ --------------Boundary-00=_VZ05QVACS8IR897KQ1IZ Content-Type: text/x-diff; charset="iso-8859-1"; name="animated_icons_kfileitem.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="animated_icons_kfileitem.diff" Index: kfileitem.cpp =================================================================== RCS file: /home/kde/kdelibs/kio/kio/kfileitem.cpp,v retrieving revision 1.112 diff -u -p -r1.112 kfileitem.cpp --- kfileitem.cpp 2002/01/18 03:24:04 1.112 +++ kfileitem.cpp 2002/01/18 14:10:12 @@ -47,14 +47,12 @@ class KFileItem::KFileItemPrivate { public: KFileItemPrivate() { - bMimeTypeKnown = false; refresh(); } void operator=( const KFileItemPrivate& d ) { guessedMimeType = d.guessedMimeType; access = d.access; - bMimeTypeKnown = d.bMimeTypeKnown; for ( int i = 0; i < NumFlags; i++ ) time[i] = d.time[i]; size = d.size; @@ -72,7 +70,6 @@ public: // For special case like link to dirs over FTP QString guessedMimeType; QString access; - bool bMimeTypeKnown; QMap extra; KFileMetaInfo metaInfo; @@ -85,12 +82,13 @@ KFileItem::KFileItem( const KIO::UDSEntr bool _determineMimeTypeOnDemand, bool _urlIsDirectory ) : m_entry( _entry ), m_url( _url ), - m_bIsLocalURL( _url.isLocalFile() ), + m_pMimeType( 0 ), m_fileMode( (mode_t)-1 ), m_permissions( (mode_t)-1 ), - m_bLink( false ), - m_pMimeType( 0 ), m_bMarked( false ), + m_bLink( false ), + m_bIsLocalURL( _url.isLocalFile() ), + m_bMimeTypeKnown( false ), d(new KFileItemPrivate) { bool UDS_URL_seen = false; @@ -127,7 +125,7 @@ KFileItem::KFileItem( const KIO::UDSEntr case KIO::UDS_MIME_TYPE: m_pMimeType = KMimeType::mimeType((*it).m_str); - d->bMimeTypeKnown = true; + m_bMimeTypeKnown = true; break; case KIO::UDS_GUESSED_MIME_TYPE: @@ -149,13 +147,14 @@ KFileItem::KFileItem( const KIO::UDSEntr KFileItem::KFileItem( mode_t _mode, mode_t _permissions, const KURL& _url, bool _determineMimeTypeOnDemand ) : m_entry(), // warning ! m_url( _url ), - m_bIsLocalURL( _url.isLocalFile() ), m_strName( _url.fileName() ), m_strText( KIO::decodeFileName( m_strName ) ), m_fileMode ( _mode ), m_permissions( _permissions ), - m_bLink( false ), m_bMarked( false ), + m_bLink( false ), + m_bIsLocalURL( _url.isLocalFile() ), + m_bMimeTypeKnown( false ), d(new KFileItemPrivate) { init( _determineMimeTypeOnDemand ); @@ -163,13 +162,14 @@ KFileItem::KFileItem( mode_t _mode, mode KFileItem::KFileItem( const KURL &url, const QString &mimeType, mode_t mode ) : m_url( url ), - m_bIsLocalURL( url.isLocalFile() ), m_strName( url.fileName() ), m_strText( KIO::decodeFileName( m_strName ) ), m_fileMode( mode ), m_permissions( 0 ), - m_bLink( false ), m_bMarked( false ), + m_bLink( false ), + m_bIsLocalURL( url.isLocalFile() ), + m_bMimeTypeKnown( false ), d(new KFileItemPrivate) { m_pMimeType = KMimeType::mimeType( mimeType ); @@ -231,7 +231,7 @@ void KFileItem::init( bool _determineMim _determineMimeTypeOnDemand ); // if we didn't use fast mode, or if we got a result, then this is the mimetype // otherwise, determineMimeType will be able to do better. - d->bMimeTypeKnown = (!_determineMimeTypeOnDemand) || (m_pMimeType->name() != KMimeType::defaultMimeType()); + m_bMimeTypeKnown = (!_determineMimeTypeOnDemand) || (m_pMimeType->name() != KMimeType::defaultMimeType()); } } @@ -391,11 +391,11 @@ QString KFileItem::mimetype() const KMimeType::Ptr KFileItem::determineMimeType() { - if ( !m_pMimeType || !d->bMimeTypeKnown ) + if ( !m_pMimeType || !m_bMimeTypeKnown ) { - //kdDebug(1203) << "finding mimetype for " << m_url.url() << endl; m_pMimeType = KMimeType::findByURL( m_url, m_fileMode, m_bIsLocalURL ); - d->bMimeTypeKnown = true; + kdDebug(1203) << "finding mimetype for " << m_url.url() << ":" << m_pMimeType->name() << endl; + m_bMimeTypeKnown = true; } return m_pMimeType; @@ -406,13 +406,13 @@ bool KFileItem::isMimeTypeKnown() const // The mimetype isn't known if determineMimeType was never called (on-demand determination) // or if this fileitem has a guessed mimetype (e.g. ftp symlink) - in which case // it always remains "not fully determined" - return d->bMimeTypeKnown && d->guessedMimeType.isEmpty(); + return m_bMimeTypeKnown && d->guessedMimeType.isEmpty(); } QString KFileItem::mimeComment() { KMimeType::Ptr mType = determineMimeType(); - QString comment = mType->comment( m_url, false ); + QString comment = mType->comment( m_url, m_bIsLocalURL ); if (!comment.isEmpty()) return comment; else @@ -421,7 +421,7 @@ QString KFileItem::mimeComment() QString KFileItem::iconName() { - return determineMimeType()->icon(m_url, false); + return determineMimeType()->icon(m_url, m_bIsLocalURL); } QPixmap KFileItem::pixmap( int _size, int _state ) const @@ -448,7 +448,7 @@ QPixmap KFileItem::pixmap( int _size, in KMimeType::Ptr mime; // Use guessed mimetype if the main one hasn't been determined for sure - if ( !d->bMimeTypeKnown && !d->guessedMimeType.isEmpty() ) + if ( !m_bMimeTypeKnown && !d->guessedMimeType.isEmpty() ) mime = KMimeType::mimeType( d->guessedMimeType ); else mime = m_pMimeType; @@ -462,6 +462,7 @@ QPixmap KFileItem::pixmap( int _size, in _state |= KIcon::ZipOverlay; } + kdDebug(1203) << "KFileItem::pixmap using mime " << mime->name() << endl; QPixmap p = mime->pixmap( m_url, KIcon::Desktop, _size, _state ); if (p.isNull()) kdWarning() << "Pixmap not found for mimetype " << m_pMimeType->name() << endl; @@ -492,7 +493,7 @@ bool KFileItem::isReadable() const bool KFileItem::isDir() const { - if ( !d->bMimeTypeKnown && !d->guessedMimeType.isEmpty() ) + if ( !m_bMimeTypeKnown && !d->guessedMimeType.isEmpty() ) { kdDebug() << " KFileItem::isDir can't say -> false " << endl; return false; // can't say for sure, so no @@ -527,7 +528,7 @@ bool KFileItem::acceptsDrops() QString KFileItem::getStatusBarInfo() { - QString comment = determineMimeType()->comment( m_url, false ); + QString comment = determineMimeType()->comment( m_url, m_bIsLocalURL ); QString text = m_strText; // Extract from the KIO::UDSEntry the additional info we didn't get previously QString myLinkDest = linkDest(); @@ -582,7 +583,7 @@ QString KFileItem::getToolTipText(int ma } QStringList keys; - + tip = "" "" "
" @@ -665,7 +666,7 @@ QString KFileItem::getToolTipText(int ma s = value.toString(); break; } - + if ( !s.isEmpty() ) { count++; @@ -724,6 +725,7 @@ void KFileItem::assign( const KFileItem m_bLink = item.m_bLink; m_pMimeType = item.m_pMimeType; m_strLowerCaseName = item.m_strLowerCaseName; + m_bMimeTypeKnown = item.m_bMimeTypeKnown; *d = *item.d; // Note: d->extra is just a shallow copy... // We had a mimetype previously (probably), so we need to re-determine it determineMimeType(); Index: kfileitem.h =================================================================== RCS file: /home/kde/kdelibs/kio/kio/kfileitem.h,v retrieving revision 1.73 diff -u -p -r1.73 kfileitem.h --- kfileitem.h 2002/01/18 03:24:04 1.73 +++ kfileitem.h 2002/01/18 14:10:12 @@ -259,7 +259,7 @@ public: * e.g. when the mouse is over this item */ QString getStatusBarInfo(); - + /** * @param maxcount the maximum number of entries shown * @@ -282,20 +282,6 @@ public: */ void run(); - /* - * Gives the file a "hidden" flag, so that a view doesn't show it. - * E.g. a filefilter sets this flag if this item matches *.cpp or not. - * @see #isHidden - */ - // void setHidden( bool b ) { m_bHidden = b; } - - /* - * @returns this item's hidden flag. True if a view shall not show it, false - * otherwise. - * @see #setHidden - */ - // bool isHidden() const { return m_bHidden; } - /** * Returns the UDS entry. Used by the tree view to access all details * by position. @@ -391,6 +377,7 @@ protected: */ QString parsePermissions( mode_t perm ) const; +private: /** * We keep a copy of the UDSEntry since we need it for @ref #getStatusBarInfo */ @@ -399,29 +386,17 @@ protected: * The url of the file */ KURL m_url; - /** - * True if local file - */ - bool m_bIsLocalURL; /** * The text for this item, i.e. the file name without path, */ QString m_strName; - /** - * The text for this item, i.e. the file name without path, encoded - */ - QString m_strText; - /** - * The file mode + * The text for this item, i.e. the file name without path, decoded + * ('%%' becomes '%', '%2F' becomes '/') */ - mode_t m_fileMode; - /** - * The permissions - */ - mode_t m_permissions; + QString m_strText; /** * the user and group assigned to the file. @@ -429,29 +404,38 @@ protected: mutable QString m_user, m_group; /** - * Whether the file is a link + * The filename in lower case (to speed up sorting) */ - bool m_bLink; + mutable QString m_strLowerCaseName; + /** * The mimetype of the file */ KMimeType::Ptr m_pMimeType; /** - * The filename in lower case (to speed up sorting) + * The file mode */ - mutable QString m_strLowerCaseName; + mode_t m_fileMode; + /** + * The permissions + */ + mode_t m_permissions; -private: /** * Marked : see @ref #mark() */ - bool m_bMarked; - + bool m_bMarked:1; /** - * Hidden : see @ref #setHidden(), @ref #isHidden() + * Whether the file is a link */ - // bool m_bHidden; + bool m_bLink:1; + /** + * True if local file + */ + bool m_bIsLocalURL:1; + + bool m_bMimeTypeKnown:1; class KFileItemPrivate; KFileItemPrivate * d; --------------Boundary-00=_VZ05QVACS8IR897KQ1IZ--