summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2014-09-27 20:58:23 +0200
committerStanislaw Halik <sthalik@misaki.pl>2014-09-27 20:58:23 +0200
commite44bc913ca3d212e5e8eea8c70c47d58c633f335 (patch)
treed736c5ec174b4d3f170cc32579b7538caee9d25a
parent01f1a5f2b9ed1846423eee0336450f32b836536b (diff)
options: move to base class for clarity
-rw-r--r--facetracknoir/options.h35
1 files changed, 19 insertions, 16 deletions
diff --git a/facetracknoir/options.h b/facetracknoir/options.h
index ce705033..291ac071 100644
--- a/facetracknoir/options.h
+++ b/facetracknoir/options.h
@@ -29,6 +29,8 @@
namespace options {
template<typename T>
+ // don't elide usages of the function, qvariant default implicit
+ // conversion results in nonsensical runtime behavior -sh
inline T qcruft_to_t (const QVariant& t);
template<>
@@ -174,16 +176,28 @@ namespace options {
}
};
- typedef std::shared_ptr<impl_bundle> pbundle;
+ using pbundle = std::shared_ptr<impl_bundle>;
class base_value : public QObject {
Q_OBJECT
public:
base_value(pbundle b, const QString& name) : b(b), self_name(name), cookie_snap(0) {}
- protected:
virtual QVariant operator=(const QVariant& datum) = 0;
+ template<typename T>
+ QVariant operator=(const T& datum)
+ {
+ return this->operator =(qVariantFromValue<T>(datum));
+ }
+ protected:
pbundle b;
QString self_name;
+ template<typename T>
+ QVariant store(const T& datum)
+ {
+ b->store(self_name, qVariantFromValue<T>(datum));
+ emit valueChanged(datum);
+ return datum;
+ }
void maybe_lazy_change()
{
long cookie = b->cookie();
@@ -211,33 +225,22 @@ namespace options {
template<typename T>
class value : public base_value {
- protected:
+ public:
QVariant operator=(const QVariant& datum) {
- auto foo = qcruft_to_t<T>(datum);
- b->store(self_name, qVariantFromValue<T>(foo));
- emit valueChanged(foo);
- return datum;
+ return store(qcruft_to_t<T>(datum));
}
- public:
static constexpr const Qt::ConnectionType QT_CONNTYPE = Qt::UniqueConnection;
static constexpr const Qt::ConnectionType OPT_CONNTYPE = Qt::UniqueConnection;
- value(pbundle b, const QString& name, T def) :
- base_value(b, name)
+ value(pbundle b, const QString& name, T def) : base_value(b, name)
{
if (!b->contains(name) || b->get<QVariant>(name).type() == QVariant::Invalid)
- {
this->operator=(qVariantFromValue<T>(def));
- }
}
operator T()
{
maybe_lazy_change();
return b->get<T>(self_name);
}
- QVariant operator=(const T& datum)
- {
- return this->operator =(qVariantFromValue<T>(datum));
- }
};
template<typename T, typename Q>