00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "konq_iconviewwidget.h"
00021 #include "konq_operations.h"
00022 #include "konq_undo.h"
00023 #include "konq_sound.h"
00024 #include "konq_filetip.h"
00025
00026 #include <tqclipboard.h>
00027 #include <tqlayout.h>
00028 #include <tqtimer.h>
00029 #include <tqpainter.h>
00030 #include <tqtooltip.h>
00031 #include <tqlabel.h>
00032 #include <tqmovie.h>
00033 #include <tqregexp.h>
00034 #include <tqcursor.h>
00035
00036 #include <tdeapplication.h>
00037 #include <kdebug.h>
00038 #include <tdeio/previewjob.h>
00039 #include <tdefileivi.h>
00040 #include <konq_settings.h>
00041 #include <konq_drag.h>
00042 #include <tdeglobalsettings.h>
00043 #include <kpropertiesdialog.h>
00044 #include <kipc.h>
00045 #include <kicontheme.h>
00046 #include <kiconeffect.h>
00047 #include <kurldrag.h>
00048 #include <kstandarddirs.h>
00049 #include <kprotocolinfo.h>
00050 #include <ktrader.h>
00051
00052 #include <assert.h>
00053 #include <unistd.h>
00054 #include <tdelocale.h>
00055
00056
00057 struct KonqIconViewWidgetPrivate
00058 {
00059 KonqIconViewWidgetPrivate() {
00060 pActiveItem = 0;
00061 bSoundPreviews = false;
00062 pSoundItem = 0;
00063 bSoundItemClicked = false;
00064 pSoundPlayer = 0;
00065 pSoundTimer = 0;
00066 pPreviewJob = 0;
00067 bAllowSetWallpaper = false;
00068
00069 doAnimations = true;
00070 m_movie = 0L;
00071 m_movieBlocked = 0;
00072 pFileTip = 0;
00073 pActivateDoubleClick = 0L;
00074 bCaseInsensitive = true;
00075 pPreviewMimeTypes = 0L;
00076 bProgramsURLdrag = false;
00077 }
00078 ~KonqIconViewWidgetPrivate() {
00079 delete pSoundPlayer;
00080 delete pSoundTimer;
00081 delete m_movie;
00082 delete pFileTip;
00083 delete pActivateDoubleClick;
00084 delete pPreviewMimeTypes;
00085
00086 }
00087 KFileIVI *pActiveItem;
00088
00089 KFileIVI *pSoundItem;
00090 KonqSoundPlayer *pSoundPlayer;
00091 TQTimer *pSoundTimer;
00092 bool bSoundPreviews;
00093 bool bSoundItemClicked;
00094 bool bAllowSetWallpaper;
00095 bool bCaseInsensitive;
00096 bool bBoostPreview;
00097
00098
00099 bool doAnimations;
00100 TQMovie* m_movie;
00101 int m_movieBlocked;
00102 TQString movieFileName;
00103
00104 TDEIO::PreviewJob *pPreviewJob;
00105 KonqFileTip* pFileTip;
00106 TQStringList previewSettings;
00107 bool renameItem;
00108 bool firstClick;
00109 bool releaseMouseEvent;
00110 TQPoint mousePos;
00111 int mouseState;
00112 TQTimer *pActivateDoubleClick;
00113 TQStringList* pPreviewMimeTypes;
00114 bool bProgramsURLdrag;
00115 };
00116
00117 KonqIconViewWidget::KonqIconViewWidget( TQWidget * parent, const char * name, WFlags f, bool kdesktop )
00118 : TDEIconView( parent, name, f ),
00119 m_rootItem( 0L ), m_size( 0 ) ,
00120 m_bDesktop( kdesktop ),
00121 m_bSetGridX( !kdesktop )
00122 {
00123 d = new KonqIconViewWidgetPrivate;
00124 connect( this, TQT_SIGNAL( dropped( TQDropEvent *, const TQValueList<TQIconDragItem> & ) ),
00125 this, TQT_SLOT( slotDropped( TQDropEvent*, const TQValueList<TQIconDragItem> & ) ) );
00126
00127 connect( this, TQT_SIGNAL( selectionChanged() ),
00128 this, TQT_SLOT( slotSelectionChanged() ) );
00129
00130 kapp->addKipcEventMask( KIPC::IconChanged );
00131 connect( kapp, TQT_SIGNAL(iconChanged(int)), TQT_SLOT(slotIconChanged(int)) );
00132 connect( this, TQT_SIGNAL(onItem(TQIconViewItem *)), TQT_SLOT(slotOnItem(TQIconViewItem *)) );
00133 connect( this, TQT_SIGNAL(onViewport()), TQT_SLOT(slotOnViewport()) );
00134 connect( this, TQT_SIGNAL(itemRenamed(TQIconViewItem *, const TQString &)), TQT_SLOT(slotItemRenamed(TQIconViewItem *, const TQString &)) );
00135
00136 m_pSettings = KonqFMSettings::settings();
00137 d->bBoostPreview = boostPreview();
00138
00139
00140 setSelectionMode( TQIconView::Extended );
00141 setItemTextPos( TQIconView::Bottom );
00142 d->releaseMouseEvent = false;
00143 d->pFileTip = new KonqFileTip(this);
00144 d->firstClick = false;
00145 calculateGridX();
00146 setAutoArrange( true );
00147 setSorting( true, sortDirection() );
00148 readAnimatedIconsConfig();
00149 m_bSortDirsFirst = true;
00150 m_bMousePressed = false;
00151 m_LineupMode = LineupBoth;
00152
00153 slotSelectionChanged();
00154 m_iconPositionGroupPrefix = TQString::fromLatin1( "IconPosition::" );
00155 KonqUndoManager::incRef();
00156 }
00157
00158 KonqIconViewWidget::~KonqIconViewWidget()
00159 {
00160 stopImagePreview();
00161 KonqUndoManager::decRef();
00162 delete d;
00163 }
00164
00165 bool KonqIconViewWidget::maySetWallpaper()
00166 {
00167 return d->bAllowSetWallpaper;
00168 }
00169
00170 void KonqIconViewWidget::setMaySetWallpaper(bool b)
00171 {
00172 d->bAllowSetWallpaper = b;
00173 }
00174
00175 void KonqIconViewWidget::focusOutEvent( TQFocusEvent * ev )
00176 {
00177
00178
00179
00180 m_bMousePressed = false;
00181
00182
00183
00184
00185
00186
00187 slotOnViewport();
00188
00189 TDEIconView::focusOutEvent( ev );
00190 }
00191
00192 void KonqIconViewWidget::slotItemRenamed(TQIconViewItem *item, const TQString &name)
00193 {
00194 kdDebug(1203) << "KonqIconViewWidget::slotItemRenamed" << endl;
00195 KFileIVI *viewItem = static_cast<KFileIVI *>(item);
00196 KFileItem *fileItem = viewItem->item();
00197
00198
00199
00200
00201 viewItem->setText( fileItem->text() );
00202 kdDebug(1203)<<" fileItem->text() ;"<<fileItem->text()<<endl;
00203
00204 if( !name.isEmpty() )
00205 {
00206
00207 KURL oldurl( fileItem->url() );
00208 KURL newurl( oldurl );
00209 newurl.setPath( newurl.directory(false) + TDEIO::encodeFileName( name ) );
00210 kdDebug(1203)<<" newurl :"<<newurl<<endl;
00211
00212 KonqOperations::rename( this, oldurl, newurl );
00213 }
00214 }
00215
00216 void KonqIconViewWidget::slotIconChanged( int group )
00217 {
00218 if (group != TDEIcon::Desktop)
00219 return;
00220
00221 int size = m_size;
00222 if ( m_size == 0 )
00223 m_size = -1;
00224 setIcons( size );
00225 readAnimatedIconsConfig();
00226 }
00227
00228 void KonqIconViewWidget::readAnimatedIconsConfig()
00229 {
00230 TDEConfigGroup cfgGroup( TDEGlobal::config(), "DesktopIcons" );
00231 d->doAnimations = cfgGroup.readBoolEntry( "Animated", true );
00232 }
00233
00234 void KonqIconViewWidget::slotOnItem( TQIconViewItem *_item )
00235 {
00236 KFileIVI* item = static_cast<KFileIVI *>( _item );
00237
00238 if( d->pActiveItem != 0L && d->pActiveItem != item )
00239 {
00240 if ( d->m_movie && d->pActiveItem->isAnimated() )
00241 {
00242 d->m_movie->pause();
00243 d->pActiveItem->setAnimated( false );
00244 d->pActiveItem->refreshIcon( true );
00245 }
00246 else {
00247 d->pActiveItem->setActive( false );
00248 }
00249 d->pActiveItem = 0L;
00250 d->pFileTip->setItem( 0L );
00251 }
00252
00253
00254 if (d->pSoundPlayer != 0 && item != d->pSoundItem)
00255 {
00256 d->pSoundPlayer->stop();
00257
00258 d->pSoundItem = 0;
00259 if (d->pSoundTimer && d->pSoundTimer->isActive())
00260 d->pSoundTimer->stop();
00261 }
00262
00263 if ( !m_bMousePressed )
00264 {
00265 if( item != d->pActiveItem )
00266 {
00267 d->pActiveItem = item;
00268 d->pFileTip->setItem( d->pActiveItem->item(),
00269 item->rect(),
00270 item->pixmap() );
00271
00272 if ( d->doAnimations && d->pActiveItem && d->pActiveItem->hasAnimation() )
00273 {
00274
00275
00276 #if 0 // Qt-mng bug, reusing the movie doesn't work currently.
00277 if ( d->m_movie && d->movieFileName == d->pActiveItem->mouseOverAnimation() )
00278 {
00279 d->pActiveItem->setAnimated( true );
00280 if (d->m_movieBlocked) {
00281 kdDebug(1203) << "onitem, but blocked" << endl;
00282 d->m_movie->pause();
00283 }
00284 else {
00285 kdDebug(1203) << "we go ahead.." << endl;
00286 d->m_movieBlocked++;
00287 TQTimer::singleShot(300, this, TQT_SLOT(slotReenableAnimation()));
00288 d->m_movie->restart();
00289 d->m_movie->unpause();
00290 }
00291 }
00292 else
00293 #endif
00294 {
00295 TQMovie movie = TDEGlobal::iconLoader()->loadMovie( d->pActiveItem->mouseOverAnimation(), TDEIcon::Desktop, d->pActiveItem->iconSize() );
00296 if ( !movie.isNull() )
00297 {
00298 delete d->m_movie;
00299 d->m_movie = new TQMovie( movie );
00300
00301
00302 const TQPixmap* pm = backgroundPixmap();
00303 bool hasPixmap = pm && !pm->isNull();
00304 if ( !hasPixmap ) {
00305 pm = viewport()->backgroundPixmap();
00306 hasPixmap = pm && !pm->isNull();
00307 }
00308 if (!hasPixmap && backgroundMode() != NoBackground)
00309 d->m_movie->setBackgroundColor( viewport()->backgroundColor() );
00310 d->m_movie->connectUpdate( this, TQT_SLOT( slotMovieUpdate(const TQRect &) ) );
00311 d->m_movie->connectStatus( TQT_TQOBJECT(this), TQT_SLOT( slotMovieStatus(int) ) );
00312 d->movieFileName = d->pActiveItem->mouseOverAnimation();
00313 d->pActiveItem->setAnimated( true );
00314 }
00315 else
00316 {
00317 d->pActiveItem->setAnimated( false );
00318 if (d->m_movie)
00319 d->m_movie->pause();
00320
00321 d->pActiveItem->setMouseOverAnimation( TQString::null );
00322 }
00323 }
00324 }
00325
00326 if (d->pActiveItem && !d->pActiveItem->isAnimated())
00327 {
00328 d->pActiveItem->setActive( true );
00329 }
00330 }
00331 else
00332 {
00333
00334
00335 d->pActiveItem = 0L;
00336 d->pFileTip->setItem( 0L );
00337 }
00338 }
00339 else
00340 {
00341
00342
00343 d->pActiveItem = 0L;
00344 d->pFileTip->setItem( 0L );
00345 }
00346
00347
00348 if (d->bSoundPreviews && d->pSoundPlayer &&
00349 d->pSoundPlayer->mimeTypes().contains(
00350 item->item()->mimetype())
00351 && TDEGlobalSettings::showFilePreview(item->item()->url())
00352 && topLevelWidget() == kapp->activeWindow())
00353 {
00354 d->pSoundItem = item;
00355 d->bSoundItemClicked = false;
00356 if (!d->pSoundTimer)
00357 {
00358 d->pSoundTimer = new TQTimer(this);
00359 connect(d->pSoundTimer, TQT_SIGNAL(timeout()), TQT_SLOT(slotStartSoundPreview()));
00360 }
00361 if (d->pSoundTimer->isActive())
00362 d->pSoundTimer->stop();
00363 d->pSoundTimer->start(500, true);
00364 }
00365 else
00366 {
00367 if (d->pSoundPlayer)
00368 d->pSoundPlayer->stop();
00369 d->pSoundItem = 0;
00370 if (d->pSoundTimer && d->pSoundTimer->isActive())
00371 d->pSoundTimer->stop();
00372 }
00373 }
00374
00375 void KonqIconViewWidget::slotOnViewport()
00376 {
00377 d->pFileTip->setItem( 0L );
00378
00379 if (d->pSoundPlayer)
00380 d->pSoundPlayer->stop();
00381 d->pSoundItem = 0;
00382 if (d->pSoundTimer && d->pSoundTimer->isActive())
00383 d->pSoundTimer->stop();
00384
00385 if (d->pActiveItem == 0L)
00386 return;
00387
00388 if ( d->doAnimations && d->m_movie && d->pActiveItem->isAnimated() )
00389 {
00390 d->pActiveItem->setAnimated( false );
00391 #if 0
00392
00393 if (d->m_movie->running()) {
00394 d->m_movie->pause();
00395 d->m_movieBlocked++;
00396 kdDebug(1203) << "on viewport, blocking" << endl;
00397 TQTimer::singleShot(300, this, TQT_SLOT(slotReenableAnimation()));
00398 }
00399 #endif
00400 d->pActiveItem->refreshIcon( true );
00401 Q_ASSERT( d->pActiveItem->state() == TDEIcon::DefaultState );
00402
00403
00404
00405 }
00406 else
00407 {
00408 d->pActiveItem->setActive( false );
00409 }
00410 d->pActiveItem = 0L;
00411 }
00412
00413 void KonqIconViewWidget::slotStartSoundPreview()
00414 {
00415 if (!d->pSoundItem || d->bSoundItemClicked)
00416 return;
00417
00418 d->pSoundPlayer->play(d->pSoundItem->item()->url().url());
00419 }
00420
00421
00422 void KonqIconViewWidget::slotPreview(const KFileItem *item, const TQPixmap &pix)
00423 {
00424
00425 for (TQIconViewItem *it = firstItem(); it; it = it->nextItem())
00426 {
00427 KFileIVI* current = static_cast<KFileIVI *>(it);
00428 if (current->item() == item)
00429 {
00430 if (item->overlays() & TDEIcon::HiddenOverlay) {
00431 TQPixmap p(pix);
00432
00433 TDEIconEffect::semiTransparent(p);
00434 current->setThumbnailPixmap(p);
00435 } else {
00436 current->setThumbnailPixmap(pix);
00437 }
00438 break;
00439 }
00440 }
00441 }
00442
00443 void KonqIconViewWidget::slotPreviewResult()
00444 {
00445 d->pPreviewJob = 0;
00446 emit imagePreviewFinished();
00447 }
00448
00449 void KonqIconViewWidget::slotToolTipPreview(const KFileItem* , const TQPixmap &)
00450 {
00451
00452 }
00453
00454 void KonqIconViewWidget::slotToolTipPreviewResult()
00455 {
00456
00457 }
00458
00459 void KonqIconViewWidget::slotMovieUpdate( const TQRect& rect )
00460 {
00461
00462 Q_ASSERT( d );
00463 Q_ASSERT( d->m_movie );
00464
00465 if ( d->pActiveItem && d->m_movie && d->pActiveItem->isAnimated() ) {
00466 const TQPixmap &frame = d->m_movie->framePixmap();
00467
00468
00469 int iconSize=d->pActiveItem->iconSize();
00470 if (iconSize==0) iconSize = TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
00471 if ( frame.width() != iconSize || frame.height() != iconSize ) {
00472 d->pActiveItem->setAnimated( false );
00473 d->m_movie->pause();
00474
00475 d->pActiveItem->setMouseOverAnimation( TQString::null );
00476 d->pActiveItem->setActive( true );
00477 return;
00478 }
00479 d->pActiveItem->setPixmapDirect( frame, false, false );
00480 TQRect pixRect = d->pActiveItem->pixmapRect(false);
00481 repaintContents( pixRect.x() + rect.x(), pixRect.y() + rect.y(), rect.width(), rect.height(), false );
00482 }
00483 }
00484
00485 void KonqIconViewWidget::slotMovieStatus( int status )
00486 {
00487 if ( status < 0 ) {
00488
00489 if ( d->pActiveItem && d->pActiveItem->isAnimated() ) {
00490 d->pActiveItem->setAnimated( false );
00491 d->pActiveItem->setMouseOverAnimation( TQString::null );
00492 d->pActiveItem->setActive( true );
00493 }
00494 }
00495 }
00496
00497 void KonqIconViewWidget::slotReenableAnimation()
00498 {
00499 if (!--d->m_movieBlocked) {
00500 if ( d->pActiveItem && d->m_movie && d->m_movie->paused()) {
00501 kdDebug(1203) << "reenabled animation" << endl;
00502 d->m_movie->restart();
00503 d->m_movie->unpause();
00504 }
00505 }
00506 }
00507
00508 void KonqIconViewWidget::clear()
00509 {
00510 d->pFileTip->setItem( 0L );
00511 stopImagePreview();
00512 TDEIconView::clear();
00513 d->pActiveItem = 0L;
00514 }
00515
00516 void KonqIconViewWidget::takeItem( TQIconViewItem *item )
00517 {
00518 if ( d->pActiveItem == static_cast<KFileIVI *>(item) )
00519 {
00520 d->pFileTip->setItem( 0L );
00521 d->pActiveItem = 0L;
00522 }
00523
00524 if ( d->pPreviewJob )
00525 d->pPreviewJob->removeItem( static_cast<KFileIVI *>(item)->item() );
00526
00527 TDEIconView::takeItem( item );
00528 }
00529
00530
00531 void KonqIconViewWidget::setThumbnailPixmap( KFileIVI * item, const TQPixmap & pixmap )
00532 {
00533 if ( item )
00534 {
00535 if ( d->pActiveItem == item )
00536 {
00537 d->pFileTip->setItem( 0L );
00538 d->pActiveItem = 0L;
00539 }
00540 item->setThumbnailPixmap( pixmap );
00541 if ( m_bSetGridX && item->width() > gridX() )
00542 {
00543 setGridX( item->width() );
00544 if (autoArrange())
00545 arrangeItemsInGrid();
00546 }
00547 }
00548 }
00549
00550 bool KonqIconViewWidget::initConfig( bool bInit )
00551 {
00552 bool fontChanged = false;
00553
00554
00555 TQColor normalTextColor = m_pSettings->normalTextColor();
00556 setItemColor( normalTextColor );
00557
00558 if (m_bDesktop)
00559 {
00560 TQColor itemTextBg = m_pSettings->itemTextBackground();
00561 if ( itemTextBg.isValid() )
00562 setItemTextBackground( itemTextBg );
00563 else
00564 setItemTextBackground( Qt::NoBrush );
00565 }
00566
00567 bool on = m_pSettings->showFileTips() && TQToolTip::isGloballyEnabled();
00568 d->pFileTip->setOptions(on,
00569 m_pSettings->showPreviewsInFileTips(),
00570 m_pSettings->numFileTips());
00571
00572
00573 setShowToolTips(!on);
00574
00575
00576 TQFont font( m_pSettings->standardFont() );
00577 if (!m_bDesktop)
00578 font.setUnderline( m_pSettings->underlineLink() );
00579
00580 if ( font != KonqIconViewWidget::font() )
00581 {
00582 setFont( font );
00583 if (!bInit)
00584 {
00585
00586
00587 fontChanged = true;
00588 }
00589 }
00590
00591 setIconTextHeight( m_pSettings->iconTextHeight() );
00592
00593 if ( (itemTextPos() == TQIconView::Right) && (maxItemWidth() != gridXValue()) )
00594 {
00595 int size = m_size;
00596 m_size = -1;
00597 setIcons( size );
00598 }
00599 else if ( d->bBoostPreview != boostPreview() )
00600 setIcons(m_size);
00601 else if (!bInit)
00602 updateContents();
00603 return fontChanged;
00604 }
00605
00606 bool KonqIconViewWidget::boostPreview() const
00607 {
00608 if ( m_bDesktop ) return false;
00609
00610 TDEConfigGroup group( TDEGlobal::config(), "PreviewSettings" );
00611 return group.readBoolEntry( "BoostSize", false );
00612 }
00613
00614 void KonqIconViewWidget::disableSoundPreviews()
00615 {
00616 d->bSoundPreviews = false;
00617
00618 if (d->pSoundPlayer)
00619 d->pSoundPlayer->stop();
00620 d->pSoundItem = 0;
00621 if (d->pSoundTimer && d->pSoundTimer->isActive())
00622 d->pSoundTimer->stop();
00623 }
00624
00625 void KonqIconViewWidget::setIcons( int size, const TQStringList& stopImagePreviewFor )
00626 {
00627
00628 bool sizeChanged = (m_size != size);
00629 int oldGridX = gridX();
00630 m_size = size;
00631
00632
00633 bool boost = boostPreview();
00634 bool previewSizeChanged = ( d->bBoostPreview != boost );
00635 d->bBoostPreview = boost;
00636
00637 if ( sizeChanged || previewSizeChanged )
00638 {
00639 int realSize = size ? size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
00640
00641 setSpacing( ( m_bDesktop || ( realSize > TDEIcon::SizeSmall ) ) ?
00642 TQMAX( 5, TQFontMetrics(font()).width('n') ) : 0 );
00643 }
00644
00645 if ( sizeChanged || previewSizeChanged || !stopImagePreviewFor.isEmpty() )
00646 {
00647 calculateGridX();
00648 }
00649 bool stopAll = !stopImagePreviewFor.isEmpty() && stopImagePreviewFor.first() == "*";
00650
00651
00652
00653
00654
00655 bool prevUpdatesState = viewport()->isUpdatesEnabled();
00656 viewport()->setUpdatesEnabled( false );
00657
00658
00659 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() ) {
00660 KFileIVI * ivi = static_cast<KFileIVI *>( it );
00661
00662
00663 if ( !ivi->isThumbnail() ||
00664 sizeChanged ||
00665 previewSizeChanged ||
00666 stopAll ||
00667 mimeTypeMatch( ivi->item()->mimetype(), stopImagePreviewFor ) )
00668 {
00669 ivi->setIcon( size, ivi->state(), true, false );
00670 }
00671 else
00672 ivi->invalidateThumb( ivi->state(), true );
00673 }
00674
00675
00676 viewport()->setUpdatesEnabled( prevUpdatesState );
00677
00678 if ( ( sizeChanged || previewSizeChanged || oldGridX != gridX() ||
00679 !stopImagePreviewFor.isEmpty() ) && autoArrange() )
00680 arrangeItemsInGrid( true );
00681 else
00682 viewport()->update();
00683 }
00684
00685 bool KonqIconViewWidget::mimeTypeMatch( const TQString& mimeType, const TQStringList& mimeList ) const
00686 {
00687
00688 KMimeType::Ptr mime = KMimeType::mimeType( mimeType );
00689 for (TQStringList::ConstIterator mt = mimeList.begin(); mt != mimeList.end(); ++mt)
00690 {
00691 if ( mime->is( *mt ) )
00692 return true;
00693
00694 TQString tmp( mimeType );
00695 if ( (*mt).endsWith("*") && tmp.replace(TQRegExp("/.*"), "/*") == (*mt) )
00696 return true;
00697 if ( (*mt) == "text/plain" )
00698 {
00699 TQVariant textProperty = mime->property( "X-TDE-text" );
00700 if ( textProperty.type() == TQVariant::Bool && textProperty.toBool() )
00701 return true;
00702 }
00703 }
00704 return false;
00705 }
00706
00707 void KonqIconViewWidget::setItemTextPos( ItemTextPos pos )
00708 {
00709
00710 int sz = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
00711
00712 if ( m_bSetGridX ) {
00713 if ( pos == TQIconView::Bottom ) {
00714 setGridX( TQMAX( sz + 50, previewIconSize( sz ) + 13 ) );
00715 }
00716 else
00717 {
00718 setMaxItemWidth( TQMAX( sz, previewIconSize( sz ) ) + m_pSettings->iconTextWidth() );
00719 setGridX( -1 );
00720 }
00721 }
00722
00723 TDEIconView::setItemTextPos( pos );
00724 }
00725
00726 void KonqIconViewWidget::gridValues( int* x, int* y, int* dx, int* dy,
00727 int* nx, int* ny )
00728 {
00729 int previewSize = previewIconSize( m_size );
00730 int iconSize = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
00731
00732
00733
00734
00735
00736
00737
00738
00739 *dx = spacing() + TQMAX( TQMAX( iconSize, previewSize ), m_pSettings->iconTextWidth() );
00740 int textHeight = iconTextHeight() * fontMetrics().height();
00741 *dy = spacing() + TQMAX( iconSize, previewSize ) + 2 + textHeight + spacing();
00742
00743
00744 int w, h;
00745 if ( m_IconRect.isValid() ) {
00746 *x = m_IconRect.left(); w = m_IconRect.width();
00747 *y = m_IconRect.top(); h = m_IconRect.height();
00748 }
00749 else {
00750 *x = 0; w = viewport()->width();
00751 *y = 0; h = viewport()->height();
00752 }
00753
00754
00755 if ( *dx > w )
00756 *dx = w;
00757
00758 if ( *dy > h )
00759 *dy = h;
00760
00761 *nx = w / *dx;
00762 *ny = h / *dy;
00763
00764
00765
00766 if(*nx && *ny) {
00767 *dx = w / *nx;
00768 *dy = h / *ny;
00769 }
00770 kdDebug(1203) << "x=" << *x << " y=" << *y << " spacing=" << spacing() << " iconSize=" << iconSize
00771 << " w=" << w << " h=" << h
00772 << " nx=" << *nx << " ny=" << *ny
00773 << " dx=" << *dx << " dy=" << *dy << endl;
00774 }
00775
00776 void KonqIconViewWidget::calculateGridX()
00777 {
00778 if ( m_bSetGridX ) {
00779 if ( itemTextPos() == TQIconView::Bottom ) {
00780 setGridX( gridXValue() );
00781 }
00782 else
00783 {
00784 setMaxItemWidth( gridXValue() );
00785 setGridX( -1 );
00786 }
00787 }
00788 }
00789
00790 int KonqIconViewWidget::gridXValue() const
00791 {
00792
00793 int sz = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
00794 int newGridX;
00795
00796 if ( itemTextPos() == TQIconView::Bottom )
00797 newGridX = TQMAX( sz + 50, previewIconSize( sz ) + 13 );
00798 else
00799 newGridX = TQMAX( sz, previewIconSize( sz ) ) + m_pSettings->iconTextWidth();
00800
00801
00802 return newGridX;
00803 }
00804
00805 void KonqIconViewWidget::refreshMimeTypes()
00806 {
00807 updatePreviewMimeTypes();
00808 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
00809 (static_cast<KFileIVI *>( it ))->item()->refreshMimeType();
00810 setIcons( m_size );
00811 }
00812
00813 void KonqIconViewWidget::setURL( const KURL &kurl )
00814 {
00815 stopImagePreview();
00816 m_url = kurl;
00817
00818 d->pFileTip->setPreview( TDEGlobalSettings::showFilePreview(m_url) );
00819
00820 if ( m_url.isLocalFile() )
00821 m_dotDirectoryPath = m_url.path(1).append( ".directory" );
00822 else
00823 m_dotDirectoryPath = TQString::null;
00824 }
00825
00826 void KonqIconViewWidget::startImagePreview( const TQStringList &, bool force )
00827 {
00828 stopImagePreview();
00829
00830
00831 if ( !TDEGlobalSettings::showFilePreview( url() ) ) {
00832 kdDebug(1203) << "Previews disabled for protocol " << url().protocol() << endl;
00833 emit imagePreviewFinished();
00834 return;
00835 }
00836
00837 if ((d->bSoundPreviews = d->previewSettings.contains( "audio/" )) &&
00838 !d->pSoundPlayer)
00839 {
00840 KLibFactory *factory = KLibLoader::self()->factory("konq_sound");
00841 if (factory)
00842 d->pSoundPlayer = static_cast<KonqSoundPlayer *>(
00843 factory->create(TQT_TQOBJECT(this), 0, "KonqSoundPlayer"));
00844 d->bSoundPreviews = (d->pSoundPlayer != 0L);
00845 }
00846
00847 KFileItemList items;
00848 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
00849 if ( force || !static_cast<KFileIVI *>( it )->hasValidThumbnail() )
00850 items.append( static_cast<KFileIVI *>( it )->item() );
00851
00852 bool onlyAudio = true;
00853 for ( TQStringList::ConstIterator it = d->previewSettings.begin(); it != d->previewSettings.end(); ++it ) {
00854 if ( (*it).startsWith( "audio/" ) )
00855 d->bSoundPreviews = true;
00856 else
00857 onlyAudio = false;
00858 }
00859
00860 if ( items.isEmpty() || onlyAudio ) {
00861 emit imagePreviewFinished();
00862 return;
00863 }
00864
00865 int iconSize = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
00866 int size;
00867
00868 d->bBoostPreview = boostPreview();
00869 size = previewIconSize( iconSize );
00870
00871 if ( !d->bBoostPreview )
00872 iconSize /= 2;
00873
00874 d->pPreviewJob = TDEIO::filePreview( items, size, size, iconSize,
00875 m_pSettings->textPreviewIconTransparency(), true ,
00876 true , &(d->previewSettings) );
00877 connect( d->pPreviewJob, TQT_SIGNAL( gotPreview( const KFileItem *, const TQPixmap & ) ),
00878 this, TQT_SLOT( slotPreview( const KFileItem *, const TQPixmap & ) ) );
00879 connect( d->pPreviewJob, TQT_SIGNAL( result( TDEIO::Job * ) ),
00880 this, TQT_SLOT( slotPreviewResult() ) );
00881 }
00882
00883 void KonqIconViewWidget::stopImagePreview()
00884 {
00885 if (d->pPreviewJob)
00886 {
00887 d->pPreviewJob->kill();
00888 d->pPreviewJob = 0;
00889
00890
00891 }
00892 }
00893
00894 bool KonqIconViewWidget::isPreviewRunning() const
00895 {
00896 return d->pPreviewJob;
00897 }
00898
00899 KFileItemList KonqIconViewWidget::selectedFileItems()
00900 {
00901 KFileItemList lstItems;
00902
00903 TQIconViewItem *it = firstItem();
00904 for (; it; it = it->nextItem() )
00905 if ( it->isVisible() && it->isSelected() ) {
00906 KFileItem *fItem = (static_cast<KFileIVI *>(it))->item();
00907 lstItems.append( fItem );
00908 }
00909 return lstItems;
00910 }
00911
00912 void KonqIconViewWidget::slotDropped( TQDropEvent *ev, const TQValueList<TQIconDragItem> & )
00913 {
00914
00915 KURL dirURL = url();
00916 if ( m_rootItem ) {
00917 bool dummy;
00918 dirURL = m_rootItem->mostLocalURL(dummy);
00919 }
00920 KonqOperations::doDrop( m_rootItem , dirURL, ev, this );
00921 }
00922
00923 void KonqIconViewWidget::slotAboutToCreate(const TQPoint &, const TQValueList<TDEIO::CopyInfo> &)
00924 {
00925
00926 }
00927
00928 void KonqIconViewWidget::drawBackground( TQPainter *p, const TQRect &r )
00929 {
00930 drawBackground(p, r, r.topLeft());
00931 }
00932
00933 void KonqIconViewWidget::drawBackground( TQPainter *p, const TQRect &r , const TQPoint &pt)
00934 {
00935 const TQPixmap *pm = backgroundPixmap();
00936 bool hasPixmap = pm && !pm->isNull();
00937 if ( !hasPixmap ) {
00938 pm = viewport()->backgroundPixmap();
00939 hasPixmap = pm && !pm->isNull();
00940 }
00941
00942 TQRect rtgt(r);
00943 rtgt.moveTopLeft(pt);
00944 if (!hasPixmap && backgroundMode() != NoBackground) {
00945 p->fillRect(rtgt, viewport()->backgroundColor());
00946 return;
00947 }
00948
00949 if (hasPixmap) {
00950 int ax = (r.x() + contentsX() + leftMargin()) % pm->width();
00951 int ay = (r.y() + contentsY() + topMargin()) % pm->height();
00952 p->drawTiledPixmap(rtgt, *pm, TQPoint(ax, ay));
00953 }
00954 }
00955
00956 TQDragObject * KonqIconViewWidget::dragObject()
00957 {
00958 if ( !currentItem() )
00959 return 0;
00960
00961 return konqDragObject( viewport() );
00962 }
00963
00964 KonqIconDrag * KonqIconViewWidget::konqDragObject( TQWidget * dragSource )
00965 {
00966
00967
00968 KonqIconDrag2 * drag = new KonqIconDrag2( dragSource );
00969 TQIconViewItem *primaryItem = currentItem();
00970
00971 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() ) {
00972 if ( it->isVisible() && it->isSelected() ) {
00973 if (!primaryItem)
00974 primaryItem = it;
00975 KFileItem* fileItem = (static_cast<KFileIVI *>(it))->item();
00976 KURL url = fileItem->url();
00977 bool dummy;
00978 KURL mostLocalURL = fileItem->mostLocalURL(dummy);
00979 TQString itemURL = KURLDrag::urlToString(url);
00980 kdDebug(1203) << "itemURL=" << itemURL << endl;
00981 TQIconDragItem id;
00982 id.setData( TQCString(itemURL.latin1()) );
00983 drag->append( id,
00984 TQRect( it->pixmapRect(false).topLeft() - m_mousePos,
00985 it->pixmapRect().size() ),
00986 TQRect( it->textRect(false).topLeft() - m_mousePos,
00987 it->textRect().size() ),
00988 itemURL, mostLocalURL );
00989 }
00990 }
00991
00992 if (primaryItem)
00993 drag->setPixmap( *primaryItem->pixmap(), m_mousePos - primaryItem->pixmapRect(false).topLeft() );
00994
00995 return drag;
00996 }
00997
00998 void KonqIconViewWidget::contentsDragEnterEvent( TQDragEnterEvent *e )
00999 {
01000 if ( e->provides( "text/uri-list" ) )
01001 {
01002 TQByteArray payload = e->encodedData( "text/uri-list" );
01003 if ( !payload.size() )
01004 kdError() << "Empty data !" << endl;
01005
01006
01007 bool ok = KURLDrag::decode( e, m_lstDragURLs );
01008 if( !ok )
01009 kdError() << "Couldn't decode urls dragged !" << endl;
01010 }
01011
01012 KURL::List uriList;
01013 if ( KURLDrag::decode(e, uriList) )
01014 {
01015 if ( uriList.first().protocol() == "programs" )
01016 {
01017 e->ignore();
01018 emit dragEntered( false );
01019 d->bProgramsURLdrag = true;
01020 return;
01021 }
01022 }
01023
01024 TDEIconView::contentsDragEnterEvent( e );
01025 emit dragEntered( true );
01026 }
01027
01028 void KonqIconViewWidget::contentsDragMoveEvent( TQDragMoveEvent *e )
01029 {
01030 if ( d->bProgramsURLdrag ) {
01031 emit dragMove( false );
01032 e->ignore();
01033 cancelPendingHeldSignal();
01034 return;
01035 }
01036
01037 TQIconViewItem *item = findItem( e->pos() );
01038 if ( e->source() != viewport() &&
01039 !item && m_rootItem && !m_rootItem->isWritable() ) {
01040 emit dragMove( false );
01041 e->ignore();
01042 cancelPendingHeldSignal();
01043 return;
01044 }
01045 emit dragMove( true );
01046 TDEIconView::contentsDragMoveEvent( e );
01047 }
01048
01049 void KonqIconViewWidget::contentsDragLeaveEvent( TQDragLeaveEvent *e )
01050 {
01051 d->bProgramsURLdrag = false;
01052 TDEIconView::contentsDragLeaveEvent(e);
01053 emit dragLeft();
01054 }
01055
01056
01057 void KonqIconViewWidget::setItemColor( const TQColor &c )
01058 {
01059 iColor = c;
01060 }
01061
01062 TQColor KonqIconViewWidget::itemColor() const
01063 {
01064 return iColor;
01065 }
01066
01067 void KonqIconViewWidget::disableIcons( const KURL::List & lst )
01068 {
01069 for ( TQIconViewItem *kit = firstItem(); kit; kit = kit->nextItem() )
01070 {
01071 bool bFound = false;
01072
01073
01074 for (KURL::List::ConstIterator it = lst.begin(); !bFound && it != lst.end(); ++it)
01075 {
01076 if ( static_cast<KFileIVI *>( kit )->item()->url() == *it )
01077 {
01078 bFound = true;
01079
01080 }
01081 }
01082 static_cast<KFileIVI *>( kit )->setDisabled( bFound );
01083 }
01084 }
01085
01086 void KonqIconViewWidget::slotSelectionChanged()
01087 {
01088
01089 int canCopy = 0;
01090 int canDel = 0;
01091 int canTrash = 0;
01092 bool bInTrash = false;
01093 int iCount = 0;
01094
01095 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
01096 {
01097 if ( it->isVisible() && it->isSelected() )
01098 {
01099 iCount++;
01100 canCopy++;
01101
01102 KFileItem *item = ( static_cast<KFileIVI *>( it ) )->item();
01103 KURL url = item->url();
01104 TQString local_path = item->localPath();
01105
01106 if ( url.directory(false) == TDEGlobalSettings::trashPath() ) {
01107 bInTrash = true;
01108 }
01109 if ( KProtocolInfo::supportsDeleting( url ) ) {
01110 canDel++;
01111 }
01112 if ( !local_path.isEmpty() ) {
01113 canTrash++;
01114 }
01115 }
01116 }
01117
01118 emit enableAction( "cut", canDel > 0 );
01119 emit enableAction( "copy", canCopy > 0 );
01120 emit enableAction( "trash", canDel > 0 && !bInTrash && canTrash==canDel );
01121 emit enableAction( "del", canDel > 0 );
01122 emit enableAction( "properties", iCount > 0 && KPropertiesDialog::canDisplay( selectedFileItems() ) );
01123 emit enableAction( "editMimeType", ( iCount == 1 ) );
01124 emit enableAction( "rename", ( iCount == 1) && !bInTrash );
01125 }
01126
01127 void KonqIconViewWidget::renameCurrentItem()
01128 {
01129 if ( currentItem() )
01130 currentItem()->rename();
01131 }
01132
01133 void KonqIconViewWidget::renameSelectedItem()
01134 {
01135 kdDebug(1203) << " -- KonqIconViewWidget::renameSelectedItem() -- " << endl;
01136 TQIconViewItem * item = 0L;
01137 TQIconViewItem *it = firstItem();
01138 for (; it; it = it->nextItem() )
01139 if ( it->isVisible() && it->isSelected() && !item )
01140 {
01141 item = it;
01142 break;
01143 }
01144 if (!item)
01145 {
01146 Q_ASSERT(item);
01147 return;
01148 }
01149 item->rename();
01150 }
01151
01152 void KonqIconViewWidget::cutSelection()
01153 {
01154 kdDebug(1203) << " -- KonqIconViewWidget::cutSelection() -- " << endl;
01155 KonqIconDrag * obj = konqDragObject( );
01156 obj->setMoveSelection( true );
01157 TQApplication::clipboard()->setData( obj );
01158 }
01159
01160 void KonqIconViewWidget::copySelection()
01161 {
01162 kdDebug(1203) << " -- KonqIconViewWidget::copySelection() -- " << endl;
01163 KonqIconDrag * obj = konqDragObject( );
01164 TQApplication::clipboard()->setData( obj );
01165 }
01166
01167 void KonqIconViewWidget::pasteSelection()
01168 {
01169 paste( url() );
01170 }
01171
01172 void KonqIconViewWidget::paste( const KURL &url )
01173 {
01174 KonqOperations::doPaste( this, url );
01175 }
01176
01177 KURL::List KonqIconViewWidget::selectedUrls()
01178 {
01179 return selectedUrls( UserVisibleUrls );
01180 }
01181
01182 KURL::List KonqIconViewWidget::selectedUrls( UrlFlags flags ) const
01183 {
01184 KURL::List lstURLs;
01185 bool dummy;
01186 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
01187 if ( it->isVisible() && it->isSelected() ) {
01188 KFileItem* item = (static_cast<KFileIVI *>( it ))->item();
01189 lstURLs.append( flags == MostLocalUrls ? item->mostLocalURL( dummy ) : item->url() );
01190 }
01191 return lstURLs;
01192 }
01193
01194 TQRect KonqIconViewWidget::iconArea() const
01195 {
01196 return m_IconRect;
01197 }
01198
01199 void KonqIconViewWidget::setIconArea(const TQRect &rect)
01200 {
01201 m_IconRect = rect;
01202 }
01203
01204 int KonqIconViewWidget::lineupMode() const
01205 {
01206 return m_LineupMode;
01207 }
01208
01209 void KonqIconViewWidget::setLineupMode(int mode)
01210 {
01211 m_LineupMode = mode;
01212 }
01213
01214 bool KonqIconViewWidget::sortDirectoriesFirst() const
01215 {
01216 return m_bSortDirsFirst;
01217 }
01218
01219 void KonqIconViewWidget::setSortDirectoriesFirst( bool b )
01220 {
01221 m_bSortDirsFirst = b;
01222 }
01223
01224 void KonqIconViewWidget::contentsMouseMoveEvent( TQMouseEvent *e )
01225 {
01226 if ( (d->pSoundPlayer && d->pSoundPlayer->isPlaying()) || (d->pSoundTimer && d->pSoundTimer->isActive()))
01227 {
01228
01229
01230
01231 if ( TQApplication::widgetAt( TQCursor::pos() ) != topLevelWidget() )
01232 {
01233 if (d->pSoundPlayer)
01234 d->pSoundPlayer->stop();
01235 d->pSoundItem = 0;
01236 if (d->pSoundTimer && d->pSoundTimer->isActive())
01237 d->pSoundTimer->stop();
01238 }
01239 }
01240 d->renameItem= false;
01241 TDEIconView::contentsMouseMoveEvent( e );
01242 }
01243
01244 void KonqIconViewWidget::contentsDropEvent( TQDropEvent * ev )
01245 {
01246 TQIconViewItem *i = findItem( ev->pos() );
01247 KURL::List uriList;
01248
01249 if ( ev->source() != viewport() &&
01250 !i && m_rootItem && !m_rootItem->isWritable() ) {
01251 ev->accept( false );
01252 return;
01253 }
01254
01255
01256
01257 if ( !i && (ev->action() == TQDropEvent::Copy || ev->action() == TQDropEvent::Link)
01258 && ev->source() && ev->source() == viewport()
01259 && KURLDrag::decode(ev, uriList) && !uriList.isEmpty()
01260 && uriList.first().upURL().url(1) == url().url(1))
01261 {
01262
01263 bool bMovable = itemsMovable();
01264 setItemsMovable(false);
01265 TDEIconView::contentsDropEvent( ev );
01266 setItemsMovable(bMovable);
01267
01268 TQValueList<TQIconDragItem> lst;
01269 slotDropped(ev, lst);
01270 }
01271 else
01272 {
01273 TDEIconView::contentsDropEvent( ev );
01274 emit dropped();
01275 }
01276
01277
01278
01279
01280
01281
01282
01283
01284 emit dragFinished();
01285 }
01286
01287 void KonqIconViewWidget::doubleClickTimeout()
01288 {
01289 d->renameItem= true;
01290 mousePressChangeValue();
01291 if ( d->releaseMouseEvent )
01292 {
01293 TQMouseEvent e( TQEvent::MouseButtonPress,d->mousePos , 1, d->mouseState);
01294 TQIconViewItem* item = findItem( e.pos() );
01295 KURL url;
01296 if ( item )
01297 {
01298 url= ( static_cast<KFileIVI *>( item ) )->item()->url();
01299 bool brenameTrash =false;
01300 if ( url.isLocalFile() && (url.directory(false) == TDEGlobalSettings::trashPath() || url.path(1).startsWith(TDEGlobalSettings::trashPath())))
01301 brenameTrash = true;
01302
01303 if ( url.isLocalFile() && !brenameTrash && d->renameItem && m_pSettings->renameIconDirectly() && e.button() == Qt::LeftButton && item->textRect( false ).contains(e.pos()))
01304 {
01305 if( d->pActivateDoubleClick->isActive () )
01306 d->pActivateDoubleClick->stop();
01307 item->rename();
01308 m_bMousePressed = false;
01309 }
01310 }
01311 }
01312 else
01313 {
01314 TQMouseEvent e( TQEvent::MouseMove,d->mousePos , 1, d->mouseState);
01315 TDEIconView::contentsMousePressEvent( &e );
01316 }
01317 if( d->pActivateDoubleClick->isActive() )
01318 d->pActivateDoubleClick->stop();
01319
01320 d->releaseMouseEvent = false;
01321 d->renameItem= false;
01322 }
01323
01324 void KonqIconViewWidget::wheelEvent(TQWheelEvent* e)
01325 {
01326
01327 d->pFileTip->setItem( 0 );
01328
01329 if (e->state() == ControlButton)
01330 {
01331 if (e->delta() >= 0)
01332 {
01333 emit incIconSize();
01334 }
01335 else
01336 {
01337 emit decIconSize();
01338 }
01339 e->accept();
01340 return;
01341 }
01342
01343 TDEIconView::wheelEvent(e);
01344 }
01345
01346 void KonqIconViewWidget::leaveEvent( TQEvent *e )
01347 {
01348
01349 slotOnViewport();
01350
01351 TDEIconView::leaveEvent(e);
01352 }
01353
01354 void KonqIconViewWidget::mousePressChangeValue()
01355 {
01356
01357 m_bMousePressed = true;
01358 if (d->pSoundPlayer)
01359 d->pSoundPlayer->stop();
01360 d->bSoundItemClicked = true;
01361 d->firstClick = false;
01362
01363
01364
01365 d->pFileTip->setItem( 0 );
01366 }
01367
01368 void KonqIconViewWidget::contentsMousePressEvent( TQMouseEvent *e )
01369 {
01370 if(d->pActivateDoubleClick && d->pActivateDoubleClick->isActive ())
01371 d->pActivateDoubleClick->stop();
01372 TQIconViewItem* item = findItem( e->pos() );
01373 m_mousePos = e->pos();
01374 KURL url;
01375 if ( item )
01376 {
01377 url = ( static_cast<KFileIVI *>( item ) )->item()->url();
01378 bool brenameTrash =false;
01379 if ( url.isLocalFile() && (url.directory(false) == TDEGlobalSettings::trashPath() || url.path(1).startsWith(TDEGlobalSettings::trashPath())))
01380 brenameTrash = true;
01381 if ( !brenameTrash && !TDEGlobalSettings::singleClick() && m_pSettings->renameIconDirectly() && e->button() == Qt::LeftButton && item->textRect( false ).contains(e->pos())&& !d->firstClick && url.isLocalFile() && (!url.protocol().find("device", 0, false)==0))
01382 {
01383 d->firstClick = true;
01384 d->mousePos = e->pos();
01385 d->mouseState = e->state();
01386 if (!d->pActivateDoubleClick)
01387 {
01388 d->pActivateDoubleClick = new TQTimer(this);
01389 connect(d->pActivateDoubleClick, TQT_SIGNAL(timeout()), this, TQT_SLOT(doubleClickTimeout()));
01390 }
01391 if( d->pActivateDoubleClick->isActive () )
01392 d->pActivateDoubleClick->stop();
01393 else
01394 d->pActivateDoubleClick->start(TQApplication::doubleClickInterval());
01395 d->releaseMouseEvent = false;
01396 return;
01397 }
01398 else
01399 d->renameItem= false;
01400 }
01401 else
01402 d->renameItem= false;
01403 mousePressChangeValue();
01404 if(d->pActivateDoubleClick && d->pActivateDoubleClick->isActive())
01405 d->pActivateDoubleClick->stop();
01406 TDEIconView::contentsMousePressEvent( e );
01407
01408 }
01409
01410 void KonqIconViewWidget::contentsMouseReleaseEvent( TQMouseEvent *e )
01411 {
01412 TDEIconView::contentsMouseReleaseEvent( e );
01413 if(d->releaseMouseEvent && d->pActivateDoubleClick && d->pActivateDoubleClick->isActive ())
01414 d->pActivateDoubleClick->stop();
01415 slotSelectionChanged();
01416 d->releaseMouseEvent = true;
01417 m_bMousePressed = false;
01418 }
01419
01420 void KonqIconViewWidget::slotSaveIconPositions()
01421 {
01422
01423
01424
01425
01426
01427
01428
01429 printf("WARNING: Strongly deprecated method KonqIconViewWidget::slotSaveIconPositions() called!\n"); fflush(stdout);
01430
01431 if ( m_dotDirectoryPath.isEmpty() )
01432 return;
01433 if ( !m_bDesktop )
01434 return;
01435 kdDebug(1214) << "KonqIconViewWidget::slotSaveIconPositions" << endl;
01436 KSimpleConfig dotDirectory( m_dotDirectoryPath );
01437 TQIconViewItem *it = firstItem();
01438 if ( !it )
01439 return;
01440 while ( it )
01441 {
01442 KFileIVI *ivi = static_cast<KFileIVI *>( it );
01443 KFileItem *item = ivi->item();
01444
01445 dotDirectory.setGroup( TQString( m_iconPositionGroupPrefix ).append( item->url().fileName() ) );
01446 kdDebug(1214) << "KonqIconViewWidget::slotSaveIconPositions " << item->url().fileName() << " " << it->x() << " " << it->y() << endl;
01447 dotDirectory.writeEntry( TQString( "X %1" ).arg( width() ), it->x() );
01448 dotDirectory.writeEntry( TQString( "Y %1" ).arg( height() ), it->y() );
01449 dotDirectory.writeEntry( "Exists", true );
01450
01451 it = it->nextItem();
01452 }
01453
01454 TQStringList groups = dotDirectory.groupList();
01455 TQStringList::ConstIterator gIt = groups.begin();
01456 TQStringList::ConstIterator gEnd = groups.end();
01457 for (; gIt != gEnd; ++gIt )
01458 if ( (*gIt).left( m_iconPositionGroupPrefix.length() ) == m_iconPositionGroupPrefix )
01459 {
01460 dotDirectory.setGroup( *gIt );
01461 if ( dotDirectory.hasKey( "Exists" ) )
01462 dotDirectory.deleteEntry( "Exists", false );
01463 else
01464 {
01465 kdDebug(1214) << "KonqIconViewWidget::slotSaveIconPositions deleting group " << *gIt << endl;
01466 dotDirectory.deleteGroup( *gIt );
01467 }
01468 }
01469
01470 dotDirectory.sync();
01471
01472
01473
01474
01475
01476
01477
01478 }
01479
01480
01481
01482
01483 void KonqIconViewWidget::insertInGrid(TQIconViewItem *item)
01484 {
01485 if (0L == item)
01486 return;
01487
01488 if (!m_IconRect.isValid())
01489 {
01490 TDEIconView::insertInGrid(item);
01491 return;
01492 }
01493
01494 TQRegion r(m_IconRect);
01495 TQIconViewItem *i = firstItem();
01496 int y = -1;
01497 for (; i; i = i->nextItem() )
01498 {
01499 r = r.subtract(i->rect());
01500 y = TQMAX(y, i->y() + i->height());
01501 }
01502
01503 TQMemArray<TQRect> rects = r.rects();
01504 TQMemArray<TQRect>::Iterator it = rects.begin();
01505 bool foundPlace = FALSE;
01506 for (; it != rects.end(); ++it)
01507 {
01508 TQRect rect = *it;
01509 if (rect.width() >= item->width() && rect.height() >= item->height())
01510 {
01511 int sx = 0, sy = 0;
01512 if (rect.width() >= item->width() + spacing())
01513 sx = spacing();
01514 if (rect.height() >= item->height() + spacing())
01515 sy = spacing();
01516 item->move(rect.x() + sx, rect.y() + sy);
01517 foundPlace = true;
01518 break;
01519 }
01520 }
01521
01522 if (!foundPlace)
01523 item->move(m_IconRect.topLeft());
01524
01525
01526 return;
01527 }
01528
01529
01530
01531
01532
01533
01534
01535
01536
01537
01538
01539
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550
01551
01552
01553
01554
01555
01556
01557 void KonqIconViewWidget::lineupIcons()
01558 {
01559
01560
01561
01562
01563 int x0, y0, dx, dy, nx, ny;
01564 gridValues( &x0, &y0, &dx, &dy, &nx, &ny );
01565
01566 int itemWidth = dx - spacing();
01567 bool newItemWidth = false;
01568 if ( maxItemWidth() != itemWidth ) {
01569 newItemWidth = true;
01570 setMaxItemWidth( itemWidth );
01571 setFont( font() );
01572 }
01573
01574 if ( !firstItem() ) {
01575 kdDebug(1203) << "No icons at all ?\n";
01576 return;
01577 }
01578
01579 int iconSize = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
01580
01581 typedef TQValueList<TQIconViewItem*> Bin;
01582 Bin*** bins = new Bin**[nx];
01583 int i;
01584 int j;
01585 for ( i = 0; i < nx ; i++ ) {
01586 bins[i] = new Bin*[ny];
01587 for ( j = 0; j < ny; j++ )
01588 bins[i][j] = 0L;
01589 }
01590
01591
01592 int textHeight = iconTextHeight() * fontMetrics().height();
01593
01594 for ( TQIconViewItem* item = firstItem(); item; item = item->nextItem() ) {
01595 int x = item->x() + item->width() / 2 - x0;
01596 int y = item->pixmapRect( false ).bottom() - iconSize / 2
01597 - ( dy - ( iconSize + textHeight ) ) / 2 - y0;
01598 int posX = TQMIN( nx-1, TQMAX( 0, x / dx ) );
01599 int posY = TQMIN( ny-1, TQMAX( 0, y / dy ) );
01600
01601 if ( !bins[posX][posY] )
01602 bins[posX][posY] = new Bin;
01603 bins[posX][posY]->prepend( item );
01604 }
01605
01606
01607 int n, k;
01608 const int infinity = 10000;
01609 int nmoves = 1;
01610 for ( n = 0; n < 30 && nmoves > 0; n++ ) {
01611 nmoves = 0;
01612 for ( i = 0; i < nx; i++ ) {
01613 for ( j = 0; j < ny; j++ ) {
01614 if ( !bins[i][j] || ( bins[i][j]->count() <= 1 ) )
01615 continue;
01616
01617
01618 int tf = 0, bf = 0, lf = 0, rf = 0;
01619 for ( k = j-1; k >= 0 && bins[i][k] && bins[i][k]->count(); k-- )
01620 tf += bins[i][k]->count();
01621 if ( k == -1 )
01622 tf += infinity;
01623
01624 for ( k = j+1; k < ny && bins[i][k] && bins[i][k]->count(); k++ )
01625 bf += bins[i][k]->count();
01626 if ( k == ny )
01627 bf += infinity;
01628
01629 for ( k = i-1; k >= 0 && bins[k][j] && bins[k][j]->count(); k-- )
01630 lf += bins[k][j]->count();
01631 if ( k == -1 )
01632 lf += infinity;
01633
01634 for ( k = i+1; k < nx && bins[k][j] && bins[k][j]->count(); k++ )
01635 rf += bins[k][j]->count();
01636 if ( k == nx )
01637 rf += infinity;
01638
01639
01640 if ( tf >= infinity && bf >= infinity &&
01641 lf >= infinity && rf >= infinity )
01642 continue;
01643
01644
01645 if ( m_LineupMode == LineupHorizontal ) {
01646 tf += infinity;
01647 bf += infinity;
01648 }
01649 else if ( m_LineupMode == LineupVertical ) {
01650 lf += infinity;
01651 rf += infinity;
01652 }
01653
01654
01655 TQIconViewItem* movedItem;
01656 Bin* items = bins[i][j];
01657
01658 int mini = TQMIN( TQMIN( tf, bf ), TQMIN( lf, rf ) );
01659 if ( tf == mini ) {
01660
01661 Bin::iterator it = items->begin();
01662 movedItem = *it;
01663 for ( ++it; it != items->end(); ++it ) {
01664 if ( (*it)->y() < movedItem->y() )
01665 movedItem = *it;
01666 }
01667 items->remove( movedItem );
01668 if ( !bins[i][j-1] )
01669 bins[i][j-1] = new Bin;
01670 bins[i][j-1]->prepend( movedItem );
01671 }
01672 else if ( bf ==mini ) {
01673
01674 Bin::iterator it = items->begin();
01675 movedItem = *it;
01676 for ( ++it; it != items->end(); ++it ) {
01677 if ( (*it)->y() > movedItem->y() )
01678 movedItem = *it;
01679 }
01680 items->remove( movedItem );
01681 if ( !bins[i][j+1] )
01682 bins[i][j+1] = new Bin;
01683 bins[i][j+1]->prepend( movedItem );
01684 }
01685 else if ( lf == mini )
01686 {
01687
01688 Bin::iterator it = items->begin();
01689 movedItem = *it;
01690 for ( ++it; it != items->end(); ++it ) {
01691 if ( (*it)->x() < movedItem->x() )
01692 movedItem = *it;
01693 }
01694 items->remove( movedItem );
01695 if ( !bins[i-1][j] )
01696 bins[i-1][j] = new Bin;
01697 bins[i-1][j]->prepend( movedItem );
01698 }
01699 else {
01700
01701 Bin::iterator it = items->begin();
01702 movedItem = *it;
01703 for ( ++it; it != items->end(); ++it ) {
01704 if ( (*it)->x() > movedItem->x() )
01705 movedItem = *it;
01706 }
01707 items->remove( movedItem );
01708 if ( !bins[i+1][j] )
01709 bins[i+1][j] = new Bin;
01710 bins[i+1][j]->prepend( movedItem );
01711 }
01712 nmoves++;
01713 }
01714 }
01715 }
01716
01717
01718 TQRegion repaintRegion;
01719 TQValueList<TQIconViewItem*> movedItems;
01720
01721 for ( i = 0; i < nx; i++ ) {
01722 for ( j = 0; j < ny; j++ ) {
01723 Bin* bin = bins[i][j];
01724 if ( !bin )
01725 continue;
01726 if ( !bin->isEmpty() ) {
01727 TQIconViewItem* item = bin->first();
01728 int newX = x0 + i*dx + spacing() +
01729 TQMAX(0, ( (dx-spacing()) - item->width() ) / 2);
01730
01731 int newY = y0 + j*dy + dy - spacing() - ( item->pixmapRect().bottom() + 2 + textHeight );
01732 if ( item->x() != newX || item->y() != newY ) {
01733 TQRect oldRect = item->rect();
01734 movedItems.prepend( item );
01735 item->move( newX, newY );
01736 if ( item->rect() != oldRect )
01737 repaintRegion = repaintRegion.unite( oldRect );
01738 }
01739 }
01740 delete bin;
01741 bins[i][j] = 0L;
01742 }
01743 }
01744
01745
01746 if ( newItemWidth )
01747 updateContents();
01748 else {
01749
01750 TQMemArray<TQRect> rects = repaintRegion.rects();
01751 for ( uint l = 0; l < rects.count(); l++ ) {
01752 kdDebug( 1203 ) << "Repainting (" << rects[l].x() << ","
01753 << rects[l].y() << ")\n";
01754 repaintContents( rects[l], false );
01755 }
01756
01757 while ( !movedItems.isEmpty() ) {
01758 repaintItem( movedItems.first() );
01759 movedItems.remove( movedItems.first() );
01760 }
01761 }
01762
01763 for ( i = 0; i < nx ; i++ ) {
01764 delete [] bins[i];
01765 }
01766 delete [] bins;
01767 }
01768
01769 void KonqIconViewWidget::lineupIcons( TQIconView::Arrangement arrangement )
01770 {
01771 int x0, y0, dx, dy, nxmax, nymax;
01772 gridValues( &x0, &y0, &dx, &dy, &nxmax, &nymax );
01773 int textHeight = iconTextHeight() * fontMetrics().height();
01774
01775 TQRegion repaintRegion;
01776 TQValueList<TQIconViewItem*> movedItems;
01777 int nx = 0, ny = 0;
01778
01779 TQIconViewItem* item;
01780 for ( item = firstItem(); item; item = item->nextItem() ) {
01781 int newX = x0 + nx*dx + spacing() +
01782 TQMAX(0, ( (dx-spacing()) - item->width() ) / 2);
01783
01784 int newY = y0 + ny*dy + dy - spacing() - ( item->pixmapRect().bottom() + 2 + textHeight );
01785 if ( item->x() != newX || item->y() != newY ) {
01786 TQRect oldRect = item->rect();
01787 movedItems.prepend( item );
01788 item->move( newX, newY );
01789 if ( item->rect() != oldRect )
01790 repaintRegion = repaintRegion.unite( oldRect );
01791 }
01792 if ( arrangement == TQIconView::LeftToRight ) {
01793 nx++;
01794 if ( nx >= nxmax ) {
01795 ny++;
01796 nx = 0;
01797 }
01798 }
01799 else {
01800 ny++;
01801 if ( ny >= nymax ) {
01802 nx++;
01803 ny = 0;
01804 }
01805 }
01806 }
01807
01808
01809 TQMemArray<TQRect> rects = repaintRegion.rects();
01810 for ( uint l = 0; l < rects.count(); l++ ) {
01811 kdDebug( 1203 ) << "Repainting (" << rects[l].x() << ","
01812 << rects[l].y() << ")\n";
01813 repaintContents( rects[l], false );
01814 }
01815
01816 while ( !movedItems.isEmpty() ) {
01817 repaintItem( movedItems.first() );
01818 movedItems.remove( movedItems.first() );
01819 }
01820 }
01821
01822 int KonqIconViewWidget::largestPreviewIconSize( int size ) const
01823 {
01824 int iconSize = size ? size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
01825
01826 if (iconSize < 28)
01827 return 48;
01828 if (iconSize < 40)
01829 return 64;
01830 if (iconSize < 60)
01831 return 96;
01832 if (iconSize < 120)
01833 return 128;
01834
01835 return 192;
01836 }
01837
01838 int KonqIconViewWidget::previewIconSize( int size ) const
01839 {
01840 int iconSize = size ? size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
01841
01842 if (!d->bBoostPreview)
01843 return iconSize;
01844
01845 return largestPreviewIconSize( iconSize );
01846 }
01847
01848 void KonqIconViewWidget::visualActivate(TQIconViewItem * item)
01849 {
01850
01851 TQRect irect = item->rect();
01852
01853
01854 TQRect rect = item->pixmapRect();
01855
01856
01857
01858 rect.moveBy(irect.x(), irect.y());
01859
01860
01861 rect.moveBy( -contentsX(), -contentsY() );
01862
01863 if (TDEGlobalSettings::showKonqIconActivationEffect() == true) {
01864 TDEIconEffect::visualActivate(viewport(), rect, item->pixmap());
01865 }
01866 }
01867
01868 void KonqIconViewWidget::backgroundPixmapChange( const TQPixmap & )
01869 {
01870 viewport()->update();
01871 }
01872
01873 void KonqIconViewWidget::setPreviewSettings( const TQStringList& settings )
01874 {
01875 d->previewSettings = settings;
01876 updatePreviewMimeTypes();
01877
01878 int size = m_size;
01879 m_size = -1;
01880 setIcons( size );
01881 }
01882
01883 const TQStringList& KonqIconViewWidget::previewSettings()
01884 {
01885 return d->previewSettings;
01886 }
01887
01888 void KonqIconViewWidget::setNewURL( const TQString& url )
01889 {
01890 KURL u;
01891 if ( url.startsWith( "/" ) )
01892 u.setPath( url );
01893 else
01894 u = url;
01895 setURL( u );
01896 }
01897
01898 void KonqIconViewWidget::setCaseInsensitiveSort( bool b )
01899 {
01900 d->bCaseInsensitive = b;
01901 }
01902
01903 bool KonqIconViewWidget::caseInsensitiveSort() const
01904 {
01905 return d->bCaseInsensitive;
01906 }
01907
01908 bool KonqIconViewWidget::canPreview( KFileItem* item )
01909 {
01910 if ( !TDEGlobalSettings::showFilePreview( url() ) )
01911 return false;
01912
01913 if ( d->pPreviewMimeTypes == 0L )
01914 updatePreviewMimeTypes();
01915
01916 return mimeTypeMatch( item->mimetype(), *( d->pPreviewMimeTypes ) );
01917 }
01918
01919 void KonqIconViewWidget::updatePreviewMimeTypes()
01920 {
01921 if ( d->pPreviewMimeTypes == 0L )
01922 d->pPreviewMimeTypes = new TQStringList;
01923 else
01924 d->pPreviewMimeTypes->clear();
01925
01926
01927 TDETrader::OfferList plugins = TDETrader::self()->query("ThumbCreator");
01928 TDETrader::OfferList::ConstIterator it;
01929
01930 for ( it = plugins.begin(); it != plugins.end(); ++it ) {
01931 if ( d->previewSettings.contains((*it)->desktopEntryName()) ) {
01932 TQStringList mimeTypes = (*it)->property("MimeTypes").toStringList();
01933 for (TQStringList::ConstIterator mt = mimeTypes.begin(); mt != mimeTypes.end(); ++mt)
01934 d->pPreviewMimeTypes->append(*mt);
01935 }
01936 }
01937 }
01938
01939 #include "konq_iconviewwidget.moc"
01940
01941