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
QIconView* qview = static_cast<QIconView*>(
this );
00319
00320
00321 qview->setUpdatesEnabled(
false );
00322
KFileIconViewItem *item =
new KFileIconViewItem( qview, i );
00323 initItem( item, i,
true );
00324 qview->setUpdatesEnabled(
true );
00325
00326
if ( !i->
isMimeTypeKnown() )
00327 m_resolver->
m_lstPendingMimeIconItems.append( item );
00328
00329 i->
setExtraData(
this, item );
00330 }
00331
00332
void KFileIconView::slotActivate(
QIconViewItem *item )
00333 {
00334
if ( !item )
00335
return;
00336
const KFileItem *fi = ( (
KFileIconViewItem*)item )->fileInfo();
00337
if ( fi )
00338 sig->
activate( fi );
00339 }
00340
00341
void KFileIconView::selected(
QIconViewItem *item )
00342 {
00343
if ( !item || (
KApplication::keyboardModifiers() & (KApplication::ShiftModifier | KApplication::ControlModifier)) != 0 )
00344
return;
00345
00346
if (
KGlobalSettings::singleClick() ) {
00347
const KFileItem *fi = ( (
KFileIconViewItem*)item )->fileInfo();
00348
if ( fi && (fi->
isDir() || !
onlyDoubleClickSelectsFiles()) )
00349 sig->
activate( fi );
00350 }
00351 }
00352
00353 void KFileIconView::setCurrentItem(
const KFileItem *item )
00354 {
00355
KFileIconViewItem *it = viewItem( item );
00356
if ( it )
00357 KIconView::setCurrentItem( it );
00358 }
00359
00360 KFileItem *
KFileIconView::currentFileItem()
const
00361
{
00362
KFileIconViewItem *current = static_cast<KFileIconViewItem*>( currentItem() );
00363
if ( current )
00364
return current->
fileInfo();
00365
00366
return 0L;
00367 }
00368
00369
void KFileIconView::highlighted(
QIconViewItem *item )
00370 {
00371
if ( !item )
00372
return;
00373
const KFileItem *fi = ( (
KFileIconViewItem*)item )->fileInfo();
00374
if ( fi )
00375 sig->
highlightFile( fi );
00376 }
00377
00378
void KFileIconView::setSelectionMode( KFile::SelectionMode sm )
00379 {
00380 disconnect( SIGNAL( selectionChanged() ),
this );
00381 disconnect( SIGNAL( selectionChanged(
QIconViewItem * )),
this );
00382
00383 KFileView::setSelectionMode( sm );
00384
switch ( KFileView::selectionMode() ) {
00385
case KFile::Multi:
00386 QIconView::setSelectionMode( QIconView::Multi );
00387
break;
00388
case KFile::Extended:
00389 QIconView::setSelectionMode( QIconView::Extended );
00390
break;
00391
case KFile::NoSelection:
00392 QIconView::setSelectionMode( QIconView::NoSelection );
00393
break;
00394
default:
00395
case KFile::Single:
00396 QIconView::setSelectionMode( QIconView::Single );
00397
break;
00398 }
00399
00400
if ( sm == KFile::Multi || sm == KFile::Extended )
00401 connect(
this, SIGNAL( selectionChanged() ),
00402 SLOT( slotSelectionChanged() ));
00403
else
00404 connect(
this, SIGNAL( selectionChanged(
QIconViewItem * )),
00405 SLOT( highlighted(
QIconViewItem * )));
00406 }
00407
00408 bool KFileIconView::isSelected(
const KFileItem *i )
const
00409
{
00410
KFileIconViewItem *item = viewItem( i );
00411
return (item && item->isSelected());
00412 }
00413
00414 void KFileIconView::updateView(
bool b )
00415 {
00416
if ( !b )
00417
return;
00418
00419
KFileIconViewItem *item = static_cast<KFileIconViewItem*>(QIconView::firstItem());
00420
if ( item ) {
00421
do {
00422
if ( d->previews->isChecked() ) {
00423
if ( canPreview( item->
fileInfo() ) )
00424 item->
setPixmapSize(
QSize( d->previewIconSize, d->previewIconSize ) );
00425 }
00426
else {
00427
00428
if ( !item->
pixmapSize().isNull() )
00429 item->
setPixmapSize(
QSize( 0, 0 ) );
00430 }
00431
00432 item->setPixmap( (item->
fileInfo())->pixmap( myIconSize ),
true,
false );
00433 item = static_cast<KFileIconViewItem *>(item->nextItem());
00434 }
while ( item != 0L );
00435 }
00436 }
00437
00438
void KFileIconView::updateView(
const KFileItem *i )
00439 {
00440
KFileIconViewItem *item = viewItem( i );
00441
if ( item )
00442 initItem( item, i,
true );
00443 }
00444
00445 void KFileIconView::removeItem(
const KFileItem *i )
00446 {
00447
if ( !i )
00448
return;
00449
00450
KFileIconViewItem *item = viewItem( i );
00451 m_resolver->
m_lstPendingMimeIconItems.remove( item );
00452
delete item;
00453
00454
KFileView::removeItem( i );
00455 }
00456
00457 void KFileIconView::setIconSize(
int size )
00458 {
00459 myIconSize = size;
00460 updateIcons();
00461 }
00462
00463 void KFileIconView::setPreviewSize(
int size )
00464 {
00465
if ( size < 30 )
00466 size = 30;
00467
00468 d->previewIconSize = size;
00469
if ( d->previews->isChecked() )
00470
showPreviews();
00471 }
00472
00473
void KFileIconView::updateIcons()
00474 {
00475
updateView(
true );
00476
arrangeItemsInGrid();
00477 }
00478
00479 void KFileIconView::ensureItemVisible(
const KFileItem *i )
00480 {
00481
KFileIconViewItem *item = viewItem( i );
00482
if ( item )
00483 KIconView::ensureItemVisible( item );
00484 }
00485
00486
void KFileIconView::slotSelectionChanged()
00487 {
00488 sig->
highlightFile( 0L );
00489 }
00490
00491
void KFileIconView::slotSmallColumns()
00492 {
00493
00494
00495 d->noArrangement =
true;
00496
00497
00498
if ( d->previews->isChecked() )
00499 {
00500 stopPreview();
00501 d->previews->setChecked(
false );
00502 }
00503 setGridX( -1 );
00504 setMaxItemWidth( 300 );
00505 setItemTextPos( Right );
00506
setArrangement( TopToBottom );
00507 setWordWrapIconText(
false );
00508 setSpacing( 0 );
00509
00510 d->noArrangement =
false;
00511
setIconSize( KIcon::SizeSmall );
00512 }
00513
00514
void KFileIconView::slotLargeRows()
00515 {
00516
00517
00518 d->noArrangement =
true;
00519
00520 setGridX( KGlobal::iconLoader()->currentSize( KIcon::Desktop ) + 50 );
00521 setItemTextPos( Bottom );
00522
setArrangement( LeftToRight );
00523 setWordWrapIconText(
true );
00524 setSpacing( 5 );
00525
00526 d->noArrangement =
false;
00527
setIconSize( KIcon::SizeMedium );
00528 }
00529
00530
void KFileIconView::stopPreview()
00531 {
00532
if ( d->job ) {
00533 d->job->kill();
00534 d->job = 0L;
00535 }
00536 }
00537
00538
void KFileIconView::slotPreviewsToggled(
bool on )
00539 {
00540
if ( on )
00541
showPreviews();
00542
else {
00543 stopPreview();
00544 slotLargeRows();
00545 }
00546 }
00547
00548 void KFileIconView::showPreviews()
00549 {
00550
if ( d->previewMimeTypes.isEmpty() )
00551 d->previewMimeTypes =
KIO::PreviewJob::supportedMimeTypes();
00552
00553 stopPreview();
00554 d->previews->setChecked(
true );
00555
00556
if ( !d->largeRows->isChecked() ) {
00557 d->largeRows->setChecked(
true );
00558 slotLargeRows();
00559 }
00560
else {
00561 updateIcons();
00562 }
00563
00564 d->job =
KIO::filePreview(*
items(), d->previewIconSize,d->previewIconSize);
00565
00566 connect( d->job, SIGNAL( result(
KIO::Job * )),
00567
this, SLOT( slotPreviewResult(
KIO::Job * )));
00568 connect( d->job, SIGNAL( gotPreview(
const KFileItem*,
const QPixmap& )),
00569 SLOT( gotPreview(
const KFileItem*,
const QPixmap& ) ));
00570
00571
00572 }
00573
00574
void KFileIconView::slotPreviewResult(
KIO::Job *job )
00575 {
00576
if ( job == d->job )
00577 d->job = 0L;
00578 }
00579
00580
void KFileIconView::gotPreview(
const KFileItem *item,
const QPixmap& pix )
00581 {
00582
KFileIconViewItem *it = viewItem( item );
00583
if ( it )
00584
if( item->
overlays() &
KIcon::HiddenOverlay )
00585 {
00586
QPixmap p( pix );
00587
00588
KIconEffect::semiTransparent( p );
00589 it->setPixmap( p );
00590 }
00591
else
00592 it->setPixmap( pix );
00593 }
00594
00595
bool KFileIconView::canPreview(
const KFileItem *item )
const
00596
{
00597 QStringList::Iterator it = d->previewMimeTypes.begin();
00598
QRegExp r;
00599 r.setWildcard(
true );
00600
00601
for ( ; it != d->previewMimeTypes.end(); ++it ) {
00602
QString type = *it;
00603
00604
if ( type.at( type.length() - 1 ) ==
'*' ) {
00605 r.setPattern( type );
00606
if ( r.search( item->
mimetype() ) != -1 )
00607
return true;
00608 }
00609
else
00610
if ( item->
mimetype() == type )
00611
return true;
00612 }
00613
00614
return false;
00615 }
00616
00617
KFileItem * KFileIconView::firstFileItem()
const
00618
{
00619
KFileIconViewItem *item = static_cast<KFileIconViewItem*>( firstItem() );
00620
if ( item )
00621
return item->
fileInfo();
00622
return 0L;
00623 }
00624
00625
KFileItem * KFileIconView::nextItem(
const KFileItem *fileItem )
const
00626
{
00627
if ( fileItem ) {
00628
KFileIconViewItem *item = viewItem( fileItem );
00629
if ( item && item->nextItem() )
00630
return ((
KFileIconViewItem*) item->nextItem())->fileInfo();
00631 }
00632
return 0L;
00633 }
00634
00635
KFileItem * KFileIconView::prevItem(
const KFileItem *fileItem )
const
00636
{
00637
if ( fileItem ) {
00638
KFileIconViewItem *item = viewItem( fileItem );
00639
if ( item && item->prevItem() )
00640
return ((
KFileIconViewItem*) item->prevItem())->fileInfo();
00641 }
00642
return 0L;
00643 }
00644
00645 void KFileIconView::setSorting( QDir::SortSpec spec )
00646 {
00647
KFileView::setSorting( spec );
00648
KFileItemListIterator it( *
items() );
00649
00650
KFileItem *item;
00651
00652
if ( spec & QDir::Time ) {
00653
for ( ; (item = it.current()); ++it )
00654
00655 viewItem(item)->setKey(
sortingKey( (
unsigned long)item->
time( KIO::UDS_MODIFICATION_TIME ), item->
isDir(), spec ));
00656 }
00657
00658
else if ( spec & QDir::Size ) {
00659
for ( ; (item = it.current()); ++it )
00660 viewItem(item)->setKey(
sortingKey( item->
size(), item->
isDir(),
00661 spec ));
00662 }
00663
else {
00664
for ( ; (item = it.current()); ++it )
00665 viewItem(item)->setKey(
sortingKey( item->
text(), item->
isDir(),
00666 spec ));
00667 }
00668
00669
KIconView::setSorting(
true, !
isReversed() );
00670 sort( !
isReversed() );
00671 }
00672
00673
00674
00675
00676
void KFileIconView::mimeTypeDeterminationFinished()
00677 {
00678
00679 }
00680
00681
void KFileIconView::determineIcon(
KFileIconViewItem *item )
00682 {
00683 (
void) item->
fileInfo()->
determineMimeType();
00684
updateView( item->
fileInfo() );
00685 }
00686
00687 void KFileIconView::listingCompleted()
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 ( d->previews->isChecked() && canPreview( i ) )
00729 item->
setPixmapSize(
QSize( d->previewIconSize, d->previewIconSize ) );
00730
00731
if ( updateTextAndPixmap )
00732 {
00733
00734
00735
00736 item->setText( i->
text() ,
false,
false );
00737 item->setPixmap( i->
pixmap( myIconSize ) );
00738 }
00739
00740
00741 QDir::SortSpec spec =
KFileView::sorting();
00742
00743
if ( spec & QDir::Time )
00744
00745 item->setKey(
sortingKey( (
unsigned long) i->
time( KIO::UDS_MODIFICATION_TIME ),
00746 i->
isDir(), spec ));
00747
else if ( spec & QDir::Size )
00748 item->setKey(
sortingKey( i->
size(), i->
isDir(), spec ));
00749
00750
else
00751 item->setKey(
sortingKey( i->
text(), i->
isDir(), spec ));
00752
00753
00754
00755
if ( d->previews->isChecked() )
00756 d->previewTimer.start( 10,
true );
00757 }
00758
00759 void KFileIconView::arrangeItemsInGrid(
bool update )
00760 {
00761
if ( d->noArrangement )
00762
return;
00763
00764 KIconView::arrangeItemsInGrid( update );
00765 }
00766
00767
void KFileIconView::zoomIn()
00768 {
00769
setPreviewSize( d->previewIconSize + 30 );
00770 }
00771
00772
void KFileIconView::zoomOut()
00773 {
00774
setPreviewSize( d->previewIconSize - 30 );
00775 }
00776
00777
QDragObject *KFileIconView::dragObject()
00778 {
00779
00780
KURL::List urls;
00781
KFileItemListIterator it( * KFileView::selectedItems() );
00782
for ( ; it.current(); ++it ){
00783 urls.append( (*it)->url() );
00784 }
00785
QPixmap pixmap;
00786
if( urls.count() > 1 )
00787 pixmap = DesktopIcon(
"kmultiple",
iconSize() );
00788
if( pixmap.isNull() )
00789 pixmap =
currentFileItem()->
pixmap(
iconSize() );
00790
00791
QPoint hotspot;
00792 hotspot.setX( pixmap.width() / 2 );
00793 hotspot.setY( pixmap.height() / 2 );
00794
QDragObject* myDragObject =
new KURLDrag( urls,
widget() );
00795 myDragObject->setPixmap( pixmap, hotspot );
00796
return myDragObject;
00797 }
00798
00799
void KFileIconView::slotAutoOpen()
00800 {
00801 d->autoOpenTimer.stop();
00802
if( !d->dropItem )
00803
return;
00804
00805
KFileItem *fileItem = d->dropItem->fileInfo();
00806
if (!fileItem)
00807
return;
00808
00809
if( fileItem->
isFile() )
00810
return;
00811
00812
if ( fileItem->
isDir() || fileItem->
isLink())
00813 sig->
activate( fileItem );
00814 }
00815
00816
bool KFileIconView::acceptDrag(
QDropEvent* e)
const
00817
{
00818
return KURLDrag::canDecode( e ) &&
00819 (e->source()!=const_cast<KFileIconView*>(
this)) &&
00820 ( e->action() == QDropEvent::Copy
00821 || e->action() == QDropEvent::Move
00822 || e->action() == QDropEvent::Link );
00823 }
00824
00825
void KFileIconView::contentsDragEnterEvent(
QDragEnterEvent *e )
00826 {
00827
if ( ! acceptDrag( e ) ) {
00828 e->ignore();
00829
return;
00830 }
00831 e->acceptAction();
00832
00833
if ((
dropOptions() & AutoOpenDirs) == 0)
00834
return;
00835
00836
KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) ));
00837
if ( item ) {
00838 d->dropItem = item;
00839 d->autoOpenTimer.start( autoOpenDelay() );
00840 }
00841
else
00842 {
00843 d->dropItem = 0;
00844 d->autoOpenTimer.stop();
00845 }
00846 }
00847
00848
void KFileIconView::contentsDragMoveEvent(
QDragMoveEvent *e )
00849 {
00850
if ( ! acceptDrag( e ) ) {
00851 e->ignore();
00852
return;
00853 }
00854 e->acceptAction();
00855
00856
if ((
dropOptions() & AutoOpenDirs) == 0)
00857
return;
00858
00859
KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) ));
00860
if ( item ) {
00861
if (d->dropItem != item)
00862 {
00863 d->dropItem = item;
00864 d->autoOpenTimer.start( autoOpenDelay() );
00865 }
00866 }
00867
else
00868 {
00869 d->dropItem = 0;
00870 d->autoOpenTimer.stop();
00871 }
00872 }
00873
00874
void KFileIconView::contentsDragLeaveEvent(
QDragLeaveEvent * )
00875 {
00876 d->dropItem = 0;
00877 d->autoOpenTimer.stop();
00878 }
00879
00880
void KFileIconView::contentsDropEvent(
QDropEvent *e )
00881 {
00882 d->dropItem = 0;
00883 d->autoOpenTimer.stop();
00884
00885
if ( ! acceptDrag( e ) ) {
00886 e->ignore();
00887
return;
00888 }
00889 e->acceptAction();
00890
00891
KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) ));
00892
KFileItem * fileItem = 0;
00893
if (item)
00894 fileItem = item->
fileInfo();
00895
00896 emit
dropped(e, fileItem);
00897
00898
KURL::List urls;
00899
if (
KURLDrag::decode( e, urls ) && !urls.isEmpty())
00900 {
00901 emit
dropped(e, urls, fileItem ? fileItem->
url() :
KURL());
00902 sig->
dropURLs(fileItem, e, urls);
00903 }
00904 }
00905
00906
void KFileIconView::virtual_hook(
int id,
void* data )
00907 {
KIconView::virtual_hook(
id, data );
00908 KFileView::virtual_hook(
id, data ); }
00909
00910
#include "kfileiconview.moc"