kmimetyperesolver.h
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 #ifndef __kmimetyperesolver_h
00022 #define __kmimetyperesolver_h
00023 
00024 #include <qscrollview.h>
00025 #include <qptrlist.h>
00026 #include <qtimer.h>
00027 #include <kdebug.h>
00028 
00034 class KMimeTypeResolverBase
00035 {
00036 public:
00037     virtual void slotViewportAdjusted() = 0;
00038     virtual void slotProcessMimeIcons() = 0;
00039 protected:
00040     virtual void virtual_hook( int, void* ) {};
00041 };
00042 
00049 class KMimeTypeResolverHelper : public QObject
00050 {
00051     Q_OBJECT
00052 
00053 public:
00054     KMimeTypeResolverHelper( KMimeTypeResolverBase *resolver,
00055                              QScrollView *view )
00056         : m_resolver( resolver ),
00057           m_timer( new QTimer( this ) )
00058     {
00059         connect( m_timer, SIGNAL( timeout() ), SLOT( slotProcessMimeIcons() ));
00060 
00061         connect( view->horizontalScrollBar(), SIGNAL( sliderMoved(int) ),
00062                  SLOT( slotAdjust() ) );
00063         connect( view->verticalScrollBar(), SIGNAL( sliderMoved(int) ),
00064                  SLOT( slotAdjust() ) );
00065 
00066         view->viewport()->installEventFilter( this );
00067     }
00068 
00069     void start( int delay, bool singleShot )
00070     {
00071         m_timer->start( delay, singleShot );
00072     }
00073 
00074 protected:
00075     virtual bool eventFilter( QObject *o, QEvent *e )
00076     {
00077         bool ret = QObject::eventFilter( o, e );
00078 
00079         if ( e->type() == QEvent::Resize )
00080             m_resolver->slotViewportAdjusted();
00081 
00082         return ret;
00083     }
00084 
00085 private slots:
00086     void slotProcessMimeIcons()
00087     {
00088         m_resolver->slotProcessMimeIcons();
00089     }
00090 
00091     void slotAdjust()
00092     {
00093         m_resolver->slotViewportAdjusted();
00094     }
00095 
00096 private:
00097     KMimeTypeResolverBase *m_resolver;
00098     QTimer *m_timer;
00099 };
00100 
00117 template<class IconItem, class Parent>
00118 class KMimeTypeResolver : public KMimeTypeResolverBase 
00119 {
00120 public:
00125     KMimeTypeResolver( Parent * parent )
00126         : m_parent(parent),
00127           m_helper( new KMimeTypeResolverHelper(this, parent->scrollWidget())),
00128           m_delayNonVisibleIcons(10)
00129     {}
00130 
00131     virtual ~KMimeTypeResolver() {
00132         delete m_helper;
00133     }
00134 
00141     void start( uint delayNonVisibleIcons = 10 )
00142     {
00143         m_helper->start( 0, true  );
00144         m_delayNonVisibleIcons = delayNonVisibleIcons;
00145     }
00146 
00152     QPtrList<IconItem> m_lstPendingMimeIconItems;
00153 
00157     virtual void slotViewportAdjusted();
00158 
00162     virtual void slotProcessMimeIcons();
00163 
00164 private:
00171     IconItem * findVisibleIcon();
00172 
00173     Parent * m_parent;
00174     KMimeTypeResolverHelper *m_helper;
00175     uint m_delayNonVisibleIcons;
00176 };
00177 
00178 
00179 template<class IconItem, class Parent>
00180 inline void KMimeTypeResolver<IconItem, Parent>::slotProcessMimeIcons()
00181 {
00182     
00183     
00184     IconItem * item = 0L;
00185     int nextDelay = 0;
00186 
00187     if ( m_lstPendingMimeIconItems.count() > 0 )
00188     {
00189         
00190         
00191         
00192         item = findVisibleIcon();
00193     }
00194 
00195     
00196     if (0 == item)
00197     {
00198         
00199         if ( m_lstPendingMimeIconItems.count() > 0 )
00200         {
00201             item = m_lstPendingMimeIconItems.first();
00202             nextDelay = m_delayNonVisibleIcons;
00203         }
00204         else
00205         {
00206             m_parent->mimeTypeDeterminationFinished();
00207             return;
00208         }
00209     }
00210 
00211     m_parent->determineIcon(item);
00212     m_lstPendingMimeIconItems.remove(item);
00213     m_helper->start( nextDelay, true  );
00214 }
00215 
00216 template<class IconItem, class Parent>
00217 inline void KMimeTypeResolver<IconItem, Parent>::slotViewportAdjusted()
00218 {
00219     if (m_lstPendingMimeIconItems.isEmpty()) return;
00220     IconItem * item = findVisibleIcon();
00221     if (item)
00222     {
00223         m_parent->determineIcon( item );
00224         m_lstPendingMimeIconItems.remove(item);
00225         m_helper->start( 0, true  );
00226     }
00227 }
00228 
00229 template<class IconItem, class Parent>
00230 inline IconItem * KMimeTypeResolver<IconItem, Parent>::findVisibleIcon()
00231 {
00232     
00233 
00234     QPtrListIterator<IconItem> it(m_lstPendingMimeIconItems);
00235     if ( m_lstPendingMimeIconItems.count()<20) 
00236         return m_lstPendingMimeIconItems.first();
00237 
00238     QScrollView * view = m_parent->scrollWidget();
00239     QRect visibleContentsRect
00240         (
00241             view->viewportToContents(QPoint(0, 0)),
00242             view->viewportToContents
00243             (
00244                 QPoint(view->visibleWidth(), view->visibleHeight())
00245                 )
00246             );
00247 
00248     for (; it.current(); ++it)
00249         if (visibleContentsRect.intersects(it.current()->rect()))
00250             return it.current();
00251 
00252     return 0L;
00253 }
00254 
00255 #endif
 
This file is part of the documentation for kio Library Version 3.2.0.