- Queued torrents are now identified in Web UI

- Improved transfer list update for queued torrents
- Allow to show/hide top toolbar
- top toolbar is now hidden as a default
- Connection status is now displayed in status bar (bottom)
- Removed "Disconnected" connection status (bad detection)
- Added increase/decrease priority actions to Edit menu
- Added keyboard shortcuts for increase/decrease priority actions
This commit is contained in:
Christophe Dumez 2008-08-08 13:17:26 +00:00
parent c7a289d183
commit ff26ea94f5
23 changed files with 159 additions and 100 deletions

View file

@ -4,8 +4,11 @@
- FEATURE: The number of DHT nodes is displayed - FEATURE: The number of DHT nodes is displayed
- FEATURE: RSS can now be disabled from program preferences - FEATURE: RSS can now be disabled from program preferences
- BUGFIX: Disable ETA calculation when ETA column is hidden - BUGFIX: Disable ETA calculation when ETA column is hidden
- COSMETIC: Transfer speed, ratio and DHT nodes are displayed in status bar - BUGFIX: Removed "disconnected" connection state, detection was far from perfect
- COSMETIC: Transfer speed, ratio, connection status and DHT nodes are displayed in status bar
- COSMETIC: RSS Tab is now hidden as a default - COSMETIC: RSS Tab is now hidden as a default
- COSMETIC: Allow to hide or display top toolbar
- COSMETIC: Top toolbar is now hidden as a default
* Fri Aug 01 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.1.0 * Fri Aug 01 2008 - Christophe Dumez <chris@qbittorrent.org> - v1.1.0
- FEATURE: Web interface to control qbittorrent (Ishan Arora) - FEATURE: Web interface to control qbittorrent (Ishan Arora)

46
TODO
View file

@ -1,46 +1,4 @@
// Easy See https://blueprints.launchpad.net/qbittorrent/
- Translations into as many languages as possible
- Use Launchpad/Rosetta for translations once it supports TS files
// Intermediate
- Port on MacOS, Windows (and create an installer for Windows) - Slow progress
- Add some transparency (menus,...), improve look / usabilty
- Skins support? (contact Mateusz)
// Harder
- Torrent scheduler ala µtorrent/Bitcomet
// Waiting for libtorrent
- Allow to prioritize torrents (may code this in qBittorrent?)
// Unsure
- Display the peers we are connected to for each torrent with infos (like flag, dl/up speeds, ...)
- Azureus spoofing to prevent ban from trackers?
- Option to shutdown computer when downloads are finished
- NAT checker/Tester
- Display hard drive space left?
- Make use of dbus on Linux for the single instance instead of socket communication?
(http://techbase.kde.org/Development/Tutorials/D-Bus/Accessing_Interfaces)
- When favicon can't be downloaded, try to parse the webpage for:
<link rel="icon" href="http://example.com/favicon.ico" type="image/vnd.microsoft.icon">
* Be careful, the link can be relative
- Improve search plugin install (choose in a list taken from plugins.qbittorrent.org)
- support zipped torrents? (useful?)
- Allow to limit the number of downloading torrents simultaneously (other are paused until a download finishes)
// in v1.2.0 // in v1.2.0
- Allow user to organize the downloads into categories/folders? - Split download and uploads in Web UI (Ishan Ahora)
// in v1.1.0
- Stop calculating ETAs when ETA column is hidden
-> See https://blueprints.launchpad.net/qbittorrent
Translations updated:
- French
- Chinese
- Polish
- Portuguese
- Brazilian
- Slovak
- Swedish
- Romanian

View file

@ -64,8 +64,8 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
connect(finishedList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedListMenu(const QPoint&))); connect(finishedList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedListMenu(const QPoint&)));
finishedList->header()->setContextMenuPolicy(Qt::CustomContextMenu); finishedList->header()->setContextMenuPolicy(Qt::CustomContextMenu);
connect(finishedList->header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedHoSMenu(const QPoint&))); connect(finishedList->header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedHoSMenu(const QPoint&)));
connect(finishedList, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(notifyTorrentDoubleClicked(const QModelIndex&))); connect(finishedList, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(notifyTorrentDoubleClicked(const QModelIndex&)));
connect(BTSession, SIGNAL(forceFinishedListUpdate()), this, SLOT(updateFinishedList()));
actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png"))); actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png")));
actionPreview_file->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/preview.png"))); actionPreview_file->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/preview.png")));
actionDelete_Permanently->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.png"))); actionDelete_Permanently->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.png")));
@ -74,6 +74,8 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
connect(actionPause, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPause_triggered())); connect(actionPause, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPause_triggered()));
connect(actionStart, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionStart_triggered())); connect(actionStart, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionStart_triggered()));
connect(actionDelete, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_triggered())); connect(actionDelete, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_triggered()));
connect(actionIncreasePriority, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionIncreasePriority_triggered()));
connect(actionDecreasePriority, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDecreasePriority_triggered()));
connect(actionPreview_file, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPreview_file_triggered())); connect(actionPreview_file, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPreview_file_triggered()));
connect(actionDelete_Permanently, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_Permanently_triggered())); connect(actionDelete_Permanently, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_Permanently_triggered()));
connect(actionOpen_destination_folder, SIGNAL(triggered()), (GUI*)parent, SLOT(openDestinationFolder())); connect(actionOpen_destination_folder, SIGNAL(triggered()), (GUI*)parent, SLOT(openDestinationFolder()));
@ -407,6 +409,11 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){
myFinishedListMenu.addSeparator(); myFinishedListMenu.addSeparator();
myFinishedListMenu.addAction(actionOpen_destination_folder); myFinishedListMenu.addAction(actionOpen_destination_folder);
myFinishedListMenu.addAction(actionTorrent_Properties); myFinishedListMenu.addAction(actionTorrent_Properties);
if(BTSession->isQueueingEnabled()) {
myFinishedListMenu.addSeparator();
myFinishedListMenu.addAction(actionIncreasePriority);
myFinishedListMenu.addAction(actionDecreasePriority);
}
myFinishedListMenu.addSeparator(); myFinishedListMenu.addSeparator();
myFinishedListMenu.addAction(actionBuy_it); myFinishedListMenu.addAction(actionBuy_it);

View file

@ -109,13 +109,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
actionSet_global_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))); actionSet_global_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png")));
actionSet_global_download_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))); actionSet_global_download_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/downloading.png")));
actionDocumentation->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/qb_question.png"))); actionDocumentation->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/qb_question.png")));
connecStatusLblIcon = new QLabel();
connecStatusLblIcon->setFrameShape(QFrame::NoFrame);
connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/disconnected.png")));
connecStatusLblIcon->setToolTip(QString::fromUtf8("<b>")+tr("Connection status:")+QString::fromUtf8("</b><br>")+tr("Offline")+QString::fromUtf8("<br><i>")+tr("No peers found...")+QString::fromUtf8("</i>"));
toolBar->addWidget(connecStatusLblIcon);
prioSeparator = toolBar->insertSeparator(actionDecreasePriority); prioSeparator = toolBar->insertSeparator(actionDecreasePriority);
prioSeparator2 = menu_Edit->insertSeparator(actionDecreasePriority);
prioSeparator->setVisible(false); prioSeparator->setVisible(false);
prioSeparator2->setVisible(false);
actionDelete_Permanently->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.png"))); actionDelete_Permanently->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.png")));
actionTorrent_Properties->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/properties.png"))); actionTorrent_Properties->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/properties.png")));
actionCreate_torrent->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/new.png"))); actionCreate_torrent->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/new.png")));
@ -209,6 +206,10 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
show(); show();
} }
createKeyboardShortcuts(); createKeyboardShortcuts();
connecStatusLblIcon = new QLabel();
connecStatusLblIcon->setFrameShape(QFrame::NoFrame);
connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/firewalled.png")));
connecStatusLblIcon->setToolTip(QString::fromUtf8("<b>")+tr("Connection status:")+QString::fromUtf8("</b><br>")+QString::fromUtf8("<i>")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("</i>"));
dlSpeedLbl = new QLabel(tr("DL: %1 KiB/s").arg("0.0")); dlSpeedLbl = new QLabel(tr("DL: %1 KiB/s").arg("0.0"));
upSpeedLbl = new QLabel(tr("UP: %1 KiB/s").arg("0.0")); upSpeedLbl = new QLabel(tr("UP: %1 KiB/s").arg("0.0"));
ratioLbl = new QLabel(tr("Ratio: %1").arg("1.0")); ratioLbl = new QLabel(tr("Ratio: %1").arg("1.0"));
@ -222,12 +223,17 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis
statusSep3 = new QFrame(); statusSep3 = new QFrame();
statusSep3->setFixedWidth(1); statusSep3->setFixedWidth(1);
statusSep3->setFrameStyle(QFrame::Box); statusSep3->setFrameStyle(QFrame::Box);
statusSep4 = new QFrame();
statusSep4->setFixedWidth(1);
statusSep4->setFrameStyle(QFrame::Box);
QMainWindow::statusBar()->addPermanentWidget(DHTLbl); QMainWindow::statusBar()->addPermanentWidget(DHTLbl);
QMainWindow::statusBar()->addPermanentWidget(statusSep1); QMainWindow::statusBar()->addPermanentWidget(statusSep1);
QMainWindow::statusBar()->addPermanentWidget(dlSpeedLbl); QMainWindow::statusBar()->addPermanentWidget(connecStatusLblIcon);
QMainWindow::statusBar()->addPermanentWidget(statusSep2); QMainWindow::statusBar()->addPermanentWidget(statusSep2);
QMainWindow::statusBar()->addPermanentWidget(upSpeedLbl); QMainWindow::statusBar()->addPermanentWidget(dlSpeedLbl);
QMainWindow::statusBar()->addPermanentWidget(statusSep3); QMainWindow::statusBar()->addPermanentWidget(statusSep3);
QMainWindow::statusBar()->addPermanentWidget(upSpeedLbl);
QMainWindow::statusBar()->addPermanentWidget(statusSep4);
QMainWindow::statusBar()->addPermanentWidget(ratioLbl); QMainWindow::statusBar()->addPermanentWidget(ratioLbl);
qDebug("GUI Built"); qDebug("GUI Built");
} }
@ -242,6 +248,7 @@ GUI::~GUI() {
delete statusSep1; delete statusSep1;
delete statusSep2; delete statusSep2;
delete statusSep3; delete statusSep3;
delete statusSep4;
if(rssWidget != 0) if(rssWidget != 0)
delete rssWidget; delete rssWidget;
delete searchEngine; delete searchEngine;
@ -414,6 +421,8 @@ void GUI::createKeyboardShortcuts() {
actionStart_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+S"))); actionStart_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+S")));
actionPause->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+P"))); actionPause->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+P")));
actionPause_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+P"))); actionPause_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+P")));
actionDecreasePriority->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+-")));
actionIncreasePriority->setShortcut(QKeySequence(QString::fromUtf8("Ctrl++")));
} }
// Keyboard shortcuts slots // Keyboard shortcuts slots
@ -927,6 +936,11 @@ void GUI::configureSession(bool deleteOptions) {
setWindowTitle(tr("qBittorrent %1", "e.g: qBittorrent v0.x").arg(QString::fromUtf8(VERSION))); setWindowTitle(tr("qBittorrent %1", "e.g: qBittorrent v0.x").arg(QString::fromUtf8(VERSION)));
} }
displaySpeedInTitle = new_displaySpeedInTitle; displaySpeedInTitle = new_displaySpeedInTitle;
if(options->isToolbarDisplayed()) {
toolBar->setVisible(true);
} else {
toolBar->setVisible(false);
}
unsigned int new_refreshInterval = options->getRefreshInterval(); unsigned int new_refreshInterval = options->getRefreshInterval();
if(refreshInterval != new_refreshInterval) { if(refreshInterval != new_refreshInterval) {
refreshInterval = new_refreshInterval; refreshInterval = new_refreshInterval;
@ -1125,6 +1139,7 @@ void GUI::configureSession(bool deleteOptions) {
actionDecreasePriority->setVisible(true); actionDecreasePriority->setVisible(true);
actionIncreasePriority->setVisible(true); actionIncreasePriority->setVisible(true);
prioSeparator->setVisible(true); prioSeparator->setVisible(true);
prioSeparator2->setVisible(true);
toolBar->layout()->setSpacing(7); toolBar->layout()->setSpacing(7);
} }
int max_torrents = options->getMaxActiveTorrents(); int max_torrents = options->getMaxActiveTorrents();
@ -1142,6 +1157,7 @@ void GUI::configureSession(bool deleteOptions) {
actionDecreasePriority->setVisible(false); actionDecreasePriority->setVisible(false);
actionIncreasePriority->setVisible(false); actionIncreasePriority->setVisible(false);
prioSeparator->setVisible(false); prioSeparator->setVisible(false);
prioSeparator2->setVisible(false);
toolBar->layout()->setSpacing(7); toolBar->layout()->setSpacing(7);
} }
} }
@ -1464,15 +1480,8 @@ void GUI::checkConnectionStatus() {
connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/connected.png"))); connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/connected.png")));
connecStatusLblIcon->setToolTip(QString::fromUtf8("<b>")+tr("Connection Status:")+QString::fromUtf8("</b><br>")+tr("Online")); connecStatusLblIcon->setToolTip(QString::fromUtf8("<b>")+tr("Connection Status:")+QString::fromUtf8("</b><br>")+tr("Online"));
}else{ }else{
if(sessionStatus.num_peers) { connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/firewalled.png")));
// Firewalled ? connecStatusLblIcon->setToolTip(QString::fromUtf8("<b>")+tr("Connection status:")+QString::fromUtf8("</b><br>")+QString::fromUtf8("<i>")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("</i>"));
connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/firewalled.png")));
connecStatusLblIcon->setToolTip("<b>"+tr("Connection Status:")+QString::fromUtf8("</b><br>")+tr("Firewalled?", "i.e: Behind a firewall/router?")+QString::fromUtf8("<br><i>")+tr("No incoming connections...")+QString::fromUtf8("</i>"));
}else{
// Disconnected
connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/disconnected.png")));
connecStatusLblIcon->setToolTip(QString::fromUtf8("<b>")+tr("Connection status:")+QString::fromUtf8("</b><br>")+tr("Offline")+QString::fromUtf8("<br><i>")+tr("No peers found...")+QString::fromUtf8("</i>"));
}
} }
} }

View file

@ -83,6 +83,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
QFrame *statusSep1; QFrame *statusSep1;
QFrame *statusSep2; QFrame *statusSep2;
QFrame *statusSep3; QFrame *statusSep3;
QFrame *statusSep4;
// Keyboard shortcuts // Keyboard shortcuts
QShortcut *switchSearchShortcut; QShortcut *switchSearchShortcut;
QShortcut *switchSearchShortcut2; QShortcut *switchSearchShortcut2;
@ -90,6 +91,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{
QShortcut *switchUpShortcut; QShortcut *switchUpShortcut;
QShortcut *switchRSSShortcut; QShortcut *switchRSSShortcut;
QAction *prioSeparator; QAction *prioSeparator;
QAction *prioSeparator2;
// Search // Search
SearchEngine *searchEngine; SearchEngine *searchEngine;
// RSS // RSS

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -41,6 +41,8 @@
<addaction name="separator" /> <addaction name="separator" />
<addaction name="actionDelete" /> <addaction name="actionDelete" />
<addaction name="actionDelete_Permanently" /> <addaction name="actionDelete_Permanently" />
<addaction name="actionDecreasePriority" />
<addaction name="actionIncreasePriority" />
</widget> </widget>
<widget class="QMenu" name="menu_Help" > <widget class="QMenu" name="menu_Help" >
<property name="title" > <property name="title" >

View file

@ -464,8 +464,10 @@ void bittorrent::updateUploadQueue() {
} }
} }
} }
if(change) if(change) {
emit updateFinishedTorrentNumber(); emit updateFinishedTorrentNumber();
emit forceFinishedListUpdate();
}
} }
void bittorrent::updateDownloadQueue() { void bittorrent::updateDownloadQueue() {
@ -520,8 +522,10 @@ void bittorrent::updateDownloadQueue() {
} }
} }
} }
if(change) if(change) {
emit updateUnfinishedTorrentNumber(); emit updateUnfinishedTorrentNumber();
emit forceUnfinishedListUpdate();
}
} }
// Calculate the ETA using GASA // Calculate the ETA using GASA

View file

@ -212,6 +212,8 @@ class bittorrent : public QObject{
void UPnPSuccess(QString msg); void UPnPSuccess(QString msg);
void updateFinishedTorrentNumber(); void updateFinishedTorrentNumber();
void updateUnfinishedTorrentNumber(); void updateUnfinishedTorrentNumber();
void forceUnfinishedListUpdate();
void forceFinishedListUpdate();
}; };
#endif #endif

View file

@ -18,7 +18,16 @@
<property name="spacing" > <property name="spacing" >
<number>6</number> <number>6</number>
</property> </property>
<property name="margin" > <property name="leftMargin" >
<number>0</number>
</property>
<property name="topMargin" >
<number>0</number>
</property>
<property name="rightMargin" >
<number>0</number>
</property>
<property name="bottomMargin" >
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
@ -63,14 +72,6 @@
<number>0</number> <number>0</number>
</property> </property>
<widget class="QWidget" name="log_tab" > <widget class="QWidget" name="log_tab" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>765</width>
<height>138</height>
</rect>
</property>
<attribute name="title" > <attribute name="title" >
<string>Log</string> <string>Log</string>
</attribute> </attribute>
@ -78,7 +79,16 @@
<property name="spacing" > <property name="spacing" >
<number>6</number> <number>6</number>
</property> </property>
<property name="margin" > <property name="leftMargin" >
<number>9</number>
</property>
<property name="topMargin" >
<number>9</number>
</property>
<property name="rightMargin" >
<number>9</number>
</property>
<property name="bottomMargin" >
<number>9</number> <number>9</number>
</property> </property>
<item> <item>
@ -103,14 +113,6 @@
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="filter_tab" > <widget class="QWidget" name="filter_tab" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>765</width>
<height>138</height>
</rect>
</property>
<attribute name="title" > <attribute name="title" >
<string>IP filter</string> <string>IP filter</string>
</attribute> </attribute>
@ -118,7 +120,16 @@
<property name="spacing" > <property name="spacing" >
<number>6</number> <number>6</number>
</property> </property>
<property name="margin" > <property name="leftMargin" >
<number>9</number>
</property>
<property name="topMargin" >
<number>9</number>
</property>
<property name="rightMargin" >
<number>9</number>
</property>
<property name="bottomMargin" >
<number>9</number> <number>9</number>
</property> </property>
<item> <item>
@ -183,8 +194,7 @@
</action> </action>
<action name="actionOpen_destination_folder" > <action name="actionOpen_destination_folder" >
<property name="icon" > <property name="icon" >
<iconset resource="icons.qrc" > <iconset resource="icons.qrc" >:/Icons/folder.png</iconset>
<normaloff>:/Icons/folder.png</normaloff>:/Icons/folder.png</iconset>
</property> </property>
<property name="text" > <property name="text" >
<string>Open destination folder</string> <string>Open destination folder</string>
@ -232,8 +242,7 @@
</action> </action>
<action name="actionBuy_it" > <action name="actionBuy_it" >
<property name="icon" > <property name="icon" >
<iconset resource="icons.qrc" > <iconset resource="icons.qrc" >:/Icons/money.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>
@ -244,8 +253,22 @@
<string>Priority</string> <string>Priority</string>
</property> </property>
</action> </action>
<zorder>tabBottom</zorder> <action name="actionIncreasePriority" >
<zorder></zorder> <property name="icon" >
<iconset resource="icons.qrc" >:/Icons/skin/increase.png</iconset>
</property>
<property name="text" >
<string>Increase priority</string>
</property>
</action>
<action name="actionDecreasePriority" >
<property name="icon" >
<iconset resource="icons.qrc" >:/Icons/skin/decrease.png</iconset>
</property>
<property name="text" >
<string>Decrease priority</string>
</property>
</action>
</widget> </widget>
<resources> <resources>
<include location="icons.qrc" /> <include location="icons.qrc" />

View file

@ -78,6 +78,7 @@ DownloadingTorrents::DownloadingTorrents(QObject *parent, bittorrent *BTSession)
connect(BTSession, SIGNAL(urlSeedProblem(QString, QString)), this, SLOT(addUrlSeedError(QString, QString))); connect(BTSession, SIGNAL(urlSeedProblem(QString, QString)), this, SLOT(addUrlSeedError(QString, QString)));
connect(BTSession, SIGNAL(UPnPError(QString)), this, SLOT(displayUPnPError(QString))); connect(BTSession, SIGNAL(UPnPError(QString)), this, SLOT(displayUPnPError(QString)));
connect(BTSession, SIGNAL(UPnPSuccess(QString)), this, SLOT(displayUPnPSuccess(QString))); connect(BTSession, SIGNAL(UPnPSuccess(QString)), this, SLOT(displayUPnPSuccess(QString)));
connect(BTSession, SIGNAL(forceUnfinishedListUpdate()), this, SLOT(updateDlList()));
// Load last columns width for download list // Load last columns width for download list
if(!loadColWidthDLList()) { if(!loadColWidthDLList()) {
@ -97,6 +98,8 @@ DownloadingTorrents::DownloadingTorrents(QObject *parent, bittorrent *BTSession)
connect(actionPause, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPause_triggered())); connect(actionPause, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPause_triggered()));
connect(actionStart, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionStart_triggered())); connect(actionStart, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionStart_triggered()));
connect(actionDelete, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_triggered())); connect(actionDelete, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_triggered()));
connect(actionIncreasePriority, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionIncreasePriority_triggered()));
connect(actionDecreasePriority, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDecreasePriority_triggered()));
connect(actionPreview_file, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPreview_file_triggered())); connect(actionPreview_file, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPreview_file_triggered()));
connect(actionDelete_Permanently, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_Permanently_triggered())); connect(actionDelete_Permanently, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_Permanently_triggered()));
connect(actionOpen_destination_folder, SIGNAL(triggered()), (GUI*)parent, SLOT(openDestinationFolder())); connect(actionOpen_destination_folder, SIGNAL(triggered()), (GUI*)parent, SLOT(openDestinationFolder()));
@ -318,6 +321,11 @@ void DownloadingTorrents::displayDLListMenu(const QPoint& pos) {
myDLLlistMenu.addSeparator(); myDLLlistMenu.addSeparator();
myDLLlistMenu.addAction(actionOpen_destination_folder); myDLLlistMenu.addAction(actionOpen_destination_folder);
myDLLlistMenu.addAction(actionTorrent_Properties); myDLLlistMenu.addAction(actionTorrent_Properties);
if(BTSession->isQueueingEnabled()) {
myDLLlistMenu.addSeparator();
myDLLlistMenu.addAction(actionIncreasePriority);
myDLLlistMenu.addAction(actionDecreasePriority);
}
myDLLlistMenu.addSeparator(); myDLLlistMenu.addSeparator();
myDLLlistMenu.addAction(actionBuy_it); myDLLlistMenu.addAction(actionBuy_it);
// Call menu // Call menu
@ -669,6 +677,7 @@ void DownloadingTorrents::addTorrent(QString hash) {
} }
QTorrentHandle h = BTSession->getTorrentHandle(hash); QTorrentHandle h = BTSession->getTorrentHandle(hash);
int row = getRowFromHash(hash); int row = getRowFromHash(hash);
qDebug("DL: addTorrent(): %s, row: %d", (const char*)hash.toUtf8(), row);
if(row != -1) return; if(row != -1) return;
row = DLListModel->rowCount(); row = DLListModel->rowCount();
// Adding torrent to download list // Adding torrent to download list
@ -856,6 +865,7 @@ void DownloadingTorrents::torrentAdded(QString path, QTorrentHandle& h, bool fas
if(BTSession->isFinished(hash)) { if(BTSession->isFinished(hash)) {
return; return;
} }
if(getRowFromHash(hash) != -1) return;
int row = DLListModel->rowCount(); int row = DLListModel->rowCount();
// Adding torrent to download list // Adding torrent to download list
DLListModel->insertRow(row); DLListModel->insertRow(row);

View file

@ -20,11 +20,12 @@
#include "eventmanager.h" #include "eventmanager.h"
#include "bittorrent.h"
#include "json.h" #include "json.h"
#include <QDebug> #include <QDebug>
EventManager::EventManager(QObject *parent) EventManager::EventManager(QObject *parent, bittorrent *BTSession)
: QObject(parent) : QObject(parent), BTSession(BTSession)
{ {
revision = 0; revision = 0;
} }
@ -99,10 +100,12 @@ void EventManager::modifiedTorrent(QTorrentHandle h)
QVariantMap event; QVariantMap event;
QVariant v; QVariant v;
if(h.is_paused()) if(h.is_paused()) {
v = QVariant("paused"); if(BTSession->isDownloadQueued(hash) || BTSession->isUploadQueued(hash))
else v = QVariant("queued");
{ else
v = QVariant("paused");
} else {
switch(h.state()) switch(h.state())
{ {
case torrent_status::finished: case torrent_status::finished:

View file

@ -27,6 +27,8 @@
#include <QPair> #include <QPair>
#include <QVariant> #include <QVariant>
struct bittorrent;
class EventManager : public QObject class EventManager : public QObject
{ {
Q_OBJECT Q_OBJECT
@ -34,12 +36,13 @@ class EventManager : public QObject
ulong revision; ulong revision;
QLinkedList<QPair <ulong, QVariantMap> > events; QLinkedList<QPair <ulong, QVariantMap> > events;
bool modify(QString hash, QString key, QVariant value); bool modify(QString hash, QString key, QVariant value);
bittorrent* BTSession;
protected: protected:
void update(QVariantMap event); void update(QVariantMap event);
public: public:
EventManager(QObject *parent = 0); EventManager(QObject *parent, bittorrent* BTSession);
QVariant querySince(ulong r) const; QVariant querySince(ulong r) const;
bool isUpdated(ulong r) const; bool isUpdated(ulong r) const;

View file

@ -30,7 +30,7 @@ HttpServer::HttpServer(bittorrent *BTSession, int msec, QObject* parent) : QTcpS
base64 = QByteArray(":").toBase64(); base64 = QByteArray(":").toBase64();
connect(this, SIGNAL(newConnection()), this, SLOT(newHttpConnection())); connect(this, SIGNAL(newConnection()), this, SLOT(newHttpConnection()));
HttpServer::BTSession = BTSession; HttpServer::BTSession = BTSession;
manager = new EventManager(this); manager = new EventManager(this, BTSession);
//add torrents //add torrents
QStringList list = BTSession->getUnfinishedTorrents() + BTSession->getFinishedTorrents(); QStringList list = BTSession->getUnfinishedTorrents() + BTSession->getFinishedTorrents();
QString hash; QString hash;

View file

@ -79,7 +79,6 @@
<file>Icons/skin/delete.png</file> <file>Icons/skin/delete.png</file>
<file>Icons/skin/delete_all.png</file> <file>Icons/skin/delete_all.png</file>
<file>Icons/skin/delete_perm.png</file> <file>Icons/skin/delete_perm.png</file>
<file>Icons/skin/disconnected.png</file>
<file>Icons/skin/downloading.png</file> <file>Icons/skin/downloading.png</file>
<file>Icons/skin/exit.png</file> <file>Icons/skin/exit.png</file>
<file>Icons/skin/firewalled.png</file> <file>Icons/skin/firewalled.png</file>

View file

@ -209,6 +209,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QCheckBox" name="checkDisplayToolbar" >
<property name="text" >
<string>Display top toolbar</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QCheckBox" name="checkSpeedInTitle" > <widget class="QCheckBox" name="checkSpeedInTitle" >
<property name="text" > <property name="text" >

View file

@ -159,6 +159,7 @@ options_imp::options_imp(QWidget *parent):QDialog(parent){
connect(checkMinimizeToSysTray, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(checkMinimizeToSysTray, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton()));
connect(checkStartMinimized, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(checkStartMinimized, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton()));
connect(checkSystrayBalloons, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(checkSystrayBalloons, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton()));
connect(checkDisplayToolbar, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton()));
// Downloads tab // Downloads tab
connect(textSavePath, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); connect(textSavePath, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton()));
connect(checkPreallocateAll, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(checkPreallocateAll, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton()));
@ -278,6 +279,7 @@ void options_imp::saveOptions(){
settings.setValue(QString::fromUtf8("MinimizeToTray"), minimizeToTray()); settings.setValue(QString::fromUtf8("MinimizeToTray"), minimizeToTray());
settings.setValue(QString::fromUtf8("StartMinimized"), startMinimized()); settings.setValue(QString::fromUtf8("StartMinimized"), startMinimized());
settings.setValue(QString::fromUtf8("NotificationBaloons"), OSDEnabled()); settings.setValue(QString::fromUtf8("NotificationBaloons"), OSDEnabled());
settings.setValue(QString::fromUtf8("ToolbarDisplayed"), isToolbarDisplayed());
// End General preferences // End General preferences
settings.endGroup(); settings.endGroup();
// Downloads preferences // Downloads preferences
@ -440,6 +442,7 @@ void options_imp::loadOptions(){
checkSpeedInTitle->setChecked(settings.value(QString::fromUtf8("SpeedInTitleBar"), false).toBool()); checkSpeedInTitle->setChecked(settings.value(QString::fromUtf8("SpeedInTitleBar"), false).toBool());
spinRefreshInterval->setValue(settings.value(QString::fromUtf8("RefreshInterval"), 1500).toInt()); spinRefreshInterval->setValue(settings.value(QString::fromUtf8("RefreshInterval"), 1500).toInt());
checkNoSystray->setChecked(!settings.value(QString::fromUtf8("SystrayEnabled"), true).toBool()); checkNoSystray->setChecked(!settings.value(QString::fromUtf8("SystrayEnabled"), true).toBool());
checkDisplayToolbar->setChecked(settings.value(QString::fromUtf8("ToolbarDisplayed"), false).toBool());
if(!systrayIntegration()) { if(!systrayIntegration()) {
disableSystrayOptions(); disableSystrayOptions();
} else { } else {
@ -1149,6 +1152,10 @@ QString options_imp::getFilter() const{
return textFilterPath->text(); return textFilterPath->text();
} }
bool options_imp::isToolbarDisplayed() const {
return checkDisplayToolbar->isChecked();
}
// Web UI // Web UI
void options_imp::enableWebUi(bool checkBoxValue){ void options_imp::enableWebUi(bool checkBoxValue){

View file

@ -66,6 +66,7 @@ class options_imp : public QDialog, private Ui::Dialog {
bool closeToTray() const; bool closeToTray() const;
bool startMinimized() const; bool startMinimized() const;
bool OSDEnabled() const; bool OSDEnabled() const;
bool isToolbarDisplayed() const;
// Downloads // Downloads
QString getSavePath() const; QString getSavePath() const;
bool preAllocateAllFiles() const; bool preAllocateAllFiles() const;

View file

@ -139,6 +139,22 @@
<string>Priority</string> <string>Priority</string>
</property> </property>
</action> </action>
<action name="actionIncreasePriority" >
<property name="icon" >
<iconset resource="icons.qrc" >:/Icons/skin/increase.png</iconset>
</property>
<property name="text" >
<string>Increase priority</string>
</property>
</action>
<action name="actionDecreasePriority" >
<property name="icon" >
<iconset resource="icons.qrc" >:/Icons/skin/decrease.png</iconset>
</property>
<property name="text" >
<string>Decrease priority</string>
</property>
</action>
</widget> </widget>
<resources> <resources>
<include location="icons.qrc" /> <include location="icons.qrc" />

View file

@ -11,7 +11,7 @@ TARGET = qbittorrent
CONFIG += qt thread x11 network CONFIG += qt thread x11 network
# Update this VERSION for each release # Update this VERSION for each release
DEFINES += VERSION=\\\"v1.2.0beta2\\\" DEFINES += VERSION=\\\"v1.2.0beta3\\\"
DEFINES += VERSION_MAJOR=1 DEFINES += VERSION_MAJOR=1
DEFINES += VERSION_MINOR=2 DEFINES += VERSION_MINOR=2
DEFINES += VERSION_BUGFIX=0 DEFINES += VERSION_BUGFIX=0

View file

@ -79,6 +79,9 @@ window.addEvent('domready', function(){
case 'stalled': case 'stalled':
row[0] = '<img src="images/skin/stalled.png"/>'; row[0] = '<img src="images/skin/stalled.png"/>';
break; break;
case 'queued':
row[0] = '<img src="images/skin/queued.png"/>';
break;
} }
} }
if($defined(event.size)){ if($defined(event.size)){