// ****************************************************************************************** // Constructor // ****************************************************************************************** KinematicChainWidget::KinematicChainWidget( QWidget *parent, moveit_setup_assistant::MoveItConfigDataPtr config_data ) : QWidget( parent ), config_data_( config_data ) { // Basic widget container QVBoxLayout *layout = new QVBoxLayout( ); // Label ------------------------------------------------ title_ = new QLabel( "", this ); // specify the title from the parent widget QFont group_title_font( "Arial", 12, QFont::Bold ); title_->setFont(group_title_font); layout->addWidget( title_ ); // Create link tree ------------------------------------------------------ link_tree_ = new QTreeWidget( this ); link_tree_->setHeaderLabel( "Robot Links" ); connect( link_tree_, SIGNAL( itemSelectionChanged() ), this, SLOT( itemSelected() ) ); layout->addWidget( link_tree_ ); // Create Grid Layout for form -------------------------------------------- QGridLayout *form_grid = new QGridLayout(); form_grid->setContentsMargins( 20, 20, 20, 20 ); // left top right bottom // Row 1: Base Link QLabel *base_link_label = new QLabel( "Base Link", this ); form_grid->addWidget( base_link_label, 0, 0, Qt::AlignRight ); base_link_field_ = new QLineEdit( this ); base_link_field_->setMinimumWidth( 300 ); form_grid->addWidget( base_link_field_, 0, 1, Qt::AlignLeft ); QPushButton *btn_base_link = new QPushButton( "Choose Selected", this ); connect( btn_base_link, SIGNAL( clicked() ), this, SLOT( baseLinkTreeClick() )); form_grid->addWidget( btn_base_link, 0, 2, Qt::AlignLeft ); // Row 2: Tip Link QLabel *tip_link_label = new QLabel( "Tip Link", this ); form_grid->addWidget( tip_link_label, 1, 0, Qt::AlignRight ); tip_link_field_ = new QLineEdit( this ); tip_link_field_->setMinimumWidth( 300 ); form_grid->addWidget( tip_link_field_, 1, 1, Qt::AlignLeft ); QPushButton *btn_tip_link = new QPushButton( "Choose Selected", this ); connect( btn_tip_link, SIGNAL( clicked() ), this, SLOT( tipLinkTreeClick() )); form_grid->addWidget( btn_tip_link, 1, 2, Qt::AlignLeft ); // Add form grid layout layout->addLayout( form_grid ); // Bottom Controls --------------------------------------------------------- QHBoxLayout *controls_layout = new QHBoxLayout(); // Expand/Contract controls QLabel *expand_controls = new QLabel( this ); expand_controls->setText("<a href='expand'>Expand All</a> <a href='contract'>Collapse All</a>"); connect( expand_controls, SIGNAL(linkActivated( const QString )), this, SLOT( alterTree( const QString ))); controls_layout->addWidget( expand_controls ); // Spacer QWidget *spacer = new QWidget( this ); spacer->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); controls_layout->addWidget( spacer ); // Save QPushButton *btn_save = new QPushButton( "&Save", this ); btn_save->setMaximumWidth( 200 ); connect( btn_save, SIGNAL(clicked()), this, SIGNAL( doneEditing() ) ); controls_layout->addWidget( btn_save ); controls_layout->setAlignment(btn_save, Qt::AlignRight); // Cancel QPushButton *btn_cancel = new QPushButton( "&Cancel", this ); btn_cancel->setMaximumWidth( 200 ); connect( btn_cancel, SIGNAL(clicked()), this, SIGNAL( cancelEditing() ) ); controls_layout->addWidget( btn_cancel ); controls_layout->setAlignment(btn_cancel, Qt::AlignRight); // Add layout layout->addLayout( controls_layout ); // Finish Layout -------------------------------------------------- this->setLayout(layout); // Remember that we have no loaded the chains yet kinematic_chain_loaded_ = false; }
// ****************************************************************************************** // // ****************************************************************************************** GroupEditWidget::GroupEditWidget(QWidget* parent, const MoveItConfigDataPtr& config_data) : QWidget(parent), config_data_(config_data) { // Basic widget container QVBoxLayout* layout = new QVBoxLayout(); QGroupBox* group1 = new QGroupBox("Kinematics"); QGroupBox* group2 = new QGroupBox("OMPL Planning"); // Label ------------------------------------------------ title_ = new QLabel(this); // specify the title from the parent widget QFont group_title_font(QFont().defaultFamily(), 12, QFont::Bold); title_->setFont(group_title_font); layout->addWidget(title_); // Kinematic form ------------------------------------------- QFormLayout* form_layout = new QFormLayout(); form_layout->setContentsMargins(0, 12, 0, 12); // Name input group_name_field_ = new QLineEdit(this); group_name_field_->setMaximumWidth(400); form_layout->addRow("Group Name:", group_name_field_); // Kinematic solver kinematics_solver_field_ = new QComboBox(this); kinematics_solver_field_->setEditable(false); kinematics_solver_field_->setMaximumWidth(400); form_layout->addRow("Kinematic Solver:", kinematics_solver_field_); // resolution to use with solver kinematics_resolution_field_ = new QLineEdit(this); kinematics_resolution_field_->setMaximumWidth(400); form_layout->addRow("Kin. Search Resolution:", kinematics_resolution_field_); // resolution to use with solver kinematics_timeout_field_ = new QLineEdit(this); kinematics_timeout_field_->setMaximumWidth(400); form_layout->addRow("Kin. Search Timeout (sec):", kinematics_timeout_field_); group1->setLayout(form_layout); // OMPL Planner form -------------------------------------------- QFormLayout* form_layout2 = new QFormLayout(); form_layout2->setContentsMargins(0, 12, 0, 12); // Kinematic default planner default_planner_field_ = new QComboBox(this); default_planner_field_->setEditable(false); default_planner_field_->setMaximumWidth(400); form_layout2->addRow("Group Default Planner:", default_planner_field_); group2->setLayout(form_layout2); layout->addWidget(group1); layout->addWidget(group2); layout->setAlignment(Qt::AlignTop); // New Group Options --------------------------------------------------------- new_buttons_widget_ = new QWidget(); QVBoxLayout* new_buttons_layout_container = new QVBoxLayout(); QHBoxLayout* label_layout = new QHBoxLayout(); QHBoxLayout* recommended_options = new QHBoxLayout(); QHBoxLayout* advanced_options = new QHBoxLayout(); QLabel* save_and_add = new QLabel("Next, Add Components To Group:", this); QFont save_and_add_font(QFont().defaultFamily(), 12, QFont::Bold); save_and_add->setFont(save_and_add_font); label_layout->addWidget(save_and_add); // Recommended options QLabel* add_subtitle = new QLabel("Recommended: ", this); QFont add_subtitle_font(QFont().defaultFamily(), 10, QFont::Bold); add_subtitle->setFont(add_subtitle_font); recommended_options->addWidget(add_subtitle, 0, Qt::AlignLeft); // Save and add joints QPushButton* btn_save_joints = new QPushButton("Add Joints", this); btn_save_joints->setMaximumWidth(200); connect(btn_save_joints, SIGNAL(clicked()), this, SIGNAL(saveJoints())); recommended_options->addWidget(btn_save_joints); // Advanced options QLabel* add_subtitle2 = new QLabel("Advanced Options:", this); add_subtitle2->setFont(add_subtitle_font); advanced_options->addWidget(add_subtitle2, 0, Qt::AlignLeft); // Save and add links QPushButton* btn_save_links = new QPushButton("Add Links", this); btn_save_links->setMaximumWidth(200); connect(btn_save_links, SIGNAL(clicked()), this, SIGNAL(saveLinks())); advanced_options->addWidget(btn_save_links); // Save and add chain QPushButton* btn_save_chain = new QPushButton("Add Kin. Chain", this); btn_save_chain->setMaximumWidth(200); connect(btn_save_chain, SIGNAL(clicked()), this, SIGNAL(saveChain())); advanced_options->addWidget(btn_save_chain); // Save and add subgroups QPushButton* btn_save_subgroups = new QPushButton("Add Subgroups", this); btn_save_subgroups->setMaximumWidth(200); connect(btn_save_subgroups, SIGNAL(clicked()), this, SIGNAL(saveSubgroups())); advanced_options->addWidget(btn_save_subgroups); // Add layouts new_buttons_layout_container->addLayout(label_layout); new_buttons_layout_container->addLayout(recommended_options); new_buttons_layout_container->addLayout(advanced_options); // Create widget and add to main layout new_buttons_widget_->setLayout(new_buttons_layout_container); layout->addWidget(new_buttons_widget_); // Verticle Spacer ----------------------------------------------------- QWidget* vspacer = new QWidget(this); vspacer->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); layout->addWidget(vspacer); // Bottom Controls --------------------------------------------------------- QHBoxLayout* controls_layout = new QHBoxLayout(); // Delete btn_delete_ = new QPushButton("&Delete Group", this); btn_delete_->setMaximumWidth(200); connect(btn_delete_, SIGNAL(clicked()), this, SIGNAL(deleteGroup())); controls_layout->addWidget(btn_delete_); controls_layout->setAlignment(btn_delete_, Qt::AlignRight); // Horizontal Spacer QWidget* spacer = new QWidget(this); spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); controls_layout->addWidget(spacer); // Save btn_save_ = new QPushButton("&Save", this); btn_save_->setMaximumWidth(200); connect(btn_save_, SIGNAL(clicked()), this, SIGNAL(save())); controls_layout->addWidget(btn_save_); controls_layout->setAlignment(btn_save_, Qt::AlignRight); // Cancel QPushButton* btn_cancel = new QPushButton("&Cancel", this); btn_cancel->setMaximumWidth(200); connect(btn_cancel, SIGNAL(clicked()), this, SIGNAL(cancelEditing())); controls_layout->addWidget(btn_cancel); controls_layout->setAlignment(btn_cancel, Qt::AlignRight); // Add layout layout->addLayout(controls_layout); // Finish Layout -------------------------------------------------- this->setLayout(layout); }