43
43
#include " cpl_vsi.h"
44
44
#include " cpl_string.h"
45
45
46
+ QgsAnimatedIcon::QgsAnimatedIcon ( const QString & iconPath )
47
+ : QObject()
48
+ , mCount( 0 )
49
+ , mMovie( 0 )
50
+ {
51
+ // QApplication as parent to ensure that it is deleted before QApplication
52
+ mMovie = new QMovie ( QApplication::instance () );
53
+ if ( !iconPath.isEmpty () )
54
+ {
55
+ mMovie ->setFileName ( iconPath );
56
+ }
57
+ mMovie ->setCacheMode ( QMovie::CacheAll );
58
+ connect ( mMovie , SIGNAL ( frameChanged ( int ) ), SLOT ( onFrameChanged () ) );
59
+ }
60
+
61
+ QString QgsAnimatedIcon::iconPath () const
62
+ {
63
+ return mMovie ->fileName ();
64
+ }
65
+
66
+ void QgsAnimatedIcon::setIconPath ( const QString & iconPath )
67
+ {
68
+ mMovie ->setFileName ( iconPath );
69
+ }
70
+
71
+ void QgsAnimatedIcon::onFrameChanged ()
72
+ {
73
+ mIcon = QIcon ( mMovie ->currentPixmap () );
74
+ emit frameChanged ();
75
+ }
76
+
77
+ void QgsAnimatedIcon::connectFrameChanged ( const QObject * receiver, const char * method )
78
+ {
79
+ if ( connect ( this , SIGNAL ( frameChanged () ), receiver, method ) )
80
+ {
81
+ mCount ++;
82
+ }
83
+ mMovie ->setPaused ( mCount == 0 );
84
+ QgsDebugMsg ( QString ( " mCount = %1" ).arg ( mCount ) );
85
+ }
86
+
87
+ void QgsAnimatedIcon::disconnectFrameChanged ( const QObject * receiver, const char * method )
88
+ {
89
+ if ( disconnect ( this , SIGNAL ( frameChanged () ), receiver, method ) )
90
+ {
91
+ mCount --;
92
+ }
93
+ mMovie ->setPaused ( mCount == 0 );
94
+ QgsDebugMsg ( QString ( " mCount = %1" ).arg ( mCount ) );
95
+ }
96
+
46
97
// shared icons
47
98
const QIcon &QgsLayerItem::iconPoint ()
48
99
{
@@ -153,9 +204,7 @@ const QIcon &QgsZipItem::iconZip()
153
204
154
205
QMap<QString, QIcon> QgsDataItem::mIconMap = QMap<QString, QIcon>();
155
206
156
- int QgsDataItem::mPopulatingCount = 0 ;
157
- QMovie * QgsDataItem::mPopulatingMovie = 0 ;
158
- QIcon QgsDataItem::mPopulatingIcon = QIcon();
207
+ QgsAnimatedIcon * QgsDataItem::mPopulatingIcon = 0 ;
159
208
160
209
QgsDataItem::QgsDataItem ( QgsDataItem::Type type, QgsDataItem* parent, QString name, QString path )
161
210
// Do not pass parent to QObject, Qt would delete this when parent is deleted
@@ -247,8 +296,8 @@ void QgsDataItem::moveToThread( QThread * targetThread )
247
296
248
297
QIcon QgsDataItem::icon ()
249
298
{
250
- if ( state () == Populating )
251
- return mPopulatingIcon ;
299
+ if ( state () == Populating && mPopulatingIcon )
300
+ return mPopulatingIcon -> icon () ;
252
301
253
302
if ( !mIcon .isNull () )
254
303
return mIcon ;
@@ -574,11 +623,6 @@ bool QgsDataItem::equal( const QgsDataItem *other )
574
623
return false ;
575
624
}
576
625
577
- void QgsDataItem::setPopulatingIcon ()
578
- {
579
- mPopulatingIcon = QIcon ( mPopulatingMovie ->currentPixmap () );
580
- }
581
-
582
626
QgsDataItem::State QgsDataItem::state () const
583
627
{
584
628
// for backward compatibility (if subclass set mPopulated directly)
@@ -598,26 +642,15 @@ void QgsDataItem::setState( State state )
598
642
599
643
if ( state == Populating ) // start loading
600
644
{
601
- if ( !mPopulatingMovie )
645
+ if ( !mPopulatingIcon )
602
646
{
603
- // QApplication as parent to ensure that it is deleted before QApplication
604
- mPopulatingMovie = new QMovie ( QApplication::instance () );
605
- mPopulatingMovie ->setFileName ( QgsApplication::iconPath ( " /mIconLoading.gif" ) );
606
- mPopulatingMovie ->setCacheMode ( QMovie::CacheAll );
607
- connect ( mPopulatingMovie , SIGNAL ( frameChanged ( int ) ), SLOT ( setPopulatingIcon () ) );
647
+ mPopulatingIcon = new QgsAnimatedIcon ( QgsApplication::iconPath ( " /mIconLoading.gif" ) );
608
648
}
609
- connect ( mPopulatingMovie , SIGNAL ( frameChanged ( int ) ), SLOT ( emitDataChanged () ) );
610
- mPopulatingCount ++;
611
- mPopulatingMovie ->setPaused ( false );
649
+ mPopulatingIcon ->connectFrameChanged ( this , SLOT ( emitDataChanged () ) );
612
650
}
613
- else if ( mState == Populating && mPopulatingMovie ) // stop loading
651
+ else if ( mState == Populating && mPopulatingIcon ) // stop loading
614
652
{
615
- disconnect ( mPopulatingMovie , SIGNAL ( frameChanged ( int ) ), this , SLOT ( emitDataChanged () ) );
616
- mPopulatingCount --;
617
- if ( mPopulatingCount == 0 )
618
- {
619
- mPopulatingMovie ->setPaused ( true );
620
- }
653
+ mPopulatingIcon ->disconnectFrameChanged ( this , SLOT ( emitDataChanged () ) );
621
654
}
622
655
623
656
mState = state;
@@ -730,7 +763,7 @@ QgsDirectoryItem::~QgsDirectoryItem()
730
763
QIcon QgsDirectoryItem::icon ()
731
764
{
732
765
if ( state () == Populating )
733
- return populatingIcon ();
766
+ return QgsDataItem::icon ();
734
767
return iconDir ();
735
768
}
736
769
0 commit comments