display_wrapper.cpp
Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2009, Willow Garage, Inc.
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions are met:
00007  *
00008  *     * Redistributions of source code must retain the above copyright
00009  *       notice, this list of conditions and the following disclaimer.
00010  *     * Redistributions in binary form must reproduce the above copyright
00011  *       notice, this list of conditions and the following disclaimer in the
00012  *       documentation and/or other materials provided with the distribution.
00013  *     * Neither the name of the Willow Garage, Inc. nor the names of its
00014  *       contributors may be used to endorse or promote products derived from
00015  *       this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00018  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00021  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00022  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00023  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00024  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00025  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00026  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00027  * POSSIBILITY OF SUCH DAMAGE.
00028  */
00029 
00030 #include "display_wrapper.h"
00031 #include "display.h"
00032 #include "visualization_manager.h"
00033 // #include "plugin/display_type_info.h"
00034 // #include "plugin/plugin.h"
00035 // #include "plugin/display_creator.h"
00036 #include "properties/property_manager.h"
00037 #include "properties/property.h"
00038 
00039 #include <ros/assert.h>
00040 
00041 #include "config.h"
00042 
00043 namespace rviz
00044 {
00045 
00046 DisplayWrapper::DisplayWrapper( const std::string& class_lookup_name,
00047                                 pluginlib::ClassLoader<Display>* class_loader,
00048                                 const std::string& name,
00049                                 VisualizationManager* manager )
00050 : manager_(manager)
00051 , class_loader_( class_loader )
00052 , name_(name)
00053 , class_lookup_name_(class_lookup_name)
00054 , display_(0)
00055 , property_manager_(0)
00056 , enabled_(true)
00057 {
00058   connect( manager, SIGNAL( displaysConfigLoaded( const boost::shared_ptr<Config>& )),
00059            this, SLOT( onDisplaysConfigLoaded( const boost::shared_ptr<Config>& )));
00060   connect( manager, SIGNAL( displaysConfigSaved( const boost::shared_ptr<Config>& )),
00061            this, SLOT( onDisplaysConfigSaved( const boost::shared_ptr<Config>& )));
00062 }
00063 
00064 DisplayWrapper::~DisplayWrapper()
00065 {
00066   destroyDisplay();
00067 
00068   if (property_manager_)
00069   {
00070     property_manager_->deleteProperty(category_.lock());
00071   }
00072 }
00073 
00074 void DisplayWrapper::setName( const std::string& name )
00075 {
00076   std::string old_name = name_;
00077   name_ = name;
00078   M_string new_props;
00079   if (display_)
00080   {
00081     display_->setName(name);
00082 
00083     if (config_)
00084     {
00085       for( Config::Iterator ci = config_->begin(); ci != config_->end(); )
00086       {
00087         std::string key = (*ci).first;
00088         std::string value = (*ci).second;
00089 
00090         ci++; // Advance the iterator before possibly removing the item it points to.
00091 
00092         if( key.find( old_name + "." ) == 0 )
00093         {
00094           std::string new_key = name + key.substr( old_name.size() + 1 );
00095           config_->set( new_key, value );
00096           config_->unset( key );
00097 
00098           new_props[ key ] = value;
00099         }
00100       }
00101     }
00102 
00103     if (property_manager_)
00104     {
00105       property_manager_->changePrefix(old_name + ".", name + ".");
00106     }
00107   }
00108   else
00109   {
00110     M_string::iterator it = properties_.begin();
00111     M_string::iterator end = properties_.end();
00112     for (; it != end; ++it)
00113     {
00114       const std::string& key = it->first;
00115       const std::string& val = it->second;
00116 
00117       std::string new_key = name + "." + key.substr( old_name.size() + 1 );
00118       new_props[new_key] = val;
00119 
00120       if (config_)
00121       {
00122         config_->unset( key );
00123         config_->set( new_key, val );
00124       }
00125     }
00126   }
00127 
00128   properties_ = new_props;
00129 }
00130 
00131 void DisplayWrapper::loadProperties()
00132 {
00133   if (!config_)
00134   {
00135     return;
00136   }
00137 
00138   properties_.clear();
00139 
00140   for( Config::Iterator ci = config_->begin(); ci != config_->end(); ci++ )
00141   {
00142     std::string name = (*ci).first;
00143     std::string value = (*ci).second;
00144 
00145     if( name.find( name_ + "." ) == 0 )
00146     {
00147       properties_[ name ] = value;
00148     }
00149   }
00150 }
00151 
00152 void DisplayWrapper::onDisplaysConfigLoaded(const boost::shared_ptr<Config>& config)
00153 {
00154   config_ = config;
00155 
00156   loadProperties();
00157 }
00158 
00159 void DisplayWrapper::onDisplaysConfigSaved(const boost::shared_ptr<Config>& config)
00160 {
00161   if (display_)
00162   {
00163     return;
00164   }
00165 
00166   M_string::iterator it = properties_.begin();
00167   M_string::iterator end = properties_.end();
00168   for (; it != end; ++it)
00169   {
00170     const std::string& name = it->first;
00171     const std::string& value = it->second;
00172     config->set(name, value);
00173   }
00174 }
00175 
00176 bool DisplayWrapper::isLoaded() const
00177 {
00178   return display_ != 0;
00179 }
00180 
00181 void DisplayWrapper::createDisplay()
00182 {
00183   if( display_ )
00184   {
00185     return;
00186   }
00187 
00188   Q_EMIT displayCreating( this );
00189 
00190   try
00191   {
00192     display_ = class_loader_->createClassInstance( class_lookup_name_ );
00193   }
00194   catch( pluginlib::PluginlibException& ex )
00195   {
00196     ROS_ERROR( "The plugin for class '%s' failed to load.  Error: %s",
00197                class_lookup_name_.c_str(), ex.what() );
00198   }
00199 
00200   if (display_)
00201   {
00202     display_->initialize( name_, manager_ );
00203     if (property_manager_)
00204     {
00205       display_->setPropertyManager( property_manager_, category_ );
00206     }
00207 
00208     Q_EMIT displayCreated( this );
00209   }
00210 }
00211 
00212 void DisplayWrapper::destroyDisplay()
00213 {
00214   if (display_)
00215   {
00216     Q_EMIT displayDestroying( this );
00217 
00218     display_->disable(false);
00219     delete display_;
00220     display_ = 0;
00221 
00222     Q_EMIT displayDestroyed( this );
00223   }
00224 }
00225 
00226 //void DisplayWrapper::onPluginLoaded(const PluginStatus& st)
00227 //{
00228 //  ROS_ASSERT(st.plugin == plugin_.get());
00229 //  ROS_ASSERT(display_ == 0);
00230 //
00231 //  createDisplay();
00232 //
00233 //  if (display_)
00234 //  {
00235 //    display_->setEnabled(enabled_, true);
00236 //  }
00237 //}
00238 //
00239 //void DisplayWrapper::onPluginUnloading(const PluginStatus& st)
00240 //{
00241 //  ROS_ASSERT(st.plugin == plugin_.get());
00242 //  ROS_ASSERT(display_ != 0);
00243 //
00244 //  loadProperties();
00245 //  destroyDisplay();
00246 //}
00247 
00248 bool DisplayWrapper::isEnabled()
00249 {
00250   if (display_)
00251   {
00252     return display_->isEnabled();
00253   }
00254 
00255   return enabled_;
00256 }
00257 
00258 void DisplayWrapper::setEnabled(bool enabled)
00259 {
00260   if (display_)
00261   {
00262     display_->setEnabled(enabled, false);
00263   }
00264 
00265   enabled_ = enabled;
00266 
00267   propertyChanged(category_);
00268 }
00269 
00270 void DisplayWrapper::setPropertyManager(PropertyManager* property_manager, const CategoryPropertyWPtr& parent)
00271 {
00272   ROS_ASSERT(!property_manager_);
00273 
00274   property_manager_ = property_manager;
00275 
00276   category_ = property_manager_->createCheckboxCategory( getName(), "Enabled", getName() + ".", boost::bind( &DisplayWrapper::isEnabled, this ),
00277                                                          boost::bind( &DisplayWrapper::setEnabled, this, _1 ), parent, this );
00278 
00279   std::string help_description = class_loader_->getClassDescription( class_lookup_name_ );
00280   setPropertyHelpText(category_, help_description);
00281 
00282   if (display_)
00283   {
00284     display_->setPropertyManager(property_manager, category_);
00285   }
00286 }
00287 
00288 std::string DisplayWrapper::getClassDisplayName() const
00289 {
00290   return class_loader_->getName( class_lookup_name_ );
00291 }
00292 
00293 } // namespace rviz


rviz
Author(s): Dave Hershberger, Josh Faust
autogenerated on Mon Jan 6 2014 11:54:32