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