20#include "tdefileivi.h" 
   21#include "kivdirectoryoverlay.h" 
   22#include "kivfreespaceoverlay.h" 
   23#include "konq_iconviewwidget.h" 
   24#include "konq_operations.h" 
   25#include "konq_settings.h" 
   30#include <kiconeffect.h> 
   31#include <tdefileitem.h> 
   36#include <tdestandarddirs.h> 
   43struct KFileIVI::Private
 
   48    TQString m_animatedIcon; 
 
   50    KIVDirectoryOverlay* m_directoryOverlay;
 
   51    KIVFreeSpaceOverlay* m_freeSpaceOverlay;
 
   53    TQString m_overlayName;
 
   58    : TDEIconViewItem( iconview, fileitem->text() ),
 
   59    m_size( size ), m_state( TDEIcon::DefaultState ),
 
   60    m_bDisabled( false ), m_bThumbnail( false ), m_fileitem( fileitem )
 
   62    d = 
new KFileIVI::Private;
 
   65    setPixmap( m_fileitem->pixmap( m_size, m_state ) );
 
   66    setDropEnabled( S_ISDIR( m_fileitem->mode() ) );
 
   69    d->icons.reset( *pixmap(), TQIconSet::Large );
 
   70    d->m_animated = 
false;
 
   73    if ( fileitem->isMimeTypeKnown() )
 
   75        TQString icon = fileitem->iconName();
 
   76        if ( !icon.isEmpty() )
 
   82    d->m_directoryOverlay = 0;
 
   83    d->m_freeSpaceOverlay = 0;
 
   88    delete d->m_directoryOverlay;
 
   89    delete d->m_freeSpaceOverlay;
 
   98    case TDEIcon::DisabledState:
 
   99        mode = TQIconSet::Disabled;
 
  101    case TDEIcon::ActiveState:
 
  102        mode = TQIconSet::Active;
 
  104    case TDEIcon::DefaultState:
 
  106        mode = TQIconSet::Normal;
 
  109    d->icons = TQIconSet();
 
  110    d->icons.setPixmap( TDEGlobal::iconLoader()->iconEffect()->
 
  111            apply( d->thumb, TDEIcon::Desktop, 
state ),
 
  112            TQIconSet::Large, mode );
 
  115    TQIconViewItem::setPixmap( d->icons.pixmap( TQIconSet::Large, mode ),
 
  122    m_bThumbnail = 
false;
 
  124      m_state = TDEIcon::DisabledState;
 
  128    if ( d->m_overlayName.isNull() )
 
  129        d->m_overlay = TQPixmap();
 
  133            halfSize = IconSize(TDEIcon::Desktop) / 2;
 
  135            halfSize = m_size / 2;
 
  137        d->m_overlay = DesktopIcon(d->m_overlayName, halfSize);
 
  140    setPixmapDirect(m_fileitem->pixmap( m_size, m_state ) , recalc, redraw );
 
  145    d->m_overlayName = iconName;
 
  152    d->m_progress = progress;
 
  159    if ( !m_fileitem->isDir() || m_fileitem->iconName() != 
"folder" )
 
  163        if (!d->m_directoryOverlay)
 
  164            d->m_directoryOverlay = 
new KIVDirectoryOverlay(
this);
 
  165        return d->m_directoryOverlay;
 
  167        delete d->m_directoryOverlay;
 
  168        d->m_directoryOverlay = 0;
 
  174bool KFileIVI::showDirectoryOverlay(  )
 
  176    return (
bool)d->m_directoryOverlay;
 
  181    if ( !m_fileitem->mimetype().startsWith(
"media/") ) {
 
  186        if (!d->m_freeSpaceOverlay)
 
  187            d->m_freeSpaceOverlay = 
new KIVFreeSpaceOverlay(
this);
 
  188        return d->m_freeSpaceOverlay;
 
  190        delete d->m_freeSpaceOverlay;
 
  191        d->m_freeSpaceOverlay = 0;
 
  197bool KFileIVI::showFreeSpaceOverlay(  )
 
  199    return (
bool)d->m_freeSpaceOverlay;
 
  204    TQIconSet::Mode mode;
 
  207    case TDEIcon::DisabledState:
 
  208        mode = TQIconSet::Disabled;
 
  210    case TDEIcon::ActiveState:
 
  211        mode = TQIconSet::Active;
 
  213    case TDEIcon::DefaultState:
 
  215        mode = TQIconSet::Normal;
 
  222    d->icons = TQIconSet();
 
  223    d->icons.setPixmap( pixmap, TQIconSet::Large, mode );
 
  226    TQIconViewItem::setPixmap( d->icons.pixmap( TQIconSet::Large, mode ),
 
  232    if ( m_bDisabled != disabled )
 
  234        m_bDisabled = disabled;
 
  235        bool active = ( m_state == TDEIcon::ActiveState );
 
  236        setEffect( m_bDisabled ? TDEIcon::DisabledState : 
 
  237                   ( active ? TDEIcon::ActiveState : TDEIcon::DefaultState ) );
 
  247    d->icons = TQIconSet();
 
  248    d->icons.setPixmap( TDEGlobal::iconLoader()->iconEffect()->
 
  249            apply( pixmap, TDEIcon::Desktop, TDEIcon::DefaultState ),
 
  250            TQIconSet::Large, TQIconSet::Normal );
 
  252    m_state = TDEIcon::DefaultState;
 
  256    TQIconViewItem::setPixmap( d->icons.pixmap( TQIconSet::Large,
 
  257                  TQIconSet::Normal ), 
true );
 
  265        setEffect( m_bDisabled ? TDEIcon::DisabledState : TDEIcon::DefaultState );
 
  270    TQIconSet::Mode mode;
 
  273    case TDEIcon::DisabledState:
 
  274        mode = TQIconSet::Disabled;
 
  276    case TDEIcon::ActiveState:
 
  277        mode = TQIconSet::Active;
 
  279    case TDEIcon::DefaultState:
 
  281        mode = TQIconSet::Normal;
 
  286    TDEIconEffect *effect = TDEGlobal::iconLoader()->iconEffect();
 
  288    bool haveEffect = effect->hasEffect( TDEIcon::Desktop, m_state ) !=
 
  289                      effect->hasEffect( TDEIcon::Desktop, 
state );
 
  299        effect->fingerprint( TDEIcon::Desktop, m_state ) !=
 
  300    effect->fingerprint( TDEIcon::Desktop, 
state ) )
 
  306        if( d->icons.isGenerated( TQIconSet::Large, mode ) )
 
  307        d->icons.setPixmap( effect->apply( d->thumb, TDEIcon::Desktop, 
state ),
 
  308                    TQIconSet::Large, mode );
 
  312        if( d->icons.isGenerated( TQIconSet::Large, mode ) )
 
  313        d->icons.setPixmap( m_fileitem->pixmap( m_size, 
state ),
 
  314                    TQIconSet::Large, mode );
 
  316    TQIconViewItem::setPixmap( d->icons.pixmap( TQIconSet::Large, mode ) );
 
  324        setIcon( m_size, m_state, 
true, redraw );
 
  330    d->thumb = TQPixmap();
 
  333bool KFileIVI::isThumbnailInvalid()
 const 
  335    return d->thumb.isNull();
 
  340    if ( mime->provides( 
"text/uri-list" ) ) 
 
  342        if ( m_fileitem->acceptsDrops() ) 
 
  350        KURL::List::Iterator it = uris.begin();
 
  351        for ( ; it != uris.end() ; it++ )
 
  353            if ( m_fileitem->url().equals( *it, 
true  ) )
 
  357    return TQIconViewItem::acceptDrop( mime );
 
  360void KFileIVI::setKey( 
const TQString &key )
 
  362    TQString theKey = key;
 
  364    TQVariant sortDirProp = iconView()->property( 
"sortDirectoriesFirst" );
 
  366    bool isdir = ( S_ISDIR( m_fileitem->mode() ) && ( !sortDirProp.isValid() || ( sortDirProp.type() == TQVariant::Bool && sortDirProp.toBool() ) ) );
 
  369    int sortChar = isdir ? 1 : 3;
 
  370    if ( m_fileitem->text()[0] == 
'.' )
 
  373    if ( !iconView()->sortDirection() ) 
 
  374        sortChar = 3 - sortChar;
 
  376    theKey.prepend( TQChar( sortChar + 
'0' ) );
 
  378    TQIconViewItem::setKey( theKey );
 
  381void KFileIVI::dropped( TQDropEvent *e, 
const TQValueList<TQIconDragItem> & )
 
  389        KURL url = m_fileitem->url();
 
  390        if (url.protocol() == 
"media") {
 
  391            TQString mimetype = m_fileitem->mimetype();
 
  392            TQString lockingAction = TQString::null;
 
  393            if (mimetype.contains(
"encrypted_locked")) {
 
  394                lockingAction = 
"konqueror/servicemenus/media_unlock.desktop";
 
  396            else if (mimetype.contains(
"encrypted_unlocked")) {
 
  397                lockingAction = 
"konqueror/servicemenus/media_lock.desktop";
 
  399            if (!lockingAction.isEmpty()) {
 
  400                TQString lockingService = TDEGlobal::dirs()->findResource(
"data", lockingAction);
 
  401                if (!lockingService.isEmpty()) {
 
  402                    TQValueList<KDEDesktopMimeType::Service> serviceList = KDEDesktopMimeType::userDefinedServices(lockingService, m_fileitem->isLocalFile());
 
  403                    if (serviceList.count() == 1) {
 
  404                        KURL::List m_lstURLs;
 
  405                        m_lstURLs.append(m_fileitem->url());
 
  406                        KDEDesktopMimeType::executeService(m_lstURLs, serviceList[0]);
 
  411                (void) 
new KRun( url, m_fileitem->mode(), m_fileitem->isLocalFile() );
 
  417            if ( m_fileitem->isLink() && url.isLocalFile() ) {
 
  418                url = KURL( url, m_fileitem->linkDest() );
 
  421            (void) 
new KRun( url, m_fileitem->mode(), m_fileitem->isLocalFile() );
 
  444    TDEIconViewItem::paintItem( p, cg );
 
  452    if ( !d->m_overlay.isNull() ) {
 
  453        TQRect rect = pixmapRect(
true);
 
  454        p->drawPixmap(x() + rect.x() , y() + pixmapRect().height() - d->m_overlay.height(), d->m_overlay);
 
  460    if (d->m_progress != -1) {
 
  491        TQRect rect = pixmapRect(
true);
 
  492        int horizontalOffset = 0;
 
  493        int usedBarHeight = (((100-d->m_progress)*pixmapRect().height())/100);
 
  494        int endPosition = y() + rect.y() + usedBarHeight;
 
  498        p->setPen(TQPen::NoPen);
 
  499        p->setBrush(TQt::green);
 
  500        p->drawRect(TQRect(x() + rect.x() + (pixmapRect().width() - horizontalOffset), y() + rect.y(), 1, usedBarHeight));
 
  501        p->setBrush(TQt::red);
 
  502        p->drawRect(TQRect(x() + rect.x() + (pixmapRect().width() - horizontalOffset), endPosition, 1, pixmapRect().height() - usedBarHeight));
 
  510    if ( m_fileitem->isLink() )
 
  512        TQFont f( p->font() );
 
  520    TQColorGroup cg( c );
 
  521    cg.setColor( TQColorGroup::Text, 
static_cast<KonqIconViewWidget*
>(iconView())->itemColor() );
 
  525bool KFileIVI::move( 
int x, 
int y )
 
  530    if ( x > iconView()->viewport()->width() - ( width() + 5 ) )
 
  531        x = iconView()->viewport()->width() - ( width() + 5 );
 
  534    if ( y > iconView()->viewport()->height() - ( height() + 5 ) )
 
  535        y = iconView()->viewport()->height() - ( height() + 5 );
 
  537    return TQIconViewItem::move( x, y );
 
  542    return !d->m_animatedIcon.isEmpty() && !m_bThumbnail;
 
  547    if ( !movieFileName.isEmpty() )
 
  550        d->m_animatedIcon = movieFileName;
 
  554TQString KFileIVI::mouseOverAnimation()
 const 
  556    return d->m_animatedIcon;
 
  561    return d->m_animated;
 
  564void KFileIVI::setAnimated( 
bool a )
 
  569int KFileIVI::compare( TQIconViewItem *i )
 const 
  572    if ( view->caseInsensitiveSort() )
 
  573        return key().localeAwareCompare( i->key() );
 
  575        return view->m_pSettings->caseSensitiveCompare( key(), i->key() );
 
  578void KFileIVI::updatePixmapSize()
 
  580    int size = m_size ? m_size :
 
  581        TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
 
  585    bool mimeDetermined = 
false;
 
  586    if ( m_fileitem->isMimeTypeKnown() ) {
 
  587        mimeDetermined = 
true;
 
  590    if (mimeDetermined) {
 
  591        bool changed = 
false;
 
  592        if ( view && view->canPreview( 
item() ) ) {
 
  593            int previewSize = view->previewIconSize( size );
 
  594            if (previewSize != size) {
 
  595                setPixmapSize( TQSize( previewSize, previewSize ) );
 
  600            TQSize pixSize = TQSize( size, size );
 
  601            if ( pixSize != pixmapSize() ) {
 
  602                setPixmapSize( pixSize );
 
  611        TQSize pixSize = TQSize( size, size );
 
  612        if ( pixSize != pixmapSize() ) {
 
  613            setPixmapSize( pixSize );
 
  618void KFileIVI::mimeTypeAndIconDetermined()
 
virtual void returnPressed()
Handler for return (or single/double click) on ONE icon.
 
virtual void setIcon(int size, int state=TDEIcon::DefaultState, bool recalc=false, bool redraw=false)
Changes the icon for this item.
 
void setEffect(int state)
Set the icon to use the specified TDEIconEffect See the docs for TDEIconEffect for details.
 
void invalidateThumb(int state, bool redraw=false)
Notifies that all icon effects on thumbs should be invalidated, e.g.
 
KIVDirectoryOverlay * setShowDirectoryOverlay(bool)
Sets showing of directory overlays.
 
KFileIVI(KonqIconViewWidget *iconview, KFileItem *fileitem, int size)
Create an icon, within a qlistview, representing a file.
 
void paintFontUpdate(TQPainter *p) const
Contains the logic and code for painting links.
 
void setOverlayProgressBar(const int progress)
Sets a progress bar to be shown on the right side of the icon.
 
TQColorGroup updateColors(const TQColorGroup &c) const
Updates the colorgroup.
 
void invalidateThumbnail()
Our current thumbnail is not longer "current".
 
int state() const
Return the current state of the icon (TDEIcon::DefaultState, TDEIcon::ActiveState etc....
 
void setOverlay(const TQString &iconName)
Sets an icon to be shown over the bottom left corner of the icon.
 
void setActive(bool active)
Called when the mouse is over the icon.
 
virtual bool acceptDrop(const TQMimeSource *mime) const
 
virtual void refreshIcon(bool redraw)
Redetermines the icon (useful if KFileItem might return another icon).
 
void setThumbnailPixmap(const TQPixmap &pixmap)
Set this when the thumbnail was loaded.
 
bool isAnimated() const
Return true if we are currently animating this icon.
 
void setMouseOverAnimation(const TQString &movieFileName)
Enable an animation on mouseover, if there is an available mng.
 
void setDisabled(bool disabled)
Set to true when this icon is 'cut'.
 
bool hasAnimation() const
Return true if the icon might have an animation available.
 
KIVFreeSpaceOverlay * setShowFreeSpaceOverlay(bool)
Sets showing of free space overlays.
 
void setPixmapDirect(const TQPixmap &pixmap, bool recalc=false, bool redraw=false)
Bypass setIcon.
 
void paintOverlayProgressBar(TQPainter *p) const
Contains the logic and code for painting the overlay progress bar.
 
virtual void paintItem(TQPainter *p, const TQColorGroup &cg)
Paints this item.
 
void paintOverlay(TQPainter *p) const
Contains the logic and code for painting the overlay pixmap.
 
static void doDrop(const KFileItem *destItem, const KURL &destURL, TQDropEvent *ev, TQWidget *parent)
Drop.