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);