Browse Source

Setting for creating subfolder on multifile torrents. Closes #588.

adaptive-webui-19844
sledgehammer999 9 years ago committed by Vladimir Golovnev (Glassez)
parent
commit
4b2d8a7941
  1. 5
      src/base/bittorrent/session.cpp
  2. 1
      src/base/bittorrent/session.h
  3. 4
      src/base/bittorrent/torrenthandle.cpp
  4. 1
      src/base/bittorrent/torrenthandle.h
  5. 18
      src/base/bittorrent/torrentinfo.cpp
  6. 4
      src/base/bittorrent/torrentinfo.h
  7. 10
      src/base/preferences.cpp
  8. 2
      src/base/preferences.h
  9. 8
      src/gui/addnewtorrentdialog.cpp
  10. 20
      src/gui/addnewtorrentdialog.ui
  11. 3
      src/gui/optionsdlg.cpp
  12. 10
      src/gui/optionsdlg.ui
  13. 7
      src/gui/properties/propertieswidget.cpp

5
src/base/bittorrent/session.cpp

@ -1652,6 +1652,11 @@ bool Session::addTorrent_impl(AddTorrentData addData, const MagnetUri &magnetUri
p = magnetUri.addTorrentParams(); p = magnetUri.addTorrentParams();
} }
else if (torrentInfo.isValid()) { else if (torrentInfo.isValid()) {
if (!addData.resumed && !addData.createSubfolder && torrentInfo.filesCount() > 1) {
libtorrent::file_storage files = torrentInfo.files();
files.set_name("");
torrentInfo.remapFiles(files);
}
// Metadata // Metadata
if (!addData.resumed && !addData.hasSeedStatus) if (!addData.resumed && !addData.hasSeedStatus)
findIncompleteFiles(torrentInfo, savePath); findIncompleteFiles(torrentInfo, savePath);

1
src/base/bittorrent/session.h

@ -147,6 +147,7 @@ namespace BitTorrent
QVector<int> filePriorities; // used if TorrentInfo is set QVector<int> filePriorities; // used if TorrentInfo is set
bool ignoreShareRatio = false; bool ignoreShareRatio = false;
bool skipChecking = false; bool skipChecking = false;
bool createSubfolder = true;
}; };
struct TorrentStatusReport struct TorrentStatusReport

4
src/base/bittorrent/torrenthandle.cpp

@ -152,6 +152,7 @@ TorrentState::operator int() const
return m_value; return m_value;
} }
, createSubfolder(in.createSubfolder)
// TorrentHandle // TorrentHandle
const qreal TorrentHandle::USE_GLOBAL_RATIO = -2.; const qreal TorrentHandle::USE_GLOBAL_RATIO = -2.;
@ -230,6 +231,9 @@ QString TorrentHandle::name() const
if (name.isEmpty()) if (name.isEmpty())
name = QString::fromStdString(m_nativeStatus.name); name = QString::fromStdString(m_nativeStatus.name);
if (name.isEmpty())
name = QString::fromStdString(m_torrentInfo.origFiles().name());
if (name.isEmpty()) if (name.isEmpty())
name = m_hash; name = m_hash;

1
src/base/bittorrent/torrenthandle.h

@ -98,6 +98,7 @@ namespace BitTorrent
bool sequential; bool sequential;
bool hasSeedStatus; bool hasSeedStatus;
bool skipChecking; bool skipChecking;
bool createSubfolder;
TriStateBool addForced; TriStateBool addForced;
TriStateBool addPaused; TriStateBool addPaused;
// for new torrents // for new torrents

18
src/base/bittorrent/torrentinfo.cpp

@ -276,6 +276,18 @@ TorrentInfo::PieceRange TorrentInfo::filePieces(int fileIndex) const
static_cast<int>((firstOffset + fileSize - 1) / pieceLength())); static_cast<int>((firstOffset + fileSize - 1) / pieceLength()));
} }
libtorrent::file_storage TorrentInfo::files() const
{
if (!isValid()) return libtorrent::file_storage();
return m_nativeInfo->files();
}
libtorrent::file_storage TorrentInfo::origFiles() const
{
if (!isValid()) return libtorrent::file_storage();
return m_nativeInfo->orig_files();
}
void TorrentInfo::renameFile(uint index, const QString &newPath) void TorrentInfo::renameFile(uint index, const QString &newPath)
{ {
if (!isValid()) return; if (!isValid()) return;
@ -293,6 +305,12 @@ int BitTorrent::TorrentInfo::fileIndex(const QString& fileName) const
return -1; return -1;
} }
void TorrentInfo::remapFiles(libtorrent::file_storage const &fileStorage)
{
if (!isValid()) return;
m_nativeInfo->remap_files(fileStorage);
}
TorrentInfo::NativePtr TorrentInfo::nativeInfo() const TorrentInfo::NativePtr TorrentInfo::nativeInfo() const
{ {
return m_nativeInfo; return m_nativeInfo;

4
src/base/bittorrent/torrentinfo.h

@ -98,8 +98,12 @@ namespace BitTorrent
PieceRange filePieces(const QString &file) const; PieceRange filePieces(const QString &file) const;
PieceRange filePieces(int fileIndex) const; PieceRange filePieces(int fileIndex) const;
libtorrent::file_storage files() const;
libtorrent::file_storage origFiles() const;
void renameFile(uint index, const QString &newPath); void renameFile(uint index, const QString &newPath);
void remapFiles(libtorrent::file_storage const &fileStorage);
NativePtr nativeInfo() const; NativePtr nativeInfo() const;
private: private:

10
src/base/preferences.cpp

@ -263,6 +263,16 @@ void Preferences::setLastLocationPath(const QString &path)
setValue("Preferences/Downloads/LastLocationPath", Utils::Fs::fromNativePath(path)); setValue("Preferences/Downloads/LastLocationPath", Utils::Fs::fromNativePath(path));
} }
bool Preferences::getTorrentCreateSubfolder() const
{
return value("Preferences/Downloads/CreateSubfolder", true).toBool();
}
void Preferences::setTorrentCreateSubfolder(bool b)
{
setValue("Preferences/Downloads/CreateSubfolder", b);
}
QVariantHash Preferences::getScanDirs() const QVariantHash Preferences::getScanDirs() const
{ {
return value("Preferences/Downloads/ScanDirsV2").toHash(); return value("Preferences/Downloads/ScanDirsV2").toHash();

2
src/base/preferences.h

@ -138,6 +138,8 @@ public:
void setLastLocationPath(const QString &path); void setLastLocationPath(const QString &path);
QVariantHash getScanDirs() const; QVariantHash getScanDirs() const;
void setScanDirs(const QVariantHash &dirs); void setScanDirs(const QVariantHash &dirs);
bool getTorrentCreateSubfolder() const;
void setTorrentCreateSubfolder(bool b);
QString getScanDirsLastPath() const; QString getScanDirsLastPath() const;
void setScanDirsLastPath(const QString &path); void setScanDirsLastPath(const QString &path);
bool isMailNotificationEnabled() const; bool isMailNotificationEnabled() const;

8
src/gui/addnewtorrentdialog.cpp

@ -35,6 +35,7 @@
#include <QMenu> #include <QMenu>
#include <QFileDialog> #include <QFileDialog>
#include "base/preferences.h"
#include "base/settingsstorage.h" #include "base/settingsstorage.h"
#include "base/net/downloadmanager.h" #include "base/net/downloadmanager.h"
#include "base/net/downloadhandler.h" #include "base/net/downloadhandler.h"
@ -95,6 +96,7 @@ AddNewTorrentDialog::AddNewTorrentDialog(QWidget *parent)
connect(ui->savePathComboBox, SIGNAL(currentIndexChanged(int)), SLOT(onSavePathChanged(int))); connect(ui->savePathComboBox, SIGNAL(currentIndexChanged(int)), SLOT(onSavePathChanged(int)));
connect(ui->browseButton, SIGNAL(clicked()), SLOT(browseButton_clicked())); connect(ui->browseButton, SIGNAL(clicked()), SLOT(browseButton_clicked()));
ui->defaultSavePathCheckBox->setVisible(false); // Default path is selected by default ui->defaultSavePathCheckBox->setVisible(false); // Default path is selected by default
ui->createSubfolderComboBox->setChecked(Preferences::instance()->getTorrentCreateSubfolder());
ui->doNotDeleteTorrentCheckBox->setVisible(TorrentFileGuard::autoDeleteMode() != TorrentFileGuard::Never); ui->doNotDeleteTorrentCheckBox->setVisible(TorrentFileGuard::autoDeleteMode() != TorrentFileGuard::Never);
@ -624,9 +626,8 @@ void AddNewTorrentDialog::accept()
BitTorrent::AddTorrentParams params; BitTorrent::AddTorrentParams params;
if (ui->skip_check_cb->isChecked()) // TODO: Check if destination actually exists
// TODO: Check if destination actually exists params.skipChecking = ui->skip_check_cb->isChecked();
params.skipChecking = true;
// Category // Category
params.category = ui->categoryComboBox->currentText(); params.category = ui->categoryComboBox->currentText();
@ -639,6 +640,7 @@ void AddNewTorrentDialog::accept()
params.filePriorities = m_contentModel->model()->getFilePriorities(); params.filePriorities = m_contentModel->model()->getFilePriorities();
params.addPaused = !ui->startTorrentCheckBox->isChecked(); params.addPaused = !ui->startTorrentCheckBox->isChecked();
params.createSubfolder = ui->createSubfolderComboBox->isChecked();
QString savePath = ui->savePathComboBox->itemData(ui->savePathComboBox->currentIndex()).toString(); QString savePath = ui->savePathComboBox->itemData(ui->savePathComboBox->currentIndex()).toString();
if (ui->comboTTM->currentIndex() != 1) { // 0 is Manual mode and 1 is Automatic mode. Handle all non 1 values as manual mode. if (ui->comboTTM->currentIndex() != 1) { // 0 is Manual mode and 1 is Automatic mode. Handle all non 1 values as manual mode.

20
src/gui/addnewtorrentdialog.ui

@ -192,6 +192,26 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="0" column="0">
<widget class="QCheckBox" name="start_torrent_cb">
<property name="text">
<string>Start torrent</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="createSubfolderComboBox">
<property name="text">
<string>Create subfolder</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>

3
src/gui/optionsdlg.cpp

@ -214,6 +214,7 @@ OptionsDialog::OptionsDialog(QWidget *parent)
connect(m_ui->checkAdditionDialog, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); connect(m_ui->checkAdditionDialog, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton()));
connect(m_ui->checkAdditionDialogFront, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); connect(m_ui->checkAdditionDialogFront, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton()));
connect(m_ui->checkStartPaused, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); connect(m_ui->checkStartPaused, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton()));
connect(m_ui->checkCreateSubfolder, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton()));
connect(m_ui->deleteTorrentBox, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); connect(m_ui->deleteTorrentBox, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton()));
connect(m_ui->deleteCancelledTorrentBox, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); connect(m_ui->deleteCancelledTorrentBox, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton()));
connect(m_ui->checkExportDir, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); connect(m_ui->checkExportDir, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton()));
@ -515,6 +516,7 @@ void OptionsDialog::saveOptions()
AddNewTorrentDialog::setEnabled(useAdditionDialog()); AddNewTorrentDialog::setEnabled(useAdditionDialog());
AddNewTorrentDialog::setTopLevel(m_ui->checkAdditionDialogFront->isChecked()); AddNewTorrentDialog::setTopLevel(m_ui->checkAdditionDialogFront->isChecked());
session->setAddTorrentPaused(addTorrentsInPause()); session->setAddTorrentPaused(addTorrentsInPause());
pref->setTorrentCreateSubfolder(m_ui->checkCreateSubfolder->isChecked());
ScanFoldersModel::instance()->removeFromFSWatcher(removedScanDirs); ScanFoldersModel::instance()->removeFromFSWatcher(removedScanDirs);
ScanFoldersModel::instance()->addToFSWatcher(addedScanDirs); ScanFoldersModel::instance()->addToFSWatcher(addedScanDirs);
ScanFoldersModel::instance()->makePersistent(); ScanFoldersModel::instance()->makePersistent();
@ -716,6 +718,7 @@ void OptionsDialog::loadOptions()
m_ui->checkAdditionDialog->setChecked(AddNewTorrentDialog::isEnabled()); m_ui->checkAdditionDialog->setChecked(AddNewTorrentDialog::isEnabled());
m_ui->checkAdditionDialogFront->setChecked(AddNewTorrentDialog::isTopLevel()); m_ui->checkAdditionDialogFront->setChecked(AddNewTorrentDialog::isTopLevel());
m_ui->checkStartPaused->setChecked(session->isAddTorrentPaused()); m_ui->checkStartPaused->setChecked(session->isAddTorrentPaused());
m_ui->checkCreateSubfolder->setChecked(pref->getTorrentCreateSubfolder());
const TorrentFileGuard::AutoDeleteMode autoDeleteMode = TorrentFileGuard::autoDeleteMode(); const TorrentFileGuard::AutoDeleteMode autoDeleteMode = TorrentFileGuard::autoDeleteMode();
m_ui->deleteTorrentBox->setChecked(autoDeleteMode != TorrentFileGuard::Never); m_ui->deleteTorrentBox->setChecked(autoDeleteMode != TorrentFileGuard::Never);
m_ui->deleteCancelledTorrentBox->setChecked(autoDeleteMode == TorrentFileGuard::Always); m_ui->deleteCancelledTorrentBox->setChecked(autoDeleteMode == TorrentFileGuard::Always);

10
src/gui/optionsdlg.ui

@ -709,6 +709,16 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="2" column="0">
<widget class="QCheckBox" name="checkCreateSubfolder">
<property name="text">
<string>Create subfolder for torrents with multiple files</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item> <item>
<widget class="QCheckBox" name="checkStartPaused"> <widget class="QCheckBox" name="checkStartPaused">
<property name="text"> <property name="text">

7
src/gui/properties/propertieswidget.cpp

@ -315,8 +315,11 @@ void PropertiesWidget::loadTorrentInfos(BitTorrent::TorrentHandle *const torrent
label_created_by_val->setText(m_torrent->creator().toHtmlEscaped()); label_created_by_val->setText(m_torrent->creator().toHtmlEscaped());
// List files in torrent // List files in torrent
PropListModel->model()->setupModelData(m_torrent->info()); BitTorrent::TorrentInfo info = m_torrent->info();
filesList->setExpanded(PropListModel->index(0, 0), true); libtorrent::file_storage files = info.files();
PropListModel->model()->setupModelData(info);
if (!(info.filesCount() > 1 && files.name().empty()))
filesList->setExpanded(PropListModel->index(0, 0), true);
// Load file priorities // Load file priorities
PropListModel->model()->updateFilesPriorities(m_torrent->filePriorities()); PropListModel->model()->updateFilesPriorities(m_torrent->filePriorities());

Loading…
Cancel
Save