/*************************************************************************** resultwidget.h - paint the result ------------------- begin : 2004/05/30 copyright : (C) 2004 by Sebastian Stein email : seb.kde@hpfsc.de copyright : (C) 2008 by Tadeu Araujo, tadeu.araujo@ltia.fc.unesp.br copyright : (C) 2008 by Danilo Balzaque, danilo.balzaque@ltia.fc.unesp.br ***************************************************************************/ /*************************************************************************** * * * 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 "resultwidget.h" #include "resultwidget.moc" /* these includes are needed for Qt support */ #include #include #include //Added by qt3to4: #include #include "settingsclass.h" #include ResultWidget::ResultWidget(QWidget * parent, const uintList para_factors) : FractionBaseWidget(parent), m_factors(para_factors) { #ifdef DEBUG kDebug() << "constructor ResultWidget"; #endif Init(); m_ExerciseView = 0; } ResultWidget::ResultWidget(QWidget * parent, const ratio para_result) : FractionBaseWidget(parent), m_result(para_result) { #ifdef DEBUG kDebug() << "constructor ResultWidget"; #endif Init(); m_ExerciseView = 1; } ResultWidget::ResultWidget(QWidget * parent) : FractionBaseWidget(parent) { #ifdef DEBUG kDebug() << "constructor ResultWidget"; #endif Init(); m_ExerciseView = 2; } void ResultWidget::setFactors(const uintList para_factors) { m_factors = para_factors; update(); } void ResultWidget::Init() { #ifdef DEBUG kDebug() << "ResultWidget::Init()"; #endif setMinimumWidth( 160 ); setMaximumHeight( 213 ); setMinimumHeight( 213 ); m_solutionMixed = true; m_kindView = -1; defaultFont = SettingsClass::taskFont(); defaultFont.setBold( true ); QPalette pal = palette(); pal.setColor(QPalette::Foreground, Qt::white); setPalette(pal); m_primaryText = new QLabel("",this); m_primaryText->setObjectName("primaryText"); m_primaryText->setPalette(pal); defaultFont.setPointSize(20); m_primaryText->setMinimumHeight(75); m_primaryText->setAlignment(Qt::AlignCenter); m_primaryText->setFont(defaultFont); m_primaryText->hide(); m_secondaryText = new QLabel(i18n("Solution:"),this); m_secondaryText->setObjectName("secondaryText"); m_secondaryText->setPalette(pal); defaultFont.setPointSize(10); m_secondaryText->setAlignment(Qt::AlignCenter); m_secondaryText->setAlignment(Qt::AlignVCenter | Qt::AlignLeft); m_secondaryText->setFont(defaultFont); m_secondaryText->hide(); defaultFont.setPointSize(20); layout = new QGridLayout(this); layout->addWidget(m_primaryText,0,0); layout->addWidget(m_secondaryText,1,0); setLayout(layout); } ResultWidget::~ResultWidget() { #ifdef DEBUG kDebug() << "destructor ResultWidget"; #endif } int ResultWidget::KindView() { return m_kindView; } void ResultWidget::showResult() { #ifdef DEBUG kDebug() << "ResultWidget::showResult"; #endif switch (m_kindView) { case 1: m_primaryText->show(); m_secondaryText->hide(); m_primaryText->setText(i18n("Correct!")); layout->setRowStretch(2,0); layout->setRowStretch(0,1); break; case 0: m_primaryText->show(); m_secondaryText->show(); m_primaryText->setText(i18n("Incorrect!")); layout->setRowStretch(2,1); layout->setRowStretch(0,0); break; case 2: m_primaryText->show(); m_secondaryText->hide(); m_primaryText->setText(i18n("Incorrect!")); layout->setRowStretch(2,0); layout->setRowStretch(0,1); break; default: setFixedSize( 160, 213 ); m_primaryText->hide(); m_secondaryText->hide(); } update(); } void ResultWidget::setResult(const ratio para_result, int k) { #ifdef DEBUG kDebug() << "ResultWidget::setResult"; kDebug() << "m_kindView = " + k; #endif m_kindView = k; m_result = para_result; showResult(); } void ResultWidget::setSolutionMixed(bool value) { #ifdef DEBUG kDebug() << "ResultWidget::setSolutionMixed"; #endif m_solutionMixed = value; } void ResultWidget::setResult(int k) { #ifdef DEBUG kDebug() << "ResultWidget::setResult"; kDebug() << "m_kindView = " + k; #endif m_kindView = k; showResult(); } void ResultWidget::paintEvent(QPaintEvent* /* p_paintEvent */) { // our x position, we paint from left to right; // we don't want to start directly on the border, so add the margin int old_x = 30; int old_y = 123; int fontWidth; // to store the width of the last thing painted // start the painter QPainter paint(this); paint.setRenderHint(QPainter::Antialiasing); paint.setPen(QPen(Qt::NoPen)); switch (m_kindView) { case 2: paint.setBrush( QColor(191, 0, 0) ); paint.drawRoundedRect(2.0, 2.0, 157.0, 209.0, 10, 10); break; case 1: paint.setBrush( QColor(0, 191, 0) ); paint.drawRoundedRect(2.0, 2.0, 157.0, 209.0, 10, 10); break; case 0: paint.setBrush( QColor(191,0,0) ); paint.drawRoundedRect(2.0, 2.0, width()-3, 209.0, 10, 10); // 2.0, 2.0, 157.0, 209.0, 10, 10 paint.setBrush( QColor(255, 255, 255) ); paint.drawRoundedRect(8.0, 110.0, width()-15, 93.0, 10, 10); // 8.0, 110.0, 145.0, 93.0, 10, 10 // ratios and operation signs are painted with the same font paint.setFont(defaultFont); // set the pen for painting QPen pen(Qt::SolidLine); pen.setWidth(0); paint.setPen(pen); // get the font height; the font height doesn't change while painting QFontMetrics fm(paint.fontMetrics()); if (m_ExerciseView == 1) { if (SettingsClass::showSpecialRatioNotation() == true && qAbs(m_result.numerator()) >= qAbs(m_result.denominator()) && m_result.denominator() != 1 && m_solutionMixed == true) { paintRatio(paint, m_result, old_x, old_y, fm, false, true, false); paintMiddle(paint, QString(i18n(" or ")), old_x, old_y, fm, m_colorOperation); paintRatio(paint, m_result, old_x, old_y, fm, true, true, false); } else paintRatio(paint, m_result, old_x, old_y, fm, false, true, true); } else { old_y+= 20; QString tmpStr; int fontHeight = fm.lineSpacing(); // get the font height int tmpWidth = 0; for (int tmpInt = 0; tmpInt < m_factors.count(); tmpInt++) { if (tmpInt != 0) { tmpWidth += fm.width("*"); } tmpStr.setNum(m_factors[tmpInt]); fontWidth = fm.width(tmpStr); tmpWidth += fontWidth; } if (tmpWidth <= 100) old_x+= 50 - tmpWidth/2; for (int tmpInt = 0; tmpInt < m_factors.count(); tmpInt++) { if (tmpInt != 0) { fontWidth = fm.width("*"); paint.drawText(old_x, old_y, fontWidth, fontHeight, Qt::AlignCenter, "*"); old_x += fontWidth; } tmpStr.setNum(m_factors[tmpInt]); fontWidth = fm.width(tmpStr); paint.drawText(old_x, old_y, fontWidth, fontHeight, Qt::AlignCenter, tmpStr); old_x += fontWidth; } } old_x+=30; if ( old_x > 160 ) setMinimumWidth(old_x); break; } // stop the painter paint.end(); return; }