diff options
Diffstat (limited to 'kpovmodeler/pmformulalabel.cpp')
-rw-r--r-- | kpovmodeler/pmformulalabel.cpp | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/kpovmodeler/pmformulalabel.cpp b/kpovmodeler/pmformulalabel.cpp new file mode 100644 index 00000000..ac2e98d3 --- /dev/null +++ b/kpovmodeler/pmformulalabel.cpp @@ -0,0 +1,190 @@ +/* +************************************************************************** + description + -------------------- + copyright : (C) 2002 by Andreas Zehender + email : zehender@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 "pmformulalabel.h" +#include "pmpolynomexponents.h" + +#include <qapplication.h> +#include <qsimplerichtext.h> +#include <qpainter.h> + +const int c_indent = 3; +const int c_dotSize = 3; + +QString PMFormulaLabel::s_xyz[3] = +{ + QString( "x" ), QString( "y" ), QString( "z" ) +}; + +QString PMFormulaLabel::s_digit[10] = +{ + QString( "0" ), + QString( "1" ), + QString( "2" ), + QString( "3" ), + QString( "4" ), + QString( "5" ), + QString( "6" ), + QString( "7" ), + QString( "8" ), + QString( "9" ) +}; + +QString PMFormulaLabel::s_nullString = QString( "= 0" ); + +PMFormulaLabel::PMFormulaLabel( const PMPolynomExponents& exp, QWidget* parent, const char* name ) + : QWidget( parent, name ) +{ + m_exponents[0] = exp.exponent( 0 ); + m_exponents[1] = exp.exponent( 1 ); + m_exponents[2] = exp.exponent( 2 ); + + calculateSizeHint( ); +} + +PMFormulaLabel::PMFormulaLabel( int x, int y, int z, QWidget* parent, const char* name ) + : QWidget( parent, name ) +{ + m_exponents[0] = x; + m_exponents[1] = y; + m_exponents[2] = z; + + calculateSizeHint( ); +} + +PMFormulaLabel::~PMFormulaLabel( ) +{ +} + +void PMFormulaLabel::drawContents( QPainter* p ) +{ + QRect cr = rect( ); + int i; + cr.setLeft( cr.left( ) + c_indent ); + + int sum = m_exponents[0] + m_exponents[1] + m_exponents[2]; + if( sum == 0 ) + p->drawText( cr, Qt::AlignVCenter | Qt::AlignLeft, s_nullString ); + else + { + // draw dot + int center = ( cr.top( ) + cr.bottom( ) ) / 2; + int rad = c_dotSize / 2; + p->setBrush( QBrush( colorGroup( ).text( ) ) ); + p->drawEllipse( cr.left( ), center - rad, c_dotSize, c_dotSize ); + cr.setLeft( cr.left( ) + c_dotSize + c_indent ); + + QFontMetrics m1( font( ) ); + QFont f2 = exponentFont( ); + QFontMetrics m2( f2 ); + int up = m1.height( ) / 2; + + for( i = 0; i < 3; i++ ) + { + + if( m_exponents[i] > 0 ) + { + p->drawText( cr, Qt::AlignVCenter | Qt::AlignLeft, s_xyz[i] ); + cr.setLeft( cr.left( ) + m1.width( s_xyz[i] ) ); + if( m_exponents[i] > 1 ) + { + cr.setBottom( cr.bottom( ) - up ); + p->setFont( f2 ); + p->drawText( cr, Qt::AlignVCenter | Qt::AlignLeft, + s_digit[m_exponents[i]] ); + cr.setLeft( cr.left( ) + m2.width( s_digit[m_exponents[i]] ) + 1 ); + cr.setBottom( cr.bottom( ) + up ); + p->setFont( font( ) ); + } + } + } + } +} + +void PMFormulaLabel::paintEvent( QPaintEvent* ev ) +{ + QPainter paint( this ); + if( ev->rect( ).intersects( rect( ) ) ) + { + paint.setClipRegion( ev->region( ).intersect( rect( ) ) ); + drawContents( &paint ); + } +} + +void PMFormulaLabel::calculateSizeHint( ) +{ + int sum = m_exponents[0] + m_exponents[1] + m_exponents[2]; + + QFontMetrics m1( font( ) ); + if( sum == 0 ) + m_sizeHint.setWidth( m1.width( s_nullString ) ); + else + { + QFontMetrics m2( exponentFont( ) ); + int width = c_indent * 3 + c_dotSize; + int i; + for( i = 0; i < 3; i++ ) + { + if( m_exponents[i] > 0 ) + { + width += m1.width( s_xyz[i] ); + if( m_exponents[i] > 1 ) + width += m2.width( s_digit[m_exponents[i]] ) + 1; + } + } + m_sizeHint.setWidth( width ); + } + m_sizeHint.setHeight( m1.height( ) + 7 ); +} + +QSize PMFormulaLabel::sizeHint( ) const +{ + return minimumSizeHint( ); +} + +QSize PMFormulaLabel::minimumSizeHint( ) const +{ + return m_sizeHint; +} + +void PMFormulaLabel::fontChange( const QFont& ) +{ + calculateSizeHint( ); +} + + +QFont PMFormulaLabel::exponentFont( ) const +{ + QFont small = font( ); + int fs = small.pointSize( ); + if( fs > 0 ) + { + fs = fs * 2 / 3; + if( fs == 0 ) + fs = 1; + small.setPointSize( fs ); + } + else + { + fs = small.pixelSize( ); + fs = fs * 2 / 3; + if( fs == 0 ) + fs = 1; + small.setPixelSize( fs ); + } + return small; +} |