Implement enum support in CachedSettingValue

Enums are stored as strings, that improves configuration file
readability and maintainability. String values are obtained via
QMetaEnum, and since with Qt 5.5 QMetaEnum::fromType() includes a
static_assert, this has to be a safe method.
This commit is contained in:
Eugene Shalygin
2017-07-05 12:19:58 +02:00
parent 8e6df572a8
commit a22d2f0139
5 changed files with 71 additions and 49 deletions

View File

@@ -31,7 +31,6 @@
#include <QApplication>
#include <QDir>
#include <QMenu>
#include <QMetaEnum>
#include <QTreeView>
#include <QStandardItemModel>
#include <QHeaderView>
@@ -43,7 +42,7 @@
#include "base/utils/misc.h"
#include "base/preferences.h"
#include "base/settingsstorage.h"
#include "base/settingvalue.h"
#include "guiiconprovider.h"
#include "searchsortmodel.h"
#include "searchlistdelegate.h"
@@ -51,13 +50,6 @@
#include "searchtab.h"
#include "ui_searchtab.h"
namespace
{
#define SETTINGS_KEY(name) "Search/" name
const QString KEY_FILTER_MODE_SETTING_NAME = SETTINGS_KEY("FilteringMode");
}
SearchTab::SearchTab(SearchWidget *parent)
: QWidget(parent)
, m_ui(new Ui::SearchTab())
@@ -216,15 +208,14 @@ void SearchTab::updateFilter()
{
using Utils::Misc::SizeUnit;
SearchSortModel* filterModel = getCurrentSearchListProxy();
filterModel->enableNameFilter(filteringMode() == OnlyNames);
filterModel->enableNameFilter(filteringMode() == NameFilteringMode::OnlyNames);
// we update size and seeds filter parameters in the model even if they are disabled
filterModel->setSeedsFilter(m_ui->minSeeds->value(), m_ui->maxSeeds->value());
filterModel->setSizeFilter(
sizeInBytes(m_ui->minSize->value(), static_cast<SizeUnit>(m_ui->minSizeUnit->currentIndex())),
sizeInBytes(m_ui->maxSize->value(), static_cast<SizeUnit>(m_ui->maxSizeUnit->currentIndex())));
SettingsStorage::instance()->storeValue(KEY_FILTER_MODE_SETTING_NAME,
m_ui->filterMode->itemData(m_ui->filterMode->currentIndex()));
nameFilteringModeSetting() = filteringMode();
filterModel->invalidate();
updateResultsCount();
@@ -255,14 +246,10 @@ void SearchTab::fillFilterComboBoxes()
m_ui->filterMode->clear();
QMetaEnum nameFilteringModeEnum =
this->metaObject()->enumerator(this->metaObject()->indexOfEnumerator("NameFilteringMode"));
m_ui->filterMode->addItem(tr("Torrent names only"), static_cast<int>(NameFilteringMode::OnlyNames));
m_ui->filterMode->addItem(tr("Everywhere"), static_cast<int>(NameFilteringMode::Everywhere));
m_ui->filterMode->addItem(tr("Torrent names only"), nameFilteringModeEnum.valueToKey(OnlyNames));
m_ui->filterMode->addItem(tr("Everywhere"), nameFilteringModeEnum.valueToKey(Everywhere));
QVariant selectedMode = SettingsStorage::instance()->loadValue(
KEY_FILTER_MODE_SETTING_NAME, nameFilteringModeEnum.valueToKey(OnlyNames));
QVariant selectedMode = static_cast<int>(nameFilteringModeSetting().value());
int index = m_ui->filterMode->findData(selectedMode);
m_ui->filterMode->setCurrentIndex(index == -1 ? 0 : index);
}
@@ -305,9 +292,7 @@ QString SearchTab::statusIconName(SearchTab::Status st)
SearchTab::NameFilteringMode SearchTab::filteringMode() const
{
QMetaEnum metaEnum =
this->metaObject()->enumerator(this->metaObject()->indexOfEnumerator("NameFilteringMode"));
return static_cast<NameFilteringMode>(metaEnum.keyToValue(m_ui->filterMode->itemData(m_ui->filterMode->currentIndex()).toByteArray()));
return static_cast<NameFilteringMode>(m_ui->filterMode->itemData(m_ui->filterMode->currentIndex()).toInt());
}
void SearchTab::loadSettings()
@@ -355,3 +340,9 @@ void SearchTab::displayToggleColumnsMenu(const QPoint&)
saveSettings();
}
}
CachedSettingValue<SearchTab::NameFilteringMode> &SearchTab::nameFilteringModeSetting()
{
static CachedSettingValue<NameFilteringMode> setting("Search/FilteringMode", NameFilteringMode::OnlyNames);
return setting;
}

View File

@@ -31,7 +31,6 @@
#ifndef SEARCHTAB_H
#define SEARCHTAB_H
#include <QVariant> // I don't know why <QMetaType> is not enought for Qt's 4.8.7 moc
#include <QWidget>
#define ENGINE_URL_COLUMN 4
@@ -44,6 +43,8 @@ class QHeaderView;
class QStandardItemModel;
class QVBoxLayout;
template <typename T> class CachedSettingValue;
class SearchSortModel;
class SearchListDelegate;
class SearchWidget;
@@ -59,13 +60,13 @@ class SearchTab: public QWidget
public:
enum NameFilteringMode
enum class NameFilteringMode
{
Everywhere,
OnlyNames
};
Q_ENUMS(NameFilteringMode)
Q_ENUM(NameFilteringMode)
explicit SearchTab(SearchWidget *parent);
~SearchTab();
@@ -106,6 +107,8 @@ private:
static QString statusText(Status st);
static QString statusIconName(Status st);
static CachedSettingValue<NameFilteringMode>& nameFilteringModeSetting();
Ui::SearchTab *m_ui;
QTreeView *m_resultsBrowser;
QStandardItemModel *m_searchListModel;