]> gitweb.stoutner.com Git - PrivacyBrowserPC.git/blob - src/dialogs/SaveDialog.cpp
Add a default folder icon to the edit folder dialog. https://redmine.stoutner.com...
[PrivacyBrowserPC.git] / src / dialogs / SaveDialog.cpp
1 /*
2  * Copyright 2022-2024 Soren Stoutner <soren@stoutner.com>.
3  *
4  * This file is part of Privacy Browser PC <https://www.stoutner.com/privacy-browser-pc>.
5  *
6  * Privacy Browser PC is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * Privacy Browser PC is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Privacy Browser PC.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 // Application headers.
21 #include "SaveDialog.h"
22 #include "ui_SaveDialog.h"
23
24 // KDE Frameworks headers.
25 #include <KLocalizedString>
26
27 // Qt toolkit headers.
28 #include <QMimeDatabase>
29 #include <QPushButton>
30 #include <QShortcut>
31 #include <QStandardPaths>
32
33 SaveDialog::SaveDialog(QWidget *parentWidgetPointer, QUrl &url, QString &mimeTypeString, int totalBytes, QString fileName, bool nativeDownloader) :
34                        QDialog(parentWidgetPointer), downloadUrl(url), suggestedFileName(fileName)
35 {
36     // Set the dialog window title.
37     setWindowTitle(i18nc("The save dialog window title", "Save"));
38
39     // Set the window modality.
40     setWindowModality(Qt::WindowModality::ApplicationModal);
41
42     // Instantiate the save dialog UI.
43     Ui::SaveDialog saveDialogUi;
44
45     // Setup the UI.
46     saveDialogUi.setupUi(this);
47
48     // Get handles for the widgets.
49     QGraphicsView *mimeGraphicsViewPointer = saveDialogUi.mimeGraphicsView;
50     QLabel *urlLabelPointer = saveDialogUi.urlLabel;
51     QLabel *filetypeLabelPointer = saveDialogUi.fileTypeLabel;
52     QLabel *mimeTypeLabelPointer = saveDialogUi.mimeTypeLabel;
53     QLabel *sizeLabelPointer = saveDialogUi.sizeLabel;
54     QDialogButtonBox *dialogButtonBoxPointer = saveDialogUi.dialogButtonBox;
55     QPushButton *saveButtonPointer = dialogButtonBoxPointer->button(QDialogButtonBox::Save);
56
57     // Get a MIME type database.
58     QMimeDatabase mimeDatabase;
59
60     // Get the MIME type.
61     QMimeType mimeType = mimeDatabase.mimeTypeForName(mimeTypeString);
62
63     // Get the MIME type icon.
64     QIcon mimeTypeIcon = QIcon::fromTheme(mimeType.iconName());
65
66     // Create a graphics scene.
67     QGraphicsScene *mimeGraphicsScenePointer = new QGraphicsScene(this);
68
69     // Set the graphics scene.
70     mimeGraphicsViewPointer->setScene(mimeGraphicsScenePointer);
71
72     // Set the background of the graphics view to be the same as the window
73     mimeGraphicsViewPointer->setBackgroundRole(QPalette::Window);
74
75     // Add the MIME type icon to the scene.
76     mimeGraphicsScenePointer->addPixmap(mimeTypeIcon.pixmap(64, 64));
77
78     // Populate the labels.
79     urlLabelPointer->setText("<b>" + downloadUrl.toString() + "</b>");
80     filetypeLabelPointer->setText("<b>" + mimeType.comment() + "</b>");
81     mimeTypeLabelPointer->setText("<b>" + mimeTypeString + "</b>");
82
83     // Populate the download size label.
84     if (totalBytes == -1)  // The file size is unknown.
85         sizeLabelPointer->setText(i18nc("Unknown download file size.  The bold style should be preserved.", "<b>unknown</b>"));
86     else  // The file size is known.  Format it according to the locale.
87         sizeLabelPointer->setText(ki18nc("Download file size.  The bold style should be preserved.", "<b>%1 bytes</b>").subs(totalBytes).toString());
88
89     // Create the keyboard shortcuts.
90     QShortcut *sShortcutPointer = new QShortcut(QKeySequence(i18nc("The save key shortcut.", "s")), this);
91     QShortcut *cShortcutPointer = new QShortcut(QKeySequence(i18nc("The close key shortcut.", "c")), this);
92     QShortcut *quitShortcutPointer = new QShortcut(QKeySequence::Quit, this);
93
94     // Connect the save buttons.
95     if (nativeDownloader)
96     {
97         // Show the file picker for the native download.
98         connect(saveButtonPointer, SIGNAL(clicked()), this, SLOT(showFilePicker()));
99         connect(sShortcutPointer, SIGNAL(activated()), this, SLOT(showFilePicker()));
100     }
101     else
102     {
103         // Use WebEngine's downloader.
104         connect(saveButtonPointer, SIGNAL(clicked()), this, SLOT(accept()));
105         connect(sShortcutPointer, SIGNAL(activated()), this, SLOT(accept()));
106     }
107
108     // Connect the cancel button.
109     connect(dialogButtonBoxPointer, SIGNAL(rejected()), this, SLOT(reject()));
110     connect(cShortcutPointer, SIGNAL(activated()), this, SLOT(reject()));
111     connect(quitShortcutPointer, SIGNAL(activated()), this, SLOT(reject()));
112 }
113
114 void SaveDialog::showFilePicker()
115 {
116     // Show the file picker dialog.
117     emit useNativeKdeDownloader(downloadUrl, suggestedFileName);
118
119     // Close the dialog.
120     reject();
121 }