/*************************************************************************** * Copyright (C) 2007 by Daniel Prynych * * Daniel.Prynych@buzuluk.cz * * * * 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. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "knutanalog.h" /* pocitani uhlu */ /* nula je ve 3 hodiny */ /* prirustek je kladny ve smeru hod rucicek */ #include #include #include #include #include #include #include #include #include #include KNutAnalog::KNutAnalog( QWidget *parent, const char *name, int bottomLimit, int topLimit, int typeOfView, int countOfParts, int countOfSubParts, QColor pointerColor, QColor scaleColor, QColor textColor, QFont *analogFonts, int qualityOfPointer, bool makeBG ) : QFrame( parent, name ), m_bottomLimit(bottomLimit), m_topLimit(topLimit), m_typeOfView(typeOfView), m_countOfParts(countOfParts), m_countOfSubParts(countOfSubParts), m_pointerColor(pointerColor), m_scaleColor(scaleColor) ,m_textColor(textColor) { if ( qualityOfPointer==0) { m_speedOfAAlias=none; m_makeBlurMotion=false; } else { if ((qualityOfPointer==2) || (qualityOfPointer== 4)) m_speedOfAAlias=slow; else m_speedOfAAlias=fast; if ((qualityOfPointer==3) || (qualityOfPointer== 4)) m_makeBlurMotion=true; else m_makeBlurMotion=false; } // m_showBackGround = true; // m_showPointer = true; if (m_countOfParts > 6) m_countOfParts=6; else if (m_countOfParts < 2) m_countOfParts=2; if ( m_countOfSubParts > 6 ) m_countOfSubParts = 6; if ( m_countOfSubParts == 0 ) { if (m_countOfParts < 4) m_countOfSubParts =5; else { if (m_countOfParts < 6) m_countOfSubParts=4; else m_countOfSubParts =3; } } m_valueOfPointer=m_bottomLimit; /* hodnoty zavisle na typu zobrazeni */ switch (m_typeOfView) { case 1 : m_direction = 1; /* smer =1 ve smeru (clockwise), smer =-1 proti smeru hod. rucicek */ m_angleOfViewer=270; m_startAngle=225; m_centerX=m_widthOfBackGround/2; m_centerY=m_widthOfBackGround/2; m_widthOfScale=118; m_radiusOfScaleNumbers=37; break; case 2 : m_direction = -1; /* smer =1 ve smeru (clockwise), smer =-1 proti smeru hod. rucicek */ m_angleOfViewer=90; m_startAngle=0; m_centerX=13; m_centerY=110; m_widthOfScale=210; m_radiusOfScaleNumbers=83; break; case 3 : m_direction = 1; /* smer =1 ve smeru (clockwise), smer =-1 proti smeru hod. rucicek */ m_angleOfViewer=90; m_startAngle=135; m_centerX=m_widthOfBackGround/2; m_centerY=m_widthOfBackGround-15; m_widthOfScale=170; m_radiusOfScaleNumbers=65; break; } // konec hodnot zavislych na typu zobrazeni if (analogFonts == 0) { // pokud neni predan font nastavi se systemovy font m_scaleFont = kapp->font(); m_textFont = kapp->font(); } else { m_scaleFont= *analogFonts; m_textFont= *analogFonts; } m_countOfColorParts = 0; setMinimumSize( AnalogWidth, AnalogWidth ); setMaximumSize( AnalogWidth, AnalogWidth ); setFrameStyle( QFrame::Box | QFrame::Raised ); setLineWidth( 2 ); m_backgroudLayerBig = new QPixmap( (AnalogWidth-8) * 3,(AnalogWidth-8)*3 ); m_scaleLayerBig = new QPixmap ( (AnalogWidth-8)*3, (AnalogWidth-8)*3 ); // m_scaleLayerSmall = new QPixmap ( (AnalogWidth-8), (AnalogWidth-8)); // m_wholeLayer = new QPixmap ( AnalogWidth-8, AnalogWidth-8 ); // m_pointerLayerBig = new QPixmap ( (AnalogWidth-8)*3, (AnalogWidth-8)*3 ); // m_pointerLayerSmall = new QPixmap ( (AnalogWidth-8), (AnalogWidth-8)); // setDefaultArcColor(false); // sets standard registers // nastavime standartni registry if (makeBG) { paintBackGround(); m_showBackGround = true; m_showPointer = true; } } KNutAnalog::~KNutAnalog() { delete (m_backgroudLayerBig); delete (m_scaleLayerBig); delete (m_scaleLayerSmall); delete (m_pointerLayerBig); delete (m_pointerLayerSmall); delete (m_wholeLayer); } void KNutAnalog::makeBackground (bool run) { paintBackGround(); m_showBackGround = true; if (run) { repaint(); } } void KNutAnalog::setText (QString inscription, QString text_up, bool run) { m_inscription=inscription; AnMJ=text_up; if (run) { paintBackGround(); m_showBackGround = true; repaint(); } } void KNutAnalog::setDefaultArcColor(bool run) { m_arcColors[0] = Qt::white; m_arcColors[1] = Qt::green; m_arcColors[2] = Qt::yellow; m_arcColors[3] = Qt::red; m_arcColors[4] = Qt::blue; m_arcColors[5] = Qt::cyan; m_arcColors[6] = Qt::magenta; m_arcColors[7] = Qt::gray; m_arcColors[8] = Qt::black; if (run) { paintBackGround(); m_showBackGround=true; repaint(); } } void KNutAnalog::setArcColor(int reg, QColor color ) { if ((reg > -1) && (reg < 9)) m_arcColors[reg] = color; } void KNutAnalog::addArc (double startOfCircle, double endOfCircle, int regColor, bool run) { if (m_countOfColorParts < 5) { m_extentOfDye[m_countOfColorParts].start=startOfCircle; m_extentOfDye[m_countOfColorParts].end=endOfCircle; if ((regColor <0) || (regColor > 8)) regColor=0; m_extentOfDye[m_countOfColorParts++].color=regColor; } if (run) { paintBackGround(); m_showBackGround = true; repaint (); } } void KNutAnalog::delArc (bool run) { m_countOfColorParts = 0; if (run) { paintBackGround(); m_showBackGround = true; repaint (); } } void KNutAnalog::setRange (int Astart, int Aend , bool run) { m_bottomLimit=Astart; m_topLimit=Aend; // pokud zmenime rozasah musime prekrelit i rucicku m_showPointer = true; if (run) { paintBackGround(); m_showBackGround = true; repaint (); } } void KNutAnalog::setMember (int Count, bool run) { m_countOfParts=Count; if (run) { paintBackGround(); m_showBackGround = true; repaint (); } } void KNutAnalog::setPointerColor (QColor pointerColor, bool run ) { m_pointerColor = pointerColor; paintPointer(); m_showPointer = true; if (run) { repaint (); } } void KNutAnalog::repaintPointer ( bool run ) { paintPointer(); m_showPointer = true; if (run) { repaint (); } } void KNutAnalog::setFontColor (QColor fontColor, bool run ) { m_textColor = fontColor; // paintBackGround(); // m_showBackGround = true; if (run) { paintBackGround(); m_showBackGround = true; repaint (); } } void KNutAnalog::setScaleColor (QColor scaleColor, bool run) { m_scaleColor = scaleColor; if (run) { paintBackGround(); m_showBackGround = true; repaint (); } } void KNutAnalog::setDigitalProcesing (int qualityOfPointer, bool run ) { if (qualityOfPointer < 0) qualityOfPointer = 0; if (qualityOfPointer > 4) qualityOfPointer = 4; if ( qualityOfPointer==0) { m_speedOfAAlias=none; m_makeBlurMotion=false; } else { if ((qualityOfPointer==2) || (qualityOfPointer== 4)) m_speedOfAAlias=slow; else m_speedOfAAlias=fast; if ((qualityOfPointer==3) || (qualityOfPointer== 4)) m_makeBlurMotion=true; else m_makeBlurMotion=false; } paintPointer(); m_showPointer = true; // pri jakemkoliv prekresleni prekreslime rucicku if (run) repaint (); } void KNutAnalog::setPointer (double pointerValue, bool run ) { if (m_valueOfPointer != pointerValue) { m_valueOfPointer = pointerValue; paintPointer(); m_showPointer = true; // pri jakemkoliv prekresleni prekreslime rucicku if (run) { // paintPointer(); m_showPointer = true; // pri jakemkoliv prekresleni prekreslime rucicku repaint (); } } } //************** PUBLIC SLOTS ********************************** void KNutAnalog::slotSetScaleFont(QFont newScaleFont){ m_scaleFont = newScaleFont; paintBackGround(); m_showBackGround=true; repaint(); } void KNutAnalog::slotSetTextFont(QFont newTextFont){ m_textFont = newTextFont; paintBackGround(); paintPointer(); // repaint values if pointer m_showBackGround=true; m_showPointer=true; repaint(); } void KNutAnalog::slotSetAllFont(QFont newAllFont){ m_scaleFont = newAllFont; m_textFont = newAllFont; paintBackGround(); paintPointer(); // repaint values if pointer m_showBackGround=true; m_showPointer=true; repaint(); } void KNutAnalog::repaintAll (void) { paintBackGround(); m_showBackGround = true; m_showPointer = true; repaint (); } //************** protected **************************** void KNutAnalog::resizeEvent( QResizeEvent * ) { } void KNutAnalog::paintEvent( QPaintEvent *e ) { if (isVisible()) { QFrame::paintEvent(e); if ((m_showBackGround) || (m_showPointer)) { // novou kompletni vrstvu sestavime jen pokud doslo ke zmene bitBlt( m_wholeLayer, 0, 0, m_scaleLayerSmall, 0, 0, m_widthOfBackGround, m_widthOfBackGround, CopyROP); //nakopirujeme vrstvu bitBlt( m_wholeLayer, 0, 0, m_pointerLayerSmall, 0, 0, m_widthOfBackGround, m_widthOfBackGround, AndROP ); //nakopirujeme rucicku } bitBlt( this , m_startOfBackGround, m_startOfBackGround, m_wholeLayer, 0, 0, m_widthOfBackGround, m_widthOfBackGround, CopyROP); //nakopirujeme vrstvu m_showBackGround = false; m_showPointer = false; } } //***************private ************************ void KNutAnalog::paintBackGround ( void ) { QPainter paint; QImage myImage; //big image //qDebug ("KNutAnalog::paintBackGround"); m_scaleLayerBig->fill( this,0,0); //color if background paint.begin ( m_scaleLayerBig ); paint.setBackgroundMode(Qt::OpaqueMode); paint.setBackgroundColor(backgroundColor()); paintPartOfCircle(&paint, m_centerX*3, m_centerY*3,m_widthOfScale*3); //CMK pro inter paintScale(&paint, m_centerX*3, m_centerY*3,m_widthOfScale*3); // Scale paint.end(); myImage = m_scaleLayerBig->convertToImage(); makeMotionBlur(&myImage,myImage.pixel(1,1),m_typeOfView); makeAntialiasing(&myImage,m_scaleLayerSmall,myImage.pixel(1,1),slow,m_typeOfView); paint.begin( m_scaleLayerSmall ); // paint on layer of scale // painting numbers paintScaleNumbers( &paint ); //painting of numbers // painting texts paintText( &paint ); paint.end (); } void KNutAnalog::paintPointer ( void ) { //qDebug ("KNutAnalog::paintPointer"); if (m_speedOfAAlias == none) paintPointerFastly (m_valueOfPointer); else paintPointerSlowly ( m_valueOfPointer, m_centerX*3, m_centerY*3,m_widthOfScale*3); } void KNutAnalog::paintPointerSlowly ( double position, int centerX , int centerY, int widthOfCircle) { QPainter paint; QImage myImage; //big image double angle; int lengthOfPointer = widthOfCircle / 2 - 12; if (position < m_bottomLimit) position=m_bottomLimit; else { if (position > m_topLimit) position = m_topLimit; } // painting of pointer angle = ((m_angleOfViewer/(m_topLimit-m_bottomLimit))*(position-m_bottomLimit))*((-1)*m_direction)+m_startAngle; m_pointerLayerBig->fill( Qt::white ); //color if beckground paint.begin( m_pointerLayerBig ); // paints of pointer paint.setBackgroundMode(Qt::TransparentMode); paint.setBrush( m_pointerColor ); // sets color paint.setPen ( m_pointerColor ); QPointArray pts; // k posuvu a k otoceni pouziva funkce paintu // for rotate and translate uses functions of paint paint.translate (centerX, centerY); paint.rotate(-angle); pts.setPoints( 4, -6, 0, 0, -6, lengthOfPointer, 0, 0, 6 ); paint.drawConvexPolygon( pts ); paint.end (); //m_pointerMutex.lock(); myImage = m_pointerLayerBig->convertToImage(); if (m_makeBlurMotion) makeMotionBlur(&myImage,myImage.pixel(1,1)); makeAntialiasing(&myImage,m_pointerLayerSmall,myImage.pixel(1,1),m_speedOfAAlias,0); paint.begin( m_pointerLayerSmall ); // paints on layer's background paintValueOfPointer ( &paint, m_valueOfPointer); paint.end (); // m_pointerMutex.unlock(); } void KNutAnalog::paintPointerFastly (double position) { QPainter paint; double uhel; int delka = m_widthOfScale / 2 - 4; //m_pointerMutex.lock(); m_pointerLayerSmall->fill( Qt::white ); //background color paint.begin( m_pointerLayerSmall ); // kreslime na plochu rucicky paint.setBackgroundMode(Qt::TransparentMode); paintValueOfPointer ( &paint, m_valueOfPointer); if (position < m_bottomLimit) position=m_bottomLimit; else { if (position > m_topLimit) position = m_topLimit; } /* painting of pointer*/ uhel = ((m_angleOfViewer/(m_topLimit-m_bottomLimit))*(position-m_bottomLimit))*((-1)*m_direction)+m_startAngle; paint.setBrush( m_pointerColor ); // nastavime barvu paint.setPen ( m_pointerColor ); QPointArray pts; // for translate a rotate uses functions of paint // k posuvu a k otoceni pouziva funkce paintu paint.translate (m_centerX, m_centerY); paint.rotate(-uhel); pts.setPoints( 4, -2, 0, 0, -2, delka, 0, 0, 2 ); paint.drawPolygon( pts ); paint.end(); //m_pointerMutex.unlock(); } void KNutAnalog::paintPartOfCircle ( QPainter *paint, int centerX , int centerY, int widthOfCircle ) { double Astart, Aend; // pocitani uhlu //nula je ve 3 hodiny // prirustek je kladny proti smeru hod rucicek //int extent = m_topLimit-m_bottomLimit; //rozsah // double extent = m_topLimit-m_bottomLimit; //rozsah // double jednotka = ((double)m_angleOfViewer/extent); double jednotka = ((double)m_angleOfViewer/(m_topLimit-m_bottomLimit)); bool painted = false; // int smerMK = (-1)*m_direction; // paints parts of circle for (int i=0;i m_bottomLimit)) { if (m_extentOfDye[i].start < m_bottomLimit) Astart = m_bottomLimit; else Astart = m_extentOfDye[i].start; if (m_extentOfDye[i].end > m_topLimit) Aend = m_topLimit; else Aend = m_extentOfDye[i].end; paint->setBrush ( m_arcColors[m_extentOfDye[i].color] ); paint->setPen (NoPen); paint->drawPie((centerX-widthOfCircle/2),(centerY-widthOfCircle/2),widthOfCircle,widthOfCircle,(int)((((Astart-m_bottomLimit)*jednotka)*((-1)*m_direction)+m_startAngle)*16),(int)(((-1)*m_direction)*((Aend-Astart)*jednotka)*16)); painted = true; // bylo provedeno vykresleni } } if ((m_countOfColorParts > 0) && (painted)) { // kreslime jen pokud bylo kreslena kruhova vysec // musime vybarvit stred kotouce //fills center of circle paint->setBrush ( paint->backgroundColor() ); //The angles are 1/16th of a degree paint->drawPie((centerX-(widthOfCircle/2)+18),(centerY-(widthOfCircle/2)+18),widthOfCircle-36,widthOfCircle-36,(int)(m_startAngle*16+90*m_direction),(int)((-m_direction)*(m_angleOfViewer*16+180))); } } void KNutAnalog::paintScale ( QPainter *paint , int centerX , int centerY, int widthOfCircle) { int bottomMax = widthOfCircle/2 - 29; int bottom = widthOfCircle/2 -17 ; int smer_stup = (-1)*m_direction; paint->save(); paint->setPen ( m_scaleColor); paint->translate( centerX, centerY ); double stupne = smer_stup * (m_angleOfViewer/(m_countOfParts*(m_countOfSubParts))); // nakresleni prvni linky //paints of the first line paint->rotate( -m_startAngle); paint->setBrush ( m_scaleColor ); paint->drawRect( bottomMax,-1,30,3 ); for ( int i=0; i<(m_countOfParts); i++ ) { for ( int j=0; j<(m_countOfSubParts-1); j++) { paint->rotate( -stupne ); paint->drawRect( bottom,-1,18,2 ); } paint->rotate( -stupne ); paint->drawRect( bottomMax,-1,30,3 ); } paint->restore(); } void KNutAnalog::makeAntialiasing (QImage* bigImage, QPixmap* smallPixmap, const QRgb colorOfBG, speedOfAAlias speed, int typeOfView) { ulong imageRed, imageGreen, imageBlue; QRgb imageRgb; QImage* smallImage; bool computeAverage; ulong sumOfRed, sumOfGreen, sumOfBlue; if (speed == slow) { sumOfRed = (qRed ( colorOfBG ))*9; sumOfGreen = (qGreen ( colorOfBG ))*9; sumOfBlue = (qBlue ( colorOfBG ))*9; } else { sumOfRed = (qRed ( colorOfBG ))*16; sumOfGreen = (qGreen ( colorOfBG ))*16; sumOfBlue = (qBlue ( colorOfBG ))*16; } int smallImageWidth=bigImage->width()/3; int smallImageHeight=bigImage->height()/3; smallImage = new QImage(smallImageWidth,smallImageHeight, bigImage->depth()); // imageRgb = bigImage->pixel(1,1); for (int x = 0; x < smallImageWidth; x++) { for (int y = 0; y < smallImageHeight; y++) { imageRed = 0; imageGreen = 0; imageBlue = 0; switch (typeOfView) { case 0: //nothing computeAverage=true; break; case 1: if ((y>25) and (x >30) and (x < 92)) computeAverage=false; else computeAverage=true; break; case 2: if ((y < 15) || ((x+15) > y)) computeAverage=true; else computeAverage=false; break; case 3: //computes top part only if ((y < 60) && (y>15)) computeAverage=true; else computeAverage=false; break; default: computeAverage=true; } if (speed == slow) { //// uses divide, slowly compute if (computeAverage) { for (int xi = 0 ; xi < 3; xi ++) { for (int yi = 0 ; yi < 3; yi ++) { imageRgb = bigImage->pixel(x*3+xi,y*3+yi); imageRed += qRed ( imageRgb ); imageGreen += qGreen ( imageRgb ); imageBlue += qBlue ( imageRgb ); } } if (((imageRed == sumOfRed) && (imageGreen == sumOfGreen) && (imageBlue == sumOfBlue))) { smallImage->setPixel (x,y,colorOfBG); } else { imageRed = imageRed / 9; imageGreen = imageGreen/9; imageBlue = imageBlue/9; smallImage->setPixel (x,y,qRgb(imageRed,imageGreen,imageBlue)); } } else { smallImage->setPixel (x,y,bigImage->pixel(x*3,y*3)); } } else { //// uses bitmove, fastly compute if (computeAverage) { for (int xi = 0 ; xi < 3; xi ++) { for (int yi = 0 ; yi < 3; yi ++) { if ((xi == 1) && (yi == 1)) { // center of 3x3 area imageRgb = bigImage->pixel(x*3+xi,y*3+yi); imageRed += qRed ( imageRgb )*4; imageGreen += qGreen ( imageRgb )*4; imageBlue += qBlue ( imageRgb )*4; } else { if ((xi == 1) || (yi == 1)) { imageRgb = bigImage->pixel(x*3+xi,y*3+yi); imageRed += qRed ( imageRgb )*2; imageGreen += qGreen ( imageRgb )*2; imageBlue += qBlue ( imageRgb )*2; } else { imageRgb = bigImage->pixel(x*3+xi,y*3+yi); imageRed += qRed ( imageRgb ); imageGreen += qGreen ( imageRgb ); imageBlue += qBlue ( imageRgb ); } } } } if ((imageRed == sumOfRed) && (imageGreen == sumOfGreen) && (imageBlue == sumOfBlue)) { smallImage->setPixel (x,y,colorOfBG); } else { imageRed = imageRed >> 4; imageGreen = imageGreen >> 4; imageBlue = imageBlue >> 4; smallImage->setPixel (x,y,qRgb(imageRed,imageGreen,imageBlue)); } } else { smallImage->setPixel (x,y,bigImage->pixel(x*3,y*3)); } } //end of fastly } } smallPixmap->convertFromImage(*smallImage); delete smallImage; } void KNutAnalog::makeMotionBlur (QImage* image, const QRgb colorOfBG, int typeOfView) { ulong imageRed, imageGreen, imageBlue; QRgb imageRgb; QImage *layerImageBlur; bool computeAverage; int startHeight, stopHeight; ulong sumOfRed, sumOfGreen, sumOfBlue; sumOfRed = (qRed ( colorOfBG ))*9; sumOfGreen = (qGreen ( colorOfBG ))*9; sumOfBlue = (qBlue ( colorOfBG ))*9; int imageWidth=image->width(); int imageHeight=image->height(); layerImageBlur = new QImage(*image); layerImageBlur->detach(); //costructor makes swallow copy, have to use detach switch (typeOfView) { case 0: //nothing startHeight =1; stopHeight =imageHeight-2; break; case 2: startHeight =1; stopHeight =imageHeight-2; break; case 3: startHeight =45; stopHeight =180; break; default: startHeight =1; stopHeight =imageHeight-2; } for (int x = 1; x < imageWidth-2; x++) { for (int y = startHeight; y < stopHeight; y++) { imageRed = 0; imageGreen = 0; imageBlue = 0; switch (typeOfView) { case 0: //nothing computeAverage=true; break; case 1: if ((y>75) and (x >90) and (x < 274)) computeAverage=false; else computeAverage=true; break; case 2: if ((y < 45) || ((x+45) > y)) computeAverage=true; else computeAverage=false; break; case 3: //computes top part only if ((y < 180) && (y>45)) computeAverage=true; else computeAverage=false; break; default: computeAverage=true; } if (computeAverage) { for (int xi = -1 ; xi < 2; xi ++) { for (int yi = -1 ; yi < 2; yi ++) { imageRgb = layerImageBlur->pixel(x+xi,y+yi); imageRed += qRed ( imageRgb ); imageGreen += qGreen ( imageRgb ); imageBlue += qBlue ( imageRgb ); } } if (!((imageRed == sumOfRed) && (imageGreen == sumOfGreen) && (imageBlue == sumOfBlue))) { imageRed = (int)(imageRed / 9); imageGreen = (int)(imageGreen/9); imageBlue = (int)(imageBlue/9); image->setPixel (x,y,qRgb(imageRed,imageGreen,imageBlue)); } } } } delete layerImageBlur; } void KNutAnalog::paintScaleNumbers ( QPainter *paint ) { //paintig of scaleNumbers int poz_x, poz_y, r_vyska, r_sirka; double posun, angle; double upi = 0.0174532; int smer_st = -m_direction; paint->save(); // ulozime QString cislo; paint->setPen(m_textColor); paint->setFont(m_scaleFont); QFontMetrics fm = paint->fontMetrics(); r_vyska = ((fm.ascent()) / 2); posun = ((double)(m_topLimit-m_bottomLimit))/m_countOfParts; for (int i=0; i<=(m_countOfParts);i++) { cislo.sprintf( "%3.0f",m_bottomLimit+i*posun); cislo=cislo.stripWhiteSpace(); r_sirka = (fm.width(cislo))/2; angle = (m_startAngle+ ((m_angleOfViewer/m_countOfParts)*i*smer_st))*upi; poz_x = (int)((cos(angle)*m_radiusOfScaleNumbers+m_centerX) - r_sirka); poz_y = (int)((m_centerY-sin(angle)*m_radiusOfScaleNumbers) + r_vyska); paint->drawText (poz_x,poz_y,cislo); } paint->restore(); } void KNutAnalog::paintText ( QPainter *paint ) { QString nadpis1; QString nadpis2; int index; if (m_inscription.length() >1) { if ((index = m_inscription.find(" ")) != -1) { // mezera nalezena space found nadpis1 = m_inscription.left(index); nadpis2 = m_inscription.mid(index+1,(uint)(m_inscription.length() - index - 1)); } } else index = -1; paint->setPen(m_textColor); paint->setFont(m_textFont); QFontMetrics fm = paint->fontMetrics(); int r_vyska = fm.height()/ 2; switch (m_typeOfView) { // kruznice - kreslime dve radky nad sebou cemtrovane case 1 : if (index == -1 ) paint->drawText( m_centerX - fm.width(m_inscription)/2, 104 + r_vyska , m_inscription); else { // mame dve slova paint->drawText( m_centerX - fm.width(nadpis1)/2, 106 + r_vyska/2 - 2, nadpis1); paint->drawText( m_centerX - fm.width(nadpis2)/2, 106 + (r_vyska*3)/2 + 2, nadpis2); } paint->drawText( m_centerX - fm.width(AnMJ)/2, 44 + r_vyska , AnMJ); break; // ctvrt oblouk kreslime dve radky nad sebou centrovane v pravem hornim rohu case 2 : if (index == -1 ) paint->drawText( 121 - fm.width(m_inscription) , 6 + r_vyska , m_inscription); else { paint->drawText( 121 - fm.width(nadpis1) , 6 + r_vyska , nadpis1); paint->drawText( 121 - fm.width(nadpis2) , 10 + r_vyska*2 , nadpis2); } paint->drawText( m_centerX , 68 + r_vyska*2 , AnMJ); break; // horni oblouk case 3 : paint->drawText( m_centerX - fm.width(m_inscription)/2, 6 + r_vyska , m_inscription); paint->drawText( m_widthOfBackGround -5 -fm.width(AnMJ), m_widthOfBackGround -r_vyska, AnMJ); break; } } void KNutAnalog::paintValueOfPointer ( QPainter *p, double value) { QString cislo; cislo.sprintf( "%5.1f",value); cislo=cislo.stripWhiteSpace(); if (value < m_bottomLimit) value=m_bottomLimit; else { if (value > m_topLimit) value = m_topLimit; } /* nakresleni rucicky*/ // uhel = ((uhel_zobrazeni/(horni_mez-dolni_mez))*(value-dolni_mez))*((-1)*smer)+m_startAngle; p->setPen(m_textColor); p->setFont(m_textFont); QFontMetrics fm = p->fontMetrics(); int r_vyska = fm.height()/ 2; switch (m_typeOfView) { case 1 : p->drawText( m_centerX - fm.width(cislo)/2, 75 + r_vyska , cislo); break; case 2 : p->drawText( m_centerX , 57 + r_vyska , cislo); break; case 3 : p->drawText( 5, m_widthOfBackGround -r_vyska, cislo); break; } } #include "knutanalog.moc"