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"