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:
00121 KMimeTypeResolver( Parent * parent )
00122 : m_parent(parent),
00123 m_helper( new KMimeTypeResolverHelper(this, parent->scrollWidget())),
00124 m_delayNonVisibleIcons(10)
00125 {}
00126
00127 virtual ~KMimeTypeResolver() {
00128 delete m_helper;
00129 }
00130
00137 void start( uint delayNonVisibleIcons = 10 )
00138 {
00139 m_helper->start( 0, true );
00140 m_delayNonVisibleIcons = delayNonVisibleIcons;
00141 }
00142
00147 QPtrList<IconItem> m_lstPendingMimeIconItems;
00148
00152 virtual void slotViewportAdjusted();
00153
00157 virtual void slotProcessMimeIcons();
00158
00159 private:
00166 IconItem * findVisibleIcon();
00167
00168 Parent * m_parent;
00169 KMimeTypeResolverHelper *m_helper;
00170 uint m_delayNonVisibleIcons;
00171 };
00172
00173
00174 template<class IconItem, class Parent>
00175 inline void KMimeTypeResolver<IconItem, Parent>::slotProcessMimeIcons()
00176 {
00177
00178
00179 IconItem * item = 0L;
00180 int nextDelay = 0;
00181
00182 if ( m_lstPendingMimeIconItems.count() > 0 )
00183 {
00184
00185
00186
00187 item = findVisibleIcon();
00188 }
00189
00190
00191 if (0 == item)
00192 {
00193
00194 if ( m_lstPendingMimeIconItems.count() > 0 )
00195 {
00196 item = m_lstPendingMimeIconItems.first();
00197 nextDelay = m_delayNonVisibleIcons;
00198 }
00199 else
00200 {
00201 m_parent->mimeTypeDeterminationFinished();
00202 return;
00203 }
00204 }
00205
00206 m_parent->determineIcon(item);
00207 m_lstPendingMimeIconItems.remove(item);
00208 m_helper->start( nextDelay, true );
00209 }
00210
00211 template<class IconItem, class Parent>
00212 inline void KMimeTypeResolver<IconItem, Parent>::slotViewportAdjusted()
00213 {
00214 if (m_lstPendingMimeIconItems.isEmpty()) return;
00215 IconItem * item = findVisibleIcon();
00216 if (item)
00217 {
00218 m_parent->determineIcon( item );
00219 m_lstPendingMimeIconItems.remove(item);
00220 m_helper->start( 0, true );
00221 }
00222 }
00223
00224 template<class IconItem, class Parent>
00225 inline IconItem * KMimeTypeResolver<IconItem, Parent>::findVisibleIcon()
00226 {
00227
00228
00229 QPtrListIterator<IconItem> it(m_lstPendingMimeIconItems);
00230 if ( m_lstPendingMimeIconItems.count()<20)
00231 return m_lstPendingMimeIconItems.first();
00232
00233 QScrollView * view = m_parent->scrollWidget();
00234 QRect visibleContentsRect
00235 (
00236 view->viewportToContents(QPoint(0, 0)),
00237 view->viewportToContents
00238 (
00239 QPoint(view->visibleWidth(), view->visibleHeight())
00240 )
00241 );
00242
00243 for (; it.current(); ++it)
00244 if (visibleContentsRect.intersects(it.current()->rect()))
00245 return it.current();
00246
00247 return 0L;
00248 }
00249
00250 #endif
This file is part of the documentation for kdelibs Version 3.1.5.