From 145abc15d57fb29701a12e8a14dcb9c1fd72e9be Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Mon, 7 Dec 2020 22:58:44 +0900 Subject: Renaming of files in preparation for code style tools. Signed-off-by: Michele Calgaro --- libkonq/konq_iconviewwidget.cc | 1939 ---------------------------------------- 1 file changed, 1939 deletions(-) delete mode 100644 libkonq/konq_iconviewwidget.cc (limited to 'libkonq/konq_iconviewwidget.cc') diff --git a/libkonq/konq_iconviewwidget.cc b/libkonq/konq_iconviewwidget.cc deleted file mode 100644 index 49c687123..000000000 --- a/libkonq/konq_iconviewwidget.cc +++ /dev/null @@ -1,1939 +0,0 @@ -/* This file is part of the KDE projects - Copyright (C) 1998, 1999 Torben Weis - Copyright (C) 2000 - 2005 David Faure - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ -#include "konq_iconviewwidget.h" -#include "konq_operations.h" -#include "konq_undo.h" -#include "konq_sound.h" -#include "konq_filetip.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - - -struct KonqIconViewWidgetPrivate -{ - KonqIconViewWidgetPrivate() { - pActiveItem = 0; - bSoundPreviews = false; - pSoundItem = 0; - bSoundItemClicked = false; - pSoundPlayer = 0; - pSoundTimer = 0; - pPreviewJob = 0; - bAllowSetWallpaper = false; - - doAnimations = true; - m_movie = 0L; - m_movieBlocked = 0; - pFileTip = 0; - pActivateDoubleClick = 0L; - bCaseInsensitive = true; - pPreviewMimeTypes = 0L; - bProgramsURLdrag = false; - } - ~KonqIconViewWidgetPrivate() { - delete pSoundPlayer; - delete pSoundTimer; - delete m_movie; - delete pFileTip; - delete pActivateDoubleClick; - delete pPreviewMimeTypes; - //delete pPreviewJob; done by stopImagePreview - } - KFileIVI *pActiveItem; - // Sound preview - KFileIVI *pSoundItem; - KonqSoundPlayer *pSoundPlayer; - TQTimer *pSoundTimer; - bool bSoundPreviews; - bool bSoundItemClicked; - bool bAllowSetWallpaper; - bool bCaseInsensitive; - bool bBoostPreview; - - // Animated icons support - bool doAnimations; - TQMovie* m_movie; - int m_movieBlocked; - TQString movieFileName; - - TDEIO::PreviewJob *pPreviewJob; - KonqFileTip* pFileTip; - TQStringList previewSettings; - bool renameItem; - bool firstClick; - bool releaseMouseEvent; - TQPoint mousePos; - int mouseState; - TQTimer *pActivateDoubleClick; - TQStringList* pPreviewMimeTypes; - bool bProgramsURLdrag; -}; - -KonqIconViewWidget::KonqIconViewWidget( TQWidget * parent, const char * name, WFlags f, bool kdesktop ) - : TDEIconView( parent, name, f ), - m_rootItem( 0L ), m_size( 0 ) /* default is DesktopIcon size */, - m_bDesktop( kdesktop ), - m_bSetGridX( !kdesktop ) /* No line breaking on the desktop */ -{ - d = new KonqIconViewWidgetPrivate; - connect( this, TQT_SIGNAL( dropped( TQDropEvent *, const TQValueList & ) ), - this, TQT_SLOT( slotDropped( TQDropEvent*, const TQValueList & ) ) ); - - connect( this, TQT_SIGNAL( selectionChanged() ), - this, TQT_SLOT( slotSelectionChanged() ) ); - - kapp->addKipcEventMask( KIPC::IconChanged ); - connect( kapp, TQT_SIGNAL(iconChanged(int)), TQT_SLOT(slotIconChanged(int)) ); - connect( this, TQT_SIGNAL(onItem(TQIconViewItem *)), TQT_SLOT(slotOnItem(TQIconViewItem *)) ); - connect( this, TQT_SIGNAL(onViewport()), TQT_SLOT(slotOnViewport()) ); - connect( this, TQT_SIGNAL(itemRenamed(TQIconViewItem *, const TQString &)), TQT_SLOT(slotItemRenamed(TQIconViewItem *, const TQString &)) ); - - m_pSettings = KonqFMSettings::settings(); // already needed in setItemTextPos(), calculateGridX() - d->bBoostPreview = boostPreview(); - - // hardcoded settings - setSelectionMode( TQIconView::Extended ); - setItemTextPos( TQIconView::Bottom ); - d->releaseMouseEvent = false; - d->pFileTip = new KonqFileTip(this); - d->firstClick = false; - calculateGridX(); - setAutoArrange( true ); - setSorting( true, sortDirection() ); - readAnimatedIconsConfig(); - m_bSortDirsFirst = true; - m_bMousePressed = false; - m_LineupMode = LineupBoth; - // emit our signals - slotSelectionChanged(); - m_iconPositionGroupPrefix = TQString::fromLatin1( "IconPosition::" ); - KonqUndoManager::incRef(); -} - -KonqIconViewWidget::~KonqIconViewWidget() -{ - stopImagePreview(); - KonqUndoManager::decRef(); - delete d; -} - -bool KonqIconViewWidget::maySetWallpaper() -{ - return d->bAllowSetWallpaper; -} - -void KonqIconViewWidget::setMaySetWallpaper(bool b) -{ - d->bAllowSetWallpaper = b; -} - -void KonqIconViewWidget::focusOutEvent( TQFocusEvent * ev ) -{ - // We can't possibly have the mouse pressed and still lose focus. - // Well, we can, but when we regain focus we should assume the mouse is - // not down anymore or the slotOnItem code will break with highlighting! - m_bMousePressed = false; - - // This will ensure that tooltips don't pop up and the mouseover icon - // effect will go away if the mouse goes out of the view without - // first moving into an empty portion of the view - // Fixes part of #86968, and #85204 - // Matt Newell 2004-09-24 - slotOnViewport(); - - TDEIconView::focusOutEvent( ev ); -} - -void KonqIconViewWidget::slotItemRenamed(TQIconViewItem *item, const TQString &name) -{ - kdDebug(1203) << "KonqIconViewWidget::slotItemRenamed" << endl; - KFileIVI *viewItem = static_cast(item); - KFileItem *fileItem = viewItem->item(); - - // The correct behavior is to show the old name until the rename has successfully - // completed. Unfortunately, TDEIconView forces us to allow the text to be changed - // before we try the rename, so set it back to the pre-rename state. - viewItem->setText( fileItem->text() ); - kdDebug(1203)<<" fileItem->text() ;"<text()<url() ); - KURL newurl( oldurl ); - newurl.setPath( newurl.directory(false) + TDEIO::encodeFileName( name ) ); - kdDebug(1203)<<" newurl :"<doAnimations = cfgGroup.readBoolEntry( "Animated", true /*default*/ ); -} - -void KonqIconViewWidget::slotOnItem( TQIconViewItem *_item ) -{ - KFileIVI* item = static_cast( _item ); - // Reset icon of previous item - if( d->pActiveItem != 0L && d->pActiveItem != item ) - { - if ( d->m_movie && d->pActiveItem->isAnimated() ) - { - d->m_movie->pause(); // we'll see below what we do with it - d->pActiveItem->setAnimated( false ); - d->pActiveItem->refreshIcon( true ); - } - else { - d->pActiveItem->setActive( false ); - } - d->pActiveItem = 0L; - d->pFileTip->setItem( 0L ); - } - - // Stop sound - if (d->pSoundPlayer != 0 && item != d->pSoundItem) - { - d->pSoundPlayer->stop(); - - d->pSoundItem = 0; - if (d->pSoundTimer && d->pSoundTimer->isActive()) - d->pSoundTimer->stop(); - } - - if ( !m_bMousePressed ) - { - if( item != d->pActiveItem ) - { - d->pActiveItem = item; - d->pFileTip->setItem( d->pActiveItem->item(), - item->rect(), - item->pixmap() ); - - if ( d->doAnimations && d->pActiveItem && d->pActiveItem->hasAnimation() ) - { - //kdDebug(1203) << "Playing animation for: " << d->pActiveItem->mouseOverAnimation() << endl; - // Check if cached movie can be used -#if 0 // Qt-mng bug, reusing the movie doesn't work currently. - if ( d->m_movie && d->movieFileName == d->pActiveItem->mouseOverAnimation() ) - { - d->pActiveItem->setAnimated( true ); - if (d->m_movieBlocked) { - kdDebug(1203) << "onitem, but blocked" << endl; - d->m_movie->pause(); - } - else { - kdDebug(1203) << "we go ahead.." << endl; - d->m_movieBlocked++; - TQTimer::singleShot(300, this, TQT_SLOT(slotReenableAnimation())); - d->m_movie->restart(); - d->m_movie->unpause(); - } - } - else -#endif - { - TQMovie movie = TDEGlobal::iconLoader()->loadMovie( d->pActiveItem->mouseOverAnimation(), TDEIcon::Desktop, d->pActiveItem->iconSize() ); - if ( !movie.isNull() ) - { - delete d->m_movie; - d->m_movie = new TQMovie( movie ); // shallow copy, don't worry - // Fix alpha-channel - currently only if no background pixmap, - // the bg pixmap case requires to uncomment the code at qmovie.cpp:404 - const TQPixmap* pm = backgroundPixmap(); - bool hasPixmap = pm && !pm->isNull(); - if ( !hasPixmap ) { - pm = viewport()->backgroundPixmap(); - hasPixmap = pm && !pm->isNull(); - } - if (!hasPixmap && backgroundMode() != NoBackground) - d->m_movie->setBackgroundColor( viewport()->backgroundColor() ); - d->m_movie->connectUpdate( this, TQT_SLOT( slotMovieUpdate(const TQRect &) ) ); - d->m_movie->connectStatus( TQT_TQOBJECT(this), TQT_SLOT( slotMovieStatus(int) ) ); - d->movieFileName = d->pActiveItem->mouseOverAnimation(); - d->pActiveItem->setAnimated( true ); - } - else - { - d->pActiveItem->setAnimated( false ); - if (d->m_movie) - d->m_movie->pause(); - // No movie available, remember it - d->pActiveItem->setMouseOverAnimation( TQString::null ); - } - } - } // animations - // Only do the normal "mouseover" effect if no animation is in use - if (d->pActiveItem && !d->pActiveItem->isAnimated()) - { - d->pActiveItem->setActive( true ); - } - } - else // No change in current item - { - // No effect. If we want to underline on hover, we should - // force the IVI to repaint here, though! - d->pActiveItem = 0L; - d->pFileTip->setItem( 0L ); - } - } // bMousePressed - else - { - // All features disabled during mouse clicking, e.g. rectangular - // selection - d->pActiveItem = 0L; - d->pFileTip->setItem( 0L ); - } - - // ## shouldn't this be disabled during rectangular selection too ? - if (d->bSoundPreviews && d->pSoundPlayer && - d->pSoundPlayer->mimeTypes().contains( - item->item()->mimetype()) - && TDEGlobalSettings::showFilePreview(item->item()->url()) - && topLevelWidget() == kapp->activeWindow()) - { - d->pSoundItem = item; - d->bSoundItemClicked = false; - if (!d->pSoundTimer) - { - d->pSoundTimer = new TQTimer(this); - connect(d->pSoundTimer, TQT_SIGNAL(timeout()), TQT_SLOT(slotStartSoundPreview())); - } - if (d->pSoundTimer->isActive()) - d->pSoundTimer->stop(); - d->pSoundTimer->start(500, true); - } - else - { - if (d->pSoundPlayer) - d->pSoundPlayer->stop(); - d->pSoundItem = 0; - if (d->pSoundTimer && d->pSoundTimer->isActive()) - d->pSoundTimer->stop(); - } -} - -void KonqIconViewWidget::slotOnViewport() -{ - d->pFileTip->setItem( 0L ); - - if (d->pSoundPlayer) - d->pSoundPlayer->stop(); - d->pSoundItem = 0; - if (d->pSoundTimer && d->pSoundTimer->isActive()) - d->pSoundTimer->stop(); - - if (d->pActiveItem == 0L) - return; - - if ( d->doAnimations && d->m_movie && d->pActiveItem->isAnimated() ) - { - d->pActiveItem->setAnimated( false ); -#if 0 - // Aborting before the end of the animation ? - if (d->m_movie->running()) { - d->m_movie->pause(); - d->m_movieBlocked++; - kdDebug(1203) << "on viewport, blocking" << endl; - TQTimer::singleShot(300, this, TQT_SLOT(slotReenableAnimation())); - } -#endif - d->pActiveItem->refreshIcon( true ); - Q_ASSERT( d->pActiveItem->state() == TDEIcon::DefaultState ); - //delete d->m_movie; - //d->m_movie = 0L; - // TODO a timer to delete the movie after some time if unused? - } - else - { - d->pActiveItem->setActive( false ); - } - d->pActiveItem = 0L; -} - -void KonqIconViewWidget::slotStartSoundPreview() -{ - if (!d->pSoundItem || d->bSoundItemClicked) - return; - - d->pSoundPlayer->play(d->pSoundItem->item()->url().url()); -} - - -void KonqIconViewWidget::slotPreview(const KFileItem *item, const TQPixmap &pix) -{ - // ### slow. Idea: move KonqKfmIconView's m_itemDict into this class - for (TQIconViewItem *it = firstItem(); it; it = it->nextItem()) - { - KFileIVI* current = static_cast(it); - if (current->item() == item) - { - if (item->overlays() & TDEIcon::HiddenOverlay) { - TQPixmap p(pix); - - TDEIconEffect::semiTransparent(p); - current->setThumbnailPixmap(p); - } else { - current->setThumbnailPixmap(pix); - } - break; - } - } -} - -void KonqIconViewWidget::slotPreviewResult() -{ - d->pPreviewJob = 0; - emit imagePreviewFinished(); -} - -void KonqIconViewWidget::slotToolTipPreview(const KFileItem* , const TQPixmap &) -{ -// unused - remove for KDE4 -} - -void KonqIconViewWidget::slotToolTipPreviewResult() -{ -// unused - remove for KDE4 -} - -void KonqIconViewWidget::slotMovieUpdate( const TQRect& rect ) -{ - //kdDebug(1203) << "KonqIconViewWidget::slotMovieUpdate " << rect.x() << "," << rect.y() << " " << rect.width() << "x" << rect.height() << endl; - Q_ASSERT( d ); - Q_ASSERT( d->m_movie ); - // seems stopAnimation triggers one last update - if ( d->pActiveItem && d->m_movie && d->pActiveItem->isAnimated() ) { - const TQPixmap &frame = d->m_movie->framePixmap(); - // This can happen if the icon was scaled to the desired size, so TDEIconLoader - // will happily return a movie with different dimensions than the icon - int iconSize=d->pActiveItem->iconSize(); - if (iconSize==0) iconSize = TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop ); - if ( frame.width() != iconSize || frame.height() != iconSize ) { - d->pActiveItem->setAnimated( false ); - d->m_movie->pause(); - // No movie available, remember it - d->pActiveItem->setMouseOverAnimation( TQString::null ); - d->pActiveItem->setActive( true ); - return; - } - d->pActiveItem->setPixmapDirect( frame, false, false /*no redraw*/ ); - TQRect pixRect = d->pActiveItem->pixmapRect(false); - repaintContents( pixRect.x() + rect.x(), pixRect.y() + rect.y(), rect.width(), rect.height(), false ); - } -} - -void KonqIconViewWidget::slotMovieStatus( int status ) -{ - if ( status < 0 ) { - // Error playing the MNG -> forget about it and do normal iconeffect - if ( d->pActiveItem && d->pActiveItem->isAnimated() ) { - d->pActiveItem->setAnimated( false ); - d->pActiveItem->setMouseOverAnimation( TQString::null ); - d->pActiveItem->setActive( true ); - } - } -} - -void KonqIconViewWidget::slotReenableAnimation() -{ - if (!--d->m_movieBlocked) { - if ( d->pActiveItem && d->m_movie && d->m_movie->paused()) { - kdDebug(1203) << "reenabled animation" << endl; - d->m_movie->restart(); - d->m_movie->unpause(); - } - } -} - -void KonqIconViewWidget::clear() -{ - d->pFileTip->setItem( 0L ); - stopImagePreview(); // Just in case - TDEIconView::clear(); - d->pActiveItem = 0L; -} - -void KonqIconViewWidget::takeItem( TQIconViewItem *item ) -{ - if ( d->pActiveItem == static_cast(item) ) - { - d->pFileTip->setItem( 0L ); - d->pActiveItem = 0L; - } - - if ( d->pPreviewJob ) - d->pPreviewJob->removeItem( static_cast(item)->item() ); - - TDEIconView::takeItem( item ); -} - -// Currently unused - remove in KDE 4.0 -void KonqIconViewWidget::setThumbnailPixmap( KFileIVI * item, const TQPixmap & pixmap ) -{ - if ( item ) - { - if ( d->pActiveItem == item ) - { - d->pFileTip->setItem( 0L ); - d->pActiveItem = 0L; - } - item->setThumbnailPixmap( pixmap ); - if ( m_bSetGridX && item->width() > gridX() ) - { - setGridX( item->width() ); - if (autoArrange()) - arrangeItemsInGrid(); - } - } -} - -bool KonqIconViewWidget::initConfig( bool bInit ) -{ - bool fontChanged = false; - - // Color settings - TQColor normalTextColor = m_pSettings->normalTextColor(); - setItemColor( normalTextColor ); - - if (m_bDesktop) - { - TQColor itemTextBg = m_pSettings->itemTextBackground(); - if ( itemTextBg.isValid() ) - setItemTextBackground( itemTextBg ); - else - setItemTextBackground( Qt::NoBrush ); - } - - bool on = m_pSettings->showFileTips() && TQToolTip::isGloballyEnabled(); - d->pFileTip->setOptions(on, - m_pSettings->showPreviewsInFileTips(), - m_pSettings->numFileTips()); - - // if the user wants our own tooltip, don't show the one from Qts ListView - setShowToolTips(!on); - - // Font settings - TQFont font( m_pSettings->standardFont() ); - if (!m_bDesktop) - font.setUnderline( m_pSettings->underlineLink() ); - - if ( font != KonqIconViewWidget::font() ) - { - setFont( font ); - if (!bInit) - { - // TQIconView doesn't do it by default... but if the font is made much - // bigger, we really need to give more space between the icons - fontChanged = true; - } - } - - setIconTextHeight( m_pSettings->iconTextHeight() ); - - if ( (itemTextPos() == TQIconView::Right) && (maxItemWidth() != gridXValue()) ) - { - int size = m_size; - m_size = -1; // little trick to force grid change in setIcons - setIcons( size ); // force re-determining all icons - } - else if ( d->bBoostPreview != boostPreview() ) // Update icons if settings for preview icon size have changed - setIcons(m_size); - else if (!bInit) - updateContents(); - return fontChanged; -} - -bool KonqIconViewWidget::boostPreview() const -{ - if ( m_bDesktop ) return false; - - TDEConfigGroup group( TDEGlobal::config(), "PreviewSettings" ); - return group.readBoolEntry( "BoostSize", false ); -} - -void KonqIconViewWidget::disableSoundPreviews() -{ - d->bSoundPreviews = false; - - if (d->pSoundPlayer) - d->pSoundPlayer->stop(); - d->pSoundItem = 0; - if (d->pSoundTimer && d->pSoundTimer->isActive()) - d->pSoundTimer->stop(); -} - -void KonqIconViewWidget::setIcons( int size, const TQStringList& stopImagePreviewFor ) -{ - // size has changed? - bool sizeChanged = (m_size != size); - int oldGridX = gridX(); - m_size = size; - - // boost preview option has changed? - bool boost = boostPreview(); - bool previewSizeChanged = ( d->bBoostPreview != boost ); - d->bBoostPreview = boost; - - if ( sizeChanged || previewSizeChanged ) - { - int realSize = size ? size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop ); - // choose spacing depending on font, but min 5 (due to KFileIVI move limit) - setSpacing( ( m_bDesktop || ( realSize > TDEIcon::SizeSmall ) ) ? - TQMAX( 5, TQFontMetrics(font()).width('n') ) : 0 ); - } - - if ( sizeChanged || previewSizeChanged || !stopImagePreviewFor.isEmpty() ) - { - calculateGridX(); - } - bool stopAll = !stopImagePreviewFor.isEmpty() && stopImagePreviewFor.first() == "*"; - - // Disable repaints that can be triggered by ivi->setIcon(). Since icons are - // resized in-place, if the icon size is increasing it can happens that the right - // or bottom icons exceed the size of the viewport.. here we prevent the repaint - // event that will be triggered in that case. - bool prevUpdatesState = viewport()->isUpdatesEnabled(); - viewport()->setUpdatesEnabled( false ); - - // Do this even if size didn't change, since this is used by refreshMimeTypes... - for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() ) { - KFileIVI * ivi = static_cast( it ); - // Set a normal icon for files that are not thumbnails, and for files - // that are thumbnails but for which it should be stopped - if ( !ivi->isThumbnail() || - sizeChanged || - previewSizeChanged || - stopAll || - mimeTypeMatch( ivi->item()->mimetype(), stopImagePreviewFor ) ) - { - ivi->setIcon( size, ivi->state(), true, false ); - } - else - ivi->invalidateThumb( ivi->state(), true ); - } - - // Restore viewport update to previous state - viewport()->setUpdatesEnabled( prevUpdatesState ); - - if ( ( sizeChanged || previewSizeChanged || oldGridX != gridX() || - !stopImagePreviewFor.isEmpty() ) && autoArrange() ) - arrangeItemsInGrid( true ); // take new grid into account and repaint - else - viewport()->update(); //Repaint later.. -} - -bool KonqIconViewWidget::mimeTypeMatch( const TQString& mimeType, const TQStringList& mimeList ) const -{ - // Code duplication from TDEIO::PreviewJob - KMimeType::Ptr mime = KMimeType::mimeType( mimeType ); - for (TQStringList::ConstIterator mt = mimeList.begin(); mt != mimeList.end(); ++mt) - { - if ( mime->is( *mt ) ) - return true; - // Support for *mt == "image/*" - TQString tmp( mimeType ); - if ( (*mt).endsWith("*") && tmp.replace(TQRegExp("/.*"), "/*") == (*mt) ) - return true; - if ( (*mt) == "text/plain" ) - { - TQVariant textProperty = mime->property( "X-TDE-text" ); - if ( textProperty.type() == TQVariant::Bool && textProperty.toBool() ) - return true; - } - } - return false; -} - -void KonqIconViewWidget::setItemTextPos( ItemTextPos pos ) -{ - // can't call gridXValue() because this already would need the new itemTextPos() - int sz = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop ); - - if ( m_bSetGridX ) { - if ( pos == TQIconView::Bottom ) { - setGridX( TQMAX( sz + 50, previewIconSize( sz ) + 13 ) ); - } - else - { - setMaxItemWidth( TQMAX( sz, previewIconSize( sz ) ) + m_pSettings->iconTextWidth() ); - setGridX( -1 ); - } - } - - TDEIconView::setItemTextPos( pos ); -} - -void KonqIconViewWidget::gridValues( int* x, int* y, int* dx, int* dy, - int* nx, int* ny ) -{ - int previewSize = previewIconSize( m_size ); - int iconSize = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop ); - - // Grid size - // as KFileIVI limits to move an icon to x >= 5, y >= 5, we define a grid cell as: - // spacing() must be >= 5 (currently set to 5 in setIcons()) - // horizontal: left spacing() + - // vertical : top spacing(), , bottom spacing() - // The doubled space in y-direction gives a better visual separation and makes it clearer - // to which item the text belongs - *dx = spacing() + TQMAX( TQMAX( iconSize, previewSize ), m_pSettings->iconTextWidth() ); - int textHeight = iconTextHeight() * fontMetrics().height(); - *dy = spacing() + TQMAX( iconSize, previewSize ) + 2 + textHeight + spacing(); - - // Icon Area - int w, h; - if ( m_IconRect.isValid() ) { // w and h must be != 0, otherwise we would get a div by zero - *x = m_IconRect.left(); w = m_IconRect.width(); - *y = m_IconRect.top(); h = m_IconRect.height(); - } - else { - *x = 0; w = viewport()->width(); - *y = 0; h = viewport()->height(); - } - - // bug:110775 avoid div by zero (happens e.g. when iconTextHeight or iconTextWidth are very large) - if ( *dx > w ) - *dx = w; - - if ( *dy > h ) - *dy = h; - - *nx = w / *dx; - *ny = h / *dy; - // TODO: Check that items->count() <= nx * ny - - // Let have exactly nx columns and ny rows - if(*nx && *ny) { - *dx = w / *nx; - *dy = h / *ny; - } - kdDebug(1203) << "x=" << *x << " y=" << *y << " spacing=" << spacing() << " iconSize=" << iconSize - << " w=" << w << " h=" << h - << " nx=" << *nx << " ny=" << *ny - << " dx=" << *dx << " dy=" << *dy << endl; -} - -void KonqIconViewWidget::calculateGridX() -{ - if ( m_bSetGridX ) { - if ( itemTextPos() == TQIconView::Bottom ) { - setGridX( gridXValue() ); - } - else - { - setMaxItemWidth( gridXValue() ); - setGridX( -1 ); - } - } -} - -int KonqIconViewWidget::gridXValue() const -{ - // this method is only used in konqi as filemanager (not desktop) - int sz = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop ); - int newGridX; - - if ( itemTextPos() == TQIconView::Bottom ) - newGridX = TQMAX( sz + 50, previewIconSize( sz ) + 13 ); - else - newGridX = TQMAX( sz, previewIconSize( sz ) ) + m_pSettings->iconTextWidth(); - - //kdDebug(1203) << "gridXValue: " << newGridX << " sz=" << sz << endl; - return newGridX; -} - -void KonqIconViewWidget::refreshMimeTypes() -{ - updatePreviewMimeTypes(); - for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() ) - (static_cast( it ))->item()->refreshMimeType(); - setIcons( m_size ); -} - -void KonqIconViewWidget::setURL( const KURL &kurl ) -{ - stopImagePreview(); - m_url = kurl; - - d->pFileTip->setPreview( TDEGlobalSettings::showFilePreview(m_url) ); - - if ( m_url.isLocalFile() ) - m_dotDirectoryPath = m_url.path(1).append( ".directory" ); - else - m_dotDirectoryPath = TQString::null; -} - -void KonqIconViewWidget::startImagePreview( const TQStringList &, bool force ) -{ - stopImagePreview(); // just in case - - // Check config - if ( !TDEGlobalSettings::showFilePreview( url() ) ) { - kdDebug(1203) << "Previews disabled for protocol " << url().protocol() << endl; - emit imagePreviewFinished(); - return; - } - - if ((d->bSoundPreviews = d->previewSettings.contains( "audio/" )) && - !d->pSoundPlayer) - { - KLibFactory *factory = KLibLoader::self()->factory("konq_sound"); - if (factory) - d->pSoundPlayer = static_cast( - factory->create(TQT_TQOBJECT(this), 0, "KonqSoundPlayer")); - d->bSoundPreviews = (d->pSoundPlayer != 0L); - } - - KFileItemList items; - for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() ) - if ( force || !static_cast( it )->hasValidThumbnail() ) - items.append( static_cast( it )->item() ); - - bool onlyAudio = true; - for ( TQStringList::ConstIterator it = d->previewSettings.begin(); it != d->previewSettings.end(); ++it ) { - if ( (*it).startsWith( "audio/" ) ) - d->bSoundPreviews = true; - else - onlyAudio = false; - } - - if ( items.isEmpty() || onlyAudio ) { - emit imagePreviewFinished(); - return; // don't start the preview job if not really necessary - } - - int iconSize = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop ); - int size; - - d->bBoostPreview = boostPreview(); - size = previewIconSize( iconSize ); - - if ( !d->bBoostPreview ) - iconSize /= 2; - - d->pPreviewJob = TDEIO::filePreview( items, size, size, iconSize, - m_pSettings->textPreviewIconTransparency(), true /* scale */, - true /* save */, &(d->previewSettings) ); - connect( d->pPreviewJob, TQT_SIGNAL( gotPreview( const KFileItem *, const TQPixmap & ) ), - this, TQT_SLOT( slotPreview( const KFileItem *, const TQPixmap & ) ) ); - connect( d->pPreviewJob, TQT_SIGNAL( result( TDEIO::Job * ) ), - this, TQT_SLOT( slotPreviewResult() ) ); -} - -void KonqIconViewWidget::stopImagePreview() -{ - if (d->pPreviewJob) - { - d->pPreviewJob->kill(); - d->pPreviewJob = 0; - // Now that previews are updated in-place, calling - // arrangeItemsInGrid() here is not needed anymore - } -} - -bool KonqIconViewWidget::isPreviewRunning() const -{ - return d->pPreviewJob; -} - -KFileItemList KonqIconViewWidget::selectedFileItems() -{ - KFileItemList lstItems; - - TQIconViewItem *it = firstItem(); - for (; it; it = it->nextItem() ) - if ( it->isVisible() && it->isSelected() ) { - KFileItem *fItem = (static_cast(it))->item(); - lstItems.append( fItem ); - } - return lstItems; -} - -void KonqIconViewWidget::slotDropped( TQDropEvent *ev, const TQValueList & ) -{ - // Drop on background - KURL dirURL = url(); - if ( m_rootItem ) { - bool dummy; - dirURL = m_rootItem->mostLocalURL(dummy); - } - KonqOperations::doDrop( m_rootItem /* may be 0L */, dirURL, ev, this ); -} - -void KonqIconViewWidget::slotAboutToCreate(const TQPoint &, const TQValueList &) -{ - // Do nothing :-) -} - -void KonqIconViewWidget::drawBackground( TQPainter *p, const TQRect &r ) -{ - drawBackground(p, r, r.topLeft()); -} - -void KonqIconViewWidget::drawBackground( TQPainter *p, const TQRect &r , const TQPoint &pt) -{ - const TQPixmap *pm = backgroundPixmap(); - bool hasPixmap = pm && !pm->isNull(); - if ( !hasPixmap ) { - pm = viewport()->backgroundPixmap(); - hasPixmap = pm && !pm->isNull(); - } - - TQRect rtgt(r); - rtgt.moveTopLeft(pt); - if (!hasPixmap && backgroundMode() != NoBackground) { - p->fillRect(rtgt, viewport()->backgroundColor()); - return; - } - - if (hasPixmap) { - int ax = (r.x() + contentsX() + leftMargin()) % pm->width(); - int ay = (r.y() + contentsY() + topMargin()) % pm->height(); - p->drawTiledPixmap(rtgt, *pm, TQPoint(ax, ay)); - } -} - -TQDragObject * KonqIconViewWidget::dragObject() -{ - if ( !currentItem() ) - return 0; - - return konqDragObject( viewport() ); -} - -KonqIconDrag * KonqIconViewWidget::konqDragObject( TQWidget * dragSource ) -{ - //kdDebug(1203) << "KonqIconViewWidget::konqDragObject" << endl; - - KonqIconDrag2 * drag = new KonqIconDrag2( dragSource ); - TQIconViewItem *primaryItem = currentItem(); - // Append all items to the drag object - for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() ) { - if ( it->isVisible() && it->isSelected() ) { - if (!primaryItem) - primaryItem = it; - KFileItem* fileItem = (static_cast(it))->item(); - KURL url = fileItem->url(); - bool dummy; - KURL mostLocalURL = fileItem->mostLocalURL(dummy); - TQString itemURL = KURLDrag::urlToString(url); - kdDebug(1203) << "itemURL=" << itemURL << endl; - TQIconDragItem id; - id.setData( TQCString(itemURL.latin1()) ); - drag->append( id, - TQRect( it->pixmapRect(false).topLeft() - m_mousePos, - it->pixmapRect().size() ), - TQRect( it->textRect(false).topLeft() - m_mousePos, - it->textRect().size() ), - itemURL, mostLocalURL ); - } - } - - if (primaryItem) - drag->setPixmap( *primaryItem->pixmap(), m_mousePos - primaryItem->pixmapRect(false).topLeft() ); - - return drag; -} - -void KonqIconViewWidget::contentsDragEnterEvent( TQDragEnterEvent *e ) -{ - if ( e->provides( "text/uri-list" ) ) - { - TQByteArray payload = e->encodedData( "text/uri-list" ); - if ( !payload.size() ) - kdError() << "Empty data !" << endl; - // Cache the URLs, since we need them every time we move over a file - // (see KFileIVI) - bool ok = KURLDrag::decode( e, m_lstDragURLs ); - if( !ok ) - kdError() << "Couldn't decode urls dragged !" << endl; - } - - KURL::List uriList; - if ( KURLDrag::decode(e, uriList) ) - { - if ( uriList.first().protocol() == "programs" ) - { - e->ignore(); - emit dragEntered( false ); - d->bProgramsURLdrag = true; - return; - } - } - - TDEIconView::contentsDragEnterEvent( e ); - emit dragEntered( true /*accepted*/ ); -} - -void KonqIconViewWidget::contentsDragMoveEvent( TQDragMoveEvent *e ) -{ - if ( d->bProgramsURLdrag ) { - emit dragMove( false ); - e->ignore(); - cancelPendingHeldSignal(); - return; - } - - TQIconViewItem *item = findItem( e->pos() ); - if ( e->source() != viewport() && - !item && m_rootItem && !m_rootItem->isWritable() ) { - emit dragMove( false ); - e->ignore(); - cancelPendingHeldSignal(); - return; - } - emit dragMove( true ); - TDEIconView::contentsDragMoveEvent( e ); -} - -void KonqIconViewWidget::contentsDragLeaveEvent( TQDragLeaveEvent *e ) -{ - d->bProgramsURLdrag = false; - TDEIconView::contentsDragLeaveEvent(e); - emit dragLeft(); -} - - -void KonqIconViewWidget::setItemColor( const TQColor &c ) -{ - iColor = c; -} - -TQColor KonqIconViewWidget::itemColor() const -{ - return iColor; -} - -void KonqIconViewWidget::disableIcons( const KURL::List & lst ) -{ - for ( TQIconViewItem *kit = firstItem(); kit; kit = kit->nextItem() ) - { - bool bFound = false; - // Wow. This is ugly. Matching two lists together.... - // Some sorting to optimise this would be a good idea ? - for (KURL::List::ConstIterator it = lst.begin(); !bFound && it != lst.end(); ++it) - { - if ( static_cast( kit )->item()->url() == *it ) - { - bFound = true; - // maybe remove "it" from lst here ? - } - } - static_cast( kit )->setDisabled( bFound ); - } -} - -void KonqIconViewWidget::slotSelectionChanged() -{ - // This code is very related to ListViewBrowserExtension::updateActions - int canCopy = 0; - int canDel = 0; - int canTrash = 0; - bool bInTrash = false; - int iCount = 0; - - for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() ) - { - if ( it->isVisible() && it->isSelected() ) - { - iCount++; - canCopy++; - - KFileItem *item = ( static_cast( it ) )->item(); - KURL url = item->url(); - TQString local_path = item->localPath(); - - if ( url.directory(false) == TDEGlobalSettings::trashPath() ) { - bInTrash = true; - } - if ( KProtocolInfo::supportsDeleting( url ) ) { - canDel++; - } - if ( !local_path.isEmpty() ) { - canTrash++; - } - } - } - - emit enableAction( "cut", canDel > 0 ); - emit enableAction( "copy", canCopy > 0 ); - emit enableAction( "trash", canDel > 0 && !bInTrash && canTrash==canDel ); - emit enableAction( "del", canDel > 0 ); - emit enableAction( "properties", iCount > 0 && KPropertiesDialog::canDisplay( selectedFileItems() ) ); - emit enableAction( "editMimeType", ( iCount == 1 ) ); - emit enableAction( "rename", ( iCount == 1) && !bInTrash ); -} - -void KonqIconViewWidget::renameCurrentItem() -{ - if ( currentItem() ) - currentItem()->rename(); -} - -void KonqIconViewWidget::renameSelectedItem() -{ - kdDebug(1203) << " -- KonqIconViewWidget::renameSelectedItem() -- " << endl; - TQIconViewItem * item = 0L; - TQIconViewItem *it = firstItem(); - for (; it; it = it->nextItem() ) - if ( it->isVisible() && it->isSelected() && !item ) - { - item = it; - break; - } - if (!item) - { - Q_ASSERT(item); - return; - } - item->rename(); -} - -void KonqIconViewWidget::cutSelection() -{ - kdDebug(1203) << " -- KonqIconViewWidget::cutSelection() -- " << endl; - KonqIconDrag * obj = konqDragObject( /* no parent ! */ ); - obj->setMoveSelection( true ); - TQApplication::clipboard()->setData( obj ); -} - -void KonqIconViewWidget::copySelection() -{ - kdDebug(1203) << " -- KonqIconViewWidget::copySelection() -- " << endl; - KonqIconDrag * obj = konqDragObject( /* no parent ! */ ); - TQApplication::clipboard()->setData( obj ); -} - -void KonqIconViewWidget::pasteSelection() -{ - paste( url() ); -} - -void KonqIconViewWidget::paste( const KURL &url ) -{ - KonqOperations::doPaste( this, url ); -} - -KURL::List KonqIconViewWidget::selectedUrls() -{ - return selectedUrls( UserVisibleUrls ); -} - -KURL::List KonqIconViewWidget::selectedUrls( UrlFlags flags ) const -{ - KURL::List lstURLs; - bool dummy; - for ( TQIconViewItem *it = firstItem(); it; it = it->nextItem() ) - if ( it->isVisible() && it->isSelected() ) { - KFileItem* item = (static_cast( it ))->item(); - lstURLs.append( flags == MostLocalUrls ? item->mostLocalURL( dummy ) : item->url() ); - } - return lstURLs; -} - -TQRect KonqIconViewWidget::iconArea() const -{ - return m_IconRect; -} - -void KonqIconViewWidget::setIconArea(const TQRect &rect) -{ - m_IconRect = rect; -} - -int KonqIconViewWidget::lineupMode() const -{ - return m_LineupMode; -} - -void KonqIconViewWidget::setLineupMode(int mode) -{ - m_LineupMode = mode; -} - -bool KonqIconViewWidget::sortDirectoriesFirst() const -{ - return m_bSortDirsFirst; -} - -void KonqIconViewWidget::setSortDirectoriesFirst( bool b ) -{ - m_bSortDirsFirst = b; -} - -void KonqIconViewWidget::contentsMouseMoveEvent( TQMouseEvent *e ) -{ - if ( (d->pSoundPlayer && d->pSoundPlayer->isPlaying()) || (d->pSoundTimer && d->pSoundTimer->isActive())) - { - // The following call is SO expensive (the ::widgetAt call eats up to 80% - // of the mouse move cpucycles!), so it's mandatory to place that function - // under strict checks, such as d->pSoundPlayer->isPlaying() - if ( TQApplication::widgetAt( TQCursor::pos() ) != topLevelWidget() ) - { - if (d->pSoundPlayer) - d->pSoundPlayer->stop(); - d->pSoundItem = 0; - if (d->pSoundTimer && d->pSoundTimer->isActive()) - d->pSoundTimer->stop(); - } - } - d->renameItem= false; - TDEIconView::contentsMouseMoveEvent( e ); -} - -void KonqIconViewWidget::contentsDropEvent( TQDropEvent * ev ) -{ - TQIconViewItem *i = findItem( ev->pos() ); - KURL::List uriList; - - if ( ev->source() != viewport() && - !i && m_rootItem && !m_rootItem->isWritable() ) { - ev->accept( false ); - return; - } - - // Short-circuit TQIconView if Ctrl is pressed, so that it's possible - // to drop a file into its own parent widget to copy it. - if ( !i && (ev->action() == TQDropEvent::Copy || ev->action() == TQDropEvent::Link) - && ev->source() && ev->source() == viewport() - && KURLDrag::decode(ev, uriList) && !uriList.isEmpty() - && uriList.first().upURL().url(1) == url().url(1)) - { - // First we need to call TQIconView though, to clear the drag shape - bool bMovable = itemsMovable(); - setItemsMovable(false); // hack ? call it what you want :-) - TDEIconView::contentsDropEvent( ev ); - setItemsMovable(bMovable); - - TQValueList lst; - slotDropped(ev, lst); - } - else - { - TDEIconView::contentsDropEvent( ev ); - emit dropped(); // What is this for ? (David) KDE4: remove - } - // Don't do this here, it's too early ! - // slotSaveIconPositions(); - // If we want to save after the new file gets listed, though, - // we could reimplement contentsDropEvent in KDIconView and set m_bNeedSave. Bah. - - // This signal is sent last because we need to ensure it is - // taken in account when all the slots triggered by the dropped() signal - // are executed. This way we know that the Drag and Drop is truely finished - emit dragFinished(); -} - -void KonqIconViewWidget::doubleClickTimeout() -{ - d->renameItem= true; - mousePressChangeValue(); - if ( d->releaseMouseEvent ) - { - TQMouseEvent e( TQEvent::MouseButtonPress,d->mousePos , 1, d->mouseState); - TQIconViewItem* item = findItem( e.pos() ); - KURL url; - if ( item ) - { - url= ( static_cast( item ) )->item()->url(); - bool brenameTrash =false; - if ( url.isLocalFile() && (url.directory(false) == TDEGlobalSettings::trashPath() || url.path(1).startsWith(TDEGlobalSettings::trashPath()))) - brenameTrash = true; - - if ( url.isLocalFile() && !brenameTrash && d->renameItem && m_pSettings->renameIconDirectly() && e.button() == Qt::LeftButton && item->textRect( false ).contains(e.pos())) - { - if( d->pActivateDoubleClick->isActive () ) - d->pActivateDoubleClick->stop(); - item->rename(); - m_bMousePressed = false; - } - } - } - else - { - TQMouseEvent e( TQEvent::MouseMove,d->mousePos , 1, d->mouseState); - TDEIconView::contentsMousePressEvent( &e ); - } - if( d->pActivateDoubleClick->isActive() ) - d->pActivateDoubleClick->stop(); - - d->releaseMouseEvent = false; - d->renameItem= false; -} - -void KonqIconViewWidget::wheelEvent(TQWheelEvent* e) -{ - // when scrolling with mousewheel, stop possible pending filetip - d->pFileTip->setItem( 0 ); - - if (e->state() == ControlButton) - { - if (e->delta() >= 0) - { - emit incIconSize(); - } - else - { - emit decIconSize(); - } - e->accept(); - return; - } - - TDEIconView::wheelEvent(e); -} - -void KonqIconViewWidget::leaveEvent( TQEvent *e ) -{ - // when leaving the widget, stop possible pending filetip and icon effect - slotOnViewport(); - - TDEIconView::leaveEvent(e); -} - -void KonqIconViewWidget::mousePressChangeValue() -{ - //kdDebug(1203) << "KonqIconViewWidget::contentsMousePressEvent" << endl; - m_bMousePressed = true; - if (d->pSoundPlayer) - d->pSoundPlayer->stop(); - d->bSoundItemClicked = true; - d->firstClick = false; - - // Once we click on the item, we don't want a tooltip - // Fixes part of #86968 - d->pFileTip->setItem( 0 ); -} - -void KonqIconViewWidget::contentsMousePressEvent( TQMouseEvent *e ) -{ - if(d->pActivateDoubleClick && d->pActivateDoubleClick->isActive ()) - d->pActivateDoubleClick->stop(); - TQIconViewItem* item = findItem( e->pos() ); - m_mousePos = e->pos(); - KURL url; - if ( item ) - { - url = ( static_cast( item ) )->item()->url(); - bool brenameTrash =false; - if ( url.isLocalFile() && (url.directory(false) == TDEGlobalSettings::trashPath() || url.path(1).startsWith(TDEGlobalSettings::trashPath()))) - brenameTrash = true; - 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)) - { - d->firstClick = true; - d->mousePos = e->pos(); - d->mouseState = e->state(); - if (!d->pActivateDoubleClick) - { - d->pActivateDoubleClick = new TQTimer(this); - connect(d->pActivateDoubleClick, TQT_SIGNAL(timeout()), this, TQT_SLOT(doubleClickTimeout())); - } - if( d->pActivateDoubleClick->isActive () ) - d->pActivateDoubleClick->stop(); - else - d->pActivateDoubleClick->start(TQApplication::doubleClickInterval()); - d->releaseMouseEvent = false; - return; - } - else - d->renameItem= false; - } - else - d->renameItem= false; - mousePressChangeValue(); - if(d->pActivateDoubleClick && d->pActivateDoubleClick->isActive()) - d->pActivateDoubleClick->stop(); - TDEIconView::contentsMousePressEvent( e ); - -} - -void KonqIconViewWidget::contentsMouseReleaseEvent( TQMouseEvent *e ) -{ - TDEIconView::contentsMouseReleaseEvent( e ); - if(d->releaseMouseEvent && d->pActivateDoubleClick && d->pActivateDoubleClick->isActive ()) - d->pActivateDoubleClick->stop(); - slotSelectionChanged(); - d->releaseMouseEvent = true; - m_bMousePressed = false; -} - -void KonqIconViewWidget::slotSaveIconPositions() -{ - // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING - // This code is currently not used but left in for compatibility reasons. - // It can be removed in KDE 4.0 - // Saving of desktop icon positions is now done in KDIconView::saveIconPositions() - // in tdebase/kdesktop/kdiconview.cc - // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING - - printf("WARNING: Strongly deprecated method KonqIconViewWidget::slotSaveIconPositions() called!\n"); fflush(stdout); - - if ( m_dotDirectoryPath.isEmpty() ) - return; - if ( !m_bDesktop ) - return; // Currently not available in Konqueror - kdDebug(1214) << "KonqIconViewWidget::slotSaveIconPositions" << endl; - KSimpleConfig dotDirectory( m_dotDirectoryPath ); - TQIconViewItem *it = firstItem(); - if ( !it ) - return; // No more icons. Maybe we're closing and they've been removed already - while ( it ) - { - KFileIVI *ivi = static_cast( it ); - KFileItem *item = ivi->item(); - - dotDirectory.setGroup( TQString( m_iconPositionGroupPrefix ).append( item->url().fileName() ) ); - kdDebug(1214) << "KonqIconViewWidget::slotSaveIconPositions " << item->url().fileName() << " " << it->x() << " " << it->y() << endl; - dotDirectory.writeEntry( TQString( "X %1" ).arg( width() ), it->x() ); - dotDirectory.writeEntry( TQString( "Y %1" ).arg( height() ), it->y() ); - dotDirectory.writeEntry( "Exists", true ); - - it = it->nextItem(); - } - - TQStringList groups = dotDirectory.groupList(); - TQStringList::ConstIterator gIt = groups.begin(); - TQStringList::ConstIterator gEnd = groups.end(); - for (; gIt != gEnd; ++gIt ) - if ( (*gIt).left( m_iconPositionGroupPrefix.length() ) == m_iconPositionGroupPrefix ) - { - dotDirectory.setGroup( *gIt ); - if ( dotDirectory.hasKey( "Exists" ) ) - dotDirectory.deleteEntry( "Exists", false ); - else - { - kdDebug(1214) << "KonqIconViewWidget::slotSaveIconPositions deleting group " << *gIt << endl; - dotDirectory.deleteGroup( *gIt ); - } - } - - dotDirectory.sync(); - - // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING - // This code is currently not used but left in for compatibility reasons. - // It can be removed in KDE 4.0 - // Saving of desktop icon positions is now done in KDIconView::saveIconPositions() - // in tdebase/kdesktop/kdiconview.cc - // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING -} - -// Adapted version of TQIconView::insertInGrid, that works relative to -// m_IconRect, instead of the entire viewport. - -void KonqIconViewWidget::insertInGrid(TQIconViewItem *item) -{ - if (0L == item) - return; - - if (!m_IconRect.isValid()) - { - TDEIconView::insertInGrid(item); - return; - } - - TQRegion r(m_IconRect); - TQIconViewItem *i = firstItem(); - int y = -1; - for (; i; i = i->nextItem() ) - { - r = r.subtract(i->rect()); - y = TQMAX(y, i->y() + i->height()); - } - - TQMemArray rects = r.rects(); - TQMemArray::Iterator it = rects.begin(); - bool foundPlace = FALSE; - for (; it != rects.end(); ++it) - { - TQRect rect = *it; - if (rect.width() >= item->width() && rect.height() >= item->height()) - { - int sx = 0, sy = 0; - if (rect.width() >= item->width() + spacing()) - sx = spacing(); - if (rect.height() >= item->height() + spacing()) - sy = spacing(); - item->move(rect.x() + sx, rect.y() + sy); - foundPlace = true; - break; - } - } - - if (!foundPlace) - item->move(m_IconRect.topLeft()); - - //item->dirty = false; - return; -} - - -/* - * The algorithm used for lineing up the icons could be called - * "beating flat the icon field". Imagine the icon field to be some height - * field on a regular grid, with the height being the number of icons in - * each grid element. Now imagine slamming on the field with a shovel or - * some other flat surface. The high peaks will be flattened and spread out - * over their adjacent areas. This is basically what the algorithm tries to - * simulate. - * - * First, the icons are binned to a grid of the desired size. If all bins - * are containing at most one icon, we're done, of course. We just have to - * move all icons to the center of each grid element. - * For each bin which has more than one icon in it, we calculate 4 - * "friction coefficients", one for each cardinal direction. The friction - * coefficient of a direction is the number of icons adjacent in that - * direction. The idea is that this number is somewhat a measure in which - * direction the icons should flow: icons flow in the direction of lowest - * friction coefficient. We move a maximum of one icon per bin and loop over - * all bins. This procedure is repeated some maximum number of times or until - * no icons are moved anymore. - * - * I don't know if this algorithm is good or bad, I don't even know if it will - * work all the time. It seems a correct thing to do, however, and it seems to - * work particularly well. In any case, the number of runs is limited so there - * can be no races. - */ - -void KonqIconViewWidget::lineupIcons() -{ - // even if there are no items yet, calculate the maxItemWidth to have the correct - // item rect when we insert new items - - // Create a grid of (ny x nx) bins. - int x0, y0, dx, dy, nx, ny; - gridValues( &x0, &y0, &dx, &dy, &nx, &ny ); - - int itemWidth = dx - spacing(); - bool newItemWidth = false; - if ( maxItemWidth() != itemWidth ) { - newItemWidth = true; - setMaxItemWidth( itemWidth ); - setFont( font() ); // Force calcRect() - } - - if ( !firstItem() ) { - kdDebug(1203) << "No icons at all ?\n"; - return; - } - - int iconSize = m_size ? m_size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop ); - - typedef TQValueList Bin; - Bin*** bins = new Bin**[nx]; - int i; - int j; - for ( i = 0; i < nx ; i++ ) { - bins[i] = new Bin*[ny]; - for ( j = 0; j < ny; j++ ) - bins[i][j] = 0L; - } - - // Insert items into grid - int textHeight = iconTextHeight() * fontMetrics().height(); - - for ( TQIconViewItem* item = firstItem(); item; item = item->nextItem() ) { - int x = item->x() + item->width() / 2 - x0; - int y = item->pixmapRect( false ).bottom() - iconSize / 2 - - ( dy - ( iconSize + textHeight ) ) / 2 - y0; - int posX = TQMIN( nx-1, TQMAX( 0, x / dx ) ); - int posY = TQMIN( ny-1, TQMAX( 0, y / dy ) ); - - if ( !bins[posX][posY] ) - bins[posX][posY] = new Bin; - bins[posX][posY]->prepend( item ); - } - - // The shuffle code - int n, k; - const int infinity = 10000; - int nmoves = 1; - for ( n = 0; n < 30 && nmoves > 0; n++ ) { - nmoves = 0; - for ( i = 0; i < nx; i++ ) { - for ( j = 0; j < ny; j++ ) { - if ( !bins[i][j] || ( bins[i][j]->count() <= 1 ) ) - continue; - - // Calculate the 4 "friction coefficients". - int tf = 0, bf = 0, lf = 0, rf = 0; - for ( k = j-1; k >= 0 && bins[i][k] && bins[i][k]->count(); k-- ) - tf += bins[i][k]->count(); - if ( k == -1 ) - tf += infinity; - - for ( k = j+1; k < ny && bins[i][k] && bins[i][k]->count(); k++ ) - bf += bins[i][k]->count(); - if ( k == ny ) - bf += infinity; - - for ( k = i-1; k >= 0 && bins[k][j] && bins[k][j]->count(); k-- ) - lf += bins[k][j]->count(); - if ( k == -1 ) - lf += infinity; - - for ( k = i+1; k < nx && bins[k][j] && bins[k][j]->count(); k++ ) - rf += bins[k][j]->count(); - if ( k == nx ) - rf += infinity; - - // If we are stuck between walls, continue - if ( tf >= infinity && bf >= infinity && - lf >= infinity && rf >= infinity ) - continue; - - // Is there a preferred lineup direction? - if ( m_LineupMode == LineupHorizontal ) { - tf += infinity; - bf += infinity; - } - else if ( m_LineupMode == LineupVertical ) { - lf += infinity; - rf += infinity; - } - - // Move one item in the direction of the least friction - TQIconViewItem* movedItem; - Bin* items = bins[i][j]; - - int mini = TQMIN( TQMIN( tf, bf ), TQMIN( lf, rf ) ); - if ( tf == mini ) { - // move top item in (i,j) to (i,j-1) - Bin::iterator it = items->begin(); - movedItem = *it; - for ( ++it; it != items->end(); ++it ) { - if ( (*it)->y() < movedItem->y() ) - movedItem = *it; - } - items->remove( movedItem ); - if ( !bins[i][j-1] ) - bins[i][j-1] = new Bin; - bins[i][j-1]->prepend( movedItem ); - } - else if ( bf ==mini ) { - // move bottom item in (i,j) to (i,j+1) - Bin::iterator it = items->begin(); - movedItem = *it; - for ( ++it; it != items->end(); ++it ) { - if ( (*it)->y() > movedItem->y() ) - movedItem = *it; - } - items->remove( movedItem ); - if ( !bins[i][j+1] ) - bins[i][j+1] = new Bin; - bins[i][j+1]->prepend( movedItem ); - } - else if ( lf == mini ) - { - // move left item in (i,j) to (i-1,j) - Bin::iterator it = items->begin(); - movedItem = *it; - for ( ++it; it != items->end(); ++it ) { - if ( (*it)->x() < movedItem->x() ) - movedItem = *it; - } - items->remove( movedItem ); - if ( !bins[i-1][j] ) - bins[i-1][j] = new Bin; - bins[i-1][j]->prepend( movedItem ); - } - else { - // move right item in (i,j) to (i+1,j) - Bin::iterator it = items->begin(); - movedItem = *it; - for ( ++it; it != items->end(); ++it ) { - if ( (*it)->x() > movedItem->x() ) - movedItem = *it; - } - items->remove( movedItem ); - if ( !bins[i+1][j] ) - bins[i+1][j] = new Bin; - bins[i+1][j]->prepend( movedItem ); - } - nmoves++; - } - } - } - - // Perform the actual moving - TQRegion repaintRegion; - TQValueList movedItems; - - for ( i = 0; i < nx; i++ ) { - for ( j = 0; j < ny; j++ ) { - Bin* bin = bins[i][j]; - if ( !bin ) - continue; - if ( !bin->isEmpty() ) { - TQIconViewItem* item = bin->first(); - int newX = x0 + i*dx + spacing() + - TQMAX(0, ( (dx-spacing()) - item->width() ) / 2); // pixmap can be larger as iconsize - // align all icons vertically to their text - int newY = y0 + j*dy + dy - spacing() - ( item->pixmapRect().bottom() + 2 + textHeight ); - if ( item->x() != newX || item->y() != newY ) { - TQRect oldRect = item->rect(); - movedItems.prepend( item ); - item->move( newX, newY ); - if ( item->rect() != oldRect ) - repaintRegion = repaintRegion.unite( oldRect ); - } - } - delete bin; - bins[i][j] = 0L; - } - } - - // repaint - if ( newItemWidth ) - updateContents(); - else { - // Repaint only repaintRegion... - TQMemArray rects = repaintRegion.rects(); - for ( uint l = 0; l < rects.count(); l++ ) { - kdDebug( 1203 ) << "Repainting (" << rects[l].x() << "," - << rects[l].y() << ")\n"; - repaintContents( rects[l], false ); - } - // Repaint icons that were moved - while ( !movedItems.isEmpty() ) { - repaintItem( movedItems.first() ); - movedItems.remove( movedItems.first() ); - } - } - - for ( i = 0; i < nx ; i++ ) { - delete [] bins[i]; - } - delete [] bins; -} - -void KonqIconViewWidget::lineupIcons( TQIconView::Arrangement arrangement ) -{ - int x0, y0, dx, dy, nxmax, nymax; - gridValues( &x0, &y0, &dx, &dy, &nxmax, &nymax ); - int textHeight = iconTextHeight() * fontMetrics().height(); - - TQRegion repaintRegion; - TQValueList movedItems; - int nx = 0, ny = 0; - - TQIconViewItem* item; - for ( item = firstItem(); item; item = item->nextItem() ) { - int newX = x0 + nx*dx + spacing() + - TQMAX(0, ( (dx-spacing()) - item->width() ) / 2); // icon can be larger as defined - // align all icons vertically to their text - int newY = y0 + ny*dy + dy - spacing() - ( item->pixmapRect().bottom() + 2 + textHeight ); - if ( item->x() != newX || item->y() != newY ) { - TQRect oldRect = item->rect(); - movedItems.prepend( item ); - item->move( newX, newY ); - if ( item->rect() != oldRect ) - repaintRegion = repaintRegion.unite( oldRect ); - } - if ( arrangement == TQIconView::LeftToRight ) { - nx++; - if ( nx >= nxmax ) { - ny++; - nx = 0; - } - } - else { - ny++; - if ( ny >= nymax ) { - nx++; - ny = 0; - } - } - } - - // Repaint only repaintRegion... - TQMemArray rects = repaintRegion.rects(); - for ( uint l = 0; l < rects.count(); l++ ) { - kdDebug( 1203 ) << "Repainting (" << rects[l].x() << "," - << rects[l].y() << ")\n"; - repaintContents( rects[l], false ); - } - // Repaint icons that were moved - while ( !movedItems.isEmpty() ) { - repaintItem( movedItems.first() ); - movedItems.remove( movedItems.first() ); - } -} - -int KonqIconViewWidget::largestPreviewIconSize( int size ) const -{ - int iconSize = size ? size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop ); - - if (iconSize < 28) - return 48; - if (iconSize < 40) - return 64; - if (iconSize < 60) - return 96; - if (iconSize < 120) - return 128; - - return 192; -} - -int KonqIconViewWidget::previewIconSize( int size ) const -{ - int iconSize = size ? size : TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop ); - - if (!d->bBoostPreview) - return iconSize; - - return largestPreviewIconSize( iconSize ); -} - -void KonqIconViewWidget::visualActivate(TQIconViewItem * item) -{ - // Rect of the TQIconViewItem. - TQRect irect = item->rect(); - - // Rect of the QIconViewItem's pixmap area. - TQRect rect = item->pixmapRect(); - - // Adjust to correct position. If this isn't done, the fact that the - // text may be wider than the pixmap puts us off-centre. - rect.moveBy(irect.x(), irect.y()); - - // Adjust for scrolling (David) - rect.moveBy( -contentsX(), -contentsY() ); - - if (TDEGlobalSettings::showKonqIconActivationEffect() == true) { - TDEIconEffect::visualActivate(viewport(), rect, item->pixmap()); - } -} - -void KonqIconViewWidget::backgroundPixmapChange( const TQPixmap & ) -{ - viewport()->update(); -} - -void KonqIconViewWidget::setPreviewSettings( const TQStringList& settings ) -{ - d->previewSettings = settings; - updatePreviewMimeTypes(); - - int size = m_size; - m_size = -1; // little trick to force grid change in setIcons - setIcons( size ); // force re-determining all icons -} - -const TQStringList& KonqIconViewWidget::previewSettings() -{ - return d->previewSettings; -} - -void KonqIconViewWidget::setNewURL( const TQString& url ) -{ - KURL u; - if ( url.startsWith( "/" ) ) - u.setPath( url ); - else - u = url; - setURL( u ); -} - -void KonqIconViewWidget::setCaseInsensitiveSort( bool b ) -{ - d->bCaseInsensitive = b; -} - -bool KonqIconViewWidget::caseInsensitiveSort() const -{ - return d->bCaseInsensitive; -} - -bool KonqIconViewWidget::canPreview( KFileItem* item ) -{ - if ( !TDEGlobalSettings::showFilePreview( url() ) ) - return false; - - if ( d->pPreviewMimeTypes == 0L ) - updatePreviewMimeTypes(); - - return mimeTypeMatch( item->mimetype(), *( d->pPreviewMimeTypes ) ); -} - -void KonqIconViewWidget::updatePreviewMimeTypes() -{ - if ( d->pPreviewMimeTypes == 0L ) - d->pPreviewMimeTypes = new TQStringList; - else - d->pPreviewMimeTypes->clear(); - - // Load the list of plugins to determine which mimetypes are supported - TDETrader::OfferList plugins = TDETrader::self()->query("ThumbCreator"); - TDETrader::OfferList::ConstIterator it; - - for ( it = plugins.begin(); it != plugins.end(); ++it ) { - if ( d->previewSettings.contains((*it)->desktopEntryName()) ) { - TQStringList mimeTypes = (*it)->property("MimeTypes").toStringList(); - for (TQStringList::ConstIterator mt = mimeTypes.begin(); mt != mimeTypes.end(); ++mt) - d->pPreviewMimeTypes->append(*mt); - } - } -} - -#include "konq_iconviewwidget.moc" -- cgit v1.2.1