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
00128
00129 slotPreviewsToggled(
true );
00130
00131 connect(
this, SIGNAL( returnPressed(
QIconViewItem *) ),
00132 SLOT( slotActivate(
QIconViewItem *) ) );
00133
00134
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:
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
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
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:
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;
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;
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
00493
00494 d->noArrangement =
true;
00495
00496
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;
00510
setIconSize( KIcon::SizeSmall );
00511 }
00512
00513
void KFileIconView::slotLargeRows()
00514 {
00515
00516
00517 d->noArrangement =
true;
00518
00519 setGridX( KGlobal::iconLoader()->currentSize( KIcon::Desktop ) + 50 );
00520 setItemTextPos( Bottom );
00521
setArrangement( LeftToRight );
00522 setWordWrapIconText(
true );
00523 setSpacing( 5 );
00524
00525 d->noArrangement =
false;
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();
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
00570
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
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
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 {
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
00674
00675
void KFileIconView::mimeTypeDeterminationFinished()
00676 {
00677
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
00691
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
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
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
00732
00733
00734 item->setText( i->
text() ,
false,
false );
00735 item->setPixmap( i->
pixmap( iconSizeFor( i ) ) );
00736 }
00737
00738
00739 QDir::SortSpec spec =
KFileView::sorting();
00740
00741
if ( spec & QDir::Time )
00742
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
00749 item->setKey(
sortingKey( i->
text(), i->
isDir(), spec ));
00750
00751
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
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 ) ) {
00833 e->ignore();
00834
return;
00835 }
00836 e->acceptAction();
00837
00838
if ((
dropOptions() & AutoOpenDirs) == 0)
00839
return;
00840
00841
KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) ));
00842
if ( item ) {
00843 d->dropItem = item;
00844 d->autoOpenTimer.start( autoOpenDelay() );
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 ) ) {
00856 e->ignore();
00857
return;
00858 }
00859 e->acceptAction();
00860
00861
if ((
dropOptions() & AutoOpenDirs) == 0)
00862
return;
00863
00864
KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) ));
00865
if ( item ) {
00866
if (d->dropItem != item)
00867 {
00868 d->dropItem = item;
00869 d->autoOpenTimer.start( autoOpenDelay() );
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 ) ) {
00891 e->ignore();
00892
return;
00893 }
00894 e->acceptAction();
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"