summaryrefslogtreecommitdiffstats
path: root/kanagram/src/leitnersystemview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kanagram/src/leitnersystemview.cpp')
-rw-r--r--kanagram/src/leitnersystemview.cpp216
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();
+ }
+}
+
+