1 // For license of this file, see <project-root-folder>/LICENSE.md.
2 
3 #include "gui/dialogs/formrestoredatabasesettings.h"
4 
5 #include "exceptions/applicationexception.h"
6 #include "gui/dialogs/formmain.h"
7 #include "gui/guiutilities.h"
8 #include "gui/messagebox.h"
9 #include "miscellaneous/iconfactory.h"
10 
11 #include "QFileDialog"
12 
FormRestoreDatabaseSettings(QWidget & parent)13 FormRestoreDatabaseSettings::FormRestoreDatabaseSettings(QWidget& parent) : QDialog(&parent),
14   m_shouldRestart(false) {
15   m_ui.setupUi(this);
16   m_btnRestart = m_ui.m_buttonBox->addButton(tr("Restart"), QDialogButtonBox::ButtonRole::ActionRole);
17   m_ui.m_lblResult->setStatus(WidgetWithStatus::StatusType::Warning, tr("No operation executed yet."), tr("No operation executed yet."));
18 
19   GuiUtilities::applyDialogProperties(*this, qApp->icons()->fromTheme(QSL("document-import")));
20 
21   connect(m_btnRestart, &QPushButton::clicked, this, [=]() {
22     m_shouldRestart = true;
23     close();
24   });
25   connect(m_ui.m_btnSelectFolder, &QPushButton::clicked, this, [this]() {
26     selectFolder();
27   });
28   connect(m_ui.m_groupDatabase, &QGroupBox::toggled, this, &FormRestoreDatabaseSettings::checkOkButton);
29   connect(m_ui.m_groupSettings, &QGroupBox::toggled, this, &FormRestoreDatabaseSettings::checkOkButton);
30   connect(m_ui.m_buttonBox->button(QDialogButtonBox::StandardButton::Ok), &QPushButton::clicked,
31           this, &FormRestoreDatabaseSettings::performRestoration);
32   selectFolder(qApp->documentsFolder());
33 }
34 
~FormRestoreDatabaseSettings()35 FormRestoreDatabaseSettings::~FormRestoreDatabaseSettings() {
36   qDebug("Destroying FormRestoreDatabaseSettings instance.");
37 }
38 
performRestoration()39 void FormRestoreDatabaseSettings::performRestoration() {
40   m_ui.m_buttonBox->button(QDialogButtonBox::StandardButton::Ok)->setEnabled(false);
41 
42   try {
43     qApp->restoreDatabaseSettings(m_ui.m_groupDatabase->isChecked(),
44                                   m_ui.m_groupSettings->isChecked(),
45                                   m_ui.m_listDatabase->currentRow() >= 0 ? m_ui.m_listDatabase->currentItem()->data(
46                                     Qt::UserRole).toString() : QString(),
47                                   m_ui.m_listSettings->currentRow() >= 0 ? m_ui.m_listSettings->currentItem()->data(
48                                     Qt::UserRole).toString() : QString());
49     m_btnRestart->setEnabled(true);
50     m_ui.m_lblResult->setStatus(WidgetWithStatus::StatusType::Ok, tr("Restoration was initiated. Restart to proceed."),
51                                 tr("You need to restart application for restoration process to finish."));
52   }
53   catch (const ApplicationException& ex) {
54     m_ui.m_lblResult->setStatus(WidgetWithStatus::StatusType::Error, ex.message(),
55                                 tr("Database and/or settings were not copied to restoration directory successully."));
56   }
57 }
58 
checkOkButton()59 void FormRestoreDatabaseSettings::checkOkButton() {
60   m_btnRestart->setEnabled(false);
61   m_ui.m_buttonBox->button(QDialogButtonBox::StandardButton::Ok)->setEnabled(!m_ui.m_lblSelectFolder->label()->text().isEmpty() &&
62                                                                              ((m_ui.m_groupDatabase->isChecked() &&
63                                                                                m_ui.m_listDatabase->currentRow() >= 0) ||
64                                                                               (m_ui.m_groupSettings->isChecked() &&
65                                                                                m_ui.m_listSettings->currentRow() >= 0)));
66 }
67 
selectFolderWithGui()68 void FormRestoreDatabaseSettings::selectFolderWithGui() {
69   selectFolder();
70 }
71 
selectFolder(QString folder)72 void FormRestoreDatabaseSettings::selectFolder(QString folder) {
73   if (folder.isEmpty()) {
74     folder = QFileDialog::getExistingDirectory(this, tr("Select source directory"), m_ui.m_lblSelectFolder->label()->text());
75   }
76 
77   if (!folder.isEmpty()) {
78     m_ui.m_lblSelectFolder->setStatus(WidgetWithStatus::StatusType::Ok, QDir::toNativeSeparators(folder),
79                                       tr("Good source directory is specified."));
80   }
81   else {
82     return;
83   }
84 
85   const QDir selected_folder(folder);
86   const QFileInfoList available_databases = selected_folder.entryInfoList(QStringList() << QSL("*") + BACKUP_SUFFIX_DATABASE,
87                                                                           QDir::Filter::Files |
88                                                                           QDir::Filter::NoDotAndDotDot |
89                                                                           QDir::Filter::Readable |
90                                                                           QDir::Filter::CaseSensitive |
91                                                                           QDir::Filter::NoSymLinks,
92                                                                           QDir::SortFlag::Name);
93   const QFileInfoList available_settings = selected_folder.entryInfoList(QStringList() << QSL("*") + BACKUP_SUFFIX_SETTINGS,
94                                                                          QDir::Filter::Files |
95                                                                          QDir::Filter::NoDotAndDotDot |
96                                                                          QDir::Filter::Readable |
97                                                                          QDir::Filter::CaseSensitive |
98                                                                          QDir::Filter::NoSymLinks,
99                                                                          QDir::SortFlag::Name);
100 
101   m_ui.m_listDatabase->clear();
102   m_ui.m_listSettings->clear();
103 
104   for (const QFileInfo& database_file : available_databases) {
105     QListWidgetItem* database_item = new QListWidgetItem(database_file.fileName(), m_ui.m_listDatabase);
106 
107     database_item->setData(Qt::UserRole, database_file.absoluteFilePath());
108     database_item->setToolTip(QDir::toNativeSeparators(database_file.absoluteFilePath()));
109   }
110 
111   for (const QFileInfo& settings_file : available_settings) {
112     QListWidgetItem* settings_item = new QListWidgetItem(settings_file.fileName(), m_ui.m_listSettings);
113 
114     settings_item->setData(Qt::UserRole, settings_file.absoluteFilePath());
115     settings_item->setToolTip(QDir::toNativeSeparators(settings_file.absoluteFilePath()));
116   }
117 
118   if (!available_databases.isEmpty()) {
119     m_ui.m_listDatabase->setCurrentRow(0);
120   }
121 
122   if (!available_settings.isEmpty()) {
123     m_ui.m_listSettings->setCurrentRow(0);
124   }
125 
126   m_ui.m_groupDatabase->setChecked(!available_databases.isEmpty());
127   m_ui.m_groupSettings->setChecked(!available_settings.isEmpty());
128 }
129