20 #ifndef smtk_attribute_ValueItemDefinition_h
21 #define smtk_attribute_ValueItemDefinition_h
29 #include "smtk/CoreExports.h"
31 #include "smtk/attribute/ItemDefinition.h"
32 #include "smtk/attribute/VoidItemDefinition.h"
48 const std::string& units()
const {
return m_units; }
49 virtual bool setUnits(
const std::string& newUnits);
51 bool isDiscrete()
const {
return !m_discreteValueEnums.empty(); }
52 std::size_t numberOfDiscreteValues()
const {
return m_discreteValueEnums.size(); }
53 const std::string& discreteEnum(std::size_t ith)
const
55 assert(m_discreteValueEnums.size() > ith);
56 return m_discreteValueEnums[ith];
58 bool getEnumIndex(
const std::string& enumVal, std::size_t& index)
const;
59 int defaultDiscreteIndex()
const {
return m_defaultDiscreteIndex; }
60 void setDefaultDiscreteIndex(
int discreteIndex);
62 bool allowsExpressions()
const;
64 std::string expressionType()
const {
return m_expressionType; }
65 void setExpressionType(
const std::string& etype) { m_expressionType = etype; }
70 void buildExpressionItem(
ValueItem* vitem)
const;
71 void buildChildrenItems(
ValueItem* vitem)
const;
73 bool hasDefault()
const {
return m_hasDefault; }
75 virtual bool hasRange()
const = 0;
79 std::size_t numberOfRequiredValues()
const {
return m_numberOfRequiredValues; }
82 bool setNumberOfRequiredValues(std::size_t esize);
87 std::size_t maxNumberOfValues()
const {
return m_maxNumberOfValues; }
90 bool setMaxNumberOfValues(std::size_t esize);
96 bool isExtensible()
const {
return m_isExtensible; }
97 void setIsExtensible(
bool mode);
103 bool hasValueLabels()
const {
return !m_valueLabels.empty(); }
108 bool usingCommonLabel()
const {
return m_useCommonLabel; }
109 void setValueLabel(std::size_t element,
const std::string& elabel);
110 void setCommonValueLabel(
const std::string& elabel);
115 std::string valueLabel(std::size_t element)
const;
116 bool isDiscreteIndexValid(
int index)
const;
117 bool isDiscreteIndexValid(
int index,
const std::set<std::string>& categories)
const;
122 const std::map<std::string, smtk::attribute::ItemDefinitionPtr>& childrenItemDefinitions()
const
128 bool hasChildItemDefinition(
const std::string& itemName)
const
130 return (m_itemDefs.find(itemName) != m_itemDefs.end());
134 bool hasChildItemDefinition(
const std::string& valueName,
const std::string& itemName);
140 void setEnumCategories(
141 const std::string& enumValue,
143 void addEnumCategory(
const std::string& enumValue,
const std::string& cat);
149 void setEnumAdvanceLevel(
const std::string& enumValue,
unsigned int level);
150 void unsetEnumAdvanceLevel(
const std::string& enumValue);
151 unsigned int enumAdvanceLevel(
const std::string& enumValue)
const;
152 bool hasEnumAdvanceLevel(
const std::string& enumValue)
const;
155 return m_valueToAdvanceLevelAssociations;
165 typename smtk::internal::shared_ptr_type<T>::SharedPointerType addItemDefinition(
166 const std::string& idName)
169 typename SharedTypes::SharedPointerType item;
172 if (this->hasChildItemDefinition(idName))
177 item = SharedTypes::RawPointerType::New(idName);
178 m_itemDefs[item->name()] = item;
180 static_cast<ItemDefinition*
>(item.get())->setUnitsSystem(m_unitsSystem);
184 bool addConditionalItem(
const std::string& enumValue,
const std::string& itemName);
185 std::vector<std::string> conditionalItems(
const std::string& enumValue)
const;
188 std::vector<std::string> relevantEnums(
189 bool includeCategories,
190 const std::set<std::string>& testCategories,
191 bool includeReadAccess,
192 unsigned int readAccessLevel)
const;
196 void applyCategories(
199 void applyAdvanceLevels(
200 const unsigned int& readLevelFromParent,
201 const unsigned int& writeLevelFromParent)
override;
203 void setUnitsSystem(
const shared_ptr<units::System>& unitsSystem)
override;
205 virtual void updateDiscreteValue() = 0;
207 bool m_useCommonLabel;
208 std::vector<std::string> m_valueLabels;
209 std::vector<std::string> m_discreteValueEnums;
210 int m_defaultDiscreteIndex;
211 std::size_t m_numberOfRequiredValues;
212 std::size_t m_maxNumberOfValues;
215 std::string m_expressionType;
217 std::map<std::string, smtk::attribute::ItemDefinitionPtr> m_itemDefs;
218 std::map<std::string, std::set<std::string>> m_itemToValueAssociations;
219 std::map<std::string, std::vector<std::string>> m_valueToItemAssociations;
220 std::map<std::string, smtk::attribute::Categories::Set> m_valueToCategoryAssociations;
221 std::map<std::string, unsigned int> m_valueToAdvanceLevelAssociations;
229 inline bool smtk::attribute::ValueItemDefinition::hasChildItemDefinition(
230 const std::string& valueName,
231 const std::string& itemName)
234 if (!this->hasChildItemDefinition(itemName))
239 m_itemToValueAssociations[itemName].find(valueName) !=
240 m_itemToValueAssociations[itemName].end());