From 796224d73369e55b278aa1be1a13f357b094e49c Mon Sep 17 00:00:00 2001 From: "Frederik “Freso” S. Olesen" Date: Mon, 6 Aug 2018 12:21:02 +0200 Subject: Add new "Open File" right-click dialog for Downloads This enables the user to directly open the downloaded archived/file which can be useful for e.g., inspection of what's inside or if they need to copy files from inside the archive to somewhere else. Saves a step compared to "Show in Folder" and then opening the file. --- src/downloadlistwidget.cpp | 6 ++++++ src/downloadlistwidget.h | 2 ++ src/downloadlistwidgetcompact.cpp | 6 ++++++ src/downloadlistwidgetcompact.h | 2 ++ src/downloadmanager.cpp | 25 +++++++++++++++++++++++++ src/downloadmanager.h | 2 ++ 6 files changed, 43 insertions(+) (limited to 'src') diff --git a/src/downloadlistwidget.cpp b/src/downloadlistwidget.cpp index ad694107..34a90534 100644 --- a/src/downloadlistwidget.cpp +++ b/src/downloadlistwidget.cpp @@ -272,6 +272,11 @@ void DownloadListWidgetDelegate::issueVisitOnNexus() emit visitOnNexus(m_ContextRow); } +void DownloadListWidgetDelegate::issueOpenFile() +{ + emit openFile(m_ContextRow); +} + void DownloadListWidgetDelegate::issueOpenInDownloadsFolder() { emit openInDownloadsFolder(m_ContextRow); @@ -375,6 +380,7 @@ bool DownloadListWidgetDelegate::editorEvent(QEvent *event, QAbstractItemModel * menu.addAction(tr("Visit on Nexus"), this,SLOT(issueVisitOnNexus())); } + menu.addAction(tr("Open File"), this, SLOT(issueOpenFile())); menu.addAction(tr("Show in Folder"), this, SLOT(issueOpenInDownloadsFolder())); menu.addSeparator(); diff --git a/src/downloadlistwidget.h b/src/downloadlistwidget.h index 2dd73e73..fe7f3b22 100644 --- a/src/downloadlistwidget.h +++ b/src/downloadlistwidget.h @@ -72,6 +72,7 @@ signals: void pauseDownload(int index); void resumeDownload(int index); void visitOnNexus(int index); + void openFile(int index); void openInDownloadsFolder(int index); protected: @@ -93,6 +94,7 @@ private slots: void issueRestoreToView(); void issueRestoreToViewAll(); void issueVisitOnNexus(); + void issueOpenFile(); void issueOpenInDownloadsFolder(); void issueCancel(); void issuePause(); diff --git a/src/downloadlistwidgetcompact.cpp b/src/downloadlistwidgetcompact.cpp index 663a224e..710ecadc 100644 --- a/src/downloadlistwidgetcompact.cpp +++ b/src/downloadlistwidgetcompact.cpp @@ -247,6 +247,11 @@ void DownloadListWidgetCompactDelegate::issueVisitOnNexus() emit visitOnNexus(m_ContextIndex.row()); } +void DownloadListWidgetDelegate::issueOpenFile() +{ + emit openFile(m_ContextIndex.row()); +} + void DownloadListWidgetCompactDelegate::issueOpenInDownloadsFolder() { emit openInDownloadsFolder(m_ContextIndex.row()); @@ -361,6 +366,7 @@ bool DownloadListWidgetCompactDelegate::editorEvent(QEvent *event, QAbstractItem }else { menu.addAction(tr("Visit on Nexus"), this, SLOT(issueVisitOnNexus())); } + menu.addAction(tr("Open File"), this, SLOT(issueOpenFile())); menu.addAction(tr("Show in Folder"), this, SLOT(issueOpenInDownloadsFolder())); menu.addSeparator(); menu.addAction(tr("Delete"), this, SLOT(issueDelete())); diff --git a/src/downloadlistwidgetcompact.h b/src/downloadlistwidgetcompact.h index b1b3c617..eb109f29 100644 --- a/src/downloadlistwidgetcompact.h +++ b/src/downloadlistwidgetcompact.h @@ -70,6 +70,7 @@ signals: void pauseDownload(int index); void resumeDownload(int index); void visitOnNexus(int index); + void openFile(int index); void openInDownloadsFolder(int index); protected: @@ -92,6 +93,7 @@ private slots: void issueRestoreToView(); void issueRestoreToViewAll(); void issueVisitOnNexus(); + void issueOpenFile(); void issueOpenInDownloadsFolder(); void issueCancel(); void issuePause(); diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index 33899f46..af32ee71 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -927,6 +927,31 @@ void DownloadManager::visitOnNexus(int index) } } +void DownloadManager::openFile(int index) +{ + if ((index < 0) || (index >= m_ActiveDownloads.size())) { + reportError(tr("VisitNexus: invalid download index %1").arg(index)); + return; + } + QString params = "/select,\""; + QDir path = QDir(m_OutputDirectory); + if (path.exists(getFileName(index))) { + params = params + QDir::toNativeSeparators(getFilePath(index)) + "\""; + + ::ShellExecuteW(nullptr, nullptr, L"open", ToWString(params).c_str(), nullptr, SW_SHOWNORMAL); + return; + } + else if (path.exists(getFileName(index) + ".unfinished")) { + params = params + QDir::toNativeSeparators(getFilePath(index)+".unfinished") + "\""; + + ::ShellExecuteW(nullptr, nullptr, L"open", ToWString(params).c_str(), nullptr, SW_SHOWNORMAL); + return; + } + + ::ShellExecuteW(nullptr, L"open", ToWString(QDir::toNativeSeparators(m_OutputDirectory)).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + return; +} + void DownloadManager::openInDownloadsFolder(int index) { if ((index < 0) || (index >= m_ActiveDownloads.size())) { diff --git a/src/downloadmanager.h b/src/downloadmanager.h index 136ecf2a..e85c8c81 100644 --- a/src/downloadmanager.h +++ b/src/downloadmanager.h @@ -445,6 +445,8 @@ public slots: void visitOnNexus(int index); + void openFile(int index); + void openInDownloadsFolder(int index); void nxmDescriptionAvailable(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID); -- cgit v1.3.1