22#include "cc_tools_qt/details/ToolsFieldBase.h"
23#include "cc_tools_qt/field/ToolsVariantField.h"
25#include "comms/field/Variant.h"
40template <
typename TField>
41class ToolsVariantFieldImpl :
public ToolsFieldBase<cc_tools_qt::field::ToolsVariantField, TField>
43 using Base = ToolsFieldBase<cc_tools_qt::field::ToolsVariantField, TField>;
45 static_assert(comms::field::isVariant<Field>(),
"Must be of Variant field type");
46 static_assert(!Field::hasFixedValue(),
"Fixed value variants are not supported");
49 using Ptr =
typename Base::Ptr;
50 using ActPtr =
typename Base::ActPtr;
52 explicit ToolsVariantFieldImpl(Field& fieldRef)
57 ToolsVariantFieldImpl(
const ToolsVariantFieldImpl&) =
default;
58 ToolsVariantFieldImpl(ToolsVariantFieldImpl&&) =
default;
59 virtual ~ToolsVariantFieldImpl() noexcept = default;
61 ToolsVariantFieldImpl& operator=(const ToolsVariantFieldImpl&) = delete;
64 virtual Ptr cloneImpl()
override
66 return ActPtr(
new ToolsVariantFieldImpl(Base::field()));
69 virtual int getCurrentIndexImpl()
const override
71 if (!Base::field().currentFieldValid()) {
75 return static_cast<int>(Base::field().currentField());
78 virtual void setCurrentIndexImpl(
int index)
override
81 Base::field().reset();
85 Base::field().selectField(
static_cast<std::size_t
>(index));
88 virtual int getMembersCountImpl()
const override
92 std::tuple_size<typename Base::Field::Members>::value);
95 virtual QStringList membersNamesImpl()
const override
98 comms::util::tupleForEachType<typename Field::Members>(MembersNameHelper(names));
103 class MembersNameHelper
106 explicit MembersNameHelper(QStringList& names) : m_names(names) {}
108 template <
typename TFieldType>
111 m_names.append(TFieldType::name());
115 QStringList& m_names;
120template <
typename TField>
121auto makeVariantField(TField& field)
123 return std::make_unique<ToolsVariantFieldImpl<TField>>(field);