kio Library API Documentation

kfileiconview.cpp

00001 // -*- c++ -*- 00002 /* This file is part of the KDE libraries 00003 Copyright (C) 1997 Stephan Kulow <coolo@kde.org> 00004 2000,2001,2002 Carsten Pfeiffer <pfeiffer@kde.org> 00005 00006 This library is free software; you can redistribute it and/or 00007 modify it under the terms of the GNU Library General Public 00008 License as published by the Free Software Foundation; either 00009 version 2 of the License, or (at your option) any later version. 00010 00011 This library is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 Library General Public License for more details. 00015 00016 You should have received a copy of the GNU Library General Public License 00017 along with this library; see the file COPYING.LIB. If not, write to 00018 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00019 Boston, MA 02111-1307, USA. 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 // as long as QIconView only shows tooltips when the cursor is over the 00125 // icon (and not the text), we have to create our own tooltips 00126 setShowToolTips( false ); 00127 //slotSmallColumns(); 00128 //d->smallColumns->setChecked( true ); 00129 slotPreviewsToggled( true ); 00130 00131 connect( this, SIGNAL( returnPressed(QIconViewItem *) ), 00132 SLOT( slotActivate( QIconViewItem *) ) ); 00133 00134 // we want single click _and_ double click (as convenience) 00135 connect( this, SIGNAL( clicked(QIconViewItem *, const QPoint&) ), 00136 SLOT( selected( QIconViewItem *) ) ); 00137 connect( this, SIGNAL( doubleClicked(QIconViewItem *, const QPoint&) ), 00138 SLOT( slotActivate( QIconViewItem *) ) ); 00139 00140 connect( this, SIGNAL( onItem( QIconViewItem * ) ), 00141 SLOT( showToolTip( QIconViewItem * ) ) ); 00142 connect( this, SIGNAL( onViewport() ), 00143 SLOT( removeToolTip() ) ); 00144 connect( this, SIGNAL( contextMenuRequested(QIconViewItem*,const QPoint&)), 00145 SLOT( slotActivateMenu( QIconViewItem*, const QPoint& ) ) ); 00146 00147 KFile::SelectionMode sm = KFileView::selectionMode(); 00148 switch ( sm ) { 00149 case KFile::Multi: 00150 QIconView::setSelectionMode( QIconView::Multi ); 00151 break; 00152 case KFile::Extended: 00153 QIconView::setSelectionMode( QIconView::Extended ); 00154 break; 00155 case KFile::NoSelection: 00156 QIconView::setSelectionMode( QIconView::NoSelection ); 00157 break; 00158 default: // fall through 00159 case KFile::Single: 00160 QIconView::setSelectionMode( QIconView::Single ); 00161 break; 00162 } 00163 00164 if ( sm == KFile::Multi || sm == KFile::Extended ) 00165 connect( this, SIGNAL( selectionChanged() ), 00166 SLOT( slotSelectionChanged() )); 00167 else 00168 connect( this, SIGNAL( selectionChanged( QIconViewItem * )), 00169 SLOT( highlighted( QIconViewItem * ))); 00170 00171 viewport()->installEventFilter( this ); 00172 00173 // for mimetype resolving 00174 m_resolver = new KMimeTypeResolver<KFileIconViewItem,KFileIconView>(this); 00175 } 00176 00177 KFileIconView::~KFileIconView() 00178 { 00179 delete m_resolver; 00180 removeToolTip(); 00181 delete d; 00182 } 00183 00184 void KFileIconView::readConfig( KConfig *kc, const QString& group ) 00185 { 00186 QString gr = group.isEmpty() ? QString("KFileIconView") : group; 00187 KConfigGroupSaver cs( kc, gr ); 00188 QString small = QString::fromLatin1("SmallColumns"); 00189 d->previewIconSize = kc->readNumEntry( "Preview Size", 60 ); 00190 d->previews->setChecked( kc->readBoolEntry( "ShowPreviews", false ) ); 00191 00192 if ( kc->readEntry("ViewMode", small ) == small ) { 00193 d->smallColumns->setChecked( true ); 00194 slotSmallColumns(); 00195 } 00196 else { 00197 d->largeRows->setChecked( true ); 00198 slotLargeRows(); 00199 } 00200 00201 if ( d->previews->isChecked() ) 00202 showPreviews(); 00203 } 00204 00205 void KFileIconView::writeConfig( KConfig *kc, const QString& group ) 00206 { 00207 QString gr = group.isEmpty() ? QString("KFileIconView") : group; 00208 KConfigGroupSaver cs( kc, gr ); 00209 kc->writeEntry( "ViewMode", d->smallColumns->isChecked() ? 00210 QString::fromLatin1("SmallColumns") : 00211 QString::fromLatin1("LargeRows") ); 00212 kc->writeEntry( "Preview Size", d->previewIconSize ); 00213 kc->writeEntry( "ShowPreviews", d->previews->isChecked() ); 00214 } 00215 00216 void KFileIconView::removeToolTip() 00217 { 00218 delete toolTip; 00219 toolTip = 0; 00220 } 00221 00222 void KFileIconView::showToolTip( QIconViewItem *item ) 00223 { 00224 delete toolTip; 00225 toolTip = 0; 00226 00227 if ( !item ) 00228 return; 00229 00230 int w = maxItemWidth() - ( itemTextPos() == QIconView::Bottom ? 0 : 00231 item->pixmapRect().width() ) - 4; 00232 if ( fontMetrics().width( item->text() ) >= w ) { 00233 toolTip = new QLabel( QString::fromLatin1(" %1 ").arg(item->text()), 0, 00234 "myToolTip", 00235 WStyle_StaysOnTop | WStyle_Customize | WStyle_NoBorder | WStyle_Tool | WX11BypassWM ); 00236 toolTip->setFrameStyle( QFrame::Plain | QFrame::Box ); 00237 toolTip->setLineWidth( 1 ); 00238 toolTip->setAlignment( AlignLeft | AlignTop ); 00239 toolTip->move( QCursor::pos() + QPoint( 14, 14 ) ); 00240 toolTip->adjustSize(); 00241 QRect screen = QApplication::desktop()->screenGeometry( 00242 QApplication::desktop()->screenNumber(QCursor::pos())); 00243 if (toolTip->x()+toolTip->width() > screen.right()) { 00244 toolTip->move(toolTip->x()+screen.right()-toolTip->x()-toolTip->width(), toolTip->y()); 00245 } 00246 if (toolTip->y()+toolTip->height() > screen.bottom()) { 00247 toolTip->move(toolTip->x(), screen.bottom()-toolTip->y()-toolTip->height()+toolTip->y()); 00248 } 00249 toolTip->setFont( QToolTip::font() ); 00250 toolTip->setPalette( QToolTip::palette(), true ); 00251 toolTip->show(); 00252 } 00253 } 00254 00255 void KFileIconView::slotActivateMenu( QIconViewItem* item, const QPoint& pos ) 00256 { 00257 if ( !item ) { 00258 sig->activateMenu( 0, pos ); 00259 return; 00260 } 00261 KFileIconViewItem *i = (KFileIconViewItem*) item; 00262 sig->activateMenu( i->fileInfo(), pos ); 00263 } 00264 00265 void KFileIconView::hideEvent( QHideEvent *e ) 00266 { 00267 removeToolTip(); 00268 KIconView::hideEvent( e ); 00269 } 00270 00271 void KFileIconView::keyPressEvent( QKeyEvent *e ) 00272 { 00273 KIconView::keyPressEvent( e ); 00274 00275 // ignore Ctrl-Return so that the dialog can catch it. 00276 if ( (e->state() & ControlButton) && 00277 (e->key() == Key_Return || e->key() == Key_Enter) ) 00278 e->ignore(); 00279 } 00280 00281 void KFileIconView::setSelected( const KFileItem *info, bool enable ) 00282 { 00283 KFileIconViewItem *item = viewItem( info ); 00284 if ( item ) 00285 KIconView::setSelected( item, enable, true ); 00286 } 00287 00288 void KFileIconView::selectAll() 00289 { 00290 if (KFileView::selectionMode() == KFile::NoSelection || 00291 KFileView::selectionMode() == KFile::Single) 00292 return; 00293 00294 KIconView::selectAll( true ); 00295 } 00296 00297 void KFileIconView::clearSelection() 00298 { 00299 KIconView::clearSelection(); 00300 } 00301 00302 void KFileIconView::invertSelection() 00303 { 00304 KIconView::invertSelection(); 00305 } 00306 00307 void KFileIconView::clearView() 00308 { 00309 m_resolver->m_lstPendingMimeIconItems.clear(); 00310 00311 KIconView::clear(); 00312 stopPreview(); 00313 } 00314 00315 void KFileIconView::insertItem( KFileItem *i ) 00316 { 00317 KFileView::insertItem( i ); 00318 00319 KFileIconViewItem *item = 00320 new KFileIconViewItem( (QIconView*)this, i->text(), 00321 i->pixmap( iconSizeFor( i ) ), i); 00322 initItem( item, i, false ); 00323 00324 if ( !i->isMimeTypeKnown() ) 00325 m_resolver->m_lstPendingMimeIconItems.append( item ); 00326 00327 i->setExtraData( this, item ); 00328 } 00329 00330 void KFileIconView::slotActivate( QIconViewItem *item ) 00331 { 00332 if ( !item ) 00333 return; 00334 const KFileItem *fi = ( (KFileIconViewItem*)item )->fileInfo(); 00335 if ( fi ) 00336 sig->activate( fi ); 00337 } 00338 00339 void KFileIconView::selected( QIconViewItem *item ) 00340 { 00341 if ( !item || (KApplication::keyboardModifiers() & (KApplication::ShiftModifier | KApplication::ControlModifier)) != 0 ) 00342 return; 00343 00344 if ( KGlobalSettings::singleClick() ) { 00345 const KFileItem *fi = ( (KFileIconViewItem*)item )->fileInfo(); 00346 if ( fi && (fi->isDir() || !onlyDoubleClickSelectsFiles()) ) 00347 sig->activate( fi ); 00348 } 00349 } 00350 00351 void KFileIconView::setCurrentItem( const KFileItem *item ) 00352 { 00353 KFileIconViewItem *it = viewItem( item ); 00354 if ( it ) 00355 KIconView::setCurrentItem( it ); 00356 } 00357 00358 KFileItem * KFileIconView::currentFileItem() const 00359 { 00360 KFileIconViewItem *current = static_cast<KFileIconViewItem*>( currentItem() ); 00361 if ( current ) 00362 return current->fileInfo(); 00363 00364 return 0L; 00365 } 00366 00367 void KFileIconView::highlighted( QIconViewItem *item ) 00368 { 00369 if ( !item ) 00370 return; 00371 const KFileItem *fi = ( (KFileIconViewItem*)item )->fileInfo(); 00372 if ( fi ) 00373 sig->highlightFile( fi ); 00374 } 00375 00376 void KFileIconView::setSelectionMode( KFile::SelectionMode sm ) 00377 { 00378 disconnect( SIGNAL( selectionChanged() ), this ); 00379 disconnect( SIGNAL( selectionChanged( QIconViewItem * )), this ); 00380 00381 KFileView::setSelectionMode( sm ); 00382 switch ( KFileView::selectionMode() ) { 00383 case KFile::Multi: 00384 QIconView::setSelectionMode( QIconView::Multi ); 00385 break; 00386 case KFile::Extended: 00387 QIconView::setSelectionMode( QIconView::Extended ); 00388 break; 00389 case KFile::NoSelection: 00390 QIconView::setSelectionMode( QIconView::NoSelection ); 00391 break; 00392 default: // fall through 00393 case KFile::Single: 00394 QIconView::setSelectionMode( QIconView::Single ); 00395 break; 00396 } 00397 00398 if ( sm == KFile::Multi || sm == KFile::Extended ) 00399 connect( this, SIGNAL( selectionChanged() ), 00400 SLOT( slotSelectionChanged() )); 00401 else 00402 connect( this, SIGNAL( selectionChanged( QIconViewItem * )), 00403 SLOT( highlighted( QIconViewItem * ))); 00404 } 00405 00406 bool KFileIconView::isSelected( const KFileItem *i ) const 00407 { 00408 KFileIconViewItem *item = viewItem( i ); 00409 return (item && item->isSelected()); 00410 } 00411 00412 void KFileIconView::updateView( bool b ) 00413 { 00414 if ( !b ) 00415 return; // eh? 00416 00417 KFileIconViewItem *item = static_cast<KFileIconViewItem*>(QIconView::firstItem()); 00418 if ( item ) { 00419 if ( d->previews->isChecked() ) { 00420 do { 00421 int size = canPreview( item->fileInfo() ) ? 00422 d->previewIconSize : myIconSize; 00423 item ->setPixmap( (item->fileInfo())->pixmap( size ) ); 00424 item = static_cast<KFileIconViewItem *>(item->nextItem()); 00425 } while ( item != 0L ); 00426 } 00427 00428 else { 00429 do { 00430 item ->setPixmap( (item->fileInfo())->pixmap( myIconSize)); 00431 item = static_cast<KFileIconViewItem *>(item->nextItem()); 00432 } while ( item != 0L ); 00433 } 00434 } 00435 } 00436 00437 void KFileIconView::updateView( const KFileItem *i ) 00438 { 00439 KFileIconViewItem *item = viewItem( i ); 00440 if ( item ) 00441 initItem( item, i, true ); 00442 } 00443 00444 void KFileIconView::removeItem( const KFileItem *i ) 00445 { 00446 if ( !i ) 00447 return; 00448 00449 KFileIconViewItem *item = viewItem( i ); 00450 m_resolver->m_lstPendingMimeIconItems.remove( item ); 00451 delete item; 00452 00453 KFileView::removeItem( i ); 00454 } 00455 00456 void KFileIconView::setIconSize( int size ) 00457 { 00458 myIconSize = size; 00459 updateIcons(); 00460 } 00461 00462 void KFileIconView::setPreviewSize( int size ) 00463 { 00464 if ( size < 30 ) 00465 size = 30; // minimum 00466 00467 d->previewIconSize = size; 00468 if ( d->previews->isChecked() ) 00469 showPreviews(); 00470 } 00471 00472 void KFileIconView::updateIcons() 00473 { 00474 updateView( true ); 00475 arrangeItemsInGrid(); 00476 } 00477 00478 void KFileIconView::ensureItemVisible( const KFileItem *i ) 00479 { 00480 KFileIconViewItem *item = viewItem( i ); 00481 if ( item ) 00482 KIconView::ensureItemVisible( item ); 00483 } 00484 00485 void KFileIconView::slotSelectionChanged() 00486 { 00487 sig->highlightFile( 0L ); 00488 } 00489 00490 void KFileIconView::slotSmallColumns() 00491 { 00492 // setItemTextPos(), setArrangement(), setWordWrapIconText() and 00493 // setIconSize() all call arrangeItemsInGrid() :( Prevent this. 00494 d->noArrangement = true; // stop arrangeItemsInGrid()! 00495 00496 // Make sure to uncheck previews if selected 00497 if ( d->previews->isChecked() ) 00498 { 00499 stopPreview(); 00500 d->previews->setChecked( false ); 00501 } 00502 setGridX( -1 ); 00503 setMaxItemWidth( 300 ); 00504 setItemTextPos( Right ); 00505 setArrangement( TopToBottom ); 00506 setWordWrapIconText( false ); 00507 setSpacing( 0 ); 00508 00509 d->noArrangement = false; // now we can arrange 00510 setIconSize( KIcon::SizeSmall ); 00511 } 00512 00513 void KFileIconView::slotLargeRows() 00514 { 00515 // setItemTextPos(), setArrangement(), setWordWrapIconText() and 00516 // setIconSize() all call arrangeItemsInGrid() :( Prevent this. 00517 d->noArrangement = true; // stop arrangeItemsInGrid()! 00518 00519 setGridX( KGlobal::iconLoader()->currentSize( KIcon::Desktop ) + 50 ); 00520 setItemTextPos( Bottom ); 00521 setArrangement( LeftToRight ); 00522 setWordWrapIconText( true ); 00523 setSpacing( 5 ); // default in QIconView 00524 00525 d->noArrangement = false; // now we can arrange 00526 setIconSize( KIcon::SizeMedium ); 00527 } 00528 00529 void KFileIconView::stopPreview() 00530 { 00531 if ( d->job ) { 00532 d->job->kill(); 00533 d->job = 0L; 00534 } 00535 } 00536 00537 void KFileIconView::slotPreviewsToggled( bool on ) 00538 { 00539 if ( on ) 00540 showPreviews(); 00541 else { 00542 stopPreview(); 00543 slotLargeRows(); 00544 } 00545 } 00546 00547 void KFileIconView::showPreviews() 00548 { 00549 if ( d->previewMimeTypes.isEmpty() ) 00550 d->previewMimeTypes = KIO::PreviewJob::supportedMimeTypes(); 00551 00552 stopPreview(); 00553 d->previews->setChecked( true ); 00554 00555 if ( !d->largeRows->isChecked() ) { 00556 d->largeRows->setChecked( true ); 00557 slotLargeRows(); // also sets the icon size and updates the grid 00558 } 00559 else { 00560 updateIcons(); 00561 } 00562 00563 d->job = KIO::filePreview(*items(), d->previewIconSize,d->previewIconSize); 00564 00565 connect( d->job, SIGNAL( result( KIO::Job * )), 00566 this, SLOT( slotPreviewResult( KIO::Job * ))); 00567 connect( d->job, SIGNAL( gotPreview( const KFileItem*, const QPixmap& )), 00568 SLOT( gotPreview( const KFileItem*, const QPixmap& ) )); 00569 // connect( d->job, SIGNAL( failed( const KFileItem* )), 00570 // this, SLOT( slotFailed( const KFileItem* ) )); 00571 } 00572 00573 void KFileIconView::slotPreviewResult( KIO::Job *job ) 00574 { 00575 if ( job == d->job ) 00576 d->job = 0L; 00577 } 00578 00579 void KFileIconView::gotPreview( const KFileItem *item, const QPixmap& pix ) 00580 { 00581 KFileIconViewItem *it = viewItem( item ); 00582 if ( it ) 00583 if( item->overlays() & KIcon::HiddenOverlay ) 00584 { 00585 QPixmap p( pix ); 00586 00587 KIconEffect::semiTransparent( p ); 00588 it->setPixmap( p ); 00589 } 00590 else 00591 it->setPixmap( pix ); 00592 } 00593 00594 bool KFileIconView::canPreview( const KFileItem *item ) const 00595 { 00596 QStringList::Iterator it = d->previewMimeTypes.begin(); 00597 QRegExp r; 00598 r.setWildcard( true ); 00599 00600 for ( ; it != d->previewMimeTypes.end(); ++it ) { 00601 QString type = *it; 00602 // the "mimetype" can be "image/*" 00603 if ( type.at( type.length() - 1 ) == '*' ) { 00604 r.setPattern( type ); 00605 if ( r.search( item->mimetype() ) != -1 ) 00606 return true; 00607 } 00608 else 00609 if ( item->mimetype() == type ) 00610 return true; 00611 } 00612 00613 return false; 00614 } 00615 00616 KFileItem * KFileIconView::firstFileItem() const 00617 { 00618 KFileIconViewItem *item = static_cast<KFileIconViewItem*>( firstItem() ); 00619 if ( item ) 00620 return item->fileInfo(); 00621 return 0L; 00622 } 00623 00624 KFileItem * KFileIconView::nextItem( const KFileItem *fileItem ) const 00625 { 00626 if ( fileItem ) { 00627 KFileIconViewItem *item = viewItem( fileItem ); 00628 if ( item && item->nextItem() ) 00629 return ((KFileIconViewItem*) item->nextItem())->fileInfo(); 00630 } 00631 return 0L; 00632 } 00633 00634 KFileItem * KFileIconView::prevItem( const KFileItem *fileItem ) const 00635 { 00636 if ( fileItem ) { 00637 KFileIconViewItem *item = viewItem( fileItem ); 00638 if ( item && item->prevItem() ) 00639 return ((KFileIconViewItem*) item->prevItem())->fileInfo(); 00640 } 00641 return 0L; 00642 } 00643 00644 void KFileIconView::setSorting( QDir::SortSpec spec ) 00645 { 00646 KFileView::setSorting( spec ); 00647 KFileItemListIterator it( *items() ); 00648 00649 KFileItem *item; 00650 00651 if ( spec & QDir::Time ) { 00652 for ( ; (item = it.current()); ++it ) 00653 // warning, time_t is often signed -> cast it 00654 viewItem(item)->setKey( sortingKey( (unsigned long)item->time( KIO::UDS_MODIFICATION_TIME ), item->isDir(), spec )); 00655 } 00656 00657 else if ( spec & QDir::Size ) { 00658 for ( ; (item = it.current()); ++it ) 00659 viewItem(item)->setKey( sortingKey( item->size(), item->isDir(), 00660 spec )); 00661 } 00662 else { // Name or Unsorted 00663 for ( ; (item = it.current()); ++it ) 00664 viewItem(item)->setKey( sortingKey( item->text(), item->isDir(), 00665 spec )); 00666 } 00667 00668 KIconView::setSorting( true, !isReversed() ); 00669 sort( !isReversed() ); 00670 } 00671 00672 // 00673 // mimetype determination on demand 00674 // 00675 void KFileIconView::mimeTypeDeterminationFinished() 00676 { 00677 // anything to do? 00678 } 00679 00680 void KFileIconView::determineIcon( KFileIconViewItem *item ) 00681 { 00682 (void) item->fileInfo()->determineMimeType(); 00683 updateView( item->fileInfo() ); 00684 } 00685 00686 void KFileIconView::listingCompleted() 00687 { 00688 arrangeItemsInGrid(); 00689 00690 // QIconView doesn't set the current item automatically, so we have to do 00691 // that. We don't want to emit selectionChanged() tho. 00692 if ( !currentItem() ) { 00693 bool block = signalsBlocked(); 00694 blockSignals( true ); 00695 QIconViewItem *item = viewItem( firstFileItem() ); 00696 KIconView::setCurrentItem( item ); 00697 KIconView::setSelected( item, false ); 00698 blockSignals( block ); 00699 } 00700 00701 m_resolver->start( d->previews->isChecked() ? 0 : 10 ); 00702 } 00703 00704 // need to remove our tooltip, eventually 00705 bool KFileIconView::eventFilter( QObject *o, QEvent *e ) 00706 { 00707 if ( o == viewport() || o == this ) { 00708 int type = e->type(); 00709 if ( type == QEvent::Leave || 00710 type == QEvent::FocusOut ) 00711 removeToolTip(); 00712 } 00713 00714 return KIconView::eventFilter( o, e ); 00715 } 00716 00718 00719 // ### workaround for Qt3 Bug 00720 void KFileIconView::showEvent( QShowEvent *e ) 00721 { 00722 KIconView::showEvent( e ); 00723 } 00724 00725 00726 void KFileIconView::initItem( KFileIconViewItem *item, const KFileItem *i, 00727 bool updateTextAndPixmap ) 00728 { 00729 if ( updateTextAndPixmap ) 00730 { 00731 // this causes a repaint of the item, which we want to avoid during 00732 // directory listing, when all items are created. We want to paint all 00733 // items at once, not every single item in that case. 00734 item->setText( i->text() , false, false ); 00735 item->setPixmap( i->pixmap( iconSizeFor( i ) ) ); 00736 } 00737 00738 // see also setSorting() 00739 QDir::SortSpec spec = KFileView::sorting(); 00740 00741 if ( spec & QDir::Time ) 00742 // warning, time_t is often signed -> cast it 00743 item->setKey( sortingKey( (unsigned long) i->time( KIO::UDS_MODIFICATION_TIME ), 00744 i->isDir(), spec )); 00745 else if ( spec & QDir::Size ) 00746 item->setKey( sortingKey( i->size(), i->isDir(), spec )); 00747 00748 else // Name or Unsorted 00749 item->setKey( sortingKey( i->text(), i->isDir(), spec )); 00750 00751 //qDebug("** key for: %s: %s", i->text().latin1(), item->key().latin1()); 00752 00753 if ( d->previews->isChecked() ) 00754 d->previewTimer.start( 10, true ); 00755 } 00756 00757 void KFileIconView::arrangeItemsInGrid( bool update ) 00758 { 00759 if ( d->noArrangement ) 00760 return; 00761 00762 KIconView::arrangeItemsInGrid( update ); 00763 } 00764 00765 int KFileIconView::iconSizeFor( const KFileItem *item ) const 00766 { 00767 if ( d->previews->isChecked() && canPreview( item ) ) 00768 return d->previewIconSize; 00769 return myIconSize; 00770 } 00771 00772 void KFileIconView::zoomIn() 00773 { 00774 setPreviewSize( d->previewIconSize + 30 ); 00775 } 00776 00777 void KFileIconView::zoomOut() 00778 { 00779 setPreviewSize( d->previewIconSize - 30 ); 00780 } 00781 00782 QDragObject *KFileIconView::dragObject() 00783 { 00784 // create a list of the URL:s that we want to drag 00785 KURL::List urls; 00786 KFileItemListIterator it( * KFileView::selectedItems() ); 00787 for ( ; it.current(); ++it ){ 00788 urls.append( (*it)->url() ); 00789 } 00790 QPixmap pixmap; 00791 if( urls.count() > 1 ) 00792 pixmap = DesktopIcon( "kmultiple", iconSize() ); 00793 if( pixmap.isNull() ) 00794 pixmap = currentFileItem()->pixmap( iconSize() ); 00795 00796 QPoint hotspot; 00797 hotspot.setX( pixmap.width() / 2 ); 00798 hotspot.setY( pixmap.height() / 2 ); 00799 QDragObject* myDragObject = new KURLDrag( urls, widget() ); 00800 myDragObject->setPixmap( pixmap, hotspot ); 00801 return myDragObject; 00802 } 00803 00804 void KFileIconView::slotAutoOpen() 00805 { 00806 d->autoOpenTimer.stop(); 00807 if( !d->dropItem ) 00808 return; 00809 00810 KFileItem *fileItem = d->dropItem->fileInfo(); 00811 if (!fileItem) 00812 return; 00813 00814 if( fileItem->isFile() ) 00815 return; 00816 00817 if ( fileItem->isDir() || fileItem->isLink()) 00818 sig->activate( fileItem ); 00819 } 00820 00821 bool KFileIconView::acceptDrag(QDropEvent* e) const 00822 { 00823 return KURLDrag::canDecode( e ) && 00824 (e->source()!=const_cast<KFileIconView*>(this)) && 00825 ( e->action() == QDropEvent::Copy 00826 || e->action() == QDropEvent::Move 00827 || e->action() == QDropEvent::Link ); 00828 } 00829 00830 void KFileIconView::contentsDragEnterEvent( QDragEnterEvent *e ) 00831 { 00832 if ( ! acceptDrag( e ) ) { // can we decode this ? 00833 e->ignore(); // No 00834 return; 00835 } 00836 e->acceptAction(); // Yes 00837 00838 if ((dropOptions() & AutoOpenDirs) == 0) 00839 return; 00840 00841 KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) )); 00842 if ( item ) { // are we over an item ? 00843 d->dropItem = item; 00844 d->autoOpenTimer.start( autoOpenDelay() ); // restart timer 00845 } 00846 else 00847 { 00848 d->dropItem = 0; 00849 d->autoOpenTimer.stop(); 00850 } 00851 } 00852 00853 void KFileIconView::contentsDragMoveEvent( QDragMoveEvent *e ) 00854 { 00855 if ( ! acceptDrag( e ) ) { // can we decode this ? 00856 e->ignore(); // No 00857 return; 00858 } 00859 e->acceptAction(); // Yes 00860 00861 if ((dropOptions() & AutoOpenDirs) == 0) 00862 return; 00863 00864 KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) )); 00865 if ( item ) { // are we over an item ? 00866 if (d->dropItem != item) 00867 { 00868 d->dropItem = item; 00869 d->autoOpenTimer.start( autoOpenDelay() ); // restart timer 00870 } 00871 } 00872 else 00873 { 00874 d->dropItem = 0; 00875 d->autoOpenTimer.stop(); 00876 } 00877 } 00878 00879 void KFileIconView::contentsDragLeaveEvent( QDragLeaveEvent * ) 00880 { 00881 d->dropItem = 0; 00882 d->autoOpenTimer.stop(); 00883 } 00884 00885 void KFileIconView::contentsDropEvent( QDropEvent *e ) 00886 { 00887 d->dropItem = 0; 00888 d->autoOpenTimer.stop(); 00889 00890 if ( ! acceptDrag( e ) ) { // can we decode this ? 00891 e->ignore(); // No 00892 return; 00893 } 00894 e->acceptAction(); // Yes 00895 00896 KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) )); 00897 KFileItem * fileItem = 0; 00898 if (item) 00899 fileItem = item->fileInfo(); 00900 00901 emit dropped(e, fileItem); 00902 00903 KURL::List urls; 00904 if (KURLDrag::decode( e, urls ) && !urls.isEmpty()) 00905 { 00906 emit dropped(e, urls, fileItem ? fileItem->url() : KURL()); 00907 sig->dropURLs(fileItem, e, urls); 00908 } 00909 } 00910 00911 void KFileIconView::virtual_hook( int id, void* data ) 00912 { KIconView::virtual_hook( id, data ); 00913 KFileView::virtual_hook( id, data ); } 00914 00915 #include "kfileiconview.moc"
KDE Logo
This file is part of the documentation for kio Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Oct 8 11:14:57 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003