mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-11-23 01:36:15 +03:00
Merge pull request #13305 from Chocobo1/openAction
Fix "Open containing folder" opened the wrong path for folder item
This commit is contained in:
commit
1c87073990
3 changed files with 45 additions and 63 deletions
|
@ -108,7 +108,7 @@ PropertiesWidget::PropertiesWidget(QWidget *parent)
|
|||
connect(m_ui->filesList, &QAbstractItemView::clicked
|
||||
, m_ui->filesList, qOverload<const QModelIndex &>(&QAbstractItemView::edit));
|
||||
connect(m_ui->filesList, &QWidget::customContextMenuRequested, this, &PropertiesWidget::displayFilesListMenu);
|
||||
connect(m_ui->filesList, &QAbstractItemView::doubleClicked, this, &PropertiesWidget::openDoubleClickedFile);
|
||||
connect(m_ui->filesList, &QAbstractItemView::doubleClicked, this, &PropertiesWidget::openItem);
|
||||
connect(m_ui->filesList->header(), &QHeaderView::sectionMoved, this, &PropertiesWidget::saveSettings);
|
||||
connect(m_ui->filesList->header(), &QHeaderView::sectionResized, this, &PropertiesWidget::saveSettings);
|
||||
connect(m_ui->filesList->header(), &QHeaderView::sortIndicatorChanged, this, &PropertiesWidget::saveSettings);
|
||||
|
@ -517,65 +517,41 @@ void PropertiesWidget::loadUrlSeeds()
|
|||
}
|
||||
}
|
||||
|
||||
void PropertiesWidget::openDoubleClickedFile(const QModelIndex &index) const
|
||||
QString PropertiesWidget::getFullPath(const QModelIndex &index) const
|
||||
{
|
||||
if (!index.isValid() || !m_torrent || !m_torrent->hasMetadata()) return;
|
||||
|
||||
if (m_propListModel->itemType(index) == TorrentContentModelItem::FileType)
|
||||
openFile(index);
|
||||
else
|
||||
openFolder(index, false);
|
||||
}
|
||||
|
||||
void PropertiesWidget::openFile(const QModelIndex &index) const
|
||||
{
|
||||
int i = m_propListModel->getFileIndex(index);
|
||||
const QDir saveDir(m_torrent->savePath(true));
|
||||
const QString filename = m_torrent->filePath(i);
|
||||
const QString filePath = Utils::Fs::expandPath(saveDir.absoluteFilePath(filename));
|
||||
qDebug("Trying to open file at %s", qUtf8Printable(filePath));
|
||||
// Flush data
|
||||
m_torrent->flushCache();
|
||||
Utils::Gui::openPath(filePath);
|
||||
}
|
||||
|
||||
void PropertiesWidget::openFolder(const QModelIndex &index, const bool containingFolder) const
|
||||
{
|
||||
QString absolutePath;
|
||||
// FOLDER
|
||||
if (m_propListModel->itemType(index) == TorrentContentModelItem::FolderType) {
|
||||
// Generate relative path to selected folder
|
||||
const QModelIndex nameIndex {index.sibling(index.row(), TorrentContentModelItem::COL_NAME)};
|
||||
QStringList pathItems {nameIndex.data().toString()};
|
||||
QModelIndex parent = m_propListModel->parent(nameIndex);
|
||||
while (parent.isValid()) {
|
||||
pathItems.prepend(parent.data().toString());
|
||||
parent = m_propListModel->parent(parent);
|
||||
}
|
||||
if (pathItems.isEmpty())
|
||||
return;
|
||||
|
||||
const QDir saveDir(m_torrent->savePath(true));
|
||||
const QString relativePath = pathItems.join('/');
|
||||
absolutePath = Utils::Fs::expandPath(saveDir.absoluteFilePath(relativePath));
|
||||
}
|
||||
else {
|
||||
const int i = m_propListModel->getFileIndex(index);
|
||||
const QDir saveDir(m_torrent->savePath(true));
|
||||
const QString relativePath = m_torrent->filePath(i);
|
||||
absolutePath = Utils::Fs::expandPath(saveDir.absoluteFilePath(relativePath));
|
||||
if (m_propListModel->itemType(index) == TorrentContentModelItem::FileType) {
|
||||
const int fileIdx = m_propListModel->getFileIndex(index);
|
||||
const QString filename {m_torrent->filePath(fileIdx)};
|
||||
const QDir saveDir {m_torrent->savePath(true)};
|
||||
const QString fullPath {Utils::Fs::expandPath(saveDir.absoluteFilePath(filename))};
|
||||
return fullPath;
|
||||
}
|
||||
|
||||
// Flush data
|
||||
m_torrent->flushCache();
|
||||
// folder type
|
||||
const QModelIndex nameIndex {index.sibling(index.row(), TorrentContentModelItem::COL_NAME)};
|
||||
QString folderPath {nameIndex.data().toString()};
|
||||
for (QModelIndex modelIdx = m_propListModel->parent(nameIndex); modelIdx.isValid(); modelIdx = modelIdx.parent())
|
||||
folderPath.prepend(modelIdx.data().toString() + '/');
|
||||
|
||||
const QDir saveDir {m_torrent->savePath(true)};
|
||||
const QString fullPath {Utils::Fs::expandPath(saveDir.absoluteFilePath(folderPath))};
|
||||
return fullPath;
|
||||
}
|
||||
|
||||
void PropertiesWidget::openItem(const QModelIndex &index) const
|
||||
{
|
||||
m_torrent->flushCache(); // Flush data
|
||||
Utils::Gui::openPath(getFullPath(index));
|
||||
}
|
||||
|
||||
void PropertiesWidget::openParentFolder(const QModelIndex &index) const
|
||||
{
|
||||
const QString path = getFullPath(index);
|
||||
m_torrent->flushCache(); // Flush data
|
||||
#ifdef Q_OS_MACOS
|
||||
Q_UNUSED(containingFolder);
|
||||
MacUtils::openFiles(QSet<QString> {absolutePath});
|
||||
MacUtils::openFiles({path});
|
||||
#else
|
||||
if (containingFolder)
|
||||
Utils::Gui::openFolderSelect(absolutePath);
|
||||
else
|
||||
Utils::Gui::openPath(absolutePath);
|
||||
Utils::Gui::openFolderSelect(path);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -593,10 +569,10 @@ void PropertiesWidget::displayFilesListMenu(const QPoint &)
|
|||
const QModelIndex index = selectedRows[0];
|
||||
|
||||
const QAction *actOpen = menu->addAction(UIThemeManager::instance()->getIcon("folder-documents"), tr("Open"));
|
||||
connect(actOpen, &QAction::triggered, this, [this, index]() { openDoubleClickedFile(index); });
|
||||
connect(actOpen, &QAction::triggered, this, [this, index]() { openItem(index); });
|
||||
|
||||
const QAction *actOpenContainingFolder = menu->addAction(UIThemeManager::instance()->getIcon("inode-directory"), tr("Open Containing Folder"));
|
||||
connect(actOpenContainingFolder, &QAction::triggered, this, [this, index]() { openFolder(index, true); });
|
||||
connect(actOpenContainingFolder, &QAction::triggered, this, [this, index]() { openParentFolder(index); });
|
||||
|
||||
const QAction *actRename = menu->addAction(UIThemeManager::instance()->getIcon("edit-rename"), tr("Rename..."));
|
||||
connect(actRename, &QAction::triggered, this, [this]() { m_ui->filesList->renameSelectedFile(m_torrent); });
|
||||
|
@ -688,7 +664,7 @@ void PropertiesWidget::openSelectedFile()
|
|||
const QModelIndexList selectedIndexes = m_ui->filesList->selectionModel()->selectedRows(0);
|
||||
if (selectedIndexes.size() != 1)
|
||||
return;
|
||||
openDoubleClickedFile(selectedIndexes.first());
|
||||
openItem(selectedIndexes.first());
|
||||
}
|
||||
|
||||
void PropertiesWidget::configure()
|
||||
|
|
|
@ -82,7 +82,7 @@ public slots:
|
|||
void readSettings();
|
||||
void saveSettings();
|
||||
void reloadPreferences();
|
||||
void openDoubleClickedFile(const QModelIndex &index) const;
|
||||
void openItem(const QModelIndex &index) const;
|
||||
void loadTrackers(BitTorrent::TorrentHandle *const torrent);
|
||||
|
||||
protected slots:
|
||||
|
@ -107,8 +107,8 @@ private slots:
|
|||
private:
|
||||
QPushButton *getButtonFromIndex(int index);
|
||||
void applyPriorities();
|
||||
void openFile(const QModelIndex &index) const;
|
||||
void openFolder(const QModelIndex &index, bool containingFolder) const;
|
||||
void openParentFolder(const QModelIndex &index) const;
|
||||
QString getFullPath(const QModelIndex &index) const;
|
||||
|
||||
Ui::PropertiesWidget *m_ui;
|
||||
BitTorrent::TorrentHandle *m_torrent;
|
||||
|
|
|
@ -175,12 +175,14 @@ void Utils::Gui::openPath(const QString &absolutePath)
|
|||
// (if possible) the item at the given path
|
||||
void Utils::Gui::openFolderSelect(const QString &absolutePath)
|
||||
{
|
||||
const QString path = Utils::Fs::toUniformPath(absolutePath);
|
||||
QString path {Utils::Fs::toUniformPath(absolutePath)};
|
||||
const QFileInfo pathInfo {path};
|
||||
// If the item to select doesn't exist, try to open its parent
|
||||
if (!QFileInfo::exists(path)) {
|
||||
if (!pathInfo.exists(path)) {
|
||||
openPath(path.left(path.lastIndexOf('/')));
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
HRESULT hresult = ::CoInitializeEx(nullptr, COINIT_MULTITHREADED);
|
||||
PIDLIST_ABSOLUTE pidl = ::ILCreateFromPathW(reinterpret_cast<PCTSTR>(Utils::Fs::toNativePath(path).utf16()));
|
||||
|
@ -200,6 +202,8 @@ void Utils::Gui::openFolderSelect(const QString &absolutePath)
|
|||
}
|
||||
else if ((output == "nautilus.desktop") || (output == "org.gnome.Nautilus.desktop")
|
||||
|| (output == "nautilus-folder-handler.desktop")) {
|
||||
if (pathInfo.isDir())
|
||||
path = path.left(path.lastIndexOf('/'));
|
||||
proc.start("nautilus", {"--version"});
|
||||
proc.waitForFinished();
|
||||
const QString nautilusVerStr = QString(proc.readLine()).remove(QRegularExpression("[^0-9.]"));
|
||||
|
@ -210,6 +214,8 @@ void Utils::Gui::openFolderSelect(const QString &absolutePath)
|
|||
proc.startDetached("nautilus", {"--no-desktop", Utils::Fs::toNativePath(path)});
|
||||
}
|
||||
else if (output == "nemo.desktop") {
|
||||
if (pathInfo.isDir())
|
||||
path = path.left(path.lastIndexOf('/'));
|
||||
proc.startDetached("nemo", {"--no-desktop", Utils::Fs::toNativePath(path)});
|
||||
}
|
||||
else if ((output == "konqueror.desktop") || (output == "kfmclient_dir.desktop")) {
|
||||
|
|
Loading…
Reference in a new issue