20#include "cc_tools_qt/details/ToolsFieldBase.h"
21#include "cc_tools_qt/field/ToolsVariantField.h"
23#include "comms/field/Variant.h"
38template <
typename TField>
39class ToolsVariantFieldImpl :
public ToolsFieldBase<cc_tools_qt::field::ToolsVariantField, TField>
41 using Base = ToolsFieldBase<cc_tools_qt::field::ToolsVariantField, TField>;
43 static_assert(comms::field::isVariant<Field>(),
"Must be of Variant field type");
44 static_assert(!Field::hasFixedValue(),
"Fixed value variants are not supported");
47 using Ptr =
typename Base::Ptr;
48 using ActPtr =
typename Base::ActPtr;
50 explicit ToolsVariantFieldImpl(Field& fieldRef)
55 ToolsVariantFieldImpl(
const ToolsVariantFieldImpl&) =
default;
56 ToolsVariantFieldImpl(ToolsVariantFieldImpl&&) =
default;
57 virtual ~ToolsVariantFieldImpl() noexcept = default;
59 ToolsVariantFieldImpl& operator=(const ToolsVariantFieldImpl&) = delete;
62 virtual Ptr cloneImpl()
override
64 return ActPtr(
new ToolsVariantFieldImpl(Base::field()));
67 virtual int getCurrentIndexImpl()
const override
69 if (!Base::field().currentFieldValid()) {
73 return static_cast<int>(Base::field().currentField());
76 virtual void setCurrentIndexImpl(
int index)
override
79 Base::field().reset();
83 Base::field().selectField(
static_cast<std::size_t
>(index));
86 virtual int getMembersCountImpl()
const override
90 std::tuple_size<typename Base::Field::Members>::value);
93 virtual QStringList membersNamesImpl()
const override
96 comms::util::tupleForEachType<typename Field::Members>(MembersNameHelper(names));
101 class MembersNameHelper
104 explicit MembersNameHelper(QStringList& names) : m_names(names) {}
106 template <
typename TFieldType>
109 m_names.append(TFieldType::name());
113 QStringList& m_names;
118template <
typename TField>
119auto makeVariantField(TField& field)
121 return std::make_unique<ToolsVariantFieldImpl<TField>>(field);