Superviseur - Afficheur 1.0
Ce logiciel correspond à l'afficheur de la suite des trois logiciels composant le superviseur
hyperviseurgraphique.cpp
Aller à la documentation de ce fichier.
00001 #include "hyperviseurgraphique.h"
00002 
00003 
00005 
00010 HyperviseurGraphique::HyperviseurGraphique(QVariantMap donnees, QList<QVariantMap> donneesVMs)
00011 {
00012     this->changerDonnees(donnees, donneesVMs);
00013 }
00014 
00015 
00017 
00021 QString HyperviseurGraphique::name(){
00022     return this->donnees.value("name",QVariant("")).toString();
00023 }
00024 
00025 
00027 
00031 float HyperviseurGraphique::etatDeSante(){
00032     return this->etatSante;
00033 }
00034 
00035 
00037 
00041 QTime HyperviseurGraphique::derniereReception(){
00042     return this->derniereReception_d;
00043 }
00044 
00045 
00047 
00054 void HyperviseurGraphique::changerDonnees(QVariantMap donnees, QList<QVariantMap> donneesVMs){
00055     //qDebug() << "Mise à jour.";
00056     this->donnees = donnees;
00057     this->donneesVMs = donneesVMs;
00058     this->derniereReception_d = QTime::currentTime();
00059 
00060     float cpu  = this->donnees.value("cpu",  QVariant(0)).toFloat();
00061     cpu = cpu*cpu*cpu/10000;
00062     float ram  = this->donnees.value("ram",  QVariant(0)).toFloat();
00063     ram = 1.5*ram*ram/100-50;
00064     float disk = this->donnees.value("disk", QVariant(0)).toFloat();
00065     disk = disk*disk/100;
00066 
00067     float cputemp = this->donnees.value("cputemp", QVariant(0)).toFloat();
00068     if(cputemp < 40) cputemp = cputemp * 0.875;
00069     else if(cputemp < 60) cputemp = cputemp * 1.25 - 15;
00070     else cputemp = cputemp * 1.3333 - 20;
00071 
00072     float mbtemp  = this->donnees.value("mbtemp",  QVariant(0)).toFloat();
00073     if(mbtemp < 33) mbtemp = mbtemp * 1.0606;
00074     else if(mbtemp < 45) mbtemp = mbtemp * 2.0833 - 33.75;
00075     else mbtemp = mbtemp * 1.6 - 12;
00076 
00077     float indice = qMax(cpu, qMax(ram, qMax(disk, qMax(cputemp, mbtemp))));
00078 
00079     QVariantMap vminfos;
00080     QListIterator<QVariantMap> li(this->donneesVMs);
00081     float plusGrandeCPU = 0;
00082     float plusGrandeRAM = 0;
00083     while(li.hasNext()){
00084         vminfos = li.next();
00085         plusGrandeCPU = qMax(plusGrandeCPU, vminfos.value("cpu").toFloat());
00086         if(vminfos.value("maxram", QVariant(0)).toFloat() > 0) plusGrandeRAM = qMax(plusGrandeRAM, vminfos.value("ram").toFloat() / vminfos.value("maxram").toFloat());
00087     }
00088 
00089     indice = qMax(indice, qMax(plusGrandeCPU, plusGrandeRAM));
00090     this->etatSante = (indice > 100)? 100 : indice;
00091 
00092     /*QGraphicsScene *scene = 0;
00093     if( (scene = this->scene()) != 0) scene->update();*/
00094     this->update(QRectF(0, 0, 380, 262));
00095 }
00096 
00097 
00099 
00105 QBrush HyperviseurGraphique::calcBarreBrush(float pourcent){
00106     if(pourcent > 100.0) pourcent = 100.0;
00107     QLinearGradient gradient;
00108     gradient.setCoordinateMode(QGradient::ObjectBoundingMode);
00109     gradient.setColorAt(0, QColor::fromHsvF(0.3334-pourcent*0.0033334, 0.8, 0.75));
00110     gradient.setColorAt(1, QColor::fromHsvF(0.3334-pourcent*0.0033334, 0.8, 0.35));
00111     gradient.setStart(0,0);
00112     gradient.setStart(1,0);
00113     return QBrush(gradient);
00114 }
00115 
00116 
00118 
00129 QBrush HyperviseurGraphique::calcCercleBrush(float pourcent, int rayon, QPoint centre, bool desactive){
00130     if(pourcent > 100.0) pourcent = 100.0;
00131     QRadialGradient gradient;
00132     gradient.setCoordinateMode(QGradient::ObjectBoundingMode);
00133     if(!desactive){
00134         gradient.setColorAt(0, QColor::fromHsvF(0.3334-pourcent*0.0033334, 0.8, 0.75));
00135         gradient.setColorAt(1, QColor::fromHsvF(0.3334-pourcent*0.0033334, 0.8, 0.35));
00136     }else{
00137         gradient.setColorAt(0, QColor::fromHsvF(0, 0, 0.55));
00138         gradient.setColorAt(1, QColor::fromHsvF(0, 0, 0.35));
00139     }
00140     gradient.setCoordinateMode(QGradient::LogicalMode);
00141     gradient.setRadius((qreal)rayon);
00142     gradient.setCenter(QPointF(centre));
00143     gradient.setFocalPoint(QPointF(centre));
00144     return QBrush(gradient);
00145 }
00146 
00147 
00149 
00152 QRectF HyperviseurGraphique::boundingRect() const{
00153     return QRectF(0, 0, this->largeurTotale+1, this->hauteurTotale+1);
00154 }
00155 
00156 
00158 
00165 void HyperviseurGraphique::dessinerLegendeVerticale(QPainter *painter, unsigned int hauteurTotale, unsigned int largeurVMsBloc, unsigned int largeurBarres){
00166     painter->save();
00167 
00168     QFont font3("Verdana");
00169     font3.setWeight(QFont::DemiBold);
00170     painter->setFont(font3);
00171 
00172     painter->rotate(270);
00173 
00174     painter->translate(-int(hauteurTotale)+7, largeurBarres/2+6);
00175     painter->drawText(0, 0, "CPU");
00176 
00177     painter->translate(0, largeurBarres+1);
00178     painter->drawText(0, 0, "MB");
00179 
00180     painter->translate(0, largeurVMsBloc+largeurBarres+4);
00181     painter->drawText(0, 0, "CPU");
00182 
00183     painter->translate(0, largeurBarres+1);
00184     painter->drawText(0, 0, "RAM");
00185 
00186     painter->translate(0, largeurBarres+1);
00187     painter->drawText(0, 0, "HDD");
00188 
00189     painter->restore();
00190 }
00191 
00192 
00194 
00202 void HyperviseurGraphique::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
00203     QPen   pen   = painter->pen();
00204     QBrush brush = painter->brush();
00205     QLinearGradient gradient;
00206 
00207     gradient.setCoordinateMode(QGradient::ObjectBoundingMode);
00208     gradient.setColorAt(0, QColor::fromHsvF(0.3334-this->etatSante*0.0033334, 0.8, 0.75));
00209     gradient.setColorAt(1, QColor::fromHsvF(0.3334-this->etatSante*0.0033334, 0.8, 0.35));
00210     gradient.setStart(0,0);
00211     gradient.setStart(1,0);
00212     QBrush gradientBrush(gradient);
00213 
00214     pen.setStyle(Qt::SolidLine);
00215     pen.setColor(QColor(0, 0, 0, 255));
00216     pen.setBrush(QBrush(QColor(0, 0, 0, 255)));
00217     pen.setWidth(0);
00218 
00219     // les valeurs ci-dessous sont sans bordure
00220     unsigned int largeurBarres  = 16;
00221     unsigned int hauteurTitre   = 33;
00222     this->hauteurTotale         = 262; //avec les bordures
00223     unsigned int largeurVMsBloc = 288;
00224     unsigned int largeurBlocGauche = (largeurBarres+1)*2+1;
00225     unsigned int largeurBlocDroit  = (largeurBarres+1)*3+1;
00226     unsigned int hauteurContenu    = this->hauteurTotale-hauteurTitre-2;
00227     this->largeurTotale            = largeurBlocGauche+largeurVMsBloc+largeurBlocDroit+4; // avec les bordures
00228     unsigned int posBlocGauche     = largeurBlocGauche+largeurVMsBloc+2;
00229 
00230 #ifdef Q_WS_WIN
00231     this->dessinerLegendeVerticale(painter, this->hauteurTotale, largeurVMsBloc, largeurBarres);
00232 #endif
00233     painter->setPen(pen);
00234     painter->setBrush(Qt::NoBrush);
00235     //               | X (horizontal) |  Y (vertical)  |       Largeur       |     Hauteur     |
00236     painter->drawRect(               0,               0,      this->largeurTotale-1,  this->hauteurTotale-1); // Block total
00237     painter->drawRect(               0,  hauteurTitre+1,   largeurBlocGauche+1,   hauteurContenu); // Block droite
00238     painter->drawRect(   posBlocGauche,  hauteurTitre+1,  largeurBlocDroit+1,   hauteurContenu); // Block gauche
00239     painter->setBrush(gradientBrush);
00240     painter->drawRect(               0,               0,      this->largeurTotale-1,   hauteurTitre+1); // Titre
00241 
00242     pen.setStyle(Qt::NoPen);
00243     painter->setPen(pen);
00244 
00245     unsigned int hauteur;
00246     float pourcent;
00247 
00248     // CPU Temp. Barre
00249     pourcent = this->donnees.value("cputemp", QVariant(0)).toFloat()*120.0/80.0-20; //50;
00250     if(pourcent < 0) pourcent = 0;
00251     if(pourcent > 100) pourcent = 100.0;
00252     hauteur = (hauteurContenu-3)*pourcent/100;
00253     painter->setBrush(this->calcBarreBrush(pourcent+5));
00254     painter->drawRect(2, this->hauteurTotale-2-hauteur, largeurBarres, hauteur);
00255 
00256     // MB Temp. Barre
00257     pourcent = this->donnees.value("mbtemp", QVariant(0)).toFloat()*110.0/80.0-10; //20;
00258     if(pourcent < 0) pourcent = 0;
00259     if(pourcent > 100) pourcent = 100.0;
00260     hauteur = (hauteurContenu-3)*pourcent/100;
00261     painter->setBrush(this->calcBarreBrush(pourcent+20));
00262     painter->drawRect(largeurBarres+3,  this->hauteurTotale-2-hauteur, largeurBarres, hauteur);
00263 
00264     // CPU Barre
00265     pourcent = this->donnees.value("cpu", QVariant(0)).toFloat(); //94;
00266     hauteur = (hauteurContenu-3)*pourcent/100;
00267     painter->setBrush(this->calcBarreBrush(pourcent));
00268     painter->drawRect(largeurBlocGauche+largeurVMsBloc+4,  this->hauteurTotale-2-hauteur, largeurBarres, hauteur);
00269 
00270     // RAM Barre
00271     pourcent = this->donnees.value("ram", QVariant(0)).toFloat(); //41;
00272     hauteur = (hauteurContenu-3)*pourcent/100;
00273     painter->setBrush(this->calcBarreBrush(pourcent));
00274     painter->drawRect(largeurBlocGauche+largeurVMsBloc+4+largeurBarres+1,  this->hauteurTotale-2-hauteur, largeurBarres, hauteur);
00275 
00276     // HDD Barre
00277     pourcent = this->donnees.value("disk", QVariant(0)).toFloat(); //73;
00278     hauteur = (hauteurContenu-3)*pourcent/100;
00279     painter->setBrush(this->calcBarreBrush(pourcent));
00280     painter->drawRect(largeurBlocGauche+largeurVMsBloc+4+2*(largeurBarres+1),  this->hauteurTotale-2-hauteur, largeurBarres, hauteur);
00281 
00282 
00283     pen.setStyle(Qt::SolidLine);
00284     pen.setColor(Qt::white);
00285     painter->setPen(pen);
00286     QFont font1("Verdana", 12, QFont::Bold);
00287     painter->setFont(font1);
00288 
00289     // Nom machine
00290     painter->drawText(QRect(0, 0, this->largeurTotale-1, hauteurTitre+1), Qt::AlignCenter , this->donnees.value("name", QVariant("Sans Nom")).toString());
00291 
00292     QFont font2("Verdana", 7, QFont::DemiBold);
00293     painter->setFont(font2);
00294 
00295     painter->drawText(QRect(3, hauteurTitre/2, this->largeurTotale/3, hauteurTitre/2), Qt::AlignLeft|Qt::AlignBottom, "Températures");
00296     painter->drawText(QRect(this->largeurTotale*2/3, hauteurTitre/2, this->largeurTotale/3-3, hauteurTitre/2), Qt::AlignRight|Qt::AlignBottom, "Utilisation");
00297 #ifdef Q_WS_WIN
00298     painter->save();
00299     painter->setCompositionMode((QPainter::CompositionMode)15);
00300 #else
00301     pen.setColor(Qt::black);
00302     painter->setPen(pen);
00303 #endif
00304     this->dessinerLegendeVerticale(painter, this->hauteurTotale, largeurVMsBloc, largeurBarres);
00305 #ifdef Q_WS_WIN
00306     painter->restore();
00307 #endif
00308 
00309 
00310     if(!this->donneesVMs.isEmpty()){
00311         int i;
00312         int rayon;
00313         float surface;
00314         int marges = 4;
00315         int espace = 15;
00316         int L = largeurVMsBloc-(marges*2);
00317         int H = hauteurContenu-(marges*2);
00318         qreal temp1 = sqrt((double)this->donneesVMs.size() * (double)H/ (double)L);
00319         qreal temp2 = (temp1 * (qreal)L / (qreal)H);
00320         int nby = qRound(temp1);
00321         int nbx = qRound(temp2);
00322         qreal nbyDec = (temp1-(qreal)nby);
00323         qreal nbxDec = (temp2-(qreal)nbx);
00324         if( (nbyDec > 0 && nbxDec > 0) || (nbyDec+nbxDec) > 0 ){
00325             if(nbyDec > nbxDec){
00326                 nby++;
00327             }else{
00328                 nbx++;
00329             }
00330         }
00331         int dx =  L / nbx;
00332         int dy =  H / nby;
00333         int maxRayon = qMin(dx, dy) / 2;
00334 
00335         /*if(nby < 1) nby = 1;
00336         if(nbx > this->donneesVMs.size()) nbx = this->donneesVMs.size();
00337         if(nby > (this->donneesVMs.size()/nbx)) nby = this->donneesVMs.size()/nbx;*/
00338         int centrageX = (L - (maxRayon*2)*nbx) /2;
00339         int centrageY = (H - (maxRayon*2)*nby) /2;
00340         QPoint centre;
00341         pen.setColor(Qt::black);
00342         painter->setPen(pen);
00343         painter->setRenderHint(QPainter::Antialiasing);
00344 
00345         QVariantMap vminfos;
00346         QListIterator<QVariantMap> li(this->donneesVMs);
00347         int plusGrandeRam = 0;
00348         while(li.hasNext()){
00349             vminfos = li.next();
00350             if(vminfos.value("maxram").toInt() > plusGrandeRam) plusGrandeRam = vminfos.value("maxram").toInt();
00351         }
00352         li.toFront();
00353         i = 0;
00354         while(li.hasNext()){
00355             vminfos = li.next();
00356             if(plusGrandeRam > 0){
00357                 surface = 3.1416 * maxRayon * maxRayon;
00358                 rayon = qSqrt( (surface*(vminfos.value("maxram").toInt()+500000) / (plusGrandeRam+500000)) / 3.1416 );
00359                 //rayon =  (maxRayon * vminfos.value("maxram").toInt()) / plusGrandeRam;
00360             }else{
00361                 rayon = maxRayon;
00362             }
00363             pourcent = 0.7;//vminfos.value("ram").toFloat() / vminfos.value("maxram").toFloat();
00364             centre = QPoint( largeurBlocGauche+marges+(maxRayon*2)*(i%nbx)+maxRayon+centrageX, hauteurTitre+marges+(maxRayon*2)*qFloor(i/nbx)+maxRayon+centrageY );
00365             painter->setBrush(Qt::NoBrush);
00366             painter->drawEllipse(centre, rayon-espace/2, rayon-espace/2);
00367             painter->setBrush(this->calcCercleBrush(vminfos.value("cpu",QVariant(0)).toFloat(), (rayon-espace/2)*pourcent, centre, (vminfos.value("state").toInt() != 1) ));
00368             painter->drawEllipse(centre, (int)((rayon-espace/2)*pourcent), (int)((rayon-espace/2)*pourcent) );
00369             i++;
00370             //qDebug() << "Nom:" << vminfos.value("name").toString() << " NbVM:" << this->donneesVMs.size() << " maxRayon:" << maxRayon << " plusGrandeRam:" << plusGrandeRam << " rayon:" << rayon << " ram:" << vminfos.value("ram").toString()+"/"+vminfos.value("maxram").toString() << " pourcent:" << pourcent << " centre:" << centre;
00371         }
00372     }
00373 
00374 }
00375 
00376 
00377 
00378 
00379 
00380 
00381 
00382 
00383 
00384 
 Tout Classes Espaces de nommage Fichiers Fonctions Variables