refs #759, #761 Track when a cache value notify slot is a member function to avoid duplicate calls.

This commit is contained in:
Mathew Sutcliffe
2016-09-09 17:48:56 +01:00
committed by Roland Winklmeier
parent ad0a7f9526
commit aeb15ea7be
4 changed files with 10 additions and 7 deletions

View File

@@ -367,7 +367,7 @@ namespace BlackMisc
{
using U = typename Private::TClassOfPointerToMember<F>::type;
Q_ASSERT_X(m_page.parent()->inherits(U::staticMetaObject.className()), Q_FUNC_INFO, "Slot is member function of wrong class");
m_page.setNotifySlot(m_element, [slot](QObject *obj) { Private::invokeSlot(slot, static_cast<U *>(obj)); });
m_page.setNotifySlot(m_element, { [slot](QObject *obj) { Private::invokeSlot(slot, static_cast<U *>(obj)); }, makeId(slot) });
}
//! Read the current value.
@@ -419,6 +419,11 @@ namespace BlackMisc
static Private::CValuePage::Validator wrap(F func) { return [func](const CVariant &value)->bool { return func(value.to<T>()); }; }
static Private::CValuePage::Validator wrap(std::nullptr_t) { return {}; }
template <typename F>
static auto makeId(F &&) { return nullptr; }
template <typename U, typename M>
static auto makeId(M U::* slot) { return static_cast<std::tuple_element_t<1, Private::CValuePage::NotifySlot>>(slot); }
const QVariant &getVariant() const { return m_page.getValue(m_element).getQVariant(); }
QVariant getVariantCopy() const { return m_page.getValueCopy(m_element).getQVariant(); }
bool isValid() const { return m_page.isValid(m_element, qMetaTypeId<T>()); }