Compare commits
37 Commits
release-1.
...
release-1.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
943e863be0 | ||
![]() |
518a120c07 | ||
![]() |
290bc8b7a6 | ||
![]() |
0ede09efb5 | ||
![]() |
15de12f6dd | ||
![]() |
ef95d6df81 | ||
![]() |
f382ba4fd0 | ||
![]() |
01d504d992 | ||
![]() |
cdd894a6a1 | ||
![]() |
d7b2d3497f | ||
![]() |
5dbd5c4326 | ||
![]() |
9a14c4c599 | ||
![]() |
3fa14cd47f | ||
![]() |
941d9b9bd9 | ||
![]() |
3d88b7b05c | ||
![]() |
8d39e2a776 | ||
![]() |
4a1c8a7279 | ||
![]() |
b8d8862562 | ||
![]() |
40e9105ee5 | ||
![]() |
0984b8b8e1 | ||
![]() |
3dd7dcc58f | ||
![]() |
6ba5df3ec8 | ||
![]() |
1560b4ca3b | ||
![]() |
68d8a9ed47 | ||
![]() |
ca00f3084d | ||
![]() |
39c16b20ae | ||
![]() |
666d4622b9 | ||
![]() |
27388643b1 | ||
![]() |
90d17d16a4 | ||
![]() |
df0f01cd71 | ||
![]() |
480d00d747 | ||
![]() |
a0923741a4 | ||
![]() |
8e2efc2950 | ||
![]() |
91dee6058e | ||
![]() |
f5c1343722 | ||
![]() |
d4d0a08390 | ||
![]() |
d02aca7323 |
@@ -1,5 +1,6 @@
|
||||
* Unknown - Christophe Dumez <chris@qbittorrent.org> - v1.5.0
|
||||
- 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: Implemented a RSS feed downloader with filter support
|
||||
- FEATURE: Save old RSS item to hard disk to remember them on start up
|
||||
@@ -7,8 +8,12 @@
|
||||
- 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 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: A random listening port can be chosen automatically
|
||||
- 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
|
||||
|
||||
* Sun Aug 21 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.4.1
|
||||
|
@@ -38,6 +38,7 @@
|
||||
#include <QFile>
|
||||
#include <QSettings>
|
||||
#include <QStandardItemModel>
|
||||
#include <QSortFilterProxyModel>
|
||||
#include <QHeaderView>
|
||||
#include <QMenu>
|
||||
#include <QMessageBox>
|
||||
@@ -54,9 +55,16 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
|
||||
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_RATIO, Qt::Horizontal, tr("Ratio"));
|
||||
finishedList->setModel(finishedListModel);
|
||||
|
||||
proxyModel = new QSortFilterProxyModel();
|
||||
proxyModel->setDynamicSortFilter(true);
|
||||
proxyModel->setSourceModel(finishedListModel);
|
||||
finishedList->setModel(proxyModel);
|
||||
|
||||
finishedList->setRootIsDecorated(false);
|
||||
finishedList->setAllColumnsShowFocus(true);
|
||||
finishedList->setSortingEnabled(true);
|
||||
|
||||
loadHiddenColumns();
|
||||
// Hide hash column
|
||||
finishedList->hideColumn(F_HASH);
|
||||
@@ -104,9 +112,11 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
|
||||
}
|
||||
|
||||
FinishedTorrents::~FinishedTorrents(){
|
||||
saveLastSortedColumn();
|
||||
saveColWidthFinishedList();
|
||||
saveHiddenColumns();
|
||||
delete finishedListDelegate;
|
||||
delete proxyModel;
|
||||
delete finishedListModel;
|
||||
}
|
||||
|
||||
@@ -141,8 +151,8 @@ void FinishedTorrents::addTorrent(QString hash){
|
||||
// Update the number of finished torrents
|
||||
++nbFinished;
|
||||
emit finishedTorrentsNumberChanged(nbFinished);
|
||||
// Sort List
|
||||
sortFinishedList();
|
||||
|
||||
loadLastSortedColumn();
|
||||
}
|
||||
|
||||
// Set the color of a row in data model
|
||||
@@ -159,7 +169,7 @@ QStringList FinishedTorrents::getSelectedTorrents(bool only_one) const{
|
||||
foreach(const QModelIndex &index, selectedIndexes) {
|
||||
if(index.column() == F_NAME) {
|
||||
// Get the file hash
|
||||
QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
||||
QString hash = getHashFromRow(index.row());
|
||||
res << hash;
|
||||
if(only_one) break;
|
||||
}
|
||||
@@ -208,6 +218,18 @@ bool FinishedTorrents::loadColWidthFinishedList(){
|
||||
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() {
|
||||
// Loading last sorted column
|
||||
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||
@@ -220,7 +242,7 @@ void FinishedTorrents::loadLastSortedColumn() {
|
||||
sortOrder = Qt::AscendingOrder;
|
||||
sortedCol = sortedCol.left(sortedCol.size()-1);
|
||||
int index = sortedCol.toInt();
|
||||
sortFinishedList(index, sortOrder);
|
||||
finishedList->sortByColumn(index, sortOrder);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -265,7 +287,7 @@ void FinishedTorrents::on_actionSet_upload_limit_triggered(){
|
||||
foreach(const QModelIndex &index, selectedIndexes){
|
||||
if(index.column() == F_NAME){
|
||||
// Get the file hash
|
||||
hashes << finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
||||
hashes << getHashFromRow(index.row());
|
||||
}
|
||||
}
|
||||
new BandwidthAllocationDialog(this, true, BTSession, hashes);
|
||||
@@ -351,8 +373,8 @@ void FinishedTorrents::pauseTorrent(QString hash) {
|
||||
}
|
||||
|
||||
QString FinishedTorrents::getHashFromRow(unsigned int row) const {
|
||||
Q_ASSERT(row < (unsigned int)finishedListModel->rowCount());
|
||||
return finishedListModel->data(finishedListModel->index(row, F_HASH)).toString();
|
||||
Q_ASSERT(row < (unsigned int)proxyModel->rowCount());
|
||||
return proxyModel->data(proxyModel->index(row, F_HASH)).toString();
|
||||
}
|
||||
|
||||
// Will move it to download tab
|
||||
@@ -369,7 +391,7 @@ void FinishedTorrents::deleteTorrent(QString hash){
|
||||
|
||||
// Show torrent properties dialog
|
||||
void FinishedTorrents::showProperties(const QModelIndex &index){
|
||||
showPropertiesFromHash(finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString());
|
||||
showPropertiesFromHash(getHashFromRow(index.row()));
|
||||
}
|
||||
|
||||
void FinishedTorrents::showPropertiesFromHash(QString hash){
|
||||
@@ -400,7 +422,7 @@ void FinishedTorrents::forceRecheck(){
|
||||
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
||||
foreach(const QModelIndex &index, selectedIndexes){
|
||||
if(index.column() == F_NAME){
|
||||
QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
||||
QString hash = getHashFromRow(index.row());
|
||||
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
||||
qDebug("Forcing recheck for torrent %s", hash.toLocal8Bit().data());
|
||||
h.force_recheck();
|
||||
@@ -416,7 +438,7 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint&){
|
||||
foreach(const QModelIndex &index, selectedIndexes) {
|
||||
if(index.column() == F_NAME) {
|
||||
// Get the file name
|
||||
QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
||||
QString hash = getHashFromRow(index.row());
|
||||
// Get handle and pause the torrent
|
||||
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
||||
if(!h.is_valid()) continue;
|
||||
@@ -462,7 +484,7 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint&){
|
||||
*/
|
||||
|
||||
// hide/show columns menu
|
||||
void FinishedTorrents::displayFinishedHoSMenu(const QPoint& pos){
|
||||
void FinishedTorrents::displayFinishedHoSMenu(const QPoint&){
|
||||
QMenu hideshowColumn(this);
|
||||
hideshowColumn.setTitle(tr("Hide or Show Column"));
|
||||
int lastCol = F_RATIO;
|
||||
@@ -470,7 +492,7 @@ void FinishedTorrents::displayFinishedHoSMenu(const QPoint& pos){
|
||||
hideshowColumn.addAction(getActionHoSCol(i));
|
||||
}
|
||||
// Call menu
|
||||
hideshowColumn.exec(mapToGlobal(pos)+QPoint(10,34));
|
||||
hideshowColumn.exec(QCursor::pos());
|
||||
}
|
||||
|
||||
// toggle hide/show a column
|
||||
@@ -603,97 +625,3 @@ QAction* FinishedTorrents::getActionHoSCol(int index) {
|
||||
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);
|
||||
}
|
||||
|
@@ -35,6 +35,7 @@
|
||||
#include "qtorrenthandle.h"
|
||||
|
||||
class QStandardItemModel;
|
||||
class QSortFilterProxyModel;
|
||||
class bittorrent;
|
||||
class FinishedListDelegate;
|
||||
|
||||
@@ -47,6 +48,7 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
|
||||
bittorrent *BTSession;
|
||||
FinishedListDelegate *finishedListDelegate;
|
||||
QStandardItemModel *finishedListModel;
|
||||
QSortFilterProxyModel *proxyModel;
|
||||
unsigned int nbFinished;
|
||||
void hideOrShowColumn(int index);
|
||||
bool loadHiddenColumns();
|
||||
@@ -69,10 +71,6 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
|
||||
void displayFinishedHoSMenu(const QPoint&);
|
||||
void setRowColor(int row, QString color);
|
||||
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 on_actionSet_upload_limit_triggered();
|
||||
void notifyTorrentDoubleClicked(const QModelIndex& index);
|
||||
@@ -93,6 +91,7 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
|
||||
void deleteTorrent(QString hash);
|
||||
void showPropertiesFromHash(QString hash);
|
||||
void loadLastSortedColumn();
|
||||
void saveLastSortedColumn();
|
||||
void updateMetadata(QTorrentHandle &h);
|
||||
|
||||
signals:
|
||||
|
@@ -163,7 +163,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
|
||||
// Search engine tab
|
||||
searchEngine = new SearchEngine(BTSession, myTrayIcon, systrayIntegration);
|
||||
tabs->addTab(searchEngine, tr("Search"));
|
||||
tabs->setTabIcon(2, QIcon(QString::fromUtf8(":/Icons/skin/search.png")));
|
||||
tabs->setTabIcon(2, QIcon(QString::fromUtf8(":/Icons/oxygen/edit-find.png")));
|
||||
readSettings();
|
||||
// RSS Tab
|
||||
rssWidget = 0;
|
||||
@@ -1027,7 +1027,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
|
||||
// Connection
|
||||
// * Ports binding
|
||||
unsigned short old_listenPort = BTSession->getListenPort();
|
||||
BTSession->setListeningPortsRange(options->getPorts());
|
||||
BTSession->setListeningPort(options->getPort());
|
||||
unsigned short new_listenPort = BTSession->getListenPort();
|
||||
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)));
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 813 B |
Before Width: | Height: | Size: 2.1 KiB |
BIN
src/Icons/oxygen/edit-find.png
Normal file
After Width: | Height: | Size: 627 B |
BIN
src/Icons/oxygen/mail-folder-inbox.png
Normal file
After Width: | Height: | Size: 739 B |
BIN
src/Icons/oxygen/preferences-desktop.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
src/Icons/oxygen/tab-close.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
src/Icons/oxygen/wallet.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB |
@@ -1084,7 +1084,8 @@ void bittorrent::disableDirectoryScanning() {
|
||||
|
||||
// Set the ports range in which is chosen the port the bittorrent
|
||||
// session will listen to
|
||||
void bittorrent::setListeningPortsRange(std::pair<unsigned short, unsigned short> ports) {
|
||||
void bittorrent::setListeningPort(int port) {
|
||||
std::pair<int,int> ports(port, port);
|
||||
s->listen_on(ports);
|
||||
}
|
||||
|
||||
|
@@ -141,7 +141,7 @@ class bittorrent : public QObject {
|
||||
void decreaseDlTorrentPriority(QString hash);
|
||||
void downloadUrlAndSkipDialog(QString url, QString save_path=QString::null);
|
||||
// Session configuration - Setters
|
||||
void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports);
|
||||
void setListeningPort(int port);
|
||||
void setMaxConnections(int maxConnec);
|
||||
void setMaxConnectionsPerTorrent(int max);
|
||||
void setMaxUploadsPerTorrent(int max);
|
||||
|
@@ -142,7 +142,7 @@
|
||||
<action name="actionBuy_it">
|
||||
<property name="icon">
|
||||
<iconset resource="icons.qrc">
|
||||
<normaloff>:/Icons/money.png</normaloff>:/Icons/money.png</iconset>
|
||||
<normaloff>:/Icons/oxygen/wallet.png</normaloff>:/Icons/oxygen/wallet.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Buy it</string>
|
||||
|
@@ -77,13 +77,20 @@ subDownloadThread::~subDownloadThread(){
|
||||
}
|
||||
|
||||
void subDownloadThread::run(){
|
||||
// XXX: Trick to get a unique filename
|
||||
// Get a unique filename
|
||||
QString filePath;
|
||||
QTemporaryFile *tmpfile = new QTemporaryFile();
|
||||
if (tmpfile->open()) {
|
||||
filePath = tmpfile->fileName();
|
||||
QTemporaryFile tmpfile;
|
||||
tmpfile.setAutoRemove(false);
|
||||
if (tmpfile.open()) {
|
||||
filePath = tmpfile.fileName();
|
||||
qDebug("Temporary filename is: %s", filePath.toLocal8Bit().data());
|
||||
} else {
|
||||
emit downloadFailureST(this, url, tr("I/O Error"));
|
||||
return;
|
||||
}
|
||||
delete tmpfile;
|
||||
tmpfile.close();
|
||||
// Now temporary file is created but closed so that
|
||||
// curl can use it
|
||||
FILE *f = fopen(filePath.toLocal8Bit().data(), "wb");
|
||||
if(!f) {
|
||||
std::cerr << "couldn't open destination file" << "\n";
|
||||
|
@@ -37,6 +37,7 @@
|
||||
class QStandardItemModel;
|
||||
class bittorrent;
|
||||
class DLListDelegate;
|
||||
class QSortFilterProxyModel;
|
||||
|
||||
using namespace libtorrent;
|
||||
|
||||
@@ -47,6 +48,7 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
|
||||
bittorrent *BTSession;
|
||||
DLListDelegate *DLDelegate;
|
||||
QStandardItemModel *DLListModel;
|
||||
QSortFilterProxyModel *proxyModel;
|
||||
unsigned int nbTorrents;
|
||||
void hideOrShowColumn(int index);
|
||||
bool loadHiddenColumns();
|
||||
@@ -74,10 +76,6 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
|
||||
void on_actionSet_upload_limit_triggered();
|
||||
void displayDLListMenu(const QPoint& pos);
|
||||
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 setRowColor(int row, QColor color);
|
||||
void showProperties(const QModelIndex &index);
|
||||
@@ -100,7 +98,7 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
|
||||
void updateFileSizeAndProgress(QString hash);
|
||||
void showPropertiesFromHash(QString hash);
|
||||
void hidePriorityColumn(bool hide);
|
||||
void sortProgressColumn(QTorrentHandle& h);
|
||||
void saveLastSortedColumn();
|
||||
void loadLastSortedColumn();
|
||||
void addTorrent(QString hash);
|
||||
void updateMetadata(QTorrentHandle &h);
|
||||
|
@@ -32,6 +32,7 @@
|
||||
#define ENGINE_SELECT_DLG_H
|
||||
|
||||
#include "ui_engineSelect.h"
|
||||
#include "supportedEngines.h"
|
||||
|
||||
class downloadThread;
|
||||
class QDropEvent;
|
||||
@@ -40,12 +41,11 @@ class engineSelectDlg : public QDialog, public Ui::engineSelect{
|
||||
Q_OBJECT
|
||||
|
||||
private:
|
||||
// Search related
|
||||
QHash<QString, bool> installed_engines;
|
||||
downloadThread *downloader;
|
||||
SupportedEngines *supported_engines;
|
||||
|
||||
public:
|
||||
engineSelectDlg(QWidget *parent);
|
||||
engineSelectDlg(QWidget *parent, SupportedEngines *supported_engines);
|
||||
~engineSelectDlg();
|
||||
QList<QTreeWidgetItem*> findItemsWithUrl(QString url);
|
||||
QTreeWidgetItem* findItemWithID(QString id);
|
||||
@@ -53,15 +53,14 @@ class engineSelectDlg : public QDialog, public Ui::engineSelect{
|
||||
protected:
|
||||
bool parseVersionsFile(QString versions_file, QString updateServer);
|
||||
bool isUpdateNeeded(QString plugin_name, float new_version) const;
|
||||
bool checkInstalled(QString plugin_name) const;
|
||||
|
||||
signals:
|
||||
void enginesChanged();
|
||||
|
||||
protected slots:
|
||||
void saveSettings();
|
||||
void on_closeButton_clicked();
|
||||
void loadSupportedSearchEngines(bool first=false);
|
||||
void loadSupportedSearchEngines();
|
||||
void addNewEngine(QString engine_name);
|
||||
void toggleEngineState(QTreeWidgetItem*, int);
|
||||
void setRowColor(int row, QString color);
|
||||
void processDownloadedFile(QString url, QString filePath);
|
||||
|
@@ -18,6 +18,7 @@ private:
|
||||
QHash<QTreeWidgetItem*, RssFile*> mapping;
|
||||
QHash<QString, QTreeWidgetItem*> feeds_items;
|
||||
QTreeWidgetItem* current_feed;
|
||||
QTreeWidgetItem *unread_item;
|
||||
|
||||
public:
|
||||
FeedList(QWidget *parent, RssManager *rssmanager): QTreeWidget(parent), rssmanager(rssmanager) {
|
||||
@@ -28,14 +29,17 @@ public:
|
||||
QTreeWidgetItem *___qtreewidgetitem = headerItem();
|
||||
___qtreewidgetitem->setText(0, QApplication::translate("RSS", "RSS feeds", 0, QApplication::UnicodeUTF8));
|
||||
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) {
|
||||
mapping[item] = file;
|
||||
if(file->getType() == RssFile::STREAM) {
|
||||
feeds_items[file->getID()] = item;
|
||||
if(topLevelItemCount() == 1)
|
||||
setCurrentItem(item);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,15 +49,19 @@ public:
|
||||
feeds_items.remove(file->getID());
|
||||
}
|
||||
|
||||
bool hasFeed(QString url) {
|
||||
bool hasFeed(QString url) const {
|
||||
return feeds_items.contains(QUrl(url).toString());
|
||||
}
|
||||
|
||||
QList<QTreeWidgetItem*> getAllFeedItems() {
|
||||
QList<QTreeWidgetItem*> getAllFeedItems() const {
|
||||
return feeds_items.values();
|
||||
}
|
||||
|
||||
QStringList getItemPath(QTreeWidgetItem* item) {
|
||||
QTreeWidgetItem* getUnreadItem() const {
|
||||
return unread_item;
|
||||
}
|
||||
|
||||
QStringList getItemPath(QTreeWidgetItem* item) const {
|
||||
QStringList path;
|
||||
if(item) {
|
||||
if(item->parent())
|
||||
@@ -63,7 +71,7 @@ public:
|
||||
return path;
|
||||
}
|
||||
|
||||
QList<QTreeWidgetItem*> getAllOpenFolders(QTreeWidgetItem *parent=0) {
|
||||
QList<QTreeWidgetItem*> getAllOpenFolders(QTreeWidgetItem *parent=0) const {
|
||||
QList<QTreeWidgetItem*> open_folders;
|
||||
int nbChildren;
|
||||
if(parent)
|
||||
@@ -102,19 +110,15 @@ public:
|
||||
return feeds;
|
||||
}
|
||||
|
||||
RssFile* getRSSItem(QTreeWidgetItem *item) {
|
||||
RssFile* getRSSItem(QTreeWidgetItem *item) const {
|
||||
return mapping[item];
|
||||
}
|
||||
|
||||
RssFile* getCurrentRSSItem() {
|
||||
return mapping[current_feed];
|
||||
}
|
||||
|
||||
RssFile::FileType getItemType(QTreeWidgetItem *item) {
|
||||
RssFile::FileType getItemType(QTreeWidgetItem *item) const {
|
||||
return mapping[item]->getType();
|
||||
}
|
||||
|
||||
QString getItemID(QTreeWidgetItem *item) {
|
||||
QString getItemID(QTreeWidgetItem *item) const {
|
||||
return mapping[item]->getID();
|
||||
}
|
||||
|
||||
@@ -122,6 +126,10 @@ public:
|
||||
return feeds_items[url];
|
||||
}
|
||||
|
||||
RssStream* getRSSItemFromUrl(QString url) const {
|
||||
return (RssStream*)getRSSItem(getTreeItemFromUrl(url));
|
||||
}
|
||||
|
||||
QTreeWidgetItem* currentItem() const {
|
||||
return current_feed;
|
||||
}
|
||||
@@ -132,20 +140,29 @@ public:
|
||||
|
||||
signals:
|
||||
void foldersAltered(QList<QTreeWidgetItem*> folders);
|
||||
void overwriteAttempt(QString filename);
|
||||
|
||||
protected slots:
|
||||
void updateCurrentFeed(QTreeWidgetItem* new_item) {
|
||||
if(getItemType(new_item) == RssFile::STREAM)
|
||||
if((new_item && getItemType(new_item) == RssFile::STREAM) || new_item == unread_item)
|
||||
current_feed = new_item;
|
||||
}
|
||||
|
||||
protected:
|
||||
void dragMoveEvent(QDragMoveEvent * event) {
|
||||
QTreeWidgetItem *item = itemAt(event->pos());
|
||||
if(item && getItemType(item) != RssFile::FOLDER)
|
||||
if(item == unread_item) {
|
||||
event->ignore();
|
||||
else {
|
||||
QTreeWidget::dragMoveEvent(event);
|
||||
} else {
|
||||
if(item && getItemType(item) != RssFile::FOLDER)
|
||||
event->ignore();
|
||||
else {
|
||||
if(selectedItems().contains(unread_item)) {
|
||||
event->ignore();
|
||||
} else {
|
||||
QTreeWidget::dragMoveEvent(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,6 +178,15 @@ protected:
|
||||
dest_folder = rssmanager;
|
||||
}
|
||||
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) {
|
||||
QTreeWidgetItem *parent_folder = src_item->parent();
|
||||
if(parent_folder && !folders_altered.contains(parent_folder))
|
||||
|
@@ -200,14 +200,19 @@ void HttpConnection::respondCommand(QString command)
|
||||
if(command == "upload")
|
||||
{
|
||||
QByteArray torrentfile = parser.torrent();
|
||||
// XXX: Trick to get a unique filename
|
||||
// Get a unique filename
|
||||
QString filePath;
|
||||
QTemporaryFile *tmpfile = new QTemporaryFile();
|
||||
if (tmpfile->open()) {
|
||||
filePath = tmpfile->fileName();
|
||||
QTemporaryFile tmpfile;
|
||||
tmpfile.setAutoRemove(false);
|
||||
if (tmpfile.open()) {
|
||||
filePath = tmpfile.fileName();
|
||||
} else {
|
||||
std::cerr << "I/O Error: Could not create temporary file" << std::endl;
|
||||
return;
|
||||
}
|
||||
delete tmpfile;
|
||||
// write it to HD
|
||||
tmpfile.close();
|
||||
// Now temporary file is created but closed so that it can be used.
|
||||
// write torrent to temporary file
|
||||
QFile torrent(filePath);
|
||||
if(torrent.open(QIODevice::WriteOnly)) {
|
||||
torrent.write(torrentfile);
|
||||
|
@@ -1,8 +1,6 @@
|
||||
<!DOCTYPE RCC><RCC version="1.0">
|
||||
<qresource>
|
||||
<file>Icons/gnome-shutdown.png</file>
|
||||
<file>Icons/rss32.png</file>
|
||||
<file>Icons/money.png</file>
|
||||
<file>Icons/sphere2.png</file>
|
||||
<file>Icons/downarrow.png</file>
|
||||
<file>Icons/url.png</file>
|
||||
@@ -29,7 +27,6 @@
|
||||
<file>Icons/skin/open.png</file>
|
||||
<file>Icons/skin/qbittorrent16.png</file>
|
||||
<file>Icons/skin/downloading.png</file>
|
||||
<file>Icons/skin/search.png</file>
|
||||
<file>Icons/skin/pause_all.png</file>
|
||||
<file>Icons/skin/play_all.png</file>
|
||||
<file>Icons/skin/pause.png</file>
|
||||
@@ -73,7 +70,9 @@
|
||||
<file>Icons/flags/japan.png</file>
|
||||
<file>Icons/oxygen/view-refresh.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/edit-find.png</file>
|
||||
<file>Icons/oxygen/folder-new.png</file>
|
||||
<file>Icons/oxygen/edit-paste.png</file>
|
||||
<file>Icons/oxygen/proxy.png</file>
|
||||
@@ -94,13 +93,15 @@
|
||||
<file>Icons/oxygen/edit-copy.png</file>
|
||||
<file>Icons/oxygen/bt_settings.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/list-remove.png</file>
|
||||
<file>Icons/oxygen/connection.png</file>
|
||||
<file>Icons/oxygen/bug.png</file>
|
||||
<file>Icons/oxygen/list-add.png</file>
|
||||
<file>Icons/oxygen/folder.png</file>
|
||||
<file>Icons/oxygen/configure.png</file>
|
||||
<file>Icons/oxygen/edit-cut.png</file>
|
||||
<file>Icons/oxygen/unsubscribe.png</file>
|
||||
<file>Icons/oxygen/subscribe16.png</file>
|
||||
|