NamespaceConfiguration.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include "Frame/NamespaceConfiguration.h"
  10. #include "Utilities/ROS2Names.h"
  11. #include <AzCore/Serialization/EditContext.h>
  12. #include <AzCore/Serialization/EditContextConstants.inl>
  13. namespace ROS2
  14. {
  15. void NamespaceConfiguration::PopulateNamespace(bool isRoot, AZStd::string entityName)
  16. {
  17. m_isRoot = isRoot;
  18. m_entityName = AZStd::move(entityName);
  19. OnNamespaceStrategySelected();
  20. }
  21. void NamespaceConfiguration::UpdateNamespace()
  22. {
  23. switch(m_namespaceStrategy)
  24. {
  25. case NamespaceStrategy::Empty:
  26. m_namespace = "";
  27. break;
  28. case NamespaceStrategy::Default:
  29. m_namespace = m_isRoot ? ROS2Names::RosifyName(m_entityName) : "";
  30. break;
  31. case NamespaceStrategy::FromEntityName:
  32. m_namespace = ROS2Names::RosifyName(m_entityName);
  33. break;
  34. case NamespaceStrategy::Custom:
  35. // Leave the namespace as is
  36. break;
  37. default:
  38. AZ_Assert(false, "Unhandled namespace strategy");
  39. break;
  40. }
  41. }
  42. AZ::Crc32 NamespaceConfiguration::OnNamespaceStrategySelected()
  43. {
  44. UpdateNamespace();
  45. return AZ::Edit::PropertyRefreshLevels::EntireTree;
  46. }
  47. AZStd::string NamespaceConfiguration::GetNamespace(const AZStd::string& parentNamespace) const
  48. {
  49. if (parentNamespace.empty())
  50. {
  51. return m_namespace;
  52. }
  53. if (m_namespace.empty())
  54. {
  55. return parentNamespace;
  56. }
  57. return ROS2Names::GetNamespacedName(parentNamespace, m_namespace);
  58. }
  59. bool NamespaceConfiguration::IsNamespaceCustom() const
  60. {
  61. return m_namespaceStrategy == NamespaceConfiguration::NamespaceStrategy::Custom;
  62. }
  63. void NamespaceConfiguration::Reflect(AZ::ReflectContext* context)
  64. {
  65. if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  66. {
  67. serializeContext->Class<NamespaceConfiguration>()
  68. ->Version(1)
  69. ->Field("Namespace Strategy", &NamespaceConfiguration::m_namespaceStrategy)
  70. ->Field("Namespace", &NamespaceConfiguration::m_namespace)
  71. ;
  72. if (AZ::EditContext* ec = serializeContext->GetEditContext())
  73. {
  74. ec->Class<NamespaceConfiguration>("Namespace Configuration", "Handles ROS2 namespaces")
  75. ->DataElement(AZ::Edit::UIHandlers::ComboBox, &NamespaceConfiguration::m_namespaceStrategy,
  76. "Namespace strategy", "Determines how namespace for frames and topics is created from the hierarchy")
  77. ->Attribute(AZ::Edit::Attributes::ChangeNotify, &NamespaceConfiguration::OnNamespaceStrategySelected)
  78. ->EnumAttribute(NamespaceConfiguration::NamespaceStrategy::Default, "Default")
  79. ->EnumAttribute(NamespaceConfiguration::NamespaceStrategy::Empty, "Empty")
  80. ->EnumAttribute(NamespaceConfiguration::NamespaceStrategy::FromEntityName, "Generate from entity name")
  81. ->EnumAttribute(NamespaceConfiguration::NamespaceStrategy::Custom, "Custom")
  82. ->DataElement(AZ::Edit::UIHandlers::Default, &NamespaceConfiguration::m_namespace, "Namespace", "Namespace")
  83. ->Attribute(AZ::Edit::Attributes::Visibility, &NamespaceConfiguration::IsNamespaceCustom)
  84. ->Attribute(AZ::Edit::Attributes::ChangeValidate, &ROS2Names::ValidateNamespaceField)
  85. // TODO - hide for now, but desired Editor component behavior would be to show a read only value
  86. ;
  87. }
  88. }
  89. }
  90. } // namespace ROS2