selection_tool.cpp
Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2008, 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 <QKeyEvent>
00031 
00032 #include <OGRE/OgreRay.h>
00033 #include <OGRE/OgreSceneManager.h>
00034 #include <OGRE/OgreCamera.h>
00035 #include <OGRE/OgreMovableObject.h>
00036 #include <OGRE/OgreRectangle2D.h>
00037 #include <OGRE/OgreSceneNode.h>
00038 #include <OGRE/OgreViewport.h>
00039 #include <OGRE/OgreMaterialManager.h>
00040 #include <OGRE/OgreTexture.h>
00041 #include <OGRE/OgreTextureManager.h>
00042 
00043 #include <ros/time.h>
00044 
00045 #include "ogre_helpers/camera_base.h"
00046 #include "ogre_helpers/qt_ogre_render_window.h"
00047 
00048 #include "move_tool.h"
00049 #include "selection/selection_manager.h"
00050 #include "visualization_manager.h"
00051 #include "render_panel.h"
00052 #include "display.h"
00053 #include "viewport_mouse_event.h"
00054 
00055 #include "selection_tool.h"
00056 
00057 namespace rviz
00058 {
00059 
00060 SelectionTool::SelectionTool( const std::string& name, char shortcut_key, VisualizationManager* manager )
00061 : Tool( name, shortcut_key, manager )
00062 , move_tool_(new MoveTool("SelectionTool Fake MoveTool", 0, manager))
00063 , selecting_(false)
00064 , sel_start_x_(0)
00065 , sel_start_y_(0)
00066 , moving_(false)
00067 {
00068 
00069 }
00070 
00071 SelectionTool::~SelectionTool()
00072 {
00073   delete move_tool_;
00074 }
00075 
00076 void SelectionTool::activate()
00077 {
00078   manager_->getSelectionManager()->setTextureSize(512);
00079   selecting_ = false;
00080   moving_ = false;
00081 }
00082 
00083 void SelectionTool::deactivate()
00084 {
00085   manager_->getSelectionManager()->removeHighlight();
00086 }
00087 
00088 void SelectionTool::update(float wall_dt, float ros_dt)
00089 {
00090   SelectionManager* sel_manager = manager_->getSelectionManager();
00091 
00092   if (!selecting_)
00093   {
00094     sel_manager->removeHighlight();
00095   }
00096 }
00097 
00098 int SelectionTool::processMouseEvent( ViewportMouseEvent& event )
00099 {
00100   SelectionManager* sel_manager = manager_->getSelectionManager();
00101 
00102   int flags = 0;
00103 
00104   if( event.alt() )
00105   {
00106     moving_ = true;
00107     selecting_ = false;
00108   }
00109   else
00110   {
00111     moving_ = false;
00112 
00113     if( event.leftDown() )
00114     {
00115       selecting_ = true;
00116 
00117       sel_start_x_ = event.x;
00118       sel_start_y_ = event.y;
00119     }
00120   }
00121 
00122   if( selecting_ )
00123   {
00124     sel_manager->highlight( event.viewport, sel_start_x_, sel_start_y_, event.x, event.y );
00125 
00126     if( event.leftUp() )
00127     {
00128       SelectionManager::SelectType type = SelectionManager::Replace;
00129 
00130       M_Picked selection;
00131 
00132       if( event.shift() )
00133       {
00134         type = SelectionManager::Add;
00135       }
00136       else if( event.control() )
00137       {
00138         type = SelectionManager::Remove;
00139       }
00140 
00141       sel_manager->select( event.viewport, sel_start_x_, sel_start_y_, event.x, event.y, type );
00142 
00143       selecting_ = false;
00144     }
00145 
00146     flags |= Render;
00147   }
00148   else if( moving_ )
00149   {
00150     sel_manager->removeHighlight();
00151 
00152     flags = move_tool_->processMouseEvent( event );
00153 
00154     if( event.type == QEvent::MouseButtonRelease )
00155     {
00156       moving_ = false;
00157     }
00158   }
00159   else
00160   {
00161     sel_manager->highlight( event.viewport, event.x, event.y, event.x, event.y );
00162   }
00163 
00164   return flags;
00165 }
00166 
00167 int SelectionTool::processKeyEvent( QKeyEvent* event, RenderPanel* panel )
00168 {
00169   SelectionManager* sel_manager = manager_->getSelectionManager();
00170 
00171   if( event->key() == Qt::Key_F )
00172   {
00173     sel_manager->focusOnSelection();
00174   }
00175 
00176   return Render;
00177 }
00178 
00179 }
00180 


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