20#include "konq_iconviewwidget.h"
21#include "konq_operations.h"
23#include "konq_sound.h"
24#include "konq_filetip.h"
26#include <tqclipboard.h>
36#include <tdeapplication.h>
38#include <tdeio/previewjob.h>
39#include <tdefileivi.h>
40#include <konq_settings.h>
42#include <tdeglobalsettings.h>
43#include <kpropertiesdialog.h>
45#include <kicontheme.h>
46#include <kiconeffect.h>
48#include <tdestandarddirs.h>
49#include <kprotocolinfo.h>
57struct KonqIconViewWidgetPrivate
59 KonqIconViewWidgetPrivate() {
62 bSoundPreviews =
false;
64 bSoundItemClicked =
false;
68 bAllowSetWallpaper =
false;
74 pActivateDoubleClick = 0L;
75 bCaseInsensitive =
true;
76 pPreviewMimeTypes = 0L;
77 bProgramsURLdrag =
false;
79 ~KonqIconViewWidgetPrivate() {
84 delete pActivateDoubleClick;
85 delete pPreviewMimeTypes;
92 KonqSoundPlayer *pSoundPlayer;
95 bool bSoundItemClicked;
96 bool bAllowSetWallpaper;
97 bool bCaseInsensitive;
104 TQString movieFileName;
106 TDEIO::PreviewJob *pPreviewJob;
107 KonqFileTip* pFileTip;
108 TQStringList previewSettings;
111 bool releaseMouseEvent;
114 TQTimer *pActivateDoubleClick;
115 TQStringList* pPreviewMimeTypes;
116 bool bProgramsURLdrag;
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, TQ_SIGNAL( dropped( TQDropEvent *,
const TQValueList<TQIconDragItem> & ) ),
127 this, TQ_SLOT( slotDropped( TQDropEvent*,
const TQValueList<TQIconDragItem> & ) ) );
129 connect(
this, TQ_SIGNAL( selectionChanged() ),
132 tdeApp->addKipcEventMask( KIPC::IconChanged );
133 connect( tdeApp, TQ_SIGNAL(iconChanged(
int)), TQ_SLOT(slotIconChanged(
int)) );
134 connect(
this, TQ_SIGNAL(onItem(TQIconViewItem *)), TQ_SLOT(slotOnItem(TQIconViewItem *)) );
135 connect(
this, TQ_SIGNAL(onViewport()), TQ_SLOT(slotOnViewport()) );
136 connect(
this, TQ_SIGNAL(itemRenamed(TQIconViewItem *,
const TQString &)), TQ_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();
151 m_bSortDirsFirst =
true;
152 m_bMousePressed =
false;
153 m_LineupMode = LineupBoth;
156 m_iconPositionGroupPrefix = TQString::fromLatin1(
"IconPosition::" );
157 KonqUndoManager::incRef();
160KonqIconViewWidget::~KonqIconViewWidget()
163 KonqUndoManager::decRef();
167bool KonqIconViewWidget::maySetWallpaper()
169 return d->bAllowSetWallpaper;
172void KonqIconViewWidget::setMaySetWallpaper(
bool b)
174 d->bAllowSetWallpaper = b;
182 m_bMousePressed =
false;
191 TDEIconView::focusOutEvent( ev );
194bool KonqIconViewWidget::isRenaming()
const
196 return d->pRenamingItem && d->pRenamingItem->m_renameBox;
199const KFileIVI* KonqIconViewWidget::renamingItem()
201 return d->pRenamingItem;
204void KonqIconViewWidget::setRenamingItem(
KFileIVI *theItem)
206 d->pRenamingItem = theItem;
209void KonqIconViewWidget::slotItemRenamed(TQIconViewItem *item,
const TQString &name)
211 kdDebug(1203) <<
"KonqIconViewWidget::slotItemRenamed" << endl;
213 KFileItem *fileItem = viewItem->
item();
218 viewItem->setText( fileItem->text() );
219 kdDebug(1203)<<
" fileItem->text() ;"<<fileItem->text()<<endl;
221 if( !name.isEmpty() )
224 KURL oldurl( fileItem->url() );
225 KURL newurl( oldurl );
226 newurl.setPath( newurl.directory(
false) + TDEIO::encodeFileName( name ) );
227 kdDebug(1203)<<
" newurl :"<<newurl<<endl;
233void KonqIconViewWidget::slotIconChanged(
int group )
235 if (group != TDEIcon::Desktop)
242 readAnimatedIconsConfig();
245void KonqIconViewWidget::readAnimatedIconsConfig()
247 TDEConfigGroup cfgGroup( TDEGlobal::config(),
"DesktopIcons" );
248 d->doAnimations = cfgGroup.readBoolEntry(
"Animated",
true );
251void KonqIconViewWidget::slotOnItem( TQIconViewItem *_item )
255 if( d->pActiveItem != 0L && d->pActiveItem != item )
257 if ( d->m_movie && d->pActiveItem->isAnimated() )
260 d->pActiveItem->setAnimated(
false );
261 d->pActiveItem->refreshIcon(
true );
264 d->pActiveItem->setActive(
false );
267 d->pFileTip->setItem( 0L );
271 if (d->pSoundPlayer != 0 && item != d->pSoundItem)
273 d->pSoundPlayer->stop();
276 if (d->pSoundTimer && d->pSoundTimer->isActive())
277 d->pSoundTimer->stop();
280 if ( !m_bMousePressed )
282 if( item != d->pActiveItem )
284 d->pActiveItem = item;
285 d->pFileTip->setItem( d->pActiveItem->item(),
289 if ( d->doAnimations && d->pActiveItem && d->pActiveItem->hasAnimation() )
294 if ( d->m_movie && d->movieFileName == d->pActiveItem->mouseOverAnimation() )
296 d->pActiveItem->setAnimated(
true );
297 if (d->m_movieBlocked) {
298 kdDebug(1203) <<
"onitem, but blocked" << endl;
302 kdDebug(1203) <<
"we go ahead.." << endl;
304 TQTimer::singleShot(300,
this, TQ_SLOT(slotReenableAnimation()));
305 d->m_movie->restart();
306 d->m_movie->unpause();
312 TQMovie movie = TDEGlobal::iconLoader()->loadMovie( d->pActiveItem->mouseOverAnimation(), TDEIcon::Desktop, d->pActiveItem->iconSize() );
313 if ( !movie.isNull() )
316 d->m_movie =
new TQMovie( movie );
319 const TQPixmap* pm = backgroundPixmap();
320 bool hasPixmap = pm && !pm->isNull();
322 pm = viewport()->backgroundPixmap();
323 hasPixmap = pm && !pm->isNull();
325 if (!hasPixmap && backgroundMode() != NoBackground)
326 d->m_movie->setBackgroundColor( viewport()->backgroundColor() );
327 d->m_movie->connectUpdate(
this, TQ_SLOT( slotMovieUpdate(
const TQRect &) ) );
328 d->m_movie->connectStatus(
this, TQ_SLOT( slotMovieStatus(
int) ) );
329 d->movieFileName = d->pActiveItem->mouseOverAnimation();
330 d->pActiveItem->setAnimated(
true );
334 d->pActiveItem->setAnimated(
false );
338 d->pActiveItem->setMouseOverAnimation( TQString::null );
343 if (d->pActiveItem && !d->pActiveItem->isAnimated())
345 d->pActiveItem->setActive(
true );
353 d->pFileTip->setItem( 0L );
361 d->pFileTip->setItem( 0L );
365 if (d->bSoundPreviews && d->pSoundPlayer &&
366 d->pSoundPlayer->mimeTypes().contains(
367 item->
item()->mimetype())
368 && TDEGlobalSettings::showFilePreview(item->
item()->url())
369 && topLevelWidget() == tdeApp->activeWindow())
371 d->pSoundItem = item;
372 d->bSoundItemClicked =
false;
375 d->pSoundTimer =
new TQTimer(
this);
376 connect(d->pSoundTimer, TQ_SIGNAL(timeout()), TQ_SLOT(slotStartSoundPreview()));
378 if (d->pSoundTimer->isActive())
379 d->pSoundTimer->stop();
380 d->pSoundTimer->start(500,
true);
385 d->pSoundPlayer->stop();
387 if (d->pSoundTimer && d->pSoundTimer->isActive())
388 d->pSoundTimer->stop();
392void KonqIconViewWidget::slotOnViewport()
394 d->pFileTip->setItem( 0L );
397 d->pSoundPlayer->stop();
399 if (d->pSoundTimer && d->pSoundTimer->isActive())
400 d->pSoundTimer->stop();
402 if (d->pActiveItem == 0L)
405 if ( d->doAnimations && d->m_movie && d->pActiveItem->isAnimated() )
407 d->pActiveItem->setAnimated(
false );
410 if (d->m_movie->running()) {
413 kdDebug(1203) <<
"on viewport, blocking" << endl;
414 TQTimer::singleShot(300,
this, TQ_SLOT(slotReenableAnimation()));
417 d->pActiveItem->refreshIcon(
true );
418 Q_ASSERT( d->pActiveItem->state() == TDEIcon::DefaultState );
425 d->pActiveItem->setActive(
false );
430void KonqIconViewWidget::slotStartSoundPreview()
432 if (!d->pSoundItem || d->bSoundItemClicked)
435 d->pSoundPlayer->play(d->pSoundItem->item()->url().url());
439void KonqIconViewWidget::slotPreview(
const KFileItem *item,
const TQPixmap &pix)
442 for (TQIconViewItem *it = firstItem(); it; it = it->nextItem())
445 if (current->
item() == item)
447 if (item->overlays() & TDEIcon::HiddenOverlay) {
450 TDEIconEffect::semiTransparent(p);
460void KonqIconViewWidget::slotPreviewResult()
463 emit imagePreviewFinished();
466void KonqIconViewWidget::slotToolTipPreview(
const KFileItem* ,
const TQPixmap &)
471void KonqIconViewWidget::slotToolTipPreviewResult()
476void KonqIconViewWidget::slotMovieUpdate(
const TQRect& rect )
480 Q_ASSERT( d->m_movie );
482 if ( d->pActiveItem && d->m_movie && d->pActiveItem->isAnimated() ) {
483 const TQPixmap &frame = d->m_movie->framePixmap();
486 int iconSize=d->pActiveItem->iconSize();
487 if (iconSize==0) iconSize = TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
488 if ( frame.width() != iconSize || frame.height() != iconSize ) {
489 d->pActiveItem->setAnimated(
false );
492 d->pActiveItem->setMouseOverAnimation( TQString::null );
493 d->pActiveItem->setActive(
true );
496 d->pActiveItem->setPixmapDirect( frame,
false,
false );
497 TQRect pixRect = d->pActiveItem->pixmapRect(
false);
498 repaintContents( pixRect.x() + rect.x(), pixRect.y() + rect.y(), rect.width(), rect.height(),
false );
502void KonqIconViewWidget::slotMovieStatus(
int status )
506 if ( d->pActiveItem && d->pActiveItem->isAnimated() ) {
507 d->pActiveItem->setAnimated(
false );
508 d->pActiveItem->setMouseOverAnimation( TQString::null );
509 d->pActiveItem->setActive(
true );
514void KonqIconViewWidget::slotReenableAnimation()
516 if (!--d->m_movieBlocked) {
517 if ( d->pActiveItem && d->m_movie && d->m_movie->paused()) {
518 kdDebug(1203) <<
"reenabled animation" << endl;
519 d->m_movie->restart();
520 d->m_movie->unpause();
527 d->pFileTip->setItem( 0L );
529 TDEIconView::clear();
535 if ( d->pActiveItem ==
static_cast<KFileIVI *
>(item) )
537 d->pFileTip->setItem( 0L );
541 if ( d->pPreviewJob )
542 d->pPreviewJob->removeItem(
static_cast<KFileIVI *
>(item)->item() );
544 TDEIconView::takeItem( item );
548void KonqIconViewWidget::setThumbnailPixmap(
KFileIVI * item,
const TQPixmap & pixmap )
552 if ( d->pActiveItem == item )
554 d->pFileTip->setItem( 0L );
558 if ( m_bSetGridX && item->width() > gridX() )
560 setGridX( item->width() );
562 arrangeItemsInGrid();
569 bool fontChanged =
false;
572 TQColor normalTextColor = m_pSettings->normalTextColor();
573 setItemColor( normalTextColor );
577 TQColor itemTextBg = m_pSettings->itemTextBackground();
578 if ( itemTextBg.isValid() )
579 setItemTextBackground( itemTextBg );
581 setItemTextBackground( TQt::NoBrush );
584 bool on = m_pSettings->showFileTips() && TQToolTip::isGloballyEnabled();
585 d->pFileTip->setOptions(on,
586 m_pSettings->showPreviewsInFileTips(),
587 m_pSettings->numFileTips());
590 setShowToolTips(!on);
593 TQFont font( m_pSettings->standardFont() );
595 font.setUnderline( m_pSettings->underlineLink() );
597 if ( font != KonqIconViewWidget::font() )
608 setIconTextHeight( m_pSettings->iconTextHeight() );
610 if ( (itemTextPos() == TQIconView::Right) && (maxItemWidth() !=
gridXValue()) )
616 else if ( d->bBoostPreview != boostPreview() )
623bool KonqIconViewWidget::boostPreview()
const
625 if ( m_bDesktop )
return false;
627 TDEConfigGroup group( TDEGlobal::config(),
"PreviewSettings" );
628 return group.readBoolEntry(
"BoostSize",
false );
631void KonqIconViewWidget::disableSoundPreviews()
633 d->bSoundPreviews =
false;
636 d->pSoundPlayer->stop();
638 if (d->pSoundTimer && d->pSoundTimer->isActive())
639 d->pSoundTimer->stop();
645 bool sizeChanged = (m_size != size);
646 int oldGridX = gridX();
650 bool boost = boostPreview();
651 bool previewSizeChanged = ( d->bBoostPreview != boost );
652 d->bBoostPreview = boost;
654 if ( sizeChanged || previewSizeChanged )
656 int realSize = size ? size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
658 setSpacing( ( m_bDesktop || ( realSize > TDEIcon::SizeSmall ) ) ?
659 TQMAX( spacing(), TQFontMetrics(font()).width(
'n') ) : 0 );
662 if ( sizeChanged || previewSizeChanged || !stopImagePreviewFor.isEmpty() )
666 bool stopAll = !stopImagePreviewFor.isEmpty() && stopImagePreviewFor.first() ==
"*";
672 bool prevUpdatesState = viewport()->isUpdatesEnabled();
673 viewport()->setUpdatesEnabled(
false );
676 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() ) {
682 previewSizeChanged ||
684 mimeTypeMatch( ivi->
item()->mimetype(), stopImagePreviewFor ) )
693 viewport()->setUpdatesEnabled( prevUpdatesState );
695 if ( ( sizeChanged || previewSizeChanged || oldGridX != gridX() ||
696 !stopImagePreviewFor.isEmpty() ) && autoArrange() )
697 arrangeItemsInGrid(
true );
699 viewport()->update();
702bool KonqIconViewWidget::mimeTypeMatch(
const TQString& mimeType,
const TQStringList& mimeList )
const
705 KMimeType::Ptr mime = KMimeType::mimeType( mimeType );
706 for (TQStringList::ConstIterator mt = mimeList.begin(); mt != mimeList.end(); ++mt)
708 if ( mime->is( *mt ) )
711 TQString tmp( mimeType );
712 if ( (*mt).endsWith(
"*") && tmp.replace(TQRegExp(
"/.*"),
"/*") == (*mt) )
714 if ( (*mt) ==
"text/plain" )
716 TQVariant textProperty = mime->property(
"X-TDE-text" );
717 if ( textProperty.type() == TQVariant::Bool && textProperty.toBool() )
727 int sz = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
730 if ( pos == TQIconView::Bottom ) {
731 setGridX( TQMAX( sz + 50, previewIconSize( sz ) + 13 ) );
735 setMaxItemWidth( TQMAX( sz, previewIconSize( sz ) ) + m_pSettings->iconTextWidth() );
740 TDEIconView::setItemTextPos( pos );
746 int previewSize = previewIconSize( m_size );
747 int iconSize = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
756 *dx = spacing() + TQMAX( TQMAX( iconSize, previewSize ), m_pSettings->iconTextWidth() );
757 int textHeight = iconTextHeight() * fontMetrics().height();
758 *dy = spacing() + TQMAX( iconSize, previewSize ) + 2 + textHeight + spacing();
762 if ( m_IconRect.isValid() ) {
763 *x = m_IconRect.left(); w = m_IconRect.width();
764 *y = m_IconRect.top(); h = m_IconRect.height();
767 *x = 0; w = viewport()->width();
768 *y = 0; h = viewport()->height();
787 kdDebug(1203) <<
"x=" << *x <<
" y=" << *y <<
" spacing=" << spacing() <<
" iconSize=" << iconSize
788 <<
" w=" << w <<
" h=" << h
789 <<
" nx=" << *nx <<
" ny=" << *ny
790 <<
" dx=" << *dx <<
" dy=" << *dy << endl;
793void KonqIconViewWidget::calculateGridX()
796 if ( itemTextPos() == TQIconView::Bottom ) {
810 int sz = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
813 if ( itemTextPos() == TQIconView::Bottom )
814 newGridX = TQMAX( sz + 50, previewIconSize( sz ) + 13 );
816 newGridX = TQMAX( sz, previewIconSize( sz ) ) + m_pSettings->iconTextWidth();
824 updatePreviewMimeTypes();
825 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
826 (
static_cast<KFileIVI *
>( it ))->item()->refreshMimeType();
830void KonqIconViewWidget::setURL(
const KURL &kurl )
835 d->pFileTip->setPreview( TDEGlobalSettings::showFilePreview(m_url) );
837 if ( m_url.isLocalFile() )
838 m_dotDirectoryPath = m_url.path(1).append(
".directory" );
840 m_dotDirectoryPath = TQString::null;
848 if ( !TDEGlobalSettings::showFilePreview( url() ) ) {
849 kdDebug(1203) <<
"Previews disabled for protocol " << url().protocol() << endl;
850 emit imagePreviewFinished();
854 if ((d->bSoundPreviews = d->previewSettings.contains(
"audio/" )) &&
857 KLibFactory *factory = KLibLoader::self()->factory(
"konq_sound");
859 d->pSoundPlayer =
static_cast<KonqSoundPlayer *
>(
860 factory->create(
this, 0,
"KonqSoundPlayer"));
861 d->bSoundPreviews = (d->pSoundPlayer != 0L);
865 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
866 if ( force || !
static_cast<KFileIVI *
>( it )->hasValidThumbnail() )
869 bool onlyAudio =
true;
870 for ( TQStringList::ConstIterator it = d->previewSettings.begin(); it != d->previewSettings.end(); ++it ) {
871 if ( (*it).startsWith(
"audio/" ) )
872 d->bSoundPreviews =
true;
877 if ( items.isEmpty() || onlyAudio ) {
878 emit imagePreviewFinished();
882 int iconSize = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
885 d->bBoostPreview = boostPreview();
886 size = previewIconSize( iconSize );
888 if ( !d->bBoostPreview )
891 d->pPreviewJob = TDEIO::filePreview( items, size, size, iconSize,
892 m_pSettings->textPreviewIconTransparency(),
true ,
893 true , &(d->previewSettings) );
894 connect( d->pPreviewJob, TQ_SIGNAL( gotPreview(
const KFileItem *,
const TQPixmap & ) ),
895 this, TQ_SLOT( slotPreview(
const KFileItem *,
const TQPixmap & ) ) );
896 connect( d->pPreviewJob, TQ_SIGNAL( result( TDEIO::Job * ) ),
897 this, TQ_SLOT( slotPreviewResult() ) );
900void KonqIconViewWidget::stopImagePreview()
904 d->pPreviewJob->kill();
911bool KonqIconViewWidget::isPreviewRunning()
const
913 return d->pPreviewJob;
918 KFileItemList lstItems;
920 TQIconViewItem *it = firstItem();
921 for (; it; it = it->nextItem() )
922 if ( it->isVisible() && it->isSelected() ) {
923 KFileItem *fItem = (
static_cast<KFileIVI *
>(it))->item();
924 lstItems.append( fItem );
929void KonqIconViewWidget::slotDropped( TQDropEvent *ev,
const TQValueList<TQIconDragItem> & )
935 dirURL = m_rootItem->mostLocalURL(dummy);
940void KonqIconViewWidget::slotAboutToCreate(
const TQPoint &,
const TQValueList<TDEIO::CopyInfo> &)
945void KonqIconViewWidget::drawBackground( TQPainter *p,
const TQRect &r )
947 drawBackground(p, r, r.topLeft());
950void KonqIconViewWidget::drawBackground( TQPainter *p,
const TQRect &r ,
const TQPoint &pt)
952 const TQPixmap *pm = backgroundPixmap();
953 bool hasPixmap = pm && !pm->isNull();
955 pm = viewport()->backgroundPixmap();
956 hasPixmap = pm && !pm->isNull();
960 rtgt.moveTopLeft(pt);
961 if (!hasPixmap && backgroundMode() != NoBackground) {
962 p->fillRect(rtgt, viewport()->backgroundColor());
967 int ax = (r.x() + contentsX() + leftMargin()) % pm->width();
968 int ay = (r.y() + contentsY() + topMargin()) % pm->height();
969 p->drawTiledPixmap(rtgt, *pm, TQPoint(ax, ay));
973TQDragObject * KonqIconViewWidget::dragObject()
975 if ( !currentItem() )
978 return konqDragObject( viewport() );
981KonqIconDrag * KonqIconViewWidget::konqDragObject( TQWidget * dragSource )
986 TQIconViewItem *primaryItem = currentItem();
988 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() ) {
989 if ( it->isVisible() && it->isSelected() ) {
992 KFileItem* fileItem = (
static_cast<KFileIVI *
>(it))->item();
993 KURL url = fileItem->url();
995 KURL mostLocalURL = fileItem->mostLocalURL(dummy);
996 TQString itemURL = KURLDrag::urlToString(url);
997 kdDebug(1203) <<
"itemURL=" << itemURL << endl;
999 id.setData( TQCString(itemURL.latin1()) );
1001 TQRect( it->pixmapRect(
false).topLeft() - m_mousePos,
1002 it->pixmapRect().size() ),
1003 TQRect( it->textRect(
false).topLeft() - m_mousePos,
1004 it->textRect().size() ),
1005 itemURL, mostLocalURL );
1010 drag->setPixmap( *primaryItem->pixmap(), m_mousePos - primaryItem->pixmapRect(
false).topLeft() );
1015void KonqIconViewWidget::contentsDragEnterEvent( TQDragEnterEvent *e )
1017 if ( e->provides(
"text/uri-list" ) )
1019 TQByteArray payload = e->encodedData(
"text/uri-list" );
1020 if ( !payload.size() )
1021 kdError() <<
"Empty data !" << endl;
1024 bool ok = KURLDrag::decode( e, m_lstDragURLs );
1026 kdError() <<
"Couldn't decode urls dragged !" << endl;
1030 if ( KURLDrag::decode(e, uriList) )
1032 if ( uriList.first().protocol() ==
"programs" )
1036 d->bProgramsURLdrag =
true;
1041 TDEIconView::contentsDragEnterEvent( e );
1045void KonqIconViewWidget::contentsDragMoveEvent( TQDragMoveEvent *e )
1047 if ( d->bProgramsURLdrag ) {
1048 emit dragMove(
false );
1050 cancelPendingHeldSignal();
1054 TQIconViewItem *item = findItem( e->pos() );
1055 if ( e->source() != viewport() &&
1056 !item && m_rootItem && !m_rootItem->isWritable() ) {
1057 emit dragMove(
false );
1059 cancelPendingHeldSignal();
1062 emit dragMove(
true );
1063 TDEIconView::contentsDragMoveEvent( e );
1066void KonqIconViewWidget::contentsDragLeaveEvent( TQDragLeaveEvent *e )
1068 d->bProgramsURLdrag =
false;
1069 TDEIconView::contentsDragLeaveEvent(e);
1074void KonqIconViewWidget::setItemColor(
const TQColor &c )
1079TQColor KonqIconViewWidget::itemColor()
const
1084void KonqIconViewWidget::disableIcons(
const KURL::List & lst )
1086 for ( TQIconViewItem *kit = firstItem(); kit; kit = kit->nextItem() )
1088 bool bFound =
false;
1091 for (KURL::List::ConstIterator it = lst.begin(); !bFound && it != lst.end(); ++it)
1093 if (
static_cast<KFileIVI *
>( kit )->item()->url() == *it )
1099 static_cast<KFileIVI *
>( kit )->setDisabled( bFound );
1109 bool bInTrash =
false;
1112 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
1114 if ( it->isVisible() && it->isSelected() )
1119 KFileItem *item = (
static_cast<KFileIVI *
>( it ) )->item();
1120 KURL url = item->url();
1121 TQString local_path = item->localPath();
1123 if ( url.directory(
false) == TDEGlobalSettings::trashPath() ) {
1126 if ( KProtocolInfo::supportsDeleting( url ) ) {
1129 if ( !local_path.isEmpty() ) {
1137 emit
enableAction(
"trash", canDel > 0 && !bInTrash && canTrash==canDel );
1141 emit
enableAction(
"rename", ( iCount == 1) && !bInTrash );
1144void KonqIconViewWidget::renameCurrentItem()
1148 static_cast<KFileIVI *
>(currentItem())->rename();
1152void KonqIconViewWidget::renameSelectedItem()
1154 kdDebug(1203) <<
" -- KonqIconViewWidget::renameSelectedItem() -- " << endl;
1155 TQIconViewItem *item = 0L;
1156 TQIconViewItem *it = firstItem();
1157 for (; it; it = it->nextItem() )
1158 if ( it->isVisible() && it->isSelected() && !item )
1168 static_cast<KFileIVI *
>(item)->rename();
1171void KonqIconViewWidget::cutSelection()
1173 kdDebug(1203) <<
" -- KonqIconViewWidget::cutSelection() -- " << endl;
1174 KonqIconDrag * obj = konqDragObject( );
1175 obj->setMoveSelection(
true );
1176 TQApplication::clipboard()->setData( obj );
1179void KonqIconViewWidget::copySelection()
1181 kdDebug(1203) <<
" -- KonqIconViewWidget::copySelection() -- " << endl;
1182 KonqIconDrag * obj = konqDragObject( );
1183 TQApplication::clipboard()->setData( obj );
1186void KonqIconViewWidget::pasteSelection()
1191void KonqIconViewWidget::paste(
const KURL &url )
1196KURL::List KonqIconViewWidget::selectedUrls()
1198 return selectedUrls( UserVisibleUrls );
1201KURL::List KonqIconViewWidget::selectedUrls( UrlFlags flags )
const
1205 for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() )
1206 if ( it->isVisible() && it->isSelected() ) {
1207 KFileItem* item = (
static_cast<KFileIVI *
>( it ))->item();
1208 lstURLs.append( flags == MostLocalUrls ? item->mostLocalURL( dummy ) : item->url() );
1225 return m_LineupMode;
1230 m_LineupMode = mode;
1233bool KonqIconViewWidget::sortDirectoriesFirst()
const
1235 return m_bSortDirsFirst;
1238void KonqIconViewWidget::setSortDirectoriesFirst(
bool b )
1240 m_bSortDirsFirst = b;
1243void KonqIconViewWidget::contentsMouseMoveEvent( TQMouseEvent *e )
1245 if ( (d->pSoundPlayer && d->pSoundPlayer->isPlaying()) || (d->pSoundTimer && d->pSoundTimer->isActive()))
1250 if ( TQApplication::widgetAt( TQCursor::pos() ) != topLevelWidget() )
1252 if (d->pSoundPlayer)
1253 d->pSoundPlayer->stop();
1255 if (d->pSoundTimer && d->pSoundTimer->isActive())
1256 d->pSoundTimer->stop();
1259 d->renameItem=
false;
1260 TDEIconView::contentsMouseMoveEvent( e );
1263void KonqIconViewWidget::contentsDropEvent( TQDropEvent * ev )
1265 TQIconViewItem *i = findItem( ev->pos() );
1268 if ( ev->source() != viewport() &&
1269 !i && m_rootItem && !m_rootItem->isWritable() ) {
1270 ev->accept(
false );
1276 if ( !i && (ev->action() == TQDropEvent::Copy || ev->action() == TQDropEvent::Link)
1277 && ev->source() && ev->source() == viewport()
1278 && KURLDrag::decode(ev, uriList) && !uriList.isEmpty()
1279 && uriList.first().upURL().url(1) == url().url(1))
1282 bool bMovable = itemsMovable();
1283 setItemsMovable(
false);
1284 TDEIconView::contentsDropEvent( ev );
1285 setItemsMovable(bMovable);
1287 TQValueList<TQIconDragItem> lst;
1288 slotDropped(ev, lst);
1292 TDEIconView::contentsDropEvent( ev );
1306void KonqIconViewWidget::doubleClickTimeout()
1308 d->renameItem=
true;
1309 mousePressChangeValue();
1310 if ( d->releaseMouseEvent )
1312 TQMouseEvent e( TQEvent::MouseButtonPress,d->mousePos , 1, d->mouseState);
1313 TQIconViewItem* item = findItem( e.pos() );
1317 url= (
static_cast<KFileIVI *
>( item ) )->item()->url();
1318 bool brenameTrash =
false;
1319 if ( url.isLocalFile() && (url.directory(
false) == TDEGlobalSettings::trashPath() || url.path(1).startsWith(TDEGlobalSettings::trashPath())))
1320 brenameTrash =
true;
1322 if ( url.isLocalFile() && !brenameTrash && d->renameItem && m_pSettings->renameIconDirectly() && e.button() == TQt::LeftButton && item->textRect(
false ).contains(e.pos()))
1324 if( d->pActivateDoubleClick->isActive () )
1325 d->pActivateDoubleClick->stop();
1327 m_bMousePressed =
false;
1333 TQMouseEvent e( TQEvent::MouseMove,d->mousePos , 1, d->mouseState);
1334 TDEIconView::contentsMousePressEvent( &e );
1336 if( d->pActivateDoubleClick->isActive() )
1337 d->pActivateDoubleClick->stop();
1339 d->releaseMouseEvent =
false;
1340 d->renameItem=
false;
1343void KonqIconViewWidget::wheelEvent(TQWheelEvent* e)
1346 d->pFileTip->setItem( 0 );
1348 if (e->state() == ControlButton)
1350 if (e->delta() >= 0)
1362 TDEIconView::wheelEvent(e);
1365void KonqIconViewWidget::leaveEvent( TQEvent *e )
1370 TDEIconView::leaveEvent(e);
1373void KonqIconViewWidget::mousePressChangeValue()
1376 m_bMousePressed =
true;
1377 if (d->pSoundPlayer)
1378 d->pSoundPlayer->stop();
1379 d->bSoundItemClicked =
true;
1380 d->firstClick =
false;
1384 d->pFileTip->setItem( 0 );
1387void KonqIconViewWidget::contentsMousePressEvent( TQMouseEvent *e )
1389 if(d->pActivateDoubleClick && d->pActivateDoubleClick->isActive ())
1390 d->pActivateDoubleClick->stop();
1391 TQIconViewItem* item = findItem( e->pos() );
1392 m_mousePos = e->pos();
1396 url = (
static_cast<KFileIVI *
>( item ) )->item()->url();
1397 bool brenameTrash =
false;
1398 if ( url.isLocalFile() && (url.directory(
false) == TDEGlobalSettings::trashPath() || url.path(1).startsWith(TDEGlobalSettings::trashPath())))
1399 brenameTrash =
true;
1400 if ( !brenameTrash && !TDEGlobalSettings::singleClick() && m_pSettings->renameIconDirectly() && e->button() == TQt::LeftButton && item->textRect(
false ).contains(e->pos())&& !d->firstClick && url.isLocalFile() && (!url.protocol().find(
"device", 0,
false)==0))
1402 d->firstClick =
true;
1403 d->mousePos = e->pos();
1404 d->mouseState = e->state();
1405 if (!d->pActivateDoubleClick)
1407 d->pActivateDoubleClick =
new TQTimer(
this);
1408 connect(d->pActivateDoubleClick, TQ_SIGNAL(timeout()),
this, TQ_SLOT(doubleClickTimeout()));
1410 if( d->pActivateDoubleClick->isActive () )
1411 d->pActivateDoubleClick->stop();
1413 d->pActivateDoubleClick->start(TQApplication::doubleClickInterval());
1414 d->releaseMouseEvent =
false;
1418 d->renameItem=
false;
1421 d->renameItem=
false;
1422 mousePressChangeValue();
1423 if(d->pActivateDoubleClick && d->pActivateDoubleClick->isActive())
1424 d->pActivateDoubleClick->stop();
1425 TDEIconView::contentsMousePressEvent( e );
1429void KonqIconViewWidget::contentsMouseReleaseEvent( TQMouseEvent *e )
1431 TDEIconView::contentsMouseReleaseEvent( e );
1432 if(d->releaseMouseEvent && d->pActivateDoubleClick && d->pActivateDoubleClick->isActive ())
1433 d->pActivateDoubleClick->stop();
1435 d->releaseMouseEvent =
true;
1436 m_bMousePressed =
false;
1439void KonqIconViewWidget::slotSaveIconPositions()
1448 printf(
"WARNING: Strongly deprecated method KonqIconViewWidget::slotSaveIconPositions() called!\n"); fflush(stdout);
1450 if ( m_dotDirectoryPath.isEmpty() )
1454 kdDebug(1214) <<
"KonqIconViewWidget::slotSaveIconPositions" << endl;
1455 TDESimpleConfig dotDirectory( m_dotDirectoryPath );
1456 TQIconViewItem *it = firstItem();
1462 KFileItem *item = ivi->
item();
1464 dotDirectory.setGroup( TQString( m_iconPositionGroupPrefix ).append( item->url().fileName() ) );
1465 kdDebug(1214) <<
"KonqIconViewWidget::slotSaveIconPositions " << item->url().fileName() <<
" " << it->x() <<
" " << it->y() << endl;
1466 dotDirectory.writeEntry( TQString(
"X %1" ).arg( width() ), it->x() );
1467 dotDirectory.writeEntry( TQString(
"Y %1" ).arg( height() ), it->y() );
1468 dotDirectory.writeEntry(
"Exists",
true );
1470 it = it->nextItem();
1473 TQStringList groups = dotDirectory.groupList();
1474 TQStringList::ConstIterator gIt = groups.begin();
1475 TQStringList::ConstIterator gEnd = groups.end();
1476 for (; gIt != gEnd; ++gIt )
1477 if ( (*gIt).left( m_iconPositionGroupPrefix.length() ) == m_iconPositionGroupPrefix )
1479 dotDirectory.setGroup( *gIt );
1480 if ( dotDirectory.hasKey(
"Exists" ) )
1481 dotDirectory.deleteEntry(
"Exists",
false );
1484 kdDebug(1214) <<
"KonqIconViewWidget::slotSaveIconPositions deleting group " << *gIt << endl;
1485 dotDirectory.deleteGroup( *gIt );
1489 dotDirectory.sync();
1507 if (!m_IconRect.isValid())
1509 TDEIconView::insertInGrid(item);
1513 TQRegion r(m_IconRect);
1514 TQIconViewItem *i = firstItem();
1516 for (; i; i = i->nextItem() )
1518 r = r.subtract(i->rect());
1519 y = TQMAX(y, i->y() + i->height());
1522 TQMemArray<TQRect> rects = r.rects();
1523 TQMemArray<TQRect>::Iterator it = rects.begin();
1524 bool foundPlace =
false;
1525 for (; it != rects.end(); ++it)
1528 if (rect.width() >= item->width() && rect.height() >= item->height())
1531 if (rect.width() >= item->width() + spacing())
1533 if (rect.height() >= item->height() + spacing())
1535 item->move(rect.x() + sx, rect.y() + sy);
1542 item->move(m_IconRect.topLeft());
1582 int x0, y0, dx, dy, nx, ny;
1585 int itemWidth = dx - spacing();
1586 bool newItemWidth =
false;
1587 if ( maxItemWidth() != itemWidth ) {
1588 newItemWidth =
true;
1589 setMaxItemWidth( itemWidth );
1593 if ( !firstItem() ) {
1594 kdDebug(1203) <<
"No icons at all ?\n";
1598 int iconSize = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
1600 typedef TQValueList<TQIconViewItem*> Bin;
1601 Bin*** bins =
new Bin**[nx];
1604 for ( i = 0; i < nx ; i++ ) {
1605 bins[i] =
new Bin*[ny];
1606 for ( j = 0; j < ny; j++ )
1611 int textHeight = iconTextHeight() * fontMetrics().height();
1613 for ( TQIconViewItem* item = firstItem(); item; item = item->nextItem() ) {
1614 int x = item->x() + item->width() / 2 - x0;
1615 int y = item->pixmapRect(
false ).bottom() - iconSize / 2
1616 - ( dy - ( iconSize + textHeight ) ) / 2 - y0;
1617 int posX = TQMIN( nx-1, TQMAX( 0, x / dx ) );
1618 int posY = TQMIN( ny-1, TQMAX( 0, y / dy ) );
1620 if ( !bins[posX][posY] )
1621 bins[posX][posY] =
new Bin;
1622 bins[posX][posY]->prepend( item );
1627 const int infinity = 10000;
1629 for ( n = 0; n < 30 && nmoves > 0; n++ ) {
1631 for ( i = 0; i < nx; i++ ) {
1632 for ( j = 0; j < ny; j++ ) {
1633 if ( !bins[i][j] || ( bins[i][j]->count() <= 1 ) )
1637 int tf = 0, bf = 0, lf = 0, rf = 0;
1638 for ( k = j-1; k >= 0 && bins[i][k] && bins[i][k]->count(); k-- )
1639 tf += bins[i][k]->count();
1643 for ( k = j+1; k < ny && bins[i][k] && bins[i][k]->count(); k++ )
1644 bf += bins[i][k]->count();
1648 for ( k = i-1; k >= 0 && bins[k][j] && bins[k][j]->count(); k-- )
1649 lf += bins[k][j]->count();
1653 for ( k = i+1; k < nx && bins[k][j] && bins[k][j]->count(); k++ )
1654 rf += bins[k][j]->count();
1659 if ( tf >= infinity && bf >= infinity &&
1660 lf >= infinity && rf >= infinity )
1664 if ( m_LineupMode == LineupHorizontal ) {
1668 else if ( m_LineupMode == LineupVertical ) {
1674 TQIconViewItem* movedItem;
1675 Bin* items = bins[i][j];
1677 int mini = TQMIN( TQMIN( tf, bf ), TQMIN( lf, rf ) );
1680 Bin::iterator it = items->begin();
1682 for ( ++it; it != items->end(); ++it ) {
1683 if ( (*it)->y() < movedItem->y() )
1686 items->remove( movedItem );
1687 if ( !bins[i][j-1] )
1688 bins[i][j-1] =
new Bin;
1689 bins[i][j-1]->prepend( movedItem );
1691 else if ( bf ==mini ) {
1693 Bin::iterator it = items->begin();
1695 for ( ++it; it != items->end(); ++it ) {
1696 if ( (*it)->y() > movedItem->y() )
1699 items->remove( movedItem );
1700 if ( !bins[i][j+1] )
1701 bins[i][j+1] =
new Bin;
1702 bins[i][j+1]->prepend( movedItem );
1704 else if ( lf == mini )
1707 Bin::iterator it = items->begin();
1709 for ( ++it; it != items->end(); ++it ) {
1710 if ( (*it)->x() < movedItem->x() )
1713 items->remove( movedItem );
1714 if ( !bins[i-1][j] )
1715 bins[i-1][j] =
new Bin;
1716 bins[i-1][j]->prepend( movedItem );
1720 Bin::iterator it = items->begin();
1722 for ( ++it; it != items->end(); ++it ) {
1723 if ( (*it)->x() > movedItem->x() )
1726 items->remove( movedItem );
1727 if ( !bins[i+1][j] )
1728 bins[i+1][j] =
new Bin;
1729 bins[i+1][j]->prepend( movedItem );
1737 TQRegion repaintRegion;
1738 TQValueList<TQIconViewItem*> movedItems;
1740 for ( i = 0; i < nx; i++ ) {
1741 for ( j = 0; j < ny; j++ ) {
1742 Bin* bin = bins[i][j];
1745 if ( !bin->isEmpty() ) {
1746 TQIconViewItem* item = bin->first();
1747 int newX = x0 + i*dx + spacing() +
1748 TQMAX(0, ( (dx-spacing()) - item->width() ) / 2);
1750 int newY = y0 + j*dy + dy - spacing() - ( item->pixmapRect().bottom() + 2 + textHeight );
1751 if ( item->x() != newX || item->y() != newY ) {
1752 TQRect oldRect = item->rect();
1753 movedItems.prepend( item );
1754 item->move( newX, newY );
1755 if ( item->rect() != oldRect )
1756 repaintRegion = repaintRegion.unite( oldRect );
1769 TQMemArray<TQRect> rects = repaintRegion.rects();
1770 for ( uint l = 0; l < rects.count(); l++ ) {
1771 kdDebug( 1203 ) <<
"Repainting (" << rects[l].x() <<
","
1772 << rects[l].y() <<
")\n";
1773 repaintContents( rects[l],
false );
1776 while ( !movedItems.isEmpty() ) {
1777 repaintItem( movedItems.first() );
1778 movedItems.remove( movedItems.first() );
1782 for ( i = 0; i < nx ; i++ ) {
1790 int x0, y0, dx, dy, nxmax, nymax;
1791 gridValues( &x0, &y0, &dx, &dy, &nxmax, &nymax );
1792 int textHeight = iconTextHeight() * fontMetrics().height();
1794 TQRegion repaintRegion;
1795 TQValueList<TQIconViewItem*> movedItems;
1798 TQIconViewItem* item;
1799 for ( item = firstItem(); item; item = item->nextItem() ) {
1800 int newX = x0 + nx*dx + spacing() +
1801 TQMAX(0, ( (dx-spacing()) - item->width() ) / 2);
1803 int newY = y0 + ny*dy + dy - spacing() - ( item->pixmapRect().bottom() + 2 + textHeight );
1804 if ( item->x() != newX || item->y() != newY ) {
1805 TQRect oldRect = item->rect();
1806 movedItems.prepend( item );
1807 item->move( newX, newY );
1808 if ( item->rect() != oldRect )
1809 repaintRegion = repaintRegion.unite( oldRect );
1811 if ( arrangement == TQIconView::LeftToRight ) {
1813 if ( nx >= nxmax ) {
1820 if ( ny >= nymax ) {
1828 TQMemArray<TQRect> rects = repaintRegion.rects();
1829 for ( uint l = 0; l < rects.count(); l++ ) {
1830 kdDebug( 1203 ) <<
"Repainting (" << rects[l].x() <<
","
1831 << rects[l].y() <<
")\n";
1832 repaintContents( rects[l],
false );
1835 while ( !movedItems.isEmpty() ) {
1836 repaintItem( movedItems.first() );
1837 movedItems.remove( movedItems.first() );
1841int KonqIconViewWidget::largestPreviewIconSize(
int size )
const
1843 int iconSize = size ? size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
1857int KonqIconViewWidget::previewIconSize(
int size )
const
1859 int iconSize = size ? size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop );
1861 if (!d->bBoostPreview)
1864 return largestPreviewIconSize( iconSize );
1870 TQRect irect = item->rect();
1873 TQRect rect = item->pixmapRect();
1877 rect.moveBy(irect.x(), irect.y());
1880 rect.moveBy( -contentsX(), -contentsY() );
1882 if (TDEGlobalSettings::showKonqIconActivationEffect() ==
true) {
1883 TDEIconEffect::visualActivate(viewport(), rect, item->pixmap());
1887void KonqIconViewWidget::backgroundPixmapChange(
const TQPixmap & )
1889 viewport()->update();
1892void KonqIconViewWidget::setPreviewSettings(
const TQStringList& settings )
1894 d->previewSettings = settings;
1895 updatePreviewMimeTypes();
1902const TQStringList& KonqIconViewWidget::previewSettings()
1904 return d->previewSettings;
1907void KonqIconViewWidget::setNewURL(
const TQString& url )
1910 if ( url.startsWith(
"/" ) )
1917void KonqIconViewWidget::setCaseInsensitiveSort(
bool b )
1919 d->bCaseInsensitive = b;
1922bool KonqIconViewWidget::caseInsensitiveSort()
const
1924 return d->bCaseInsensitive;
1927bool KonqIconViewWidget::canPreview( KFileItem* item )
1929 if ( !TDEGlobalSettings::showFilePreview( url() ) )
1932 if ( d->pPreviewMimeTypes == 0L )
1933 updatePreviewMimeTypes();
1935 return mimeTypeMatch( item->mimetype(), *( d->pPreviewMimeTypes ) );
1938void KonqIconViewWidget::updatePreviewMimeTypes()
1940 if ( d->pPreviewMimeTypes == 0L )
1941 d->pPreviewMimeTypes =
new TQStringList;
1943 d->pPreviewMimeTypes->clear();
1946 TDETrader::OfferList plugins = TDETrader::self()->query(
"ThumbCreator");
1947 TDETrader::OfferList::ConstIterator it;
1949 for ( it = plugins.begin(); it != plugins.end(); ++it ) {
1950 if ( d->previewSettings.contains((*it)->desktopEntryName()) ) {
1951 TQStringList mimeTypes = (*it)->property(
"MimeTypes").toStringList();
1952 for (TQStringList::ConstIterator mt = mimeTypes.begin(); mt != mimeTypes.end(); ++mt)
1953 d->pPreviewMimeTypes->append(*mt);
1958#include "konq_iconviewwidget.moc"
KFileIVI (short form of "Konq - File - IconViewItem") is, as expected, an improved TDEIconViewItem,...
virtual void setIcon(int size, int state=TDEIcon::DefaultState, bool recalc=false, bool redraw=false)
Changes the icon for this item.
void invalidateThumb(int state, bool redraw=false)
Notifies that all icon effects on thumbs should be invalidated, e.g.
int state() const
Return the current state of the icon (TDEIcon::DefaultState, TDEIcon::ActiveState etc....
void setThumbnailPixmap(const TQPixmap &pixmap)
Set this when the thumbnail was loaded.
static KonqFMSettings * settings()
The static instance of KonqFMSettings.
Clipboard/dnd data for: Icons + URLs + MostLocal URLs + isCut KDE4: merge with KonqIconDrag.
static void doPaste(TQWidget *parent, const KURL &destURL, const TQPoint &pos)
Paste the clipboard contents.
static void rename(TQWidget *parent, const KURL &oldurl, const TQString &name)
Do a renaming.
static void doDrop(const KFileItem *destItem, const KURL &destURL, TQDropEvent *ev, TQWidget *parent)
Drop.