21#include "cc_tools_qt/details/ToolsFieldBase.h"
22#include "cc_tools_qt/field/ToolsVariantField.h"
24#include "comms/field/Variant.h"
39template <
typename TField>
40class ToolsVariantFieldImpl :
public ToolsFieldBase<cc_tools_qt::field::ToolsVariantField, TField>
42 using Base = ToolsFieldBase<cc_tools_qt::field::ToolsVariantField, TField>;
44 static_assert(comms::field::isVariant<Field>(),
"Must be of Variant field type");
45 static_assert(!Field::hasFixedValue(),
"Fixed value variants are not supported");
48 using Ptr =
typename Base::Ptr;
49 using ActPtr =
typename Base::ActPtr;
51 explicit ToolsVariantFieldImpl(Field& fieldRef)
56 ToolsVariantFieldImpl(
const ToolsVariantFieldImpl&) =
default;
57 ToolsVariantFieldImpl(ToolsVariantFieldImpl&&) =
default;
58 virtual ~ToolsVariantFieldImpl() noexcept = default;
60 ToolsVariantFieldImpl& operator=(const ToolsVariantFieldImpl&) = delete;
63 virtual Ptr cloneImpl()
override
65 return ActPtr(
new ToolsVariantFieldImpl(Base::field()));
68 virtual int getCurrentIndexImpl()
const override
70 if (!Base::field().currentFieldValid()) {
74 return static_cast<int>(Base::field().currentField());
77 virtual void setCurrentIndexImpl(
int index)
override
80 Base::field().reset();
84 Base::field().selectField(
static_cast<std::size_t
>(index));
87 virtual int getMembersCountImpl()
const override
91 std::tuple_size<typename Base::Field::Members>::value);
94 virtual QStringList membersNamesImpl()
const override
97 comms::util::tupleForEachType<typename Field::Members>(MembersNameHelper(names));
102 class MembersNameHelper
105 explicit MembersNameHelper(QStringList& names) : m_names(names) {}
107 template <
typename TFieldType>
110 m_names.append(TFieldType::name());
114 QStringList& m_names;
119template <
typename TField>
120auto makeVariantField(TField& field)
122 return std::make_unique<ToolsVariantFieldImpl<TField>>(field);