/**********************************************************************
Tool - Avogadro Tool Interface
Copyright (C) 2007 Donald Ephraim Curtis
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 TOOL_H
#define TOOL_H
#include
#include "plugin.h"
#include
#include
#include
#define AVOGADRO_TOOL(i, t, d) \
public: \
static QString staticIdentifier() { return i; } \
QString identifier() const { return i; } \
static QString staticName() { return t; } \
QString name() const { return t; } \
static QString staticDescription() { return d; } \
QString description() const { return d; }
#define AVOGADRO_TOOL_FACTORY(c) \
public: \
Plugin *createInstance(QObject *parent = 0) { return new c(parent); } \
Plugin::Type type() const { return Plugin::ToolType; } \
QString identifier() const { return c::staticIdentifier(); } \
QString name() const { return c::staticName(); } \
QString description() const { return c::staticDescription(); }
class QAction;
class QUndoCommand;
class QWidget;
namespace Avogadro {
class GLWidget;
class Molecule;
/**
* @class Tool tool.h
* @brief Interface for tool plugins
* @author Donald Ephraim Curtis
*
* This is a template class for tools which manipulate the GLWidget
* area. The functions they implement are in response to actions
* performed by the user on the GLWidget.
*/
class ToolPrivate;
class A_EXPORT Tool : public Plugin
{
Q_OBJECT
public:
/**
* Constructor
*/
Tool(QObject *parent = 0);
/**
* Destructor
*/
virtual ~Tool();
/**
* Plugin Type
*/
Plugin::Type type() const;
/**
* Plugin Type Name (Tools)
*/
QString typeName() const;
/**
* @return the QAction of the tool
*/
virtual QAction* activateAction() const;
/**
* @return the settings widget for the tool.
*/
virtual QWidget* settingsWidget();
/**
* Response to mouse press
* @param widget the %GLWidget where the even occurred
* @param event the mouse event information
*/
virtual QUndoCommand* mousePressEvent(GLWidget *widget, QMouseEvent *event) = 0;
/**
* Response to mouse release
* @param widget the %GLWidget where the even occurred
* @param event the mouse event information
*/
virtual QUndoCommand* mouseReleaseEvent(GLWidget *widget, QMouseEvent *event) = 0;
/**
* Response to mouse movement
* @param widget the %GLWidget where the event occurred
* @param event the mouse event information
*/
virtual QUndoCommand* mouseMoveEvent(GLWidget *widget, QMouseEvent *event) = 0;
/**
* Response to mouse wheel movement
* @param widget the %GLWidget where the event occurred
* @param event the mouse wheel event information
*/
virtual QUndoCommand* wheelEvent(GLWidget *widget, QWheelEvent *event);
/**
* Response to key press events.
* @param widget the %GLWidget where the event occurred
* @param event the key event information
*/
virtual QUndoCommand* keyPressEvent(GLWidget *widget, QKeyEvent *event);
/**
* Response to key release events.
* @param widget the %GLWidget where the event occurred
* @param event the key event information
*/
virtual QUndoCommand* keyReleaseEvent(GLWidget *widget, QKeyEvent *event);
/**
* Called by the GLWidget allowing overlay painting by the
* tool. Tools get painted last in the overall scheme.
* @param widget the %GLWidget to paint to
*/
virtual bool paint(GLWidget *widget);
/**
* Determines the ordering of the tools. More useful
* tools are placed first. It is up to the tool designer
* to be humble about their usefulness value.
* @return usefulness value
*/
virtual int usefulness() const;
bool operator<(const Tool &other) const;
/**
* Write the tool settings so that they can be saved between sessions.
*/
virtual void writeSettings(QSettings &settings) const;
/**
* Read in the settings that have been saved for the tool instance.
*/
virtual void readSettings(QSettings &settings);
Q_SIGNALS:
/**
* Can be used to add messages to the message pane.
* @param m the message to add to the message pane.
*/
void message(const QString &m);
public Q_SLOTS:
/**
* Called by the parent (normally toolGroup) to tell the tool the underlying
* model (molecule) has changed
*/
virtual void setMolecule(Molecule *molecule);
protected:
QAction *m_activateAction;
ToolPrivate *const d;
};
} // end namespace Avogadro
#endif