17 #ifndef GEPETTO_VIEWER_NODE_PROPERTY_HH 18 #define GEPETTO_VIEWER_NODE_PROPERTY_HH 24 #include <boost/bind.hpp> 25 #include <boost/function.hpp> 26 #include <boost/mpl/if.hpp> 45 template <
typename T>
struct property_type {};
46 template <
typename T>
struct property_type <const T > : property_type<T> {};
47 template <
typename T>
struct property_type < T& > : property_type<T> {};
48 template <>
struct property_type<void > {
static inline std::string to_string () {
return "void" ; } };
49 template <>
struct property_type<bool > {
static inline std::string to_string () {
return "bool" ; } };
50 template <>
struct property_type<int > {
static inline std::string to_string () {
return "int" ; } };
51 template <>
struct property_type<float > {
static inline std::string to_string () {
return "float" ; } };
52 template <>
struct property_type<std::string > {
static inline std::string to_string () {
return "string" ; } };
53 template <>
struct property_type<
osgVector2 > {
static inline std::string to_string () {
return "osgVector2" ; } };
54 template <>
struct property_type<
osgVector3 > {
static inline std::string to_string () {
return "osgVector3" ; } };
55 template <>
struct property_type<
osgVector4 > {
static inline std::string to_string () {
return "osgVector4" ; } };
56 template <>
struct property_type<
Configuration> {
static inline std::string to_string () {
return "Configuration"; } };
58 template <
typename T> QWidget* buildEditor (
Property* property) {
return NULL; }
59 template <> QWidget* buildEditor<bool > (
Property* property);
60 template <> QWidget* buildEditor<int > (
Property* property);
61 template <> QWidget* buildEditor<float > (
Property* property);
62 template <> QWidget* buildEditor<std::string > (
Property* property);
63 template <> QWidget* buildEditor<osgVector2 > (
Property* property);
64 template <> QWidget* buildEditor<osgVector3 > (
Property* property);
65 template <> QWidget* buildEditor<osgVector4 > (
Property* property);
66 template <> QWidget* buildEditor<Configuration> (
Property* property);
76 bool set(
const bool & v);
77 bool set(
const int & v);
78 bool set(
const float & v);
79 bool set(
const std::string & v);
86 bool set(
const double& v);
89 bool set(
const QString& v);
92 bool set(
const QColor& v);
99 bool get(std::string & v);
106 bool get(
double & v);
108 bool get(QString & v);
110 bool get(QColor & v);
113 void valueChanged(
void );
114 void valueChanged(
const bool & v);
115 void valueChanged(
const int & v);
116 void valueChanged(
const float & v);
117 void valueChanged(
const std::string & v);
124 void valueChanged(
const double& v);
126 void valueChanged(
const QString& v);
128 void valueChanged(
const QColor& v);
131 virtual bool hasReadAccess ()
const = 0;
132 virtual bool hasWriteAccess()
const = 0;
134 virtual std::string type() = 0;
136 const std::string&
name ()
const {
return name_; }
146 virtual bool impl_set(
void );
147 virtual bool impl_set(
const bool & v);
148 virtual bool impl_set(
const int & v);
149 virtual bool impl_set(
const float & v);
150 virtual bool impl_set(
const std::string & v);
156 virtual bool impl_get(
void );
157 virtual bool impl_get(
bool & v);
158 virtual bool impl_get(
int & v);
159 virtual bool impl_get(
float & v);
160 virtual bool impl_get(std::string & v);
173 inline void invalidGet()
const {
throw std::logic_error (
"Cannot read property " + name_ +
"."); }
174 inline void invalidSet()
const {
throw std::logic_error (
"Cannot write property " + name_ +
"."); }
180 typedef shared_ptr<VoidProperty>
Ptr_t;
182 static Ptr_t
create (
const std::string& name,
const Function_t& f) {
return Ptr_t(
new VoidProperty(name, f)); }
183 virtual std::string
type() {
return details::property_type<void>::to_string(); }
185 template <
typename Obj,
typename ReturnType>
186 static inline Function_t
memberFunction(Obj* obj, ReturnType (Obj::*mem_func)() ) {
return boost::bind(mem_func, obj); }
187 template <
typename Obj,
typename ReturnType>
188 static inline Function_t
memberFunction(Obj* obj, ReturnType (Obj::*mem_func)()
const) {
return boost::bind(mem_func, obj); }
198 const Function_t&
function ()
const {
return function_; }
199 void function (
const Function_t& f) { function_ = f; }
201 QWidget* guiEditor ();
204 bool impl_get(
void) {
if (!hasReadAccess ()) { invalidGet();
return false; } function_();
return true; }
208 Function_t function_;
211 template <
typename T>
216 typedef shared_ptr<PropertyTpl>
Ptr_t;
218 static Ptr_t
create (
const std::string& name,
const Getter_t& g,
const Setter_t& s) {
return Ptr_t(
new PropertyTpl(name, g, s)); }
219 static Ptr_t
create (
const std::string& name,
const Getter_t& g) {
return Ptr_t(
new PropertyTpl(name, g, Setter_t())); }
220 static Ptr_t
create (
const std::string& name,
const Setter_t& s) {
return Ptr_t(
new PropertyTpl(name, Getter_t(), s)); }
222 virtual std::string
type() {
return details::property_type<T>::to_string(); }
224 template <
typename Obj>
225 static inline Getter_t
getterFromMemberFunction(Obj* obj,
const T& (Obj::*mem_func)()
const) {
return boost::bind(mem_func, obj); }
226 template <
typename Obj>
228 template <
typename Obj>
229 static inline Setter_t
setterFromMemberFunction(Obj* obj,
void (Obj::*mem_func)(
const T&)) {
return boost::bind(mem_func, obj, _1); }
230 template <
typename Obj>
233 template <
typename Obj,
typename RetType>
234 static Ptr_t
create (
const std::string& name, Obj* obj,
235 RetType (Obj::*mem_get)()
const,
236 void (Obj::*mem_set)(
const T&))
238 return create (name, Getter_t(boost::bind(mem_get, obj)),
239 Setter_t(boost::bind(mem_set, obj, _1)));
241 template <
typename Obj,
typename RetType>
242 static Ptr_t
create (
const std::string& name, Obj* obj,
243 RetType (Obj::*mem_get)()
const,
244 void (Obj::*mem_set)(T))
246 return create (name, Getter_t(boost::bind(mem_get, obj)),
247 Setter_t(boost::bind(mem_set, obj, _1)));
249 template <
typename Obj,
typename RetType>
250 static Ptr_t
createRO (
const std::string& name, Obj* obj,
251 RetType (Obj::*mem_get)()
const)
253 return create (name, Getter_t(boost::bind(mem_get, obj)));
255 template <
typename Obj>
256 static Ptr_t
createWO (
const std::string& name, Obj* obj,
257 void (Obj::*mem_set)(
const T&))
259 return create (name, Setter_t(boost::bind(mem_set, obj, _1)));
261 template <
typename Obj,
typename RetType>
262 static Ptr_t
createWO (
const std::string& name, Obj* obj,
263 void (Obj::*mem_set)(T))
265 return create (name, Setter_t(boost::bind(mem_set, obj, _1)));
269 PropertyTpl(
const std::string& name,
const Getter_t& g,
const Setter_t& s)
270 :
Property(name), getter_(g), setter_(s) {}
277 const Getter_t&
getter ()
const {
return getter_; }
278 void getter (
const Getter_t& g) { getter_ = g; }
280 const Setter_t&
setter ()
const {
return setter_; }
281 void setter (
const Setter_t& s) { setter_ = s; }
285 return details::buildEditor<T>(
this);
289 virtual bool impl_set(
const T& value) {
if (!hasWriteAccess()) { invalidSet();
return false; } setter_(value) ;
return true; }
290 virtual bool impl_get( T& value) {
if (!hasReadAccess ()) { invalidGet();
return false; } value = getter_();
return true; }
297 template<
typename Scalar>
303 #if __cplusplus >= 201103L
304 min(std::numeric_limits<Scalar>::lowest()),
306 min(std::numeric_limits<Scalar>::quiet_NaN()),
308 max(std::numeric_limits<Scalar>::max()),
309 step (static_cast<Scalar>(1)),
310 adaptiveDecimal (false)
313 #if __cplusplus >= 201103L 314 inline bool hasMin ()
const {
return min > std::numeric_limits<Scalar>::lowest(); }
316 inline bool hasMin ()
const {
return min == min; }
318 inline bool hasMax ()
const {
return max < std::numeric_limits<Scalar>::max(); }
319 inline bool hasRange()
const {
return hasMin() && hasMax(); }
321 void setRange(
const Scalar& minimum,
const Scalar& maximum)
322 { min = minimum; max = maximum; }
323 void setRange(
const Scalar& minimum,
const Scalar& maximum,
const Scalar& _step)
324 { min = minimum; max = maximum; step = _step;}
327 template <
typename T,
typename RangeT>
332 typedef shared_ptr<RangedPropertyTpl>
Ptr_t;
334 static Ptr_t
create (
const std::string& name,
const Getter_t& g,
const Setter_t& s) {
return Ptr_t(
new RangedPropertyTpl(name, g, s)); }
335 static Ptr_t
create (
const std::string& name,
const Getter_t& g) {
return Ptr_t(
new RangedPropertyTpl(name, g, Setter_t())); }
336 static Ptr_t
create (
const std::string& name,
const Setter_t& s) {
return Ptr_t(
new RangedPropertyTpl(name, Getter_t(), s)); }
338 template <
typename Obj,
typename RetType>
339 static Ptr_t
create (
const std::string& name, Obj* obj,
340 RetType (Obj::*mem_get)()
const,
341 void (Obj::*mem_set)(
const T&))
343 return create (name, Getter_t(boost::bind(mem_get, obj)),
344 Setter_t(boost::bind(mem_set, obj, _1)));
346 template <
typename Obj,
typename RetType>
347 static Ptr_t
create (
const std::string& name, Obj* obj,
348 RetType (Obj::*mem_get)()
const,
349 void (Obj::*mem_set)(T))
351 return create (name, Getter_t(boost::bind(mem_get, obj)),
352 Setter_t(boost::bind(mem_set, obj, _1)));
354 template <
typename Obj,
typename RetType>
355 static Ptr_t
createRO (
const std::string& name, Obj* obj,
356 RetType (Obj::*mem_get)()
const)
358 return create (name, Getter_t(boost::bind(mem_get, obj)));
360 template <
typename Obj>
361 static Ptr_t
createWO (
const std::string& name, Obj* obj,
362 void (Obj::*mem_set)(
const T&))
364 return create (name, Setter_t(boost::bind(mem_set, obj, _1)));
366 template <
typename Obj,
typename RetType>
367 static Ptr_t
createWO (
const std::string& name, Obj* obj,
368 void (Obj::*mem_set)(T))
370 return create (name, Setter_t(boost::bind(mem_set, obj, _1)));
380 template <
typename T>
384 typedef shared_ptr<StoredPropertyTpl>
Ptr_t;
388 virtual std::string
type() {
return details::property_type<T>::to_string(); }
399 return details::buildEditor<T>(
this);
402 const Callback_t&
callback ()
const {
return callback_; }
403 void callback (
const Callback_t& s) { callback_ = s; }
408 bool impl_set(
const T& v) {
bool c (callback_ && value != v); value = v;
if (c) callback_();
return true; }
414 template <
typename T,
typename RangeT>
417 typedef shared_ptr<RangedStoredPropertyTpl>
Ptr_t;
449 int from_string (
const std::string& s);
450 std::string to_string (
const int& v);
462 typedef shared_ptr<EnumProperty>
Ptr_t;
464 static Ptr_t
create (
const std::string& name,
const MetaEnum* type,
const Getter_t& g,
const Setter_t& s) {
return Ptr_t(
new EnumProperty(name, type, g, s)); }
465 virtual std::string
type() {
return "enum"; }
469 : IntProperty(name, g, s), metaEnum_ (type) {}
471 virtual QWidget* guiEditor ();
476 bool impl_set(
const int& value);
480 bool impl_set(
const std::string& value);
483 bool impl_get(
int & v);
486 bool impl_get(std::string & v);
500 Wrapper (PropertyPtr_t p) : p(p.get()), lock(p) {}
509 virtual void setDirty (
bool dirty=
true) = 0;
515 Property* property(
const std::string& name)
const;
519 return property(name)->get();
522 template <
typename T>
525 return property(name)->get(value);
529 template <
typename T>
532 bool res = property(name)->set(value);
533 if (res) this->setDirty();
537 bool hasProperty(
const std::string& name)
const;
545 void addProperty(
const PropertyPtr_t& prop);
548 void addProperty(
const std::string& name,
const PropertyPtr_t& prop);
554 void addProperty(
const std::string& name,
Property* prop);
556 QWidget* guiEditor ();
RangedPropertyTpl< Configuration, float > RangedConfigurationProperty
Definition: node-property.h:441
shared_ptr< StoredPropertyTpl > Ptr_t
Definition: node-property.h:384
boost::function< void(void)> Function_t
Definition: node-property.h:179
static Ptr_t create(const std::string &name, const Getter_t &g)
Definition: node-property.h:335
T value
Definition: node-property.h:405
Range()
Definition: node-property.h:302
const std::string name_
Definition: node-property.h:171
StoredPropertyTpl(const std::string &name)
Definition: node-property.h:390
bool hasReadAccess() const
Definition: node-property.h:195
RangedPropertyTpl< osgVector2, float > RangedVector2Property
Definition: node-property.h:438
static Getter_t getterFromMemberFunction(Obj *obj, T(Obj::*mem_func)() const)
Definition: node-property.h:227
const Getter_t & getter() const
Definition: node-property.h:277
MetaEnum * wireFrameModeEnum()
bool impl_set(void)
Definition: node-property.h:205
static Ptr_t create(const std::string &name)
Definition: node-property.h:386
virtual QWidget * guiEditor()
Definition: node-property.h:397
virtual ~VoidProperty()
Definition: node-property.h:193
bool getProperty(const std::string &name, T &value) const
Definition: node-property.h:523
EnumProperty(const std::string &name, const MetaEnum *type, const Getter_t &g, const Setter_t &s)
Definition: node-property.h:468
shared_ptr< PropertyTpl > Ptr_t
Definition: node-property.h:216
static Function_t memberFunction(Obj *obj, ReturnType(Obj::*mem_func)())
Definition: node-property.h:186
::osg::Vec3f osgVector3
Definition: config-osg.h:109
RangedPropertyTpl< osgVector3, float > RangedVector3Property
Definition: node-property.h:439
static Setter_t setterFromMemberFunction(Obj *obj, void(Obj::*mem_func)(const T &))
Definition: node-property.h:229
static Ptr_t create(const std::string &name, const Getter_t &g, const Setter_t &s)
Definition: node-property.h:334
const std::string & name() const
Definition: node-property.h:136
MetaEnum * glImmediateModeEnum()
bool impl_set(const T &v)
Definition: node-property.h:408
MetaEnum * visibilityModeEnum()
static Ptr_t create(const std::string &name, Obj *obj, RetType(Obj::*mem_get)() const, void(Obj::*mem_set)(T))
Definition: node-property.h:347
Definition: node-property.h:492
Callback_t callback_
Definition: node-property.h:411
void callback(const Callback_t &s)
Definition: node-property.h:403
bool hasWriteAccess() const
Definition: node-property.h:395
RangedPropertyTpl< int > RangedIntProperty
Definition: node-property.h:436
static Ptr_t create(const std::string &name, Obj *obj, RetType(Obj::*mem_get)() const, void(Obj::*mem_set)(T))
Definition: node-property.h:242
void setter(const Setter_t &s)
Definition: node-property.h:281
Definition: node-property.h:415
virtual std::string type()
Definition: node-property.h:465
virtual ~RangedStoredPropertyTpl()
Definition: node-property.h:424
static Ptr_t create(const std::string &name)
Definition: node-property.h:419
Definition: node-property.h:298
::osg::Vec2f osgVector2
Definition: config-osg.h:108
PropertyMap_t properties_
Definition: node-property.h:506
static Ptr_t create(const std::string &name, Obj *obj, RetType(Obj::*mem_get)() const, void(Obj::*mem_set)(const T &))
Definition: node-property.h:234
RangedPropertyTpl< osgVector4, float > RangedVector4Property
Definition: node-property.h:440
static Function_t memberFunction(Obj *obj, ReturnType(Obj::*mem_func)() const)
Definition: node-property.h:188
::osg::Vec4f osgVector4
Definition: config-osg.h:110
shared_ptr< VoidProperty > Ptr_t
Definition: node-property.h:180
static Ptr_t createWO(const std::string &name, Obj *obj, void(Obj::*mem_set)(T))
Definition: node-property.h:367
static Setter_t setterFromMemberFunction(Obj *obj, void(Obj::*mem_func)(T))
Definition: node-property.h:231
Property * p
Definition: node-property.h:497
shared_ptr< EnumProperty > Ptr_t
Definition: node-property.h:462
Definition: node-property.h:41
Definition: node-property.h:495
virtual ~PropertyTpl()
Definition: node-property.h:272
bool hasReadAccess() const
Definition: node-property.h:274
bool hasMax() const
Definition: node-property.h:318
Definition: node-property.h:177
PropertyTpl< osgVector2 > Vector2Property
Definition: node-property.h:431
PropertyTpl< float > FloatProperty
Definition: node-property.h:429
virtual ~StoredPropertyTpl()
Definition: node-property.h:392
static Ptr_t create(const std::string &name, Obj *obj, RetType(Obj::*mem_get)() const, void(Obj::*mem_set)(const T &))
Definition: node-property.h:339
virtual bool impl_get(T &value)
Definition: node-property.h:290
PropertyTpl< std::string > StringProperty
Definition: node-property.h:430
static Ptr_t create(const std::string &name, const MetaEnum *type, const Getter_t &g, const Setter_t &s)
Definition: node-property.h:464
static Ptr_t create(const std::string &name, const Getter_t &g)
Definition: node-property.h:219
Definition: action-search-bar.hh:27
RangedPropertyTpl< float > RangedFloatProperty
Definition: node-property.h:437
virtual QWidget * guiEditor()
Definition: node-property.h:140
shared_ptr< RangedPropertyTpl > Ptr_t
Definition: node-property.h:332
PropertyTpl< int > IntProperty
Definition: node-property.h:428
boost::function< void(const T &)> Setter_t
Definition: node-property.h:330
static Ptr_t create(const std::string &name, const Setter_t &s)
Definition: node-property.h:220
virtual bool impl_set(const T &value)
Definition: node-property.h:289
bool hasWriteAccess() const
Definition: node-property.h:196
bool hasReadAccess() const
Definition: node-property.h:394
Definition: node-property.h:381
shared_ptr< RangedStoredPropertyTpl > Ptr_t
Definition: node-property.h:417
void setRange(const Scalar &minimum, const Scalar &maximum, const Scalar &_step)
Definition: node-property.h:323
Definition: node-property.h:40
virtual QWidget * guiEditor()
Definition: node-property.h:283
RangedPropertyTpl(const std::string &name, const Getter_t &g, const Setter_t &s)
Definition: node-property.h:374
PropertyTpl(const std::string &name, const Getter_t &g, const Setter_t &s)
Definition: node-property.h:269
bool hasMin() const
Definition: node-property.h:316
Scalar step
Definition: node-property.h:299
void getter(const Getter_t &g)
Definition: node-property.h:278
PropertyTpl< bool > BoolProperty
Definition: node-property.h:427
bool impl_get(T &v)
Definition: node-property.h:409
const MetaEnum * metaEnum() const
Definition: node-property.h:466
bool setProperty(const std::string &name, const T &value)
Set a property and set this object as dirty.
Definition: node-property.h:530
const PropertyMap_t & properties() const
Definition: node-property.h:539
bool callVoidProperty(const std::string &name) const
Definition: node-property.h:517
virtual std::string type()
Definition: node-property.h:222
MetaEnum * lightingModeEnum()
PropertyTpl< osgVector3 > Vector3Property
Definition: node-property.h:432
boost::function< T(void)> Getter_t
Definition: node-property.h:215
const Callback_t & callback() const
Definition: node-property.h:402
Definition: config-osg.h:144
boost::function< void()> Callback_t
Definition: node-property.h:383
void setRange(const Scalar &minimum, const Scalar &maximum)
Definition: node-property.h:321
static Ptr_t create(const std::string &name, const Setter_t &s)
Definition: node-property.h:336
Abstract base class for runtime properties of Node.
Definition: node-property.h:71
virtual ~Property()
Definition: node-property.h:169
bool hasWriteAccess() const
Definition: node-property.h:275
VoidProperty(const std::string &name, const Function_t &f)
Definition: node-property.h:190
PropertyTpl< osgVector4 > Vector4Property
Definition: node-property.h:433
const Setter_t & setter() const
Definition: node-property.h:280
static Ptr_t create(const std::string &name, const Function_t &f)
Definition: node-property.h:182
bool hasRange() const
Definition: node-property.h:319
static Ptr_t createWO(const std::string &name, Obj *obj, void(Obj::*mem_set)(const T &))
Definition: node-property.h:256
Property * operator->() const
Definition: node-property.h:501
static Getter_t getterFromMemberFunction(Obj *obj, const T &(Obj::*mem_func)() const)
Definition: node-property.h:225
std::map< std::string, Wrapper > PropertyMap_t
Definition: node-property.h:503
PropertyPtr_t lock
Definition: node-property.h:498
static Ptr_t createRO(const std::string &name, Obj *obj, RetType(Obj::*mem_get)() const)
Definition: node-property.h:250
static Ptr_t createRO(const std::string &name, Obj *obj, RetType(Obj::*mem_get)() const)
Definition: node-property.h:355
static Ptr_t createWO(const std::string &name, Obj *obj, void(Obj::*mem_set)(T))
Definition: node-property.h:262
void invalidSet() const
Definition: node-property.h:174
Definition: node-property.h:458
PropertyTpl< Configuration > ConfigurationProperty
Definition: node-property.h:434
virtual ~RangedPropertyTpl()
Definition: node-property.h:377
static Ptr_t create(const std::string &name, const Getter_t &g, const Setter_t &s)
Definition: node-property.h:218
bool adaptiveDecimal
Definition: node-property.h:300
Wrapper(PropertyPtr_t p)
Definition: node-property.h:500
bool impl_get(void)
Definition: node-property.h:204
void invalidGet() const
Definition: node-property.h:173
boost::function< void(const T &)> Setter_t
Definition: node-property.h:214
Wrapper(Property *p)
Definition: node-property.h:499
boost::function< T(void)> Getter_t
Definition: node-property.h:331
static Ptr_t createWO(const std::string &name, Obj *obj, void(Obj::*mem_set)(const T &))
Definition: node-property.h:361
virtual std::string type()
Definition: node-property.h:183
virtual std::string type()
Definition: node-property.h:388
RangedStoredPropertyTpl(const std::string &name)
Definition: node-property.h:421