quaternion_property.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012, Willow Garage, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Willow Garage, Inc. nor the names of its
14  * contributors may be used to endorse or promote products derived from
15  * this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #include <QStringList>
31 
34 
35 namespace rviz
36 {
38  const Ogre::Quaternion& default_value,
39  const QString& description,
40  Property* parent,
41  const char* changed_slot,
42  QObject* receiver)
43  : Property(name, QVariant(), description, parent, changed_slot, receiver)
44  , quaternion_(default_value)
45  , ignore_child_updates_(false)
46 {
47  x_ = new Property("X", quaternion_.x, "X coordinate", this);
48  y_ = new Property("Y", quaternion_.y, "Y coordinate", this);
49  z_ = new Property("Z", quaternion_.z, "Z coordinate", this);
50  w_ = new Property("W", quaternion_.w, "W coordinate", this);
51  updateString();
52  connect(x_, SIGNAL(aboutToChange()), this, SLOT(emitAboutToChange()));
53  connect(y_, SIGNAL(aboutToChange()), this, SLOT(emitAboutToChange()));
54  connect(z_, SIGNAL(aboutToChange()), this, SLOT(emitAboutToChange()));
55  connect(w_, SIGNAL(aboutToChange()), this, SLOT(emitAboutToChange()));
56  connect(x_, SIGNAL(changed()), this, SLOT(updateFromChildren()));
57  connect(y_, SIGNAL(changed()), this, SLOT(updateFromChildren()));
58  connect(z_, SIGNAL(changed()), this, SLOT(updateFromChildren()));
59  connect(w_, SIGNAL(changed()), this, SLOT(updateFromChildren()));
60 }
61 
62 bool QuaternionProperty::setQuaternion(const Ogre::Quaternion& new_quaternion)
63 {
64  if (new_quaternion != quaternion_)
65  {
66  Q_EMIT aboutToChange();
67  quaternion_ = new_quaternion;
68  ignore_child_updates_ = true;
73  ignore_child_updates_ = false;
74  updateString();
75  Q_EMIT changed();
76  if (model_)
77  model_->emitDataChanged(this);
78  return true;
79  }
80  return false;
81 }
82 
83 bool QuaternionProperty::setValue(const QVariant& new_value)
84 {
85  QStringList strings = new_value.toString().split(';');
86  if (strings.size() >= 4)
87  {
88  bool x_ok = true;
89  float x = strings[0].toFloat(&x_ok);
90  bool y_ok = true;
91  float y = strings[1].toFloat(&y_ok);
92  bool z_ok = true;
93  float z = strings[2].toFloat(&z_ok);
94  bool w_ok = true;
95  float w = strings[3].toFloat(&w_ok);
96  if (x_ok && y_ok && z_ok && w_ok)
97  {
98  return setQuaternion(Ogre::Quaternion(w, x, y, z));
99  }
100  }
101  return false;
102 }
103 
105 {
107  {
108  quaternion_.x = x_->getValue().toFloat();
109  quaternion_.y = y_->getValue().toFloat();
110  quaternion_.z = z_->getValue().toFloat();
111  quaternion_.w = w_->getValue().toFloat();
112  updateString();
113  Q_EMIT changed();
114  }
115 }
116 
118 {
120  {
121  Q_EMIT aboutToChange();
122  }
123 }
124 
126 {
127  value_ = QString("%1; %2; %3; %4")
128  .arg(quaternion_.x, 0, 'g', 5)
129  .arg(quaternion_.y, 0, 'g', 5)
130  .arg(quaternion_.z, 0, 'g', 5)
131  .arg(quaternion_.w, 0, 'g', 5);
132 }
133 
134 void QuaternionProperty::load(const Config& config)
135 {
136  float x, y, z, w;
137  if (config.mapGetFloat("X", &x) && config.mapGetFloat("Y", &y) && config.mapGetFloat("Z", &z) &&
138  config.mapGetFloat("W", &w))
139  {
140  // Calling setQuaternion() once explicitly is better than letting
141  // the Property class load the X, Y, Z, and W children
142  // independently, which would result in at least 4 calls to
143  // setQuaternion().
144  setQuaternion(Ogre::Quaternion(w, x, y, z));
145  }
146 }
147 
149 {
150  // Saving the child values explicitly avoids having Property::save()
151  // save the summary string version of the property.
152  config.mapSetValue("X", x_->getValue());
153  config.mapSetValue("Y", y_->getValue());
154  config.mapSetValue("Z", z_->getValue());
155  config.mapSetValue("W", w_->getValue());
156 }
157 
159 {
160  Property::setReadOnly(read_only);
161  x_->setReadOnly(read_only);
162  y_->setReadOnly(read_only);
163  z_->setReadOnly(read_only);
164  w_->setReadOnly(read_only);
165 }
166 
167 
168 } // end namespace rviz
void changed()
Emitted by setValue() just after the value has changed.
PropertyTreeModel * model_
Pointer to the PropertyTreeModel managing this property tree.
Definition: property.h:499
virtual bool setValue(const QVariant &new_value)
Set the new value for this property. Returns true if the new value is different from the old value...
Definition: property.cpp:134
A single element of a property tree, with a name, value, description, and possibly children...
Definition: property.h:100
void setReadOnly(bool read_only) override
Overridden from Property to propagate read-only-ness to children.
QVariant value_
This is the central property value. If you set it directly in a subclass, do so with care because man...
Definition: property.h:485
void mapSetValue(const QString &key, QVariant value)
Set a named child to the given value.
Definition: config.cpp:196
Configuration data storage class.
Definition: config.h:124
virtual bool setQuaternion(const Ogre::Quaternion &quaternion)
void save(Config config) const override
Write the value of this property and/or its children into the given Config reference.
bool mapGetFloat(const QString &key, float *value_out) const
Convenience function for looking up a named float.
Definition: config.cpp:256
void load(const Config &config) override
Load the value of this property and/or its children from the given Config node.
Property(const QString &name=QString(), const QVariant default_value=QVariant(), const QString &description=QString(), Property *parent=nullptr, const char *changed_slot=nullptr, QObject *receiver=nullptr)
Constructor.
Definition: property.cpp:58
void aboutToChange()
Emitted by setValue() just before the value has changed.
void emitDataChanged(Property *property)
QuaternionProperty(const QString &name=QString(), const Ogre::Quaternion &default_value=Ogre::Quaternion::IDENTITY, const QString &description=QString(), Property *parent=nullptr, const char *changed_slot=nullptr, QObject *receiver=nullptr)
bool setValue(const QVariant &new_value) override
Set the new value for this property. Returns true if the new value is different from the old value...
virtual QVariant getValue() const
Return the value of this Property as a QVariant. If the value has never been set, an invalid QVariant...
Definition: property.cpp:150
virtual void setReadOnly(bool read_only)
Prevent or allow users to edit this property from a PropertyTreeWidget.
Definition: property.h:436


rviz
Author(s): Dave Hershberger, David Gossow, Josh Faust
autogenerated on Sat May 27 2023 02:06:25