diff options
Diffstat (limited to 'kanagram/src/leitnersystemview.cpp')
-rw-r--r-- | kanagram/src/leitnersystemview.cpp | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/kanagram/src/leitnersystemview.cpp b/kanagram/src/leitnersystemview.cpp new file mode 100644 index 00000000..f8736471 --- /dev/null +++ b/kanagram/src/leitnersystemview.cpp @@ -0,0 +1,216 @@ +// +// C++ Implementation: leitnersystemview +// +// Description: +// +// +// Author: Martin Pfeiffer <martin-pfeiffer-bensheim@web.de>, (C) 2005 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "leitnersystemview.h" + +#include "leitnersystem.h" +//#include "kwordquiz.h" + +#include <stdlib.h> +#include <kiconloader.h> +#include <qpainter.h> + +#include <kdebug.h> + +LeitnerSystemView::LeitnerSystemView(QWidget * parent, const char* name, WFlags f) + : QScrollView(parent, name, f) +{ + m_highlightedBox = -1; +} + + +LeitnerSystemView::~LeitnerSystemView() +{ +} + +void LeitnerSystemView::drawSystem(QPainter* p) +{ + kdDebug() << "drawSystem( )" << endl; + + + //einarbeiten von m_selectedBox... aus prefLeitner + + m_imageY = height() / 2 - 32; + + //draw the boxes' icons + for(int i = 0; i < m_leitnerSystem->getNumberOfBoxes(); i++) + { + if(i == m_highlightedBox) + { + //p->drawPixmap(12 + i * 64 + i*10, m_imageY, KGlobal::iconLoader()->loadIcon("leitnerbox", KIcon::Panel)); + p->drawRect(12 + i * 64 + i*10, m_imageY,64,64); + p->fillRect(12 + i * 64 + i*10, m_imageY,64,64, QBrush(red)); + } + else + { //for each box 74 = 64(pixmap) + 10(distance between two boxes) + //p->drawPixmap(12 + i * 74, m_imageY, KGlobal::iconLoader()->loadIcon("leitnerbox", KIcon::Panel)); + p->drawRect(12 + i * 64 + i*10, m_imageY,64,64); + } + } +} + +void LeitnerSystemView::drawConnections(QPainter* p) +{ + //dist = number of boxes that are in between the two boxes + //width = width of the rect for the arc + int dist, width = 0; + int numberOfBoxes = m_leitnerSystem->getNumberOfBoxes(); + + p->setPen( QPen(green, 2) ); + + //paint the connections for the correct word boxes, above the boxes + for(int i = 0; i < numberOfBoxes; i++) + { + dist = m_leitnerSystem->getCorrectBoxNumber( i ) - i; + + if(dist <= 0) + { + // (dist*(-1) -1)*64 == for each box in between take 64 + // dist*(-1)*10 == the gaps in between + // 2*22; 2*21 == the distances of the endings on the picture + width = (dist*(-1) -1)*64 + dist*(-1)*10 + 2*22 + 2*21; + + p->drawArc( 12 + (dist+i)*74 + 21, m_imageY-(width/3), width, /*(height()/2 - 12-32) *2*/ width/3*2, 0, 180*16); + } + else + { + width = (dist-1)*64 + dist*10 + 2*21; + p->drawArc(12 + i*74 + 21+22 ,m_imageY-(width/3) , width, /*(height()/2 - 12-32) *2*/width/3*2, 0, 180*16); + } + + } + + //paint the connections for the wrong word boxes, below the boxes + p->setPen(QPen(red, 2)); + + for(int i = 0; i < numberOfBoxes; i++) + { + dist = m_leitnerSystem->getWrongBoxNumber( i ) - i; + + if(dist <= 0) + { + width = (dist*(-1) -1)*64 + dist*(-1)*10 + 2*22 + 2*21; + p->drawArc(12+ (dist+i)*74 + 21 ,m_imageY+64-width/3 , width, width/3*2 , 180*16, 180*16); + } + else + { + width = (dist-1)*64 + dist*10 + 2*21; + p->drawArc(12 + i*74 + 21+22 ,m_imageY+64-width/3 , width, width/3*2, 180*16, 180*16); + } + } + +} + +void LeitnerSystemView::setSystem(LeitnerSystem* leitnersystem) +{ + m_leitnerSystem = leitnersystem; + + //calculate the new sizes + calculateSize(); + updateContents(); + //repaint + //update(); + //QPainter* p = new QPainter(this); + //drawContents( p, 0, 0, 0, 0 ); +} + +void LeitnerSystemView::highlightBox(int box) +{ + m_highlightedBox = box; + updateContents(); +} + +void LeitnerSystemView::drawContents(QPainter* p, int clipx, int clipy, int clipw, int cliph) +{ + kdDebug() << "drawContents" << endl; + p->eraseRect(0,0,width(),height()); + + drawSystem( p ); + + drawConnections( p ); +} + +void LeitnerSystemView::calculateSize() +{ + //margin = 12 + //distance between boxes = 10 + //boxes = 64*64 + + int numberOfBoxes = m_leitnerSystem->getNumberOfBoxes(); + QString x; + int height, dist, tmpMaxC, tmpMaxW; + tmpMaxC = 0; + tmpMaxW = 0; + height = 0; + + for(int i = 0; i < numberOfBoxes; i++) + { + dist = m_leitnerSystem->getCorrectBoxNumber( i ) - i; + + if( abs(dist) >= abs(tmpMaxC) ) + tmpMaxC = dist; + + dist = m_leitnerSystem->getWrongBoxNumber( i ) - i; + + if( abs(dist) >= abs(tmpMaxW) ) + tmpMaxW = dist; + } + + if( tmpMaxC <= 0 ) + height += (( abs(tmpMaxC) -1)*64 + abs(tmpMaxC)*10 + 2*22 + 2*21)/3; + else + height += (( tmpMaxC-1)*64 + tmpMaxC*10 + 2*21)/3; + + if( tmpMaxW <= 0 ) + height += (( abs(tmpMaxW) -1)*64 + abs(tmpMaxW)*10 + 2*22 + 2*21)/3; + else + height += (( tmpMaxW-1)*64 + tmpMaxW*10 + 2*21)/3; + + height += 24+64; + + resizeContents( numberOfBoxes * 64 + (numberOfBoxes - 1)*10 + 2 * 12, height ); + setMinimumSize( numberOfBoxes * 64 + (numberOfBoxes - 1)*10 + 2 * 12, height ); +} + +void LeitnerSystemView::mousePressEvent(QMouseEvent* e) +{ + kdDebug() << "mouseClick" << endl; + //if the user has clicked into a box + if(e->y() > m_imageY && e->y() < m_imageY + 64 && e->x() < width()-13) + { + int d = (e->x()-12)/74; + + if((e->x()-12-74*d) <= 64) + { + //signal for prefLeitner to set the comboboxes to the clicked box + emit boxClicked( d ); + m_highlightedBox = d; + + updateContents(); + } + else + { + emit boxClicked( -1 ); + m_highlightedBox = -1; + + updateContents(); + } + } + else + { + emit boxClicked( -1 ); + m_highlightedBox = -1; + + updateContents(); + } +} + + |