00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "rviz/frame_manager.h"
00031
00032 #include "rviz/properties/tf_frame_property.h"
00033
00034 namespace rviz
00035 {
00036
00037 const QString TfFrameProperty::FIXED_FRAME_STRING = "<Fixed Frame>";
00038
00039 TfFrameProperty::TfFrameProperty( const QString& name,
00040 const QString& default_value,
00041 const QString& description,
00042 Property* parent,
00043 FrameManager* frame_manager,
00044 bool include_fixed_frame_string,
00045 const char *changed_slot,
00046 QObject* receiver )
00047 : EditableEnumProperty( name, default_value, description, parent, changed_slot, receiver )
00048 , frame_manager_( NULL )
00049 , include_fixed_frame_string_( include_fixed_frame_string )
00050 {
00051
00052 connect( this, SIGNAL( requestOptions( QStringList* )),
00053 this, SLOT( fillFrameList( QStringList* )));
00054 setFrameManager( frame_manager );
00055 }
00056
00057 bool TfFrameProperty::setValue( const QVariant& new_value )
00058 {
00059 QString new_string = new_value.toString();
00060 if( new_string != FIXED_FRAME_STRING )
00061 {
00062 new_string = QString::fromStdString( frame_manager_->getTFClient()->resolve( new_string.toStdString() ));
00063 }
00064 bool result = EditableEnumProperty::setValue( new_string );
00065
00066 return result;
00067 }
00068
00069 void TfFrameProperty::setFrameManager( FrameManager* frame_manager )
00070 {
00071 if( frame_manager_ && include_fixed_frame_string_ )
00072 {
00073 disconnect( frame_manager_, SIGNAL( fixedFrameChanged() ),
00074 this, SLOT( handleFixedFrameChange() ));
00075 }
00076 frame_manager_ = frame_manager;
00077 if( frame_manager_ && include_fixed_frame_string_ )
00078 {
00079 connect( frame_manager_, SIGNAL( fixedFrameChanged() ),
00080 this, SLOT( handleFixedFrameChange() ));
00081 }
00082 }
00083
00084 void TfFrameProperty::fillFrameList( QStringList* frame_list_return )
00085 {
00086 if( !frame_list_return )
00087 {
00088 return;
00089 }
00090 std::vector<std::string> std_frames;
00091 frame_manager_->getTFClient()->getFrameStrings( std_frames );
00092
00093 for( size_t i = 0; i < std_frames.size(); i++ )
00094 {
00095 frame_list_return->append( QString::fromStdString( std_frames[ i ]));
00096 }
00097
00098 frame_list_return->sort();
00099 if( include_fixed_frame_string_ )
00100 {
00101 frame_list_return->push_front( FIXED_FRAME_STRING );
00102 }
00103 }
00104
00105 QString TfFrameProperty::getFrame() const
00106 {
00107 QString frame = getValue().toString();
00108 if( frame == FIXED_FRAME_STRING && frame_manager_ )
00109 {
00110 return QString::fromStdString( frame_manager_->getFixedFrame() );
00111 }
00112 return frame;
00113 }
00114
00115 std::string TfFrameProperty::getFrameStd() const
00116 {
00117 return getFrame().toStdString();
00118 }
00119
00120 void TfFrameProperty::handleFixedFrameChange()
00121 {
00122 if( getValue().toString() == FIXED_FRAME_STRING )
00123 {
00124 Q_EMIT changed();
00125 }
00126 }
00127
00128 }