diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2016-06-12 23:00:55 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-06-14 18:14:46 +0200 |
commit | 9ed8d925822b2aee15899487e822480abb88541e (patch) | |
tree | b1927153b6d5726c9f84b4a9310796569d3eec8b | |
parent | 0ba585a1d91b812158277c09aa890cedbc080790 (diff) |
compat/options: use traits to prevent slider min/max persistence
Without it, the serialized min and max member vars were set in stone
despite further code changes. Now only the current value is persisted.
Add clamp for cur/min/max slider values.
Store default value as t rather than underlying_t since it's always been
casted anyway.
Add trivial comment, update copyright.
-rw-r--r-- | opentrack-compat/options.cpp | 7 | ||||
-rw-r--r-- | opentrack-compat/options.hpp | 36 |
2 files changed, 37 insertions, 6 deletions
diff --git a/opentrack-compat/options.cpp b/opentrack-compat/options.cpp index 783cf5ec..ba8c7925 100644 --- a/opentrack-compat/options.cpp +++ b/opentrack-compat/options.cpp @@ -253,6 +253,12 @@ slider_value::slider_value(double cur, double min, double max) : min_(min), max_(max) { + if (min_ > max_) + min_ = max_; + if (cur_ > max_) + cur_ = max; + if (cur_ < min_) + cur_ = min_; } slider_value::slider_value(const slider_value& v) : slider_value(v.cur(), v.min(), v.max()) @@ -266,6 +272,7 @@ slider_value::slider_value() : slider_value(0, 0, 0) slider_value& slider_value::operator=(const slider_value& v) { cur_ = v.cur_; + min_ = v.min_; max_ = v.max_; diff --git a/opentrack-compat/options.hpp b/opentrack-compat/options.hpp index e2c04929..17ab093c 100644 --- a/opentrack-compat/options.hpp +++ b/opentrack-compat/options.hpp @@ -1,10 +1,12 @@ -/* Copyright (c) 2013-2015 Stanislaw Halik +/* Copyright (c) 2013-2016 Stanislaw Halik * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. */ +// XXX TODO this header is too long + #pragma once #include <memory> @@ -243,6 +245,27 @@ namespace options { virtual void reload() = 0; }; + namespace detail { + template<typename t> + struct value_get_traits + { + static inline t get(const t& val, const t&) + { + return val; + } + }; + + template<> + struct value_get_traits<slider_value> + { + using t = slider_value; + static inline t get(const t& val, const t& def) + { + return t(val.cur(), def.min(), def.max()); + } + }; + } + template<typename t_> class value : public base_value { @@ -269,7 +292,7 @@ namespace options { static constexpr const Qt::ConnectionType DIRECT_CONNTYPE = Qt::AutoConnection; static constexpr const Qt::ConnectionType SAFE_CONNTYPE = Qt::QueuedConnection; - value(pbundle b, const QString& name, t def) : base_value(b, name), def(static_cast<underlying_t>(def)) + value(pbundle b, const QString& name, t def) : base_value(b, name), def(def) { QObject::connect(b.get(), SIGNAL(reloading()), this, SLOT(reload()), @@ -284,7 +307,10 @@ namespace options { operator t() const { - return static_cast<t>(b->contains(self_name) ? b->get<underlying_t>(self_name) : def); + t val = b->contains(self_name) + ? static_cast<t>(b->get<underlying_t>(self_name)) + : def; + return detail::value_get_traits<t>::get(val, def); } void reload() override @@ -292,7 +318,7 @@ namespace options { *this = static_cast<t>(*this); } private: - underlying_t def; + t def; }; struct OPENTRACK_COMPAT_EXPORT opts @@ -470,8 +496,6 @@ namespace options { slider_value sv(v); - using std::max; - const double sv_max = sv.max(); const double sv_min = sv.min(); const double sv_c = sv_max - sv_min; |