summaryrefslogtreecommitdiffhomepage
path: root/options/value.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'options/value.hpp')
-rw-r--r--options/value.hpp166
1 files changed, 32 insertions, 134 deletions
diff --git a/options/value.hpp b/options/value.hpp
index 020cbeea..ebb2096c 100644
--- a/options/value.hpp
+++ b/options/value.hpp
@@ -12,153 +12,59 @@
#include "compat/util.hpp"
-#include "connector.hpp"
#include "bundle.hpp"
#include "slider.hpp"
+#include "base-value.hpp"
+#include "value-traits.hpp"
+
+#include <cstdio>
#include <type_traits>
#include <typeinfo>
#include <typeindex>
+#include <utility>
+
+#include <QVariant>
#include <QString>
#include <QPointF>
#include <QList>
+#include <QMutex>
-#define OPENTRACK_DEFINE_SLOT(t) void setValue(t datum) { store(datum); }
-#define OPENTRACK_DEFINE_SIGNAL(t) void valueChanged(t) const
namespace options {
namespace detail {
-template<typename t> struct value_type_traits { using type = t;};
-template<> struct value_type_traits<QString> { using type = const QString&; };
-template<> struct value_type_traits<slider_value> { using type = const slider_value&; };
-template<typename u> struct value_type_traits<QList<u>>
-{
- using type = const QList<u>&;
-};
-template<typename t> using value_type_t = typename value_type_traits<t>::type;
-}
-
-class OTR_OPTIONS_EXPORT base_value : public QObject
-{
- Q_OBJECT
- friend class ::options::detail::connector;
- using comparator = bool(*)(const QVariant& val1, const QVariant& val2);
-public:
- QString name() const { return self_name; }
- base_value(bundle b, const QString& name, comparator cmp, std::type_index type_idx);
- ~base_value() override;
-signals:
- OPENTRACK_DEFINE_SIGNAL(double);
- OPENTRACK_DEFINE_SIGNAL(float);
- OPENTRACK_DEFINE_SIGNAL(int);
- OPENTRACK_DEFINE_SIGNAL(bool);
- OPENTRACK_DEFINE_SIGNAL(const QString&);
- OPENTRACK_DEFINE_SIGNAL(const slider_value&);
- OPENTRACK_DEFINE_SIGNAL(const QPointF&);
- OPENTRACK_DEFINE_SIGNAL(const QVariant&);
-
- OPENTRACK_DEFINE_SIGNAL(const QList<double>&);
- OPENTRACK_DEFINE_SIGNAL(const QList<float>&);
- OPENTRACK_DEFINE_SIGNAL(const QList<int>&);
- OPENTRACK_DEFINE_SIGNAL(const QList<bool>&);
- OPENTRACK_DEFINE_SIGNAL(const QList<QString>&);
- OPENTRACK_DEFINE_SIGNAL(const QList<slider_value>&);
- OPENTRACK_DEFINE_SIGNAL(const QList<QPointF>&);
-protected:
- bundle b;
- QString self_name;
- comparator cmp;
- std::type_index type_index;
-
- void store(const QVariant& datum)
- {
- b->store_kv(self_name, datum);
- }
-
- template<typename t>
- void store(const t& datum)
- {
- b->store_kv(self_name, QVariant::fromValue(datum));
- }
+OTR_OPTIONS_EXPORT void acct_lookup(bool is_fresh);
-public slots:
- OPENTRACK_DEFINE_SLOT(double)
- OPENTRACK_DEFINE_SLOT(int)
- OPENTRACK_DEFINE_SLOT(bool)
- OPENTRACK_DEFINE_SLOT(const QString&)
- OPENTRACK_DEFINE_SLOT(const slider_value&)
- OPENTRACK_DEFINE_SLOT(const QPointF&)
- OPENTRACK_DEFINE_SLOT(const QVariant&)
-
- OPENTRACK_DEFINE_SLOT(const QList<double>&)
- OPENTRACK_DEFINE_SLOT(const QList<float>&)
- OPENTRACK_DEFINE_SLOT(const QList<int>&)
- OPENTRACK_DEFINE_SLOT(const QList<bool>&)
- OPENTRACK_DEFINE_SLOT(const QList<QString>&)
- OPENTRACK_DEFINE_SLOT(const QList<slider_value>&)
- OPENTRACK_DEFINE_SLOT(const QList<QPointF>&)
-
- virtual void reload() = 0;
- virtual void bundle_value_changed() const = 0;
- virtual void set_to_default() = 0;
-};
+} // ns detail
-namespace detail {
template<typename t>
-struct value_get_traits
+class value final : public base_value
{
- static inline t get(const t& val, const t&)
- {
- return val;
- }
-};
+ using traits = detail::value_traits<t, t, void>;
+ using element_type = typename traits::element_type;
-template<>
-struct value_get_traits<slider_value>
-{
- using t = slider_value;
- static inline t get(const t& val, const t& def)
+ static bool is_equal(const QVariant& val1, const QVariant& val2)
{
- return t(val.cur(), def.min(), def.max());
+ return val1.value<element_type>() == val2.value<element_type>();
}
-};
-template<typename t, typename Enable = void>
-struct value_element_type
-{
- using type = typename std::remove_reference<typename std::remove_cv<t>::type>::type;
-};
-
-// Qt uses int a lot in slots so use it for all enums
-template<typename t>
-struct value_element_type<t, typename std::enable_if<std::is_enum<t>::value>::type>
-{
- using type = int;
-};
-
-template<> struct value_element_type<float, void> { using type = double; };
-
-template<typename t> using value_element_type_t = typename value_element_type<t>::type;
+ OTR_NEVER_INLINE
+ t get() const
+ {
+ if (!b->contains(self_name) || b->get<QVariant>(self_name).type() == QVariant::Invalid)
+ return def;
-}
+ const element_type x(b->get<element_type>(self_name));
-template<typename t>
-class value final : public base_value
-{
- static bool is_equal(const QVariant& val1, const QVariant& val2)
- {
- return val1.value<element_type>() == val2.value<element_type>();
+ return traits::from_value(traits::from_storage(x), def);
}
public:
- using element_type = detail::value_element_type_t<t>;
-
OTR_NEVER_INLINE
t operator=(const t& datum)
{
- const element_type tmp = static_cast<element_type>(datum);
- if (tmp != get())
- store(tmp);
+ if (datum != get())
+ store(traits::to_storage(datum));
return datum;
}
@@ -167,13 +73,12 @@ public:
OTR_NEVER_INLINE
value(bundle b, const QString& name, t def) :
- base_value(b, name, &is_equal, std::type_index(typeid(element_type))), def(def)
+ base_value(b, name, &is_equal, std::type_index(typeid(element_type))),
+ def(def)
{
QObject::connect(b.get(), SIGNAL(reloading()),
this, SLOT(reload()),
DIRECT_CONNTYPE);
- if (!b->contains(name) || b->get<QVariant>(name).type() == QVariant::Invalid)
- *this = def;
}
OTR_NEVER_INLINE
@@ -181,6 +86,7 @@ public:
{
}
+ OTR_NEVER_INLINE
t default_value() const
{
return def;
@@ -193,7 +99,7 @@ public:
}
OTR_NEVER_INLINE
- operator t() const { return get(); }
+ operator t() const { return std::forward<t>(get()); }
OTR_NEVER_INLINE
void reload() override
@@ -201,34 +107,26 @@ public:
*this = static_cast<t>(*this);
}
+ OTR_NEVER_INLINE
void bundle_value_changed() const override
{
- emit valueChanged(static_cast<detail::value_type_t<t>>(get()));
+ emit valueChanged(traits::to_storage(get()));
}
OTR_NEVER_INLINE
t operator()() const
{
- return static_cast<t>(get());
+ return get();
}
template<typename u>
OTR_NEVER_INLINE
u to() const
{
- return static_cast<u>(get());
+ return static_cast<u>(std::forward<t>(get()));
}
private:
- OTR_NEVER_INLINE
- t get() const
- {
- t val = b->contains(self_name)
- ? static_cast<t>(b->get<element_type>(self_name))
- : def;
- return detail::value_get_traits<t>::get(val, def);
- }
-
const t def;
};