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 <QTimer>
00031 #include <QHBoxLayout>
00032 #include <QVBoxLayout>
00033 #include <QPushButton>
00034 #include <QInputDialog>
00035
00036 #include <boost/bind.hpp>
00037
00038 #include "rviz/display_factory.h"
00039 #include "rviz/display.h"
00040 #include "rviz/new_object_dialog.h"
00041 #include "rviz/properties/property.h"
00042 #include "rviz/properties/property_tree_widget.h"
00043 #include "rviz/properties/property_tree_with_help.h"
00044 #include "rviz/visualization_manager.h"
00045
00046 #include "rviz/displays_panel.h"
00047
00048 static const std::string PROPERTY_GRID_CONFIG("Property Grid State");
00049 static const std::string PROPERTY_GRID_SPLITTER("Property Grid Splitter");
00050
00051 namespace rviz
00052 {
00053
00054 DisplaysPanel::DisplaysPanel( QWidget* parent )
00055 : QWidget( parent )
00056 , manager_( NULL )
00057 {
00058 tree_with_help_ = new PropertyTreeWithHelp;
00059 property_grid_ = tree_with_help_->getTree();
00060 property_grid_->setDragEnabled( true );
00061 property_grid_->setAcceptDrops( true );
00062 property_grid_->setAnimated( true );
00063
00064 QPushButton* add_button = new QPushButton( "Add" );
00065 add_button->setShortcut( QKeySequence( QString( "Ctrl+N" )));
00066 add_button->setToolTip( "Add a new display, Ctrl+N" );
00067 remove_button_ = new QPushButton( "Remove" );
00068 remove_button_->setShortcut( QKeySequence( QString( "Ctrl+X" )));
00069 remove_button_->setToolTip( "Remove displays, Ctrl+X" );
00070 remove_button_->setEnabled( false );
00071 rename_button_ = new QPushButton( "Rename" );
00072 rename_button_->setShortcut( QKeySequence( QString( "Ctrl+R" )));
00073 rename_button_->setToolTip( "Rename a display, Ctrl+R" );
00074 rename_button_->setEnabled( false );
00075
00076 QHBoxLayout* button_layout = new QHBoxLayout;
00077 button_layout->addWidget( add_button );
00078 button_layout->addWidget( remove_button_ );
00079 button_layout->addWidget( rename_button_ );
00080
00081 QVBoxLayout* layout = new QVBoxLayout;
00082 layout->addWidget( tree_with_help_ );
00083 layout->addLayout( button_layout );
00084
00085 setLayout( layout );
00086
00087 connect( add_button, SIGNAL( clicked( bool )), this, SLOT( onNewDisplay() ));
00088 connect( remove_button_, SIGNAL( clicked( bool )), this, SLOT( onDeleteDisplay() ));
00089 connect( rename_button_, SIGNAL( clicked( bool )), this, SLOT( onRenameDisplay() ));
00090 connect( property_grid_, SIGNAL( selectionHasChanged() ), this, SLOT( onSelectionChanged() ));
00091 }
00092
00093 DisplaysPanel::~DisplaysPanel()
00094 {
00095 }
00096
00097 void DisplaysPanel::initialize( VisualizationManager* manager )
00098 {
00099 manager_ = manager;
00100 property_grid_->setModel( manager_->getDisplayTreeModel() );
00101 }
00102
00103 void DisplaysPanel::onNewDisplay()
00104 {
00105 QString lookup_name;
00106 QString display_name;
00107
00108 QStringList empty;
00109
00110 NewObjectDialog* dialog = new NewObjectDialog( manager_->getDisplayFactory(),
00111 "Display",
00112 empty, empty,
00113 &lookup_name,
00114 &display_name );
00115 if( dialog->exec() == QDialog::Accepted )
00116 {
00117 manager_->createDisplay( lookup_name, display_name, true );
00118 }
00119 activateWindow();
00120 }
00121
00122 void DisplaysPanel::onDeleteDisplay()
00123 {
00124 QList<Display*> displays_to_delete = property_grid_->getSelectedObjects<Display>();
00125
00126 for( int i = 0; i < displays_to_delete.size(); i++ )
00127 {
00128 delete displays_to_delete[ i ];
00129 }
00130 }
00131
00132 void DisplaysPanel::onSelectionChanged()
00133 {
00134 QList<Display*> displays = property_grid_->getSelectedObjects<Display>();
00135
00136 int num_displays_selected = displays.size();
00137
00138 remove_button_->setEnabled( num_displays_selected > 0 );
00139 rename_button_->setEnabled( num_displays_selected == 1 );
00140 }
00141
00142 void DisplaysPanel::onRenameDisplay()
00143 {
00144 QList<Display*> displays = property_grid_->getSelectedObjects<Display>();
00145 if( displays.size() == 0 )
00146 {
00147 return;
00148 }
00149 Display* display_to_rename = displays[ 0 ];
00150
00151 if( !display_to_rename )
00152 {
00153 return;
00154 }
00155
00156 QString old_name = display_to_rename->getName();
00157 QString new_name = QInputDialog::getText( this, "Rename Display", "New Name?", QLineEdit::Normal, old_name );
00158
00159 if( new_name.isEmpty() || new_name == old_name )
00160 {
00161 return;
00162 }
00163
00164 display_to_rename->setName( new_name );
00165 }
00166
00167 void DisplaysPanel::save( YAML::Emitter& emitter )
00168 {
00169 tree_with_help_->save( emitter );
00170 }
00171
00172 void DisplaysPanel::load( const YAML::Node& yaml_node )
00173 {
00174 tree_with_help_->load( yaml_node );
00175 }
00176
00177 }