X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserPC.git;a=blobdiff_plain;f=src%2Fviews%2FBrowserView.cpp;fp=src%2Fviews%2FBrowserView.cpp;h=2a23d8126ca54b80aa8afdf7747c79be853cacf0;hp=b3f593ff93352a1d023a895207cb5832af21e036;hb=1ce11bc5f6630bf81aa67bdaca411fbea93dc017;hpb=273588ac3f6077b62c1fb2b55b9cdc6b5e200fad diff --git a/src/views/BrowserView.cpp b/src/views/BrowserView.cpp index b3f593f..2a23d81 100644 --- a/src/views/BrowserView.cpp +++ b/src/views/BrowserView.cpp @@ -23,14 +23,20 @@ #include "ui_BrowserView.h" #include "databases/CookiesDatabase.h" #include "databases/DomainsDatabase.h" +#include "dialogs/SaveDialog.h" #include "filters/MouseEventFilter.h" #include "helpers/SearchEngineHelper.h" #include "helpers/UserAgentHelper.h" #include "interceptors/UrlRequestInterceptor.h" #include "windows/BrowserWindow.h" -// Qt framework headers. +// KDE Framework headers. +#include +#include + +// Qt toolkit headers. #include +#include #include #include #include @@ -161,6 +167,9 @@ BrowserView::BrowserView(QWidget *parent) : QWidget(parent) // Set the URL request interceptor. webEngineProfilePointer->setUrlRequestInterceptor(urlRequestInterceptorPointer); + // Handle file downloads. + connect(webEngineProfilePointer, SIGNAL(downloadRequested(QWebEngineDownloadItem *)), this, SLOT(showSaveDialog(QWebEngineDownloadItem *))); + // Reapply the domain settings when the host changes. connect(urlRequestInterceptorPointer, SIGNAL(applyDomainSettings(QString)), this, SLOT(applyDomainSettingsWithoutReloading(QString))); @@ -640,6 +649,54 @@ void BrowserView::refresh() const webEngineViewPointer->reload(); } +void BrowserView::showSaveDialog(QWebEngineDownloadItem *downloadItemPointer) const +{ + // Instantiate the save dialog. + SaveDialog *saveDialogPointer = new SaveDialog(downloadItemPointer); + + // Connect the save button. + connect(saveDialogPointer, SIGNAL(showSaveFilePickerDialog(QUrl &, QString &)), this, SLOT(showSaveFilePickerDialog(QUrl &, QString &))); + + // Show the dialog. + saveDialogPointer->show(); +} + +void BrowserView::showSaveFilePickerDialog(QUrl &downloadUrl, QString &suggestedFileName) +{ + // Create a save file dialog. + QFileDialog *saveFileDialogPointer = new QFileDialog(this, i18nc("Save file dialog caption", "Save File"), QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)); + + // Tell the dialog to use a save button. + saveFileDialogPointer->setAcceptMode(QFileDialog::AcceptSave); + + // Populate the file name from the download item pointer. + saveFileDialogPointer->selectFile(suggestedFileName); + + // Prevent interaction with the parent windows while the dialog is open. + saveFileDialogPointer->setWindowModality(Qt::WindowModal); + + // Process the saving of the file. The save file dialog pointer must be captured directly instead of by reference or nasty crashes occur. + auto saveFile = [saveFileDialogPointer, &downloadUrl] () { + // Get the save location. The dialog box should only allow the selecting of one file location. + QUrl saveLocation = saveFileDialogPointer->selectedUrls().value(0); + + // Create a file copy job. `-1` creates the file with default permissions. + KIO::FileCopyJob *fileCopyJobPointer = KIO::file_copy(downloadUrl, saveLocation, -1, KIO::Overwrite); + + // Set the download job to display any error messages. + fileCopyJobPointer->uiDelegate()->setAutoErrorHandlingEnabled(true); + + // Start the download. + fileCopyJobPointer->start(); + }; + + // Handle clicks on the save button. + connect(saveFileDialogPointer, &QDialog::accepted, this, saveFile); + + // Show the dialog. + saveFileDialogPointer->show(); +} + void BrowserView::toggleDomStorage() const { // Toggle DOM storage.