23 #include <tqfontmetrics.h> 24 #include <tqkeycode.h> 26 #include <tqpainter.h> 30 #include <tqtooltip.h> 32 #include <tdeaction.h> 33 #include <tdeapplication.h> 34 #include <tdelocale.h> 35 #include <tdefileitem.h> 36 #include <kiconeffect.h> 37 #include <tdeglobalsettings.h> 39 #include <tdeio/previewjob.h> 41 #include "tdefileiconview.h" 42 #include "config-tdefile.h" 44 #define DEFAULT_PREVIEW_SIZE 60 45 #define DEFAULT_SHOW_PREVIEWS false 46 #define DEFAULT_VIEW_MODE "SmallColumns" 48 KFileIconViewItem::~KFileIconViewItem()
50 fileInfo()->removeExtraData( iconView() );
53 class KFileIconView::KFileIconViewPrivate
61 noArrangement =
false;
62 ignoreMaximumSize =
false;
63 smallColumns =
new TDERadioAction( i18n(
"Small Icons"), 0, TQT_TQOBJECT(parent),
64 TQT_SLOT( slotSmallColumns() ),
68 largeRows =
new TDERadioAction( i18n(
"Large Icons"), 0, TQT_TQOBJECT(parent),
69 TQT_SLOT( slotLargeRows() ),
73 smallColumns->setExclusiveGroup(TQString::fromLatin1(
"IconView mode"));
74 largeRows->setExclusiveGroup(TQString::fromLatin1(
"IconView mode"));
76 previews =
new TDEToggleAction( i18n(
"Thumbnail Previews"), 0,
79 zoomIn = KStdAction::zoomIn( TQT_TQOBJECT(parent), TQT_SLOT( zoomIn() ),
81 zoomOut = KStdAction::zoomOut( TQT_TQOBJECT(parent), TQT_SLOT( zoomOut() ),
84 previews->setGroup(
"previews");
85 zoomIn->setGroup(
"previews");
86 zoomOut->setGroup(
"previews");
88 connect( previews, TQT_SIGNAL( toggled(
bool )),
89 parent, TQT_SLOT( slotPreviewsToggled(
bool )));
91 connect( &previewTimer, TQT_SIGNAL( timeout() ),
92 parent, TQT_SLOT( showPreviews() ));
93 connect( &autoOpenTimer, TQT_SIGNAL( timeout() ),
94 parent, TQT_SLOT( slotAutoOpen() ));
97 ~KFileIconViewPrivate() {
102 TDERadioAction *smallColumns, *largeRows;
103 TDEAction *zoomIn, *zoomOut;
104 TDEToggleAction *previews;
105 TDEIO::PreviewJob *job;
107 TQTimer previewTimer;
108 TQTimer autoOpenTimer;
109 TQStringList previewMimeTypes;
111 bool noArrangement :1;
112 bool ignoreMaximumSize :1;
115 KFileIconView::KFileIconView(TQWidget *parent,
const char *name)
118 d =
new KFileIconViewPrivate(
this );
120 setViewName( i18n(
"Icon View") );
123 setResizeMode( Adjust );
124 setMaxItemWidth( 300 );
125 setWordWrapIconText(
false );
126 setArrangement( TopToBottom );
127 setAutoArrange(
true );
128 setItemsMovable(
false );
129 setMode( TDEIconView::Select );
130 TDEIconView::setSorting(
true );
133 setShowToolTips(
false );
135 d->smallColumns->setChecked(
true );
137 connect(
this, TQT_SIGNAL( returnPressed(TQIconViewItem *) ),
138 TQT_SLOT( slotActivate( TQIconViewItem *) ) );
141 connect(
this, TQT_SIGNAL( clicked(TQIconViewItem *,
const TQPoint&) ),
142 TQT_SLOT( selected( TQIconViewItem *) ) );
143 connect(
this, TQT_SIGNAL( doubleClicked(TQIconViewItem *,
const TQPoint&) ),
144 TQT_SLOT( slotActivate( TQIconViewItem *) ) );
146 connect(
this, TQT_SIGNAL( onItem( TQIconViewItem * ) ),
147 TQT_SLOT( showToolTip( TQIconViewItem * ) ) );
148 connect(
this, TQT_SIGNAL( onViewport() ),
149 TQT_SLOT( removeToolTip() ) );
150 connect(
this, TQT_SIGNAL( contextMenuRequested(TQIconViewItem*,
const TQPoint&)),
151 TQT_SLOT( slotActivateMenu( TQIconViewItem*,
const TQPoint& ) ) );
153 KFile::SelectionMode sm = KFileView::selectionMode();
156 TQIconView::setSelectionMode( TQIconView::Multi );
158 case KFile::Extended:
159 TQIconView::setSelectionMode( TQIconView::Extended );
161 case KFile::NoSelection:
162 TQIconView::setSelectionMode( TQIconView::NoSelection );
166 TQIconView::setSelectionMode( TQIconView::Single );
170 if ( sm == KFile::Multi || sm == KFile::Extended )
172 TQT_SLOT( slotSelectionChanged() ));
175 TQT_SLOT( highlighted( TQIconViewItem * )));
177 viewport()->installEventFilter(
this );
180 m_resolver =
new KMimeTypeResolver<KFileIconViewItem,KFileIconView>(
this);
183 KFileIconView::~KFileIconView()
190 void KFileIconView::readConfig( TDEConfig *kc,
const TQString& group )
192 TQString gr = group.isEmpty() ? TQString(
"KFileIconView") : group;
193 TDEConfigGroupSaver cs( kc, gr );
194 TQString small = TQString::fromLatin1(
"SmallColumns");
195 d->previewIconSize = kc->readNumEntry(
"Preview Size", DEFAULT_PREVIEW_SIZE );
196 d->previews->setChecked( kc->readBoolEntry(
"ShowPreviews", DEFAULT_SHOW_PREVIEWS ) );
198 if ( kc->readEntry(
"ViewMode", DEFAULT_VIEW_MODE ) == small ) {
199 d->smallColumns->setChecked(
true );
203 d->largeRows->setChecked(
true );
207 if ( d->previews->isChecked() )
211 void KFileIconView::writeConfig( TDEConfig *kc,
const TQString& group )
213 TQString gr = group.isEmpty() ? TQString(
"KFileIconView") : group;
214 TDEConfigGroupSaver cs( kc, gr );
216 TQString viewMode = d->smallColumns->isChecked() ?
217 TQString::fromLatin1(
"SmallColumns") :
218 TQString::fromLatin1(
"LargeRows");
219 if(!kc->hasDefault(
"ViewMode" ) && viewMode == DEFAULT_VIEW_MODE )
220 kc->revertToDefault(
"ViewMode" );
222 kc->writeEntry(
"ViewMode", viewMode );
224 int previewsIconSize = d->previewIconSize;
225 if(!kc->hasDefault(
"Preview Size" ) && previewsIconSize == DEFAULT_PREVIEW_SIZE )
226 kc->revertToDefault(
"Preview Size" );
228 kc->writeEntry(
"Preview Size", previewsIconSize );
230 bool showPreviews = d->previews->isChecked();
231 if(!kc->hasDefault(
"ShowPreviews" ) && showPreviews == DEFAULT_SHOW_PREVIEWS )
232 kc->revertToDefault(
"ShowPreviews" );
234 kc->writeEntry(
"ShowPreviews", showPreviews );
237 void KFileIconView::removeToolTip()
243 void KFileIconView::showToolTip( TQIconViewItem *item )
251 int w = maxItemWidth() - ( itemTextPos() == TQIconView::Bottom ? 0 :
252 item->pixmapRect().width() ) - 4;
253 if ( fontMetrics().width( item->text() ) >= w ) {
254 toolTip =
new TQLabel( TQString::fromLatin1(
" %1 ").arg(item->text()), 0,
256 (WFlags)(WStyle_StaysOnTop | WStyle_Customize | WStyle_NoBorder | WStyle_Tool | WX11BypassWM) );
257 toolTip->setFrameStyle( TQFrame::Plain | TQFrame::Box );
258 toolTip->setLineWidth( 1 );
259 toolTip->setAlignment( AlignLeft | AlignTop );
260 toolTip->move( TQCursor::pos() + TQPoint( 14, 14 ) );
261 toolTip->adjustSize();
262 TQRect screen = TQApplication::desktop()->screenGeometry(
263 TQApplication::desktop()->screenNumber(TQCursor::pos()));
264 if (toolTip->x()+toolTip->width() > screen.right()) {
265 toolTip->move(toolTip->x()+screen.right()-toolTip->x()-toolTip->width(), toolTip->y());
267 if (toolTip->y()+toolTip->height() > screen.bottom()) {
268 toolTip->move(toolTip->x(), screen.bottom()-toolTip->y()-toolTip->height()+toolTip->y());
270 toolTip->setFont( TQToolTip::font() );
271 toolTip->setPalette( TQToolTip::palette(),
true );
276 void KFileIconView::slotActivateMenu( TQIconViewItem* item,
const TQPoint& pos )
279 sig->activateMenu( 0, pos );
283 sig->activateMenu( i->
fileInfo(), pos );
289 TDEIconView::hideEvent( e );
294 TDEIconView::keyPressEvent( e );
297 if ( (e->state() & ControlButton) &&
298 (e->key() == Key_Return || e->key() == Key_Enter) )
306 TDEIconView::setSelected( item, enable,
true );
311 if (KFileView::selectionMode() == KFile::NoSelection ||
312 KFileView::selectionMode() == KFile::Single)
315 TDEIconView::selectAll(
true );
320 TDEIconView::clearSelection();
325 TDEIconView::invertSelection();
330 m_resolver->m_lstPendingMimeIconItems.clear();
332 TDEIconView::clear();
340 TQIconView* qview =
static_cast<TQIconView*
>( this );
343 qview->setUpdatesEnabled(
false );
345 initItem( item, i,
true );
346 qview->setUpdatesEnabled(
true );
348 if ( !i->isMimeTypeKnown() )
349 m_resolver->m_lstPendingMimeIconItems.append( item );
351 i->setExtraData(
this, item );
354 void KFileIconView::slotActivate( TQIconViewItem *item )
363 void KFileIconView::selected( TQIconViewItem *item )
365 if ( !item || (TDEApplication::keyboardMouseState() & (ShiftButton | ControlButton)) != 0 )
368 if ( TDEGlobalSettings::singleClick() ) {
370 if ( fi && (fi->isDir() || !onlyDoubleClickSelectsFiles()) )
379 TDEIconView::setCurrentItem( it );
391 void KFileIconView::highlighted( TQIconViewItem *item )
397 sig->highlightFile( fi );
400 void KFileIconView::setSelectionMode( KFile::SelectionMode sm )
405 KFileView::setSelectionMode( sm );
406 switch ( KFileView::selectionMode() ) {
408 TQIconView::setSelectionMode( TQIconView::Multi );
410 case KFile::Extended:
411 TQIconView::setSelectionMode( TQIconView::Extended );
413 case KFile::NoSelection:
414 TQIconView::setSelectionMode( TQIconView::NoSelection );
418 TQIconView::setSelectionMode( TQIconView::Single );
422 if ( sm == KFile::Multi || sm == KFile::Extended )
424 TQT_SLOT( slotSelectionChanged() ));
427 TQT_SLOT( highlighted( TQIconViewItem * )));
433 return (item && item->isSelected());
444 if ( d->previews->isChecked() ) {
445 if ( canPreview( item->
fileInfo() ) )
446 item->setPixmapSize( TQSize( d->previewIconSize, d->previewIconSize ) );
450 if ( !item->pixmapSize().isNull() )
451 item->setPixmapSize( TQSize( 0, 0 ) );
454 item->setPixmap( (item->
fileInfo())->pixmap( myIconSize ),
true, false );
456 }
while ( item != 0L );
464 initItem( item, i,
true );
473 d->job->removeItem( i );
476 m_resolver->m_lstPendingMimeIconItems.remove( item );
493 d->previewIconSize = size;
494 if ( d->previews->isChecked() )
500 d->ignoreMaximumSize = ignoreSize;
503 void KFileIconView::updateIcons()
506 arrangeItemsInGrid();
513 TDEIconView::ensureItemVisible( item );
516 void KFileIconView::slotSelectionChanged()
518 sig->highlightFile( 0L );
521 void KFileIconView::slotSmallColumns()
525 d->noArrangement =
true;
528 if ( d->previews->isChecked() )
531 d->previews->setChecked(
false );
534 setMaxItemWidth( 300 );
535 setItemTextPos( Right );
536 setArrangement( TopToBottom );
537 setWordWrapIconText(
false );
540 d->noArrangement =
false;
541 setIconSize( TDEIcon::SizeSmall );
544 void KFileIconView::slotLargeRows()
548 d->noArrangement =
true;
550 setGridX( TDEGlobal::iconLoader()->currentSize( TDEIcon::Desktop ) + 50 );
551 setItemTextPos( Bottom );
552 setArrangement( LeftToRight );
553 setWordWrapIconText(
true );
556 d->noArrangement =
false;
557 setIconSize( TDEIcon::SizeMedium );
560 void KFileIconView::stopPreview()
568 void KFileIconView::slotPreviewsToggled(
bool on )
580 if ( d->previewMimeTypes.isEmpty() )
581 d->previewMimeTypes = TDEIO::PreviewJob::supportedMimeTypes();
584 d->previews->setChecked(
true );
586 if ( !d->largeRows->isChecked() ) {
587 d->largeRows->setChecked(
true );
594 d->job = TDEIO::filePreview(*items(), d->previewIconSize,d->previewIconSize);
595 d->job->setIgnoreMaximumSize(d->ignoreMaximumSize);
597 connect( d->job, TQT_SIGNAL( result( TDEIO::Job * )),
598 this, TQT_SLOT( slotPreviewResult( TDEIO::Job * )));
599 connect( d->job, TQT_SIGNAL( gotPreview(
const KFileItem*,
const TQPixmap& )),
600 TQT_SLOT( gotPreview(
const KFileItem*,
const TQPixmap& ) ));
605 void KFileIconView::slotPreviewResult( TDEIO::Job *job )
611 void KFileIconView::gotPreview(
const KFileItem *item,
const TQPixmap& pix )
615 if( item->overlays() & TDEIcon::HiddenOverlay )
619 TDEIconEffect::semiTransparent( p );
623 it->setPixmap( pix );
628 bool KFileIconView::canPreview(
const KFileItem *item )
const 630 TQStringList::Iterator it = d->previewMimeTypes.begin();
632 r.setWildcard(
true );
634 for ( ; it != d->previewMimeTypes.end(); ++it ) {
637 if ( type.at( type.length() - 1 ) ==
'*' ) {
638 r.setPattern( type );
639 if ( r.search( item->mimetype() ) != -1 )
643 if ( item->mimetype() == type )
650 KFileItem * KFileIconView::firstFileItem()
const 658 KFileItem * KFileIconView::nextItem(
const KFileItem *fileItem )
const 662 if ( item && item->nextItem() )
668 KFileItem * KFileIconView::prevItem(
const KFileItem *fileItem )
const 672 if ( item && item->prevItem() )
681 KFileItemListIterator it( *items() );
685 if ( spec & TQDir::Time ) {
686 for ( ; (item = it.current()); ++it )
688 viewItem(item)->setKey( sortingKey( (
unsigned long)item->time( TDEIO::UDS_MODIFICATION_TIME ), item->isDir(), spec ));
691 else if ( spec & TQDir::Size ) {
692 for ( ; (item = it.current()); ++it )
693 viewItem(item)->setKey( sortingKey( item->size(), item->isDir(),
697 for ( ; (item = it.current()); ++it )
698 viewItem(item)->setKey( sortingKey( item->text(), item->isDir(),
702 TDEIconView::setSorting(
true, !isReversed() );
703 sort( !isReversed() );
709 void KFileIconView::mimeTypeDeterminationFinished()
716 (void) item->
fileInfo()->determineMimeType();
722 arrangeItemsInGrid();
726 if ( !currentItem() ) {
727 bool block = signalsBlocked();
728 blockSignals(
true );
729 TQIconViewItem *item = viewItem( firstFileItem() );
730 TDEIconView::setCurrentItem( item );
731 TDEIconView::setSelected( item,
false );
732 blockSignals( block );
735 m_resolver->start( d->previews->isChecked() ? 0 : 10 );
739 bool KFileIconView::eventFilter( TQObject *o, TQEvent *e )
741 if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(viewport()) || TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(
this) ) {
742 int type = e->type();
743 if ( type == TQEvent::Leave ||
744 type == TQEvent::FocusOut )
748 return TDEIconView::eventFilter( o, e );
754 void KFileIconView::showEvent( TQShowEvent *e )
756 TDEIconView::showEvent( e );
761 bool updateTextAndPixmap )
763 if ( d->previews->isChecked() && canPreview( i ) )
764 item->setPixmapSize( TQSize( d->previewIconSize, d->previewIconSize ) );
766 if ( updateTextAndPixmap )
771 item->setText( i->text() ,
false, false );
772 item->setPixmap( i->pixmap( myIconSize ) );
778 if ( spec & TQDir::Time )
780 item->setKey( sortingKey( (
unsigned long) i->time( TDEIO::UDS_MODIFICATION_TIME ),
782 else if ( spec & TQDir::Size )
783 item->setKey( sortingKey( i->size(), i->isDir(), spec ));
786 item->setKey( sortingKey( i->text(), i->isDir(), spec ));
790 if ( d->previews->isChecked() )
791 d->previewTimer.start( 10,
true );
796 if ( d->noArrangement )
799 TDEIconView::arrangeItemsInGrid( update );
802 void KFileIconView::zoomIn()
804 setPreviewSize( d->previewIconSize + 30 );
807 void KFileIconView::zoomOut()
809 setPreviewSize( d->previewIconSize - 30 );
812 TQDragObject *KFileIconView::dragObject()
817 for ( ; it.current(); ++it ){
818 urls.append( (*it)->url() );
821 if( urls.count() > 1 )
822 pixmap = DesktopIcon(
"application-vnd.tde.tdemultiple", iconSize() );
823 if( pixmap.isNull() )
824 pixmap = currentFileItem()->pixmap( iconSize() );
827 hotspot.setX( pixmap.width() / 2 );
828 hotspot.setY( pixmap.height() / 2 );
829 TQDragObject* myDragObject =
new KURLDrag( urls, widget() );
830 myDragObject->setPixmap( pixmap, hotspot );
834 void KFileIconView::slotAutoOpen()
836 d->autoOpenTimer.stop();
840 KFileItem *fileItem = d->dropItem->fileInfo();
844 if( fileItem->isFile() )
847 if ( fileItem->isDir() || fileItem->isLink())
848 sig->activate( fileItem );
851 bool KFileIconView::acceptDrag(TQDropEvent* e)
const 853 return KURLDrag::canDecode( e ) &&
855 ( e->action() == TQDropEvent::Copy
856 || e->action() == TQDropEvent::Move
857 || e->action() == TQDropEvent::Link );
860 void KFileIconView::contentsDragEnterEvent( TQDragEnterEvent *e )
862 if ( ! acceptDrag( e ) ) {
868 if ((dropOptions() & AutoOpenDirs) == 0)
874 d->autoOpenTimer.start( autoOpenDelay() );
879 d->autoOpenTimer.stop();
883 void KFileIconView::contentsDragMoveEvent( TQDragMoveEvent *e )
885 if ( ! acceptDrag( e ) ) {
891 if ((dropOptions() & AutoOpenDirs) == 0)
896 if (d->dropItem != item)
899 d->autoOpenTimer.start( autoOpenDelay() );
905 d->autoOpenTimer.stop();
909 void KFileIconView::contentsDragLeaveEvent( TQDragLeaveEvent * )
912 d->autoOpenTimer.stop();
915 void KFileIconView::contentsDropEvent( TQDropEvent *e )
918 d->autoOpenTimer.stop();
920 if ( ! acceptDrag( e ) ) {
927 KFileItem * fileItem = 0;
931 emit dropped(e, fileItem);
934 if (KURLDrag::decode( e, urls ) && !urls.isEmpty())
936 emit dropped(e, urls, fileItem ? fileItem->url() : KURL());
937 sig->dropURLs(fileItem, e, urls);
941 void KFileIconView::virtual_hook(
int id,
void* data )
942 { TDEIconView::virtual_hook(
id, data );
943 KFileView::virtual_hook(
id, data ); }
945 #include "tdefileiconview.moc" An item for the iconview, that has a reference to its corresponding KFileItem.
virtual void listingCompleted()
This hook is called when all items of the currently listed directory are listed and inserted into the...
virtual bool isSelected(const KFileItem *i) const
virtual void hideEvent(TQHideEvent *)
Reimplemented to remove an eventual tooltip.
virtual TDEActionCollection * actionCollection() const
virtual void setSelected(const KFileItem *, bool)
Tells the view that it should highlight the item.
virtual void insertItem(KFileItem *i)
The derived view must implement this function to add the file in the widget.
This class defines an interface to all file views.
virtual void arrangeItemsInGrid(bool updated=true)
Reimplemented for performance reasons.
virtual void clearView()
pure virtual function, that should be implemented to clear the view.
TQDir::SortSpec sorting() const
Returns the sorting order of the internal list.
const KFileItemList * selectedItems() const
virtual void invertSelection()
Inverts the current selection, i.e.
void setIconSize(int size)
Sets the size of the icons to show.
void setPreviewSize(int size)
Sets the size of the previews.
virtual void removeItem(const KFileItem *)
Removes an item from the list; has to be implemented by the view.
virtual void clearSelection()
Clears any selection, unhighlights everything.
virtual KFileItem * currentFileItem() const
virtual void keyPressEvent(TQKeyEvent *)
Reimplemented to not let TQIconView eat return-key events.
virtual void removeItem(const KFileItem *item)
Removes an item from the list; has to be implemented by the view.
void selectionChanged()
Emitted when the user hilights one or more files in multiselection mode.
virtual void setCurrentItem(const KFileItem *)
Reimplement this to set item the current item in the view, e.g.
KFileItem * fileInfo() const
virtual void setSorting(TQDir::SortSpec sort)
Sets the sorting order of the view.
void ensureItemVisible(const KFileItem *)
pure virtual function, that should be implemented to make item i visible, i.e.
void setMode(KFile::Mode m)
Convenient overload of the other setMode(unsigned int) method.
virtual void selectAll()
Selects all items.
virtual void insertItem(KFileItem *i)
The derived view must implement this function to add the file in the widget.
void showPreviews()
Starts loading previews for all files shown and shows them.
An icon-view capable of showing KFileItem's.
void setIgnoreMaximumSize(bool ignoreSize=true)
Disables the "Maximum file size" configuration option for previews.
virtual void updateView(bool)
does a repaint of the view.
virtual void setSorting(TQDir::SortSpec sort)
Sets the sorting order of the view.