/**********************************************************************
NavigateTool - Navigation Tool for Avogadro
Copyright (C) 2007,2008 by Marcus D. Hanwell
Copyright (C) 2006,2007 by Benoit Jacob
This file is part of the Avogadro molecular editor project.
For more information, see
Avogadro is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Avogadro is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
**********************************************************************/
#ifndef NAVIGATETOOL_H
#define NAVIGATETOOL_H
#include
#include
#include
#include
#include
#include
#include
namespace Avogadro {
/**
* @class NavigateTool
* @brief Navigation tool for moving the camera around the molecule.
* @author Marcus D. Hanwell
*
* This class implements navigation of the camera around the molecule being
* displayed. It attempts to do this in the most intuitive way possible
* offering both atom centric (if an atom has been clicked on) and scene
* centric (if no atom has been clicked on) navigation.
*/
class Eyecandy;
class NavigateTool : public Tool
{
Q_OBJECT
AVOGADRO_TOOL("Navigate", tr("Navigate"),
tr("Translate, rotate, and zoom around the current view"))
public:
/**
* Constructor.
*/
NavigateTool(QObject *parent = 0);
/**
* Destructor.
*/
virtual ~NavigateTool();
/** \name Tool Methods
* @{
* @brief Callback methods for ui.actions on the canvas.
*/
virtual QUndoCommand* mousePressEvent(GLWidget *widget, QMouseEvent *event);
virtual QUndoCommand* mouseReleaseEvent(GLWidget *widget, QMouseEvent *event);
virtual QUndoCommand* mouseMoveEvent(GLWidget *widget, QMouseEvent *event);
virtual QUndoCommand* wheelEvent(GLWidget *widget, QWheelEvent *event);
virtual QUndoCommand* keyPressEvent(GLWidget *widget, QKeyEvent *event);
virtual QUndoCommand* keyReleaseEvent(GLWidget *widget, QKeyEvent *event);
//@}
/**
* @return the relative usefulness of the tool - affects the order in which
* the tools are displayed.
*/
virtual int usefulness() const;
/**
* The paint method of the tool which is used to paint any tool specific
* visuals to the GLWidget.
*/
virtual bool paint(GLWidget *widget);
protected:
Atom * m_clickedAtom;
Eigen::Vector3d m_referencePoint; // the reference point for movement
// i.e the center of the clicked atom,
// or of the visible part of the molecule
bool m_leftButtonPressed; // rotation
bool m_midButtonPressed; // scale / zoom
bool m_rightButtonPressed; // translation
bool m_drawEyeCandy; // Should eye candy be drawn?
double m_yAngleEyecandy, m_xAngleEyecandy;
QPoint m_lastDraggingPosition;
bool m_draggingInitialized; // Has dragging been initialized?
Eyecandy * m_eyecandy;
/** recomputes m_referencePoint. Uses the value of m_clickedAtom. */
void computeReferencePoint(GLWidget *widget);
};
/**
* @class NavigateToolFactory navigatetool.h
* @brief Factory class to create instances of the NavigateTool class.
*/
class NavigateToolFactory : public QObject, public PluginFactory
{
Q_OBJECT
Q_INTERFACES(Avogadro::PluginFactory)
AVOGADRO_TOOL_FACTORY(NavigateTool)
};
} // end namespace Avogadro
#endif