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 <QGroupBox>
00031 #include <QTreeWidget>
00032 #include <QLabel>
00033 #include <QLineEdit>
00034 #include <QTextBrowser>
00035 #include <QVBoxLayout>
00036 #include <QDialogButtonBox>
00037 #include <QPushButton>
00038
00039 #include "new_display_dialog.h"
00040
00041 namespace rviz
00042 {
00043
00044 NewDisplayDialog::NewDisplayDialog( pluginlib::ClassLoader<Display>* class_loader,
00045 const S_string& current_display_names,
00046 std::string* lookup_name_output,
00047 std::string* display_name_output,
00048 QWidget* parent )
00049 : QDialog( parent )
00050 , class_loader_( class_loader )
00051 , current_display_names_( current_display_names )
00052 , lookup_name_output_( lookup_name_output )
00053 , display_name_output_( display_name_output )
00054 {
00055
00056
00057
00058 QGroupBox* type_box = new QGroupBox( "Display Type" );
00059
00060 QTreeWidget* tree = new QTreeWidget;
00061 tree->setHeaderHidden( true );
00062 fillTree( tree );
00063
00064 QLabel* description_label = new QLabel( "Description:" );
00065 description_ = new QTextBrowser;
00066 description_->setMaximumHeight( 100 );
00067 description_->setOpenExternalLinks( true );
00068
00069 QVBoxLayout* type_layout = new QVBoxLayout;
00070 type_layout->addWidget( tree );
00071 type_layout->addWidget( description_label );
00072 type_layout->addWidget( description_ );
00073
00074 type_box->setLayout( type_layout );
00075
00076
00077 QGroupBox* name_box = new QGroupBox( "Display Name" );
00078
00079 name_editor_ = new QLineEdit;
00080 QVBoxLayout* name_layout = new QVBoxLayout;
00081 name_layout->addWidget( name_editor_ );
00082 name_box->setLayout( name_layout );
00083
00084
00085 button_box_ = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel,
00086 Qt::Horizontal );
00087
00088 QVBoxLayout* main_layout = new QVBoxLayout;
00089 main_layout->addWidget( type_box );
00090 main_layout->addWidget( name_box );
00091 main_layout->addWidget( button_box_ );
00092 setLayout( main_layout );
00093
00094
00095 connect( tree, SIGNAL( currentItemChanged( QTreeWidgetItem*, QTreeWidgetItem* )),
00096 this, SLOT( onDisplaySelected( QTreeWidgetItem* )));
00097 connect( tree, SIGNAL( itemActivated( QTreeWidgetItem*, int )),
00098 this, SLOT( accept() ));
00099 connect( button_box_, SIGNAL( accepted() ), this, SLOT( accept() ));
00100 connect( button_box_, SIGNAL( rejected() ), this, SLOT( reject() ));
00101 connect( name_editor_, SIGNAL( textEdited( const QString& )),
00102 this, SLOT( onNameChanged() ));
00103 }
00104
00105 void NewDisplayDialog::fillTree( QTreeWidget* tree )
00106 {
00107 std::vector<std::string> classes = class_loader_->getDeclaredClasses();
00108
00109
00110 std::map<std::string, QTreeWidgetItem*> package_items;
00111
00112 std::vector<std::string>::const_iterator ci;
00113 for( ci = classes.begin(); ci != classes.end(); ci++ )
00114 {
00115 std::string lookup_name = (*ci);
00116 std::string package = class_loader_->getClassPackage( lookup_name );
00117 std::string description = class_loader_->getClassDescription( lookup_name );
00118 std::string name = class_loader_->getName( lookup_name );
00119
00120 QTreeWidgetItem* package_item;
00121
00122 std::map<std::string, QTreeWidgetItem*>::iterator mi;
00123 mi = package_items.find( package );
00124 if( mi == package_items.end() )
00125 {
00126 package_item = new QTreeWidgetItem( tree );
00127 package_item->setText( 0, QString::fromStdString( package ));
00128 package_item->setExpanded( true );
00129 package_items[ package ] = package_item;
00130 }
00131 else
00132 {
00133 package_item = (*mi).second;
00134 }
00135 QTreeWidgetItem* class_item = new QTreeWidgetItem( package_item );
00136 class_item->setText( 0, QString::fromStdString( name ));
00137 class_item->setWhatsThis( 0, QString::fromStdString( description ));
00138
00139 class_item->setData( 0, Qt::UserRole, QString::fromStdString( lookup_name ));
00140 }
00141 }
00142
00143 void NewDisplayDialog::onDisplaySelected( QTreeWidgetItem* selected_item )
00144 {
00145 QString html = "<html><body>" + selected_item->whatsThis( 0 ) + "</body></html>";
00146 description_->setHtml( html );
00147
00148
00149 QVariant user_data = selected_item->data( 0, Qt::UserRole );
00150 bool selection_is_valid = user_data.isValid();
00151 if( selection_is_valid )
00152 {
00153 lookup_name_ = user_data.toString().toStdString();
00154 std::string display_name = selected_item->text( 0 ).toStdString();
00155
00156 int counter = 1;
00157 std::string name;
00158 do
00159 {
00160 std::stringstream ss;
00161 ss << display_name;
00162
00163 if( counter > 1 )
00164 {
00165 ss << counter;
00166 }
00167
00168 ++counter;
00169
00170 name = ss.str();
00171 } while( current_display_names_.find( name ) != current_display_names_.end() );
00172
00173 name_editor_->setText( QString::fromStdString( name ));
00174 }
00175 else
00176 {
00177 lookup_name_ = "";
00178 name_editor_->setText( "" );
00179 }
00180 button_box_->button( QDialogButtonBox::Ok )->setEnabled( isValid() );
00181 }
00182
00183 bool NewDisplayDialog::isValid()
00184 {
00185 std::string display_name = name_editor_->text().toStdString();
00186 if( lookup_name_.size() == 0 )
00187 {
00188 setError( "Select a Display type." );
00189 return false;
00190 }
00191 if( display_name.size() == 0 )
00192 {
00193 setError( "Enter a name for the display." );
00194 return false;
00195 }
00196 if( current_display_names_.find( display_name ) != current_display_names_.end() )
00197 {
00198 setError( "Name in use. Display names must be unique." );
00199 return false;
00200 }
00201 setError( "" );
00202 return true;
00203 }
00204
00205 void NewDisplayDialog::setError( const QString& error_text )
00206 {
00207 button_box_->button( QDialogButtonBox::Ok )->setToolTip( error_text );
00208 }
00209
00210 void NewDisplayDialog::onNameChanged()
00211 {
00212 button_box_->button( QDialogButtonBox::Ok )->setEnabled( isValid() );
00213 }
00214
00215 void NewDisplayDialog::accept()
00216 {
00217 if( isValid() )
00218 {
00219 *lookup_name_output_ = lookup_name_;
00220 *display_name_output_ = name_editor_->text().toStdString();
00221 QDialog::accept();
00222 }
00223 }
00224
00225 }
00226