Main Page | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members

about.cpp

Go to the documentation of this file.
00001 //============================================== 00002 // copyright : (C) 2003-2005 by Will Stokes 00003 //============================================== 00004 // This program is free software; you can redistribute it 00005 // and/or modify it under the terms of the GNU General 00006 // Public License as published by the Free Software 00007 // Foundation; either version 2 of the License, or 00008 // (at your option) any later version. 00009 //============================================== 00010 00011 //Systemwide includes 00012 #include <qlayout.h> 00013 #include <qlabel.h> 00014 #include <qfont.h> 00015 #include <qiconset.h> 00016 #include <qpixmap.h> 00017 #include <qtabwidget.h> 00018 #include <qtextbrowser.h> 00019 #include <qpushbutton.h> 00020 #include <qstringlist.h> 00021 #include <qdatetime.h> 00022 #include <qfile.h> 00023 #include <qdir.h> 00024 #include <qdom.h> 00025 #include <qstringlist.h> 00026 #include <qmovie.h> 00027 #include <qapplication.h> 00028 #include <qframe.h> 00029 00030 //Projectwide includes 00031 #include "about.h" 00032 #include "../titleWidget.h" 00033 #include "../window.h" 00034 #include "../../config.h" 00035 #include "../../configuration/configuration.h" 00036 00037 #define DEFAULT_WIDTH 600 00038 #define DEFAULT_HEIGHT 500 00039 00040 #define UNSET 0 00041 #define GET_RELEASES 1 00042 #define GET_NEW_IMPROVEMENTS 2 00043 #define GET_UPCOMING_FEATURES 3 00044 00045 //============================================== 00046 About::About( int mode, QWidget* parent, const char* name ) : QDialog(parent,name) 00047 { 00048 displayMode = mode; 00049 //-------------------------------------------------------------- 00050 QColor white(255, 255, 255); 00051 QColor darkBlue(35, 75, 139); 00052 QColor black(0, 0, 0); 00053 //-------------------------------------------------------------- 00054 //by default not getting anything 00055 getMode = UNSET; 00056 //-- 00057 //set window title 00058 setCaption( tr("About Album Shaper")); 00059 //-- 00060 //application logo 00061 QFrame* logoFrame = new QFrame( this ); 00062 logoFrame->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Fixed ); 00063 albumShaperLogo = new QLabel( logoFrame ); 00064 albumShaperLogo->setPixmap( QPixmap( QString(IMAGE_PATH)+"miscImages/albumShaper.png" ) ); 00065 //-- 00066 //if user chooses to get product updates information 00067 releases = NULL; 00068 if(((Window*)(qApp->mainWidget()))->getConfig()->getBool( "alerts", "showSoftwareUpdateAlerts")) 00069 { 00070 //set http host 00071 http.setHost( "albumshaper.sourceforge.net" ); 00072 connect( &http, SIGNAL(done(bool)), this, SLOT(fileFetched(bool)) ); 00073 //-- 00074 //attempt to get releases list from website. this lets us find out if this 00075 //copy of Album Shaper is outdated, and also allows us to know what 00076 //changelogs to get. 00077 getMode = GET_RELEASES; 00078 http.get( "/webService/releases.xml"); 00079 } 00080 //-- 00081 //text labels 00082 QDate currentDate = QDate::currentDate(); 00083 int copyYearFirst = QMIN( currentDate.year(), 2003 ); 00084 int copyYearLast = QMAX( currentDate.year(), 2004 ); 00085 00086 00087 progDesc = new QLabel( QString("Album Shaper " + 00088 QString(ALBUMSHAPER_VERSION) + 00089 ", © %1-%2 Will Stokes").arg(copyYearFirst).arg(copyYearLast), 00090 logoFrame ); 00091 00092 progURL = new QLabel( "http://albumshaper.sourceforge.net", logoFrame ); 00093 00094 00095 QFont textFont = progDesc->font(); 00096 textFont.setWeight(QFont::Bold); 00097 progDesc->setFont( textFont ); 00098 progURL->setFont( textFont ); 00099 //-- 00100 //tab widget which contains credits, changelog, etc 00101 tabWidget = new QTabWidget( this ); 00102 //-- 00103 //create credits tab 00104 credits = new QTextBrowser( this ); 00105 credits->setFrameStyle( QFrame::Panel | QFrame::Sunken ); 00106 credits->mimeSourceFactory()->setFilePath( QStringList(TEXT_PATH) ); 00107 credits->setSource( "about.html"); 00108 tabWidget->addTab(credits, 00109 QIconSet( QPixmap(QString(IMAGE_PATH)+"tabIcons/credits.png") ), 00110 tr("Credits") ); 00111 //-- 00112 //create history tab 00113 history = new QTextBrowser(this); 00114 history->setFrameStyle( QFrame::Panel | QFrame::Sunken ); 00115 history->mimeSourceFactory()->setFilePath( QStringList(TEXT_PATH) ); 00116 history->setSource( "history.html"); 00117 tabWidget->addTab(history, 00118 QIconSet( QPixmap(QString(IMAGE_PATH)+"tabIcons/history.png") ), 00119 tr("History") ); 00120 //-- 00121 //create close button 00122 closeButton = new QPushButton( 00123 //PLATFORM_SPECIFIC_CODE 00124 #ifndef Q_OS_MACX 00125 QPixmap(QString(IMAGE_PATH)+"buttonIcons/button_ok.png"), 00126 #endif 00127 tr("Close"), 00128 this ); 00129 closeButton->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); 00130 closeButton->setDefault(true); 00131 connect( closeButton, SIGNAL(clicked()), SLOT(close()) ); 00132 //-- 00133 logoFrame->setPaletteBackgroundColor( darkBlue ); 00134 progDesc->setPaletteForegroundColor( white ); 00135 progDesc->setPaletteBackgroundColor( darkBlue ); 00136 progURL->setPaletteForegroundColor( white ); 00137 progURL->setPaletteBackgroundColor( darkBlue ); 00138 tabWidget->setPaletteForegroundColor( black ); 00139 //-- 00140 QGridLayout* logoGrid = new QGridLayout( logoFrame, 4, 3, 0); 00141 logoGrid->setSpacing(WIDGET_SPACING); 00142 logoGrid->addWidget( albumShaperLogo, 0, 1, Qt::AlignCenter ); 00143 logoGrid->addWidget( progDesc, 2, 1, Qt::AlignCenter ); 00144 logoGrid->addWidget( progURL, 3, 1, Qt::AlignCenter ); 00145 00146 grid = new QGridLayout( this, 3, 1, 0); 00147 grid->setSpacing(WIDGET_SPACING); 00148 grid->addWidget( logoFrame, 0, 0 ); 00149 grid->addWidget( tabWidget, 1, 0 ); 00150 grid->addWidget( closeButton, 2, 0, Qt::AlignCenter ); 00151 resize( DEFAULT_WIDTH, DEFAULT_HEIGHT ); 00152 //-- 00153 //show secret images around Album Shaper's birthday (first release date - 4/3/2003) 00154 if( currentDate.year() > 2003 && currentDate.month() == 4 && currentDate.day() <= 3) 00155 { 00156 QLabel* cakeLogo = new QLabel(logoFrame); 00157 cakeLogo->setPixmap( QPixmap( QString(IMAGE_PATH)+"miscImages/birthdayL.png" ) ); 00158 QLabel* cakeLogo2 = new QLabel(logoFrame); 00159 cakeLogo2->setPixmap( QPixmap( QString(IMAGE_PATH)+"miscImages/birthdayR.png" ) ); 00160 QLabel* cakeMessage = new QLabel( QString( tr("Happy Birthday Album Shaper!") + 00161 QString(" %1 ").arg(currentDate.year() - 2003) + 00162 ( currentDate.year()-2003 == 1 ? tr("Year Old!") : tr("Years Old!")) ), logoFrame ); 00163 cakeMessage->setFont(textFont); 00164 cakeMessage->setPaletteForegroundColor( white ); 00165 //-- 00166 logoGrid->addWidget( cakeLogo, 0, 0, Qt::AlignCenter ); 00167 logoGrid->addWidget( cakeLogo2, 0, 2, Qt::AlignCenter ); 00168 logoGrid->addMultiCellWidget( cakeMessage, 1, 1, 0, 2, Qt::AlignCenter ); 00169 } 00170 //------------------------------- 00171 //set window to not be resizeable 00172 this->show(); 00173 setFixedSize(size()); 00174 //------------------------------- 00175 } 00176 //============================================== 00177 About::~About() 00178 { 00179 delete releases; 00180 releases = NULL; 00181 } 00182 //============================================== 00183 void About::fileFetched(bool error) 00184 { 00185 //------------------------------------------------------------ 00186 //if unable to get file bail 00187 if(error) 00188 { 00189 getMode = UNSET; 00190 return; 00191 } 00192 //------------------------------------------------------------ 00193 //getting releases? 00194 if(getMode == GET_RELEASES) 00195 { 00196 //write releases to temp file 00197 QFile fetchedDoc( TEMP_DIR + QString("/releases.xml") ); 00198 if(fetchedDoc.open(IO_WriteOnly)) 00199 { 00200 //---------------------------- 00201 //write to file 00202 QTextStream stream( &fetchedDoc ); 00203 stream.setEncoding( QTextStream::UnicodeUTF8 ); 00204 stream << QString( http.readAll() ); 00205 fetchedDoc.close(); 00206 //---------------------------- 00207 //parse xml file, construct string list of releases 00208 //open file, bail if unable to 00209 if( !fetchedDoc.open( IO_ReadOnly ) ) 00210 { 00211 getMode = UNSET; 00212 return; 00213 } 00214 00215 //parse dom 00216 QDomDocument xmlDom; 00217 if( !xmlDom.setContent( &fetchedDoc ) ) 00218 { 00219 fetchedDoc.close(); 00220 getMode = UNSET; 00221 return; 00222 } 00223 00224 //close file 00225 fetchedDoc.close(); 00226 00227 //construct stringlist of releases 00228 releases = new QStringList(); 00229 QDomElement root = xmlDom.documentElement(); 00230 QDomNode node = root.firstChild(); 00231 QDomText val; 00232 bool thisVersionFound = false; 00233 while( !node.isNull() ) 00234 { 00235 if( node.isElement() && node.nodeName() == "release" ) 00236 { 00237 val = node.firstChild().toText(); 00238 if(!val.isNull()) 00239 { 00240 //append release # 00241 releases->append( QString(val.nodeValue()) ); 00242 00243 //is release this version? 00244 if( QString(val.nodeValue()).compare( QString(ALBUMSHAPER_VERSION) ) == 0 ) 00245 thisVersionFound = true; 00246 00247 } 00248 } 00249 node = node.nextSibling(); 00250 } 00251 00252 //else if this version is not first on list but it was found in list then newer releases exist 00253 if(thisVersionFound && releases->first().compare( QString(ALBUMSHAPER_VERSION) ) != 0 ) 00254 { 00255 //create new improvements file with beginning html and body tags 00256 QFile fetchedDoc( TEMP_DIR + QString("/newImprovements.html") ); 00257 if(fetchedDoc.open(IO_WriteOnly)) 00258 { 00259 QTextStream stream( &fetchedDoc ); stream.setEncoding( QTextStream::UnicodeUTF8 ); 00260 stream << "<html><body bgcolor=\"white\" text=\"black\">\n"; 00261 stream << "<b><font size=\"+1\">" << tr("New improvements to Album Shaper are available in a new release!") << "<br><hr></font></b>"; 00262 fetchedDoc.close(); 00263 } 00264 00265 getMode = GET_NEW_IMPROVEMENTS; 00266 http.get( "/webService/" + releases->first() + "_changelog.html"); 00267 } 00268 //else we're up to date! move on to checking for new features in cvs! 00269 else 00270 { 00271 newImprovements = new QTextBrowser( this ); 00272 newImprovements->setFrameStyle( QFrame::Panel | QFrame::Sunken ); 00273 newImprovements->mimeSourceFactory()->setFilePath( QStringList(TEXT_PATH) ); 00274 00275 //bleeding edge message 00276 if(!thisVersionFound) 00277 { 00278 newImprovements->setSource( "bleedingEdge.html"); 00279 } 00280 else 00281 { 00282 newImprovements->setSource( "noUpdates.html"); 00283 } 00284 00285 tabWidget->addTab(newImprovements, 00286 QIconSet( QPixmap(QString(IMAGE_PATH)+"tabIcons/newImprovements.png") ), 00287 tr("Software Updates") ); 00288 00289 if(displayMode == UPDATES) 00290 tabWidget->setCurrentPage( tabWidget->indexOf( newImprovements ) ); 00291 00292 getMode = GET_UPCOMING_FEATURES; 00293 http.get( "/webService/upcomingFeatures.html"); 00294 } 00295 //---------------------------- 00296 //delete file 00297 QDir rootDir( TEMP_DIR ); 00298 rootDir.remove("releases.xml"); 00299 //---------------------------- 00300 } 00301 else 00302 { 00303 getMode = UNSET; 00304 } 00305 } 00306 //------------------------------------------------------------ 00307 else if(getMode == GET_NEW_IMPROVEMENTS) 00308 { 00309 //write additional changelog information to disk 00310 QFile fetchedDoc( TEMP_DIR + QString("/newImprovements.html") ); 00311 if(fetchedDoc.open(IO_WriteOnly | IO_Append)) 00312 { 00313 //write to file 00314 QTextStream stream( &fetchedDoc ); 00315 stream.setEncoding( QTextStream::UnicodeUTF8 ); 00316 stream << QString( http.readAll() ); 00317 fetchedDoc.close(); 00318 00319 //pop of release from stack 00320 releases->pop_front(); 00321 00322 //if stack empty then or we've goten up to this version add new tab with changes 00323 if(releases->isEmpty() || 00324 releases->first().compare( QString(ALBUMSHAPER_VERSION) ) == 0 ) 00325 { 00326 //tack on the end body and html tags 00327 if(fetchedDoc.open(IO_WriteOnly | IO_Append)) 00328 { 00329 //write to file 00330 QTextStream stream( &fetchedDoc ); 00331 stream.setEncoding( QTextStream::UnicodeUTF8 ); 00332 stream << "</body></html>"; 00333 fetchedDoc.close(); 00334 00335 newImprovements = new QTextBrowser(this); 00336 newImprovements->setFrameStyle( QFrame::Panel | QFrame::Sunken ); 00337 newImprovements->mimeSourceFactory()->setFilePath( TEMP_DIR ); 00338 newImprovements->setSource( "newImprovements.html" ); 00339 tabWidget->addTab(newImprovements, 00340 QIconSet( QPixmap(QString(IMAGE_PATH)+"tabIcons/newImprovements.png") ), 00341 tr("Software Updates") ); 00342 tabWidget->setCurrentPage( tabWidget->indexOf( newImprovements ) );; 00343 00344 //move on to checking for upcoming features 00345 getMode = GET_UPCOMING_FEATURES; 00346 http.get( "/webService/upcomingFeatures.html"); 00347 } 00348 else 00349 { 00350 getMode = UNSET; 00351 } 00352 } 00353 //if not empty then get even more new features! 00354 else 00355 { 00356 http.get( "/webService/" + releases->first() + "_changelog.html"); 00357 } 00358 } 00359 else 00360 { 00361 getMode = UNSET; 00362 } 00363 } 00364 //------------------------------------------------------------ 00365 //getting upcoming features? 00366 else if(getMode == GET_UPCOMING_FEATURES) 00367 { 00368 //write upcoming features to temp file 00369 QFile fetchedDoc( TEMP_DIR + QString("/upcomingFeatures.html") ); 00370 if(fetchedDoc.open(IO_WriteOnly)) 00371 { 00372 //write to file 00373 QTextStream stream( &fetchedDoc ); 00374 stream.setEncoding( QTextStream::UnicodeUTF8 ); 00375 stream << QString( http.readAll() ); 00376 fetchedDoc.close(); 00377 00378 //add tab 00379 upcomingFeatures = new QTextBrowser(this); 00380 upcomingFeatures->setFrameStyle( QFrame::Panel | QFrame::Sunken ); 00381 upcomingFeatures->mimeSourceFactory()->setFilePath( TEMP_DIR ); 00382 upcomingFeatures->setSource( "upcomingFeatures.html" ); 00383 tabWidget->addTab(upcomingFeatures, 00384 QIconSet( QPixmap(QString(IMAGE_PATH)+"tabIcons/upcomingFeatures.png") ), 00385 tr("Upcoming Features") ); 00386 00387 if(displayMode == UPCOMING) 00388 tabWidget->setCurrentPage( tabWidget->indexOf( upcomingFeatures ) ); 00389 00390 //delete file 00391 QDir rootDir( TEMP_DIR ); 00392 rootDir.remove("upcomingFeatures.html"); 00393 } 00394 00395 getMode = UNSET; 00396 } 00397 //------------------------------------------------------------ 00398 } 00399 //============================================== 00400 void About::closeEvent( QCloseEvent* e) 00401 { 00402 QWidget::closeEvent( e ); 00403 emit closed(); 00404 } 00405 //============================================== 00406 void About::reject() 00407 { 00408 QDialog::reject(); 00409 emit closed(); 00410 } 00411 //==============================================

Generated on Sun Mar 4 19:42:55 2007 for AlbumShaper by doxygen 1.3.7