diff options
Diffstat (limited to 'kalzium/src/somwidget_impl.cpp')
-rw-r--r-- | kalzium/src/somwidget_impl.cpp | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/kalzium/src/somwidget_impl.cpp b/kalzium/src/somwidget_impl.cpp new file mode 100644 index 00000000..ae1c19d8 --- /dev/null +++ b/kalzium/src/somwidget_impl.cpp @@ -0,0 +1,172 @@ +/*************************************************************************** + copyright : (C) 2005 by Carsten Niehaus + email : [email protected] + ***************************************************************************/ +/*************************************************************************** + * * + * 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 "somwidget_impl.h" + +#include <qlabel.h> +#include <qpair.h> +#include <qslider.h> +#include <qtextedit.h> +#include <qvaluelist.h> + +#include <kdebug.h> +#include <knuminput.h> +#include <klocale.h> + +#include <math.h> + +#include "element.h" +#include "kalziumdataobject.h" +#include "prefs.h" +#include "tempunit.h" + +SOMWidgetIMPL::SOMWidgetIMPL( QWidget *parent, const char* name ) + : SOMWidget( parent,name ) +{ + m_list = KalziumDataObject::instance()->ElementList; + + text->setAlignment( text->alignment() | Qt::WordBreak ); + text->setTextFormat( Qt::RichText ); + text->setReadOnly( true ); + text->setPaletteBackgroundColor( paletteBackgroundColor() ); + text->setFrameStyle( QFrame::NoFrame ); + + m_htmlBegin = "<qt>"; + m_htmlEnd = "</qt>"; + m_prevUnit = Prefs::temperature(); + + connect( Number1, SIGNAL( valueChanged( double ) ), + this, SLOT( spinValueChanged( double ) ) ); + connect( temp_slider, SIGNAL( valueChanged( int ) ), + this, SLOT( sliderValueChanged( int ) ) ); + connect( Number1, SIGNAL( valueChanged( double ) ), + this, SLOT( setNewTemp( double ) ) ); + + reloadUnits(); +} + +void SOMWidgetIMPL::reloadUnits() +{ + lblUnit->setText( TempUnit::unitListSymbol( Prefs::temperature() ) ); + QPair<double, double> range = TempUnit::rangeForUnit( Prefs::temperature() ); + + double newvalue = TempUnit::convert( Number1->value(), m_prevUnit, Prefs::temperature() ); + Number1->setRange( range.first, range.second, 0.1, 1 ); + Number1->setValue( newvalue ); + setNewTemp( newvalue ); +kdDebug() << "min: " << Number1->minValue() << " - max: " << Number1->maxValue() << endl; + m_prevUnit = Prefs::temperature(); +} + +void SOMWidgetIMPL::sliderValueChanged( int temp ) +{ +// TODO check if in Qt4 the RangeControl emits the signal again + disconnect( Number1, SIGNAL( valueChanged( double ) ), + this, SLOT( spinValueChanged( double ) ) ); + disconnect( temp_slider, SIGNAL( valueChanged( int ) ), + this, SLOT( sliderValueChanged( int ) ) ); + disconnect( Number1, SIGNAL( valueChanged( double ) ), + this, SLOT( setNewTemp( double ) ) ); + double newvalue = TempUnit::convert( (double)temp, (int)TempUnit::Kelvin, Prefs::temperature() ); + Number1->setValue( newvalue ); + setNewTemp( newvalue ); + connect( Number1, SIGNAL( valueChanged( double ) ), + this, SLOT( spinValueChanged( double ) ) ); + connect( temp_slider, SIGNAL( valueChanged( int ) ), + this, SLOT( sliderValueChanged( int ) ) ); + connect( Number1, SIGNAL( valueChanged( double ) ), + this, SLOT( setNewTemp( double ) ) ); +} + +void SOMWidgetIMPL::spinValueChanged( double temp ) +{ + disconnect( Number1, SIGNAL( valueChanged( double ) ), + this, SLOT( spinValueChanged( double ) ) ); + disconnect( temp_slider, SIGNAL( valueChanged( int ) ), + this, SLOT( sliderValueChanged( int ) ) ); + disconnect( Number1, SIGNAL( valueChanged( double ) ), + this, SLOT( setNewTemp( double ) ) ); + int newvalue = (int)TempUnit::convert( temp, Prefs::temperature(), (int)TempUnit::Kelvin ); + temp_slider->setValue( newvalue ); + setNewTemp( temp ); + connect( Number1, SIGNAL( valueChanged( double ) ), + this, SLOT( spinValueChanged( double ) ) ); + connect( temp_slider, SIGNAL( valueChanged( int ) ), + this, SLOT( sliderValueChanged( int ) ) ); + connect( Number1, SIGNAL( valueChanged( double ) ), + this, SLOT( setNewTemp( double ) ) ); +} + +void SOMWidgetIMPL::setNewTemp( double newtemp ) +{ + static const int threshold = 25; + + double temp = TempUnit::convert( newtemp, Prefs::temperature(), (int)TempUnit::Kelvin ); + + QValueList<Element*>::ConstIterator it = m_list.begin(); + const QValueList<Element*>::ConstIterator itEnd = m_list.end(); + + QStringList listMeltingPoint; + QStringList listBoilingPoint; + QStringList listBoilingPointValue; + QStringList listMeltingPointValue; + for ( ; it != itEnd; ++it ) + { + if ( ( ( *it )->melting() > 0.0 ) && fabs( ( *it )->melting() - temp ) <= threshold ) + { + listMeltingPoint << ( *it )->elname(); + listMeltingPointValue << ( *it )->adjustUnits( Element::MELTINGPOINT ); + } + if ( ( ( *it )->boiling() > 0.0 ) && fabs( ( *it )->boiling() - temp ) <= threshold ) + { + listBoilingPoint << ( *it )->elname(); + listBoilingPointValue << ( *it )->adjustUnits( Element::BOILINGPOINT ); + } + } + QString htmlcode; + if ( listMeltingPoint.count() > 0 ) + { + htmlcode += i18n( "Elements with melting point around this temperature:" ) + "<br>"; + for ( uint i = 0; i < listMeltingPoint.count(); i++ ) + { + htmlcode += " <b>·</b> " + i18n( "For example: Carbon (300K)", "%1 (%2)" ).arg( listMeltingPoint[i] ).arg( listMeltingPointValue[i] ) + "<br>"; + } + htmlcode += "<br>"; + } + else + { + htmlcode += i18n( "No elements with a melting point around this temperature" ); + htmlcode += "<br><br>"; + } + if ( listBoilingPoint.count() > 0 ) + { + htmlcode += i18n( "Elements with boiling point around this temperature:" ) + "<br>"; + for ( uint i = 0; i < listBoilingPoint.count(); i++ ) + { + htmlcode += " <b>·</b> " + i18n( "For example: Carbon (300K)", "%1 (%2)" ).arg( listBoilingPoint[i] ).arg( listBoilingPointValue[i] ) + "<br>"; + } + htmlcode += "<br>"; + } + else + { + htmlcode += i18n( "No elements with a boiling point around this temperature" ); + htmlcode += "<br>"; + } + +// kdDebug() << m_htmlBegin + htmlcode + m_htmlEnd << endl; + + text->setText( m_htmlBegin + htmlcode + m_htmlEnd ); + +} + +#include "somwidget_impl.moc" |