• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • kio/kfile
 

kio/kfile

  • kio
  • kfile
kfileiconview.cpp
1 // -*- c++ -*-
2 /* This file is part of the KDE libraries
3  Copyright (C) 1997 Stephan Kulow <coolo@kde.org>
4  2000,2001,2002 Carsten Pfeiffer <pfeiffer@kde.org>
5 
6  This library is free software; you can redistribute it and/or
7  modify it under the terms of the GNU Library General Public
8  License as published by the Free Software Foundation; either
9  version 2 of the License, or (at your option) any later version.
10 
11  This library is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  Library General Public License for more details.
15 
16  You should have received a copy of the GNU Library General Public License
17  along with this library; see the file COPYING.LIB. If not, write to
18  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  Boston, MA 02110-1301, USA.
20 */
21 #include <tqt.h>
22 
23 #include <tqfontmetrics.h>
24 #include <tqkeycode.h>
25 #include <tqlabel.h>
26 #include <tqpainter.h>
27 #include <tqpixmap.h>
28 #include <tqregexp.h>
29 #include <tqtimer.h>
30 #include <tqtooltip.h>
31 
32 #include <kaction.h>
33 #include <kapplication.h>
34 #include <klocale.h>
35 #include <kfileitem.h>
36 #include <kiconeffect.h>
37 #include <kglobalsettings.h>
38 #include <kurldrag.h>
39 #include <kio/previewjob.h>
40 
41 #include "kfileiconview.h"
42 #include "config-kfile.h"
43 
44 #define DEFAULT_PREVIEW_SIZE 60
45 #define DEFAULT_SHOW_PREVIEWS false
46 #define DEFAULT_VIEW_MODE "SmallColumns"
47 
48 KFileIconViewItem::~KFileIconViewItem()
49 {
50  fileInfo()->removeExtraData( iconView() );
51 }
52 
53 class KFileIconView::KFileIconViewPrivate
54 {
55 public:
56  KFileIconViewPrivate( KFileIconView *parent ) {
57  previewIconSize = 60;
58  job = 0;
59  dropItem = 0;
60 
61  noArrangement = false;
62  ignoreMaximumSize = false;
63  smallColumns = new KRadioAction( i18n("Small Icons"), 0, TQT_TQOBJECT(parent),
64  TQT_SLOT( slotSmallColumns() ),
65  parent->actionCollection(),
66  "small columns" );
67 
68  largeRows = new KRadioAction( i18n("Large Icons"), 0, TQT_TQOBJECT(parent),
69  TQT_SLOT( slotLargeRows() ),
70  parent->actionCollection(),
71  "large rows" );
72 
73  smallColumns->setExclusiveGroup(TQString::fromLatin1("IconView mode"));
74  largeRows->setExclusiveGroup(TQString::fromLatin1("IconView mode"));
75 
76  previews = new KToggleAction( i18n("Thumbnail Previews"), 0,
77  parent->actionCollection(),
78  "show previews" );
79  zoomIn = KStdAction::zoomIn( TQT_TQOBJECT(parent), TQT_SLOT( zoomIn() ),
80  parent->actionCollection(), "zoomIn" );
81  zoomOut = KStdAction::zoomOut( TQT_TQOBJECT(parent), TQT_SLOT( zoomOut() ),
82  parent->actionCollection(), "zoomOut" );
83 
84  previews->setGroup("previews");
85  zoomIn->setGroup("previews");
86  zoomOut->setGroup("previews");
87 
88  connect( previews, TQT_SIGNAL( toggled( bool )),
89  parent, TQT_SLOT( slotPreviewsToggled( bool )));
90 
91  connect( &previewTimer, TQT_SIGNAL( timeout() ),
92  parent, TQT_SLOT( showPreviews() ));
93  connect( &autoOpenTimer, TQT_SIGNAL( timeout() ),
94  parent, TQT_SLOT( slotAutoOpen() ));
95  }
96 
97  ~KFileIconViewPrivate() {
98  if ( job )
99  job->kill();
100  }
101 
102  KRadioAction *smallColumns, *largeRows;
103  KAction *zoomIn, *zoomOut;
104  KToggleAction *previews;
105  KIO::PreviewJob *job;
106  KFileIconViewItem *dropItem;
107  TQTimer previewTimer;
108  TQTimer autoOpenTimer;
109  TQStringList previewMimeTypes;
110  int previewIconSize;
111  bool noArrangement :1;
112  bool ignoreMaximumSize :1;
113 };
114 
115 KFileIconView::KFileIconView(TQWidget *parent, const char *name)
116  : KIconView(parent, name), KFileView()
117 {
118  d = new KFileIconViewPrivate( this );
119 
120  setViewName( i18n("Icon View") );
121 
122  toolTip = 0;
123  setResizeMode( Adjust );
124  setMaxItemWidth( 300 );
125  setWordWrapIconText( false );
126  setArrangement( TopToBottom );
127  setAutoArrange( true );
128  setItemsMovable( false );
129  setMode( KIconView::Select );
130  KIconView::setSorting( true );
131  // as long as TQIconView only shows tooltips when the cursor is over the
132  // icon (and not the text), we have to create our own tooltips
133  setShowToolTips( false );
134  slotSmallColumns();
135  d->smallColumns->setChecked( true );
136 
137  connect( this, TQT_SIGNAL( returnPressed(TQIconViewItem *) ),
138  TQT_SLOT( slotActivate( TQIconViewItem *) ) );
139 
140  // we want single click _and_ double click (as convenience)
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 *) ) );
145 
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& ) ) );
152 
153  KFile::SelectionMode sm = KFileView::selectionMode();
154  switch ( sm ) {
155  case KFile::Multi:
156  TQIconView::setSelectionMode( TQIconView::Multi );
157  break;
158  case KFile::Extended:
159  TQIconView::setSelectionMode( TQIconView::Extended );
160  break;
161  case KFile::NoSelection:
162  TQIconView::setSelectionMode( TQIconView::NoSelection );
163  break;
164  default: // fall through
165  case KFile::Single:
166  TQIconView::setSelectionMode( TQIconView::Single );
167  break;
168  }
169 
170  if ( sm == KFile::Multi || sm == KFile::Extended )
171  connect( this, TQT_SIGNAL( selectionChanged() ),
172  TQT_SLOT( slotSelectionChanged() ));
173  else
174  connect( this, TQT_SIGNAL( selectionChanged( TQIconViewItem * )),
175  TQT_SLOT( highlighted( TQIconViewItem * )));
176 
177  viewport()->installEventFilter( this );
178 
179  // for mimetype resolving
180  m_resolver = new KMimeTypeResolver<KFileIconViewItem,KFileIconView>(this);
181 }
182 
183 KFileIconView::~KFileIconView()
184 {
185  delete m_resolver;
186  removeToolTip();
187  delete d;
188 }
189 
190 void KFileIconView::readConfig( KConfig *kc, const TQString& group )
191 {
192  TQString gr = group.isEmpty() ? TQString("KFileIconView") : group;
193  KConfigGroupSaver 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 ) );
197 
198  if ( kc->readEntry("ViewMode", DEFAULT_VIEW_MODE ) == small ) {
199  d->smallColumns->setChecked( true );
200  slotSmallColumns();
201  }
202  else {
203  d->largeRows->setChecked( true );
204  slotLargeRows();
205  }
206 
207  if ( d->previews->isChecked() )
208  showPreviews();
209 }
210 
211 void KFileIconView::writeConfig( KConfig *kc, const TQString& group )
212 {
213  TQString gr = group.isEmpty() ? TQString("KFileIconView") : group;
214  KConfigGroupSaver cs( kc, gr );
215 
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" );
221  else
222  kc->writeEntry( "ViewMode", viewMode );
223 
224  int previewsIconSize = d->previewIconSize;
225  if(!kc->hasDefault( "Preview Size" ) && previewsIconSize == DEFAULT_PREVIEW_SIZE )
226  kc->revertToDefault( "Preview Size" );
227  else
228  kc->writeEntry( "Preview Size", previewsIconSize );
229 
230  bool showPreviews = d->previews->isChecked();
231  if(!kc->hasDefault( "ShowPreviews" ) && showPreviews == DEFAULT_SHOW_PREVIEWS )
232  kc->revertToDefault( "ShowPreviews" );
233  else
234  kc->writeEntry( "ShowPreviews", showPreviews );
235 }
236 
237 void KFileIconView::removeToolTip()
238 {
239  delete toolTip;
240  toolTip = 0;
241 }
242 
243 void KFileIconView::showToolTip( TQIconViewItem *item )
244 {
245  delete toolTip;
246  toolTip = 0;
247 
248  if ( !item )
249  return;
250 
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,
255  "myToolTip",
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());
266  }
267  if (toolTip->y()+toolTip->height() > screen.bottom()) {
268  toolTip->move(toolTip->x(), screen.bottom()-toolTip->y()-toolTip->height()+toolTip->y());
269  }
270  toolTip->setFont( TQToolTip::font() );
271  toolTip->setPalette( TQToolTip::palette(), true );
272  toolTip->show();
273  }
274 }
275 
276 void KFileIconView::slotActivateMenu( TQIconViewItem* item, const TQPoint& pos )
277 {
278  if ( !item ) {
279  sig->activateMenu( 0, pos );
280  return;
281  }
282  KFileIconViewItem *i = (KFileIconViewItem*) item;
283  sig->activateMenu( i->fileInfo(), pos );
284 }
285 
286 void KFileIconView::hideEvent( TQHideEvent *e )
287 {
288  removeToolTip();
289  KIconView::hideEvent( e );
290 }
291 
292 void KFileIconView::keyPressEvent( TQKeyEvent *e )
293 {
294  KIconView::keyPressEvent( e );
295 
296  // ignore Ctrl-Return so that the dialog can catch it.
297  if ( (e->state() & ControlButton) &&
298  (e->key() == Key_Return || e->key() == Key_Enter) )
299  e->ignore();
300 }
301 
302 void KFileIconView::setSelected( const KFileItem *info, bool enable )
303 {
304  KFileIconViewItem *item = viewItem( info );
305  if ( item )
306  KIconView::setSelected( item, enable, true );
307 }
308 
309 void KFileIconView::selectAll()
310 {
311  if (KFileView::selectionMode() == KFile::NoSelection ||
312  KFileView::selectionMode() == KFile::Single)
313  return;
314 
315  KIconView::selectAll( true );
316 }
317 
318 void KFileIconView::clearSelection()
319 {
320  KIconView::clearSelection();
321 }
322 
323 void KFileIconView::invertSelection()
324 {
325  KIconView::invertSelection();
326 }
327 
328 void KFileIconView::clearView()
329 {
330  m_resolver->m_lstPendingMimeIconItems.clear();
331 
332  KIconView::clear();
333  stopPreview();
334 }
335 
336 void KFileIconView::insertItem( KFileItem *i )
337 {
338  KFileView::insertItem( i );
339 
340  TQIconView* qview = static_cast<TQIconView*>( this );
341  // Since creating and initializing an item leads to a repaint,
342  // we disable updates on the IconView for a while.
343  qview->setUpdatesEnabled( false );
344  KFileIconViewItem *item = new KFileIconViewItem( qview, i );
345  initItem( item, i, true );
346  qview->setUpdatesEnabled( true );
347 
348  if ( !i->isMimeTypeKnown() )
349  m_resolver->m_lstPendingMimeIconItems.append( item );
350 
351  i->setExtraData( this, item );
352 }
353 
354 void KFileIconView::slotActivate( TQIconViewItem *item )
355 {
356  if ( !item )
357  return;
358  const KFileItem *fi = ( (KFileIconViewItem*)item )->fileInfo();
359  if ( fi )
360  sig->activate( fi );
361 }
362 
363 void KFileIconView::selected( TQIconViewItem *item )
364 {
365  if ( !item || (KApplication::keyboardMouseState() & (ShiftButton | ControlButton)) != 0 )
366  return;
367 
368  if ( KGlobalSettings::singleClick() ) {
369  const KFileItem *fi = ( (KFileIconViewItem*)item )->fileInfo();
370  if ( fi && (fi->isDir() || !onlyDoubleClickSelectsFiles()) )
371  sig->activate( fi );
372  }
373 }
374 
375 void KFileIconView::setCurrentItem( const KFileItem *item )
376 {
377  KFileIconViewItem *it = viewItem( item );
378  if ( it )
379  KIconView::setCurrentItem( it );
380 }
381 
382 KFileItem * KFileIconView::currentFileItem() const
383 {
384  KFileIconViewItem *current = static_cast<KFileIconViewItem*>( currentItem() );
385  if ( current )
386  return current->fileInfo();
387 
388  return 0L;
389 }
390 
391 void KFileIconView::highlighted( TQIconViewItem *item )
392 {
393  if ( !item )
394  return;
395  const KFileItem *fi = ( (KFileIconViewItem*)item )->fileInfo();
396  if ( fi )
397  sig->highlightFile( fi );
398 }
399 
400 void KFileIconView::setSelectionMode( KFile::SelectionMode sm )
401 {
402  disconnect( TQT_SIGNAL( selectionChanged() ), this );
403  disconnect( TQT_SIGNAL( selectionChanged( TQIconViewItem * )), this );
404 
405  KFileView::setSelectionMode( sm );
406  switch ( KFileView::selectionMode() ) {
407  case KFile::Multi:
408  TQIconView::setSelectionMode( TQIconView::Multi );
409  break;
410  case KFile::Extended:
411  TQIconView::setSelectionMode( TQIconView::Extended );
412  break;
413  case KFile::NoSelection:
414  TQIconView::setSelectionMode( TQIconView::NoSelection );
415  break;
416  default: // fall through
417  case KFile::Single:
418  TQIconView::setSelectionMode( TQIconView::Single );
419  break;
420  }
421 
422  if ( sm == KFile::Multi || sm == KFile::Extended )
423  connect( this, TQT_SIGNAL( selectionChanged() ),
424  TQT_SLOT( slotSelectionChanged() ));
425  else
426  connect( this, TQT_SIGNAL( selectionChanged( TQIconViewItem * )),
427  TQT_SLOT( highlighted( TQIconViewItem * )));
428 }
429 
430 bool KFileIconView::isSelected( const KFileItem *i ) const
431 {
432  KFileIconViewItem *item = viewItem( i );
433  return (item && item->isSelected());
434 }
435 
436 void KFileIconView::updateView( bool b )
437 {
438  if ( !b )
439  return; // eh?
440 
441  KFileIconViewItem *item = static_cast<KFileIconViewItem*>(TQIconView::firstItem());
442  if ( item ) {
443  do {
444  if ( d->previews->isChecked() ) {
445  if ( canPreview( item->fileInfo() ) )
446  item->setPixmapSize( TQSize( d->previewIconSize, d->previewIconSize ) );
447  }
448  else {
449  // unset pixmap size (used for previews)
450  if ( !item->pixmapSize().isNull() )
451  item->setPixmapSize( TQSize( 0, 0 ) );
452  }
453  // recalculate item parameters but avoid an in-place repaint
454  item->setPixmap( (item->fileInfo())->pixmap( myIconSize ), true, false );
455  item = static_cast<KFileIconViewItem *>(item->nextItem());
456  } while ( item != 0L );
457  }
458 }
459 
460 void KFileIconView::updateView( const KFileItem *i )
461 {
462  KFileIconViewItem *item = viewItem( i );
463  if ( item )
464  initItem( item, i, true );
465 }
466 
467 void KFileIconView::removeItem( const KFileItem *i )
468 {
469  if ( !i )
470  return;
471 
472  if ( d->job )
473  d->job->removeItem( i );
474 
475  KFileIconViewItem *item = viewItem( i );
476  m_resolver->m_lstPendingMimeIconItems.remove( item );
477  delete item;
478 
479  KFileView::removeItem( i );
480 }
481 
482 void KFileIconView::setIconSize( int size )
483 {
484  myIconSize = size;
485  updateIcons();
486 }
487 
488 void KFileIconView::setPreviewSize( int size )
489 {
490  if ( size < 30 )
491  size = 30; // minimum
492 
493  d->previewIconSize = size;
494  if ( d->previews->isChecked() )
495  showPreviews();
496 }
497 
498 void KFileIconView::setIgnoreMaximumSize(bool ignoreSize)
499 {
500  d->ignoreMaximumSize = ignoreSize;
501 }
502 
503 void KFileIconView::updateIcons()
504 {
505  updateView( true );
506  arrangeItemsInGrid();
507 }
508 
509 void KFileIconView::ensureItemVisible( const KFileItem *i )
510 {
511  KFileIconViewItem *item = viewItem( i );
512  if ( item )
513  KIconView::ensureItemVisible( item );
514 }
515 
516 void KFileIconView::slotSelectionChanged()
517 {
518  sig->highlightFile( 0L );
519 }
520 
521 void KFileIconView::slotSmallColumns()
522 {
523  // setItemTextPos(), setArrangement(), setWordWrapIconText() and
524  // setIconSize() all call arrangeItemsInGrid() :( Prevent this.
525  d->noArrangement = true; // stop arrangeItemsInGrid()!
526 
527  // Make sure to uncheck previews if selected
528  if ( d->previews->isChecked() )
529  {
530  stopPreview();
531  d->previews->setChecked( false );
532  }
533  setGridX( -1 );
534  setMaxItemWidth( 300 );
535  setItemTextPos( Right );
536  setArrangement( TopToBottom );
537  setWordWrapIconText( false );
538  setSpacing( 0 );
539 
540  d->noArrangement = false; // now we can arrange
541  setIconSize( KIcon::SizeSmall );
542 }
543 
544 void KFileIconView::slotLargeRows()
545 {
546  // setItemTextPos(), setArrangement(), setWordWrapIconText() and
547  // setIconSize() all call arrangeItemsInGrid() :( Prevent this.
548  d->noArrangement = true; // stop arrangeItemsInGrid()!
549 
550  setGridX( KGlobal::iconLoader()->currentSize( KIcon::Desktop ) + 50 );
551  setItemTextPos( Bottom );
552  setArrangement( LeftToRight );
553  setWordWrapIconText( true );
554  setSpacing( 5 ); // default in QIconView
555 
556  d->noArrangement = false; // now we can arrange
557  setIconSize( KIcon::SizeMedium );
558 }
559 
560 void KFileIconView::stopPreview()
561 {
562  if ( d->job ) {
563  d->job->kill();
564  d->job = 0L;
565  }
566 }
567 
568 void KFileIconView::slotPreviewsToggled( bool on )
569 {
570  if ( on )
571  showPreviews();
572  else {
573  stopPreview();
574  slotLargeRows();
575  }
576 }
577 
578 void KFileIconView::showPreviews()
579 {
580  if ( d->previewMimeTypes.isEmpty() )
581  d->previewMimeTypes = KIO::PreviewJob::supportedMimeTypes();
582 
583  stopPreview();
584  d->previews->setChecked( true );
585 
586  if ( !d->largeRows->isChecked() ) {
587  d->largeRows->setChecked( true );
588  slotLargeRows(); // also sets the icon size and updates the grid
589  }
590  else {
591  updateIcons();
592  }
593 
594  d->job = KIO::filePreview(*items(), d->previewIconSize,d->previewIconSize);
595  d->job->setIgnoreMaximumSize(d->ignoreMaximumSize);
596 
597  connect( d->job, TQT_SIGNAL( result( KIO::Job * )),
598  this, TQT_SLOT( slotPreviewResult( KIO::Job * )));
599  connect( d->job, TQT_SIGNAL( gotPreview( const KFileItem*, const TQPixmap& )),
600  TQT_SLOT( gotPreview( const KFileItem*, const TQPixmap& ) ));
601 // connect( d->job, TQT_SIGNAL( failed( const KFileItem* )),
602 // this, TQT_SLOT( slotFailed( const KFileItem* ) ));
603 }
604 
605 void KFileIconView::slotPreviewResult( KIO::Job *job )
606 {
607  if ( job == d->job )
608  d->job = 0L;
609 }
610 
611 void KFileIconView::gotPreview( const KFileItem *item, const TQPixmap& pix )
612 {
613  KFileIconViewItem *it = viewItem( item );
614  if ( it ) {
615  if( item->overlays() & KIcon::HiddenOverlay )
616  {
617  TQPixmap p( pix );
618 
619  KIconEffect::semiTransparent( p );
620  it->setPixmap( p );
621  }
622  else {
623  it->setPixmap( pix );
624  }
625  }
626 }
627 
628 bool KFileIconView::canPreview( const KFileItem *item ) const
629 {
630  TQStringList::Iterator it = d->previewMimeTypes.begin();
631  TQRegExp r;
632  r.setWildcard( true );
633 
634  for ( ; it != d->previewMimeTypes.end(); ++it ) {
635  TQString type = *it;
636  // the "mimetype" can be "image/*"
637  if ( type.at( type.length() - 1 ) == '*' ) {
638  r.setPattern( type );
639  if ( r.search( item->mimetype() ) != -1 )
640  return true;
641  }
642  else
643  if ( item->mimetype() == type )
644  return true;
645  }
646 
647  return false;
648 }
649 
650 KFileItem * KFileIconView::firstFileItem() const
651 {
652  KFileIconViewItem *item = static_cast<KFileIconViewItem*>( firstItem() );
653  if ( item )
654  return item->fileInfo();
655  return 0L;
656 }
657 
658 KFileItem * KFileIconView::nextItem( const KFileItem *fileItem ) const
659 {
660  if ( fileItem ) {
661  KFileIconViewItem *item = viewItem( fileItem );
662  if ( item && item->nextItem() )
663  return ((KFileIconViewItem*) item->nextItem())->fileInfo();
664  }
665  return 0L;
666 }
667 
668 KFileItem * KFileIconView::prevItem( const KFileItem *fileItem ) const
669 {
670  if ( fileItem ) {
671  KFileIconViewItem *item = viewItem( fileItem );
672  if ( item && item->prevItem() )
673  return ((KFileIconViewItem*) item->prevItem())->fileInfo();
674  }
675  return 0L;
676 }
677 
678 void KFileIconView::setSorting( TQDir::SortSpec spec )
679 {
680  KFileView::setSorting( spec );
681  KFileItemListIterator it( *items() );
682 
683  KFileItem *item;
684 
685  if ( spec & TQDir::Time ) {
686  for ( ; (item = it.current()); ++it )
687  // warning, time_t is often signed -> cast it
688  viewItem(item)->setKey( sortingKey( (unsigned long)item->time( KIO::UDS_MODIFICATION_TIME ), item->isDir(), spec ));
689  }
690 
691  else if ( spec & TQDir::Size ) {
692  for ( ; (item = it.current()); ++it )
693  viewItem(item)->setKey( sortingKey( item->size(), item->isDir(),
694  spec ));
695  }
696  else { // Name or Unsorted
697  for ( ; (item = it.current()); ++it )
698  viewItem(item)->setKey( sortingKey( item->text(), item->isDir(),
699  spec ));
700  }
701 
702  KIconView::setSorting( true, !isReversed() );
703  sort( !isReversed() );
704 }
705 
706 //
707 // mimetype determination on demand
708 //
709 void KFileIconView::mimeTypeDeterminationFinished()
710 {
711  // anything to do?
712 }
713 
714 void KFileIconView::determineIcon( KFileIconViewItem *item )
715 {
716  (void) item->fileInfo()->determineMimeType();
717  updateView( item->fileInfo() );
718 }
719 
720 void KFileIconView::listingCompleted()
721 {
722  arrangeItemsInGrid();
723 
724  // TQIconView doesn't set the current item automatically, so we have to do
725  // that. We don't want to emit selectionChanged() tho.
726  if ( !currentItem() ) {
727  bool block = signalsBlocked();
728  blockSignals( true );
729  TQIconViewItem *item = viewItem( firstFileItem() );
730  KIconView::setCurrentItem( item );
731  KIconView::setSelected( item, false );
732  blockSignals( block );
733  }
734 
735  m_resolver->start( d->previews->isChecked() ? 0 : 10 );
736 }
737 
738 // need to remove our tooltip, eventually
739 bool KFileIconView::eventFilter( TQObject *o, TQEvent *e )
740 {
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 )
745  removeToolTip();
746  }
747 
748  return KIconView::eventFilter( o, e );
749 }
750 
752 
753 // ### workaround for Qt3 Bug
754 void KFileIconView::showEvent( TQShowEvent *e )
755 {
756  KIconView::showEvent( e );
757 }
758 
759 
760 void KFileIconView::initItem( KFileIconViewItem *item, const KFileItem *i,
761  bool updateTextAndPixmap )
762 {
763  if ( d->previews->isChecked() && canPreview( i ) )
764  item->setPixmapSize( TQSize( d->previewIconSize, d->previewIconSize ) );
765 
766  if ( updateTextAndPixmap )
767  {
768  // this causes a repaint of the item, which we want to avoid during
769  // directory listing, when all items are created. We want to paint all
770  // items at once, not every single item in that case.
771  item->setText( i->text() , false, false );
772  item->setPixmap( i->pixmap( myIconSize ) );
773  }
774 
775  // see also setSorting()
776  TQDir::SortSpec spec = KFileView::sorting();
777 
778  if ( spec & TQDir::Time )
779  // warning, time_t is often signed -> cast it
780  item->setKey( sortingKey( (unsigned long) i->time( KIO::UDS_MODIFICATION_TIME ),
781  i->isDir(), spec ));
782  else if ( spec & TQDir::Size )
783  item->setKey( sortingKey( i->size(), i->isDir(), spec ));
784 
785  else // Name or Unsorted
786  item->setKey( sortingKey( i->text(), i->isDir(), spec ));
787 
788  //qDebug("** key for: %s: %s", i->text().latin1(), item->key().latin1());
789 
790  if ( d->previews->isChecked() )
791  d->previewTimer.start( 10, true );
792 }
793 
794 void KFileIconView::arrangeItemsInGrid( bool update )
795 {
796  if ( d->noArrangement )
797  return;
798 
799  KIconView::arrangeItemsInGrid( update );
800 }
801 
802 void KFileIconView::zoomIn()
803 {
804  setPreviewSize( d->previewIconSize + 30 );
805 }
806 
807 void KFileIconView::zoomOut()
808 {
809  setPreviewSize( d->previewIconSize - 30 );
810 }
811 
812 TQDragObject *KFileIconView::dragObject()
813 {
814  // create a list of the URL:s that we want to drag
815  KURL::List urls;
816  KFileItemListIterator it( * KFileView::selectedItems() );
817  for ( ; it.current(); ++it ){
818  urls.append( (*it)->url() );
819  }
820  TQPixmap pixmap;
821  if( urls.count() > 1 )
822  pixmap = DesktopIcon( "kmultiple", iconSize() );
823  if( pixmap.isNull() )
824  pixmap = currentFileItem()->pixmap( iconSize() );
825 
826  TQPoint hotspot;
827  hotspot.setX( pixmap.width() / 2 );
828  hotspot.setY( pixmap.height() / 2 );
829  TQDragObject* myDragObject = new KURLDrag( urls, widget() );
830  myDragObject->setPixmap( pixmap, hotspot );
831  return myDragObject;
832 }
833 
834 void KFileIconView::slotAutoOpen()
835 {
836  d->autoOpenTimer.stop();
837  if( !d->dropItem )
838  return;
839 
840  KFileItem *fileItem = d->dropItem->fileInfo();
841  if (!fileItem)
842  return;
843 
844  if( fileItem->isFile() )
845  return;
846 
847  if ( fileItem->isDir() || fileItem->isLink())
848  sig->activate( fileItem );
849 }
850 
851 bool KFileIconView::acceptDrag(TQDropEvent* e) const
852 {
853  return KURLDrag::canDecode( e ) &&
854  (e->source()!=const_cast<KFileIconView*>(this)) &&
855  ( e->action() == TQDropEvent::Copy
856  || e->action() == TQDropEvent::Move
857  || e->action() == TQDropEvent::Link );
858 }
859 
860 void KFileIconView::contentsDragEnterEvent( TQDragEnterEvent *e )
861 {
862  if ( ! acceptDrag( e ) ) { // can we decode this ?
863  e->ignore(); // No
864  return;
865  }
866  e->acceptAction(); // Yes
867 
868  if ((dropOptions() & AutoOpenDirs) == 0)
869  return;
870 
871  KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) ));
872  if ( item ) { // are we over an item ?
873  d->dropItem = item;
874  d->autoOpenTimer.start( autoOpenDelay() ); // restart timer
875  }
876  else
877  {
878  d->dropItem = 0;
879  d->autoOpenTimer.stop();
880  }
881 }
882 
883 void KFileIconView::contentsDragMoveEvent( TQDragMoveEvent *e )
884 {
885  if ( ! acceptDrag( e ) ) { // can we decode this ?
886  e->ignore(); // No
887  return;
888  }
889  e->acceptAction(); // Yes
890 
891  if ((dropOptions() & AutoOpenDirs) == 0)
892  return;
893 
894  KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) ));
895  if ( item ) { // are we over an item ?
896  if (d->dropItem != item)
897  {
898  d->dropItem = item;
899  d->autoOpenTimer.start( autoOpenDelay() ); // restart timer
900  }
901  }
902  else
903  {
904  d->dropItem = 0;
905  d->autoOpenTimer.stop();
906  }
907 }
908 
909 void KFileIconView::contentsDragLeaveEvent( TQDragLeaveEvent * )
910 {
911  d->dropItem = 0;
912  d->autoOpenTimer.stop();
913 }
914 
915 void KFileIconView::contentsDropEvent( TQDropEvent *e )
916 {
917  d->dropItem = 0;
918  d->autoOpenTimer.stop();
919 
920  if ( ! acceptDrag( e ) ) { // can we decode this ?
921  e->ignore(); // No
922  return;
923  }
924  e->acceptAction(); // Yes
925 
926  KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) ));
927  KFileItem * fileItem = 0;
928  if (item)
929  fileItem = item->fileInfo();
930 
931  emit dropped(e, fileItem);
932 
933  KURL::List urls;
934  if (KURLDrag::decode( e, urls ) && !urls.isEmpty())
935  {
936  emit dropped(e, urls, fileItem ? fileItem->url() : KURL());
937  sig->dropURLs(fileItem, e, urls);
938  }
939 }
940 
941 void KFileIconView::virtual_hook( int id, void* data )
942 { KIconView::virtual_hook( id, data );
943  KFileView::virtual_hook( id, data ); }
944 
945 #include "kfileiconview.moc"
KFileViewSignaler::activate
void activate(const KFileItem *item)
Call this method when an item is selected (depends on single click / double click configuration)...
Definition: kfileview.h:46
KFileIconViewItem
An item for the iconview, that has a reference to its corresponding KFileItem.
Definition: kfileiconview.h:40
KFileView::onlyDoubleClickSelectsFiles
bool onlyDoubleClickSelectsFiles() const
Definition: kfileview.h:330
KFileIconView::listingCompleted
virtual void listingCompleted()
This hook is called when all items of the currently listed directory are listed and inserted into the...
Definition: kfileiconview.cpp:720
KFileIconView::widget
virtual TQWidget * widget()
a pure virtual function to get a TQWidget, that can be added to other widgets.
Definition: kfileiconview.h:91
KFileIconView::isSelected
virtual bool isSelected(const KFileItem *i) const
Definition: kfileiconview.cpp:430
KFileIconView::hideEvent
virtual void hideEvent(TQHideEvent *)
Reimplemented to remove an eventual tooltip.
Definition: kfileiconview.cpp:286
KFileView::items
const KFileItemList * items() const
Definition: kfileview.cpp:283
KFileIconView::setSelected
virtual void setSelected(const KFileItem *, bool)
Tells the view that it should highlight the item.
Definition: kfileiconview.cpp:302
KFileViewSignaler::highlightFile
void highlightFile(const KFileItem *i)
emits the highlighted signal for item.
Definition: kfileview.h:56
KFileView::insertItem
virtual void insertItem(KFileItem *i)
The derived view must implement this function to add the file in the widget.
Definition: kfileview.cpp:147
KFileView::actionCollection
virtual KActionCollection * actionCollection() const
Definition: kfileview.cpp:365
KFileView
This class defines an interface to all file views.
Definition: kfileview.h:98
KFileIconView::arrangeItemsInGrid
virtual void arrangeItemsInGrid(bool updated=true)
Reimplemented for performance reasons.
Definition: kfileiconview.cpp:794
KFileIconView::clearView
virtual void clearView()
pure virtual function, that should be implemented to clear the view.
Definition: kfileiconview.cpp:328
KFileView::sorting
TQDir::SortSpec sorting() const
Returns the sorting order of the internal list.
Definition: kfileview.h:177
KFileView::selectedItems
const KFileItemList * selectedItems() const
Definition: kfileview.cpp:296
KFileView::isReversed
bool isReversed() const
Tells whether the current items are in reversed order (shortcut to sorting() & TQDir::Reversed).
Definition: kfileview.h:199
KFileIconView::invertSelection
virtual void invertSelection()
Inverts the current selection, i.e.
Definition: kfileiconview.cpp:323
KFileIconView::setIconSize
void setIconSize(int size)
Sets the size of the icons to show.
Definition: kfileiconview.cpp:482
KFileIconView::setPreviewSize
void setPreviewSize(int size)
Sets the size of the previews.
Definition: kfileiconview.cpp:488
KFileIconView::removeItem
virtual void removeItem(const KFileItem *)
Removes an item from the list; has to be implemented by the view.
Definition: kfileiconview.cpp:467
KFileView::dropOptions
int dropOptions()
Returns the DND options in effect.
Definition: kfileview.cpp:407
KFileIconView::iconSize
int iconSize() const
Definition: kfileiconview.h:138
KFileIconView::clearSelection
virtual void clearSelection()
Clears any selection, unhighlights everything.
Definition: kfileiconview.cpp:318
KFileIconView::currentFileItem
virtual KFileItem * currentFileItem() const
Definition: kfileiconview.cpp:382
KFileIconView::keyPressEvent
virtual void keyPressEvent(TQKeyEvent *)
Reimplemented to not let TQIconView eat return-key events.
Definition: kfileiconview.cpp:292
KFileView::removeItem
virtual void removeItem(const KFileItem *item)
Removes an item from the list; has to be implemented by the view.
Definition: kfileview.cpp:346
KFileDialog::selectionChanged
void selectionChanged()
Emitted when the user hilights one or more files in multiselection mode.
KFileIconView::setCurrentItem
virtual void setCurrentItem(const KFileItem *)
Reimplement this to set item the current item in the view, e.g.
Definition: kfileiconview.cpp:375
KFileIconViewItem::fileInfo
KFileItem * fileInfo() const
Definition: kfileiconview.h:58
KFileView::setSorting
virtual void setSorting(TQDir::SortSpec sort)
Sets the sorting order of the view.
Definition: kfileview.cpp:151
KFileIconView::ensureItemVisible
void ensureItemVisible(const KFileItem *)
pure virtual function, that should be implemented to make item i visible, i.e.
Definition: kfileiconview.cpp:509
KFileDialog::setMode
void setMode(KFile::Mode m)
Convenient overload of the other setMode(unsigned int) method.
Definition: kfiledialog.cpp:1675
KFileIconView::selectAll
virtual void selectAll()
Selects all items.
Definition: kfileiconview.cpp:309
KFileIconView::insertItem
virtual void insertItem(KFileItem *i)
The derived view must implement this function to add the file in the widget.
Definition: kfileiconview.cpp:336
KFileIconView::showPreviews
void showPreviews()
Starts loading previews for all files shown and shows them.
Definition: kfileiconview.cpp:578
KFileView::sortingKey
static TQString sortingKey(const TQString &value, bool isDir, int sortSpec)
This method calculates a TQString from the given parameters, that is suitable for sorting with e...
Definition: kfileview.cpp:380
KFileIconView
An icon-view capable of showing KFileItem's.
Definition: kfileiconview.h:83
KFileIconView::setIgnoreMaximumSize
void setIgnoreMaximumSize(bool ignoreSize=true)
Disables the "Maximum file size" configuration option for previews.
Definition: kfileiconview.cpp:498
KFileIconView::updateView
virtual void updateView(bool)
does a repaint of the view.
Definition: kfileiconview.cpp:436
KFileIconView::setSorting
virtual void setSorting(TQDir::SortSpec sort)
Sets the sorting order of the view.
Definition: kfileiconview.cpp:678
KFileIconView::dropped
void dropped(TQDropEvent *event, KFileItem *fileItem)
The user dropped something.

kio/kfile

Skip menu "kio/kfile"
  • Main Page
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

kio/kfile

Skip menu "kio/kfile"
  • arts
  • dcop
  • dnssd
  • interfaces
  •     interface
  •     library
  •   kspeech
  •   ktexteditor
  • kabc
  • kate
  • kcmshell
  • kdecore
  • kded
  • kdefx
  • kdeprint
  • kdesu
  • kdeui
  • kdoctools
  • khtml
  • kimgio
  • kinit
  • kio
  •   bookmarks
  •   httpfilter
  •   kfile
  •   kio
  •   kioexec
  •   kpasswdserver
  •   kssl
  • kioslave
  •   http
  • kjs
  • kmdi
  •   kmdi
  • knewstuff
  • kparts
  • krandr
  • kresources
  • kspell2
  • kunittest
  • kutils
  • kwallet
  • libkmid
  • libkscreensaver
Generated for kio/kfile by doxygen 1.8.6
This website is maintained by Timothy Pearson.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. |