Superviseur - Afficheur 1.0
Ce logiciel correspond à l'afficheur de la suite des trois logiciels composant le superviseur
|
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