summaryrefslogtreecommitdiffstats
path: root/kalzium/src/periodictableview.h
diff options
context:
space:
mode:
Diffstat (limited to 'kalzium/src/periodictableview.h')
-rw-r--r--kalzium/src/periodictableview.h523
1 files changed, 523 insertions, 0 deletions
diff --git a/kalzium/src/periodictableview.h b/kalzium/src/periodictableview.h
new file mode 100644
index 00000000..632f5d57
--- /dev/null
+++ b/kalzium/src/periodictableview.h
@@ -0,0 +1,523 @@
+/***************************************************************************
+ * Copyright (C) 2003-2005 by Carsten Niehaus *
+ * cniehaus@kde.org *
+ * *
+ * This program 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. *
+ * *
+ * This program 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 PerodicTableView_H
+#define PerodicTableView_H
+
+class QLabel;
+class QPixmap;
+class QPoint;
+class QVBoxLayout;
+class Element;
+class KalziumDataObject;
+class KalziumTip;
+
+#include <qvaluelist.h>
+#include <qwidget.h>
+#include <qtimer.h>
+
+// A PerodicTableView is ...
+/**
+ * @short basic class for the specific PerodicTableViews
+ * @author Carsten Niehaus
+ */
+class PerodicTableView : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ /**
+ * Constructor
+ * @param parent parent widget
+ * @param name name of this widget
+ */
+ PerodicTableView( QWidget *parent = 0, const char *name = 0);
+ ~PerodicTableView();
+
+ enum SCHEMETYPE
+ {
+ NOCOLOUR = 0,
+ GROUPS,
+ BLOCK,
+ ACIDIC,
+ FAMILY,
+ GRADIENT,
+ CRYSTAL
+ };
+
+ enum NUMERATIONTYPE
+ {
+ NO=0, /// no numeration
+ CAS = 1, /// Chemical Abstract Service
+ IUPAC = 2, /// International Union of Pure and Applied Chemistry
+ IUPACOLD = 3 /// old IUPAC numeration
+ };
+
+ /**
+ * if this mode is activated a click on a button will not open
+ * a information dialog
+ */
+ virtual void activateMolcalcmode( bool mode ){
+ m_molcalcIsActive = mode;
+ }
+
+ /**
+ * @return if the molcalc mode is active or not
+ */
+ virtual bool molcalcMode() const{
+ return m_molcalcIsActive;
+ }
+
+ /**
+ * sets the NUMERATIONTYPE @p num of the periodic table
+ * @see NUMERATIONTYPE
+ */
+ void setNumerationType( NUMERATIONTYPE num ){
+ m_num = num;
+ update();
+ }
+ /**
+ * @return whether the tooltips are enabled
+ */
+ bool tooltipsEnabled() const{
+ return m_tooltipsEnabled;
+ }
+
+ /**
+ * if @p enabled is true the tooltips
+ * will be enabled
+ */
+ void setTooltipsEnabled( bool enabled ){
+ m_tooltipsEnabled = enabled;
+ }
+
+ /**
+ * This method sets the colors of the PerodicTableView.
+ * @param nr takes 5 different values:
+ * @li normal view
+ * @li groups
+ * @li blocks
+ * @li state of matter
+ * @li acidic behavior
+ * @li family view
+ */
+ void activateColorScheme( const int nr);
+
+ /**
+ * @return the short and descriptive name of this PerodicTableView
+ */
+ QString shortName() const{
+ return m_ShortName;
+ }
+
+ /**
+ * if @p show is true the tooltip will be displayed
+ */
+ void setShowTooltip( bool show ){
+ m_showTooltip = show;
+ }
+
+ /**
+ * @return whether tooltips will be displayed
+ */
+ bool showTooltip() const {
+ return m_showTooltip;
+ }
+
+ /**
+ * @return whether if the SOM is active or not
+ */
+ bool som() const{
+ return m_showSOM;
+ }
+
+ void activateSOMMode( bool som ){
+ m_showSOM = som;
+ setFullDraw();
+ update();
+ }
+
+ /**
+ * @return if the gradient mode is active
+ */
+ bool gradient() const{
+ return m_showGradient;
+ }
+
+ /**
+ * Defines if the gradient mode will be activated or
+ * deactivated
+ * @param gradient defines if the gradient mode should be activated or not
+ */
+ void setGradient( bool gradient ){
+ m_showGradient = gradient;
+ setFullDraw();
+ update();
+ }
+
+ //XXX can't use Element::TYPE here... why?
+ void setGradientType( int type ){
+ m_gradientType = type;
+ }
+
+ /**
+ * if false, the user disabled tooltips
+ */
+ bool m_tooltipsEnabled;
+
+ bool m_showLegendTooltip;
+
+ /**
+ * activates or deactivates the legend
+ */
+ void showLegend( bool show ){
+ m_showLegend = show;
+ }
+
+ bool showLegend() const{
+ return m_showLegend;
+ }
+
+ bool timeline() const{
+ return m_timeline;
+ }
+
+ void setTimeline( bool timeline ){
+ if ( m_timeline != timeline )
+ m_timeline = timeline;
+ }
+
+ int date() const{
+ return m_date;
+ }
+
+ /**
+ * load the colours from the config file. This is done
+ * on startup and everytime the user changed the configuration
+ */
+ void reloadColours();
+
+ /**
+ * JH: Draw the full table next time
+ */
+ void setFullDraw(){
+ doFullDraw = true;
+ }
+
+ /**
+ * @param type set the scheme
+ * @param which set the type of gradient
+ * @see Element::TYPE
+ */
+ void setLook( PerodicTableView::SCHEMETYPE type, int which = 0 );
+
+ /**
+ * This method paints the marker around the currently selected
+ * element
+ */
+ virtual void paintCurrentSelection();
+
+ private:
+ /**
+ * if true the tooltips will be displayed
+ */
+ bool m_showTooltip;
+
+ /**
+ * the type of the gradient.
+ * @see Element::TYPE
+ */
+ int m_gradientType;
+
+ /**
+ * calculates the min and max values to prepare the painting
+ */
+ void calculateGradient( QPainter* );
+
+ /**
+ * @return true if the mouse is over the legend area
+ */
+ bool pointerOnLegend(int,int);
+
+ /**
+ * @param p The painter for drawing
+ * @param e the element which is to be drawn
+ * @param coeff ?
+ * @param value the value
+ * @param minValue the smallest of all the values
+ */
+ void drawGradientButton( QPainter* p, Element* e, double coeff, double value, double minValue );
+
+ /**
+ * calculates the color of an element which has a value which
+ * is @p percentage of the maximum value. This will be the
+ * color used in the gradient view for an element.
+ */
+ QColor calculateColor( const double percentage );
+
+ /**
+ * the date used in the timeline
+ */
+ int m_date;
+
+ /**
+ * the current colour scheme
+ */
+ int m_currentScheme;
+
+ KalziumTip* m_kalziumTip;
+ bool m_timeline;
+
+ /**
+ * the temperature of the table (for the SOM-feature)
+ */
+ double m_temperature;
+
+ /**
+ * if true the State Of Matter will be shown
+ */
+ bool m_showSOM;
+
+ /**
+ * if true the gradients will be shown
+ */
+ bool m_showGradient;
+
+ /**
+ * timer used for the tooltop
+ */
+ QTimer HoverTimer,
+ MouseoverTimer;
+
+ KalziumDataObject *d;
+
+ /**
+ * the number of the element the mouse-cursor is over
+ */
+ int m_tooltipElementNumber;
+
+ /**
+ * @return the number of the element at position x/y. If there
+ * is no element it will return 0
+ */
+ int ElementNumber( int x, int y );
+
+ /**
+ * @return the coordinates of the element under the mouseCursor.
+ * For example, H will be 1/1 and Li will be 1/2
+ */
+ QPoint ElementUnderMouse();
+
+ /**
+ * the currently selected element (the x/y-coordinates)
+ */
+ QPoint m_currentPoint;
+
+ void mouseReleaseEvent( QMouseEvent* );
+ void mousePressEvent( QMouseEvent* );
+ void mouseMoveEvent( QMouseEvent* );
+
+ QStringList m_IUPAClist;
+ QStringList m_IUPACOLDlist;
+
+ /**
+ * if the the legend will be displayed
+ */
+ bool m_showLegend;
+
+ /**
+ * this is a short, descriptive name of the PerodicTableView
+ */
+ QString m_ShortName;
+
+ /**
+ * true if the molcalc-mode is active
+ */
+ bool m_molcalcIsActive;
+
+ /**
+ * the type of the nummeration ( NO, CAS, IUPACOLD, IUPAC )
+ */
+ NUMERATIONTYPE m_num;
+
+ /**
+ * implements double buffering of the widget.
+ */
+ QPixmap *table; // The basic PerodicTableView
+ QPixmap *table2; // Basic PerodicTableView + extra data such as tooltip, etc
+
+ /**
+ * used for bitBlit. If true the complete table will be drawn
+ */
+ bool doFullDraw;
+
+
+ //I am holding all colours as member so that they don't need to
+ //be reloaded on every reload
+ QColor color_s;//Blocks
+ QColor color_p;
+ QColor color_d;
+ QColor color_f;
+ QColor color_1;//Groups
+ QColor color_2;
+ QColor color_3;
+ QColor color_4;
+ QColor color_5;
+ QColor color_6;
+ QColor color_7;
+ QColor color_8;
+ QColor color_ba;//Acidic
+ QColor color_ac;
+ QColor color_neu;
+ QColor color_amp;
+ QColor c_alkalie;//Family
+ QColor c_rare;
+ QColor c_nonmetal;
+ QColor c_alkaline;
+ QColor c_other_metal;
+ QColor c_halogene;
+ QColor c_transition;
+ QColor c_noble_gas;
+ QColor c_metalloid;
+ QColor c_liquid;
+ QColor c_solid;
+ QColor c_vapor;
+
+ protected:
+ virtual void paintEvent( QPaintEvent *e );
+
+ /**
+ * draw the tooltip for the legend
+ */
+ virtual void drawLegendToolTip( QPainter *p );
+
+ virtual void drawTimeLine( QPainter *p );
+
+ /**
+ * called if the user resized the table
+ */
+ virtual void resizeEvent( QResizeEvent *e );
+
+ /**
+ * the central place for the drawing of the table
+ */
+ virtual void drawPerodicTableView( QPainter* p, bool isCrystal );
+
+ /**
+ * draw a gradient of the type @p type
+ */
+ virtual void drawGradientPerodicTableView( QPainter* p, const double min, const double max );
+
+ /**
+ * draw the state of matter
+ */
+ virtual void drawSOMPerodicTableView( QPainter* p );
+
+ /**
+ * draw the legend
+ */
+ virtual void drawLegend( QPainter* p );
+
+ /**
+ * draw the numeration
+ */
+ virtual void drawNumeration( QPainter* p );
+
+ public slots:
+ /**
+ * This method sets the color for the buttons corresponding to
+ * the given temperature @p temp
+ * @param temp is the temperature to which all buttons will be set
+ */
+ void setTemperature( int temp ){
+ m_temperature = (double)temp;
+ update();
+ }
+
+ void setDate( int date ){
+ //These elements have always been known:
+ //6 16 26 29 33 47 50 51 79 80 82 83
+ m_date = date;
+ update();
+ }
+
+ /**
+ * this slot removes the selection of any point
+ */
+ void unSelect();
+
+ private slots:
+ /**
+ * If called this slot will emit the signal MouseOver( num )
+ * where num is the number of the element the mouse if over.
+ * If the mouse is not over an element nothing will be emited
+ * @see MouseOver()
+ */
+ void slotMouseover();
+
+ /**
+ * start the calculation of the element over which the mouse-cursor
+ * is over. Finally the signal ToolTip( int ) is emitted
+ */
+ void slotTransientLabel();
+
+ /**
+ * this slot updates the currently selected point
+ */
+ void selectPoint( const QPoint& point );
+
+ /**
+ * this slot updates the element given in the @p num
+ * @param num The number of the selected element
+ */
+ void selectElement( int num );
+
+ /**
+ * sets the current element to @p number
+ * and updates the table
+ */
+ void slotToolTip( int number );
+
+ signals:
+ /**
+ * this signal is emitted when the table is clicked
+ */
+ void tableClicked(QPoint);
+
+ /**
+ * this signal is emitted when an element is clicked
+ */
+ void ElementClicked(int);
+
+ /**
+ * this signal is emitted when the tooltip of an element
+ * has to be displayed
+ */
+ void ToolTip(int);
+
+ /**
+ * This signal is emited when the mouse pointer is
+ * over an element
+ */
+ void MouseOver( int );
+};
+
+
+#endif