Mercurial > hg > dmlib
view edtimeline.cpp @ 400:f44a89a25c97
Fix waveform display from going over buffer limit.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 19 Oct 2012 15:56:59 +0300 |
parents | 8660c6005032 |
children | 2fdf440ea66a |
line wrap: on
line source
#include <QtGui> #include "edtimeline.h" QTimelineTrackDisplay::QTimelineTrackDisplay(QWidget *parent) : QWidget(parent) { track = NULL; time = offs = 0; scale = 1.0f; setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); } QSize QTimelineTrackDisplay::minimumSizeHint() const { return QSize(100, 60); } QSize QTimelineTrackDisplay::sizeHint() const { return QSize(600, 60); } void QTimelineTrackDisplay::setTrack(DMTimelineTrack *mtrack) { track = mtrack; } void QTimelineTrackDisplay::setTime(const int mtime) { time = mtime; } void QTimelineTrackDisplay::setOffset(const int moffs) { offs = moffs; } void QTimelineTrackDisplay::setScale(const float mscale) { if (mscale > 0.05) scale = mscale; } void QTimelineTrackDisplay::paintEvent(QPaintEvent *) { if (track == NULL) return; QColor eventColor(150, 150, 150); QColor markerColor(255,255,255); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.save(); painter.scale(scale, 1); for (int event = 0; event < track->nevents; event++) { DMTimelineEvent *ev = track->events[event]; } painter.restore(); if (time >= offs * scale && time - offs <= width() * scale) { int xc = time - offs; painter.save(); painter.scale(scale, 1); painter.setPen(markerColor); painter.drawLine(xc, 0, xc, height()); painter.restore(); } } void QTimelineTrackDisplay::mousePressEvent(QMouseEvent *ev) { /* if (ev->button() == Qt::LeftButton) { lastPoint = ev->pos(); scribbling = true; } */ } void QTimelineTrackDisplay::mouseMoveEvent(QMouseEvent *ev) { /* if ((ev->buttons() & Qt::LeftButton) && scribbling) drawLineTo(ev->pos()); */ } void QTimelineTrackDisplay::mouseReleaseEvent(QMouseEvent *ev) { /* if (ev->button() == Qt::LeftButton && scribbling) { drawLineTo(ev->pos()); scribbling = false; } */ } QTimelineTrackView::QTimelineTrackView(QWidget *parent) : QWidget(parent) { QHBoxLayout *mainLayout = new QHBoxLayout(this); mainLayout->setMargin(0); track = new QTimelineTrackDisplay(this); QFrame *infoLayoutContainer = new QFrame(this); infoLayoutContainer->setFrameStyle(QFrame::StyledPanel | QFrame::Plain); infoLayoutContainer->setLineWidth(2); infoLayoutContainer->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); infoLayoutContainer->setFixedWidth(200); QVBoxLayout *infoLayout = new QVBoxLayout(infoLayoutContainer); infoLayout->setMargin(0); // QVBoxLayout *infoLayout = new QVBoxLayout(); infoName = new QLineEdit(); infoName->setFrame(false); infoName->setMaxLength(DT_MAX_NAME_LENGTH); infoName->setStyleSheet("QLineEdit { background-color: black; color: white; padding: 2px; }"); connect(infoName, SIGNAL(textEdited(const QString&)), this, SLOT(slotTrackNameChanged(const QString&))); infoLayout->addWidget(infoName); enabledCheck = new QCheckBox("Enabled"); infoLayout->addWidget(enabledCheck); connect(enabledCheck, SIGNAL(toggled(bool)), this, SLOT(slotTrackEnabledChanged(bool))); infoData = new QLabel(); infoData->setStyleSheet("QLabel { padding: 2px; }"); infoLayout->addWidget(infoData); mainLayout->addWidget(infoLayoutContainer); // mainLayout->addLayout(infoLayout); mainLayout->addWidget(track); } void QTimelineTrackView::update() { if (track != NULL && track->track) { infoName->setText(QString(track->track->name)); enabledCheck->setChecked(track->track->enabled); infoData->setText(QString("<b>%1</b> events").arg(track->track->nevents)); } else { infoName->setText(""); infoData->setText("-"); enabledCheck->setChecked(false); } QWidget::update(); } void QTimelineTrackView::setTrack(DMTimelineTrack *mtrack) { track->setTrack(mtrack); update(); } void QTimelineTrackView::slotTrackEnabledChanged(bool value) { track->track->enabled = value; emit trackChanged(); } void QTimelineTrackView::slotTrackNameChanged(const QString & text) { QByteArray ba = text.toUtf8(); track->track->name = dm_strdup(ba.constData()); emit trackChanged(); } QTimelineView::QTimelineView(QWidget *parent) : QWidget(parent) { layout = new QVBoxLayout(this); tl = NULL; } void QTimelineView::setTimeline(TimelineObject *mtl) { tl = mtl; delete layout; layout = new QVBoxLayout(this); layout->setMargin(0); tracks.clear(); if (tl != NULL && tl->tl != NULL) { for (int track = 0; track < tl->tl->ntracks; track++) { QTimelineTrackView *vtr = new QTimelineTrackView(this); vtr->setTrack(tl->tl->tracks[track]); tracks.append(vtr); layout->addWidget(vtr); connect(vtr, SIGNAL(trackChanged()), this, SLOT(slotTimelineChanged())); } } update(); } void QTimelineView::slotTimelineChanged() { if (tl != NULL) { tl->changed++; emit timelineChanged(); } } void QTimelineView::setTime(const int mtime) { if (tl != NULL && tl->tl != NULL) { QList<QTimelineTrackView *>::iterator track; for (track = tracks.begin(); track != tracks.end(); track++) { (*track)->track->setTime(mtime); } update(); } } void QTimelineView::setOffset(const int moffs) { if (tl != NULL && tl->tl != NULL) { QList<QTimelineTrackView *>::iterator track; for (track = tracks.begin(); track != tracks.end(); track++) { (*track)->track->setOffset(moffs); } update(); } } void QTimelineView::setScale(const float mscale) { if (tl != NULL && tl->tl != NULL) { QList<QTimelineTrackView *>::iterator track; for (track = tracks.begin(); track != tracks.end(); track++) { (*track)->track->setScale(mscale); } update(); } }