1 // For license of this file, see <project-root-folder>/LICENSE.md.
2 
3 #include "gui/dialogs/formdatabasecleanup.h"
4 
5 #include "database/databasefactory.h"
6 #include "definitions/definitions.h"
7 #include "gui/guiutilities.h"
8 #include "miscellaneous/application.h"
9 #include "miscellaneous/iconfactory.h"
10 
11 #include <QCloseEvent>
12 #include <QDialogButtonBox>
13 #include <QPushButton>
14 
FormDatabaseCleanup(QWidget * parent)15 FormDatabaseCleanup::FormDatabaseCleanup(QWidget* parent) : QDialog(parent), m_ui(new Ui::FormDatabaseCleanup), m_cleaner(nullptr) {
16   m_ui->setupUi(this);
17 
18   setObjectName(QSL("form_db_cleanup"));
19 
20   GuiUtilities::applyDialogProperties(*this, qApp->icons()->fromTheme(QSL("edit-clear")));
21 
22   connect(m_ui->m_spinDays, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &FormDatabaseCleanup::updateDaysSuffix);
23   connect(m_ui->m_btnBox->button(QDialogButtonBox::StandardButton::Ok), &QPushButton::clicked, this, &FormDatabaseCleanup::startPurging);
24   connect(this, &FormDatabaseCleanup::purgeRequested, &m_cleaner, &DatabaseCleaner::purgeDatabaseData);
25   connect(&m_cleaner, &DatabaseCleaner::purgeStarted, this, &FormDatabaseCleanup::onPurgeStarted);
26   connect(&m_cleaner, &DatabaseCleaner::purgeProgress, this, &FormDatabaseCleanup::onPurgeProgress);
27   connect(&m_cleaner, &DatabaseCleaner::purgeFinished, this, &FormDatabaseCleanup::onPurgeFinished);
28 
29   m_ui->m_spinDays->setValue(DEFAULT_DAYS_TO_DELETE_MSG);
30   m_ui->m_lblResult->setStatus(WidgetWithStatus::StatusType::Information, tr("I am ready."), tr("I am ready."));
31 
32   loadDatabaseInfo();
33 
34   GuiUtilities::restoreState(this,
35                              qApp->settings()->value(GROUP(GUI), objectName(), QByteArray()).toByteArray());
36 }
37 
closeEvent(QCloseEvent * event)38 void FormDatabaseCleanup::closeEvent(QCloseEvent* event) {
39   if (!m_ui->m_btnBox->isEnabled()) {
40     event->ignore();
41   }
42   else {
43     QDialog::closeEvent(event);
44   }
45 }
46 
keyPressEvent(QKeyEvent * event)47 void FormDatabaseCleanup::keyPressEvent(QKeyEvent* event) {
48   if (!m_ui->m_btnBox->isEnabled()) {
49     event->ignore();
50   }
51   else {
52     QDialog::keyPressEvent(event);
53   }
54 }
55 
updateDaysSuffix(int number)56 void FormDatabaseCleanup::updateDaysSuffix(int number) {
57   m_ui->m_spinDays->setSuffix(tr(" day(s)", nullptr, number));
58 }
59 
startPurging()60 void FormDatabaseCleanup::startPurging() {
61   CleanerOrders orders;
62 
63   orders.m_removeRecycleBin = m_ui->m_checkRemoveRecycleBin->isChecked();
64   orders.m_removeOldMessages = m_ui->m_checkRemoveOldMessages->isChecked();
65   orders.m_barrierForRemovingOldMessagesInDays = m_ui->m_spinDays->value();
66   orders.m_removeReadMessages = m_ui->m_checkRemoveReadMessages->isChecked();
67   orders.m_shrinkDatabase = m_ui->m_checkShrink->isEnabled() && m_ui->m_checkShrink->isChecked();
68   orders.m_removeStarredMessages = m_ui->m_checkRemoveStarredMessages->isChecked();
69 
70   emit purgeRequested(orders);
71 }
72 
onPurgeStarted()73 void FormDatabaseCleanup::onPurgeStarted() {
74   m_ui->m_progressBar->setValue(0);
75   m_ui->m_btnBox->setEnabled(false);
76   m_ui->m_lblResult->setStatus(WidgetWithStatus::StatusType::Information, tr("Database cleanup is running."),
77                                tr("Database cleanup is running."));
78 }
79 
onPurgeProgress(int progress,const QString & description)80 void FormDatabaseCleanup::onPurgeProgress(int progress, const QString& description) {
81   m_ui->m_progressBar->setValue(progress);
82   m_ui->m_lblResult->setStatus(WidgetWithStatus::StatusType::Information, description, description);
83 }
84 
onPurgeFinished(bool finished)85 void FormDatabaseCleanup::onPurgeFinished(bool finished) {
86   m_ui->m_progressBar->setValue(100);
87   m_ui->m_btnBox->setEnabled(true);
88 
89   if (finished) {
90     m_ui->m_lblResult->setStatus(WidgetWithStatus::StatusType::Ok,
91                                  tr("Database cleanup is completed."),
92                                  tr("Database cleanup is completed."));
93   }
94   else {
95     m_ui->m_lblResult->setStatus(WidgetWithStatus::StatusType::Error, tr("Database cleanup failed."), tr("Database cleanup failed."));
96   }
97 
98   loadDatabaseInfo();
99 }
100 
loadDatabaseInfo()101 void FormDatabaseCleanup::loadDatabaseInfo() {
102   qint64 data_size = qApp->database()->driver()->databaseDataSize();
103   QString data_size_str = data_size > 0 ? QString::number(data_size / 1000000.0) + QL1S(" MB") : tr("unknown");
104 
105   m_ui->m_txtFileSize->setText(data_size_str);
106   m_ui->m_txtDatabaseType->setText(qApp->database()->driver()->humanDriverType());
107 }
108 
hideEvent(QHideEvent * event)109 void FormDatabaseCleanup::hideEvent(QHideEvent* event) {
110   QByteArray state = GuiUtilities::saveState(this);
111 
112   qApp->settings()->setValue(GROUP(GUI), objectName(), state);
113   QDialog::hideEvent(event);
114 }
115