20 #include "konq_iconviewwidget.h"
21 #include "konq_operations.h"
22 #include "konq_undo.h"
23 #include "konq_sound.h"
24 #include "konq_filetip.h"
26 #include <tqclipboard.h>
29 #include <tqpainter.h>
30 #include <tqtooltip.h>
36 #include <kapplication.h>
38 #include <kio/previewjob.h>
40 #include <konq_settings.h>
41 #include <konq_drag.h>
42 #include <kglobalsettings.h>
43 #include <kpropertiesdialog.h>
45 #include <kicontheme.h>
46 #include <kiconeffect.h>
48 #include <kstandarddirs.h>
49 #include <kprotocolinfo.h>
57 struct KonqIconViewWidgetPrivate
59 KonqIconViewWidgetPrivate() {
61 bSoundPreviews =
false;
63 bSoundItemClicked =
false;
67 bAllowSetWallpaper =
false;
73 pActivateDoubleClick = 0L;
74 bCaseInsensitive =
true;
75 pPreviewMimeTypes = 0L;
76 bProgramsURLdrag =
false;
78 ~KonqIconViewWidgetPrivate() {
83 delete pActivateDoubleClick;
84 delete pPreviewMimeTypes;
90 KonqSoundPlayer *pSoundPlayer;
93 bool bSoundItemClicked;
94 bool bAllowSetWallpaper;
95 bool bCaseInsensitive;
102 TQString movieFileName;
104 KIO::PreviewJob *pPreviewJob;
105 KonqFileTip* pFileTip;
106 TQStringList previewSettings;
109 bool releaseMouseEvent;
112 TQTimer *pActivateDoubleClick;
113 TQStringList* pPreviewMimeTypes;
114 bool bProgramsURLdrag;
118 : KIconView( parent, name, f ),
119 m_rootItem( 0L ), m_size( 0 ) ,
120 m_bDesktop( kdesktop ),
121 m_bSetGridX( !kdesktop )
123 d =
new KonqIconViewWidgetPrivate;
124 connect(
this, TQT_SIGNAL( dropped( TQDropEvent *,
const TQValueList<TQIconDragItem> & ) ),
125 this, TQT_SLOT( slotDropped( TQDropEvent*,
const TQValueList<TQIconDragItem> & ) ) );
127 connect(
this, TQT_SIGNAL( selectionChanged() ),
130 kapp->addKipcEventMask( KIPC::IconChanged );
131 connect( kapp, TQT_SIGNAL(iconChanged(
int)), TQT_SLOT(slotIconChanged(
int)) );
132 connect(
this, TQT_SIGNAL(onItem(TQIconViewItem *)), TQT_SLOT(slotOnItem(TQIconViewItem *)) );
133 connect(
this, TQT_SIGNAL(onViewport()), TQT_SLOT(slotOnViewport()) );
134 connect(
this, TQT_SIGNAL(itemRenamed(TQIconViewItem *,
const TQString &)), TQT_SLOT(slotItemRenamed(TQIconViewItem *,
const TQString &)) );
137 d->bBoostPreview = boostPreview();
140 setSelectionMode( TQIconView::Extended );
142 d->releaseMouseEvent =
false;
143 d->pFileTip =
new KonqFileTip(
this);
144 d->firstClick =
false;
146 setAutoArrange(
true );
147 setSorting(
true, sortDirection() );
148 readAnimatedIconsConfig();
149 m_bSortDirsFirst =
true;
150 m_bMousePressed =
false;
151 m_LineupMode = LineupBoth;
154 m_iconPositionGroupPrefix = TQString::fromLatin1(
"IconPosition::" );
155 KonqUndoManager::incRef();
158 KonqIconViewWidget::~KonqIconViewWidget()
161 KonqUndoManager::decRef();
165 bool KonqIconViewWidget::maySetWallpaper()
167 return d->bAllowSetWallpaper;
170 void KonqIconViewWidget::setMaySetWallpaper(
bool b)
172 d->bAllowSetWallpaper = b;
180 m_bMousePressed =
false;
189 KIconView::focusOutEvent( ev );
192 void KonqIconViewWidget::slotItemRenamed(TQIconViewItem *item,
const TQString &name)
194 kdDebug(1203) <<
"KonqIconViewWidget::slotItemRenamed" << endl;
196 KFileItem *fileItem = viewItem->
item();
201 viewItem->setText( fileItem->text() );
202 kdDebug(1203)<<
" fileItem->text() ;"<<fileItem->text()<<endl;
204 if( !name.isEmpty() )
207 KURL oldurl( fileItem->url() );
208 KURL newurl( oldurl );
209 newurl.setPath( newurl.directory(
false) + KIO::encodeFileName( name ) );
210 kdDebug(1203)<<
" newurl :"<<newurl<<endl;
216 void KonqIconViewWidget::slotIconChanged(
int group )
218 if (group != KIcon::Desktop)
225 readAnimatedIconsConfig();
228 void KonqIconViewWidget::readAnimatedIconsConfig()
230 KConfigGroup cfgGroup( KGlobal::config(),
"DesktopIcons" );
231 d->doAnimations = cfgGroup.readBoolEntry(
"Animated",
true );
234 void KonqIconViewWidget::slotOnItem( TQIconViewItem *_item )
238 if( d->pActiveItem != 0L && d->pActiveItem != item )
240 if ( d->m_movie && d->pActiveItem->isAnimated() )
243 d->pActiveItem->setAnimated(
false );
244 d->pActiveItem->refreshIcon(
true );
247 d->pActiveItem->setActive(
false );
250 d->pFileTip->setItem( 0L );
254 if (d->pSoundPlayer != 0 && item != d->pSoundItem)
256 d->pSoundPlayer->stop();
259 if (d->pSoundTimer && d->pSoundTimer->isActive())
260 d->pSoundTimer->stop();
263 if ( !m_bMousePressed )
265 if( item != d->pActiveItem )
267 d->pActiveItem = item;
268 d->pFileTip->setItem( d->pActiveItem->item(),
272 if ( d->doAnimations && d->pActiveItem && d->pActiveItem->hasAnimation() )
276 #if 0 // Qt-mng bug, reusing the movie doesn't work currently.
277 if ( d->m_movie && d->movieFileName == d->pActiveItem->mouseOverAnimation() )
279 d->pActiveItem->setAnimated(
true );
280 if (d->m_movieBlocked) {
281 kdDebug(1203) <<
"onitem, but blocked" << endl;
285 kdDebug(1203) <<
"we go ahead.." << endl;
287 TQTimer::singleShot(300,
this, TQT_SLOT(slotReenableAnimation()));
288 d->m_movie->restart();
289 d->m_movie->unpause();
295 TQMovie movie = KGlobal::iconLoader()->loadMovie( d->pActiveItem->mouseOverAnimation(), KIcon::Desktop, d->pActiveItem->iconSize() );
296 if ( !movie.isNull() )
299 d->m_movie =
new TQMovie( movie );
302 const TQPixmap* pm = backgroundPixmap();
303 bool hasPixmap = pm && !pm->isNull();
305 pm = viewport()->backgroundPixmap();
306 hasPixmap = pm && !pm->isNull();
308 if (!hasPixmap && backgroundMode() != NoBackground)
309 d->m_movie->setBackgroundColor( viewport()->backgroundColor() );
310 d->m_movie->connectUpdate(
this, TQT_SLOT( slotMovieUpdate(
const TQRect &) ) );
311 d->m_movie->connectStatus( TQT_TQOBJECT(
this), TQT_SLOT( slotMovieStatus(
int) ) );
312 d->movieFileName = d->pActiveItem->mouseOverAnimation();
313 d->pActiveItem->setAnimated(
true );
317 d->pActiveItem->setAnimated(
false );
321 d->pActiveItem->setMouseOverAnimation( TQString::null );
326 if (d->pActiveItem && !d->pActiveItem->isAnimated())
328 d->pActiveItem->setActive(
true );
336 d->pFileTip->setItem( 0L );
344 d->pFileTip->setItem( 0L );
348 if (d->bSoundPreviews && d->pSoundPlayer &&
349 d->pSoundPlayer->mimeTypes().contains(
350 item->
item()->mimetype())
351 && KGlobalSettings::showFilePreview(item->
item()->url())
352 && topLevelWidget() == kapp->activeWindow())
354 d->pSoundItem = item;
355 d->bSoundItemClicked =
false;
358 d->pSoundTimer =
new TQTimer(
this);
359 connect(d->pSoundTimer, TQT_SIGNAL(timeout()), TQT_SLOT(slotStartSoundPreview()));
361 if (d->pSoundTimer->isActive())
362 d->pSoundTimer->stop();
363 d->pSoundTimer->start(500,
true);
368 d->pSoundPlayer->stop();
370 if (d->pSoundTimer && d->pSoundTimer->isActive())
371 d->pSoundTimer->stop();
375 void KonqIconViewWidget::slotOnViewport()
377 d->pFileTip->setItem( 0L );
380 d->pSoundPlayer->stop();
382 if (d->pSoundTimer && d->pSoundTimer->isActive())
383 d->pSoundTimer->stop();
385 if (d->pActiveItem == 0L)
388 if ( d->doAnimations && d->m_movie && d->pActiveItem->isAnimated() )
390 d->pActiveItem->setAnimated(
false );
393 if (d->m_movie->running()) {
396 kdDebug(1203) <<
"on viewport, blocking" << endl;
397 TQTimer::singleShot(300,
this, TQT_SLOT(slotReenableAnimation()));
400 d->pActiveItem->refreshIcon(
true );
401 Q_ASSERT( d->pActiveItem->state() == KIcon::DefaultState );
408 d->pActiveItem->setActive(
false );
413 void KonqIconViewWidget::slotStartSoundPreview()
415 if (!d->pSoundItem || d->bSoundItemClicked)
418 d->pSoundPlayer->play(d->pSoundItem->item()->url().url());
422 void KonqIconViewWidget::slotPreview(
const KFileItem *item,
const TQPixmap &pix)
425 for (TQIconViewItem *it = firstItem(); it; it = it->nextItem())
428 if (current->
item() == item)
430 if (item->overlays() & KIcon::HiddenOverlay) {
433 KIconEffect::semiTransparent(p);
443 void KonqIconViewWidget::slotPreviewResult()
446 emit imagePreviewFinished();
449 void KonqIconViewWidget::slotToolTipPreview(
const KFileItem* ,
const TQPixmap &)
454 void KonqIconViewWidget::slotToolTipPreviewResult()
459 void KonqIconViewWidget::slotMovieUpdate(
const TQRect& rect )
463 Q_ASSERT( d->m_movie );
465 if ( d->pActiveItem && d->m_movie && d->pActiveItem->isAnimated() ) {
466 const TQPixmap &frame = d->m_movie->framePixmap();
469 int iconSize=d->pActiveItem->iconSize();
470 if (iconSize==0) iconSize = KGlobal::iconLoader()->currentSize( KIcon::Desktop );
471 if ( frame.width() != iconSize || frame.height() != iconSize ) {
472 d->pActiveItem->setAnimated(
false );
475 d->pActiveItem->setMouseOverAnimation( TQString::null );
476 d->pActiveItem->setActive(
true );
479 d->pActiveItem->setPixmapDirect( frame,
false,
false );
480 TQRect pixRect = d->pActiveItem->pixmapRect(
false);
481 repaintContents( pixRect.x() + rect.x(), pixRect.y() + rect.y(), rect.width(), rect.height(), false );
485 void KonqIconViewWidget::slotMovieStatus(
int status )
489 if ( d->pActiveItem && d->pActiveItem->isAnimated() ) {
490 d->pActiveItem->setAnimated(
false );
491 d->pActiveItem->setMouseOverAnimation( TQString::null );
492 d->pActiveItem->setActive(
true );
497 void KonqIconViewWidget::slotReenableAnimation()
499 if (!--d->m_movieBlocked) {
500 if ( d->pActiveItem && d->m_movie && d->m_movie->paused()) {
501 kdDebug(1203) <<
"reenabled animation" << endl;
502 d->m_movie->restart();
503 d->m_movie->unpause();
510 d->pFileTip->setItem( 0L );
518 if ( d->pActiveItem == static_cast<KFileIVI *>(item) )
520 d->pFileTip->setItem( 0L );
524 if ( d->pPreviewJob )
525 d->pPreviewJob->removeItem( static_cast<KFileIVI *>(item)->item() );
527 KIconView::takeItem( item );
531 void KonqIconViewWidget::setThumbnailPixmap(
KFileIVI * item,
const TQPixmap & pixmap )
535 if ( d->pActiveItem == item )
537 d->pFileTip->setItem( 0L );
541 if ( m_bSetGridX && item->width() > gridX() )
543 setGridX( item->width() );
545 arrangeItemsInGrid();
552 bool fontChanged =
false;
555 TQColor normalTextColor = m_pSettings->normalTextColor();
556 setItemColor( normalTextColor );
560 TQColor itemTextBg = m_pSettings->itemTextBackground();
561 if ( itemTextBg.isValid() )
562 setItemTextBackground( itemTextBg );
564 setItemTextBackground( Qt::NoBrush );
567 bool on = m_pSettings->showFileTips() && TQToolTip::isGloballyEnabled();
568 d->pFileTip->setOptions(on,
569 m_pSettings->showPreviewsInFileTips(),
570 m_pSettings->numFileTips());
573 setShowToolTips(!on);
576 TQFont font( m_pSettings->standardFont() );
578 font.setUnderline( m_pSettings->underlineLink() );
580 if ( font != KonqIconViewWidget::font() )
591 setIconTextHeight( m_pSettings->iconTextHeight() );
593 if ( (itemTextPos() == TQIconView::Right) && (maxItemWidth() !=
gridXValue()) )
599 else if ( d->bBoostPreview != boostPreview() )
606 bool KonqIconViewWidget::boostPreview()
const
608 if ( m_bDesktop )
return false;
610 KConfigGroup group( KGlobal::config(),
"PreviewSettings" );
611 return group.readBoolEntry(
"BoostSize",
false );
614 void KonqIconViewWidget::disableSoundPreviews()
616 d->bSoundPreviews =
false;
619 d->pSoundPlayer->stop();
621 if (d->pSoundTimer && d->pSoundTimer->isActive())
622 d->pSoundTimer->stop();
628 bool sizeChanged = (m_size != size);
629 int oldGridX = gridX();
633 bool boost = boostPreview();
634 bool previewSizeChanged = ( d->bBoostPreview != boost );
635 d->bBoostPreview = boost;
637 if ( sizeChanged || previewSizeChanged )
639 int realSize = size ? size : KGlobal::iconLoader()->currentSize( KIcon::Desktop );
641 setSpacing( ( m_bDesktop || ( realSize > KIcon::SizeSmall ) ) ?
642 QMAX( 5, TQFontMetrics(font()).width(
'n') ) : 0 );
645 if ( sizeChanged || previewSizeChanged || !stopImagePreviewFor.isEmpty() )
649 bool stopAll = !stopImagePreviewFor.isEmpty() && stopImagePreviewFor.first() ==
"*";
655 bool prevUpdatesState = viewport()->isUpdatesEnabled();
656 viewport()->setUpdatesEnabled(
false );
659 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() ) {
665 previewSizeChanged ||
667 mimeTypeMatch( ivi->
item()->mimetype(), stopImagePreviewFor ) )
676 viewport()->setUpdatesEnabled( prevUpdatesState );
678 if ( ( sizeChanged || previewSizeChanged || oldGridX != gridX() ||
679 !stopImagePreviewFor.isEmpty() ) && autoArrange() )
680 arrangeItemsInGrid(
true );
682 viewport()->update();
685 bool KonqIconViewWidget::mimeTypeMatch(
const TQString& mimeType,
const TQStringList& mimeList )
const
688 KMimeType::Ptr mime = KMimeType::mimeType( mimeType );
689 for (TQStringList::ConstIterator mt = mimeList.begin(); mt != mimeList.end(); ++mt)
691 if ( mime->is( *mt ) )
694 TQString tmp( mimeType );
695 if ( (*mt).endsWith(
"*") && tmp.replace(TQRegExp(
"/.*"),
"/*") == (*mt) )
697 if ( (*mt) ==
"text/plain" )
699 TQVariant textProperty = mime->property(
"X-KDE-text" );
700 if ( textProperty.type() == TQVariant::Bool && textProperty.toBool() )
710 int sz = m_size ? m_size : KGlobal::iconLoader()->currentSize( KIcon::Desktop );
713 if ( pos == TQIconView::Bottom )
714 setGridX( QMAX( sz + 50, previewIconSize( sz ) + 13 ) );
717 setMaxItemWidth( QMAX( sz, previewIconSize( sz ) ) + m_pSettings->iconTextWidth() );
721 KIconView::setItemTextPos( pos );
727 int previewSize = previewIconSize( m_size );
728 int iconSize = m_size ? m_size : KGlobal::iconLoader()->currentSize( KIcon::Desktop );
737 *dx = spacing() + QMAX( QMAX( iconSize, previewSize ), m_pSettings->iconTextWidth() );
738 int textHeight = iconTextHeight() * fontMetrics().height();
739 *dy = spacing() + QMAX( iconSize, previewSize ) + 2 + textHeight + spacing();
743 if ( m_IconRect.isValid() ) {
744 *x = m_IconRect.left(); w = m_IconRect.width();
745 *y = m_IconRect.top(); h = m_IconRect.height();
748 *x = 0; w = viewport()->width();
749 *y = 0; h = viewport()->height();
768 kdDebug(1203) <<
"x=" << *x <<
" y=" << *y <<
" spacing=" << spacing() <<
" iconSize=" << iconSize
769 <<
" w=" << w <<
" h=" << h
770 <<
" nx=" << *nx <<
" ny=" << *ny
771 <<
" dx=" << *dx <<
" dy=" << *dy << endl;
774 void KonqIconViewWidget::calculateGridX()
777 if ( itemTextPos() == TQIconView::Bottom )
789 int sz = m_size ? m_size : KGlobal::iconLoader()->currentSize( KIcon::Desktop );
792 if ( itemTextPos() == TQIconView::Bottom )
793 newGridX = QMAX( sz + 50, previewIconSize( sz ) + 13 );
795 newGridX = QMAX( sz, previewIconSize( sz ) ) + m_pSettings->iconTextWidth();
803 updatePreviewMimeTypes();
804 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
805 (static_cast<KFileIVI *>( it ))->item()->refreshMimeType();
809 void KonqIconViewWidget::setURL(
const KURL &kurl )
814 d->pFileTip->setPreview( KGlobalSettings::showFilePreview(m_url) );
816 if ( m_url.isLocalFile() )
817 m_dotDirectoryPath = m_url.path(1).append(
".directory" );
819 m_dotDirectoryPath = TQString::null;
827 if ( !KGlobalSettings::showFilePreview( url() ) ) {
828 kdDebug(1203) <<
"Previews disabled for protocol " << url().protocol() << endl;
829 emit imagePreviewFinished();
833 if ((d->bSoundPreviews = d->previewSettings.contains(
"audio/" )) &&
836 KLibFactory *factory = KLibLoader::self()->factory(
"konq_sound");
838 d->pSoundPlayer =
static_cast<KonqSoundPlayer *
>(
839 factory->create(TQT_TQOBJECT(
this), 0,
"KonqSoundPlayer"));
840 d->bSoundPreviews = (d->pSoundPlayer != 0L);
844 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
845 if ( force || !static_cast<KFileIVI *>( it )->hasValidThumbnail() )
846 items.append( static_cast<KFileIVI *>( it )->item() );
848 bool onlyAudio =
true;
849 for ( TQStringList::ConstIterator it = d->previewSettings.begin(); it != d->previewSettings.end(); ++it ) {
850 if ( (*it).startsWith(
"audio/" ) )
851 d->bSoundPreviews =
true;
856 if ( items.isEmpty() || onlyAudio ) {
857 emit imagePreviewFinished();
861 int iconSize = m_size ? m_size : KGlobal::iconLoader()->currentSize( KIcon::Desktop );
864 d->bBoostPreview = boostPreview();
865 size = previewIconSize( iconSize );
867 if ( !d->bBoostPreview )
870 d->pPreviewJob = KIO::filePreview( items, size, size, iconSize,
871 m_pSettings->textPreviewIconTransparency(),
true ,
872 true , &(d->previewSettings) );
873 connect( d->pPreviewJob, TQT_SIGNAL( gotPreview(
const KFileItem *,
const TQPixmap & ) ),
874 this, TQT_SLOT( slotPreview(
const KFileItem *,
const TQPixmap & ) ) );
875 connect( d->pPreviewJob, TQT_SIGNAL( result( KIO::Job * ) ),
876 this, TQT_SLOT( slotPreviewResult() ) );
879 void KonqIconViewWidget::stopImagePreview()
883 d->pPreviewJob->kill();
890 bool KonqIconViewWidget::isPreviewRunning()
const
892 return d->pPreviewJob;
897 KFileItemList lstItems;
899 TQIconViewItem *it = firstItem();
900 for (; it; it = it->nextItem() )
901 if ( it->isSelected() ) {
902 KFileItem *fItem = (
static_cast<KFileIVI *
>(it))->item();
903 lstItems.append( fItem );
908 void KonqIconViewWidget::slotDropped( TQDropEvent *ev,
const TQValueList<TQIconDragItem> & )
914 dirURL = m_rootItem->mostLocalURL(dummy);
919 void KonqIconViewWidget::slotAboutToCreate(
const TQPoint &,
const TQValueList<KIO::CopyInfo> &)
924 void KonqIconViewWidget::drawBackground( TQPainter *p,
const TQRect &r )
926 drawBackground(p, r, r.topLeft());
929 void KonqIconViewWidget::drawBackground( TQPainter *p,
const TQRect &r ,
const TQPoint &pt)
931 const TQPixmap *pm = backgroundPixmap();
932 bool hasPixmap = pm && !pm->isNull();
934 pm = viewport()->backgroundPixmap();
935 hasPixmap = pm && !pm->isNull();
939 rtgt.moveTopLeft(pt);
940 if (!hasPixmap && backgroundMode() != NoBackground) {
941 p->fillRect(rtgt, viewport()->backgroundColor());
946 int ax = (r.x() + contentsX() + leftMargin()) % pm->width();
947 int ay = (r.y() + contentsY() + topMargin()) % pm->height();
948 p->drawTiledPixmap(rtgt, *pm, TQPoint(ax, ay));
952 TQDragObject * KonqIconViewWidget::dragObject()
954 if ( !currentItem() )
957 return konqDragObject( viewport() );
960 KonqIconDrag * KonqIconViewWidget::konqDragObject( TQWidget * dragSource )
965 TQIconViewItem *primaryItem = currentItem();
967 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() ) {
968 if ( it->isSelected() ) {
971 KFileItem* fileItem = (
static_cast<KFileIVI *
>(it))->item();
972 KURL url = fileItem->url();
974 KURL mostLocalURL = fileItem->mostLocalURL(dummy);
975 TQString itemURL = KURLDrag::urlToString(url);
976 kdDebug(1203) <<
"itemURL=" << itemURL << endl;
978 id.setData( TQCString(itemURL.latin1()) );
980 TQRect( it->pixmapRect(
false).topLeft() - m_mousePos,
981 it->pixmapRect().size() ),
982 TQRect( it->textRect(
false).topLeft() - m_mousePos,
983 it->textRect().size() ),
984 itemURL, mostLocalURL );
989 drag->setPixmap( *primaryItem->pixmap(), m_mousePos - primaryItem->pixmapRect(
false).topLeft() );
994 void KonqIconViewWidget::contentsDragEnterEvent( TQDragEnterEvent *e )
996 if ( e->provides(
"text/uri-list" ) )
998 TQByteArray payload = e->encodedData(
"text/uri-list" );
999 if ( !payload.size() )
1000 kdError() <<
"Empty data !" << endl;
1003 bool ok = KURLDrag::decode( e, m_lstDragURLs );
1005 kdError() <<
"Couldn't decode urls dragged !" << endl;
1009 if ( KURLDrag::decode(e, uriList) )
1011 if ( uriList.first().protocol() ==
"programs" )
1015 d->bProgramsURLdrag =
true;
1020 KIconView::contentsDragEnterEvent( e );
1024 void KonqIconViewWidget::contentsDragMoveEvent( TQDragMoveEvent *e )
1026 if ( d->bProgramsURLdrag ) {
1027 emit dragMove(
false );
1029 cancelPendingHeldSignal();
1033 TQIconViewItem *item = findItem( e->pos() );
1034 if ( e->source() != viewport() &&
1035 !item && m_rootItem && !m_rootItem->isWritable() ) {
1036 emit dragMove(
false );
1038 cancelPendingHeldSignal();
1041 emit dragMove(
true );
1042 KIconView::contentsDragMoveEvent( e );
1045 void KonqIconViewWidget::contentsDragLeaveEvent( TQDragLeaveEvent *e )
1047 d->bProgramsURLdrag =
false;
1048 KIconView::contentsDragLeaveEvent(e);
1053 void KonqIconViewWidget::setItemColor(
const TQColor &c )
1058 TQColor KonqIconViewWidget::itemColor()
const
1063 void KonqIconViewWidget::disableIcons(
const KURL::List & lst )
1065 for ( TQIconViewItem *kit = firstItem(); kit; kit = kit->nextItem() )
1067 bool bFound =
false;
1070 for (KURL::List::ConstIterator it = lst.begin(); !bFound && it != lst.end(); ++it)
1072 if ( static_cast<KFileIVI *>( kit )->item()->url() == *it )
1078 static_cast<KFileIVI *
>( kit )->setDisabled( bFound );
1088 bool bInTrash =
false;
1091 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
1093 if ( it->isSelected() )
1098 KFileItem *item = (
static_cast<KFileIVI *
>( it ) )->item();
1099 KURL url = item->url();
1100 TQString local_path = item->localPath();
1102 if ( url.directory(
false) == KGlobalSettings::trashPath() )
1104 if ( KProtocolInfo::supportsDeleting( url ) )
1106 if ( !local_path.isEmpty() )
1113 emit
enableAction(
"trash", canDel > 0 && !bInTrash && canTrash==canDel );
1117 emit
enableAction(
"rename", ( iCount == 1) && !bInTrash );
1120 void KonqIconViewWidget::renameCurrentItem()
1122 if ( currentItem() )
1123 currentItem()->rename();
1126 void KonqIconViewWidget::renameSelectedItem()
1128 kdDebug(1203) <<
" -- KonqIconViewWidget::renameSelectedItem() -- " << endl;
1129 TQIconViewItem * item = 0L;
1130 TQIconViewItem *it = firstItem();
1131 for (; it; it = it->nextItem() )
1132 if ( it->isSelected() && !item )
1145 void KonqIconViewWidget::cutSelection()
1147 kdDebug(1203) <<
" -- KonqIconViewWidget::cutSelection() -- " << endl;
1148 KonqIconDrag * obj = konqDragObject( );
1149 obj->setMoveSelection(
true );
1150 TQApplication::clipboard()->setData( obj );
1153 void KonqIconViewWidget::copySelection()
1155 kdDebug(1203) <<
" -- KonqIconViewWidget::copySelection() -- " << endl;
1156 KonqIconDrag * obj = konqDragObject( );
1157 TQApplication::clipboard()->setData( obj );
1160 void KonqIconViewWidget::pasteSelection()
1165 void KonqIconViewWidget::paste(
const KURL &url )
1170 KURL::List KonqIconViewWidget::selectedUrls()
1172 return selectedUrls( UserVisibleUrls );
1175 KURL::List KonqIconViewWidget::selectedUrls( UrlFlags flags )
const
1179 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
1180 if ( it->isSelected() ) {
1181 KFileItem* item = (
static_cast<KFileIVI *
>( it ))->item();
1182 lstURLs.append( flags == MostLocalUrls ? item->mostLocalURL( dummy ) : item->url() );
1199 return m_LineupMode;
1204 m_LineupMode = mode;
1207 bool KonqIconViewWidget::sortDirectoriesFirst()
const
1209 return m_bSortDirsFirst;
1212 void KonqIconViewWidget::setSortDirectoriesFirst(
bool b )
1214 m_bSortDirsFirst = b;
1217 void KonqIconViewWidget::contentsMouseMoveEvent( TQMouseEvent *e )
1219 if ( (d->pSoundPlayer && d->pSoundPlayer->isPlaying()) || (d->pSoundTimer && d->pSoundTimer->isActive()))
1224 if ( TQApplication::widgetAt( TQCursor::pos() ) != topLevelWidget() )
1226 if (d->pSoundPlayer)
1227 d->pSoundPlayer->stop();
1229 if (d->pSoundTimer && d->pSoundTimer->isActive())
1230 d->pSoundTimer->stop();
1233 d->renameItem=
false;
1234 KIconView::contentsMouseMoveEvent( e );
1237 void KonqIconViewWidget::contentsDropEvent( TQDropEvent * ev )
1239 TQIconViewItem *i = findItem( ev->pos() );
1242 if ( ev->source() != viewport() &&
1243 !i && m_rootItem && !m_rootItem->isWritable() ) {
1244 ev->accept(
false );
1250 if ( !i && (ev->action() == TQDropEvent::Copy || ev->action() == TQDropEvent::Link)
1251 && ev->source() && ev->source() == viewport()
1252 && KURLDrag::decode(ev, uriList) && !uriList.isEmpty()
1253 && uriList.first().upURL().url(1) == url().url(1))
1256 bool bMovable = itemsMovable();
1257 setItemsMovable(
false);
1258 KIconView::contentsDropEvent( ev );
1259 setItemsMovable(bMovable);
1261 TQValueList<TQIconDragItem> lst;
1262 slotDropped(ev, lst);
1266 KIconView::contentsDropEvent( ev );
1280 void KonqIconViewWidget::doubleClickTimeout()
1282 d->renameItem=
true;
1283 mousePressChangeValue();
1284 if ( d->releaseMouseEvent )
1286 TQMouseEvent e( TQEvent::MouseButtonPress,d->mousePos , 1, d->mouseState);
1287 TQIconViewItem* item = findItem( e.pos() );
1291 url= (
static_cast<KFileIVI *
>( item ) )->item()->url();
1292 bool brenameTrash =
false;
1293 if ( url.isLocalFile() && (url.directory(
false) == KGlobalSettings::trashPath() || url.path(1).startsWith(KGlobalSettings::trashPath())))
1294 brenameTrash =
true;
1296 if ( url.isLocalFile() && !brenameTrash && d->renameItem && m_pSettings->renameIconDirectly() && e.button() == Qt::LeftButton && item->textRect(
false ).contains(e.pos()))
1298 if( d->pActivateDoubleClick->isActive () )
1299 d->pActivateDoubleClick->stop();
1301 m_bMousePressed =
false;
1307 TQMouseEvent e( TQEvent::MouseMove,d->mousePos , 1, d->mouseState);
1308 KIconView::contentsMousePressEvent( &e );
1310 if( d->pActivateDoubleClick->isActive() )
1311 d->pActivateDoubleClick->stop();
1313 d->releaseMouseEvent =
false;
1314 d->renameItem=
false;
1317 void KonqIconViewWidget::wheelEvent(TQWheelEvent* e)
1320 d->pFileTip->setItem( 0 );
1322 if (e->state() == ControlButton)
1324 if (e->delta() >= 0)
1336 KIconView::wheelEvent(e);
1339 void KonqIconViewWidget::leaveEvent( TQEvent *e )
1344 KIconView::leaveEvent(e);
1347 void KonqIconViewWidget::mousePressChangeValue()
1350 m_bMousePressed =
true;
1351 if (d->pSoundPlayer)
1352 d->pSoundPlayer->stop();
1353 d->bSoundItemClicked =
true;
1354 d->firstClick =
false;
1358 d->pFileTip->setItem( 0 );
1361 void KonqIconViewWidget::contentsMousePressEvent( TQMouseEvent *e )
1363 if(d->pActivateDoubleClick && d->pActivateDoubleClick->isActive ())
1364 d->pActivateDoubleClick->stop();
1365 TQIconViewItem* item = findItem( e->pos() );
1366 m_mousePos = e->pos();
1370 url = (
static_cast<KFileIVI *
>( item ) )->item()->url();
1371 bool brenameTrash =
false;
1372 if ( url.isLocalFile() && (url.directory(
false) == KGlobalSettings::trashPath() || url.path(1).startsWith(KGlobalSettings::trashPath())))
1373 brenameTrash =
true;
1374 if ( !brenameTrash && !KGlobalSettings::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))
1376 d->firstClick =
true;
1377 d->mousePos = e->pos();
1378 d->mouseState = e->state();
1379 if (!d->pActivateDoubleClick)
1381 d->pActivateDoubleClick =
new TQTimer(
this);
1382 connect(d->pActivateDoubleClick, TQT_SIGNAL(timeout()),
this, TQT_SLOT(doubleClickTimeout()));
1384 if( d->pActivateDoubleClick->isActive () )
1385 d->pActivateDoubleClick->stop();
1387 d->pActivateDoubleClick->start(TQApplication::doubleClickInterval());
1388 d->releaseMouseEvent =
false;
1392 d->renameItem=
false;
1395 d->renameItem=
false;
1396 mousePressChangeValue();
1397 if(d->pActivateDoubleClick && d->pActivateDoubleClick->isActive())
1398 d->pActivateDoubleClick->stop();
1399 KIconView::contentsMousePressEvent( e );
1403 void KonqIconViewWidget::contentsMouseReleaseEvent( TQMouseEvent *e )
1405 KIconView::contentsMouseReleaseEvent( e );
1406 if(d->releaseMouseEvent && d->pActivateDoubleClick && d->pActivateDoubleClick->isActive ())
1407 d->pActivateDoubleClick->stop();
1409 d->releaseMouseEvent =
true;
1410 m_bMousePressed =
false;
1413 void KonqIconViewWidget::slotSaveIconPositions()
1422 if ( m_dotDirectoryPath.isEmpty() )
1426 kdDebug(1214) <<
"KonqIconViewWidget::slotSaveIconPositions" << endl;
1427 KSimpleConfig dotDirectory( m_dotDirectoryPath );
1428 TQIconViewItem *it = firstItem();
1434 KFileItem *item = ivi->
item();
1436 dotDirectory.setGroup( TQString( m_iconPositionGroupPrefix ).append( item->url().fileName() ) );
1437 kdDebug(1214) <<
"KonqIconViewWidget::slotSaveIconPositions " << item->url().fileName() <<
" " << it->x() <<
" " << it->y() << endl;
1438 dotDirectory.writeEntry( TQString(
"X %1" ).arg( width() ), it->x() );
1439 dotDirectory.writeEntry( TQString(
"Y %1" ).arg( height() ), it->y() );
1440 dotDirectory.writeEntry(
"Exists",
true );
1442 it = it->nextItem();
1445 TQStringList groups = dotDirectory.groupList();
1446 TQStringList::ConstIterator gIt = groups.begin();
1447 TQStringList::ConstIterator gEnd = groups.end();
1448 for (; gIt != gEnd; ++gIt )
1449 if ( (*gIt).left( m_iconPositionGroupPrefix.length() ) == m_iconPositionGroupPrefix )
1451 dotDirectory.setGroup( *gIt );
1452 if ( dotDirectory.hasKey(
"Exists" ) )
1453 dotDirectory.deleteEntry(
"Exists",
false );
1456 kdDebug(1214) <<
"KonqIconViewWidget::slotSaveIconPositions deleting group " << *gIt << endl;
1457 dotDirectory.deleteGroup( *gIt );
1461 dotDirectory.sync();
1479 if (!m_IconRect.isValid())
1481 KIconView::insertInGrid(item);
1485 TQRegion r(m_IconRect);
1486 TQIconViewItem *i = firstItem();
1488 for (; i; i = i->nextItem() )
1490 r = r.subtract(i->rect());
1491 y = QMAX(y, i->y() + i->height());
1494 TQMemArray<TQRect> rects = r.rects();
1495 TQMemArray<TQRect>::Iterator it = rects.begin();
1496 bool foundPlace = FALSE;
1497 for (; it != rects.end(); ++it)
1500 if (rect.width() >= item->width() && rect.height() >= item->height())
1503 if (rect.width() >= item->width() + spacing())
1505 if (rect.height() >= item->height() + spacing())
1507 item->move(rect.x() + sx, rect.y() + sy);
1514 item->move(m_IconRect.topLeft());
1554 int x0, y0, dx, dy, nx, ny;
1557 int itemWidth = dx - spacing();
1558 bool newItemWidth =
false;
1559 if ( maxItemWidth() != itemWidth ) {
1560 newItemWidth =
true;
1561 setMaxItemWidth( itemWidth );
1565 if ( !firstItem() ) {
1566 kdDebug(1203) <<
"No icons at all ?\n";
1570 int iconSize = m_size ? m_size : KGlobal::iconLoader()->currentSize( KIcon::Desktop );
1572 typedef TQValueList<TQIconViewItem*> Bin;
1573 Bin*** bins =
new Bin**[nx];
1576 for ( i = 0; i < nx ; i++ ) {
1577 bins[i] =
new Bin*[ny];
1578 for ( j = 0; j < ny; j++ )
1583 int textHeight = iconTextHeight() * fontMetrics().height();
1585 for ( TQIconViewItem* item = firstItem(); item; item = item->nextItem() ) {
1586 int x = item->x() + item->width() / 2 - x0;
1587 int y = item->pixmapRect(
false ).bottom() - iconSize / 2
1588 - ( dy - ( iconSize + textHeight ) ) / 2 - y0;
1589 int posX = QMIN( nx-1, QMAX( 0, x / dx ) );
1590 int posY = QMIN( ny-1, QMAX( 0, y / dy ) );
1592 if ( !bins[posX][posY] )
1593 bins[posX][posY] =
new Bin;
1594 bins[posX][posY]->prepend( item );
1599 const int infinity = 10000;
1601 for ( n = 0; n < 30 && nmoves > 0; n++ ) {
1603 for ( i = 0; i < nx; i++ ) {
1604 for ( j = 0; j < ny; j++ ) {
1605 if ( !bins[i][j] || ( bins[i][j]->count() <= 1 ) )
1609 int tf = 0, bf = 0, lf = 0, rf = 0;
1610 for ( k = j-1; k >= 0 && bins[i][k] && bins[i][k]->count(); k-- )
1611 tf += bins[i][k]->count();
1615 for ( k = j+1; k < ny && bins[i][k] && bins[i][k]->count(); k++ )
1616 bf += bins[i][k]->count();
1620 for ( k = i-1; k >= 0 && bins[k][j] && bins[k][j]->count(); k-- )
1621 lf += bins[k][j]->count();
1625 for ( k = i+1; k < nx && bins[k][j] && bins[k][j]->count(); k++ )
1626 rf += bins[k][j]->count();
1631 if ( tf >= infinity && bf >= infinity &&
1632 lf >= infinity && rf >= infinity )
1636 if ( m_LineupMode == LineupHorizontal ) {
1640 else if ( m_LineupMode == LineupVertical ) {
1646 TQIconViewItem* movedItem;
1647 Bin* items = bins[i][j];
1649 int mini = QMIN( QMIN( tf, bf ), QMIN( lf, rf ) );
1652 Bin::iterator it = items->begin();
1654 for ( ++it; it != items->end(); ++it ) {
1655 if ( (*it)->y() < movedItem->y() )
1658 items->remove( movedItem );
1659 if ( !bins[i][j-1] )
1660 bins[i][j-1] =
new Bin;
1661 bins[i][j-1]->prepend( movedItem );
1663 else if ( bf ==mini ) {
1665 Bin::iterator it = items->begin();
1667 for ( ++it; it != items->end(); ++it ) {
1668 if ( (*it)->y() > movedItem->y() )
1671 items->remove( movedItem );
1672 if ( !bins[i][j+1] )
1673 bins[i][j+1] =
new Bin;
1674 bins[i][j+1]->prepend( movedItem );
1676 else if ( lf == mini )
1679 Bin::iterator it = items->begin();
1681 for ( ++it; it != items->end(); ++it ) {
1682 if ( (*it)->x() < movedItem->x() )
1685 items->remove( movedItem );
1686 if ( !bins[i-1][j] )
1687 bins[i-1][j] =
new Bin;
1688 bins[i-1][j]->prepend( movedItem );
1692 Bin::iterator it = items->begin();
1694 for ( ++it; it != items->end(); ++it ) {
1695 if ( (*it)->x() > movedItem->x() )
1698 items->remove( movedItem );
1699 if ( !bins[i+1][j] )
1700 bins[i+1][j] =
new Bin;
1701 bins[i+1][j]->prepend( movedItem );
1709 TQRegion repaintRegion;
1710 TQValueList<TQIconViewItem*> movedItems;
1712 for ( i = 0; i < nx; i++ ) {
1713 for ( j = 0; j < ny; j++ ) {
1714 Bin* bin = bins[i][j];
1717 if ( !bin->isEmpty() ) {
1718 TQIconViewItem* item = bin->first();
1719 int newX = x0 + i*dx + spacing() +
1720 QMAX(0, ( (dx-spacing()) - item->width() ) / 2);
1722 int newY = y0 + j*dy + dy - spacing() - ( item->pixmapRect().bottom() + 2 + textHeight );
1723 if ( item->x() != newX || item->y() != newY ) {
1724 TQRect oldRect = item->rect();
1725 movedItems.prepend( item );
1726 item->move( newX, newY );
1727 if ( item->rect() != oldRect )
1728 repaintRegion = repaintRegion.unite( oldRect );
1741 TQMemArray<TQRect> rects = repaintRegion.rects();
1742 for ( uint l = 0; l < rects.count(); l++ ) {
1743 kdDebug( 1203 ) <<
"Repainting (" << rects[l].x() <<
","
1744 << rects[l].y() <<
")\n";
1745 repaintContents( rects[l],
false );
1748 while ( !movedItems.isEmpty() ) {
1749 repaintItem( movedItems.first() );
1750 movedItems.remove( movedItems.first() );
1754 for ( i = 0; i < nx ; i++ ) {
1762 int x0, y0, dx, dy, nxmax, nymax;
1763 gridValues( &x0, &y0, &dx, &dy, &nxmax, &nymax );
1764 int textHeight = iconTextHeight() * fontMetrics().height();
1766 TQRegion repaintRegion;
1767 TQValueList<TQIconViewItem*> movedItems;
1770 TQIconViewItem* item;
1771 for ( item = firstItem(); item; item = item->nextItem() ) {
1772 int newX = x0 + nx*dx + spacing() +
1773 QMAX(0, ( (dx-spacing()) - item->width() ) / 2);
1775 int newY = y0 + ny*dy + dy - spacing() - ( item->pixmapRect().bottom() + 2 + textHeight );
1776 if ( item->x() != newX || item->y() != newY ) {
1777 TQRect oldRect = item->rect();
1778 movedItems.prepend( item );
1779 item->move( newX, newY );
1780 if ( item->rect() != oldRect )
1781 repaintRegion = repaintRegion.unite( oldRect );
1783 if ( arrangement == TQIconView::LeftToRight ) {
1785 if ( nx >= nxmax ) {
1792 if ( ny >= nymax ) {
1800 TQMemArray<TQRect> rects = repaintRegion.rects();
1801 for ( uint l = 0; l < rects.count(); l++ ) {
1802 kdDebug( 1203 ) <<
"Repainting (" << rects[l].x() <<
","
1803 << rects[l].y() <<
")\n";
1804 repaintContents( rects[l],
false );
1807 while ( !movedItems.isEmpty() ) {
1808 repaintItem( movedItems.first() );
1809 movedItems.remove( movedItems.first() );
1813 int KonqIconViewWidget::largestPreviewIconSize(
int size )
const
1815 int iconSize = size ? size : KGlobal::iconLoader()->currentSize( KIcon::Desktop );
1829 int KonqIconViewWidget::previewIconSize(
int size )
const
1831 int iconSize = size ? size : KGlobal::iconLoader()->currentSize( KIcon::Desktop );
1833 if (!d->bBoostPreview)
1836 return largestPreviewIconSize( iconSize );
1842 TQRect irect = item->rect();
1845 TQRect rect = item->pixmapRect();
1849 rect.moveBy(irect.x(), irect.y());
1852 rect.moveBy( -contentsX(), -contentsY() );
1854 if (KGlobalSettings::showKonqIconActivationEffect() ==
true) {
1855 KIconEffect::visualActivate(viewport(), rect, item->pixmap());
1859 void KonqIconViewWidget::backgroundPixmapChange(
const TQPixmap & )
1861 viewport()->update();
1864 void KonqIconViewWidget::setPreviewSettings(
const TQStringList& settings )
1866 d->previewSettings = settings;
1867 updatePreviewMimeTypes();
1874 const TQStringList& KonqIconViewWidget::previewSettings()
1876 return d->previewSettings;
1879 void KonqIconViewWidget::setNewURL(
const TQString& url )
1882 if ( url.startsWith(
"/" ) )
1889 void KonqIconViewWidget::setCaseInsensitiveSort(
bool b )
1891 d->bCaseInsensitive = b;
1894 bool KonqIconViewWidget::caseInsensitiveSort()
const
1896 return d->bCaseInsensitive;
1899 bool KonqIconViewWidget::canPreview( KFileItem* item )
1901 if ( !KGlobalSettings::showFilePreview( url() ) )
1904 if ( d->pPreviewMimeTypes == 0L )
1905 updatePreviewMimeTypes();
1907 return mimeTypeMatch( item->mimetype(), *( d->pPreviewMimeTypes ) );
1910 void KonqIconViewWidget::updatePreviewMimeTypes()
1912 if ( d->pPreviewMimeTypes == 0L )
1913 d->pPreviewMimeTypes =
new TQStringList;
1915 d->pPreviewMimeTypes->clear();
1918 KTrader::OfferList plugins = KTrader::self()->query(
"ThumbCreator");
1919 KTrader::OfferList::ConstIterator it;
1921 for ( it = plugins.begin(); it != plugins.end(); ++it ) {
1922 if ( d->previewSettings.contains((*it)->desktopEntryName()) ) {
1923 TQStringList mimeTypes = (*it)->property(
"MimeTypes").toStringList();
1924 for (TQStringList::ConstIterator mt = mimeTypes.begin(); mt != mimeTypes.end(); ++mt)
1925 d->pPreviewMimeTypes->append(*mt);
1930 #include "konq_iconviewwidget.moc"