OutilZT/sources/GuiElements/RankRulerWidget.cpp
2017-07-20 11:11:06 -04:00

294 lines
9.0 KiB
C++

/*******************************************************************************
* *
* Société de Transports de Montréal. *
* 2012 - 2013 *
* *
* Projet Zones Tests *
* *
* *
* *
*******************************************************************************/
/*
Description:
Élément graphique qui affiche une règle qui indique le décompte des rangs
du train dans le temps. Ce qui permet de savoir à quel rang un événement
est survenu lors de la consultation d'un passage de train.
*/
/* ************************************************************************** */
/* Revision:
### YYYMMDD JFM
Verision d'origine.
### YYYYMMDD Description du besoin ou du bug
Description du changement.
*/
/* ************************************************************************** */
#include "RankRulerWidget.h"
#include <QPainter>
#include <QTextStream>
#include <QStyleOptionGraphicsItem>
CRankRulerWidget::~CRankRulerWidget()
{
delete mRulerPixmap;
}
CRankRulerWidget::CRankRulerWidget(qreal RulerPixelWidth, QGraphicsItem *Parent)
{
setParentItem(Parent);
mPixelWidth = RulerPixelWidth;
mLabel = new QGraphicsTextItem(this);
mRulerPixmap = new QPixmap(boundingRect().width(),boundingRect().height());
// mRulerPixmap->fill(Qt::white);
mRankItems.clear();
}
void CRankRulerWidget::resizeEvent(QGraphicsSceneResizeEvent *event)
{
Q_UNUSED(event)
delete mRulerPixmap;
mRulerPixmap = new QPixmap(boundingRect().width(),boundingRect().height());
Render();
}
void CRankRulerWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(widget)
if(mRankItems.isEmpty())
return;
painter->setClipRect(option->exposedRect);
painter->drawPixmap(0,0,*mRulerPixmap);
// if(mRankItems.isEmpty())
// return;
// QFont font;
// font.setPixelSize(12);
// painter->setFont(font);
// qreal pitch = mPixelWidth/(mEndTime - mStartTime); //pixel/ns
// int StartIndex = 0,EndIndex = 0;
// bool StartFound = false;
// for(int i = 0; i < mRankItems.size(); i++)
// {
// if(StartFound == false)
// {
// if(mStartTime <= mRankItems.at(i).mStartTime)
// {
// StartIndex = i;
// StartFound = true;
// }
// }
// if(mRankItems.at(i).mEndTime <= mEndTime)
// {
// EndIndex = i;
// }
// }
// if(StartIndex > 0)
// {
// if(mStartTime < mRankItems.at(StartIndex).mStartTime)
// {
// QRectF LabelRect;
// qreal StartPixel = 0;//mStartTime * pitch;
// qreal EndPixel = (mRankItems.at(StartIndex).mStartTime - mStartTime) * pitch;
// qreal Height = boundingRect().height();
// LabelRect.setRect(StartPixel,0,(EndPixel-StartPixel),Height);
// painter->drawLine(StartPixel,0,StartPixel,Height);
// painter->drawLine(EndPixel,0,EndPixel,Height);
// painter->drawText(LabelRect,mRankItems.at(StartIndex-1).mLabel,Qt::AlignHCenter | Qt::AlignVCenter);
// }
// }
// for(int i = StartIndex; i <= EndIndex; i++)
// {
// QRectF LabelRect;
// qreal StartPixel = (mRankItems.at(i).mStartTime - mStartTime) * pitch;
// qreal EndPixel;
// if(mRankItems.at(i).mEndTime > mEndTime)
// EndPixel = (mEndTime - mStartTime) * pitch;
// else
// EndPixel = (mRankItems.at(i).mEndTime - mStartTime) * pitch;
// qreal Height = boundingRect().height();
// LabelRect.setRect(StartPixel,0,(EndPixel-StartPixel),Height);
// painter->drawLine(StartPixel,0,StartPixel,Height);
// painter->drawLine(EndPixel,0,EndPixel,Height);
// painter->drawText(LabelRect,mRankItems.at(i).mLabel,Qt::AlignHCenter | Qt::AlignVCenter);
// }
// if(EndIndex < mRankItems.size()-1)
// {
// if(mEndTime > mRankItems.at(EndIndex).mStartTime)
// {
// QRectF LabelRect;
// qreal StartPixel = (mRankItems.at(EndIndex).mEndTime - mStartTime) * pitch;
// qreal EndPixel = (mEndTime - mStartTime) * pitch;
// qreal Height = boundingRect().height();
// LabelRect.setRect(StartPixel,0,(EndPixel-StartPixel),Height);
// painter->drawLine(StartPixel,0,StartPixel,Height);
// painter->drawLine(EndPixel,0,EndPixel,Height);
//// if(EndIndex == StartIndex)
//// painter->drawText(LabelRect,mRankItems.at(EndIndex).mLabel,Qt::AlignHCenter | Qt::AlignVCenter);
//// else
// painter->drawText(LabelRect,mRankItems.at(EndIndex+1).mLabel,Qt::AlignHCenter | Qt::AlignVCenter);
// }
// }
}
void CRankRulerWidget::Render()
{
if(mRankItems.isEmpty())
return;
mRulerPixmap->fill(Qt::white);
QPainter *painter = new QPainter(mRulerPixmap);
QFont font;
font.setPixelSize(12);
painter->setFont(font);
qreal pitch = mPixelWidth/(mEndTime - mStartTime); //pixel/ns
int StartIndex = 0,EndIndex = 0;
bool StartFound = false;
for(int i = 0; i < mRankItems.size(); i++)
{
if(StartFound == false)
{
if(mStartTime <= mRankItems.at(i).mStartTime)
{
StartIndex = i;
StartFound = true;
}
}
if(mRankItems.at(i).mEndTime <= mEndTime)
{
EndIndex = i;
}
}
if(StartIndex > 0)
{
if(mStartTime < mRankItems.at(StartIndex).mStartTime)
{
QRectF LabelRect;
qreal StartPixel = 0;//mStartTime * pitch;
qreal EndPixel = (mRankItems.at(StartIndex).mStartTime - mStartTime) * pitch;
qreal Height = boundingRect().height();
LabelRect.setRect(StartPixel,0,(EndPixel-StartPixel),Height);
painter->drawLine(StartPixel,0,StartPixel,Height);
painter->drawLine(EndPixel,0,EndPixel,Height);
painter->drawText(LabelRect,mRankItems.at(StartIndex-1).mLabel,Qt::AlignHCenter | Qt::AlignVCenter);
}
}
for(int i = StartIndex; i <= EndIndex; i++)
{
QRectF LabelRect;
qreal StartPixel = (mRankItems.at(i).mStartTime - mStartTime) * pitch;
qreal EndPixel;
if(mRankItems.at(i).mEndTime > mEndTime)
EndPixel = (mEndTime - mStartTime) * pitch;
else
EndPixel = (mRankItems.at(i).mEndTime - mStartTime) * pitch;
qreal Height = boundingRect().height();
LabelRect.setRect(StartPixel,0,(EndPixel-StartPixel),Height);
painter->drawLine(StartPixel,0,StartPixel,Height);
painter->drawLine(EndPixel,0,EndPixel,Height);
painter->drawText(LabelRect,mRankItems.at(i).mLabel,Qt::AlignHCenter | Qt::AlignVCenter);
}
if(EndIndex < mRankItems.size()-1)
{
if(mEndTime > mRankItems.at(EndIndex).mStartTime)
{
QRectF LabelRect;
qreal StartPixel = (mRankItems.at(EndIndex).mEndTime - mStartTime) * pitch;
qreal EndPixel = (mEndTime - mStartTime) * pitch;
qreal Height = boundingRect().height();
LabelRect.setRect(StartPixel,0,(EndPixel-StartPixel),Height);
painter->drawLine(StartPixel,0,StartPixel,Height);
painter->drawLine(EndPixel,0,EndPixel,Height);
// if(EndIndex == StartIndex)
// painter->drawText(LabelRect,mRankItems.at(EndIndex).mLabel,Qt::AlignHCenter | Qt::AlignVCenter);
// else
painter->drawText(LabelRect,mRankItems.at(EndIndex+1).mLabel,Qt::AlignHCenter | Qt::AlignVCenter);
}
}
delete painter;
}
unsigned int CRankRulerWidget::SetRange(quint64 StartTime, quint64 EndTime)
{
if(StartTime > EndTime)
return false;
if(mRankItems.isEmpty())
return false;
mStartTime = StartTime;
mEndTime = EndTime;
mTimeOffset = mRankItems.first().mStartTime;
Render();
update();
return RET_OK;
}
unsigned int CRankRulerWidget::AddRankItem(QString Rank, quint64 StartTime, quint64 EndTime)
{
CRankWidgetItem NewItem;
NewItem.mLabel = Rank;
NewItem.mStartTime = StartTime;
NewItem.mEndTime = EndTime;
mRankItems.append(NewItem);
return RET_OK;
}
void CRankRulerWidget::SetLabel(QString Label, int Offset)
{
QFont font;
font.setBold(true);
mLabel->setFont(font);
mLabel->setPlainText(Label);
mLabel->setPos(-Offset,boundingRect().height()/2 - mLabel->boundingRect().height()/2);
}
void CRankRulerWidget::ClearRuler()
{
mRankItems.clear();
}