Go to the documentation of this file.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 <QApplication>
00031 #include <QMenu>
00032
00033 #include "render_panel.h"
00034 #include "visualization_manager.h"
00035 #include "display.h"
00036 #include "display_wrapper.h"
00037 #include "tools/tool.h"
00038 #include "viewport_mouse_event.h"
00039 #include "view_controller.h"
00040
00041 #include <OGRE/OgreRoot.h>
00042 #include <OGRE/OgreViewport.h>
00043
00044 namespace rviz
00045 {
00046
00047 RenderPanel::RenderPanel( QWidget* parent )
00048 : QtOgreRenderWindow( parent )
00049 , mouse_x_( 0 )
00050 , mouse_y_( 0 )
00051 , manager_( 0 )
00052 , scene_manager_( 0 )
00053 , camera_( 0 )
00054 , view_controller_( 0 )
00055 , fake_mouse_move_event_timer_( new QTimer() )
00056 {
00057 setFocus( Qt::OtherFocusReason );
00058 }
00059
00060 RenderPanel::~RenderPanel()
00061 {
00062 delete fake_mouse_move_event_timer_;
00063 delete view_controller_;
00064 scene_manager_->destroyCamera(camera_);
00065 }
00066
00067 void RenderPanel::initialize(Ogre::SceneManager* scene_manager, VisualizationManager* manager)
00068 {
00069 manager_ = manager;
00070 scene_manager_ = scene_manager;
00071
00072 std::stringstream ss;
00073 static int count = 0;
00074 ss << "RenderPanelCamera" << count++;
00075 camera_ = scene_manager_->createCamera(ss.str());
00076
00077 setCamera( camera_ );
00078
00079 connect( fake_mouse_move_event_timer_, SIGNAL( timeout() ), this, SLOT( sendMouseMoveEvent() ));
00080 fake_mouse_move_event_timer_->start( 33 );
00081 }
00082
00083 void RenderPanel::sendMouseMoveEvent()
00084 {
00085 QPoint cursor_pos = QCursor::pos();
00086 QPoint mouse_rel_widget = mapFromGlobal( cursor_pos );
00087 if( rect().contains( mouse_rel_widget ))
00088 {
00089 bool mouse_over_this = false;
00090 QWidget *w = QApplication::widgetAt( cursor_pos );
00091 while( w )
00092 {
00093 if( w == this )
00094 {
00095 mouse_over_this = true;
00096 break;
00097 }
00098 w = w->parentWidget();
00099 }
00100 if( !mouse_over_this )
00101 {
00102 return;
00103 }
00104
00105 QMouseEvent fake_event( QEvent::MouseMove,
00106 mouse_rel_widget,
00107 Qt::NoButton,
00108 QApplication::mouseButtons(),
00109 QApplication::keyboardModifiers() );
00110 onRenderWindowMouseEvents( &fake_event );
00111 }
00112 }
00113
00114 void RenderPanel::onRenderWindowMouseEvents( QMouseEvent* event )
00115 {
00116 int last_x = mouse_x_;
00117 int last_y = mouse_y_;
00118
00119 mouse_x_ = event->x();
00120 mouse_y_ = event->y();
00121
00122 if (manager_)
00123 {
00124 setFocus( Qt::MouseFocusReason );
00125
00126 ViewportMouseEvent vme(this, getViewport(), event, last_x, last_y);
00127 manager_->handleMouseEvent(vme);
00128 event->accept();
00129 }
00130 }
00131
00132 void RenderPanel::wheelEvent( QWheelEvent* event )
00133 {
00134 int last_x = mouse_x_;
00135 int last_y = mouse_y_;
00136
00137 mouse_x_ = event->x();
00138 mouse_y_ = event->y();
00139
00140 if (manager_)
00141 {
00142 setFocus( Qt::MouseFocusReason );
00143
00144 ViewportMouseEvent vme(this, getViewport(), event, last_x, last_y);
00145 manager_->handleMouseEvent(vme);
00146 event->accept();
00147 }
00148 }
00149
00150 void RenderPanel::keyPressEvent( QKeyEvent* event )
00151 {
00152 if( manager_ )
00153 {
00154 manager_->handleChar( event, this );
00155 }
00156 }
00157
00158 void RenderPanel::setViewController(ViewController* controller)
00159 {
00160 if (view_controller_)
00161 {
00162 view_controller_->deactivate();
00163 }
00164
00165 delete view_controller_;
00166 view_controller_ = controller;
00167
00168 view_controller_->activate(camera_, manager_ ? manager_->getTargetFrame() : "");
00169 }
00170
00171 void RenderPanel::showContextMenu( boost::shared_ptr<QMenu> menu )
00172 {
00173 boost::mutex::scoped_lock lock(context_menu_mutex_);
00174 context_menu_ = menu;
00175
00176 QApplication::postEvent( this, new QContextMenuEvent( QContextMenuEvent::Mouse, QPoint() ));
00177 }
00178
00179 void RenderPanel::contextMenuEvent( QContextMenuEvent* event )
00180 {
00181 boost::shared_ptr<QMenu> context_menu;
00182 {
00183 boost::mutex::scoped_lock lock(context_menu_mutex_);
00184 context_menu.swap(context_menu_);
00185 }
00186
00187 if ( context_menu )
00188 {
00189 context_menu->exec( QCursor::pos() );
00190 }
00191 }
00192
00193 }