+/*
+ * Copyright © 2022 Soren Stoutner <soren@stoutner.com>.
+ *
+ * This file is part of Privacy Browser PC <https://www.stoutner.com/privacy-browser-pc>.
+ *
+ * Privacy Browser PC is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Privacy Browser PC is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Privacy Browser PC. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+// Application headers.
+#include "SaveDialog.h"
+#include "ui_SaveDialog.h"
+
+// KDE Frameworks headers.
+#include <KLocalizedString>
+
+// Qt toolkit headers.
+#include <QMimeDatabase>
+#include <QPushButton>
+#include <QShortcut>
+#include <QStandardPaths>
+
+SaveDialog::SaveDialog(QWebEngineDownloadItem *downloadItemPointer)
+{
+ // Set the dialog window title.
+ setWindowTitle(i18nc("The save dialog window title", "Save"));
+
+ // Set the window modality.
+ setWindowModality(Qt::WindowModality::ApplicationModal);
+
+ // Instantiate the save dialog UI.
+ Ui::SaveDialog saveDialogUi;
+
+ // Setup the UI.
+ saveDialogUi.setupUi(this);
+
+ // Get handles for the widgets.
+ QLabel *urlLabelPointer = saveDialogUi.urlLabel;
+ QLabel *filetypeLabelPointer = saveDialogUi.fileTypeLabel;
+ QLabel *mimeTypeLabelPointer = saveDialogUi.mimeTypeLabel;
+ QLabel *sizeLabelPointer = saveDialogUi.sizeLabel;
+ QDialogButtonBox *dialogButtonBoxPointer = saveDialogUi.dialogButtonBox;
+ QPushButton *saveButtonPointer = dialogButtonBoxPointer->button(QDialogButtonBox::Save);
+
+ // Get the URL and the suggested file name.
+ downloadUrl = downloadItemPointer->url();
+ suggestedFileName = downloadItemPointer->suggestedFileName();
+ QString mimeType = downloadItemPointer->mimeType();
+
+ // Get a MIME type database.
+ QMimeDatabase mimeDatabase;
+
+ // Populate the labels.
+ urlLabelPointer->setText("<b>" + downloadUrl.toString() + "</b>");
+ filetypeLabelPointer->setText("<b>" + mimeDatabase.mimeTypeForName(mimeType).comment() + "</b>");
+ mimeTypeLabelPointer->setText("<b>" + mimeType + "</b>");
+
+ // Populate the download size label.
+ if (downloadItemPointer->totalBytes() == -1) // The file size is unknown.
+ sizeLabelPointer->setText(i18nc("Unknown download file size. The bold style should be preserved.", "<b>unknown</b>"));
+ else // The file size is known. Format it according to the locale.
+ sizeLabelPointer->setText(ki18nc("Download file size. The bold style should be preserved.", "<b>%1 bytes</b>").subs(downloadItemPointer->totalBytes()).toString());
+
+ // Connect the buttons.
+ connect(saveButtonPointer, SIGNAL(clicked()), this, SLOT(showFileDialog()));
+ connect(dialogButtonBoxPointer, SIGNAL(rejected()), this, SLOT(reject()));
+
+ // Create the keyboard shortcuts.
+ QShortcut *sShortcutPointer = new QShortcut(QKeySequence(i18nc("The save key shortcut.", "s")), this);
+ QShortcut *cShortcutPointer = new QShortcut(QKeySequence(i18nc("The close key shortcut.", "c")), this);
+
+ // Connect the shortcuts.
+ connect(sShortcutPointer, SIGNAL(activated()), this, SLOT(showFileDialog()));
+ connect(cShortcutPointer, SIGNAL(activated()), this, SLOT(reject()));
+}
+
+void SaveDialog::showFileDialog()
+{
+ // Show the file picker dialog.
+ emit showSaveFilePickerDialog(downloadUrl, suggestedFileName);
+
+ // Close the dialog.
+ reject();
+}