1
mirror of https://github.com/qbittorrent/qBittorrent synced 2025-11-04 16:42:38 +01:00

Compare commits

..

1 Commits

Author SHA1 Message Date
Christophe Dumez
9c0751ed4b - Tagged v1.5.0beta2 2009-08-23 14:59:51 +00:00
99 changed files with 6348 additions and 10147 deletions

View File

@@ -1,6 +1,5 @@
* Unknown - Christophe Dumez <chris@qbittorrent.org> - v1.5.0 * Unknown - Christophe Dumez <chris@qbittorrent.org> - v1.5.0
- FEATURE: Added Magnet URI support - FEATURE: Added Magnet URI support
- FEATURE: Search engine supports category-based requests
- FEATURE: Make use of torrent enclosure in RSS feeds for direct download - FEATURE: Make use of torrent enclosure in RSS feeds for direct download
- FEATURE: Implemented a RSS feed downloader with filter support - FEATURE: Implemented a RSS feed downloader with filter support
- FEATURE: Save old RSS item to hard disk to remember them on start up - FEATURE: Save old RSS item to hard disk to remember them on start up
@@ -8,12 +7,8 @@
- FEATURE: In torrent addition from URL, paste clipboard content if it contains an URL - FEATURE: In torrent addition from URL, paste clipboard content if it contains an URL
- FEATURE: RSS feeds URLs can now be copied to clipboard - FEATURE: RSS feeds URLs can now be copied to clipboard
- FEATURE: RSS feeds can now be grouped into folders - FEATURE: RSS feeds can now be grouped into folders
- FEATURE: Added "Unread" item to RSS feed list to display all unread news
- FEATURE: If a torrent contains a torrent file, process downloaded torrent file too - FEATURE: If a torrent contains a torrent file, process downloaded torrent file too
- FEATURE: A random listening port can be chosen automatically
- BUGFIX: torrent resume code rewrited - BUGFIX: torrent resume code rewrited
- BUGFIX: Greatly improved column sorting code
- COSMETIC: Redesigned search tab to improve usability
- COSMETIC: Redesigned RSS tab to improve usability - COSMETIC: Redesigned RSS tab to improve usability
* Sun Aug 21 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.4.1 * Sun Aug 21 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.4.1

View File

@@ -38,7 +38,6 @@
#include <QFile> #include <QFile>
#include <QSettings> #include <QSettings>
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QSortFilterProxyModel>
#include <QHeaderView> #include <QHeaderView>
#include <QMenu> #include <QMenu>
#include <QMessageBox> #include <QMessageBox>
@@ -55,16 +54,9 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
finishedListModel->setHeaderData(F_PEERS, Qt::Horizontal, tr("Connected peers")); finishedListModel->setHeaderData(F_PEERS, Qt::Horizontal, tr("Connected peers"));
finishedListModel->setHeaderData(F_UPLOAD, Qt::Horizontal, tr("Total uploaded", "i.e: Total amount of uploaded data")); finishedListModel->setHeaderData(F_UPLOAD, Qt::Horizontal, tr("Total uploaded", "i.e: Total amount of uploaded data"));
finishedListModel->setHeaderData(F_RATIO, Qt::Horizontal, tr("Ratio")); finishedListModel->setHeaderData(F_RATIO, Qt::Horizontal, tr("Ratio"));
finishedList->setModel(finishedListModel);
proxyModel = new QSortFilterProxyModel();
proxyModel->setDynamicSortFilter(true);
proxyModel->setSourceModel(finishedListModel);
finishedList->setModel(proxyModel);
finishedList->setRootIsDecorated(false); finishedList->setRootIsDecorated(false);
finishedList->setAllColumnsShowFocus(true); finishedList->setAllColumnsShowFocus(true);
finishedList->setSortingEnabled(true);
loadHiddenColumns(); loadHiddenColumns();
// Hide hash column // Hide hash column
finishedList->hideColumn(F_HASH); finishedList->hideColumn(F_HASH);
@@ -112,11 +104,9 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
} }
FinishedTorrents::~FinishedTorrents(){ FinishedTorrents::~FinishedTorrents(){
saveLastSortedColumn();
saveColWidthFinishedList(); saveColWidthFinishedList();
saveHiddenColumns(); saveHiddenColumns();
delete finishedListDelegate; delete finishedListDelegate;
delete proxyModel;
delete finishedListModel; delete finishedListModel;
} }
@@ -151,8 +141,8 @@ void FinishedTorrents::addTorrent(QString hash){
// Update the number of finished torrents // Update the number of finished torrents
++nbFinished; ++nbFinished;
emit finishedTorrentsNumberChanged(nbFinished); emit finishedTorrentsNumberChanged(nbFinished);
// Sort List
loadLastSortedColumn(); sortFinishedList();
} }
// Set the color of a row in data model // Set the color of a row in data model
@@ -169,7 +159,7 @@ QStringList FinishedTorrents::getSelectedTorrents(bool only_one) const{
foreach(const QModelIndex &index, selectedIndexes) { foreach(const QModelIndex &index, selectedIndexes) {
if(index.column() == F_NAME) { if(index.column() == F_NAME) {
// Get the file hash // Get the file hash
QString hash = getHashFromRow(index.row()); QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
res << hash; res << hash;
if(only_one) break; if(only_one) break;
} }
@@ -218,18 +208,6 @@ bool FinishedTorrents::loadColWidthFinishedList(){
return true; return true;
} }
void FinishedTorrents::saveLastSortedColumn() {
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
Qt::SortOrder sortOrder = finishedList->header()->sortIndicatorOrder();
QString sortOrderLetter;
if(sortOrder == Qt::AscendingOrder)
sortOrderLetter = QString::fromUtf8("a");
else
sortOrderLetter = QString::fromUtf8("d");
int index = finishedList->header()->sortIndicatorSection();
settings.setValue(QString::fromUtf8("FinishedListSortedCol"), misc::toQString(index)+sortOrderLetter);
}
void FinishedTorrents::loadLastSortedColumn() { void FinishedTorrents::loadLastSortedColumn() {
// Loading last sorted column // Loading last sorted column
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
@@ -242,7 +220,7 @@ void FinishedTorrents::loadLastSortedColumn() {
sortOrder = Qt::AscendingOrder; sortOrder = Qt::AscendingOrder;
sortedCol = sortedCol.left(sortedCol.size()-1); sortedCol = sortedCol.left(sortedCol.size()-1);
int index = sortedCol.toInt(); int index = sortedCol.toInt();
finishedList->sortByColumn(index, sortOrder); sortFinishedList(index, sortOrder);
} }
} }
@@ -287,7 +265,7 @@ void FinishedTorrents::on_actionSet_upload_limit_triggered(){
foreach(const QModelIndex &index, selectedIndexes){ foreach(const QModelIndex &index, selectedIndexes){
if(index.column() == F_NAME){ if(index.column() == F_NAME){
// Get the file hash // Get the file hash
hashes << getHashFromRow(index.row()); hashes << finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
} }
} }
new BandwidthAllocationDialog(this, true, BTSession, hashes); new BandwidthAllocationDialog(this, true, BTSession, hashes);
@@ -373,8 +351,8 @@ void FinishedTorrents::pauseTorrent(QString hash) {
} }
QString FinishedTorrents::getHashFromRow(unsigned int row) const { QString FinishedTorrents::getHashFromRow(unsigned int row) const {
Q_ASSERT(row < (unsigned int)proxyModel->rowCount()); Q_ASSERT(row < (unsigned int)finishedListModel->rowCount());
return proxyModel->data(proxyModel->index(row, F_HASH)).toString(); return finishedListModel->data(finishedListModel->index(row, F_HASH)).toString();
} }
// Will move it to download tab // Will move it to download tab
@@ -391,7 +369,7 @@ void FinishedTorrents::deleteTorrent(QString hash){
// Show torrent properties dialog // Show torrent properties dialog
void FinishedTorrents::showProperties(const QModelIndex &index){ void FinishedTorrents::showProperties(const QModelIndex &index){
showPropertiesFromHash(getHashFromRow(index.row())); showPropertiesFromHash(finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString());
} }
void FinishedTorrents::showPropertiesFromHash(QString hash){ void FinishedTorrents::showPropertiesFromHash(QString hash){
@@ -422,7 +400,7 @@ void FinishedTorrents::forceRecheck(){
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes(); QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
foreach(const QModelIndex &index, selectedIndexes){ foreach(const QModelIndex &index, selectedIndexes){
if(index.column() == F_NAME){ if(index.column() == F_NAME){
QString hash = getHashFromRow(index.row()); QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
QTorrentHandle h = BTSession->getTorrentHandle(hash); QTorrentHandle h = BTSession->getTorrentHandle(hash);
qDebug("Forcing recheck for torrent %s", hash.toLocal8Bit().data()); qDebug("Forcing recheck for torrent %s", hash.toLocal8Bit().data());
h.force_recheck(); h.force_recheck();
@@ -438,7 +416,7 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint&){
foreach(const QModelIndex &index, selectedIndexes) { foreach(const QModelIndex &index, selectedIndexes) {
if(index.column() == F_NAME) { if(index.column() == F_NAME) {
// Get the file name // Get the file name
QString hash = getHashFromRow(index.row()); QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
// Get handle and pause the torrent // Get handle and pause the torrent
QTorrentHandle h = BTSession->getTorrentHandle(hash); QTorrentHandle h = BTSession->getTorrentHandle(hash);
if(!h.is_valid()) continue; if(!h.is_valid()) continue;
@@ -484,7 +462,7 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint&){
*/ */
// hide/show columns menu // hide/show columns menu
void FinishedTorrents::displayFinishedHoSMenu(const QPoint&){ void FinishedTorrents::displayFinishedHoSMenu(const QPoint& pos){
QMenu hideshowColumn(this); QMenu hideshowColumn(this);
hideshowColumn.setTitle(tr("Hide or Show Column")); hideshowColumn.setTitle(tr("Hide or Show Column"));
int lastCol = F_RATIO; int lastCol = F_RATIO;
@@ -492,7 +470,7 @@ void FinishedTorrents::displayFinishedHoSMenu(const QPoint&){
hideshowColumn.addAction(getActionHoSCol(i)); hideshowColumn.addAction(getActionHoSCol(i));
} }
// Call menu // Call menu
hideshowColumn.exec(QCursor::pos()); hideshowColumn.exec(mapToGlobal(pos)+QPoint(10,34));
} }
// toggle hide/show a column // toggle hide/show a column
@@ -625,3 +603,97 @@ QAction* FinishedTorrents::getActionHoSCol(int index) {
return NULL; return NULL;
} }
} }
/*
* Sorting functions
*/
void FinishedTorrents::toggleFinishedListSortOrder(int index) {
Qt::SortOrder sortOrder = Qt::AscendingOrder;
if(finishedList->header()->sortIndicatorSection() == index){
sortOrder = (Qt::SortOrder)!(bool)finishedList->header()->sortIndicatorOrder();
}
switch(index) {
case F_SIZE:
case F_UPSPEED:
case F_RATIO:
case F_UPLOAD:
sortFinishedListFloat(index, sortOrder);
break;
default:
sortFinishedListString(index, sortOrder);
}
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
QString sortOrderLetter;
if(sortOrder == Qt::AscendingOrder)
sortOrderLetter = QString::fromUtf8("a");
else
sortOrderLetter = QString::fromUtf8("d");
settings.setValue(QString::fromUtf8("FinishedListSortedCol"), misc::toQString(index)+sortOrderLetter);
}
void FinishedTorrents::sortFinishedList(int index, Qt::SortOrder sortOrder){
if(index == -1) {
index = finishedList->header()->sortIndicatorSection();
sortOrder = finishedList->header()->sortIndicatorOrder();
} else {
finishedList->header()->setSortIndicator(index, sortOrder);
}
switch(index) {
case F_SIZE:
case F_UPSPEED:
case F_UPLOAD:
case F_RATIO:
sortFinishedListFloat(index, sortOrder);
break;
default:
sortFinishedListString(index, sortOrder);
}
}
void FinishedTorrents::sortFinishedListFloat(int index, Qt::SortOrder sortOrder){
QList<QPair<int, double> > lines;
// insertion sorting
unsigned int nbRows = finishedListModel->rowCount();
for(unsigned int i=0; i<nbRows; ++i){
misc::insertSort(lines, QPair<int,double>(i, finishedListModel->data(finishedListModel->index(i, index)).toDouble()), sortOrder);
}
// Insert items in new model, in correct order
unsigned int nbRows_old = lines.size();
for(unsigned int row=0; row<nbRows_old; ++row){
finishedListModel->insertRow(finishedListModel->rowCount());
unsigned int sourceRow = lines[row].first;
unsigned int nbColumns = finishedListModel->columnCount();
for(unsigned int col=0; col<nbColumns; ++col){
finishedListModel->setData(finishedListModel->index(nbRows_old+row, col), finishedListModel->data(finishedListModel->index(sourceRow, col)));
finishedListModel->setData(finishedListModel->index(nbRows_old+row, col), finishedListModel->data(finishedListModel->index(sourceRow, col), Qt::DecorationRole), Qt::DecorationRole);
finishedListModel->setData(finishedListModel->index(nbRows_old+row, col), finishedListModel->data(finishedListModel->index(sourceRow, col), Qt::ForegroundRole), Qt::ForegroundRole);
}
}
// Remove old rows
finishedListModel->removeRows(0, nbRows_old);
}
void FinishedTorrents::sortFinishedListString(int index, Qt::SortOrder sortOrder){
QList<QPair<int, QString> > lines;
// Insertion sorting
unsigned int nbRows = finishedListModel->rowCount();
for(unsigned int i=0; i<nbRows; ++i){
misc::insertSortString(lines, QPair<int, QString>(i, finishedListModel->data(finishedListModel->index(i, index)).toString()), sortOrder);
}
// Insert items in new model, in correct order
unsigned int nbRows_old = lines.size();
for(unsigned int row=0; row<nbRows_old; ++row){
finishedListModel->insertRow(finishedListModel->rowCount());
unsigned int sourceRow = lines[row].first;
unsigned int nbColumns = finishedListModel->columnCount();
for(unsigned int col=0; col<nbColumns; ++col){
finishedListModel->setData(finishedListModel->index(nbRows_old+row, col), finishedListModel->data(finishedListModel->index(sourceRow, col)));
finishedListModel->setData(finishedListModel->index(nbRows_old+row, col), finishedListModel->data(finishedListModel->index(sourceRow, col), Qt::DecorationRole), Qt::DecorationRole);
finishedListModel->setData(finishedListModel->index(nbRows_old+row, col), finishedListModel->data(finishedListModel->index(sourceRow, col), Qt::ForegroundRole), Qt::ForegroundRole);
}
}
// Remove old rows
finishedListModel->removeRows(0, nbRows_old);
}

View File

@@ -35,7 +35,6 @@
#include "qtorrenthandle.h" #include "qtorrenthandle.h"
class QStandardItemModel; class QStandardItemModel;
class QSortFilterProxyModel;
class bittorrent; class bittorrent;
class FinishedListDelegate; class FinishedListDelegate;
@@ -48,7 +47,6 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
bittorrent *BTSession; bittorrent *BTSession;
FinishedListDelegate *finishedListDelegate; FinishedListDelegate *finishedListDelegate;
QStandardItemModel *finishedListModel; QStandardItemModel *finishedListModel;
QSortFilterProxyModel *proxyModel;
unsigned int nbFinished; unsigned int nbFinished;
void hideOrShowColumn(int index); void hideOrShowColumn(int index);
bool loadHiddenColumns(); bool loadHiddenColumns();
@@ -71,6 +69,10 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
void displayFinishedHoSMenu(const QPoint&); void displayFinishedHoSMenu(const QPoint&);
void setRowColor(int row, QString color); void setRowColor(int row, QString color);
void saveColWidthFinishedList() const; void saveColWidthFinishedList() const;
void toggleFinishedListSortOrder(int index);
void sortFinishedList(int index=-1, Qt::SortOrder sortOrder=Qt::AscendingOrder);
void sortFinishedListFloat(int index, Qt::SortOrder sortOrder);
void sortFinishedListString(int index, Qt::SortOrder sortOrder);
void updateFileSize(QString hash); void updateFileSize(QString hash);
void on_actionSet_upload_limit_triggered(); void on_actionSet_upload_limit_triggered();
void notifyTorrentDoubleClicked(const QModelIndex& index); void notifyTorrentDoubleClicked(const QModelIndex& index);
@@ -91,7 +93,6 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
void deleteTorrent(QString hash); void deleteTorrent(QString hash);
void showPropertiesFromHash(QString hash); void showPropertiesFromHash(QString hash);
void loadLastSortedColumn(); void loadLastSortedColumn();
void saveLastSortedColumn();
void updateMetadata(QTorrentHandle &h); void updateMetadata(QTorrentHandle &h);
signals: signals:

View File

@@ -163,7 +163,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
// Search engine tab // Search engine tab
searchEngine = new SearchEngine(BTSession, myTrayIcon, systrayIntegration); searchEngine = new SearchEngine(BTSession, myTrayIcon, systrayIntegration);
tabs->addTab(searchEngine, tr("Search")); tabs->addTab(searchEngine, tr("Search"));
tabs->setTabIcon(2, QIcon(QString::fromUtf8(":/Icons/oxygen/edit-find.png"))); tabs->setTabIcon(2, QIcon(QString::fromUtf8(":/Icons/skin/search.png")));
readSettings(); readSettings();
// RSS Tab // RSS Tab
rssWidget = 0; rssWidget = 0;
@@ -1027,7 +1027,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
// Connection // Connection
// * Ports binding // * Ports binding
unsigned short old_listenPort = BTSession->getListenPort(); unsigned short old_listenPort = BTSession->getListenPort();
BTSession->setListeningPort(options->getPort()); BTSession->setListeningPortsRange(options->getPorts());
unsigned short new_listenPort = BTSession->getListenPort(); unsigned short new_listenPort = BTSession->getListenPort();
if(new_listenPort != old_listenPort) { if(new_listenPort != old_listenPort) {
BTSession->addConsoleMessage(tr("qBittorrent is bound to port: TCP/%1", "e.g: qBittorrent is bound to port: 6881").arg( misc::toQString(new_listenPort))); BTSession->addConsoleMessage(tr("qBittorrent is bound to port: TCP/%1", "e.g: qBittorrent is bound to port: 6881").arg( misc::toQString(new_listenPort)));

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
src/Icons/money.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 813 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 627 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 739 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/Icons/skin/search.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1084,8 +1084,7 @@ void bittorrent::disableDirectoryScanning() {
// Set the ports range in which is chosen the port the bittorrent // Set the ports range in which is chosen the port the bittorrent
// session will listen to // session will listen to
void bittorrent::setListeningPort(int port) { void bittorrent::setListeningPortsRange(std::pair<unsigned short, unsigned short> ports) {
std::pair<int,int> ports(port, port);
s->listen_on(ports); s->listen_on(ports);
} }

View File

@@ -141,7 +141,7 @@ class bittorrent : public QObject {
void decreaseDlTorrentPriority(QString hash); void decreaseDlTorrentPriority(QString hash);
void downloadUrlAndSkipDialog(QString url, QString save_path=QString::null); void downloadUrlAndSkipDialog(QString url, QString save_path=QString::null);
// Session configuration - Setters // Session configuration - Setters
void setListeningPort(int port); void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports);
void setMaxConnections(int maxConnec); void setMaxConnections(int maxConnec);
void setMaxConnectionsPerTorrent(int max); void setMaxConnectionsPerTorrent(int max);
void setMaxUploadsPerTorrent(int max); void setMaxUploadsPerTorrent(int max);

View File

@@ -142,7 +142,7 @@
<action name="actionBuy_it"> <action name="actionBuy_it">
<property name="icon"> <property name="icon">
<iconset resource="icons.qrc"> <iconset resource="icons.qrc">
<normaloff>:/Icons/oxygen/wallet.png</normaloff>:/Icons/oxygen/wallet.png</iconset> <normaloff>:/Icons/money.png</normaloff>:/Icons/money.png</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Buy it</string> <string>Buy it</string>

View File

@@ -77,20 +77,13 @@ subDownloadThread::~subDownloadThread(){
} }
void subDownloadThread::run(){ void subDownloadThread::run(){
// Get a unique filename // XXX: Trick to get a unique filename
QString filePath; QString filePath;
QTemporaryFile tmpfile; QTemporaryFile *tmpfile = new QTemporaryFile();
tmpfile.setAutoRemove(false); if (tmpfile->open()) {
if (tmpfile.open()) { filePath = tmpfile->fileName();
filePath = tmpfile.fileName();
qDebug("Temporary filename is: %s", filePath.toLocal8Bit().data());
} else {
emit downloadFailureST(this, url, tr("I/O Error"));
return;
} }
tmpfile.close(); delete tmpfile;
// Now temporary file is created but closed so that
// curl can use it
FILE *f = fopen(filePath.toLocal8Bit().data(), "wb"); FILE *f = fopen(filePath.toLocal8Bit().data(), "wb");
if(!f) { if(!f) {
std::cerr << "couldn't open destination file" << "\n"; std::cerr << "couldn't open destination file" << "\n";

File diff suppressed because it is too large Load Diff

View File

@@ -37,7 +37,6 @@
class QStandardItemModel; class QStandardItemModel;
class bittorrent; class bittorrent;
class DLListDelegate; class DLListDelegate;
class QSortFilterProxyModel;
using namespace libtorrent; using namespace libtorrent;
@@ -48,7 +47,6 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
bittorrent *BTSession; bittorrent *BTSession;
DLListDelegate *DLDelegate; DLListDelegate *DLDelegate;
QStandardItemModel *DLListModel; QStandardItemModel *DLListModel;
QSortFilterProxyModel *proxyModel;
unsigned int nbTorrents; unsigned int nbTorrents;
void hideOrShowColumn(int index); void hideOrShowColumn(int index);
bool loadHiddenColumns(); bool loadHiddenColumns();
@@ -76,6 +74,10 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
void on_actionSet_upload_limit_triggered(); void on_actionSet_upload_limit_triggered();
void displayDLListMenu(const QPoint& pos); void displayDLListMenu(const QPoint& pos);
void displayDLHoSMenu(const QPoint&); void displayDLHoSMenu(const QPoint&);
void sortDownloadList(int index=-1, Qt::SortOrder startSortOrder=Qt::AscendingOrder);
void toggleDownloadListSortOrder(int index);
void sortDownloadListFloat(int index, Qt::SortOrder sortOrder);
void sortDownloadListString(int index, Qt::SortOrder sortOrder);
void saveColWidthDLList() const; void saveColWidthDLList() const;
void setRowColor(int row, QColor color); void setRowColor(int row, QColor color);
void showProperties(const QModelIndex &index); void showProperties(const QModelIndex &index);
@@ -98,7 +100,7 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
void updateFileSizeAndProgress(QString hash); void updateFileSizeAndProgress(QString hash);
void showPropertiesFromHash(QString hash); void showPropertiesFromHash(QString hash);
void hidePriorityColumn(bool hide); void hidePriorityColumn(bool hide);
void saveLastSortedColumn(); void sortProgressColumn(QTorrentHandle& h);
void loadLastSortedColumn(); void loadLastSortedColumn();
void addTorrent(QString hash); void addTorrent(QString hash);
void updateMetadata(QTorrentHandle &h); void updateMetadata(QTorrentHandle &h);

File diff suppressed because it is too large Load Diff

View File

@@ -32,7 +32,6 @@
#define ENGINE_SELECT_DLG_H #define ENGINE_SELECT_DLG_H
#include "ui_engineSelect.h" #include "ui_engineSelect.h"
#include "supportedEngines.h"
class downloadThread; class downloadThread;
class QDropEvent; class QDropEvent;
@@ -41,11 +40,12 @@ class engineSelectDlg : public QDialog, public Ui::engineSelect{
Q_OBJECT Q_OBJECT
private: private:
// Search related
QHash<QString, bool> installed_engines;
downloadThread *downloader; downloadThread *downloader;
SupportedEngines *supported_engines;
public: public:
engineSelectDlg(QWidget *parent, SupportedEngines *supported_engines); engineSelectDlg(QWidget *parent);
~engineSelectDlg(); ~engineSelectDlg();
QList<QTreeWidgetItem*> findItemsWithUrl(QString url); QList<QTreeWidgetItem*> findItemsWithUrl(QString url);
QTreeWidgetItem* findItemWithID(QString id); QTreeWidgetItem* findItemWithID(QString id);
@@ -53,14 +53,15 @@ class engineSelectDlg : public QDialog, public Ui::engineSelect{
protected: protected:
bool parseVersionsFile(QString versions_file, QString updateServer); bool parseVersionsFile(QString versions_file, QString updateServer);
bool isUpdateNeeded(QString plugin_name, float new_version) const; bool isUpdateNeeded(QString plugin_name, float new_version) const;
bool checkInstalled(QString plugin_name) const;
signals: signals:
void enginesChanged(); void enginesChanged();
protected slots: protected slots:
void saveSettings();
void on_closeButton_clicked(); void on_closeButton_clicked();
void loadSupportedSearchEngines(); void loadSupportedSearchEngines(bool first=false);
void addNewEngine(QString engine_name);
void toggleEngineState(QTreeWidgetItem*, int); void toggleEngineState(QTreeWidgetItem*, int);
void setRowColor(int row, QString color); void setRowColor(int row, QString color);
void processDownloadedFile(QString url, QString filePath); void processDownloadedFile(QString url, QString filePath);

View File

@@ -18,7 +18,6 @@ private:
QHash<QTreeWidgetItem*, RssFile*> mapping; QHash<QTreeWidgetItem*, RssFile*> mapping;
QHash<QString, QTreeWidgetItem*> feeds_items; QHash<QString, QTreeWidgetItem*> feeds_items;
QTreeWidgetItem* current_feed; QTreeWidgetItem* current_feed;
QTreeWidgetItem *unread_item;
public: public:
FeedList(QWidget *parent, RssManager *rssmanager): QTreeWidget(parent), rssmanager(rssmanager) { FeedList(QWidget *parent, RssManager *rssmanager): QTreeWidget(parent), rssmanager(rssmanager) {
@@ -29,17 +28,14 @@ public:
QTreeWidgetItem *___qtreewidgetitem = headerItem(); QTreeWidgetItem *___qtreewidgetitem = headerItem();
___qtreewidgetitem->setText(0, QApplication::translate("RSS", "RSS feeds", 0, QApplication::UnicodeUTF8)); ___qtreewidgetitem->setText(0, QApplication::translate("RSS", "RSS feeds", 0, QApplication::UnicodeUTF8));
connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(updateCurrentFeed(QTreeWidgetItem*))); connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(updateCurrentFeed(QTreeWidgetItem*)));
unread_item = new QTreeWidgetItem(this);
unread_item->setText(0, tr("Unread") + QString::fromUtf8(" (") + QString::number(rssmanager->getNbUnRead(), 10)+ QString(")"));
unread_item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/oxygen/mail-folder-inbox.png")));
itemAdded(unread_item, rssmanager);
setCurrentItem(unread_item);
} }
void itemAdded(QTreeWidgetItem *item, RssFile* file) { void itemAdded(QTreeWidgetItem *item, RssFile* file) {
mapping[item] = file; mapping[item] = file;
if(file->getType() == RssFile::STREAM) { if(file->getType() == RssFile::STREAM) {
feeds_items[file->getID()] = item; feeds_items[file->getID()] = item;
if(topLevelItemCount() == 1)
setCurrentItem(item);
} }
} }
@@ -49,19 +45,15 @@ public:
feeds_items.remove(file->getID()); feeds_items.remove(file->getID());
} }
bool hasFeed(QString url) const { bool hasFeed(QString url) {
return feeds_items.contains(QUrl(url).toString()); return feeds_items.contains(QUrl(url).toString());
} }
QList<QTreeWidgetItem*> getAllFeedItems() const { QList<QTreeWidgetItem*> getAllFeedItems() {
return feeds_items.values(); return feeds_items.values();
} }
QTreeWidgetItem* getUnreadItem() const { QStringList getItemPath(QTreeWidgetItem* item) {
return unread_item;
}
QStringList getItemPath(QTreeWidgetItem* item) const {
QStringList path; QStringList path;
if(item) { if(item) {
if(item->parent()) if(item->parent())
@@ -71,7 +63,7 @@ public:
return path; return path;
} }
QList<QTreeWidgetItem*> getAllOpenFolders(QTreeWidgetItem *parent=0) const { QList<QTreeWidgetItem*> getAllOpenFolders(QTreeWidgetItem *parent=0) {
QList<QTreeWidgetItem*> open_folders; QList<QTreeWidgetItem*> open_folders;
int nbChildren; int nbChildren;
if(parent) if(parent)
@@ -110,15 +102,19 @@ public:
return feeds; return feeds;
} }
RssFile* getRSSItem(QTreeWidgetItem *item) const { RssFile* getRSSItem(QTreeWidgetItem *item) {
return mapping[item]; return mapping[item];
} }
RssFile::FileType getItemType(QTreeWidgetItem *item) const { RssFile* getCurrentRSSItem() {
return mapping[current_feed];
}
RssFile::FileType getItemType(QTreeWidgetItem *item) {
return mapping[item]->getType(); return mapping[item]->getType();
} }
QString getItemID(QTreeWidgetItem *item) const { QString getItemID(QTreeWidgetItem *item) {
return mapping[item]->getID(); return mapping[item]->getID();
} }
@@ -126,10 +122,6 @@ public:
return feeds_items[url]; return feeds_items[url];
} }
RssStream* getRSSItemFromUrl(QString url) const {
return (RssStream*)getRSSItem(getTreeItemFromUrl(url));
}
QTreeWidgetItem* currentItem() const { QTreeWidgetItem* currentItem() const {
return current_feed; return current_feed;
} }
@@ -140,29 +132,20 @@ public:
signals: signals:
void foldersAltered(QList<QTreeWidgetItem*> folders); void foldersAltered(QList<QTreeWidgetItem*> folders);
void overwriteAttempt(QString filename);
protected slots: protected slots:
void updateCurrentFeed(QTreeWidgetItem* new_item) { void updateCurrentFeed(QTreeWidgetItem* new_item) {
if((new_item && getItemType(new_item) == RssFile::STREAM) || new_item == unread_item) if(getItemType(new_item) == RssFile::STREAM)
current_feed = new_item; current_feed = new_item;
} }
protected: protected:
void dragMoveEvent(QDragMoveEvent * event) { void dragMoveEvent(QDragMoveEvent * event) {
QTreeWidgetItem *item = itemAt(event->pos()); QTreeWidgetItem *item = itemAt(event->pos());
if(item == unread_item) { if(item && getItemType(item) != RssFile::FOLDER)
event->ignore(); event->ignore();
} else { else {
if(item && getItemType(item) != RssFile::FOLDER) QTreeWidget::dragMoveEvent(event);
event->ignore();
else {
if(selectedItems().contains(unread_item)) {
event->ignore();
} else {
QTreeWidget::dragMoveEvent(event);
}
}
} }
} }
@@ -178,15 +161,6 @@ protected:
dest_folder = rssmanager; dest_folder = rssmanager;
} }
QList<QTreeWidgetItem *> src_items = selectedItems(); QList<QTreeWidgetItem *> src_items = selectedItems();
// Check if there is not going to overwrite another file
foreach(QTreeWidgetItem *src_item, src_items) {
RssFile *file = getRSSItem(src_item);
if(dest_folder->hasChild(file->getID())) {
emit overwriteAttempt(file->getID());
return;
}
}
// Proceed with the move
foreach(QTreeWidgetItem *src_item, src_items) { foreach(QTreeWidgetItem *src_item, src_items) {
QTreeWidgetItem *parent_folder = src_item->parent(); QTreeWidgetItem *parent_folder = src_item->parent();
if(parent_folder && !folders_altered.contains(parent_folder)) if(parent_folder && !folders_altered.contains(parent_folder))

View File

@@ -200,19 +200,14 @@ void HttpConnection::respondCommand(QString command)
if(command == "upload") if(command == "upload")
{ {
QByteArray torrentfile = parser.torrent(); QByteArray torrentfile = parser.torrent();
// Get a unique filename // XXX: Trick to get a unique filename
QString filePath; QString filePath;
QTemporaryFile tmpfile; QTemporaryFile *tmpfile = new QTemporaryFile();
tmpfile.setAutoRemove(false); if (tmpfile->open()) {
if (tmpfile.open()) { filePath = tmpfile->fileName();
filePath = tmpfile.fileName();
} else {
std::cerr << "I/O Error: Could not create temporary file" << std::endl;
return;
} }
tmpfile.close(); delete tmpfile;
// Now temporary file is created but closed so that it can be used. // write it to HD
// write torrent to temporary file
QFile torrent(filePath); QFile torrent(filePath);
if(torrent.open(QIODevice::WriteOnly)) { if(torrent.open(QIODevice::WriteOnly)) {
torrent.write(torrentfile); torrent.write(torrentfile);

View File

@@ -1,6 +1,8 @@
<!DOCTYPE RCC><RCC version="1.0"> <!DOCTYPE RCC><RCC version="1.0">
<qresource> <qresource>
<file>Icons/gnome-shutdown.png</file>
<file>Icons/rss32.png</file> <file>Icons/rss32.png</file>
<file>Icons/money.png</file>
<file>Icons/sphere2.png</file> <file>Icons/sphere2.png</file>
<file>Icons/downarrow.png</file> <file>Icons/downarrow.png</file>
<file>Icons/url.png</file> <file>Icons/url.png</file>
@@ -27,6 +29,7 @@
<file>Icons/skin/open.png</file> <file>Icons/skin/open.png</file>
<file>Icons/skin/qbittorrent16.png</file> <file>Icons/skin/qbittorrent16.png</file>
<file>Icons/skin/downloading.png</file> <file>Icons/skin/downloading.png</file>
<file>Icons/skin/search.png</file>
<file>Icons/skin/pause_all.png</file> <file>Icons/skin/pause_all.png</file>
<file>Icons/skin/play_all.png</file> <file>Icons/skin/play_all.png</file>
<file>Icons/skin/pause.png</file> <file>Icons/skin/pause.png</file>
@@ -70,9 +73,7 @@
<file>Icons/flags/japan.png</file> <file>Icons/flags/japan.png</file>
<file>Icons/oxygen/view-refresh.png</file> <file>Icons/oxygen/view-refresh.png</file>
<file>Icons/oxygen/file.png</file> <file>Icons/oxygen/file.png</file>
<file>Icons/oxygen/mail-folder-inbox.png</file>
<file>Icons/oxygen/time.png</file> <file>Icons/oxygen/time.png</file>
<file>Icons/oxygen/edit-find.png</file>
<file>Icons/oxygen/folder-new.png</file> <file>Icons/oxygen/folder-new.png</file>
<file>Icons/oxygen/edit-paste.png</file> <file>Icons/oxygen/edit-paste.png</file>
<file>Icons/oxygen/proxy.png</file> <file>Icons/oxygen/proxy.png</file>
@@ -93,15 +94,13 @@
<file>Icons/oxygen/edit-copy.png</file> <file>Icons/oxygen/edit-copy.png</file>
<file>Icons/oxygen/bt_settings.png</file> <file>Icons/oxygen/bt_settings.png</file>
<file>Icons/oxygen/document-new.png</file> <file>Icons/oxygen/document-new.png</file>
<file>Icons/oxygen/preferences-desktop.png</file>
<file>Icons/oxygen/tab-close.png</file>
<file>Icons/oxygen/wallet.png</file>
<file>Icons/oxygen/webui.png</file> <file>Icons/oxygen/webui.png</file>
<file>Icons/oxygen/list-remove.png</file> <file>Icons/oxygen/list-remove.png</file>
<file>Icons/oxygen/connection.png</file> <file>Icons/oxygen/connection.png</file>
<file>Icons/oxygen/bug.png</file> <file>Icons/oxygen/bug.png</file>
<file>Icons/oxygen/list-add.png</file> <file>Icons/oxygen/list-add.png</file>
<file>Icons/oxygen/folder.png</file> <file>Icons/oxygen/folder.png</file>
<file>Icons/oxygen/configure.png</file>
<file>Icons/oxygen/edit-cut.png</file> <file>Icons/oxygen/edit-cut.png</file>
<file>Icons/oxygen/unsubscribe.png</file> <file>Icons/oxygen/unsubscribe.png</file>
<file>Icons/oxygen/subscribe16.png</file> <file>Icons/oxygen/subscribe16.png</file>

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More