• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdeio/tdefile
 

tdeio/tdefile

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

tdeio/tdefile

Skip menu "tdeio/tdefile"
  • Main Page
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

tdeio/tdefile

Skip menu "tdeio/tdefile"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeio/tdefile by doxygen 1.9.1
This website is maintained by Timothy Pearson.