00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <qlayout.h>
00013 #include <qlabel.h>
00014 #include <qfont.h>
00015 #include <qframe.h>
00016 #include <qprogressbar.h>
00017 #include <qfile.h>
00018 #include <qdom.h>
00019 #include <qstringlist.h>
00020 #include <qtooltip.h>
00021 #include <qpixmap.h>
00022 #include <qdir.h>
00023 #include <qmovie.h>
00024 #include <qtimer.h>
00025 #include <qsizegrip.h>
00026
00027
00028 #include "clickableLabel.h"
00029 #include "statusWidget.h"
00030 #include "titleWidget.h"
00031 #include "window.h"
00032 #include "../config.h"
00033 #include "../configuration/configuration.h"
00034
00035
00036 StatusWidget::StatusWidget(QWidget *parent,
00037 const char* name ) : QWidget(parent,name)
00038 {
00039
00040 message = new QLabel( this );
00041 message->setText( "" );
00042
00043
00044 timer = new QTimer();
00045 connect(timer, SIGNAL(timeout()), this, SLOT(removeStatus()) );
00046
00047
00048 progressBar = new QProgressBar( this );
00049 progressBar->setCenterIndicator(true);
00050 progressBar->hide();
00051 curStep = 0;
00052
00053
00054
00055 updateAvailable = NULL;
00056 http.setHost( "albumshaper.sourceforge.net" );
00057 connect( &http, SIGNAL(done(bool)), this, SLOT(fileFetched(bool)) );
00058 if(((Window*)parentWidget())->getConfig()->getBool( "alerts", "showSoftwareUpdateAlerts"))
00059 {
00060 checkForUpdates();
00061 }
00062
00063
00064 grid = new QGridLayout( this, 1, 6, 0 );
00065 grid->setSpacing(WIDGET_SPACING);
00066 grid->setColSpacing( 0, WIDGET_SPACING );
00067 grid->addWidget( message, 0, 1, Qt::AlignVCenter );
00068 grid->addWidget( progressBar, 0, 2, Qt::AlignVCenter );
00069 grid->setColStretch( 3, 1 );
00070
00071
00072
00073
00074
00075
00076 #if defined(Q_OS_MACX) || defined(Q_OS_WIN)
00077 QSizeGrip* sizeGrip = new QSizeGrip( this );
00078 grid->addWidget( sizeGrip, 0, 5, Qt::AlignBottom );
00079 #endif
00080
00081 }
00082
00083 StatusWidget::~StatusWidget()
00084 {
00085 delete timer;
00086 timer = NULL;
00087 }
00088
00089 void StatusWidget::showProgressBar(QString message, int numSteps)
00090 {
00091
00092
00093 timer->stop();
00094
00095
00096 this->message->setText( message );
00097 progressBar->setProgress( 0, numSteps );
00098 progressBar->show();
00099 curStep = 0;
00100 }
00101
00102 void StatusWidget::updateProgress(int progress, QString newMessage)
00103 {
00104 curStep = progress;
00105 progressBar->setProgress( progress );
00106
00107
00108 if(newMessage != QString::null)
00109 {
00110 this->message->setText( newMessage );
00111 }
00112 }
00113
00114 int StatusWidget::currentProgress()
00115 {
00116 return curStep;
00117 }
00118
00119 void StatusWidget::incrementProgress()
00120 {
00121 curStep++;
00122 progressBar->setProgress( curStep );
00123 }
00124
00125 void StatusWidget::setStatus( QString message )
00126 {
00127 timer->stop();
00128
00129
00130 progressBar->hide();
00131
00132
00133 this->message->setText( message );
00134
00135 timer->start( 2000, TRUE );
00136 }
00137
00138 void StatusWidget::removeStatus()
00139 {
00140
00141 message->setText( "" );
00142 }
00143
00144 void StatusWidget::fileFetched(bool error)
00145 {
00146
00147
00148 if(error)
00149 {
00150 return;
00151 }
00152
00153
00154 QFile fetchedDoc( TEMP_DIR + QString("/releases.xml") );
00155 if(fetchedDoc.open(IO_WriteOnly))
00156 {
00157
00158
00159 QTextStream stream( &fetchedDoc );
00160 stream.setEncoding( QTextStream::UnicodeUTF8 );
00161 stream << QString( http.readAll() );
00162 fetchedDoc.close();
00163
00164
00165
00166 if( !fetchedDoc.open( IO_ReadOnly ) )
00167 {
00168 return;
00169 }
00170
00171
00172 QDomDocument xmlDom;
00173 if( !xmlDom.setContent( &fetchedDoc ) )
00174 {
00175 fetchedDoc.close();
00176 return;
00177 }
00178
00179
00180 fetchedDoc.close();
00181
00182
00183
00184
00185
00186 QStringList releases;
00187 QDomElement root = xmlDom.documentElement();
00188 QDomNode node = root.firstChild();
00189 QDomText val;
00190 bool thisVersionFound = false;
00191 while( !node.isNull() )
00192 {
00193 if( node.isElement() && node.nodeName() == "release" )
00194 {
00195 val = node.firstChild().toText();
00196 if(!val.isNull())
00197 {
00198
00199 releases.append( QString(val.nodeValue()) );
00200
00201
00202 if( QString(val.nodeValue()).compare( QString(ALBUMSHAPER_VERSION) ) == 0 )
00203 thisVersionFound = true;
00204 }
00205 }
00206 node = node.nextSibling();
00207 }
00208
00209
00210
00211 if(thisVersionFound && releases.first().compare( QString(ALBUMSHAPER_VERSION) ) != 0)
00212 {
00213 ClickableLabel* uA = new ClickableLabel( this );
00214 uA->setMovie( QMovie( QString(IMAGE_PATH)+"miscImages/updateAvailable.mng") );
00215 QToolTip::add( uA, tr("Your copy of Album Shaper is not up to date! Click here for details") );
00216 grid->addWidget( uA, 0, 4, Qt::AlignVCenter );
00217 connect( uA, SIGNAL(clicked()),
00218 ((Window*)parentWidget())->getTitle(), SLOT(aboutProgram()) );
00219 uA->show();\
00220 updateAvailable = uA;
00221 }
00222 }
00223
00224 }
00225
00226 void StatusWidget::checkForUpdates()
00227 {
00228 if(updateAvailable != NULL)
00229 return;
00230
00231
00232
00233 http.get( "/webService/releases.xml");
00234 }
00235
00236 void StatusWidget::removeUpdatesIcon()
00237 {
00238 delete updateAvailable;
00239 updateAvailable = NULL;
00240 }
00241
00242 void StatusWidget::grabInput()
00243 {
00244 grabKeyboard();
00245 grabMouse();
00246 }
00247
00248 void StatusWidget::releaseInput()
00249 {
00250 releaseKeyboard();
00251 releaseMouse();
00252 }
00253