diff --git a/src/torrentadditiondlg.cpp b/src/torrentadditiondlg.cpp index ed9836e49..7f64dcddf 100644 --- a/src/torrentadditiondlg.cpp +++ b/src/torrentadditiondlg.cpp @@ -45,6 +45,7 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession connect(torrentContentList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayContentListMenu(const QPoint&))); connect(selectAllButton, SIGNAL(clicked()), PropListModel, SLOT(selectAll())); 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(currentIndexChanged(QString)), this, SLOT(updateLabelInSavePath(QString))); // Remember columns width @@ -52,21 +53,23 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession //torrentContentList->header()->setResizeMode(0, QHeaderView::Stretch); defaultSavePath = Preferences::getSavePath(); appendLabelToSavePath = Preferences::appendTorrentLabel(); - QString display_path = defaultSavePath; - if(!display_path.endsWith("/") && !display_path.endsWith("\\")) + QString display_path = defaultSavePath.replace("\\", "/"); + if(!display_path.endsWith("/")) display_path += "/"; + path_history << display_path; #if defined(Q_WS_WIN) || defined(Q_OS_OS2) display_path = display_path.replace("/", "\\"); #endif savePathTxt->addItem(display_path); // Load save path history - const QStringList path_history = getSavePathHistory(); - foreach(const QString &sp, path_history) { + QStringList raw_path_history = getSavePathHistory(); + foreach(const QString &sp, raw_path_history) { #if defined(Q_WS_WIN) || defined(Q_OS_OS2) if(sp.compare(display_path, Qt::CaseInsensitive) != 0) { #else if(sp.compare(display_path, Qt::CaseSensitive) != 0) { #endif + path_history << sp; QString dsp = sp; #if defined(Q_WS_WIN) || defined(Q_OS_OS2) dsp = dsp.replace("/", "\\"); @@ -165,6 +168,7 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession savePathTxt->setEditText(save_path + fileName); } fileNameLbl->setText(QString::fromUtf8("
")+fileName+QString::fromUtf8("
")); + connect(savePathTxt, SIGNAL(editTextChanged(QString)), this, SLOT(updateSavePathCurrentText(QString))); // Update display updateDiskSpaceLabels(); // Load custom labels @@ -222,10 +226,10 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession save_path += QDir::separator(); // If the torrent has a root folder, append it to the save path if(!root_folder.isEmpty()) { - savePathTxt->setEditText(save_path + root_folder + QDir::separator()); + savePathTxt->setEditText(save_path + root_folder); // Update other combo items for(int i=0; icount(); ++i) { - savePathTxt->setItemText(i, savePathTxt->itemText(i) + root_folder + QDir::separator()); + savePathTxt->setItemText(i, savePathTxt->itemText(i) + root_folder); } } 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(updateSavePathCurrentText(QString))); updateDiskSpaceLabels(); // Load custom labels QIniSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); @@ -457,22 +462,42 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession void torrentAdditionDialog::on_browseButton_clicked(){ 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) { - new_path = QFileDialog::getSaveFileName(this, tr("Choose save path"), save_path); + new_path = QFileDialog::getSaveFileName(this, tr("Choose save path"), savePathTxt->currentText()); } else { - const QDir saveDir(save_path); - if(!save_path.isEmpty() && saveDir.exists()){ - new_path = QFileDialog::getExistingDirectory(this, tr("Choose save path"), saveDir.absolutePath()); + QString root_folder; + QString truncated_path = getCurrentTruncatedSavePath(&root_folder); + if(!truncated_path.isEmpty() && QDir(truncated_path).exists()){ + new_path = QFileDialog::getExistingDirectory(this, tr("Choose save path"), truncated_path); }else{ 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()){ + 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 defined(Q_WS_WIN) || defined(Q_OS_OS2) new_path = new_path.replace("/", "\\"); #endif @@ -513,13 +538,6 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession save_path = parts.join("/"); } 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(); 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.")); @@ -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")); 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 if(!is_magnet && t->num_files() > 1) savePiecesPriorities(); @@ -581,36 +608,74 @@ torrentAdditionDialog::torrentAdditionDialog(GUI *parent, Bittorrent* _BTSession h.pause(); emit torrentPaused(h); } - // Save path history - saveTruncatedPathHistory(); // Close the dialog 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) { 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)); - // Update other combo items - for(int i=0; icount(); ++i) { - savePathTxt->setItemText(i, misc::updateLabelInSavePath(defaultSavePath, savePathTxt->itemText(i), old_label, label)); - } old_label = label; } } - // Get current save path without last part and without label - QString torrentAdditionDialog::getCurrentTruncatedSavePath() const { - QStringList parts = savePathTxt->currentText().replace("\\", "/").split("/"); - if(parts.last().isEmpty()) + 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 + for(int i=0; icount(); ++i) { + 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); + } + } + + 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 the torrent root folder nor the label label + QString torrentAdditionDialog::getTruncatedSavePath(QString save_path, QString* root_folder_or_file_name) const { + // Expand and clean path (~, .., .) + save_path = misc::expandPath(save_path); + QStringList parts = save_path.replace("\\", "/").split("/"); + // Remove torrent root folder + if(!QDir(save_path).exists() || (!is_magnet && t->num_files() == 1)) { + QString tmp = parts.takeLast(); + if(root_folder_or_file_name) + *root_folder_or_file_name = tmp; + } + // Remove label + if(appendLabelToSavePath && savePathTxt->currentIndex() == 0 && parts.last() == comboLabel->currentText()) { parts.removeLast(); - // Remove last part - parts.removeLast(); - if(appendLabelToSavePath) { - // Remove label - if(parts.last() == comboLabel->currentText()) - 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)); return truncated_path; } diff --git a/src/torrentadditiondlg.h b/src/torrentadditiondlg.h index 85638c99a..dc2d50161 100644 --- a/src/torrentadditiondlg.h +++ b/src/torrentadditiondlg.h @@ -68,7 +68,8 @@ public: void saveSettings(); void showLoadMagnetURI(QString magnet_uri); void showLoad(QString filePath, QString from_url=QString::null); - QString getCurrentTruncatedSavePath() const; + QString getCurrentTruncatedSavePath(QString* root_folder_or_file_name = 0) const; + QString getTruncatedSavePath(QString save_path, QString* root_folder_or_file_name = 0) const; public slots: void displayContentListMenu(const QPoint&); @@ -84,6 +85,8 @@ public slots: void saveTruncatedPathHistory(); QStringList getSavePathHistory() const; void updateLabelInSavePath(QString label); + void updateSavePathCurrentText(QString path); + void resetComboLabelIndex(QString text); signals: void torrentPaused(QTorrentHandle &h); @@ -104,6 +107,7 @@ private: QStringList files_path; bool is_magnet; int hidden_height; + QStringList path_history; }; #endif