moved kdeaccessibility kdeaddons kdeadmin kdeartwork kdebindings kdeedu kdegames...
[kdeedu.git] / kalzium / src / elementdataviewer.cpp
blob0486922ff70bd14dbbbdb12e0ddb3efdf37dc36c
1 /***************************************************************************
3 elementdataviewer.cpp - description
4 -------------------
5 copyright : (C) 2004 by Carsten Niehaus
6 email : cniehaus@kde.org
7 ***************************************************************************/
9 /***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
18 #include "elementdataviewer.h"
19 #include "plotsetupwidget.h"
20 #include <klocale.h>
21 #include <knuminput.h>
22 #include <kcombobox.h>
23 #include <kdebug.h>
25 //QT-Includes
26 #include <qframe.h>
27 #include <qlayout.h>
28 #include <qcheckbox.h>
30 ElementDataViewer::ElementDataViewer( KalziumDataObject *data, QWidget *parent, const char* name )
31 : KDialogBase( KDialogBase::Plain,
32 i18n( "Visualize Data") ,
33 User1 | Close,
34 User1,
35 parent, name )
37 kdDebug() << "ElementDataViewer" << endl;
39 d = data;
41 yData = new AxisData();
43 QFrame *page = plainPage();
44 QHBoxLayout *hlay = new QHBoxLayout(page, 0, spacingHint() );
45 QVBoxLayout *vlay = new QVBoxLayout(hlay, 0 );
46 m_pPlotSetupWidget = new PlotSetupWidget( page, "psw" );
47 m_pPlotWidget = new PlotWidget( 0.0,12.0,0.0,22.0, page, "plotwidget" );
49 hlay->addWidget( m_pPlotSetupWidget );
50 vlay->addWidget( m_pPlotWidget);
53 * setup the list of names
54 **/
55 EList::iterator it = d->ElementList.begin();
56 for( ; it != d->ElementList.end() ; ++it )
58 names.append( (*it)->elname() );
61 resize(500, 500);
63 setButtonText( User1, i18n("&Plot") );
65 connect ( m_pPlotSetupWidget->showNames, SIGNAL( toggled(bool)), this, SLOT(slotUser1()));
68 void ElementDataViewer::slotUser1()
70 kdDebug() << "slotUser1" << endl;
72 drawPlot();
75 void ElementDataViewer::setLimits(int f, int t)
77 kdDebug() << "setLimits()" << endl;
79 double minY = yData->value(f);
80 double maxY = yData->value(f);
82 int _currentVal = f;
83 int _to = t;
85 while( _currentVal < _to )
87 double v = yData->value( _currentVal );
89 if( minY > v )
90 minY = v;
91 if( maxY < v)
92 maxY = v;
94 _currentVal++;
97 m_pPlotWidget->setLimits( (double)f, (double)t, minY, maxY );
100 void ElementDataViewer::paintEvent(QPaintEvent*)
102 m_pPlotWidget->update();
105 void ElementDataViewer::keyPressEvent(QKeyEvent *e)
107 switch ( e->key() )
109 case Key_Plus:
110 case Key_Equal:
111 slotZoomIn();
112 break;
113 case Key_Minus:
114 case Key_Underscore:
115 slotZoomOut();
116 break;
117 case Key_Escape:
118 close();
119 break;
123 void ElementDataViewer::slotZoomIn(){}
124 void ElementDataViewer::slotZoomOut(){}
126 void ElementDataViewer::setupAxisData()
128 kdDebug() << "setupAxisData()" << endl;
130 DoubleList l;
132 const int selectedData = m_pPlotSetupWidget->KCB_y->currentItem();
134 //this should be somewhere else, eg in its own method
135 yData->m_currentDataType = selectedData;
137 EList::iterator it = d->ElementList.begin();
138 switch(selectedData)
140 case AxisData::WEIGHT:
141 for( ; it != d->ElementList.end() ; ++it ) {
142 double value = (*it)->weight();
143 if( value != -1 )
144 l.append( value );
145 else
146 l.append( 0.0 );
147 m_pPlotWidget->setYAxisLabel(i18n("Atomic Weight [u]"));
149 break;
150 case AxisData::MEANWEIGHT:
151 for( ; it != d->ElementList.end() ; ++it ) {
152 double value =(*it)->meanweight();
153 if( value != -1 )
154 l.append( value );
155 else
156 l.append( 0.0 );
157 m_pPlotWidget->setYAxisLabel(i18n("Mean Weight [u]"));
159 break;
160 case AxisData::DENSITY:
161 for( ; it != d->ElementList.end() ; ++it ) {
162 double value =(*it)->density();
163 if( value != -1 )
164 l.append( value );
165 else
166 l.append( 0.0 );
167 m_pPlotWidget->setYAxisLabel(i18n("Density"));
169 break;
170 case AxisData::IE1:
171 for( ; it != d->ElementList.end() ; ++it ) {
172 double value = (*it)->ie();
173 if( value != -1 )
174 l.append( value );
175 else
176 l.append( 0.0 );
177 m_pPlotWidget->setYAxisLabel(i18n("1. Ionization Energy"));
179 break;
180 case AxisData::IE2:
181 for( ; it != d->ElementList.end() ; ++it ) {
182 double value = (*it)->ie2();
183 if( value != -1 )
184 l.append( value );
185 else
186 l.append( 0.0 );
187 m_pPlotWidget->setYAxisLabel(i18n("2. Ionization Energy"));
189 break;
190 case AxisData::EN:
191 for( ; it != d->ElementList.end() ; ++it ) {
192 double value = (*it)->electroneg();
193 if( value != -1 )
194 l.append( value );
195 else
196 l.append( 0.0 );
197 m_pPlotWidget->setYAxisLabel(i18n("Electronegativity"));
199 break;
200 case AxisData::MELTINGPOINT:
201 for( ; it != d->ElementList.end() ; ++it ) {
202 double value = (*it)->melting();
203 if( value != -1 )
204 l.append( value );
205 else
206 l.append( 0.0 );
207 m_pPlotWidget->setYAxisLabel(i18n("Melting Point [K]"));
209 break;
210 case AxisData::BOILINGPOINT:
211 for( ; it != d->ElementList.end() ; ++it ) {
212 double value = (*it)->electroneg();
213 if( value != -1 )
214 l.append( value );
215 else
216 l.append( 0.0 );
217 m_pPlotWidget->setYAxisLabel(i18n("Boiling Point [K]"));
219 break;
220 case AxisData::ATOMICRADIUS:
221 for( ; it != d->ElementList.end() ; ++it ) {
222 double value = (*it)->radius();
223 if( value != -1 )
224 l.append( value );
225 else
226 l.append( 0.0 );
227 m_pPlotWidget->setYAxisLabel(i18n("Atomic Radius [pm]"));
229 break;
232 yData->setDataList( l );
235 void ElementDataViewer::drawPlot()
237 kdDebug() << "drawPlot()" << endl;
240 * to be 100% safe delete the old list
242 m_pPlotWidget->clearObjectList();
245 * spare the next step in case everything is already set and done
247 if( yData->currentDataType() != m_pPlotSetupWidget->KCB_y->currentItem() )
248 initData();
251 * if the user selected the elements 20 to 30 the list-values are 19 to 29!!!
253 int from = m_pPlotSetupWidget->from->value();
254 int to = m_pPlotSetupWidget->to->value();
255 kdDebug() << "from :" << from << endl;
256 kdDebug() << "to :" << to << endl;
259 * The number of elements. #20 to 30 are 30-20+1=11 Elements
261 int num = to-from+1;
263 setLimits(from,to);
266 * check if the users wants to see the elementnames or not
268 bool showNames = m_pPlotSetupWidget->showNames->isChecked();
269 bool connectPoints = m_pPlotSetupWidget->connectPoints->isChecked();
271 if ( connectPoints )
273 m_pPlotWidget->setConnection( true );
274 kdDebug() << "setConnection ist wahr" << endl;
276 else
278 m_pPlotWidget->setConnection( false );
279 kdDebug() << "setConnection ist falsch" << endl;
283 * reserve the memory for the KPlotObjects
285 QMemArray<KPlotObject*> dataPoint(num);
286 QMemArray<KPlotObject*> dataPointLabel(num);
288 int number = 0;
291 * iterate for example from element 20 to 30 and contruct
292 * the KPlotObjects
294 kdDebug() << "start the plotting with creating the KPlotObjects" << endl;
295 for( int i = from; i < to+1 ; i++ )
297 dataPoint[number] = new KPlotObject( "whocares", "Blue", KPlotObject::POINTS, 4, KPlotObject::CIRCLE );
298 dataPoint[number]->addPoint( new DPoint( (double)i , yData->value( i ) ) );
299 m_pPlotWidget->addObject( dataPoint[ number ] );
301 if (showNames)
303 dataPointLabel[number] = new KPlotObject( *(names.at(i)), "Red", KPlotObject::LABEL );
304 dataPointLabel[number]->addPoint( new DPoint( (double)i , yData->value( i ) ) );
305 m_pPlotWidget->addObject( dataPointLabel[number] );
308 number++;
310 kdDebug() << "plotting ended" << endl;
313 void ElementDataViewer::initData()
315 kdDebug() << "initData()" << endl;
317 setupAxisData();
320 ///////////////////////////////////////////////7
322 AxisData::AxisData()
325 #include "elementdataviewer.moc"