• 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 bool KFileIconView::canPreview( const KFileItem *item ) const
627 {
628  TQStringList::Iterator it = d->previewMimeTypes.begin();
629  TQRegExp r;
630  r.setWildcard( true );
631 
632  for ( ; it != d->previewMimeTypes.end(); ++it ) {
633  TQString type = *it;
634  // the "mimetype" can be "image/*"
635  if ( type.at( type.length() - 1 ) == '*' ) {
636  r.setPattern( type );
637  if ( r.search( item->mimetype() ) != -1 )
638  return true;
639  }
640  else
641  if ( item->mimetype() == type )
642  return true;
643  }
644 
645  return false;
646 }
647 
648 KFileItem * KFileIconView::firstFileItem() const
649 {
650  KFileIconViewItem *item = static_cast<KFileIconViewItem*>( firstItem() );
651  if ( item )
652  return item->fileInfo();
653  return 0L;
654 }
655 
656 KFileItem * KFileIconView::nextItem( const KFileItem *fileItem ) const
657 {
658  if ( fileItem ) {
659  KFileIconViewItem *item = viewItem( fileItem );
660  if ( item && item->nextItem() )
661  return ((KFileIconViewItem*) item->nextItem())->fileInfo();
662  }
663  return 0L;
664 }
665 
666 KFileItem * KFileIconView::prevItem( const KFileItem *fileItem ) const
667 {
668  if ( fileItem ) {
669  KFileIconViewItem *item = viewItem( fileItem );
670  if ( item && item->prevItem() )
671  return ((KFileIconViewItem*) item->prevItem())->fileInfo();
672  }
673  return 0L;
674 }
675 
676 void KFileIconView::setSorting( TQDir::SortSpec spec )
677 {
678  KFileView::setSorting( spec );
679  KFileItemListIterator it( *items() );
680 
681  KFileItem *item;
682 
683  if ( spec & TQDir::Time ) {
684  for ( ; (item = it.current()); ++it )
685  // warning, time_t is often signed -> cast it
686  viewItem(item)->setKey( sortingKey( (unsigned long)item->time( KIO::UDS_MODIFICATION_TIME ), item->isDir(), spec ));
687  }
688 
689  else if ( spec & TQDir::Size ) {
690  for ( ; (item = it.current()); ++it )
691  viewItem(item)->setKey( sortingKey( item->size(), item->isDir(),
692  spec ));
693  }
694  else { // Name or Unsorted
695  for ( ; (item = it.current()); ++it )
696  viewItem(item)->setKey( sortingKey( item->text(), item->isDir(),
697  spec ));
698  }
699 
700  KIconView::setSorting( true, !isReversed() );
701  sort( !isReversed() );
702 }
703 
704 //
705 // mimetype determination on demand
706 //
707 void KFileIconView::mimeTypeDeterminationFinished()
708 {
709  // anything to do?
710 }
711 
712 void KFileIconView::determineIcon( KFileIconViewItem *item )
713 {
714  (void) item->fileInfo()->determineMimeType();
715  updateView( item->fileInfo() );
716 }
717 
718 void KFileIconView::listingCompleted()
719 {
720  arrangeItemsInGrid();
721 
722  // TQIconView doesn't set the current item automatically, so we have to do
723  // that. We don't want to emit selectionChanged() tho.
724  if ( !currentItem() ) {
725  bool block = signalsBlocked();
726  blockSignals( true );
727  TQIconViewItem *item = viewItem( firstFileItem() );
728  KIconView::setCurrentItem( item );
729  KIconView::setSelected( item, false );
730  blockSignals( block );
731  }
732 
733  m_resolver->start( d->previews->isChecked() ? 0 : 10 );
734 }
735 
736 // need to remove our tooltip, eventually
737 bool KFileIconView::eventFilter( TQObject *o, TQEvent *e )
738 {
739  if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(viewport()) || TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(this) ) {
740  int type = e->type();
741  if ( type == TQEvent::Leave ||
742  type == TQEvent::FocusOut )
743  removeToolTip();
744  }
745 
746  return KIconView::eventFilter( o, e );
747 }
748 
750 
751 // ### workaround for Qt3 Bug
752 void KFileIconView::showEvent( TQShowEvent *e )
753 {
754  KIconView::showEvent( e );
755 }
756 
757 
758 void KFileIconView::initItem( KFileIconViewItem *item, const KFileItem *i,
759  bool updateTextAndPixmap )
760 {
761  if ( d->previews->isChecked() && canPreview( i ) )
762  item->setPixmapSize( TQSize( d->previewIconSize, d->previewIconSize ) );
763 
764  if ( updateTextAndPixmap )
765  {
766  // this causes a repaint of the item, which we want to avoid during
767  // directory listing, when all items are created. We want to paint all
768  // items at once, not every single item in that case.
769  item->setText( i->text() , false, false );
770  item->setPixmap( i->pixmap( myIconSize ) );
771  }
772 
773  // see also setSorting()
774  TQDir::SortSpec spec = KFileView::sorting();
775 
776  if ( spec & TQDir::Time )
777  // warning, time_t is often signed -> cast it
778  item->setKey( sortingKey( (unsigned long) i->time( KIO::UDS_MODIFICATION_TIME ),
779  i->isDir(), spec ));
780  else if ( spec & TQDir::Size )
781  item->setKey( sortingKey( i->size(), i->isDir(), spec ));
782 
783  else // Name or Unsorted
784  item->setKey( sortingKey( i->text(), i->isDir(), spec ));
785 
786  //qDebug("** key for: %s: %s", i->text().latin1(), item->key().latin1());
787 
788  if ( d->previews->isChecked() )
789  d->previewTimer.start( 10, true );
790 }
791 
792 void KFileIconView::arrangeItemsInGrid( bool update )
793 {
794  if ( d->noArrangement )
795  return;
796 
797  KIconView::arrangeItemsInGrid( update );
798 }
799 
800 void KFileIconView::zoomIn()
801 {
802  setPreviewSize( d->previewIconSize + 30 );
803 }
804 
805 void KFileIconView::zoomOut()
806 {
807  setPreviewSize( d->previewIconSize - 30 );
808 }
809 
810 TQDragObject *KFileIconView::dragObject()
811 {
812  // create a list of the URL:s that we want to drag
813  KURL::List urls;
814  KFileItemListIterator it( * KFileView::selectedItems() );
815  for ( ; it.current(); ++it ){
816  urls.append( (*it)->url() );
817  }
818  TQPixmap pixmap;
819  if( urls.count() > 1 )
820  pixmap = DesktopIcon( "kmultiple", iconSize() );
821  if( pixmap.isNull() )
822  pixmap = currentFileItem()->pixmap( iconSize() );
823 
824  TQPoint hotspot;
825  hotspot.setX( pixmap.width() / 2 );
826  hotspot.setY( pixmap.height() / 2 );
827  TQDragObject* myDragObject = new KURLDrag( urls, widget() );
828  myDragObject->setPixmap( pixmap, hotspot );
829  return myDragObject;
830 }
831 
832 void KFileIconView::slotAutoOpen()
833 {
834  d->autoOpenTimer.stop();
835  if( !d->dropItem )
836  return;
837 
838  KFileItem *fileItem = d->dropItem->fileInfo();
839  if (!fileItem)
840  return;
841 
842  if( fileItem->isFile() )
843  return;
844 
845  if ( fileItem->isDir() || fileItem->isLink())
846  sig->activate( fileItem );
847 }
848 
849 bool KFileIconView::acceptDrag(TQDropEvent* e) const
850 {
851  return KURLDrag::canDecode( e ) &&
852  (e->source()!=const_cast<KFileIconView*>(this)) &&
853  ( e->action() == TQDropEvent::Copy
854  || e->action() == TQDropEvent::Move
855  || e->action() == TQDropEvent::Link );
856 }
857 
858 void KFileIconView::contentsDragEnterEvent( TQDragEnterEvent *e )
859 {
860  if ( ! acceptDrag( e ) ) { // can we decode this ?
861  e->ignore(); // No
862  return;
863  }
864  e->acceptAction(); // Yes
865 
866  if ((dropOptions() & AutoOpenDirs) == 0)
867  return;
868 
869  KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) ));
870  if ( item ) { // are we over an item ?
871  d->dropItem = item;
872  d->autoOpenTimer.start( autoOpenDelay() ); // restart timer
873  }
874  else
875  {
876  d->dropItem = 0;
877  d->autoOpenTimer.stop();
878  }
879 }
880 
881 void KFileIconView::contentsDragMoveEvent( TQDragMoveEvent *e )
882 {
883  if ( ! acceptDrag( e ) ) { // can we decode this ?
884  e->ignore(); // No
885  return;
886  }
887  e->acceptAction(); // Yes
888 
889  if ((dropOptions() & AutoOpenDirs) == 0)
890  return;
891 
892  KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) ));
893  if ( item ) { // are we over an item ?
894  if (d->dropItem != item)
895  {
896  d->dropItem = item;
897  d->autoOpenTimer.start( autoOpenDelay() ); // restart timer
898  }
899  }
900  else
901  {
902  d->dropItem = 0;
903  d->autoOpenTimer.stop();
904  }
905 }
906 
907 void KFileIconView::contentsDragLeaveEvent( TQDragLeaveEvent * )
908 {
909  d->dropItem = 0;
910  d->autoOpenTimer.stop();
911 }
912 
913 void KFileIconView::contentsDropEvent( TQDropEvent *e )
914 {
915  d->dropItem = 0;
916  d->autoOpenTimer.stop();
917 
918  if ( ! acceptDrag( e ) ) { // can we decode this ?
919  e->ignore(); // No
920  return;
921  }
922  e->acceptAction(); // Yes
923 
924  KFileIconViewItem *item = dynamic_cast<KFileIconViewItem*>(findItem( contentsToViewport( e->pos() ) ));
925  KFileItem * fileItem = 0;
926  if (item)
927  fileItem = item->fileInfo();
928 
929  emit dropped(e, fileItem);
930 
931  KURL::List urls;
932  if (KURLDrag::decode( e, urls ) && !urls.isEmpty())
933  {
934  emit dropped(e, urls, fileItem ? fileItem->url() : KURL());
935  sig->dropURLs(fileItem, e, urls);
936  }
937 }
938 
939 void KFileIconView::virtual_hook( int id, void* data )
940 { KIconView::virtual_hook( id, data );
941  KFileView::virtual_hook( id, data ); }
942 
943 #include "kfileiconview.moc"

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.3.1
This website is maintained by Timothy Pearson.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. |