// virtual void KeyframeHelper::mousePressEvent(QMouseEvent * event) { m_hoverKeyframe = -1; if (event->button() != Qt::LeftButton) { QWidget::mousePressEvent(event); return; } int xPos = event->x() - margin; int headOffset = m_lineHeight / 1.5; if (m_geom != NULL && (event->y() <= headOffset)) { // check if we want to move a keyframe int mousePos = qMax((int)(xPos / m_scale), 0) + m_offset; Mlt::GeometryItem item; if (m_geom->next_key(&item, mousePos) == 0) { if (qAbs((item.frame() - m_offset)* m_scale - xPos) < headOffset) { m_movingItem.x(item.x()); m_movingItem.y(item.y()); m_movingItem.w(item.w()); m_movingItem.h(item.h()); m_movingItem.mix(item.mix()); m_movingItem.frame(item.frame()); while (!m_extraMovingItems.isEmpty()) { Mlt::GeometryItem *gitem = m_extraMovingItems.takeFirst(); if (gitem) delete gitem; } for (int i = 0; i < m_extraGeometries.count(); ++i) { if (m_extraGeometries.at(i)->next_key(item, mousePos) == 0) { Mlt::GeometryItem *item2 = new Mlt::GeometryItem(); item2->x(item.x()); item2->frame(item.frame()); m_extraMovingItems.append(item2); } else { m_extraMovingItems.append(NULL); } } m_dragStart = event->pos(); return; } } } int seekRequest = xPos / m_scale; if (seekRequest != m_position) { m_seekPosition = seekRequest; emit requestSeek(m_seekPosition); update(); } }
void Geometryval::slotPositionChanged(int pos, bool seek) { if (seek && KdenliveSettings::transitionfollowcursor()) emit seekToPos(pos); m_ui.spinPos->setValue(pos); m_helper->setValue(pos); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { // no keyframe under cursor, adjust buttons m_ui.buttonAdd->setEnabled(true); m_ui.buttonDelete->setEnabled(false); m_ui.widget->setEnabled(false); m_ui.spinTransp->setEnabled(false); m_scaleMenu->setEnabled(false); m_alignMenu->setEnabled(false); } else { m_ui.buttonAdd->setEnabled(false); m_ui.buttonDelete->setEnabled(true); m_ui.widget->setEnabled(true); m_ui.spinTransp->setEnabled(true); m_scaleMenu->setEnabled(true); m_alignMenu->setEnabled(true); } m_paramRect->setPos(item.x(), item.y()); m_paramRect->setRect(0, 0, item.w(), item.h()); m_ui.spinTransp->setValue(item.mix()); m_paramRect->setBrush(QColor(255, 0, 0, item.mix())); }
void Geometryval::setupParam(const QDomElement par, int minFrame, int maxFrame) { QString val = par.attribute("value"); if (par.attribute("fixed") == "1") { m_fixedMode = true; buttonPrevious->setHidden(true); buttonNext->setHidden(true); buttonDelete->setHidden(true); buttonAdd->setHidden(true); spinTransp->setMaximum(500); label_pos->setHidden(true); m_helper->setHidden(true); m_timePos.setHidden(true); } if (par.attribute("opacity") == "false") { label_opacity->setHidden(true); spinTransp->setHidden(true); } if (m_geom) m_geom->parse(val.toUtf8().data(), maxFrame - minFrame, m_profile->width(), m_profile->height()); else m_geom = new Mlt::Geometry(val.toUtf8().data(), maxFrame - minFrame, m_profile->width(), m_profile->height()); ////qDebug() << " / / UPDATING TRANSITION VALUE: " << m_geom->serialise(); //read param her and set rect if (!m_fixedMode) { m_helper->setKeyGeometry(m_geom, maxFrame - minFrame - 1); m_helper->update(); /*QDomDocument doc; doc.appendChild(doc.importNode(par, true)); //qDebug() << "IMPORTED TRANS: " << doc.toString();*/ if (m_path == NULL) { m_path = new QGraphicsPathItem(); m_path->setPen(QPen(Qt::red)); m_scene->addItem(m_path); } updateTransitionPath(); } Mlt::GeometryItem item; m_geom->fetch(&item, 0); delete m_paramRect; m_paramRect = new QGraphicsRectItem(QRectF(0, 0, item.w() * m_dar, item.h())); m_paramRect->setPos(item.x() * m_dar, item.y()); m_paramRect->setZValue(0); m_paramRect->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); m_paramRect->setPen(QPen(QBrush(QColor(255, 0, 0, 255)), 1.0)); m_scene->addItem(m_paramRect); slotPositionChanged(0, false); slotUpdateGeometry(); if (!m_fixedMode) { m_timePos.setRange(0, maxFrame - minFrame - 1); connect(&m_timePos, SIGNAL(timeCodeEditingFinished()), this , SLOT(slotPositionChanged())); } connect(spinTransp, SIGNAL(valueChanged(int)), this , SLOT(slotTransparencyChanged(int))); }
void Geometryval::updateTransitionPath() { if (m_fixedMode) return; Mlt::GeometryItem item; int pos = 0; int counter = 0; QPainterPath path; while (true) { if (m_geom->next_key(&item, pos) == 1) break; pos = item.frame(); if (counter == 0) { path.moveTo(item.x() * m_dar + item.w() * m_dar / 2, item.y() + item.h() / 2); } else { path.lineTo(item.x() * m_dar + item.w() * m_dar / 2, item.y() + item.h() / 2); } counter++; pos++; } m_path->setPath(path); }
void Geometryval::setupParam(const QDomElement& par, int minFrame, int maxFrame) { m_param = par; QString val = par.attribute("value"); if (par.attribute("fixed") == "1") { m_fixedMode = true; m_ui.buttonPrevious->setHidden(true); m_ui.buttonNext->setHidden(true); m_ui.buttonDelete->setHidden(true); m_ui.buttonAdd->setHidden(true); m_ui.spinTransp->setMaximum(500); m_ui.label_pos->setHidden(true); m_helper->setHidden(true); m_ui.spinPos->setHidden(true); } char *tmp = (char *) qstrdup(val.toUtf8().data()); if (m_geom) m_geom->parse(tmp, maxFrame - minFrame, m_profile.width, m_profile.height); else m_geom = new Mlt::Geometry(tmp, maxFrame - minFrame, m_profile.width, m_profile.height); delete[] tmp; //kDebug() << " / / UPDATING TRANSITION VALUE: " << m_geom->serialise(); //read param her and set rect if (!m_fixedMode) { m_helper->setKeyGeometry(m_geom, maxFrame - minFrame - 1); m_helper->update(); /*QDomDocument doc; doc.appendChild(doc.importNode(par, true)); kDebug() << "IMPORTED TRANS: " << doc.toString();*/ m_ui.spinPos->setMaximum(maxFrame - minFrame - 1); if (m_path == NULL) { m_path = new QGraphicsPathItem(); m_path->setPen(QPen(Qt::red)); m_scene->addItem(m_path); } updateTransitionPath(); } Mlt::GeometryItem item; m_geom->fetch(&item, 0); delete m_paramRect; m_paramRect = new QGraphicsRectItem(QRectF(0, 0, item.w(), item.h())); m_paramRect->setPos(item.x(), item.y()); m_paramRect->setZValue(0); m_paramRect->setPen(QPen(QBrush(QColor(255, 0, 0, 255)), 1.0)); m_scene->addItem(m_paramRect); slotPositionChanged(0, false); if (!m_fixedMode) { connect(m_ui.spinPos, SIGNAL(valueChanged(int)), this , SLOT(slotPositionChanged(int))); }
void Geometryval::slotUpdateTransitionProperties() { int pos = m_timePos.getValue(); Mlt::GeometryItem item; int error = m_geom->next_key(&item, pos); if (error || item.frame() != pos) { // no keyframe under cursor return; } QRectF r = m_paramRect->rect().normalized(); QPointF rectpos = m_paramRect->pos(); item.x(rectpos.x() / m_dar); item.y(rectpos.y()); item.w(r.width() / m_dar); item.h(r.height()); m_geom->insert(item); updateTransitionPath(); emit parameterChanged(); }
void Geometryval::slotAddFrame() { int pos = m_ui.spinPos->value(); Mlt::GeometryItem item; item.frame(pos); item.x(m_paramRect->pos().x()); item.y(m_paramRect->pos().y()); item.w(m_paramRect->rect().width()); item.h(m_paramRect->rect().height()); item.mix(m_ui.spinTransp->value()); m_geom->insert(item); m_ui.buttonAdd->setEnabled(false); m_ui.buttonDelete->setEnabled(true); m_ui.widget->setEnabled(true); m_ui.spinTransp->setEnabled(true); m_scaleMenu->setEnabled(true); m_alignMenu->setEnabled(true); m_helper->update(); emit parameterChanged(); }
void Geometryval::slotAddFrame(int pos) { int frame = m_timePos.getValue(); if (pos == -1) pos = frame; Mlt::GeometryItem item; item.frame(pos); QRectF r = m_paramRect->rect().normalized(); QPointF rectpos = m_paramRect->pos(); item.x(rectpos.x() / m_dar); item.y(rectpos.y()); item.w(r.width() / m_dar); item.h(r.height()); item.mix(spinTransp->value()); m_geom->insert(item); buttonAdd->setEnabled(false); buttonDelete->setEnabled(true); widget->setEnabled(true); spinTransp->setEnabled(true); frameOptions->setEnabled(true); m_reset->setEnabled(true); m_helper->update(); emit parameterChanged(); }
void Geometryval::slotPositionChanged(int pos, bool seek) { if (pos == -1) { pos = m_timePos.getValue(); } if (seek && KdenliveSettings::transitionfollowcursor()) emit seekToPos(pos + m_startPoint); m_timePos.setValue(pos); //spinPos->setValue(pos); m_helper->blockSignals(true); m_helper->setValue(pos); m_helper->blockSignals(false); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { // no keyframe under cursor, adjust buttons buttonAdd->setEnabled(true); buttonDelete->setEnabled(false); widget->setEnabled(false); spinTransp->setEnabled(false); frameOptions->setEnabled(false); m_reset->setEnabled(false); } else { buttonAdd->setEnabled(false); buttonDelete->setEnabled(true); widget->setEnabled(true); spinTransp->setEnabled(true); frameOptions->setEnabled(true); m_reset->setEnabled(true); } m_paramRect->setPos(item.x() * m_dar, item.y()); m_paramRect->setRect(0, 0, item.w() * m_dar, item.h()); spinTransp->setValue(item.mix()); m_paramRect->setBrush(QColor(255, 0, 0, item.mix())); slotUpdateGeometry(); }