diff --git a/TODO b/TODO index e2ac204b7..35635f868 100644 --- a/TODO +++ b/TODO @@ -45,6 +45,7 @@ - Windows port (Chris - Peerkoel) - Translations update - Allow to abort a searchby launching another one + - Move addTorrent to a thread * beta2 - Improve RSS code + cleanup (chris) - Wait for some bug fixes in libtorrent : diff --git a/src/misc.h b/src/misc.h index a57d92fb4..2b36e318a 100644 --- a/src/misc.h +++ b/src/misc.h @@ -193,7 +193,7 @@ class misc : public QObject{ // Take a number of seconds and return an user-friendly // time duration like "1d 2h 10m". static QString userFriendlyDuration(const long int seconds){ - if(seconds <= 0){ + if(seconds < 0){ return QString::QString(tr("Unknown")); } if(seconds < 60){ diff --git a/src/rss.h b/src/rss.h index e7fa77201..b73d41e76 100644 --- a/src/rss.h +++ b/src/rss.h @@ -51,7 +51,8 @@ class RssStream; class RssItem; // Item of a rss stream, single information -class RssItem{ +class RssItem : public QObject { + Q_OBJECT private: QString title; @@ -63,7 +64,7 @@ class RssItem{ public: // public constructor - RssItem(const QDomElement& properties){ + RssItem(const QDomElement& properties) { read = false; downloadLink = "none"; QDomElement property = properties.firstChild().toElement(); @@ -92,6 +93,8 @@ class RssItem{ } QString getDescription() const{ + if(description.isEmpty()) + return tr("No description available"); return description; } @@ -242,7 +245,7 @@ class RssStream : public QObject{ unsigned short getNbNonRead() const{ int i=0, nbnonread=0; - for(i=0; iisRead()) nbnonread++; } @@ -253,6 +256,11 @@ class RssStream : public QObject{ return listItem; } + QString getLastRefreshElapsedString() const{ + // TODO: remove this debug before release + return tr("%1 ago", "10min ago").arg(misc::userFriendlyDuration((long)(lastRefresh.elapsed()/1000.)).replace("<", "<")); + } + unsigned int getLastRefreshElapsed() const{ return lastRefresh.elapsed(); } @@ -293,7 +301,7 @@ class RssStream : public QObject{ QDomNode rss = root.firstChild(); QDomElement channel = root.firstChild().toElement(); unsigned short listsize = getListSize(); - for(unsigned short i=0; igetTitle(); unsigned short listsize = getListSize(); - for(unsigned short i=0; igetTitle() == firstTitle) lastindex = i; } - for(unsigned short i=0; iSTREAM_MAX_ITEM) { @@ -451,7 +459,8 @@ class RssManager : public QObject{ void saveStreamList(){ streamListUrl.clear(); QStringList streamListAlias; - for(unsigned short i=0; igetUrl()); streamListAlias.append(getStream(i)->getAlias()); } @@ -515,8 +524,8 @@ class RssManager : public QObject{ } } - void refresh(int index) { - if(index>=0 && indexgetLastRefreshElapsed()>REFRESH_FREQ_MAX) { getStream(index)->refresh(); connect(getStream(index), SIGNAL(refreshFinished(QString, const unsigned short&)), this, SLOT(streamNeedRefresh(QString, const unsigned short&))); @@ -537,7 +546,7 @@ class RssManager : public QObject{ return streamList.at(index); } - unsigned short getNbStream() { + unsigned int getNbStreams() { return streamList.size(); } @@ -550,7 +559,8 @@ class RssManager : public QObject{ QStringList getListAlias() { QStringList listAlias; - for(unsigned short i=0; igetAlias()); } return listAlias; diff --git a/src/rss_imp.cpp b/src/rss_imp.cpp index 1ac8c51dc..5115ca579 100644 --- a/src/rss_imp.cpp +++ b/src/rss_imp.cpp @@ -24,6 +24,7 @@ #include #include #include +#include "misc.h" // display a right-click menu void RSSImp::displayRSSListMenu(const QPoint& pos){ @@ -48,14 +49,14 @@ // delete a stream by a button void RSSImp::on_delStream_button_clicked() { - if(getNumStreamSelected()<0 || rssmanager.getNbStream()==0) { + if(getNumStreamSelected()<0 || rssmanager.getNbStreams()==0) { qDebug("no stream selected"); return; }else { int ok = QMessageBox::question(this, tr("Are you sure? -- qBittorrent"), tr("Are you sure you want to delete this stream from the list?"), tr("&Yes"), tr("&No"), QString(), 0, 1); - if(ok==0) { + if(ok==0) { textBrowser->clear(); listNews->clear(); rssmanager.removeStream(rssmanager.getStream(getNumStreamSelected())); @@ -71,7 +72,7 @@ // display the news of a stream when click on it void RSSImp::on_listStreams_clicked() { - if(rssmanager.getNbStream()>0) { + if(rssmanager.getNbStreams()>0) { moveCurrentItem(); rssmanager.getStream(getNumStreamSelected())->setRead(); // update the color of the stream, is it old ? @@ -105,16 +106,16 @@ else listStreams->setCurrentItem(listStreams->topLevelItem(0)); } - } + } //right-clik on stream : delete it void RSSImp::deleteStream() { - if(rssmanager.getNbStream()==0) { + if(rssmanager.getNbStreams()==0) { qDebug("no stream selected"); return; }else { int ok = QMessageBox::question(this, tr("Are you sure? -- qBittorrent"), tr("Are you sure you want to delete this stream from the list ?"), tr("&Yes"), tr("&No"), QString(), 0, 1); - if(ok==0) { + if(ok==0) { moveCurrentItem(); textBrowser->clear(); listNews->clear(); @@ -126,7 +127,7 @@ //right-clik on stream : give him an alias void RSSImp::renameStream() { - if(rssmanager.getNbStream()==0) { + if(rssmanager.getNbStreams()==0) { qDebug("no stream selected"); return; }else { @@ -144,7 +145,7 @@ //right-clik on stream : refresh it void RSSImp::refreshStream() { - if(rssmanager.getNbStream()>0) { + if(rssmanager.getNbStreams()>0) { moveCurrentItem(); short index = getNumStreamSelected(); textBrowser->clear(); @@ -152,16 +153,18 @@ listStreams->topLevelItem(index)->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png"))); rssmanager.refresh(index); } + updateLastRefreshedTimeForStreams(); } //right-click somewhere, refresh all the streams void RSSImp::refreshAllStreams() { textBrowser->clear(); listNews->clear(); - unsigned short nbstream = rssmanager.getNbStream(); - for(unsigned short i=0; itopLevelItem(i)->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png"))); rssmanager.refreshAll(); + updateLastRefreshedTimeForStreams(); } //right-click, register a new stream @@ -179,30 +182,19 @@ // fills the streamList void RSSImp::refreshStreamList() { - unsigned short nbstream = rssmanager.getNbStream(); + unsigned short nbstream = rssmanager.getNbStreams(); listStreams->clear(); QList streams; - for(unsigned short i=0; isetText(0, tr("no description available")); - url->setText(0, rssmanager.getStream(i)->getUrl()); - time->setText(0, tr("no refresh")); - description->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/description.png"))); - url->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/url.png"))); - time->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/time.png"))); - description->setData(0,Qt::ForegroundRole, QVariant(QColor("grey"))); - url->setData(0,Qt::ForegroundRole, QVariant(QColor("grey"))); - time->setData(0,Qt::ForegroundRole, QVariant(QColor("grey"))); updateStreamName(i, NEWS); + stream->setToolTip(0, QString("")+tr("Description:")+QString(" ")+rssmanager.getStream(i)->getDescription()+QString("
")+tr("url:")+QString(" ")+rssmanager.getStream(i)->getUrl()+QString("
")+tr("Last refresh:")+QString(" ")+rssmanager.getStream(i)->getLastRefreshElapsedString()); } } // fills the newsList void RSSImp::refreshNewsList() { - if(rssmanager.getNbStream()>0) { + if(rssmanager.getNbStreams()>0) { RssStream* currentstream = rssmanager.getStream(getNumStreamSelected()); listNews->clear(); unsigned short currentStreamSize = currentstream->getListSize(); @@ -211,8 +203,7 @@ if(currentstream->getItem(i)->isRead()){ listNews->item(i)->setData(Qt::ForegroundRole, QVariant(QColor("grey"))); listNews->item(i)->setData(Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere.png"))); - } - else { + } else { listNews->item(i)->setData(Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere2.png"))); listNews->item(i)->setData(Qt::ForegroundRole, QVariant(QColor("blue"))); } @@ -231,6 +222,13 @@ } } + void RSSImp::updateLastRefreshedTimeForStreams() { + unsigned int nbStreams = rssmanager.getNbStreams(); + for(unsigned int i=0; itopLevelItem(i)->setToolTip(0, QString("")+tr("Description:")+QString(" ")+rssmanager.getStream(i)->getDescription()+QString("
")+tr("url:")+QString(" ")+rssmanager.getStream(i)->getUrl()+QString("
")+tr("Last refresh:")+QString(" ")+rssmanager.getStream(i)->getLastRefreshElapsedString()); + } + } + // show the number of news for a stream, his status and an icon void RSSImp::updateStreamName(const unsigned short& i, const unsigned short& type) { // icon has just been download @@ -268,9 +266,7 @@ } listStreams->topLevelItem(i)->setData(0,Qt::DecorationRole, QVariant(QIcon(rssmanager.getStream(i)->getIconPath()))); // update description and display last refresh - if(rssmanager.getStream(i)->getDescription()!="") - listStreams->topLevelItem(i)->child(DESCRIPTION_CHILD)->setText(0, rssmanager.getStream(i)->getDescription()); - listStreams->topLevelItem(i)->child(TIME_CHILD)->setText(0, rssmanager.getStream(i)->getLastRefresh()); + listStreams->topLevelItem(i)->setToolTip(0, QString("")+tr("Description:")+QString(" ")+rssmanager.getStream(i)->getDescription()+QString("
")+tr("url:")+QString(" ")+rssmanager.getStream(i)->getUrl()+QString("
")+tr("Last refresh:")+QString(" ")+rssmanager.getStream(i)->getLastRefreshElapsedString()); } } @@ -286,14 +282,16 @@ actionRefresh->setIcon(QIcon(QString::fromUtf8(":/Icons/refresh.png"))); actionCreate->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/add.png"))); actionRefreshAll->setIcon(QIcon(QString::fromUtf8(":/Icons/refresh.png"))); - + connect(listStreams, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayRSSListMenu(const QPoint&))); connect(actionDelete, SIGNAL(triggered()), this, SLOT(deleteStream())); connect(actionRename, SIGNAL(triggered()), this, SLOT(renameStream())); connect(actionRefresh, SIGNAL(triggered()), this, SLOT(refreshStream())); connect(actionCreate, SIGNAL(triggered()), this, SLOT(createStream())); connect(actionRefreshAll, SIGNAL(triggered()), this, SLOT(refreshAllStreams())); + connect(&refreshTimeTimer, SIGNAL(timeout()), this, SLOT(updateLastRefreshedTimeForStreams())); connect(&rssmanager, SIGNAL(streamNeedRefresh(const unsigned short&, const unsigned short&)), this, SLOT(updateStreamName(const unsigned short&, const unsigned short&))); + refreshTimeTimer.start(60000); // 1min refreshStreamList(); refreshTextBrowser(); } @@ -303,5 +301,5 @@ short RSSImp::getNumStreamSelected(){ return listStreams->indexOfTopLevelItem(listStreams->currentItem()); - } + } diff --git a/src/rss_imp.h b/src/rss_imp.h index 2912f47ce..5c6a68ae8 100644 --- a/src/rss_imp.h +++ b/src/rss_imp.h @@ -37,6 +37,7 @@ class RSSImp : public QWidget, public Ui::RSS{ private: RssManager rssmanager; + QTimer refreshTimeTimer; protected slots: void on_addStream_button_clicked(); @@ -57,6 +58,7 @@ class RSSImp : public QWidget, public Ui::RSS{ void refreshNewsList(); void refreshTextBrowser(); short getNumStreamSelected(); + void updateLastRefreshedTimeForStreams(); public: RSSImp();