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 <tdeapplication.h> 38 #include <tdeio/previewjob.h> 39 #include <tdefileivi.h> 40 #include <konq_settings.h> 41 #include <konq_drag.h> 42 #include <tdeglobalsettings.h> 43 #include <kpropertiesdialog.h> 45 #include <kicontheme.h> 46 #include <kiconeffect.h> 48 #include <kstandarddirs.h> 49 #include <kprotocolinfo.h> 54 #include <tdelocale.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 TDEIO::PreviewJob *pPreviewJob;
105 KonqFileTip* pFileTip;
106 TQStringList previewSettings;
109 bool releaseMouseEvent;
112 TQTimer *pActivateDoubleClick;
113 TQStringList* pPreviewMimeTypes;
114 bool bProgramsURLdrag;
116 int min_grid_spacing;
120 : TDEIconView( parent, name, f ),
121 m_rootItem( 0L ), m_size( 0 ) ,
122 m_bDesktop( kdesktop ),
123 m_bSetGridX( !kdesktop )
125 d =
new KonqIconViewWidgetPrivate;
126 connect(
this, TQT_SIGNAL( dropped( TQDropEvent *,
const TQValueList<TQIconDragItem> & ) ),
127 this, TQT_SLOT( slotDropped( TQDropEvent*,
const TQValueList<TQIconDragItem> & ) ) );
129 connect(
this, TQT_SIGNAL( selectionChanged() ),
132 kapp->addKipcEventMask( KIPC::IconChanged );
133 connect( kapp, TQT_SIGNAL(iconChanged(
int)), TQT_SLOT(slotIconChanged(
int)) );
134 connect(
this, TQT_SIGNAL(onItem(TQIconViewItem *)), TQT_SLOT(slotOnItem(TQIconViewItem *)) );
135 connect(
this, TQT_SIGNAL(onViewport()), TQT_SLOT(slotOnViewport()) );
136 connect(
this, TQT_SIGNAL(itemRenamed(TQIconViewItem *,
const TQString &)), TQT_SLOT(slotItemRenamed(TQIconViewItem *,
const TQString &)) );
139 d->bBoostPreview = boostPreview();
142 setSelectionMode( TQIconView::Extended );
144 d->releaseMouseEvent =
false;
145 d->pFileTip =
new KonqFileTip(
this);
146 d->firstClick =
false;
148 setAutoArrange(
true );
149 setSorting(
true, sortDirection() );
150 readAnimatedIconsConfig();
152 TDEConfigGroup cfgGroup( TDEGlobal::config(),
"Grid" );
153 d->min_grid_spacing = 8; d->min_grid_spacing = cfgGroup.readNumEntry(
"MinGridSpacing", 8 );
155 m_bSortDirsFirst =
true;
156 m_bMousePressed =
false;
157 m_LineupMode = LineupBoth;
160 m_iconPositionGroupPrefix = TQString::fromLatin1(
"IconPosition::" );
161 KonqUndoManager::incRef();
164 KonqIconViewWidget::~KonqIconViewWidget()
167 KonqUndoManager::decRef();
171 bool KonqIconViewWidget::maySetWallpaper()
173 return d->bAllowSetWallpaper;
176 void KonqIconViewWidget::setMaySetWallpaper(
bool b)
178 d->bAllowSetWallpaper = b;
186 m_bMousePressed =
false;
195 TDEIconView::focusOutEvent( ev );
198 void KonqIconViewWidget::slotItemRenamed(TQIconViewItem *item,
const TQString &name)
200 kdDebug(1203) <<
"KonqIconViewWidget::slotItemRenamed" << endl;
202 KFileItem *fileItem = viewItem->
item();
207 viewItem->setText( fileItem->text() );
208 kdDebug(1203)<<
" fileItem->text() ;"<<fileItem->text()<<endl;
210 if( !name.isEmpty() )
213 KURL oldurl( fileItem->url() );
214 KURL newurl( oldurl );
215 newurl.setPath( newurl.directory(
false) + TDEIO::encodeFileName( name ) );
216 kdDebug(1203)<<
" newurl :"<<newurl<<endl;
222 void KonqIconViewWidget::slotIconChanged(
int group )
224 if (group != TDEIcon::Desktop)
231 readAnimatedIconsConfig();
234 void KonqIconViewWidget::readAnimatedIconsConfig()
236 TDEConfigGroup cfgGroup( TDEGlobal::config(),
"DesktopIcons" );
237 d->doAnimations = cfgGroup.readBoolEntry(
"Animated",
true );
240 void KonqIconViewWidget::slotOnItem( TQIconViewItem *_item )
244 if( d->pActiveItem != 0L && d->pActiveItem != item )
246 if ( d->m_movie && d->pActiveItem->isAnimated() )
249 d->pActiveItem->setAnimated(
false );
250 d->pActiveItem->refreshIcon(
true );
253 d->pActiveItem->setActive(
false );
256 d->pFileTip->setItem( 0L );
260 if (d->pSoundPlayer != 0 && item != d->pSoundItem)
262 d->pSoundPlayer->stop();
265 if (d->pSoundTimer && d->pSoundTimer->isActive())
266 d->pSoundTimer->stop();
269 if ( !m_bMousePressed )
271 if( item != d->pActiveItem )
273 d->pActiveItem = item;
274 d->pFileTip->setItem( d->pActiveItem->item(),
278 if ( d->doAnimations && d->pActiveItem && d->pActiveItem->hasAnimation() )
282 #if 0 // Qt-mng bug, reusing the movie doesn't work currently. 283 if ( d->m_movie && d->movieFileName == d->pActiveItem->mouseOverAnimation() )
285 d->pActiveItem->setAnimated(
true );
286 if (d->m_movieBlocked) {
287 kdDebug(1203) <<
"onitem, but blocked" << endl;
291 kdDebug(1203) <<
"we go ahead.." << endl;
293 TQTimer::singleShot(300,
this, TQT_SLOT(slotReenableAnimation()));
294 d->m_movie->restart();
295 d->m_movie->unpause();
301 TQMovie movie = TDEGlobal::iconLoader()->loadMovie( d->pActiveItem->mouseOverAnimation(), TDEIcon::Desktop, d->pActiveItem->iconSize() );
302 if ( !movie.isNull() )
305 d->m_movie =
new TQMovie( movie );
308 const TQPixmap* pm = backgroundPixmap();
309 bool hasPixmap = pm && !pm->isNull();
311 pm = viewport()->backgroundPixmap();
312 hasPixmap = pm && !pm->isNull();
314 if (!hasPixmap && backgroundMode() != NoBackground)
315 d->m_movie->setBackgroundColor( viewport()->backgroundColor() );
316 d->m_movie->connectUpdate(
this, TQT_SLOT( slotMovieUpdate(
const TQRect &) ) );
317 d->m_movie->connectStatus( TQT_TQOBJECT(
this), TQT_SLOT( slotMovieStatus(
int) ) );
318 d->movieFileName = d->pActiveItem->mouseOverAnimation();
319 d->pActiveItem->setAnimated(
true );
323 d->pActiveItem->setAnimated(
false );
327 d->pActiveItem->setMouseOverAnimation( TQString::null );
332 if (d->pActiveItem && !d->pActiveItem->isAnimated())
334 d->pActiveItem->setActive(
true );
342 d->pFileTip->setItem( 0L );
350 d->pFileTip->setItem( 0L );
354 if (d->bSoundPreviews && d->pSoundPlayer &&
355 d->pSoundPlayer->mimeTypes().contains(
356 item->
item()->mimetype())
357 && TDEGlobalSettings::showFilePreview(item->
item()->url())
358 && topLevelWidget() == kapp->activeWindow())
360 d->pSoundItem = item;
361 d->bSoundItemClicked =
false;
364 d->pSoundTimer =
new TQTimer(
this);
365 connect(d->pSoundTimer, TQT_SIGNAL(timeout()), TQT_SLOT(slotStartSoundPreview()));
367 if (d->pSoundTimer->isActive())
368 d->pSoundTimer->stop();
369 d->pSoundTimer->start(500,
true);
374 d->pSoundPlayer->stop();
376 if (d->pSoundTimer && d->pSoundTimer->isActive())
377 d->pSoundTimer->stop();
381 void KonqIconViewWidget::slotOnViewport()
383 d->pFileTip->setItem( 0L );
386 d->pSoundPlayer->stop();
388 if (d->pSoundTimer && d->pSoundTimer->isActive())
389 d->pSoundTimer->stop();
391 if (d->pActiveItem == 0L)
394 if ( d->doAnimations && d->m_movie && d->pActiveItem->isAnimated() )
396 d->pActiveItem->setAnimated(
false );
399 if (d->m_movie->running()) {
402 kdDebug(1203) <<
"on viewport, blocking" << endl;
403 TQTimer::singleShot(300,
this, TQT_SLOT(slotReenableAnimation()));
406 d->pActiveItem->refreshIcon(
true );
407 Q_ASSERT( d->pActiveItem->state() == TDEIcon::DefaultState );
414 d->pActiveItem->setActive(
false );
419 void KonqIconViewWidget::slotStartSoundPreview()
421 if (!d->pSoundItem || d->bSoundItemClicked)
424 d->pSoundPlayer->play(d->pSoundItem->item()->url().url());
428 void KonqIconViewWidget::slotPreview(
const KFileItem *item,
const TQPixmap &pix)
431 for (TQIconViewItem *it = firstItem(); it; it = it->nextItem())
434 if (current->
item() == item)
436 if (item->overlays() & TDEIcon::HiddenOverlay) {
439 TDEIconEffect::semiTransparent(p);
449 void KonqIconViewWidget::slotPreviewResult()
452 emit imagePreviewFinished();
455 void KonqIconViewWidget::slotToolTipPreview(
const KFileItem* ,
const TQPixmap &)
460 void KonqIconViewWidget::slotToolTipPreviewResult()
465 void KonqIconViewWidget::slotMovieUpdate(
const TQRect& rect )
469 Q_ASSERT( d->m_movie );
471 if ( d->pActiveItem && d->m_movie && d->pActiveItem->isAnimated() ) {
472 const TQPixmap &frame = d->m_movie->framePixmap();
475 int iconSize=d->pActiveItem->iconSize();
476 if (iconSize==0) iconSize = TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
477 if ( frame.width() != iconSize || frame.height() != iconSize ) {
478 d->pActiveItem->setAnimated(
false );
481 d->pActiveItem->setMouseOverAnimation( TQString::null );
482 d->pActiveItem->setActive(
true );
485 d->pActiveItem->setPixmapDirect( frame,
false,
false );
486 TQRect pixRect = d->pActiveItem->pixmapRect(
false);
487 repaintContents( pixRect.x() + rect.x(), pixRect.y() + rect.y(), rect.width(), rect.height(), false );
491 void KonqIconViewWidget::slotMovieStatus(
int status )
495 if ( d->pActiveItem && d->pActiveItem->isAnimated() ) {
496 d->pActiveItem->setAnimated(
false );
497 d->pActiveItem->setMouseOverAnimation( TQString::null );
498 d->pActiveItem->setActive(
true );
503 void KonqIconViewWidget::slotReenableAnimation()
505 if (!--d->m_movieBlocked) {
506 if ( d->pActiveItem && d->m_movie && d->m_movie->paused()) {
507 kdDebug(1203) <<
"reenabled animation" << endl;
508 d->m_movie->restart();
509 d->m_movie->unpause();
516 d->pFileTip->setItem( 0L );
518 TDEIconView::clear();
524 if ( d->pActiveItem == static_cast<KFileIVI *>(item) )
526 d->pFileTip->setItem( 0L );
530 if ( d->pPreviewJob )
531 d->pPreviewJob->removeItem( static_cast<KFileIVI *>(item)->item() );
533 TDEIconView::takeItem( item );
537 void KonqIconViewWidget::setThumbnailPixmap(
KFileIVI * item,
const TQPixmap & pixmap )
541 if ( d->pActiveItem == item )
543 d->pFileTip->setItem( 0L );
547 if ( m_bSetGridX && item->width() > gridX() )
549 setGridX( item->width() );
551 arrangeItemsInGrid();
558 bool fontChanged =
false;
561 TQColor normalTextColor = m_pSettings->normalTextColor();
562 setItemColor( normalTextColor );
566 TQColor itemTextBg = m_pSettings->itemTextBackground();
567 if ( itemTextBg.isValid() )
568 setItemTextBackground( itemTextBg );
570 setItemTextBackground( Qt::NoBrush );
573 bool on = m_pSettings->showFileTips() && TQToolTip::isGloballyEnabled();
574 d->pFileTip->setOptions(on,
575 m_pSettings->showPreviewsInFileTips(),
576 m_pSettings->numFileTips());
579 setShowToolTips(!on);
582 TQFont font( m_pSettings->standardFont() );
584 font.setUnderline( m_pSettings->underlineLink() );
586 if ( font != KonqIconViewWidget::font() )
597 setIconTextHeight( m_pSettings->iconTextHeight() );
599 if ( (itemTextPos() == TQIconView::Right) && (maxItemWidth() !=
gridXValue()) )
605 else if ( d->bBoostPreview != boostPreview() )
612 bool KonqIconViewWidget::boostPreview()
const 614 if ( m_bDesktop )
return false;
616 TDEConfigGroup group( TDEGlobal::config(),
"PreviewSettings" );
617 return group.readBoolEntry(
"BoostSize",
false );
620 void KonqIconViewWidget::disableSoundPreviews()
622 d->bSoundPreviews =
false;
625 d->pSoundPlayer->stop();
627 if (d->pSoundTimer && d->pSoundTimer->isActive())
628 d->pSoundTimer->stop();
634 bool sizeChanged = (m_size != size);
635 int oldGridX = gridX();
639 bool boost = boostPreview();
640 bool previewSizeChanged = ( d->bBoostPreview != boost );
641 d->bBoostPreview = boost;
643 if ( sizeChanged || previewSizeChanged )
645 int realSize = size ? size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
647 setSpacing( ( m_bDesktop || ( realSize > TDEIcon::SizeSmall ) ) ?
648 TQMAX( d->min_grid_spacing, TQFontMetrics(font()).width(
'n') ) : 0 );
652 if ( sizeChanged || previewSizeChanged || !stopImagePreviewFor.isEmpty() )
656 bool stopAll = !stopImagePreviewFor.isEmpty() && stopImagePreviewFor.first() ==
"*";
662 bool prevUpdatesState = viewport()->isUpdatesEnabled();
663 viewport()->setUpdatesEnabled(
false );
666 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() ) {
672 previewSizeChanged ||
674 mimeTypeMatch( ivi->
item()->mimetype(), stopImagePreviewFor ) )
683 viewport()->setUpdatesEnabled( prevUpdatesState );
685 if ( ( sizeChanged || previewSizeChanged || oldGridX != gridX() ||
686 !stopImagePreviewFor.isEmpty() ) && autoArrange() )
687 arrangeItemsInGrid(
true );
689 viewport()->update();
692 bool KonqIconViewWidget::mimeTypeMatch(
const TQString& mimeType,
const TQStringList& mimeList )
const 695 KMimeType::Ptr mime = KMimeType::mimeType( mimeType );
696 for (TQStringList::ConstIterator mt = mimeList.begin(); mt != mimeList.end(); ++mt)
698 if ( mime->is( *mt ) )
701 TQString tmp( mimeType );
702 if ( (*mt).endsWith(
"*") && tmp.replace(TQRegExp(
"/.*"),
"/*") == (*mt) )
704 if ( (*mt) ==
"text/plain" )
706 TQVariant textProperty = mime->property(
"X-TDE-text" );
707 if ( textProperty.type() == TQVariant::Bool && textProperty.toBool() )
717 int sz = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
720 if ( pos == TQIconView::Bottom ) {
721 setGridX( TQMAX( sz + 50, previewIconSize( sz ) + 13 ) );
725 setMaxItemWidth( TQMAX( sz, previewIconSize( sz ) ) + m_pSettings->iconTextWidth() );
730 TDEIconView::setItemTextPos( pos );
736 int previewSize = previewIconSize( m_size );
737 int iconSize = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
747 *dx = spacing() + TQMAX( TQMAX( iconSize, previewSize ), m_pSettings->iconTextWidth() );
748 int textHeight = iconTextHeight() * fontMetrics().height();
749 *dy = spacing() + TQMAX( iconSize, previewSize ) + 2 + textHeight + spacing();
753 if ( m_IconRect.isValid() ) {
754 *x = m_IconRect.left(); w = m_IconRect.width();
755 *y = m_IconRect.top(); h = m_IconRect.height();
758 *x = 0; w = viewport()->width();
759 *y = 0; h = viewport()->height();
778 kdDebug(1203) <<
"x=" << *x <<
" y=" << *y <<
" spacing=" << spacing() <<
" iconSize=" << iconSize
779 <<
" w=" << w <<
" h=" << h
780 <<
" nx=" << *nx <<
" ny=" << *ny
781 <<
" dx=" << *dx <<
" dy=" << *dy << endl;
784 void KonqIconViewWidget::calculateGridX()
787 if ( itemTextPos() == TQIconView::Bottom ) {
801 int sz = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
804 if ( itemTextPos() == TQIconView::Bottom )
805 newGridX = TQMAX( sz + 50, previewIconSize( sz ) + 13 );
807 newGridX = TQMAX( sz, previewIconSize( sz ) ) + m_pSettings->iconTextWidth();
815 updatePreviewMimeTypes();
816 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
817 (static_cast<KFileIVI *>( it ))->item()->refreshMimeType();
821 void KonqIconViewWidget::setURL(
const KURL &kurl )
826 d->pFileTip->setPreview( TDEGlobalSettings::showFilePreview(m_url) );
828 if ( m_url.isLocalFile() )
829 m_dotDirectoryPath = m_url.path(1).append(
".directory" );
831 m_dotDirectoryPath = TQString::null;
839 if ( !TDEGlobalSettings::showFilePreview( url() ) ) {
840 kdDebug(1203) <<
"Previews disabled for protocol " << url().protocol() << endl;
841 emit imagePreviewFinished();
845 if ((d->bSoundPreviews = d->previewSettings.contains(
"audio/" )) &&
848 KLibFactory *factory = KLibLoader::self()->factory(
"konq_sound");
850 d->pSoundPlayer =
static_cast<KonqSoundPlayer *
>(
851 factory->create(TQT_TQOBJECT(
this), 0,
"KonqSoundPlayer"));
852 d->bSoundPreviews = (d->pSoundPlayer != 0L);
856 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
857 if ( force || !static_cast<KFileIVI *>( it )->hasValidThumbnail() )
858 items.append( static_cast<KFileIVI *>( it )->item() );
860 bool onlyAudio =
true;
861 for ( TQStringList::ConstIterator it = d->previewSettings.begin(); it != d->previewSettings.end(); ++it ) {
862 if ( (*it).startsWith(
"audio/" ) )
863 d->bSoundPreviews =
true;
868 if ( items.isEmpty() || onlyAudio ) {
869 emit imagePreviewFinished();
873 int iconSize = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
876 d->bBoostPreview = boostPreview();
877 size = previewIconSize( iconSize );
879 if ( !d->bBoostPreview )
882 d->pPreviewJob = TDEIO::filePreview( items, size, size, iconSize,
883 m_pSettings->textPreviewIconTransparency(),
true ,
884 true , &(d->previewSettings) );
885 connect( d->pPreviewJob, TQT_SIGNAL( gotPreview(
const KFileItem *,
const TQPixmap & ) ),
886 this, TQT_SLOT( slotPreview(
const KFileItem *,
const TQPixmap & ) ) );
887 connect( d->pPreviewJob, TQT_SIGNAL( result( TDEIO::Job * ) ),
888 this, TQT_SLOT( slotPreviewResult() ) );
891 void KonqIconViewWidget::stopImagePreview()
895 d->pPreviewJob->kill();
902 bool KonqIconViewWidget::isPreviewRunning()
const 904 return d->pPreviewJob;
909 KFileItemList lstItems;
911 TQIconViewItem *it = firstItem();
912 for (; it; it = it->nextItem() )
913 if ( it->isVisible() && it->isSelected() ) {
914 KFileItem *fItem = (
static_cast<KFileIVI *
>(it))->item();
915 lstItems.append( fItem );
920 void KonqIconViewWidget::slotDropped( TQDropEvent *ev,
const TQValueList<TQIconDragItem> & )
926 dirURL = m_rootItem->mostLocalURL(dummy);
931 void KonqIconViewWidget::slotAboutToCreate(
const TQPoint &,
const TQValueList<TDEIO::CopyInfo> &)
936 void KonqIconViewWidget::drawBackground( TQPainter *p,
const TQRect &r )
938 drawBackground(p, r, r.topLeft());
941 void KonqIconViewWidget::drawBackground( TQPainter *p,
const TQRect &r ,
const TQPoint &pt)
943 const TQPixmap *pm = backgroundPixmap();
944 bool hasPixmap = pm && !pm->isNull();
946 pm = viewport()->backgroundPixmap();
947 hasPixmap = pm && !pm->isNull();
951 rtgt.moveTopLeft(pt);
952 if (!hasPixmap && backgroundMode() != NoBackground) {
953 p->fillRect(rtgt, viewport()->backgroundColor());
958 int ax = (r.x() + contentsX() + leftMargin()) % pm->width();
959 int ay = (r.y() + contentsY() + topMargin()) % pm->height();
960 p->drawTiledPixmap(rtgt, *pm, TQPoint(ax, ay));
964 TQDragObject * KonqIconViewWidget::dragObject()
966 if ( !currentItem() )
969 return konqDragObject( viewport() );
972 KonqIconDrag * KonqIconViewWidget::konqDragObject( TQWidget * dragSource )
977 TQIconViewItem *primaryItem = currentItem();
979 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() ) {
980 if ( it->isVisible() && it->isSelected() ) {
983 KFileItem* fileItem = (
static_cast<KFileIVI *
>(it))->item();
984 KURL url = fileItem->url();
986 KURL mostLocalURL = fileItem->mostLocalURL(dummy);
987 TQString itemURL = KURLDrag::urlToString(url);
988 kdDebug(1203) <<
"itemURL=" << itemURL << endl;
990 id.setData( TQCString(itemURL.latin1()) );
992 TQRect( it->pixmapRect(
false).topLeft() - m_mousePos,
993 it->pixmapRect().size() ),
994 TQRect( it->textRect(
false).topLeft() - m_mousePos,
995 it->textRect().size() ),
996 itemURL, mostLocalURL );
1001 drag->setPixmap( *primaryItem->pixmap(), m_mousePos - primaryItem->pixmapRect(
false).topLeft() );
1006 void KonqIconViewWidget::contentsDragEnterEvent( TQDragEnterEvent *e )
1008 if ( e->provides(
"text/uri-list" ) )
1010 TQByteArray payload = e->encodedData(
"text/uri-list" );
1011 if ( !payload.size() )
1012 kdError() <<
"Empty data !" << endl;
1015 bool ok = KURLDrag::decode( e, m_lstDragURLs );
1017 kdError() <<
"Couldn't decode urls dragged !" << endl;
1021 if ( KURLDrag::decode(e, uriList) )
1023 if ( uriList.first().protocol() ==
"programs" )
1027 d->bProgramsURLdrag =
true;
1032 TDEIconView::contentsDragEnterEvent( e );
1036 void KonqIconViewWidget::contentsDragMoveEvent( TQDragMoveEvent *e )
1038 if ( d->bProgramsURLdrag ) {
1039 emit dragMove(
false );
1041 cancelPendingHeldSignal();
1045 TQIconViewItem *item = findItem( e->pos() );
1046 if ( e->source() != viewport() &&
1047 !item && m_rootItem && !m_rootItem->isWritable() ) {
1048 emit dragMove(
false );
1050 cancelPendingHeldSignal();
1053 emit dragMove(
true );
1054 TDEIconView::contentsDragMoveEvent( e );
1057 void KonqIconViewWidget::contentsDragLeaveEvent( TQDragLeaveEvent *e )
1059 d->bProgramsURLdrag =
false;
1060 TDEIconView::contentsDragLeaveEvent(e);
1065 void KonqIconViewWidget::setItemColor(
const TQColor &c )
1070 TQColor KonqIconViewWidget::itemColor()
const 1075 void KonqIconViewWidget::disableIcons(
const KURL::List & lst )
1077 for ( TQIconViewItem *kit = firstItem(); kit; kit = kit->nextItem() )
1079 bool bFound =
false;
1082 for (KURL::List::ConstIterator it = lst.begin(); !bFound && it != lst.end(); ++it)
1084 if ( static_cast<KFileIVI *>( kit )->item()->url() == *it )
1090 static_cast<KFileIVI *
>( kit )->setDisabled( bFound );
1100 bool bInTrash =
false;
1103 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
1105 if ( it->isVisible() && it->isSelected() )
1110 KFileItem *item = (
static_cast<KFileIVI *
>( it ) )->
item();
1111 KURL url = item->url();
1112 TQString local_path = item->localPath();
1114 if ( url.directory(
false) == TDEGlobalSettings::trashPath() ) {
1117 if ( KProtocolInfo::supportsDeleting( url ) ) {
1120 if ( !local_path.isEmpty() ) {
1128 emit
enableAction(
"trash", canDel > 0 && !bInTrash && canTrash==canDel );
1132 emit
enableAction(
"rename", ( iCount == 1) && !bInTrash );
1135 void KonqIconViewWidget::renameCurrentItem()
1137 if ( currentItem() )
1138 currentItem()->rename();
1141 void KonqIconViewWidget::renameSelectedItem()
1143 kdDebug(1203) <<
" -- KonqIconViewWidget::renameSelectedItem() -- " << endl;
1144 TQIconViewItem * item = 0L;
1145 TQIconViewItem *it = firstItem();
1146 for (; it; it = it->nextItem() )
1147 if ( it->isVisible() && it->isSelected() && !item )
1160 void KonqIconViewWidget::cutSelection()
1162 kdDebug(1203) <<
" -- KonqIconViewWidget::cutSelection() -- " << endl;
1163 KonqIconDrag * obj = konqDragObject( );
1164 obj->setMoveSelection(
true );
1165 TQApplication::clipboard()->setData( obj );
1168 void KonqIconViewWidget::copySelection()
1170 kdDebug(1203) <<
" -- KonqIconViewWidget::copySelection() -- " << endl;
1171 KonqIconDrag * obj = konqDragObject( );
1172 TQApplication::clipboard()->setData( obj );
1175 void KonqIconViewWidget::pasteSelection()
1180 void KonqIconViewWidget::paste(
const KURL &url )
1185 KURL::List KonqIconViewWidget::selectedUrls()
1187 return selectedUrls( UserVisibleUrls );
1190 KURL::List KonqIconViewWidget::selectedUrls( UrlFlags flags )
const 1194 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
1195 if ( it->isVisible() && it->isSelected() ) {
1196 KFileItem* item = (
static_cast<KFileIVI *
>( it ))->
item();
1197 lstURLs.append( flags == MostLocalUrls ? item->mostLocalURL( dummy ) : item->url() );
1214 return m_LineupMode;
1219 m_LineupMode = mode;
1222 bool KonqIconViewWidget::sortDirectoriesFirst()
const 1224 return m_bSortDirsFirst;
1227 void KonqIconViewWidget::setSortDirectoriesFirst(
bool b )
1229 m_bSortDirsFirst = b;
1232 void KonqIconViewWidget::contentsMouseMoveEvent( TQMouseEvent *e )
1234 if ( (d->pSoundPlayer && d->pSoundPlayer->isPlaying()) || (d->pSoundTimer && d->pSoundTimer->isActive()))
1239 if ( TQApplication::widgetAt( TQCursor::pos() ) != topLevelWidget() )
1241 if (d->pSoundPlayer)
1242 d->pSoundPlayer->stop();
1244 if (d->pSoundTimer && d->pSoundTimer->isActive())
1245 d->pSoundTimer->stop();
1248 d->renameItem=
false;
1249 TDEIconView::contentsMouseMoveEvent( e );
1252 void KonqIconViewWidget::contentsDropEvent( TQDropEvent * ev )
1254 TQIconViewItem *i = findItem( ev->pos() );
1257 if ( ev->source() != viewport() &&
1258 !i && m_rootItem && !m_rootItem->isWritable() ) {
1259 ev->accept(
false );
1265 if ( !i && (ev->action() == TQDropEvent::Copy || ev->action() == TQDropEvent::Link)
1266 && ev->source() && ev->source() == viewport()
1267 && KURLDrag::decode(ev, uriList) && !uriList.isEmpty()
1268 && uriList.first().upURL().url(1) == url().url(1))
1271 bool bMovable = itemsMovable();
1272 setItemsMovable(
false);
1273 TDEIconView::contentsDropEvent( ev );
1274 setItemsMovable(bMovable);
1276 TQValueList<TQIconDragItem> lst;
1277 slotDropped(ev, lst);
1281 TDEIconView::contentsDropEvent( ev );
1295 void KonqIconViewWidget::doubleClickTimeout()
1297 d->renameItem=
true;
1298 mousePressChangeValue();
1299 if ( d->releaseMouseEvent )
1301 TQMouseEvent e( TQEvent::MouseButtonPress,d->mousePos , 1, d->mouseState);
1302 TQIconViewItem* item = findItem( e.pos() );
1306 url= (
static_cast<KFileIVI *
>( item ) )->item()->url();
1307 bool brenameTrash =
false;
1308 if ( url.isLocalFile() && (url.directory(
false) == TDEGlobalSettings::trashPath() || url.path(1).startsWith(TDEGlobalSettings::trashPath())))
1309 brenameTrash =
true;
1311 if ( url.isLocalFile() && !brenameTrash && d->renameItem && m_pSettings->renameIconDirectly() && e.button() == Qt::LeftButton && item->textRect(
false ).contains(e.pos()))
1313 if( d->pActivateDoubleClick->isActive () )
1314 d->pActivateDoubleClick->stop();
1316 m_bMousePressed =
false;
1322 TQMouseEvent e( TQEvent::MouseMove,d->mousePos , 1, d->mouseState);
1323 TDEIconView::contentsMousePressEvent( &e );
1325 if( d->pActivateDoubleClick->isActive() )
1326 d->pActivateDoubleClick->stop();
1328 d->releaseMouseEvent =
false;
1329 d->renameItem=
false;
1332 void KonqIconViewWidget::wheelEvent(TQWheelEvent* e)
1335 d->pFileTip->setItem( 0 );
1337 if (e->state() == ControlButton)
1339 if (e->delta() >= 0)
1351 TDEIconView::wheelEvent(e);
1354 void KonqIconViewWidget::leaveEvent( TQEvent *e )
1359 TDEIconView::leaveEvent(e);
1362 void KonqIconViewWidget::mousePressChangeValue()
1365 m_bMousePressed =
true;
1366 if (d->pSoundPlayer)
1367 d->pSoundPlayer->stop();
1368 d->bSoundItemClicked =
true;
1369 d->firstClick =
false;
1373 d->pFileTip->setItem( 0 );
1376 void KonqIconViewWidget::contentsMousePressEvent( TQMouseEvent *e )
1378 if(d->pActivateDoubleClick && d->pActivateDoubleClick->isActive ())
1379 d->pActivateDoubleClick->stop();
1380 TQIconViewItem* item = findItem( e->pos() );
1381 m_mousePos = e->pos();
1385 url = (
static_cast<KFileIVI *
>( item ) )->item()->url();
1386 bool brenameTrash =
false;
1387 if ( url.isLocalFile() && (url.directory(
false) == TDEGlobalSettings::trashPath() || url.path(1).startsWith(TDEGlobalSettings::trashPath())))
1388 brenameTrash =
true;
1389 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))
1391 d->firstClick =
true;
1392 d->mousePos = e->pos();
1393 d->mouseState = e->state();
1394 if (!d->pActivateDoubleClick)
1396 d->pActivateDoubleClick =
new TQTimer(
this);
1397 connect(d->pActivateDoubleClick, TQT_SIGNAL(timeout()),
this, TQT_SLOT(doubleClickTimeout()));
1399 if( d->pActivateDoubleClick->isActive () )
1400 d->pActivateDoubleClick->stop();
1402 d->pActivateDoubleClick->start(TQApplication::doubleClickInterval());
1403 d->releaseMouseEvent =
false;
1407 d->renameItem=
false;
1410 d->renameItem=
false;
1411 mousePressChangeValue();
1412 if(d->pActivateDoubleClick && d->pActivateDoubleClick->isActive())
1413 d->pActivateDoubleClick->stop();
1414 TDEIconView::contentsMousePressEvent( e );
1418 void KonqIconViewWidget::contentsMouseReleaseEvent( TQMouseEvent *e )
1420 TDEIconView::contentsMouseReleaseEvent( e );
1421 if(d->releaseMouseEvent && d->pActivateDoubleClick && d->pActivateDoubleClick->isActive ())
1422 d->pActivateDoubleClick->stop();
1424 d->releaseMouseEvent =
true;
1425 m_bMousePressed =
false;
1428 void KonqIconViewWidget::slotSaveIconPositions()
1437 printf(
"WARNING: Strongly deprecated method KonqIconViewWidget::slotSaveIconPositions() called!\n"); fflush(stdout);
1439 if ( m_dotDirectoryPath.isEmpty() )
1443 kdDebug(1214) <<
"KonqIconViewWidget::slotSaveIconPositions" << endl;
1444 KSimpleConfig dotDirectory( m_dotDirectoryPath );
1445 TQIconViewItem *it = firstItem();
1451 KFileItem *item = ivi->
item();
1453 dotDirectory.setGroup( TQString( m_iconPositionGroupPrefix ).append( item->url().fileName() ) );
1454 kdDebug(1214) <<
"KonqIconViewWidget::slotSaveIconPositions " << item->url().fileName() <<
" " << it->x() <<
" " << it->y() << endl;
1455 dotDirectory.writeEntry( TQString(
"X %1" ).arg( width() ), it->x() );
1456 dotDirectory.writeEntry( TQString(
"Y %1" ).arg( height() ), it->y() );
1457 dotDirectory.writeEntry(
"Exists",
true );
1459 it = it->nextItem();
1462 TQStringList groups = dotDirectory.groupList();
1463 TQStringList::ConstIterator gIt = groups.begin();
1464 TQStringList::ConstIterator gEnd = groups.end();
1465 for (; gIt != gEnd; ++gIt )
1466 if ( (*gIt).left( m_iconPositionGroupPrefix.length() ) == m_iconPositionGroupPrefix )
1468 dotDirectory.setGroup( *gIt );
1469 if ( dotDirectory.hasKey(
"Exists" ) )
1470 dotDirectory.deleteEntry(
"Exists",
false );
1473 kdDebug(1214) <<
"KonqIconViewWidget::slotSaveIconPositions deleting group " << *gIt << endl;
1474 dotDirectory.deleteGroup( *gIt );
1478 dotDirectory.sync();
1496 if (!m_IconRect.isValid())
1498 TDEIconView::insertInGrid(item);
1502 TQRegion r(m_IconRect);
1503 TQIconViewItem *i = firstItem();
1505 for (; i; i = i->nextItem() )
1507 r = r.subtract(i->rect());
1508 y = TQMAX(y, i->y() + i->height());
1511 TQMemArray<TQRect> rects = r.rects();
1512 TQMemArray<TQRect>::Iterator it = rects.begin();
1513 bool foundPlace = FALSE;
1514 for (; it != rects.end(); ++it)
1517 if (rect.width() >= item->width() && rect.height() >= item->height())
1520 if (rect.width() >= item->width() + spacing())
1522 if (rect.height() >= item->height() + spacing())
1524 item->move(rect.x() + sx, rect.y() + sy);
1531 item->move(m_IconRect.topLeft());
1574 int x0, y0, dx, dy, nx, ny;
1577 int itemWidth = dx - spacing();
1578 bool newItemWidth =
false;
1579 if ( maxItemWidth() != itemWidth ) {
1580 newItemWidth =
true;
1581 setMaxItemWidth( itemWidth );
1585 if ( !firstItem() ) {
1586 kdDebug(1203) <<
"No icons at all ?\n";
1590 int iconSize = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
1592 typedef TQValueList<TQIconViewItem*> Bin;
1593 Bin*** bins =
new Bin**[nx];
1596 for ( i = 0; i < nx ; i++ ) {
1597 bins[i] =
new Bin*[ny];
1598 for ( j = 0; j < ny; j++ )
1603 int textHeight = iconTextHeight() * fontMetrics().height();
1605 for ( TQIconViewItem* item = firstItem(); item; item = item->nextItem() ) {
1606 int x = item->x() + item->width() / 2 - x0;
1607 int y = item->pixmapRect(
false ).bottom() - iconSize / 2
1608 - ( dy - ( iconSize + textHeight ) ) / 2 - y0;
1609 int posX = TQMIN( nx-1, TQMAX( 0, x / dx ) );
1610 int posY = TQMIN( ny-1, TQMAX( 0, y / dy ) );
1612 if ( !bins[posX][posY] )
1613 bins[posX][posY] =
new Bin;
1614 bins[posX][posY]->prepend( item );
1619 const int infinity = 10000;
1621 for ( n = 0; n < 30 && nmoves > 0; n++ ) {
1623 for ( i = 0; i < nx; i++ ) {
1624 for ( j = 0; j < ny; j++ ) {
1625 if ( !bins[i][j] || ( bins[i][j]->count() <= 1 ) )
1629 int tf = 0, bf = 0, lf = 0, rf = 0;
1630 for ( k = j-1; k >= 0 && bins[i][k] && bins[i][k]->count(); k-- )
1631 tf += bins[i][k]->count();
1635 for ( k = j+1; k < ny && bins[i][k] && bins[i][k]->count(); k++ )
1636 bf += bins[i][k]->count();
1640 for ( k = i-1; k >= 0 && bins[k][j] && bins[k][j]->count(); k-- )
1641 lf += bins[k][j]->count();
1645 for ( k = i+1; k < nx && bins[k][j] && bins[k][j]->count(); k++ )
1646 rf += bins[k][j]->count();
1651 if ( tf >= infinity && bf >= infinity &&
1652 lf >= infinity && rf >= infinity )
1656 if ( m_LineupMode == LineupHorizontal ) {
1660 else if ( m_LineupMode == LineupVertical ) {
1666 TQIconViewItem* movedItem;
1667 Bin* items = bins[i][j];
1669 int mini = TQMIN( TQMIN( tf, bf ), TQMIN( lf, rf ) );
1672 Bin::iterator it = items->begin();
1674 for ( ++it; it != items->end(); ++it ) {
1675 if ( (*it)->y() < movedItem->y() )
1678 items->remove( movedItem );
1679 if ( !bins[i][j-1] )
1680 bins[i][j-1] =
new Bin;
1681 bins[i][j-1]->prepend( movedItem );
1683 else if ( bf ==mini ) {
1685 Bin::iterator it = items->begin();
1687 for ( ++it; it != items->end(); ++it ) {
1688 if ( (*it)->y() > movedItem->y() )
1691 items->remove( movedItem );
1692 if ( !bins[i][j+1] )
1693 bins[i][j+1] =
new Bin;
1694 bins[i][j+1]->prepend( movedItem );
1696 else if ( lf == mini )
1699 Bin::iterator it = items->begin();
1701 for ( ++it; it != items->end(); ++it ) {
1702 if ( (*it)->x() < movedItem->x() )
1705 items->remove( movedItem );
1706 if ( !bins[i-1][j] )
1707 bins[i-1][j] =
new Bin;
1708 bins[i-1][j]->prepend( movedItem );
1712 Bin::iterator it = items->begin();
1714 for ( ++it; it != items->end(); ++it ) {
1715 if ( (*it)->x() > movedItem->x() )
1718 items->remove( movedItem );
1719 if ( !bins[i+1][j] )
1720 bins[i+1][j] =
new Bin;
1721 bins[i+1][j]->prepend( movedItem );
1729 TQRegion repaintRegion;
1730 TQValueList<TQIconViewItem*> movedItems;
1732 for ( i = 0; i < nx; i++ ) {
1733 for ( j = 0; j < ny; j++ ) {
1734 Bin* bin = bins[i][j];
1737 if ( !bin->isEmpty() ) {
1738 TQIconViewItem* item = bin->first();
1739 int newX = x0 + i*dx + spacing() +
1740 TQMAX(0, ( (dx-spacing()) - item->width() ) / 2);
1742 int newY = y0 + j*dy + dy - spacing() - ( item->pixmapRect().bottom() + 2 + textHeight );
1743 if ( item->x() != newX || item->y() != newY ) {
1744 TQRect oldRect = item->rect();
1745 movedItems.prepend( item );
1746 item->move( newX, newY );
1747 if ( item->rect() != oldRect )
1748 repaintRegion = repaintRegion.unite( oldRect );
1762 TQMemArray<TQRect> rects = repaintRegion.rects();
1763 for ( uint l = 0; l < rects.count(); l++ ) {
1764 kdDebug( 1203 ) <<
"Repainting (" << rects[l].x() <<
"," 1765 << rects[l].y() <<
")\n";
1766 repaintContents( rects[l],
false );
1769 while ( !movedItems.isEmpty() ) {
1770 repaintItem( movedItems.first() );
1771 movedItems.remove( movedItems.first() );
1775 for ( i = 0; i < nx ; i++ ) {
1783 int x0, y0, dx, dy, nxmax, nymax;
1784 gridValues( &x0, &y0, &dx, &dy, &nxmax, &nymax );
1785 int textHeight = iconTextHeight() * fontMetrics().height();
1787 TQRegion repaintRegion;
1788 TQValueList<TQIconViewItem*> movedItems;
1791 TQIconViewItem* item;
1792 for ( item = firstItem(); item; item = item->nextItem() ) {
1793 int newX = x0 + nx*dx + spacing() +
1794 TQMAX(0, ( (dx-spacing()) - item->width() ) / 2);
1796 int newY = y0 + ny*dy + dy - spacing() - ( item->pixmapRect().bottom() + 2 + textHeight );
1797 if ( item->x() != newX || item->y() != newY ) {
1798 TQRect oldRect = item->rect();
1799 movedItems.prepend( item );
1800 item->move( newX, newY );
1801 if ( item->rect() != oldRect )
1802 repaintRegion = repaintRegion.unite( oldRect );
1804 if ( arrangement == TQIconView::LeftToRight ) {
1806 if ( nx >= nxmax ) {
1813 if ( ny >= nymax ) {
1821 TQMemArray<TQRect> rects = repaintRegion.rects();
1822 for ( uint l = 0; l < rects.count(); l++ ) {
1823 kdDebug( 1203 ) <<
"Repainting (" << rects[l].x() <<
"," 1824 << rects[l].y() <<
")\n";
1825 repaintContents( rects[l],
false );
1828 while ( !movedItems.isEmpty() ) {
1829 repaintItem( movedItems.first() );
1830 movedItems.remove( movedItems.first() );
1834 int KonqIconViewWidget::largestPreviewIconSize(
int size )
const 1836 int iconSize = size ? size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
1850 int KonqIconViewWidget::previewIconSize(
int size )
const 1852 int iconSize = size ? size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
1854 if (!d->bBoostPreview)
1857 return largestPreviewIconSize( iconSize );
1863 TQRect irect = item->rect();
1866 TQRect rect = item->pixmapRect();
1870 rect.moveBy(irect.x(), irect.y());
1873 rect.moveBy( -contentsX(), -contentsY() );
1875 if (TDEGlobalSettings::showKonqIconActivationEffect() ==
true) {
1876 TDEIconEffect::visualActivate(viewport(), rect, item->pixmap());
1880 void KonqIconViewWidget::backgroundPixmapChange(
const TQPixmap & )
1882 viewport()->update();
1885 void KonqIconViewWidget::setPreviewSettings(
const TQStringList& settings )
1887 d->previewSettings = settings;
1888 updatePreviewMimeTypes();
1895 const TQStringList& KonqIconViewWidget::previewSettings()
1897 return d->previewSettings;
1900 void KonqIconViewWidget::setNewURL(
const TQString& url )
1903 if ( url.startsWith(
"/" ) )
1910 void KonqIconViewWidget::setCaseInsensitiveSort(
bool b )
1912 d->bCaseInsensitive = b;
1915 bool KonqIconViewWidget::caseInsensitiveSort()
const 1917 return d->bCaseInsensitive;
1920 bool KonqIconViewWidget::canPreview( KFileItem* item )
1922 if ( !TDEGlobalSettings::showFilePreview( url() ) )
1925 if ( d->pPreviewMimeTypes == 0L )
1926 updatePreviewMimeTypes();
1928 return mimeTypeMatch( item->mimetype(), *( d->pPreviewMimeTypes ) );
1931 void KonqIconViewWidget::updatePreviewMimeTypes()
1933 if ( d->pPreviewMimeTypes == 0L )
1934 d->pPreviewMimeTypes =
new TQStringList;
1936 d->pPreviewMimeTypes->clear();
1939 TDETrader::OfferList plugins = TDETrader::self()->query(
"ThumbCreator");
1940 TDETrader::OfferList::ConstIterator it;
1942 for ( it = plugins.begin(); it != plugins.end(); ++it ) {
1943 if ( d->previewSettings.contains((*it)->desktopEntryName()) ) {
1944 TQStringList mimeTypes = (*it)->property(
"MimeTypes").toStringList();
1945 for (TQStringList::ConstIterator mt = mimeTypes.begin(); mt != mimeTypes.end(); ++mt)
1946 d->pPreviewMimeTypes->append(*mt);
1951 #include "konq_iconviewwidget.moc" KFileIVI (short form of "Konq - File - IconViewItem") is, as expected, an improved TDEIconViewItem...
Clipboard/dnd data for: Icons + URLs + MostLocal URLs + isCut KDE4: merge with KonqIconDrag.
static void rename(TQWidget *parent, const KURL &oldurl, const TQString &name)
Do a renaming.
void invalidateThumb(int state, bool redraw=false)
Notifies that all icon effects on thumbs should be invalidated, e.g.
void setThumbnailPixmap(const TQPixmap &pixmap)
Set this when the thumbnail was loaded.
static KonqFMSettings * settings()
The static instance of KonqFMSettings.
static void doDrop(const KFileItem *destItem, const KURL &destURL, TQDropEvent *ev, TQWidget *parent)
Drop.
int state() const
Return the current state of the icon (TDEIcon::DefaultState, TDEIcon::ActiveState etc...
virtual void setIcon(int size, int state=TDEIcon::DefaultState, bool recalc=false, bool redraw=false)
Changes the icon for this item.
static void doPaste(TQWidget *parent, const KURL &destURL, const TQPoint &pos)
Paste the clipboard contents.