summaryrefslogtreecommitdiffstats
path: root/kalzium/src/detailedgraphicaloverview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kalzium/src/detailedgraphicaloverview.cpp')
-rw-r--r--kalzium/src/detailedgraphicaloverview.cpp232
1 files changed, 232 insertions, 0 deletions
diff --git a/kalzium/src/detailedgraphicaloverview.cpp b/kalzium/src/detailedgraphicaloverview.cpp
new file mode 100644
index 00000000..56c086ff
--- /dev/null
+++ b/kalzium/src/detailedgraphicaloverview.cpp
@@ -0,0 +1,232 @@
+/***************************************************************************
+
+copyright : (C) 2004, 2005 by Carsten Niehaus
+email : 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. *
+ * *
+ ***************************************************************************/
+#include "detailedgraphicaloverview.h"
+#include "element.h"
+#include "kalziumutils.h"
+
+//KDE-Includes
+#include <kdebug.h>
+#include <klocale.h>
+#include <kglobalsettings.h>
+#include <kglobal.h>
+
+//QT-Includes
+#include <qpainter.h>
+#include <qstring.h>
+#include <qpixmap.h>
+#include <qrect.h>
+
+DetailedGraphicalOverview::DetailedGraphicalOverview( Element *el, QWidget *parent, const char *name )
+: QWidget( parent, name )
+{
+ init( el );
+}
+
+DetailedGraphicalOverview::DetailedGraphicalOverview( QWidget *parent, const char *name )
+: QWidget( parent, name )
+{
+ init( 0L );
+}
+
+void DetailedGraphicalOverview::init( Element *el )
+{
+ setBackgroundMode( NoBackground );
+
+ m_element = el;
+ setMinimumSize( 300, 200 );
+ update();
+}
+
+void DetailedGraphicalOverview::paintEvent( QPaintEvent* )
+{
+ int h = height();
+ int w = width();
+
+ QPixmap pm( w, h );
+
+ QPainter p;
+ p.begin( &pm );
+
+ p.setBrush(Qt::SolidPattern);
+
+ if ( !m_element )
+ {
+ pm.fill( paletteBackgroundColor() );
+ p.drawText( 0, 0, w, h, Qt::AlignCenter | Qt::WordBreak, i18n( "No element selected" ) );
+ }
+ else
+ {
+
+ h_t = 20; //height of the texts
+
+ x1 = 0;
+ y1 = 0;
+
+ x2 = w;
+ y2 = h;
+
+ p.setBrush( m_element->elementColor() );
+ p.drawRect( x1 , y1 , x2 , y2 );
+
+ p.setBrush( Qt::black );
+ p.setBrush(Qt::NoBrush);
+
+ QFont fA = KGlobalSettings::generalFont();
+ QFont fB = KGlobalSettings::generalFont();
+ QFont fC = KGlobalSettings::generalFont();
+
+ QString strLocalizedMass = KalziumUtils::localizedValue( m_element->mass(), 6 );
+
+ fA.setPointSize( fA.pointSize() + 20 ); //Huge font
+ fA.setBold( true );
+ fB.setPointSize( fB.pointSize() + 6 ); //Big font
+ fC.setPointSize( fC.pointSize() + 4 ); //Big font
+ fC.setBold( true );
+ QFontMetrics fmA = QFontMetrics( fA );
+ QFontMetrics fmB = QFontMetrics( fB );
+
+ //coordinates for element symbol: near the center
+ int xA = 4 * w / 10;
+ int yA = h / 2;
+
+ //coordinates for the atomic number: offset from element symbol to the upper left
+ int xB = xA - fmB.width( QString::number( m_element->number() ) );
+ int yB = yA - fmA.height() + fmB.height();
+
+ //Element Symbol
+ p.setFont( fA );
+ p.drawText( xA, yA , m_element->symbol() );
+
+ //Atomic number
+ p.setFont( fB );
+ p.drawText( xB, yB, QString::number( m_element->number() ));
+
+ QRect rect( 0, 20, w/2, h );
+
+ p.setFont( fC );
+
+ int size = KalziumUtils::maxSize(m_element->elname(), rect , fC, &p);
+ int size2 = KalziumUtils::maxSize(m_element->oxstage(), rect, fC, &p);
+ int size3 = KalziumUtils::maxSize( strLocalizedMass , rect , fC, &p);
+
+ //Name and other data
+ fC.setPointSize( size );
+ p.setFont( fC );
+
+ //Name
+ p.drawText( 1, 0, w/2, h, Qt::AlignLeft, m_element->elname() );
+
+ //Oxidationstates
+ fC.setPointSize( size2 );
+ p.setFont( fC );
+ int offsetOx = KalziumUtils::StringHeight( strLocalizedMass , fC, &p );
+ p.drawText( 1, h-offsetOx, w/2, offsetOx, Qt::AlignLeft, m_element->oxstage() );
+
+ //Mass
+ fC.setPointSize( size3 );
+ p.setFont( fC );
+
+ int offset = KalziumUtils::StringHeight( strLocalizedMass, fC, &p );
+ p.drawText( w/2, h-offset, w/2, offset, Qt::AlignRight, strLocalizedMass );
+
+ drawBiologicalSymbol( &p );
+ }
+
+ p.end();
+
+
+ bitBlt( this, 0, 0, &pm );
+}
+
+void DetailedGraphicalOverview::drawBiologicalSymbol( QPainter *p )
+{
+ if ( !m_element ) return;
+ const int db = h_t; //diameter of the big circle
+ const int ds = db/2; //diameter of the inner circle
+
+ int d_ds = ( db/2 )-( ds/2 ); //the delta-x/y of the inner circle
+
+ int pos_x = width() - 4 - db;
+ int pos_y = 4;
+
+ if ( m_element->biological() > 0 )
+ {
+ const int radius = db + 8;
+ p->setBrush( Qt::SolidPattern );
+ p->setBrush( Qt::white );
+ p->setPen( Qt::black );
+ p->drawRoundRect( QRect( width() - radius,
+ -radius,
+ 2 * radius,
+ 2 * radius ), 70, 70 );
+ }
+
+ switch ( m_element->biological() )
+ {
+ case 0: //nothing
+ break;
+ case 1: //red, red
+ p->setBrush( Qt::red );
+ p->setBrush(Qt::NoBrush);
+ p->setPen( Qt::red );
+ p->drawEllipse( pos_x,pos_y,db,db );
+ p->setBrush(Qt::SolidPattern);
+ p->setBrush( Qt::red );
+ p->drawEllipse( pos_x+d_ds, pos_y+d_ds, ds, ds );
+ break;
+ case 2: //green, red
+ p->setBrush( Qt::red );
+ p->setBrush(Qt::NoBrush);
+ p->setPen( Qt::red );
+ p->drawEllipse( pos_x,pos_y,db,db );
+ p->setBrush(Qt::SolidPattern);
+ p->setBrush( Qt::green );
+ p->setPen( Qt::green );
+ p->drawEllipse( pos_x+d_ds, pos_y+d_ds, ds, ds );
+ break;
+ case 3: //green
+ p->setBrush(Qt::SolidPattern);
+ p->setBrush( Qt::green );
+ p->setPen( Qt::green );
+ p->drawEllipse( pos_x+d_ds, pos_y+d_ds, ds, ds );
+ break;
+ case 4: //green, blue
+ p->setBrush( Qt::blue );
+ p->setBrush(Qt::NoBrush);
+ p->setPen( Qt::blue );
+ p->drawEllipse( pos_x,pos_y,db,db );
+ p->setBrush(Qt::SolidPattern);
+ p->setBrush( Qt::green );
+ p->setPen( Qt::green );
+ p->drawEllipse( pos_x+d_ds, pos_y+d_ds, ds, ds );
+ break;
+ case 5: //blue
+ p->setBrush(Qt::SolidPattern);
+ p->setBrush( Qt::blue );
+ p->setPen( Qt::blue );
+ p->drawEllipse( pos_x+d_ds, pos_y+d_ds, ds, ds );
+ break;
+ case 6: //blue, blue
+ p->setBrush( Qt::blue );
+ p->setBrush(Qt::NoBrush);
+ p->setPen( Qt::blue );
+ p->drawEllipse( pos_x,pos_y,db,db );
+ p->setBrush(Qt::SolidPattern);
+ p->drawEllipse( pos_x+d_ds, pos_y+d_ds, ds, ds );
+ break;
+ }
+}
+
+#include "detailedgraphicaloverview.moc"