| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include <cmath> |
| | #include <limits> |
| | #include <vector> |
| | #include <QCoreApplication> |
| | #include <QDate> |
| | #include <QDesktopServices> |
| | #include <QDir> |
| | #include <QLocale> |
| | #include <QMessageBox> |
| | #include <QSettings> |
| | #include <QUrl> |
| |
|
| | #include <App/Application.h> |
| | #include <App/Document.h> |
| | #include <Gui/DocumentRecovery.h> |
| | #include <Gui/MainWindow.h> |
| |
|
| | #include "DlgSettingsCacheDirectory.h" |
| | #include "ui_DlgSettingsCacheDirectory.h" |
| |
|
| |
|
| | using namespace Gui::Dialog; |
| |
|
| | |
| |
|
| | QString DlgSettingsCacheDirectory::currentSize; |
| |
|
| | DlgSettingsCacheDirectory::DlgSettingsCacheDirectory(QWidget* parent) |
| | : PreferencePage(parent) |
| | , ui(new Ui_DlgSettingsCacheDirectory) |
| | { |
| | ui->setupUi(this); |
| | ui->labelCache->setToolTip(tr("Notify the user if the cache size exceeds the specified limit")); |
| | if (currentSize.isEmpty()) { |
| | currentSize = tr("Unknown"); |
| | } |
| | setCurrentCacheSize(currentSize); |
| |
|
| | QString path = QString::fromStdString(App::Application::getUserCachePath()); |
| | ui->cacheLocation->setText(path); |
| |
|
| | ui->comboBoxLimit->addItem(QStringLiteral("100 MB"), 100); |
| | ui->comboBoxLimit->addItem(QStringLiteral("300 MB"), 300); |
| | ui->comboBoxLimit->addItem(QStringLiteral("500 MB"), 500); |
| | ui->comboBoxLimit->addItem(QStringLiteral("1 GB"), 1024); |
| | ui->comboBoxLimit->addItem(QStringLiteral("2 GB"), 2048); |
| | ui->comboBoxLimit->addItem(QStringLiteral("3 GB"), 3072); |
| |
|
| | connect(ui->pushButtonCheck, &QPushButton::clicked, this, &DlgSettingsCacheDirectory::runCheck); |
| | connect(ui->openButton, &QPushButton::clicked, this, &DlgSettingsCacheDirectory::openDirectory); |
| | } |
| |
|
| | DlgSettingsCacheDirectory::~DlgSettingsCacheDirectory() = default; |
| |
|
| | void DlgSettingsCacheDirectory::saveSettings() |
| | { |
| | ApplicationCacheSettings::setCheckPeriod(ui->comboBoxPeriod->currentIndex()); |
| | ApplicationCacheSettings::setCacheSizeLimit(ui->comboBoxLimit->currentData().toUInt()); |
| | } |
| |
|
| | void DlgSettingsCacheDirectory::loadSettings() |
| | { |
| | int period = ApplicationCacheSettings::getCheckPeriod(); |
| | if (period >= 0 && period < ui->comboBoxPeriod->count()) { |
| | ui->comboBoxPeriod->setCurrentIndex(period); |
| | } |
| | unsigned int limit = ApplicationCacheSettings::getCacheSizeLimit(); |
| | int index = ui->comboBoxLimit->findData(limit); |
| |
|
| | |
| | if (index < 0) { |
| | ui->comboBoxLimit->addItem(QStringLiteral("%1 MB").arg(limit), limit); |
| | index = ui->comboBoxLimit->count() - 1; |
| | } |
| | ui->comboBoxLimit->setCurrentIndex(index); |
| | } |
| |
|
| | void DlgSettingsCacheDirectory::resetSettingsToDefaults() |
| | { |
| | ParameterGrp::handle hGrp; |
| | hGrp = WindowParameter::getDefaultParameter()->GetGroup("CacheDirectory"); |
| | |
| | hGrp->RemoveUnsigned("Limit"); |
| | |
| | hGrp->RemoveInt("Period"); |
| |
|
| | |
| | PreferencePage::resetSettingsToDefaults(); |
| | } |
| |
|
| | void DlgSettingsCacheDirectory::changeEvent(QEvent* e) |
| | { |
| | if (e->type() == QEvent::LanguageChange) { |
| | int period = ui->comboBoxPeriod->currentIndex(); |
| | ui->retranslateUi(this); |
| | ui->comboBoxPeriod->setCurrentIndex(period); |
| | setCurrentCacheSize(currentSize); |
| | } |
| | QWidget::changeEvent(e); |
| | } |
| |
|
| | void DlgSettingsCacheDirectory::setCurrentCacheSize(const QString& str) |
| | { |
| | currentSize = str; |
| | ui->labelCurrentCache->setText(tr("Current cache size: %1").arg(str)); |
| | } |
| |
|
| | void DlgSettingsCacheDirectory::runCheck() |
| | { |
| | Gui::Dialog::ApplicationCache cache; |
| | unsigned int sizeInMB = ui->comboBoxLimit->currentData().toUInt(); |
| | cache.setLimit(ApplicationCache::toBytes(sizeInMB)); |
| | qint64 total = cache.size(); |
| | setCurrentCacheSize(ApplicationCache::toString(total)); |
| |
|
| | |
| | if (cache.performAction(total)) { |
| | total = cache.size(); |
| | setCurrentCacheSize(ApplicationCache::toString(total)); |
| | } |
| | } |
| |
|
| | void DlgSettingsCacheDirectory::openDirectory() |
| | { |
| | QString path = QString::fromStdString(App::Application::getUserCachePath()); |
| | QUrl url = QUrl::fromLocalFile(path); |
| | QDesktopServices::openUrl(url); |
| | } |
| |
|
| | |
| |
|
| | ApplicationCache::ApplicationCache() |
| | { |
| | limit = std::pow(1024, 3); |
| | setPeriod(Period::Weekly); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | void ApplicationCache::setPeriod(ApplicationCache::Period period) |
| | { |
| | switch (period) { |
| | case Period::Always: |
| | numDays = -1; |
| | break; |
| | case Period::Daily: |
| | numDays = 1; |
| | break; |
| | case Period::Weekly: |
| | numDays = 7; |
| | break; |
| | case Period::Monthly: |
| | numDays = 31; |
| | break; |
| | case Period::Yearly: |
| | numDays = 365; |
| | break; |
| | case Period::Never: |
| | numDays = std::numeric_limits<int>::max(); |
| | break; |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | void ApplicationCache::setLimit(qint64 value) |
| | { |
| | limit = value; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | bool ApplicationCache::periodicCheckOfSize() const |
| | { |
| | QString vendor = QString::fromLatin1(App::Application::Config()["ExeVendor"].c_str()); |
| | QString application = QString::fromStdString(App::Application::getExecutableName()); |
| |
|
| | QSettings settings(vendor, application); |
| | QString key = QStringLiteral("LastCacheCheck"); |
| | QDate date = settings.value(key).toDate(); |
| | QDate now = QDate::currentDate(); |
| |
|
| | |
| | int days = date.daysTo(now); |
| | if (date.isNull()) { |
| | days = 1000; |
| | } |
| |
|
| | if (days >= numDays) { |
| | settings.setValue(key, now); |
| | return true; |
| | } |
| |
|
| | return false; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | bool ApplicationCache::performAction(qint64 total) |
| | { |
| | bool performed = false; |
| | if (total > limit) { |
| | QString path = QString::fromStdString(App::Application::getUserCachePath()); |
| | QMessageBox msgBox(Gui::getMainWindow()); |
| | msgBox.setIcon(QMessageBox::Warning); |
| | msgBox.setWindowTitle(tr("Cache Directory")); |
| |
|
| | QString hint = tr("The cache directory %1 exceeds the size of %2.") |
| | .arg(path, ApplicationCache::toString(limit)); |
| | QString ask = tr("Clear it now?"); |
| | QString warn = tr("Warning: Make sure that this is the only running %1 instance " |
| | "and that no documents are opened as this may result into data loss!") |
| | .arg(QCoreApplication::applicationName()); |
| |
|
| | msgBox.setText(QStringLiteral("%1 %2\n\n\n%3").arg(hint, ask, warn)); |
| | msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Open); |
| | msgBox.setDefaultButton(QMessageBox::No); |
| |
|
| | while (true) { |
| | int ret = msgBox.exec(); |
| | if (ret == QMessageBox::Open) { |
| | QUrl url = QUrl::fromLocalFile(path); |
| | QDesktopServices::openUrl(url); |
| | } |
| | else { |
| | if (ret == QMessageBox::Yes) { |
| | clearDirectory(path); |
| | performed = true; |
| | } |
| | break; |
| | } |
| | } |
| | } |
| |
|
| | return performed; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | qint64 ApplicationCache::size() const |
| | { |
| | qint64 total = dirSize(QString::fromStdString(App::Application::getUserCachePath())); |
| | return total; |
| | } |
| |
|
| | |
| | |
| | |
| | void ApplicationCache::clearDirectory(const QString& path) |
| | { |
| | |
| | QDir tmp = QString::fromUtf8(App::Application::getUserCachePath().c_str()); |
| | tmp.setNameFilters(QStringList() << QStringLiteral("*.lock")); |
| | tmp.setFilter(QDir::Files); |
| |
|
| | QList<QFileInfo> dirs; |
| | std::vector<App::Document*> docs = App::GetApplication().getDocuments(); |
| | for (auto it : docs) { |
| | QDir dir(QString::fromStdString(it->TransientDir.getStrValue())); |
| | QFileInfo fi(dir.absolutePath()); |
| | dirs.append(fi); |
| | } |
| |
|
| | DocumentRecoveryCleaner cleaner; |
| | cleaner.setIgnoreFiles(tmp.entryList()); |
| | cleaner.setIgnoreDirectories(dirs); |
| | cleaner.clearDirectory(QFileInfo(path)); |
| | } |
| |
|
| | |
| | |
| | |
| | qint64 ApplicationCache::dirSize(QString dirPath) const |
| | { |
| | qint64 total = 0; |
| | QDir dir(dirPath); |
| |
|
| | QDir::Filters fileFilters = QDir::Files; |
| | const auto& files = dir.entryList(fileFilters); |
| | for (const QString& filePath : files) { |
| | QFileInfo fi(dir, filePath); |
| | total += fi.size(); |
| | } |
| |
|
| | |
| | QDir::Filters dirFilters = QDir::Dirs | QDir::NoDotAndDotDot; |
| | const auto& dirs = dir.entryList(dirFilters); |
| | for (const QString& subDirPath : dirs) { |
| | total += dirSize(dirPath + QDir::separator() + subDirPath); |
| | } |
| | return total; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void ApplicationCache::applyUserSettings() |
| | { |
| | int period = ApplicationCacheSettings::getCheckPeriod(); |
| | setPeriod(static_cast<Period>(period)); |
| |
|
| | unsigned int sizeInMB = ApplicationCacheSettings::getCacheSizeLimit(); |
| | setLimit(ApplicationCache::toBytes(sizeInMB)); |
| | } |
| |
|
| | qint64 ApplicationCache::toBytes(unsigned int sizeInMB) |
| | { |
| | qint64 value = static_cast<qint64>(sizeInMB) * 1024 * 1024; |
| | return value; |
| | } |
| |
|
| | QString ApplicationCache::toString(qint64 size) |
| | { |
| | QStringList units |
| | = {QStringLiteral("Bytes"), QStringLiteral("KB"), QStringLiteral("MB"), QStringLiteral("GB")}; |
| | int i; |
| | double outputSize = size; |
| | for (i = 0; i < units.size() - 1; i++) { |
| | if (outputSize < 1024) { |
| | break; |
| | } |
| | outputSize /= 1024; |
| | } |
| |
|
| | return QStringLiteral("%1 %2").arg(QLocale().toString(outputSize, 'f', 2), units[i]); |
| | } |
| |
|
| | |
| |
|
| | unsigned int ApplicationCacheSettings::getCacheSizeLimit() |
| | { |
| | ParameterGrp::handle hGrp = WindowParameter::getDefaultParameter()->GetGroup("CacheDirectory"); |
| | return hGrp->GetUnsigned("Limit", 500); |
| | } |
| |
|
| | void ApplicationCacheSettings::setCacheSizeLimit(unsigned int limit) |
| | { |
| | ParameterGrp::handle hGrp = WindowParameter::getDefaultParameter()->GetGroup("CacheDirectory"); |
| | hGrp->SetUnsigned("Limit", limit); |
| | } |
| |
|
| | int ApplicationCacheSettings::getCheckPeriod() |
| | { |
| | ParameterGrp::handle hGrp = WindowParameter::getDefaultParameter()->GetGroup("CacheDirectory"); |
| | return hGrp->GetInt("Period", static_cast<int>(ApplicationCache::Period::Weekly)); |
| | } |
| |
|
| | void ApplicationCacheSettings::setCheckPeriod(int period) |
| | { |
| | ParameterGrp::handle hGrp = WindowParameter::getDefaultParameter()->GetGroup("CacheDirectory"); |
| | hGrp->SetInt("Period", period); |
| | } |
| |
|
| |
|
| | #include "moc_DlgSettingsCacheDirectory.cpp" |
| |
|