00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <qfontmetrics.h>
00023 #include <qkeycode.h>
00024 #include <qlabel.h>
00025 #include <qpainter.h>
00026 #include <qpixmap.h>
00027 #include <qregexp.h>
00028 #include <qtimer.h>
00029 #include <qtooltip.h>
00030
00031 #include <kaction.h>
00032 #include <kapplication.h>
00033 #include <klocale.h>
00034 #include <kfileitem.h>
00035 #include <kiconeffect.h>
00036 #include <kglobalsettings.h>
00037 #include <kurldrag.h>
00038 #include <kio/previewjob.h>
00039
00040 #include "kfileiconview.h"
00041 #include "config-kfile.h"
00042
00043 KFileIconViewItem::~KFileIconViewItem()
00044 {
00045 fileInfo()->removeExtraData( iconView() );
00046 }
00047
00048 class KFileIconView::KFileIconViewPrivate
00049 {
00050 public:
00051 KFileIconViewPrivate( KFileIconView *parent ) {
00052 previewIconSize = 60;
00053 job = 0;
00054 dropItem = 0;
00055
00056 noArrangement = false;
00057 smallColumns = new KRadioAction( i18n("Small Icons"), 0, parent,
00058 SLOT( slotSmallColumns() ),
00059 parent->actionCollection(),
00060 "small columns" );
00061
00062 largeRows = new KRadioAction( i18n("Large Icons"), 0, parent,
00063 SLOT( slotLargeRows() ),
00064 parent->actionCollection(),
00065 "large rows" );
00066
00067 smallColumns->setExclusiveGroup(QString::fromLatin1("IconView mode"));
00068 largeRows->setExclusiveGroup(QString::fromLatin1("IconView mode"));
00069
00070 previews = new KToggleAction( i18n("Thumbnail Previews"), 0,
00071 parent->actionCollection(),
00072 "show previews" );
00073 zoomIn = KStdAction::zoomIn( parent, SLOT( zoomIn() ),
00074 parent->actionCollection(), "zoomIn" );
00075 zoomOut = KStdAction::zoomOut( parent, SLOT( zoomOut() ),
00076 parent->actionCollection(), "zoomOut" );
00077
00078 previews->setGroup("previews");
00079 zoomIn->setGroup("previews");
00080 zoomOut->setGroup("previews");
00081
00082 connect( previews, SIGNAL( toggled( bool )),
00083 parent, SLOT( slotPreviewsToggled( bool )));
00084
00085 connect( &previewTimer, SIGNAL( timeout() ),
00086 parent, SLOT( showPreviews() ));
00087 connect( &autoOpenTimer, SIGNAL( timeout() ),
00088 parent, SLOT( slotAutoOpen() ));
00089 }
00090
00091 ~KFileIconViewPrivate() {
00092 if ( job )
00093 job->kill();
00094 }
00095
00096 KRadioAction *smallColumns, *largeRows;
00097 KAction *zoomIn, *zoomOut;
00098 KToggleAction *previews;
00099 KIO::PreviewJob *job;
00100 KFileIconViewItem *dropItem;
00101 QTimer previewTimer;
00102 QTimer autoOpenTimer;
00103 QStringList previewMimeTypes;
00104 int previewIconSize;
00105 bool noArrangement :1;
00106 };
00107
00108 KFileIconView::KFileIconView(QWidget *parent, const char *name)
00109 : KIconView(parent, name), KFileView()
00110 {
00111 d = new KFileIconViewPrivate( this );
00112
00113 setViewName( i18n("Icon View") );
00114
00115 toolTip = 0;
00116 setResizeMode( Adjust );
00117 setMaxItemWidth( 300 );
00118 setWordWrapIconText( false );
00119 setArrangement( TopToBottom );
00120 setAutoArrange( true );
00121 setItemsMovable( false );
00122 setMode( KIconView::Select );
00123 KIconView::setSorting( true );
00124
00125
00126 setShowToolTips( false );
00127 slotSmallColumns();
00128 d->smallColumns->setChecked( true );
00129
00130 connect( this, SIGNAL( returnPressed(QIconViewItem *) ),
00131 SLOT( slotActivate( QIconViewItem *) ) );
00132
00133
00134 connect( this, SIGNAL( clicked(QIconViewItem *, const QPoint&) ),
00135 SLOT( selected( QIconViewItem *) ) );
00136 connect( this, SIGNAL( doubleClicked(QIconViewItem *, const QPoint&) ),
00137 SLOT( slotActivate( QIconViewItem *) ) );
00138
00139 connect( this, SIGNAL( onItem( QIconViewItem * ) ),
00140 SLOT( showToolTip( QIconViewItem * ) ) );
00141 connect( this, SIGNAL( onViewport() ),
00142 SLOT( removeToolTip() ) );
00143 connect( this, SIGNAL( contextMenuRequested(QIconViewItem*,const QPoint&)),
00144 SLOT( slotActivateMenu( QIconViewItem*, const QPoint& ) ) );
00145
00146 KFile::SelectionMode sm = KFileView::selectionMode();
00147 switch ( sm ) {
00148 case KFile::Multi:
00149 QIconView::setSelectionMode( QIconView::Multi );
00150 break;
00151 case KFile::Extended:
00152 QIconView::setSelectionMode( QIconView::Extended );
00153 break;
00154 case KFile::NoSelection:
00155 QIconView::setSelectionMode( QIconView::NoSelection );
00156 break;
00157 default:
00158 case KFile::Single:
00159 QIconView::setSelectionMode( QIconView::Single );
00160 break;
00161 }
00162
00163 if ( sm == KFile::Multi || sm == KFile::Extended )
00164 connect( this, SIGNAL( selectionChanged() ),
00165 SLOT( slotSelectionChanged() ));
00166 else
00167 connect( this, SIGNAL( selectionChanged( QIconViewItem * )),
00168 SLOT( highlighted( QIconViewItem * )));
00169
00170 viewport()->installEventFilter( this );
00171
00172
00173 m_resolver = new KMimeTypeResolver<KFileIconViewItem,KFileIconView>(this);
00174 }
00175
00176 KFileIconView::~KFileIconView()
00177 {
00178 delete m_resolver;
00179 removeToolTip();
00180 delete d;
00181 }
00182
00183 void KFileIconView::readConfig( KConfig *kc, const QString& group )
00184 {
00185 QString gr = group.isEmpty() ? QString("KFileIconView") : group;
00186 KConfigGroupSaver cs( kc, gr );
00187 QString small = QString::fromLatin1("SmallColumns");
00188 d->previewIconSize = kc->readNumEntry( "Preview Size", 60 );
00189 d->previews->setChecked( kc->readBoolEntry( "ShowPreviews", false ) );
00190
00191 if ( kc->readEntry("ViewMode", small ) == small ) {
00192 d->smallColumns->setChecked( true );
00193 slotSmallColumns();
00194 }
00195 else {
00196 d->largeRows->setChecked( true );
00197 slotLargeRows();
00198 }
00199
00200 if ( d->previews->isChecked() )
00201 showPreviews();
00202 }
00203
00204 void KFileIconView::writeConfig( KConfig *kc, const QString& group )
00205 {
00206 QString gr = group.isEmpty() ? QString("KFileIconView") : group;
00207 KConfigGroupSaver cs( kc, gr );
00208 kc->writeEntry( "ViewMode", d->smallColumns->isChecked() ?
00209 QString::fromLatin1("SmallColumns") :
00210 QString::fromLatin1("LargeRows") );
00211 kc->writeEntry( "Preview Size", d->previewIconSize );
00212 kc->writeEntry( "ShowPreviews", d->previews->isChecked() );
00213 }
00214
00215 void KFileIconView::removeToolTip()
00216 {
00217 delete toolTip;
00218 toolTip = 0;
00219 }
00220
00221 void KFileIconView::showToolTip( QIconViewItem *item )
00222 {
00223 delete toolTip;
00224 toolTip = 0;
00225
00226 if ( !item )
00227 return;
00228
00229 int w = maxItemWidth() - ( itemTextPos() == QIconView::Bottom ? 0 :
00230 item->pixmapRect().width() ) - 4;
00231 if ( fontMetrics().width( item->text() ) >= w ) {
00232 toolTip = new QLabel( QString::fromLatin1(" %1 ").arg(item->text()), 0,
00233 "myToolTip",
00234 WStyle_StaysOnTop | WStyle_Customize | WStyle_NoBorder | WStyle_Tool | WX11BypassWM );
00235 toolTip->setFrameStyle( QFrame::Plain | QFrame::Box );
00236 toolTip->setLineWidth( 1 );
00237 toolTip->setAlignment( AlignLeft | AlignTop );
00238 toolTip->move( QCursor::pos() + QPoint( 14, 14 ) );
00239 toolTip->adjustSize();
00240 QRect screen = QApplication::desktop()->screenGeometry(
00241 QApplication::desktop()->screenNumber(QCursor::pos()));
00242 if (toolTip->x()+toolTip->width() > screen.right()) {
00243 toolTip->move(toolTip->x()+screen.right()-toolTip->x()-toolTip->width(), toolTip->y());
00244 }
00245 if (toolTip->y()+toolTip->height() > screen.bottom()) {
00246 toolTip->move(toolTip->x(), screen.bottom()-toolTip->y()-toolTip->height()+toolTip->y());
00247 }
00248 toolTip->setFont( QToolTip::font() );
00249 toolTip->setPalette( QToolTip::palette(), true );
00250 toolTip->show();
00251 }
00252 }
00253
00254 void KFileIconView::slotActivateMenu( QIconViewItem* item, const QPoint& pos )
00255 {
00256 if ( !item ) {
00257 sig->activateMenu( 0, pos );
00258 return;
00259 }
00260 KFileIconViewItem *i = (KFileIconViewItem*) item;
00261 sig->activateMenu( i->fileInfo(), pos );
00262 }
00263
00264 void KFileIconView::hideEvent( QHideEvent *e )
00265 {
00266 removeToolTip();
00267 KIconView::hideEvent( e );
00268 }
00269
00270 void KFileIconView::keyPressEvent( QKeyEvent *e )
00271 {
00272 KIconView::keyPressEvent( e );
00273
00274
00275 if ( (e->state() & ControlButton) &&
00276 (e->key() == Key_Return || e->key() == Key_Enter) )
00277 e->ignore();
00278 }
00279
00280 void KFileIconView::setSelected( const KFileItem *info, bool enable )
00281 {
00282 KFileIconViewItem *item = viewItem( info );
00283 if ( item )
00284 KIconView::setSelected( item, enable, true );
00285 }
00286
00287 void KFileIconView::selectAll()
00288 {
00289 if (KFileView::selectionMode() == KFile::NoSelection ||
00290 KFileView::selectionMode() == KFile::Single)
00291 return;
00292
00293 KIconView::selectAll( true );
00294 }
00295
00296 void KFileIconView::clearSelection()
00297 {
00298 KIconView::clearSelection();
00299 }
00300
00301 void KFileIconView::invertSelection()
00302 {
00303 KIconView::invertSelection();
00304 }
00305
00306 void KFileIconView::clearView()
00307 {
00308 m_resolver->m_lstPendingMimeIconItems.clear();
00309
00310 KIconView::clear();
00311 stopPreview();
00312 }
00313
00314 void KFileIconView::insertItem( KFileItem *i )
00315 {
00316 KFileView::insertItem( i );
00317
00318 KFileIconViewItem *item =
00319 new KFileIconViewItem( (QIconView*)this, i->text(),
00320 i->pixmap( iconSizeFor( i ) ), i);
00321 initItem( item, i, false );
00322
00323 if ( !i->isMimeTypeKnown() )
00324 m_resolver->m_lstPendingMimeIconItems.append( item );
00325
00326 i->setExtraData( this, item );
00327 }
00328
00329 void KFileIconView::slotActivate( QIconViewItem *item )
00330 {
00331 if ( !item )
00332 return;
00333 const KFileItem *fi = ( (KFileIconViewItem*)item )->fileInfo();
00334 if ( fi )
00335 sig->activate( fi );
00336 }
00337
00338 void KFileIconView::selected( QIconViewItem *item )
00339 {
00340 if ( !item || (KApplication::keyboardModifiers() & (KApplication::ShiftModifier | KApplication::ControlModifier)) != 0 )
00341 return;
00342
00343 if ( KGlobalSettings::singleClick() ) {
00344 const KFileItem *fi = ( (KFileIconViewItem*)item )->fileInfo();
00345 if ( fi && (fi->isDir() || !onlyDoubleClickSelectsFiles()) )
00346 sig->activate( fi );
00347 }
00348 }
00349
00350 void KFileIconView::setCurrentItem( const KFileItem *item )
00351 {
00352 KFileIconViewItem *it = viewItem( item );
00353 if ( it )
00354 KIconView::setCurrentItem( it );
00355 }
00356
00357 KFileItem * KFileIconView::currentFileItem() const
00358 {
00359 KFileIconViewItem *current = static_cast<KFileIconViewItem*>( currentItem() );
00360 if ( current )
00361 return current->fileInfo();
00362
00363 return 0L;
00364 }
00365
00366 void KFileIconView::highlighted( QIconViewItem *item )
00367 {
00368 if ( !item )
00369 return;
00370 const KFileItem *fi = ( (KFileIconViewItem*)item )->fileInfo();
00371 if ( fi )
00372 sig->highlightFile( fi );
00373 }
00374
00375 void KFileIconView::setSelectionMode( KFile::SelectionMode sm )
00376 {
00377 disconnect( SIGNAL( selectionChanged() ), this );
00378 disconnect( SIGNAL( selectionChanged( QIconViewItem * )), this );
00379
00380 KFileView::setSelectionMode( sm );
00381 switch ( KFileView::selectionMode() ) {
00382 case KFile::Multi:
00383 QIconView::setSelectionMode( QIconView::Multi );
00384 break;
00385 case KFile::Extended:
00386 QIconView::setSelectionMode( QIconView::Extended );
00387 break;
00388 case KFile::NoSelection:
00389 QIconView::setSelectionMode( QIconView::NoSelection );
00390 break;
00391 default:
00392 case KFile::Single:
00393 QIconView::setSelectionMode( QIconView::Single );
00394 break;
00395 }
00396
00397 if ( sm == KFile::Multi || sm == KFile::Extended )
00398 connect( this, SIGNAL( selectionChanged() ),
00399 SLOT( slotSelectionChanged() ));
00400 else
00401 connect( this, SIGNAL( selectionChanged( QIconViewItem * )),
00402 SLOT( highlighted( QIconViewItem * )));
00403 }
00404
00405 bool KFileIconView::isSelected( const KFileItem *i ) const
00406 {
00407 KFileIconViewItem *item = viewItem( i );
00408 return (item && item->isSelected());
00409 }
00410
00411 void KFileIconView::updateView( bool b )
00412 {
00413 if ( !b )
00414 return;
00415
00416 KFileIconViewItem *item = static_cast<KFileIconViewItem*>(QIconView::firstItem());
00417 if ( item ) {
00418 if ( d->previews->isChecked() ) {
00419 do {
00420 int size = canPreview( item->fileInfo() ) ?
00421 d->previewIconSize : myIconSize;
00422 item ->setPixmap( (item->fileInfo())->pixmap( size ) );
00423 item = static_cast<KFileIconViewItem *>(item->nextItem());
00424 } while ( item != 0L );
00425 }
00426
00427 else {
00428 do {
00429 item ->setPixmap( (item->fileInfo())->pixmap( myIconSize));
00430 item = static_cast<KFileIconViewItem *>(item->nextItem());
00431 } while ( item != 0L );
00432 }
00433 }
00434 }
00435
00436 void KFileIconView::updateView( const KFileItem *i )
00437 {
00438 KFileIconViewItem *item = viewItem( i );
00439 if ( item )
00440 initItem( item, i, true );
00441 }
00442
00443 void KFileIconView::removeItem( const KFileItem *i )
00444 {
00445 if ( !i )
00446 return;
00447
00448 KFileIconViewItem *item = viewItem( i );
00449 m_resolver->m_lstPendingMimeIconItems.remove( item );
00450 delete item;
00451
00452 KFileView::removeItem( i );
00453 }
00454
00455 void KFileIconView::setIconSize( int size )
00456 {
00457 myIconSize = size;
00458 updateIcons();
00459 }
00460
00461 void KFileIconView::setPreviewSize( int size )
00462 {
00463 if ( size < 30 )
00464 size = 30;
00465
00466 d->previewIconSize = size;
00467 if ( d->previews->isChecked() )
00468 showPreviews();
00469 }
00470
00471 void KFileIconView::updateIcons()
00472 {
00473 updateView( true );
00474 arrangeItemsInGrid();
00475 }
00476
00477 void KFileIconView::ensureItemVisible( const KFileItem *i )
00478 {
00479 KFileIconViewItem *item = viewItem( i );
00480 if ( item )
00481 KIconView::ensureItemVisible( item );
00482 }
00483
00484 void KFileIconView::slotSelectionChanged()
00485 {
00486 sig->highlightFile( 0L );
00487 }
00488
00489 void KFileIconView::slotSmallColumns()
00490 {
00491
00492
00493 d->noArrangement = true;
00494
00495
00496 if ( d->previews->isChecked() )
00497 {
00498 stopPreview();
00499 d->previews->setChecked( false );
00500 }
00501 setGridX( -1 );
00502 setMaxItemWidth( 300 );
00503 setItemTextPos( Right );
00504 setArrangement( TopToBottom );
00505 setWordWrapIconText( false );
00506 setSpacing( 0 );
00507
00508 d->noArrangement = false;
00509 setIconSize( KIcon::SizeSmall );
00510 }
00511
00512 void KFileIconView::slotLargeRows()
00513 {
00514
00515
00516 d->noArrangement = true;
00517
00518 setGridX( KGlobal::iconLoader()->currentSize( KIcon::Desktop ) + 50 );
00519 setItemTextPos( Bottom );
00520 setArrangement( LeftToRight );
00521 setWordWrapIconText( true );
00522 setSpacing( 5 );
00523
00524 d->noArrangement = false;
00525 setIconSize( KIcon::SizeMedium );
00526 }
00527
00528 void KFileIconView::stopPreview()
00529 {
00530 if ( d->job ) {
00531 d->job->kill();
00532 d->job = 0L;
00533 }
00534 }
00535
00536 void KFileIconView::slotPreviewsToggled( bool on )
00537 {
00538 if ( on )
00539 showPreviews();
00540 else {
00541 stopPreview();
00542 slotLargeRows();
00543 }
00544 }
00545
00546 void KFileIconView::showPreviews()
00547 {
00548 if ( d->previewMimeTypes.isEmpty() )
00549 d->previewMimeTypes = KIO::PreviewJob::supportedMimeTypes();
00550
00551 stopPreview();
00552 d->previews->setChecked( true );
00553
00554 if ( !d->largeRows->isChecked() ) {
00555 d->largeRows->setChecked( true );
00556 slotLargeRows();
00557 }
00558 else {
00559 updateIcons();
00560 }
00561
00562 d->job = KIO::filePreview(*items(), d->previewIconSize,d->previewIconSize);
00563
00564 connect( d->job, SIGNAL( result( KIO::Job * )),
00565 this, SLOT( slotPreviewResult( KIO::Job * )));
00566 connect( d->job, SIGNAL( gotPreview( const KFileItem*, const QPixmap& )),
00567 SLOT( gotPreview( const KFileItem*, const QPixmap& ) ));
00568
00569
00570 }
00571
00572 void KFileIconView::slotPreviewResult( KIO::Job *job )
00573 {
00574 if ( job == d->job )
00575 d->job = 0L;
00576 }
00577
00578 void KFileIconView::gotPreview( const KFileItem *item, const QPixmap& pix )
00579 {
00580 KFileIconViewItem *it = viewItem( item );
00581 if ( it )
00582 if( item->overlays() & KIcon::HiddenOverlay )
00583 {
00584 QPixmap p( pix );
00585
00586 KIconEffect::semiTransparent( p );
00587 it->setPixmap( p );
00588 }
00589 else
00590 it->setPixmap( pix );
00591 }
00592
00593 bool KFileIconView::canPreview( const KFileItem *item ) const
00594 {
00595 QStringList::Iterator it = d->previewMimeTypes.begin();
00596 QRegExp r;
00597 r.setWildcard( true );
00598
00599 for ( ; it != d->previewMimeTypes.end(); ++it ) {
00600 QString type = *it;
00601
00602 if ( type.at( type.length() - 1 ) == '*' ) {
00603 r.setPattern( type );
00604 if ( r.search( item->mimetype() ) != -1 )
00605 return true;
00606 }
00607 else
00608 if ( item->mimetype() == type )
00609 return true;
00610 }
00611
00612 return false;
00613 }
00614
00615 KFileItem * KFileIconView::firstFileItem() const
00616 {
00617 KFileIconViewItem *item = static_cast<KFileIconViewItem*>( firstItem() );
00618 if ( item )
00619 return item->fileInfo();
00620 return 0L;
00621 }
00622
00623 KFileItem * KFileIconView::nextItem( const KFileItem *fileItem ) const
00624 {
00625 if ( fileItem ) {
00626 KFileIconViewItem *item = viewItem( fileItem );
00627 if ( item && item->nextItem() )
00628 return ((KFileIconViewItem*) item->nextItem())->fileInfo();
00629 }
00630 return 0L;
00631 }
00632
00633 KFileItem * KFileIconView::prevItem( const KFileItem *fileItem ) const
00634 {
00635 if ( fileItem ) {
00636 KFileIconViewItem *item = viewItem( fileItem );
00637 if ( item && item->prevItem() )
00638 return ((KFileIconViewItem*) item->prevItem())->fileInfo();
00639 }
00640 return 0L;
00641 }
00642
00643 void KFileIconView::setSorting( QDir::SortSpec spec )
00644 {
00645 KFileView::setSorting( spec );
00646 KFileItemListIterator it( *items() );
00647
00648 KFileItem *item;
00649
00650 if ( spec & QDir::Time ) {
00651 for ( ; (item = it.current()); ++it )
00652
00653 viewItem(item)->setKey( sortingKey( (unsigned long)item->time( KIO::UDS_MODIFICATION_TIME ), item->isDir(), spec ));
00654 }
00655
00656 else if ( spec & QDir::Size ) {
00657 for ( ; (item = it.current()); ++it )
00658 viewItem(item)->setKey( sortingKey( item->size(), item->isDir(),
00659 spec ));
00660 }
00661 else {
00662 for ( ; (item = it.current()); ++it )
00663 viewItem(item)->setKey( sortingKey( item->text(), item->isDir(),
00664 spec ));
00665 }
00666
00667 KIconView::setSorting( true, !isReversed() );
00668 sort( !isReversed() );
00669 }
00670
00671
00672
00673
00674 void KFileIconView::mimeTypeDeterminationFinished()
00675 {
00676
00677 }
00678
00679 void KFileIconView::determineIcon( KFileIconViewItem *item )
00680 {
00681 (void) item->fileInfo()->determineMimeType();
00682 updateView( item->fileInfo() );
00683 }
00684
00685 void KFileIconView::listingCompleted()
00686 {
00687 arrangeItemsInGrid();
00688
00689
00690
00691 if ( !currentItem() ) {
00692 bool block = signalsBlocked();
00693 blockSignals( true );
00694 QIconViewItem *item = viewItem( firstFileItem() );
00695 KIconView::setCurrentItem( item );
00696 KIconView::setSelected( item, false );
00697 blockSignals( block );
00698 }
00699
00700 m_resolver->start( d->previews->isChecked() ? 0 : 10 );
00701 }
00702
00703
00704 bool KFileIconView::eventFilter( QObject *o, QEvent *e )
00705 {
00706 if ( o == viewport() || o == this ) {
00707 int type = e->type();
00708 if ( type == QEvent::Leave ||
00709 type == QEvent::FocusOut )
00710 removeToolTip();
00711 }
00712
00713 return KIconView::eventFilter( o, e );
00714 }
00715
00717
00718
00719 void KFileIconView::showEvent( QShowEvent *e )
00720 {
00721 KIconView::showEvent( e );
00722 }
00723
00724
00725 void KFileIconView::initItem( KFileIconViewItem *item, const KFileItem *i,
00726 bool updateTextAndPixmap )
00727 {
00728 if ( updateTextAndPixmap )
00729 {
00730
00731
00732
00733 item->setText( i->text() , false, false );
00734 item->setPixmap( i->pixmap( iconSizeFor( i ) ) );
00735 }
00736
00737
00738 QDir::SortSpec spec = KFileView::sorting();
00739
00740 if ( spec & QDir::Time )
00741
00742 item->setKey( sortingKey( (unsigned long) i->time( KIO::UDS_MODIFICATION_TIME ),
00743 i->isDir(), spec ));
00744 else if ( spec & QDir::Size )
00745 item->setKey( sortingKey( i->size(), i->isDir(), spec ));
00746
00747 else
00748 item->setKey( sortingKey( i->text(), i->isDir(), spec ));
00749
00750
00751
00752 if ( d->previews->isChecked() )
00753 d->previewTimer.start( 10, true );
00754 }
00755
00756 void KFileIconView::arrangeItemsInGrid( bool update )
00757 {
00758 if ( d->noArrangement )
00759 return;
00760
00761 KIconView::arrangeItemsInGrid( update );
00762 }
00763
00764 int KFileIconView::iconSizeFor( const KFileItem *item ) const
00765 {
00766 if ( d->previews->isChecked() && canPreview( item ) )
00767 return d->previewIconSize;
00768 return myIconSize;
00769 }
00770
00771 void KFileIconView::zoomIn()
00772 {
00773 setPreviewSize( d->previewIconSize + 30 );
00774 }
00775
00776 void KFileIconView::zoomOut()
00777 {
00778 setPreviewSize( d->previewIconSize - 30 );
00779 }
00780
00781 QDragObject *KFileIconView::dragObject()
00782 {
00783
00784 KURL::List urls;
00785 KFileItemListIterator it( * KFileView::selectedItems() );
00786 for ( ; it.current(); ++it ){
00787 urls.append( (*it)->url() );
00788 }
00789 QPixmap pixmap;
00790 if( urls.count() > 1 )
00791 pixmap = DesktopIcon( "kmultiple", iconSize() );
00792 if( pixmap.isNull() )
00793 pixmap = currentFileItem()->pixmap( iconSize() );
00794
00795 QPoint hotspot;
00796 hotspot.setX( pixmap.width() / 2 );
00797 hotspot.setY( pixmap.height() / 2 );
00798 QDragObject* myDragObject = new KURLDrag( urls, widget() );
00799 myDragObject->setPixmap( pixmap, hotspot );
00800 return myDragObject;
00801 }
00802
00803 void KFileIconView::slotAutoOpen()
00804 {
00805 d->autoOpenTimer.stop();
00806 if( !d->dropItem )
00807 return;
00808
00809 KFileItem *fileItem = d->dropItem->fileInfo();
00810 if (!fileItem)
00811 return;
00812
00813 if( fileItem->isFile() )
00814 return;
00815
00816 if ( fileItem->isDir() || fileItem->isLink())
00817 sig->activate( fileItem );
00818 }
00819
00820 bool KFileIconView::acceptDrag(QDropEvent* e) const
00821 {
00822 return KURLDrag::canDecode( e ) &&
00823 (e->source()!=const_cast<KFileIconView*>(this)) &&
00824 ( e->action() == QDropEvent::Copy
00825 || e->action() == QDropEvent::Move
00826 || e->action() == QDropEvent::Link );
00827 }
00828
00829 void KFileIconView::contentsDragEnterEvent( QDragEnterEvent *e )
00830 {
00831 if ( ! acceptDrag( e ) ) {
00832 e->ignore();
00833 return;
00834 }
00835 e->acceptAction();
00836
00837 if ((dropOptions() & AutoOpenDirs) == 0)
00838 return;
00839
00840 KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) ));
00841 if ( item ) {
00842 d->dropItem = item;
00843 d->autoOpenTimer.start( autoOpenDelay() );
00844 }
00845 else
00846 {
00847 d->dropItem = 0;
00848 d->autoOpenTimer.stop();
00849 }
00850 }
00851
00852 void KFileIconView::contentsDragMoveEvent( QDragMoveEvent *e )
00853 {
00854 if ( ! acceptDrag( e ) ) {
00855 e->ignore();
00856 return;
00857 }
00858 e->acceptAction();
00859
00860 if ((dropOptions() & AutoOpenDirs) == 0)
00861 return;
00862
00863 KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) ));
00864 if ( item ) {
00865 if (d->dropItem != item)
00866 {
00867 d->dropItem = item;
00868 d->autoOpenTimer.start( autoOpenDelay() );
00869 }
00870 }
00871 else
00872 {
00873 d->dropItem = 0;
00874 d->autoOpenTimer.stop();
00875 }
00876 }
00877
00878 void KFileIconView::contentsDragLeaveEvent( QDragLeaveEvent * )
00879 {
00880 d->dropItem = 0;
00881 d->autoOpenTimer.stop();
00882 }
00883
00884 void KFileIconView::contentsDropEvent( QDropEvent *e )
00885 {
00886 d->dropItem = 0;
00887 d->autoOpenTimer.stop();
00888
00889 if ( ! acceptDrag( e ) ) {
00890 e->ignore();
00891 return;
00892 }
00893 e->acceptAction();
00894
00895 KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) ));
00896 KFileItem * fileItem = 0;
00897 if (item)
00898 fileItem = item->fileInfo();
00899
00900 emit dropped(e, fileItem);
00901
00902 KURL::List urls;
00903 if (KURLDrag::decode( e, urls ) && !urls.isEmpty())
00904 {
00905 emit dropped(e, urls, fileItem ? fileItem->url() : KURL());
00906 sig->dropURLs(fileItem, e, urls);
00907 }
00908 }
00909
00910 void KFileIconView::virtual_hook( int id, void* data )
00911 { KIconView::virtual_hook( id, data );
00912 KFileView::virtual_hook( id, data ); }
00913
00914 #include "kfileiconview.moc"