|
|
@ -45,6 +45,7 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession |
|
|
|
connect(torrentContentList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayContentListMenu(const QPoint&))); |
|
|
|
connect(torrentContentList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayContentListMenu(const QPoint&))); |
|
|
|
connect(selectAllButton, SIGNAL(clicked()), PropListModel, SLOT(selectAll())); |
|
|
|
connect(selectAllButton, SIGNAL(clicked()), PropListModel, SLOT(selectAll())); |
|
|
|
connect(selectNoneButton, SIGNAL(clicked()), PropListModel, SLOT(selectNone())); |
|
|
|
connect(selectNoneButton, SIGNAL(clicked()), PropListModel, SLOT(selectNone())); |
|
|
|
|
|
|
|
connect(comboLabel, SIGNAL(editTextChanged(QString)), this, SLOT(resetComboLabelIndex(QString))); |
|
|
|
connect(comboLabel, SIGNAL(editTextChanged(QString)), this, SLOT(updateLabelInSavePath(QString))); |
|
|
|
connect(comboLabel, SIGNAL(editTextChanged(QString)), this, SLOT(updateLabelInSavePath(QString))); |
|
|
|
connect(comboLabel, SIGNAL(currentIndexChanged(QString)), this, SLOT(updateLabelInSavePath(QString))); |
|
|
|
connect(comboLabel, SIGNAL(currentIndexChanged(QString)), this, SLOT(updateLabelInSavePath(QString))); |
|
|
|
// Remember columns width
|
|
|
|
// Remember columns width
|
|
|
@ -52,21 +53,23 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession |
|
|
|
//torrentContentList->header()->setResizeMode(0, QHeaderView::Stretch);
|
|
|
|
//torrentContentList->header()->setResizeMode(0, QHeaderView::Stretch);
|
|
|
|
defaultSavePath = Preferences::getSavePath(); |
|
|
|
defaultSavePath = Preferences::getSavePath(); |
|
|
|
appendLabelToSavePath = Preferences::appendTorrentLabel(); |
|
|
|
appendLabelToSavePath = Preferences::appendTorrentLabel(); |
|
|
|
QString display_path = defaultSavePath; |
|
|
|
QString display_path = defaultSavePath.replace("\\", "/"); |
|
|
|
if(!display_path.endsWith("/") && !display_path.endsWith("\\")) |
|
|
|
if(!display_path.endsWith("/")) |
|
|
|
display_path += "/"; |
|
|
|
display_path += "/"; |
|
|
|
|
|
|
|
path_history << display_path; |
|
|
|
#if defined(Q_WS_WIN) || defined(Q_OS_OS2) |
|
|
|
#if defined(Q_WS_WIN) || defined(Q_OS_OS2) |
|
|
|
display_path = display_path.replace("/", "\\"); |
|
|
|
display_path = display_path.replace("/", "\\"); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
savePathTxt->addItem(display_path); |
|
|
|
savePathTxt->addItem(display_path); |
|
|
|
// Load save path history
|
|
|
|
// Load save path history
|
|
|
|
const QStringList path_history = getSavePathHistory(); |
|
|
|
QStringList raw_path_history = getSavePathHistory(); |
|
|
|
foreach(const QString &sp, path_history) { |
|
|
|
foreach(const QString &sp, raw_path_history) { |
|
|
|
#if defined(Q_WS_WIN) || defined(Q_OS_OS2) |
|
|
|
#if defined(Q_WS_WIN) || defined(Q_OS_OS2) |
|
|
|
if(sp.compare(display_path, Qt::CaseInsensitive) != 0) { |
|
|
|
if(sp.compare(display_path, Qt::CaseInsensitive) != 0) { |
|
|
|
#else |
|
|
|
#else |
|
|
|
if(sp.compare(display_path, Qt::CaseSensitive) != 0) { |
|
|
|
if(sp.compare(display_path, Qt::CaseSensitive) != 0) { |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
path_history << sp; |
|
|
|
QString dsp = sp; |
|
|
|
QString dsp = sp; |
|
|
|
#if defined(Q_WS_WIN) || defined(Q_OS_OS2) |
|
|
|
#if defined(Q_WS_WIN) || defined(Q_OS_OS2) |
|
|
|
dsp = dsp.replace("/", "\\"); |
|
|
|
dsp = dsp.replace("/", "\\"); |
|
|
@ -165,6 +168,7 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession |
|
|
|
savePathTxt->setEditText(save_path + fileName); |
|
|
|
savePathTxt->setEditText(save_path + fileName); |
|
|
|
} |
|
|
|
} |
|
|
|
fileNameLbl->setText(QString::fromUtf8("<center><b>")+fileName+QString::fromUtf8("</b></center>")); |
|
|
|
fileNameLbl->setText(QString::fromUtf8("<center><b>")+fileName+QString::fromUtf8("</b></center>")); |
|
|
|
|
|
|
|
connect(savePathTxt, SIGNAL(editTextChanged(QString)), this, SLOT(updateSavePathCurrentText(QString))); |
|
|
|
// Update display
|
|
|
|
// Update display
|
|
|
|
updateDiskSpaceLabels(); |
|
|
|
updateDiskSpaceLabels(); |
|
|
|
// Load custom labels
|
|
|
|
// Load custom labels
|
|
|
@ -222,10 +226,10 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession |
|
|
|
save_path += QDir::separator(); |
|
|
|
save_path += QDir::separator(); |
|
|
|
// If the torrent has a root folder, append it to the save path
|
|
|
|
// If the torrent has a root folder, append it to the save path
|
|
|
|
if(!root_folder.isEmpty()) { |
|
|
|
if(!root_folder.isEmpty()) { |
|
|
|
savePathTxt->setEditText(save_path + root_folder + QDir::separator()); |
|
|
|
savePathTxt->setEditText(save_path + root_folder); |
|
|
|
// Update other combo items
|
|
|
|
// Update other combo items
|
|
|
|
for(int i=0; i<savePathTxt->count(); ++i) { |
|
|
|
for(int i=0; i<savePathTxt->count(); ++i) { |
|
|
|
savePathTxt->setItemText(i, savePathTxt->itemText(i) + root_folder + QDir::separator()); |
|
|
|
savePathTxt->setItemText(i, savePathTxt->itemText(i) + root_folder); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if(nbFiles == 1) { |
|
|
|
if(nbFiles == 1) { |
|
|
@ -263,6 +267,7 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
connect(savePathTxt, SIGNAL(editTextChanged(QString)), this, SLOT(updateDiskSpaceLabels())); |
|
|
|
connect(savePathTxt, SIGNAL(editTextChanged(QString)), this, SLOT(updateDiskSpaceLabels())); |
|
|
|
|
|
|
|
connect(savePathTxt, SIGNAL(editTextChanged(QString)), this, SLOT(updateSavePathCurrentText(QString))); |
|
|
|
updateDiskSpaceLabels(); |
|
|
|
updateDiskSpaceLabels(); |
|
|
|
// Load custom labels
|
|
|
|
// Load custom labels
|
|
|
|
QIniSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); |
|
|
|
QIniSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); |
|
|
@ -457,22 +462,42 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession |
|
|
|
|
|
|
|
|
|
|
|
void torrentAdditionDialog::on_browseButton_clicked(){ |
|
|
|
void torrentAdditionDialog::on_browseButton_clicked(){ |
|
|
|
QString new_path; |
|
|
|
QString new_path; |
|
|
|
QString save_path = savePathTxt->currentText(); |
|
|
|
|
|
|
|
#if defined(Q_WS_WIN) || defined(Q_OS_OS2) |
|
|
|
|
|
|
|
save_path = save_path.replace("\\", "/"); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
save_path = misc::expandPath(save_path); |
|
|
|
|
|
|
|
if(!is_magnet && t->num_files() == 1) { |
|
|
|
if(!is_magnet && t->num_files() == 1) { |
|
|
|
new_path = QFileDialog::getSaveFileName(this, tr("Choose save path"), save_path); |
|
|
|
new_path = QFileDialog::getSaveFileName(this, tr("Choose save path"), savePathTxt->currentText()); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
const QDir saveDir(save_path); |
|
|
|
QString root_folder; |
|
|
|
if(!save_path.isEmpty() && saveDir.exists()){ |
|
|
|
QString truncated_path = getCurrentTruncatedSavePath(&root_folder); |
|
|
|
new_path = QFileDialog::getExistingDirectory(this, tr("Choose save path"), saveDir.absolutePath()); |
|
|
|
if(!truncated_path.isEmpty() && QDir(truncated_path).exists()){ |
|
|
|
|
|
|
|
new_path = QFileDialog::getExistingDirectory(this, tr("Choose save path"), truncated_path); |
|
|
|
}else{ |
|
|
|
}else{ |
|
|
|
new_path = QFileDialog::getExistingDirectory(this, tr("Choose save path"), QDir::homePath()); |
|
|
|
new_path = QFileDialog::getExistingDirectory(this, tr("Choose save path"), QDir::homePath()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if(!new_path.isEmpty()) { |
|
|
|
|
|
|
|
QStringList path_parts = new_path.replace("\\", "/").split("/"); |
|
|
|
|
|
|
|
if(path_parts.last().isEmpty()) |
|
|
|
|
|
|
|
path_parts.removeLast(); |
|
|
|
|
|
|
|
// Append label
|
|
|
|
|
|
|
|
const QString &label_name = comboLabel->currentText(); |
|
|
|
|
|
|
|
if(QDir(new_path) == QDir(defaultSavePath) && !label_name.isEmpty()) |
|
|
|
|
|
|
|
path_parts << label_name; |
|
|
|
|
|
|
|
// Append root folder
|
|
|
|
|
|
|
|
if(!root_folder.isEmpty()) |
|
|
|
|
|
|
|
path_parts << root_folder; |
|
|
|
|
|
|
|
// Construct new_path
|
|
|
|
|
|
|
|
new_path = path_parts.join(QDir::separator()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if(!new_path.isEmpty()) { |
|
|
|
|
|
|
|
// Check if this new path already exists in the list
|
|
|
|
|
|
|
|
QString new_truncated_path = getTruncatedSavePath(new_path); |
|
|
|
|
|
|
|
#if defined(Q_WS_X11) || defined(Q_WS_MAC) || defined(Q_WS_QWS) |
|
|
|
|
|
|
|
const int cur_index = path_history.indexOf(QRegExp(new_truncated_path, Qt::CaseInsensitive)); |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
const int cur_index = path_history.indexOf(QRegExp(new_truncated_path, Qt::CaseSensitive)); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
if(cur_index >= 0) { |
|
|
|
|
|
|
|
savePathTxt->setCurrentIndex(cur_index); |
|
|
|
} |
|
|
|
} |
|
|
|
if(!new_path.isEmpty()){ |
|
|
|
|
|
|
|
#if defined(Q_WS_WIN) || defined(Q_OS_OS2) |
|
|
|
#if defined(Q_WS_WIN) || defined(Q_OS_OS2) |
|
|
|
new_path = new_path.replace("/", "\\"); |
|
|
|
new_path = new_path.replace("/", "\\"); |
|
|
|
#endif |
|
|
|
#endif |
|
|
@ -513,13 +538,6 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession |
|
|
|
save_path = parts.join("/"); |
|
|
|
save_path = parts.join("/"); |
|
|
|
} |
|
|
|
} |
|
|
|
QDir savePath(save_path); |
|
|
|
QDir savePath(save_path); |
|
|
|
// Check if savePath exists
|
|
|
|
|
|
|
|
if(!savePath.exists()){ |
|
|
|
|
|
|
|
if(!savePath.mkpath(savePath.path())){ |
|
|
|
|
|
|
|
QMessageBox::critical(0, tr("Save path creation error"), tr("Could not create the save path")); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
const QString ¤t_label = comboLabel->currentText().trimmed(); |
|
|
|
const QString ¤t_label = comboLabel->currentText().trimmed(); |
|
|
|
if (!current_label.isEmpty() && !misc::isValidFileSystemName(current_label)) { |
|
|
|
if (!current_label.isEmpty() && !misc::isValidFileSystemName(current_label)) { |
|
|
|
QMessageBox::warning(this, tr("Invalid label name"), tr("Please don't use any special characters in the label name.")); |
|
|
|
QMessageBox::warning(this, tr("Invalid label name"), tr("Please don't use any special characters in the label name.")); |
|
|
@ -568,6 +586,15 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession |
|
|
|
QMessageBox::warning(0, tr("Invalid file selection"), tr("You must select at least one file in the torrent")); |
|
|
|
QMessageBox::warning(0, tr("Invalid file selection"), tr("You must select at least one file in the torrent")); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Save path history
|
|
|
|
|
|
|
|
saveTruncatedPathHistory(); |
|
|
|
|
|
|
|
// Check if savePath exists
|
|
|
|
|
|
|
|
if(!savePath.exists()){ |
|
|
|
|
|
|
|
if(!savePath.mkpath(savePath.path())){ |
|
|
|
|
|
|
|
QMessageBox::critical(0, tr("Save path creation error"), tr("Could not create the save path")); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
// save filtered files
|
|
|
|
// save filtered files
|
|
|
|
if(!is_magnet && t->num_files() > 1) |
|
|
|
if(!is_magnet && t->num_files() > 1) |
|
|
|
savePiecesPriorities(); |
|
|
|
savePiecesPriorities(); |
|
|
@ -581,36 +608,74 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession |
|
|
|
h.pause(); |
|
|
|
h.pause(); |
|
|
|
emit torrentPaused(h); |
|
|
|
emit torrentPaused(h); |
|
|
|
} |
|
|
|
} |
|
|
|
// Save path history
|
|
|
|
|
|
|
|
saveTruncatedPathHistory(); |
|
|
|
|
|
|
|
// Close the dialog
|
|
|
|
// Close the dialog
|
|
|
|
close(); |
|
|
|
close(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void torrentAdditionDialog::resetComboLabelIndex(QString text) { |
|
|
|
|
|
|
|
// Select first index
|
|
|
|
|
|
|
|
if(text != comboLabel->itemText(comboLabel->currentIndex())) { |
|
|
|
|
|
|
|
comboLabel->setItemText(0, text); |
|
|
|
|
|
|
|
comboLabel->setCurrentIndex(0); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void torrentAdditionDialog::updateLabelInSavePath(QString label) { |
|
|
|
void torrentAdditionDialog::updateLabelInSavePath(QString label) { |
|
|
|
if(appendLabelToSavePath) { |
|
|
|
if(appendLabelToSavePath) { |
|
|
|
|
|
|
|
// Update Label in combobox
|
|
|
|
|
|
|
|
savePathTxt->setItemText(0, misc::updateLabelInSavePath(defaultSavePath, savePathTxt->itemText(0), old_label, label)); |
|
|
|
|
|
|
|
// update edit text
|
|
|
|
savePathTxt->setEditText(misc::updateLabelInSavePath(defaultSavePath, savePathTxt->currentText(), old_label, label)); |
|
|
|
savePathTxt->setEditText(misc::updateLabelInSavePath(defaultSavePath, savePathTxt->currentText(), old_label, label)); |
|
|
|
|
|
|
|
old_label = label; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void torrentAdditionDialog::updateSavePathCurrentText(QString path) { |
|
|
|
|
|
|
|
savePathTxt->setItemText(savePathTxt->currentIndex(), path); |
|
|
|
|
|
|
|
path_history.replace(savePathTxt->currentIndex(), getCurrentTruncatedSavePath()); |
|
|
|
|
|
|
|
QString root_folder_or_file_name = ""; |
|
|
|
|
|
|
|
getCurrentTruncatedSavePath(&root_folder_or_file_name); |
|
|
|
// Update other combo items
|
|
|
|
// Update other combo items
|
|
|
|
for(int i=0; i<savePathTxt->count(); ++i) { |
|
|
|
for(int i=0; i<savePathTxt->count(); ++i) { |
|
|
|
savePathTxt->setItemText(i, misc::updateLabelInSavePath(defaultSavePath, savePathTxt->itemText(i), old_label, label)); |
|
|
|
if(i == savePathTxt->currentIndex()) continue; |
|
|
|
|
|
|
|
QString item_path = path_history.at(i); |
|
|
|
|
|
|
|
if(item_path.isEmpty()) continue; |
|
|
|
|
|
|
|
// Append label
|
|
|
|
|
|
|
|
if(i == 0 && appendLabelToSavePath && QDir(item_path) == QDir(defaultSavePath) && !comboLabel->currentText().isEmpty()) |
|
|
|
|
|
|
|
item_path += comboLabel->currentText() + "/"; |
|
|
|
|
|
|
|
// Append root_folder or filename
|
|
|
|
|
|
|
|
if(!root_folder_or_file_name.isEmpty()) |
|
|
|
|
|
|
|
item_path += root_folder_or_file_name; |
|
|
|
|
|
|
|
#if defined(Q_WS_WIN) || defined(Q_OS_OS2) |
|
|
|
|
|
|
|
item_path = item_path.replace("/", "\\"); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
savePathTxt->setItemText(i, item_path); |
|
|
|
} |
|
|
|
} |
|
|
|
old_label = label; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QString torrentAdditionDialog::getCurrentTruncatedSavePath(QString* root_folder_or_file_name) const { |
|
|
|
|
|
|
|
QString save_path = savePathTxt->currentText(); |
|
|
|
|
|
|
|
return getTruncatedSavePath(save_path, root_folder_or_file_name); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Get current save path without last part and without label
|
|
|
|
// Get current save path without the torrent root folder nor the label label
|
|
|
|
QString torrentAdditionDialog::getCurrentTruncatedSavePath() const { |
|
|
|
QString torrentAdditionDialog::getTruncatedSavePath(QString save_path, QString* root_folder_or_file_name) const { |
|
|
|
QStringList parts = savePathTxt->currentText().replace("\\", "/").split("/"); |
|
|
|
// Expand and clean path (~, .., .)
|
|
|
|
if(parts.last().isEmpty()) |
|
|
|
save_path = misc::expandPath(save_path); |
|
|
|
parts.removeLast(); |
|
|
|
QStringList parts = save_path.replace("\\", "/").split("/"); |
|
|
|
// Remove last part
|
|
|
|
// Remove torrent root folder
|
|
|
|
parts.removeLast(); |
|
|
|
if(!QDir(save_path).exists() || (!is_magnet && t->num_files() == 1)) { |
|
|
|
if(appendLabelToSavePath) { |
|
|
|
QString tmp = parts.takeLast(); |
|
|
|
|
|
|
|
if(root_folder_or_file_name) |
|
|
|
|
|
|
|
*root_folder_or_file_name = tmp; |
|
|
|
|
|
|
|
} |
|
|
|
// Remove label
|
|
|
|
// Remove label
|
|
|
|
if(parts.last() == comboLabel->currentText()) |
|
|
|
if(appendLabelToSavePath && savePathTxt->currentIndex() == 0 && parts.last() == comboLabel->currentText()) { |
|
|
|
parts.removeLast(); |
|
|
|
parts.removeLast(); |
|
|
|
} |
|
|
|
} |
|
|
|
const QString truncated_path = parts.join("/")+"/"; |
|
|
|
QString truncated_path = parts.join("/"); |
|
|
|
|
|
|
|
if(!truncated_path.endsWith("/")) |
|
|
|
|
|
|
|
truncated_path += "/"; |
|
|
|
qDebug("Truncated save path: %s", qPrintable(truncated_path)); |
|
|
|
qDebug("Truncated save path: %s", qPrintable(truncated_path)); |
|
|
|
return truncated_path; |
|
|
|
return truncated_path; |
|
|
|
} |
|
|
|
} |
|
|
|