/**********************************************************************
PeriodicTableView - Periodic Table Graphics View for Avogadro
Copyright (C) 2007-2009 by Marcus D. Hanwell
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 Lesser General Public License as published by
the Free Software Foundation; either version 2.1 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 PERIODICTABLEVIEW_H
#define PERIODICTABLEVIEW_H
#include
#include
#include
#include
#include
#include
namespace Avogadro {
/**
* @class ElementItem periodictableview.h
* @author Marcus D. Hanwell
* @brief An element item, intended to display a single element.
*
* This class implements a QGraphicsItem for displaying single elements in a
* perdiodic table. It currently allows the setting of the proton number and
* gets all other information from OpenBabel.
*/
class ElementItem : public QObject, public QGraphicsItem
{
Q_OBJECT
#if QT_VERSION >= 0x40600
Q_INTERFACES(QGraphicsItem)
#endif
public:
/**
* Constructor. Should be called with the element number for this item. The
* constructor uses setData to set the element number using the key 0. This
* is then used by PeriodicTable to figure out which element was clicked on.
*/
ElementItem(int elementNumber = 0);
/**
* Destructor.
*/
~ElementItem();
/**
* @return the bounding rectangle of the element item.
*/
QRectF boundingRect() const;
/**
* @return the painter path which is also a rectangle in this case.
*/
QPainterPath shape() const;
/**
* This is where most of the action takes place. The element box is drawn
* along with its symbol.
*/
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget);
private:
/**
* The element numbers symbol.
*/
QString m_symbol;
/**
* The color of the element which will also be used as the background color
* for the item box.
*/
QColor *m_color;
/**
* Width and height of the elements.
*/
int m_width, m_height;
/**
* The proton number of the item - all other attributes are derived from this.
*/
int m_element;
};
/**
* @class ElementDetail periodictableview.h
* @author Marcus D. Hanwell
* @brief An item box displaying more detailed information on the element.
*
* This class implements a QGraphicsItem for displaying a larger box that
* gives greater detail about the selected element such as its full name,
* proton number and average atomic mass.
*/
class ElementDetail : public QObject, public QGraphicsItem
{
Q_OBJECT
#if QT_VERSION >= 0x40600
Q_INTERFACES(QGraphicsItem)
#endif
public:
/**
* Constructor. Should be called with the element number for this item.
*/
ElementDetail(int elementNumber = 0);
/**
* @return the bounding rectangle of the element item.
*/
QRectF boundingRect() const;
/**
* @return the painter path which is also a rectangle in this case.
*/
QPainterPath shape() const;
/**
* This is where most of the action takes place. The element box is drawn
* along with its symbol, proton number, mass and full name.
*/
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget);
public Q_SLOTS:
/**
* This slot can be used to indicate the active element has changed which
* will cause this item to redraw with the details of the new element.
*/
void elementChanged(int element);
private:
/**
* Width and height of the item.
*/
int m_width, m_height;
/**
* The proton number of the item - all other attributes are derived from this.
*/
int m_element;
};
/**
* @class PeriodicTableScene periodictableview.h
* @author Marcus D. Hanwell
* @brief This class encapsulates the scene, all items are contained in it.
*
* This class implements a QGraphicsScene that holds all of the element items.
* Any items owned by this class are automatically deleted by it.
*/
class PeriodicTableScene : public QGraphicsScene
{
Q_OBJECT
public:
/**
* Constructor.
*/
PeriodicTableScene(QObject *parent = 0);
Q_SIGNALS:
/**
* This signal is emitted when an element item is clicked.
*/
void elementChanged(int element);
protected:
/**
* Handles the mouse press events to change the active element.
*/
void mousePressEvent(QGraphicsSceneMouseEvent *event);
/**
* Not used at present.
*/
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
/**
* Not used at present.
*/
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
};
/**
* @class PeriodicTableView periodictableview.h
* @author Marcus D. Hanwell
* @brief This class implements the view of the PeriodicTableScene.
*
* This is the class that actually draws the widget onto screen. This is
* the class that should normally be instantiated in order to display a
* Periodic Table.
*/
class A_EXPORT PeriodicTableView : public QGraphicsView
{
Q_OBJECT
public:
/**
* Constructor - contructs a new PeriodicTableView with an internal instance
* of PeriodicTableScene.
*/
explicit PeriodicTableView(QWidget *parent = 0);
/**
* Destructor.
*/
~PeriodicTableView();
private Q_SLOTS:
/**
* Use this slot to change the active element.
*/
void elementClicked(int element);
Q_SIGNALS:
/**
* Signal emitted when the active element in the PeriodicTableView changes.
*/
void elementChanged(int element);
private:
/**
* Proton number of the active element.
*/
int m_element;
protected:
/**
* Double click event - select an element and hide the PeriodicTableView.
*/
void mouseDoubleClickEvent(QMouseEvent *event);
};
} // End of Avogadro namespace
#endif