/********************************************************************** Extension - Extension Class Interface Copyright (C) 2007-2008 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 EXTENSION_H #define EXTENSION_H #include "plugin.h" #include #include #include #define AVOGADRO_EXTENSION(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_EXTENSION_FACTORY(c) \ public: \ Plugin *createInstance(QObject *parent = 0) { return new c(parent); } \ Plugin::Type type() const { return Plugin::ExtensionType; } \ QString identifier() const { return c::staticIdentifier(); } \ QString name() const { return c::staticName(); } \ QString description() const { return c::staticDescription(); } class QDockWidget; class QUndoCommand; class QTextEdit; class QAction; namespace Avogadro { class GLWidget; class Molecule; /** * @class Extension extension.h * @brief Interface for adding extensions * @author Donald Ephraim Curtis * * This is a template class used for adding extensions * to Avogadro. Implementing the pure virutal functions * provides a mechanism for more functionality. * Extensions work by allowing each extension to have an unlimited * number of possible actions (each represented by a QAction). To * perform an action the extension should implement performAction * and perform the correct action based on the action it receives. * The actual action should will be performed by the parent object * (usually MainWindow) as a result of a ::redo call on the returned * QUndoCommand from the performAction function. Thus, to implement * functionality you should subclass QUndoCommand accordingly * based on the required functionality of the extension and return * the command based on the action being peformed. */ class A_EXPORT Extension : public Plugin { Q_OBJECT public: Extension(QObject *parent = 0); virtual ~Extension(); /** * Plugin Type */ Plugin::Type type() const; /** * Plugin Type Name (Extensions) */ QString typeName() const; /** * @return a list of actions which this widget can perform */ virtual QList actions() const = 0; /** * @return the menu path for the specified action */ virtual QString menuPath(QAction *action) const; /** * @return a list of dock widgets associated with this extensions */ virtual QDockWidget * dockWidget(); /** * @param action the action that triggered the calls * @param widget the currently active GLWidget * feedback to the user) * @return an undo command for this action */ virtual QUndoCommand* performAction(QAction *action, GLWidget *widget) = 0; /** * save settings for this extension * @param settings settings variable to write settings to */ virtual void writeSettings(QSettings &settings) const; /** * read settings for this extension * @param settings settings variable to read settings from */ virtual void readSettings(QSettings &settings); public Q_SLOTS: virtual void setMolecule(Molecule *m); 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); /** * Can be used to notify the MainWindow to refresh the QActions for this extension. */ void actionsChanged(Extension*); /** * Can be used to notify the MainWindow to change the molecule to a new one. */ void moleculeChanged(Molecule *); }; } // end namespace Avogadro #endif