NAP
portalitemcolor.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 // Local Includes
8 #include "portalitem.h"
9 #include "portalutils.h"
10 
11 // External Includes
12 #include <apivalue.h>
13 #include <apievent.h>
14 #include <parametercolor.h>
15 #include <nap/signalslot.h>
16 
17 namespace nap
18 {
22  template<typename T>
23  class PortalItemColor : public PortalItem
24  {
25  RTTI_ENABLE(PortalItem)
26  public:
27 
33  virtual bool init(utility::ErrorState& error) override;
34 
38  virtual void onDestroy() override;
39 
46  virtual bool processUpdate(const APIEvent& event, utility::ErrorState& error) override;
47 
51  virtual APIEventPtr getDescriptor() const override;
52 
56  virtual APIEventPtr getValue() const override;
57 
62  virtual void onParameterUpdate(T value);
63 
68 
70 
71  private:
72 
76  const std::vector<typename T::value_type> getColorValues() const;
77 
81  bool setColorValues(const std::vector<typename T::value_type>& values, utility::ErrorState& error);
82 
83  T mRetainedValue;
84  };
85 
86 
88  // Portal Item Color Type Definitions
90 
95 
96 
98  // Template Definitions
100 
101  template<typename T>
103  {
104  mRetainedValue = mParameter->mValue;
105  mParameter->valueChanged.connect(mParameterUpdateSlot);
106  return true;
107  }
108 
109  template<typename T>
111  {
112  mParameter->valueChanged.disconnect(mParameterUpdateSlot);
113  }
114 
115  template<typename T>
117  {
118  // No need to send update if retained value stays the same,
119  // e.g. when we changed the parameter from a client update
120  if (mRetainedValue == value)
121  return;
122 
123  mRetainedValue = value;
124  updateSignal(*this);
125  }
126 
127  template<typename T>
129  {
130  // Check for the portal item value argument
131  const APIArgument* arg = event.getArgumentByName(nap::portal::itemValueArgName);
132  if (!error.check(arg != nullptr, "%s: update event missing argument %s", mID.c_str(), nap::portal::itemValueArgName))
133  return false;
134 
135  // Ensure that the argument is an array
136  if (!error.check(arg->isArray(), "%s: expected array for value argument, not %s", mID.c_str(), arg->getValueType().get_name().data()))
137  return false;
138 
139  // Cast the argument to an array of the channel value type
140  const std::vector<typename T::value_type>* values = arg->asArray<typename T::value_type>();
141  if (!error.check(values != nullptr, "%s: expected array of %s for value argument, not %s", mID.c_str(), RTTI_OF(typename T::value_type).get_name().data(), arg->getValueType().get_name().data()))
142  return false;
143 
144  return setColorValues(*values, error);
145  }
146 
147  template<typename T>
149  {
150  APIEventPtr event = std::make_unique<APIEvent>(mParameter->getDisplayName(), mID);
151  event->addArgument<APIString>(nap::portal::itemTypeArgName, get_type().get_name().data());
152  event->addArgument<APIValue<std::vector<typename T::value_type>>>(nap::portal::itemValueArgName, getColorValues());
153  return event;
154  }
155 
156  template<typename T>
158  {
159  APIEventPtr event = std::make_unique<APIEvent>(mParameter->getDisplayName(), mID);
160  event->addArgument<APIValue<std::vector<typename T::value_type>>>(nap::portal::itemValueArgName, getColorValues());
161  return event;
162  }
163 
164  template<typename T>
165  const std::vector<typename T::value_type> PortalItemColor<T>::getColorValues() const
166  {
167  return std::vector<typename T::value_type>(mParameter->mValue.getValues().begin(), mParameter->mValue.getValues().end());
168  }
169 
170  template<typename T>
171  bool PortalItemColor<T>::setColorValues(const std::vector<typename T::value_type>& values, utility::ErrorState& error)
172  {
173  // Ensure we have enough channels
174  int channels = mParameter->mValue.getNumberOfChannels();
175  if (!error.check(values.size() == channels, "%s: expected %i color channels, received %i", mID.c_str(), channels, values.size()))
176  return false;
177 
178  // Update the color trough setValue so the
179  // parameter will trigger an update signal
180  T color;
181  color.setData(values.data());
182  mRetainedValue = color;
183  mParameter->setValue(color);
184  return true;
185  }
186 }
187 
191 #define DEFINE_PORTAL_ITEM_COLOR(Type) \
192  RTTI_BEGIN_CLASS(Type, "Portal color item") \
193  RTTI_PROPERTY("Parameter", &Type::mParameter, nap::rtti::EPropertyMetaData::Required, "Color parameter") \
194  RTTI_END_CLASS
nap::APIValue
Definition: apivalue.h:56
nap::portal::itemValueArgName
constexpr const char * itemValueArgName
Name of the argument containing the portal item value in the portal item message.
Definition: portalutils.h:19
nap::portal::itemTypeArgName
constexpr const char * itemTypeArgName
Name of the argument containing the portal item type in the portal item message.
Definition: portalutils.h:18
nap::APIArgument::getValueType
const rtti::TypeInfo getValueType() const
nap::PortalItemColor::onParameterUpdate
virtual void onParameterUpdate(T value)
Definition: portalitemcolor.h:116
nap::Slot< T >
nap::PortalItemColor::init
virtual bool init(utility::ErrorState &error) override
Definition: portalitemcolor.h:102
nap::rtti::ObjectPtr
Definition: objectptr.h:154
nap::utility::ErrorState
Definition: errorstate.h:19
nap::PortalItemColor::getDescriptor
virtual APIEventPtr getDescriptor() const override
Definition: portalitemcolor.h:148
nap::PortalItem
Definition: portalitem.h:19
nap::APIEventPtr
std::unique_ptr< nap::APIEvent > APIEventPtr
Definition: apievent.h:179
nap::PortalItemColor::mParameterUpdateSlot
Slot< T > mParameterUpdateSlot
Definition: portalitemcolor.h:67
nap::PortalItemColor::onDestroy
virtual void onDestroy() override
Definition: portalitemcolor.h:110
nap::APIArgument::isArray
bool isArray() const
nap::PortalItemColor::mParameter
ResourcePtr< ParameterSimple< T > > mParameter
Property: 'Parameter' the parameter linked to this portal item.
Definition: portalitemcolor.h:69
nap
Definition: templateapp.h:17
nap::APIArgument
Definition: apiargument.h:22
nap::PortalItemColor::getValue
virtual APIEventPtr getValue() const override
Definition: portalitemcolor.h:157
nap::PortalItemColor::processUpdate
virtual bool processUpdate(const APIEvent &event, utility::ErrorState &error) override
Definition: portalitemcolor.h:128
nap::PortalItemColor
Definition: portalitemcolor.h:23
nap::APIArgument::asArray
const std::vector< T > * asArray() const
Definition: apiargument.h:208
nap::APIEvent
Definition: apievent.h:37