<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>libQGLViewer mouseGrabber example</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <link href="../qglviewer.css" rel="stylesheet" type="text/css" /> <link rel="shortcut icon" href="../images/qglviewer.ico" type="image/x-icon" /> <link rel="icon" href="../images/qglviewer.icon.png" type="image/png" /> </head> <body> <table class="banner"> <tr> <td align="center"><a href="../index.html"><b>Home</b></a></td> <td align="center"><a href="../refManual/hierarchy.html"><b>Documentation</b></a></td> <td align="center"><a href="../download.html"><b>Download</b></a></td> <td align="center" class="qindexHL"><a href="index.html"><b>Screenshots</b></a></td> <td align="center"><a href="../developer.html"><b>Developer</b></a></td> </tr> </table> <h1>The mouseGrabber example</h1> <center> <img src="../images/mouseGrabber.jpg" width="300" height="200" alt="mouseGrabber"/> </center> <p> Illustration of the <code>MouseGrabber</code> class. </p> <p> A <code>MouseGrabber</code> is an abstract class which defines objects that are sensitive to the mouse. When activated, they grab the mouse events. Possible applications are interactive 2D or 3D GUI, object auto-selection, auto drop-down menu and much more. </p> <p> In this example, MouseGrabbers are defined and associated with Camera keyFrame paths or position. Clicking a MouseGrabber will play (resp. restore) the Camera path (resp. position). </p> <h2>mouseGrabber.h</h2> <pre> <span class="dir">#include <QGLViewer/qglviewer.h> </span> <span class="key">class </span>CameraPathPlayer : <span class="key">public </span>qglviewer::MouseGrabber { <span class="key">public</span>: CameraPathPlayer(<span class="typ">int </span>nb) : pathNb(nb) {}; <span class="typ">void </span>checkIfGrabsMouse(<span class="typ">int </span>x, <span class="typ">int </span>y, <span class="typ">const </span>qglviewer::Camera* <span class="typ">const </span>camera); <span class="typ">int </span>yPos() { <span class="key">return </span><span class="num">25</span>*pathNb + <span class="num">25</span>; }; <span class="key">protected</span>: <span class="typ">void </span>mousePressEvent(QMouseEvent* <span class="typ">const</span>, qglviewer::Camera* <span class="typ">const </span>camera) { camera->playKeyFramePath(pathNb); }; <span class="key">private</span>: <span class="typ">int </span>pathNb; }; <span class="key">class </span>Viewer : <span class="key">public </span>QGLViewer { <span class="key">protected </span>: <span class="key">virtual </span><span class="typ">void </span>init(); <span class="key">virtual </span><span class="typ">void </span>draw(); <span class="key">virtual </span>QString helpString() <span class="typ">const</span>; <span class="typ">void </span>displayPlayers(); <span class="typ">void </span>updatePlayers(); <span class="key">private</span>: CameraPathPlayer** player_; };</pre> <h2>mouseGrabber.cpp</h2> <pre> <span class="dir">#include </span><span class="dstr">"mouseGrabber.h"</span><span class="dir"> </span> <span class="key">using namespace </span>qglviewer; <span class="key">using namespace </span>std; <span class="typ">void </span>CameraPathPlayer::checkIfGrabsMouse(<span class="typ">int </span>x, <span class="typ">int </span>y, <span class="typ">const </span>Camera* <span class="typ">const</span>) { <span class="com">// Rectangular activation array - May have to be tune depending on your default font size </span> setGrabsMouse((x < <span class="num">80</span>) && (y<yPos()) && ((yPos()-y) < <span class="num">16</span>)); } <span class="typ">void </span>Viewer::displayPlayers() { <span class="key">for </span>(<span class="typ">int </span>i=<span class="num">0</span>; i<camera()->nbPaths(); ++i) { CameraPathPlayer* cpp = player_[i]; <span class="key">if </span>(cpp) { QString s; <span class="key">if </span>(cpp->grabsMouse()) { glColor3f(<span class="num">1</span>,<span class="num">1</span>,<span class="num">1</span>); <span class="key">if </span>(camera()->keyFrameInterpolator(i)->numberOfKeyFrames() > <span class="num">1</span>) s = <span class="str">"Play path F"</span> + QString::number(i+<span class="num">1</span>); <span class="key">else </span>s = <span class="str">"Restore pos F"</span> + QString::number(i+<span class="num">1</span>); } <span class="key">else </span>{ glColor3f(<span class="num">0.6</span>, <span class="num">0.6</span>, <span class="num">0.6</span>); <span class="key">if </span>(camera()->keyFrameInterpolator(i)->numberOfKeyFrames() > <span class="num">1</span>) s = <span class="str">"Path F"</span> + QString::number(i+<span class="num">1</span>); <span class="key">else </span>s = <span class="str">"Pos F"</span> + QString::number(i+<span class="num">1</span>); } glDisable(GL_LIGHTING); drawText(<span class="num">10</span>, cpp->yPos()<span class="num">-3</span>, s); } } } <span class="typ">void </span>Viewer::updatePlayers() { <span class="key">for </span>(<span class="typ">int </span>i=<span class="num">0</span>; i<camera()->nbPaths(); ++i) { <span class="com">// Check if CameraPathPlayer is still valid </span> <span class="key">if </span>((player_[i]) && (!camera()->keyFrameInterpolator(i))) { <span class="key">delete </span>player_[i]; player_[i] = NULL; } <span class="com">// Or add it if needed </span> <span class="key">if </span>((camera()->keyFrameInterpolator(i)) && (!player_[i])) player_[i] = <span class="key">new </span>CameraPathPlayer(i); } } <span class="typ">void </span>Viewer::init() { <span class="com">// Absolutely needed for MouseGrabber </span> setMouseTracking(<span class="key">true</span>); <span class="com">// In order to make the manipulatedFrame displacements clearer </span> setDrawAxis(); <span class="com">// Initialize the CameraPathPlayer MouseGrabber array </span> player_ = <span class="key">new </span>CameraPathPlayer*[camera()->nbPaths()]; <span class="key">for </span>(<span class="typ">int </span>i=<span class="num">0</span>; i<camera()->nbPaths(); ++i) player_[i] = NULL; setManipulatedFrame(<span class="key">new </span>ManipulatedFrame()); restoreFromFile(); help(); } <span class="typ">void </span>Viewer::draw() { glMultMatrixd(manipulatedFrame()->matrix()); <span class="com">// Visual feedback for the manipulatedFrame grab. </span> <span class="key">if </span>(manipulatedFrame()->grabsMouse()) drawAxis(<span class="num">0.9</span>); <span class="key">else </span>drawAxis(<span class="num">0.7</span>); <span class="com">// Draw a spiral </span> <span class="typ">const float </span>nbSteps = <span class="num">500.0</span>; glBegin(GL_QUAD_STRIP); <span class="key">for </span>(<span class="typ">float </span>i=<span class="num">0</span>; i<nbSteps; ++i) { <span class="typ">float </span>ratio = i/nbSteps; <span class="typ">float </span>angle = <span class="num">21.0</span>*ratio; <span class="typ">float </span>c = cos(angle); <span class="typ">float </span>s = sin(angle); <span class="typ">float </span>r1 = <span class="num">1.0 </span>- <span class="num">0.8</span>*ratio; <span class="typ">float </span>r2 = <span class="num">0.8 </span>- <span class="num">0.8</span>*ratio; <span class="typ">float </span>alt = ratio <span class="num">- 0.5</span>; <span class="typ">const float </span>nor = .<span class="num">5</span>; <span class="typ">const float </span>up = sqrt(<span class="num">1.0</span>-nor*nor); glColor3f(<span class="num">1</span>-ratio, .<span class="num">2 </span>, ratio); glNormal3f(nor*c, up, nor*s); glVertex3f(r1*c, alt, r1*s); glVertex3f(r2*c, alt+<span class="num">0.05</span>, r2*s); } glEnd(); updatePlayers(); displayPlayers(); } QString Viewer::helpString() <span class="typ">const </span>{ QString text(<span class="str">"<h2>M o u s e G r a b b e r </h2>"</span>); text += <span class="str">"This example illustrates the use of <i>MouseGrabber</i>, which is an abstract "</span>; text += <span class="str">"class for objects that react (usually when the mouse hovers over them).<br><br>"</span>; text += <span class="str">"Define new camera paths (or positions) using <b>Alt</b>+[<b>F1</b>-<b>F12</b>]. "</span>; text += <span class="str">"New <i>MouseGrabbers</i> are created and displayed in the left corner. "</span>; text += <span class="str">"Note how they react to the mouse, and click them to play the associated path.<br><br>"</span>; text += <span class="str">"<i>ManipulatedFrame</i>, such as the one which defines the spiral position, are "</span>; text += <span class="str">"also <i>MouseGrabbers</i>. When the mouse is close to the axis origin, the <i>ManipulatedFrame</i> "</span>; text += <span class="str">"will react to mouse click, as if the <b>Control</b> key was pressed. This is very convenient "</span>; text += <span class="str">"to intuitively move scene objects (such as lights) without any key or GUI interaction.<br><br>"</span>; text += <span class="str">"Note that <i>setMouseTracking()</i> must be enabled to enable <i>MouseGrabbers</i>."</span>; <span class="key">return </span>text; }</pre> <h2>main.cpp</h2> <pre> <span class="dir">#include </span><span class="dstr">"mouseGrabber.h"</span><span class="dir"> </span><span class="dir">#include <qapplication.h> </span> <span class="typ">int </span>main(<span class="typ">int </span>argc, <span class="typ">char</span>** argv) { <span class="com">// Read command lines arguments. </span> QApplication application(argc,argv); <span class="com">// Instantiate the viewer, show it on screen. </span> Viewer viewer; viewer.show(); <span class="com">// Set the viewer as the application main widget. </span> application.setMainWidget(&viewer); <span class="com">// Run main loop. </span> <span class="key">return </span>application.exec(); }</pre> <p> <a href="index.html">Go back</a> to the examples main page </p> <p> <a href="http://validator.w3.org/check/referer"><img src="../images/xhtml.png" alt="Valid XHTML 1.0!" height="31" width="88" border="0"/></a> <a href="http://jigsaw.w3.org/css-validator/check/referer"><img src="../images/css.png" width="88" height="31" alt="Valid CSS!" border="0"/></a> <i>Last modified on Thursday, February 5, 2004.</i> </p> </body> </html>