SpeakersMonitor.cpp 2.63 KB
#include <QPainter>
#include <QDebug>

#include "SpeakersMonitor.h"

SpeakersMonitor::SpeakersMonitor(int labelHeight, QWidget *parent)
  : QWidget(parent),
    m_maxDensity(0.0),
    m_labelHeight(labelHeight)
{
}

///////////
// slots //
///////////

void SpeakersMonitor::speakersRetrieved(QList<QString> speakers)
{
  const int n(speakers.size());
  const qreal lambda(201.0/200.0);
  
  QString currSpeaker;
  qreal currDensity;
  QList<QString> speakerLabels;
  
  // retrieving speaker labels
  for (int i(0); i < speakers.size(); i++)
    if (!(currSpeaker = speakers[i]).isEmpty() && currSpeaker != "S" && !speakerLabels.contains(currSpeaker))
      speakerLabels.push_back(currSpeaker);
  
  // computing speaker density in each time position

  QVector<qreal> left(n);
  QVector<qreal> right(n);
  QList<qreal> densityValues;

  for (int i(0); i < speakerLabels.size(); i++) {
	
    currSpeaker = speakerLabels[i];
    densityValues.clear();

    left[0] = right[n-1] = 0;

    for (int i(1); i < n; i++) {
      left[i] = (left[i-1] + (speakers[i-1] == currSpeaker)) / lambda;
      right[n-i-1] = (right[n-i] + (speakers[n-i] == currSpeaker)) / lambda;
    }

    for (int i(0); i < n; i++) {
      currDensity = left[i] + (speakers[i] == currSpeaker) + right[i];
      densityValues.push_back(currDensity);

      if (currDensity > m_maxDensity)
	m_maxDensity = currDensity;
    }
	
    m_density.insert(currSpeaker, densityValues);
  }
  
  setFixedSize(480, m_density.keys().size() * m_labelHeight);
}

void SpeakersMonitor::positionChanged(qint64 position)
{
  m_position = position / 40 - 1;
  update();
}

void SpeakersMonitor::paintEvent(QPaintEvent *event)
{
  Q_UNUSED(event);

  QString currSpeaker;
  QList<qreal> densityValues;
  QPainter painter(this);

  QFont font;
  font.setPointSize(m_labelHeight-2);
  painter.setFont(font);

  int x1, x2, y;

  m_it = m_density.constBegin();

  int i(1);
  int maxWidth(0);

  while (m_it != m_density.constEnd()) {

    currSpeaker = m_it.key();
      
    QRect rect = painter.boundingRect(QRect(0, i * m_labelHeight - 1, 10, m_labelHeight), Qt::AlignHCenter, currSpeaker);
    if (rect.width() > maxWidth)
      maxWidth = rect.width();
    painter.drawText(QPoint(0, i * m_labelHeight - 1), currSpeaker);
    i++;
    m_it++;
  }

  m_it = m_density.constBegin();

  i = 0;
  qreal ratio = (width() - maxWidth) / m_maxDensity;

  while (m_it != m_density.constEnd()) {

    currSpeaker = m_it.key();
    densityValues = m_it.value();

    x1 = maxWidth;
    x2 = maxWidth + densityValues[m_position] * ratio;
    y = i * m_labelHeight + m_labelHeight / 2;

    painter.drawLine(x1, y, x2, y);

    i++;
    m_it++;
  }
}