SequenceDiagram::SequenceDiagram(QCPAxis *keyAxis, QCPAxis *valueAxis, QCPAxis *commentAxis) :
    QCPAbstractPlottable(keyAxis, valueAxis),
    key_axis_(keyAxis),
    value_axis_(valueAxis),
    comment_axis_(commentAxis),
    data_(NULL),
    sainfo_(NULL),
    selected_packet_(0),
    selected_key_(-1.0)
{
    data_ = new WSCPSeqDataMap();
    // xaxis (value): Address
    // yaxis (key): Time
    // yaxis2 (comment): Extra info ("Comment" in GTK+)

//    valueAxis->setAutoTickStep(false);
    QList<QCPAxis *> axes;
    axes << value_axis_ << key_axis_ << comment_axis_;
    QPen no_pen(Qt::NoPen);
    foreach (QCPAxis *axis, axes) {
        axis->setAutoTicks(false);
        axis->setTickStep(1.0);
        axis->setAutoTickLabels(false);
        axis->setSubTickPen(no_pen);
        axis->setTickPen(no_pen);
        axis->setBasePen(no_pen);
    }
void FieldPainter::drawField() {

   QBrush no_brush(Qt::NoBrush);
   QBrush goal_brush(Qt::yellow);

   QPen no_pen(Qt::NoPen);

   QPen field_line_pen(QColor(255, 255, 255));
   field_line_pen.setWidth(FIELD_LINE_WIDTH);
   field_line_pen.setJoinStyle(Qt::MiterJoin);
   field_line_pen.setMiterLimit(0.5);

   QPen marker_pen(QColor(255, 255, 255));
   marker_pen.setWidth(FIELD_LINE_WIDTH);
   marker_pen.setJoinStyle(Qt::MiterJoin);
   marker_pen.setCapStyle(Qt::FlatCap);
   marker_pen.setMiterLimit(0);

   QPen crossbar_pen(Qt::yellow);
   crossbar_pen.setWidth(GOAL_POST_DIAMETER);
   marker_pen.setCapStyle(Qt::FlatCap);
   crossbar_pen.setMiterLimit(0);

   QPen goal_supports_pen(Qt::gray);
   goal_supports_pen.setWidth(GOAL_SUPPORT_DIAMETER);

   save();

   setRenderHint(QPainter::Antialiasing);

   setBrush(no_brush);
   setPen(field_line_pen);

   drawRect(-FIELD_LENGTH/2, -FIELD_WIDTH/2, FIELD_LENGTH, FIELD_WIDTH);
   drawLine(0, FIELD_WIDTH/2, 0, -FIELD_WIDTH/2);
   drawRect(-FIELD_LENGTH/2, -GOAL_BOX_WIDTH/2, GOAL_BOX_LENGTH, GOAL_BOX_WIDTH);
   drawRect(FIELD_LENGTH/2 - GOAL_BOX_LENGTH, -GOAL_BOX_WIDTH/2, GOAL_BOX_LENGTH, GOAL_BOX_WIDTH);
   drawEllipse(QPoint(0, 0), CENTER_CIRCLE_DIAMETER/2, CENTER_CIRCLE_DIAMETER/2);

   setBrush(no_brush);
   setPen(marker_pen);

   drawLine(-MARKER_DIMENSIONS/2, 0, MARKER_DIMENSIONS/2, 0);

   int penalty_x = FIELD_LENGTH/2 - DIST_GOAL_LINE_TO_MARKER;

   drawLine(penalty_x - MARKER_DIMENSIONS/2, 0, penalty_x + MARKER_DIMENSIONS/2, 0);
   drawLine(penalty_x, -MARKER_DIMENSIONS/2, penalty_x, MARKER_DIMENSIONS/2);

   drawLine(-penalty_x - MARKER_DIMENSIONS/2, 0, -penalty_x + MARKER_DIMENSIONS/2, 0);
   drawLine(-penalty_x, -MARKER_DIMENSIONS/2, -penalty_x, MARKER_DIMENSIONS/2);   

   setBrush(no_brush);
   setPen(goal_supports_pen);

   int goal_x = FIELD_LENGTH/2 + FIELD_LINE_WIDTH/2;

   drawLine(-goal_x, -GOAL_WIDTH/2, -goal_x - GOAL_DEPTH, -GOAL_WIDTH/2);
   drawLine(-goal_x,  GOAL_WIDTH/2, -goal_x - GOAL_DEPTH,  GOAL_WIDTH/2);
   drawLine( goal_x, -GOAL_WIDTH/2,  goal_x + GOAL_DEPTH, -GOAL_WIDTH/2);
   drawLine( goal_x,  GOAL_WIDTH/2,  goal_x + GOAL_DEPTH,  GOAL_WIDTH/2);
   drawLine( goal_x + GOAL_DEPTH, -GOAL_WIDTH/2,  goal_x + GOAL_DEPTH, GOAL_WIDTH/2);
   drawLine(-goal_x - GOAL_DEPTH, -GOAL_WIDTH/2, -goal_x - GOAL_DEPTH, GOAL_WIDTH/2);

   setBrush(no_brush);
   setPen(crossbar_pen);

   drawLine(-goal_x, -GOAL_WIDTH/2, -goal_x, GOAL_WIDTH/2);
   drawLine( goal_x, -GOAL_WIDTH/2,  goal_x, GOAL_WIDTH/2);

   setBrush(goal_brush);
   setPen(no_pen);

   drawEllipse(QPoint(-goal_x, -GOAL_WIDTH/2), GOAL_POST_DIAMETER/2, GOAL_POST_DIAMETER/2);
   drawEllipse(QPoint(-goal_x,  GOAL_WIDTH/2), GOAL_POST_DIAMETER/2, GOAL_POST_DIAMETER/2);
   drawEllipse(QPoint( goal_x, -GOAL_WIDTH/2), GOAL_POST_DIAMETER/2, GOAL_POST_DIAMETER/2);
   drawEllipse(QPoint( goal_x,  GOAL_WIDTH/2), GOAL_POST_DIAMETER/2, GOAL_POST_DIAMETER/2);

   restore();
}