summaryrefslogtreecommitdiffstats
path: root/kalzium/src/spectrumwidget.h
diff options
context:
space:
mode:
Diffstat (limited to 'kalzium/src/spectrumwidget.h')
-rw-r--r--kalzium/src/spectrumwidget.h234
1 files changed, 234 insertions, 0 deletions
diff --git a/kalzium/src/spectrumwidget.h b/kalzium/src/spectrumwidget.h
new file mode 100644
index 00000000..84a6fd80
--- /dev/null
+++ b/kalzium/src/spectrumwidget.h
@@ -0,0 +1,234 @@
+/***************************************************************************
+ * Copyright (C) 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 SPECTRUMWIDGET_H
+#define SPECTRUMWIDGET_H
+
+#include <qwidget.h>
+
+#include <qpixmap.h>
+
+#include "spectrum.h"
+
+/**
+ * @author Carsten Niehaus
+ *
+ */
+class SpectrumWidget : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ SpectrumWidget( QWidget *parent, const char* name = 0 );
+
+ ~SpectrumWidget(){}
+
+ void setSpectrum( Spectrum* spec ){
+ m_spectrum = spec;
+ update();
+ }
+
+ Spectrum* spectrum()const{
+ return m_spectrum;
+ }
+
+ /**
+ * This limits the width of the spectrum in terms of
+ * wavelength. For example you can set it to only
+ * show the area between 500 and 550 nm. Invalid values
+ * will be set back to the default start- and stopvalues
+ *
+ * @param left the left border
+ * @param right the right border
+ */
+ void setBorders( double left, double right ){
+ //check for invalid values
+ if ( startValue < 0.0 )
+ startValue = 0.0;
+
+ if ( endValue > 800.0 )
+ endValue = 800.0;
+
+ startValue = left;
+ endValue = right;
+
+ update();
+ }
+
+ /**
+ * find the nearest band. The returned value is the number
+ * of pixel the next band is away
+ */
+ int findNearestBand( QValueList<double>::iterator it );
+
+ /**
+ * there are several possible types.
+ */
+ enum SpectrumType
+ {
+ EmissionSpectrum = 0,
+ AbsorptionSpectrum
+ };
+
+ /**
+ * sets the type of the spectrum to @p t
+ * @param t the type of the spectrum
+ */
+ void setType( SpectrumType t ){
+ m_type = t;
+ }
+
+ /**
+ * @return the currently active type
+ * of the spectrum
+ */
+ SpectrumType spectrumType() const{
+ return m_type;
+ }
+
+ /**
+ * @returns the color of a line
+ * @param spectrum the value of the spectrum
+ */
+ QColor linecolor( double spectrum );
+
+ double Gamma;
+ int IntensityMax;
+
+ /**
+ * @return the adjusted value of the @p color. The
+ * correction depends on @p factor which has been
+ * figured out emperically
+ */
+ int Adjust( double color, double factor );
+
+ /**
+ * @return the postion in the widget of a band
+ * with the wavelength @p wavelength
+ *
+ * @param wavelength the wavelength for which the position is needed
+ */
+ inline int xPos( double wavelength ){
+ return ( int ) ( ( wavelength-startValue ) * width() / ( endValue - startValue ) );
+ }
+
+ void PrepareTooltip( double wavelength );
+
+ void showTooltip( Spectrum::band band );
+
+ /**
+ * @param xpos The ratio of the position relative to the width
+ * of the widget.
+ * @return the wavelength on position @p xpos
+ */
+ inline double Wavelength( double xpos ){
+ return startValue + ( ( endValue-startValue ) * xpos );
+ }
+
+ /**
+ * This method changes the three values @p r, @p g and @p b to the
+ * correct values
+ * @param wavelength the wavelength for which the color is searched
+ * @param r red
+ * @param g green
+ * @param b blue
+ */
+ void wavelengthToRGB( double wavelength, int& r, int& g, int& b );
+
+ QPixmap pixmap();
+
+ private:
+ QValueList<double> m_spectra;
+
+ SpectrumType m_type;
+
+ Spectrum *m_spectrum;
+
+ QPixmap m_pixmap;
+
+ bool m_showtooltip;
+
+ Spectrum::band m_band;
+
+ void paintBands( QPainter* p );
+ void drawZoomLine( QPainter* p );
+ void drawTooltip( QPainter *p );
+
+ /**
+ * Draw the scale
+ */
+ void drawTickmarks( QPainter *p );
+
+ double startValue;
+ double endValue;
+
+ int m_realHeight;
+
+ /**
+ * this QPoint stores the information where
+ * the left mouse button has been pressed. This
+ * is used for the mouse zooming
+ */
+ QPoint m_LMBPointPress;
+
+ QPoint m_LMBPointCurrent;
+
+ public slots:
+ /**
+ * set the the maximum value to @p value
+ */
+ void setRightBorder( int value ){
+ endValue = value;
+ if ( endValue < startValue )
+ startValue = endValue-1;
+ update();
+ }
+
+ /**
+ * set the the minimum value to @p value
+ */
+ void setLeftBorder( int value ){
+ startValue = value;
+ if ( startValue > endValue )
+ endValue = startValue+1;
+ update();
+ }
+
+ /**
+ * activates the spectrum of the type @p spectrumtype
+ */
+ void slotActivateSpectrum( int spectrumtype ){
+ m_type = ( SpectrumType )spectrumtype;
+ update();
+ }
+
+ private slots:
+ void slotZoomIn();
+ void slotZoomOut();
+
+ protected:
+ virtual void paintEvent( QPaintEvent *e );
+ virtual void keyPressEvent(QKeyEvent *e);
+ virtual void mouseMoveEvent( QMouseEvent *e );
+ virtual void mousePressEvent( QMouseEvent *e );
+ virtual void mouseReleaseEvent( QMouseEvent *e );
+};
+
+#endif // SPECTRUMWIDGET_H