Guide::Guide(CustomTrackView *view, GenTime pos, QString label, double height) : QGraphicsLineItem(), m_position(pos), m_label(label), m_view(view), m_pen(QPen()) { setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIgnoresTransformations); #if QT_VERSION >= 0x040600 setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setToolTip(label); setLine(0, 0, 0, height); if (m_position < GenTime()) m_position = GenTime(); setPos(m_position.frames(m_view->fps()), 0); m_pen.setWidthF(0); m_pen.setColor(QColor(0, 0, 200, 180)); //m_pen.setCosmetic(true); setPen(m_pen); setZValue(999); setAcceptsHoverEvents(true); const QFontMetrics metric = m_view->fontMetrics(); m_width = metric.width(' ' + m_label + ' ') + 2; prepareGeometryChange(); }
void ClipDurationDialog::slotCheckStart() { GenTime start = m_pos->gentime(); GenTime duration = m_dur->gentime(); if (m_min != GenTime() && start < m_min) m_pos->setValue(m_min); else if (m_max != GenTime() && start + duration > m_max) m_pos->setValue(m_max - duration); }
void SubProjectItem::setZone(QPoint p) { m_in = p.x(); m_out = p.y(); QString name = Timecode::getStringTimecode(m_in, KdenliveSettings::project_fps()); setText(0, name); GenTime duration = GenTime(m_out - m_in, KdenliveSettings::project_fps()); if (duration != GenTime()) setData(0, DurationRole, Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps())); }
GenTime CustomTrackScene::previousSnapPoint(const GenTime &pos) const { for (int i = 0; i < m_snapPoints.size(); ++i) { if (m_snapPoints.at(i) >= pos) { if (i == 0) return GenTime(); return m_snapPoints.at(i - 1); } } return GenTime(); }
// virtual void InsertSpaceCommand::redo() { if (m_doIt) { m_view->insertSpace(m_clipsToMove, m_transToMove, m_track, m_duration, GenTime()); } m_doIt = true; }
SubProjectItem::SubProjectItem(double display_ratio, QTreeWidgetItem * parent, int in, int out, QString description) : QTreeWidgetItem(parent, PROJECTSUBCLIPTYPE), m_in(in), m_out(out), m_description(description) { setSizeHint(0, QSize((int) (itemHeight * display_ratio) + 2, itemHeight + 2)); setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDropEnabled); QString name = Timecode::getStringTimecode(in, KdenliveSettings::project_fps()); setText(0, name); setText(1, description); GenTime duration = GenTime(out - in, KdenliveSettings::project_fps()); if (duration != GenTime()) setData(0, DurationRole, Timecode::getEasyTimecode(duration, KdenliveSettings::project_fps())); QPixmap pix((int) (itemHeight * display_ratio), itemHeight); pix.fill(Qt::gray); setData(0, Qt::DecorationRole, pix); //setFlags(Qt::NoItemFlags); //kDebug() << "Constructed with clipId: " << m_clipId; }
void DvdWizardChapters::updateMonitorMarkers() { QStringList chapters = m_view.vob_list->itemData(m_view.vob_list->currentIndex(), Qt::UserRole + 1).toStringList(); QList <CommentedTime> markers; foreach(const QString &frame, chapters) { markers << CommentedTime(GenTime(frame.toInt(), m_tc.fps()), QString()); }
bool TransitionHandler::addTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml) { if (in >= out) return false; double fps = m_tractor->get_fps(); QMap<QString, QString> args = getTransitionParamsFromXml(xml); QScopedPointer<Mlt::Field> field(m_tractor->field()); Mlt::Transition transition(*m_tractor->profile(), tag.toUtf8().constData()); if (!transition.is_valid()) return false; if (out != GenTime()) transition.set_in_and_out((int) in.frames(fps), (int) out.frames(fps) - 1); QMap<QString, QString>::Iterator it; QString key; if (xml.attribute(QStringLiteral("automatic")) == QLatin1String("1")) transition.set("automatic", 1); ////qDebug() << " ------ ADDING TRANSITION PARAMs: " << args.count(); if (xml.hasAttribute(QStringLiteral("id"))) transition.set("kdenlive_id", xml.attribute(QStringLiteral("id")).toUtf8().constData()); if (xml.hasAttribute(QStringLiteral("force_track"))) transition.set("force_track", xml.attribute(QStringLiteral("force_track")).toInt()); for (it = args.begin(); it != args.end(); ++it) { key = it.key(); if (!it.value().isEmpty()) transition.set(key.toUtf8().constData(), it.value().toUtf8().constData()); ////qDebug() << " ------ ADDING TRANS PARAM: " << key << ": " << it.value(); } // attach transition m_tractor->lock(); plantTransition(field.data(), transition, a_track, b_track); // field->plant_transition(*transition, a_track, b_track); m_tractor->unlock(); return true; }
// virtual void InsertSpaceCommand::redo() { // kDebug() << "---- redoing action cut: " << m_cutTime.frames(25); if (m_doIt) { m_view->insertSpace(m_clipsToMove, m_transToMove, m_track, m_duration, GenTime()); } m_doIt = true; }
const QString Timecode::mask(const GenTime& t) const { if (t < GenTime()) { if (m_dropFrameTimecode) return "#99:99:99,99"; else return "#99:99:99:99"; } if (m_dropFrameTimecode) return "99:99:99,99"; else return "99:99:99:99"; }
EditGuideCommand::EditGuideCommand(CustomTrackView *view, const GenTime &oldPos, const QString &oldcomment, const GenTime &pos, const QString &comment, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_oldcomment(oldcomment), m_comment(comment), m_oldPos(oldPos), m_pos(pos), m_doIt(doIt) { if (m_oldcomment.isEmpty()) { setText(i18n("Add guide")); m_oldPos = GenTime(-1); } else if (m_oldPos == m_pos) setText(i18n("Edit guide")); else if (m_pos < GenTime() && m_comment.isEmpty()) setText(i18n("Delete guide")); else setText(i18n("Move guide")); }
GenTime AbstractGroupItem::duration() { QList <QGraphicsItem *> children = childItems(); GenTime start = GenTime(-1.0); GenTime end = GenTime(); for (int i = 0; i < children.count(); ++i) { if (children.at(i)->type() != GroupWidget) { AbstractClipItem *item = static_cast <AbstractClipItem *>(children.at(i)); if (item) { if (start < GenTime() || item->startPos() < start) start = item->startPos(); if (item->endPos() > end) end = item->endPos(); } } else { children << children.at(i)->childItems(); } } return end - start; }
InsertSpaceCommand::InsertSpaceCommand(CustomTrackView *view, QList<ItemInfo> clipsToMove, QList<ItemInfo> transToMove, int track, const GenTime &duration, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_clipsToMove(clipsToMove), m_transToMove(transToMove), m_duration(duration), m_track(track), m_doIt(doIt) { if (duration > GenTime()) setText(i18n("Insert space")); else setText(i18n("Remove space")); }
Transition::Transition(const ItemInfo &info, int transitiontrack, double fps, const QDomElement ¶ms, bool automaticTransition) : AbstractClipItem(info, QRectF(), fps), m_forceTransitionTrack(false), m_automaticTransition(automaticTransition), m_transitionTrack(transitiontrack) { setZValue(4); m_info.cropDuration = info.endPos - info.startPos; if (QApplication::style()->styleHint(QStyle::SH_Widget_Animate, 0, QApplication::activeWindow())) { // animation disabled setRect(0, 0, m_info.cropDuration.frames(fps) - 0.02, (qreal) itemHeight()); } else { QPropertyAnimation *startAnimation = new QPropertyAnimation(this, "rect"); startAnimation->setDuration(200); const QRectF r(0, 0, m_info.cropDuration.frames(fps) - 0.02, (qreal) itemHeight() / 2); const QRectF r2(0, 0, m_info.cropDuration.frames(fps) - 0.02, (qreal)itemHeight()); startAnimation->setStartValue(r); startAnimation->setEndValue(r2); startAnimation->setEasingCurve(QEasingCurve::OutQuad); startAnimation->start(QAbstractAnimation::DeleteWhenStopped); } m_info.cropStart = GenTime(); m_maxDuration = GenTime(600); if (m_automaticTransition) setBrush(QColor(200, 200, 50, 180)); else setBrush(QColor(200, 100, 50, 180)); //m_referenceClip = clipa; if (params.isNull()) { m_parameters = MainWindow::transitions.getEffectByTag(QStringLiteral("luma"), QStringLiteral("dissolve")).cloneNode().toElement(); } else { m_parameters = params; } if (m_automaticTransition) m_parameters.setAttribute(QStringLiteral("automatic"), 1); else if (m_parameters.attribute(QStringLiteral("automatic")) == QLatin1String("1")) m_automaticTransition = true; if (m_parameters.attribute(QStringLiteral("force_track")) == QLatin1String("1")) m_forceTransitionTrack = true; m_name = i18n(m_parameters.firstChildElement("name").text().toUtf8().data()); }
void AbstractClipItem::resizeEnd(int posx, bool /*emitChange*/) { GenTime durationDiff = GenTime(posx, m_fps) - endPos(); if (durationDiff == GenTime()) return; if (cropDuration() + durationDiff <= GenTime()) { durationDiff = GenTime() - (cropDuration() - GenTime(3, m_fps)); } m_info.cropDuration += durationDiff; m_info.endPos += durationDiff; setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height()); if (durationDiff > GenTime()) { QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect); bool fixItem = false; for (int i = 0; i < collisionList.size(); ++i) { if (!collisionList.at(i)->isEnabled()) continue; QGraphicsItem *item = collisionList.at(i); if (item->type() == type() && item->pos().x() > pos().x()) { GenTime diff = static_cast<AbstractClipItem*>(item)->startPos() - startPos(); if (fixItem == false || diff < m_info.cropDuration) { fixItem = true; m_info.cropDuration = diff; } } } if (fixItem) setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height()); } }
void AbstractClipItem::resizeEnd(int posx, bool /*emitChange*/) { GenTime durationDiff = GenTime(posx, m_fps) - endPos(); if (durationDiff == GenTime()) return; if (cropDuration() + durationDiff <= GenTime()) { durationDiff = GenTime() - (cropDuration() - GenTime(3, m_fps)); } m_info.cropDuration += durationDiff; m_info.endPos += durationDiff; setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height()); if (durationDiff > GenTime()) { QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect); bool fixItem = false; for (int i = 0; i < collisionList.size(); ++i) { if (!collisionList.at(i)->isEnabled()) continue; QGraphicsItem *item = collisionList.at(i); if (item->type() == type() && item->pos().x() > pos().x()) { //kDebug() << "///////// COLLISION DETECTED!!!!!!!!!"; //kDebug() << "///////// CURRENT: " << startPos().frames(25) << "x" << endPos().frames(25) << ", RECT: " << rect() << "-" << pos(); //kDebug() << "///////// COLLISION: " << ((AbstractClipItem *)item)->startPos().frames(25) << "x" << ((AbstractClipItem *)item)->endPos().frames(25) << ", RECT: " << ((AbstractClipItem *)item)->rect() << "-" << item->pos(); GenTime diff = ((AbstractClipItem *)item)->startPos() - startPos(); if (fixItem == false || diff < m_info.cropDuration) { fixItem = true; m_info.cropDuration = diff; } } } if (fixItem) setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height()); } }
void ClipDurationDialog::slotCheckDuration() { GenTime start = m_pos->gentime(); GenTime duration = m_dur->gentime(); GenTime cropStart = m_cropStart->gentime(); GenTime maxDuration; if (m_clip->maxDuration() == GenTime()) maxDuration = m_max; else maxDuration = m_max == GenTime() ? start + m_clip->maxDuration() - cropStart : qMin(m_max, start + m_clip->maxDuration() - cropStart); if (maxDuration != GenTime() && start + duration > maxDuration) { m_dur->blockSignals(true); m_dur->setValue(maxDuration - start); m_dur->blockSignals(false); } m_cropEnd->blockSignals(true); m_cropEnd->setValue(m_clip->maxDuration() - m_dur->gentime() - cropStart); m_cropEnd->blockSignals(false); }
void ClipDurationDialog::slotCheckCrop() { GenTime duration = m_dur->gentime(); GenTime cropStart = m_cropStart->gentime(); GenTime maxDuration = m_clip->maxDuration(); GenTime diff = cropStart - m_crop; if ((diff > GenTime() && diff < duration) || diff < GenTime()) { duration -= diff; } else { m_cropStart->setValue(m_crop); return; } if (maxDuration != GenTime() && cropStart + duration > maxDuration) { m_cropStart->setValue(m_crop); } else { m_crop = cropStart; m_dur->blockSignals(true); m_dur->setValue(duration); m_dur->blockSignals(false); } }
void ClipDurationDialog::slotCheckEnd() { GenTime cropStart = m_cropStart->gentime(); GenTime cropEnd = m_cropEnd->gentime(); GenTime duration = m_clip->maxDuration() - cropEnd - cropStart; if (duration >= GenTime()) { m_dur->setValue(duration); slotCheckDuration(); } else { m_cropEnd->blockSignals(true); m_cropEnd->setValue(m_clip->maxDuration() - m_dur->gentime() - cropStart); m_cropEnd->blockSignals(false); } }
double CustomTrackScene::getSnapPointForPos(double pos, bool doSnap) { if (doSnap) { double maximumOffset; if (m_scale.x() > 3) maximumOffset = 10 / m_scale.x(); else maximumOffset = 6 / m_scale.x(); for (int i = 0; i < m_snapPoints.size(); ++i) { if (qAbs((int)(pos - m_snapPoints.at(i).frames(m_timeline->fps()))) < maximumOffset) { return m_snapPoints.at(i).frames(m_timeline->fps()); } if (m_snapPoints.at(i).frames(m_timeline->fps()) > pos) break; } } return GenTime(pos, m_timeline->fps()).frames(m_timeline->fps()); }
void AbstractClipItem::resizeStart(int posx, bool hasSizeLimit, bool /*emitChange*/) { GenTime durationDiff = GenTime(posx, m_fps) - m_info.startPos; if (durationDiff == GenTime()) return; if (type() == AVWidget && hasSizeLimit && (cropStart() + durationDiff < GenTime())) { durationDiff = GenTime() - cropStart(); } else if (durationDiff >= cropDuration()) { return; } m_info.startPos += durationDiff; m_keyframeView.setOffset(durationDiff.frames(m_fps)); // set to true if crop from start is negative (possible for color clips, images as they have no size limit) bool negCropStart = false; if (type() == AVWidget) { m_info.cropStart += durationDiff; if (m_info.cropStart < GenTime()) negCropStart = true; } m_info.cropDuration -= durationDiff; setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height()); moveBy(durationDiff.frames(m_fps), 0); if (m_info.startPos != GenTime(posx, m_fps)) { GenTime diff = m_info.startPos - GenTime(posx, m_fps); if (type() == AVWidget) m_info.cropStart += diff; m_info.cropDuration -= diff; setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height()); } // set crop from start to 0 (isn't relevant as this only happens for color clips, images) if (negCropStart) m_info.cropStart = GenTime(); }
int AbstractClipItem::mouseOverKeyFrames(QPointF pos, double maxOffset) { const QRectF br = sceneBoundingRect(); double maxw = br.width() / cropDuration().frames(m_fps); double maxh = br.height() / 100.0 * m_keyframeFactor; if (m_keyframes.count() > 0) { QMap<int, int>::const_iterator i = m_keyframes.constBegin(); double x1; double y1; while (i != m_keyframes.constEnd()) { x1 = br.x() + maxw * (i.key() - cropStart().frames(m_fps)); y1 = br.bottom() - (i.value() - m_keyframeOffset) * maxh; if (qAbs(pos.x() - x1) < maxOffset && qAbs(pos.y() - y1) < 10) { setToolTip('[' + QString::number((GenTime(i.key(), m_fps) - cropStart()).seconds(), 'f', 2) + i18n("seconds") + ", " + QString::number(i.value(), 'f', 1) + ']'); return i.key(); } else if (x1 > pos.x()) { break; } ++i; } } setToolTip(QString()); return -1; }
void AbstractClipItem::resizeStart(int posx, bool hasSizeLimit, bool /*emitChange*/) { GenTime durationDiff = GenTime(posx, m_fps) - m_info.startPos; if (durationDiff == GenTime()) return; if (type() == AVWIDGET && hasSizeLimit && (cropStart() + durationDiff < GenTime())) { durationDiff = GenTime() - cropStart(); } else if (durationDiff >= cropDuration()) { return; /*if (cropDuration() > GenTime(3, m_fps)) durationDiff = GenTime(3, m_fps); else return;*/ } m_info.startPos += durationDiff; // set to true if crop from start is negative (possible for color clips, images as they have no size limit) bool negCropStart = false; if (type() == AVWIDGET) { m_info.cropStart += durationDiff; if (m_info.cropStart < GenTime()) negCropStart = true; } m_info.cropDuration -= durationDiff; setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height()); moveBy(durationDiff.frames(m_fps), 0); if (m_info.startPos != GenTime(posx, m_fps)) { //kDebug() << "////// WARNING, DIFF IN XPOS: " << pos().x() << " == " << m_info.startPos.frames(m_fps); GenTime diff = m_info.startPos - GenTime(posx, m_fps); if (type() == AVWIDGET) m_info.cropStart += diff; m_info.cropDuration -= diff; setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height()); //kDebug()<<"// NEW START: "<<m_startPos.frames(25)<<", NW DUR: "<<m_cropDuration.frames(25); } // set crop from start to 0 (isn't relevant as this only happens for color clips, images) if (negCropStart) m_info.cropStart = GenTime(); //kDebug() << "-- NEW CLIP=" << startPos().frames(25) << "-" << endPos().frames(25); //setRect((double) m_startPos.frames(m_fps) * scale, rect().y(), (double) m_cropDuration.frames(m_fps) * scale, rect().height()); /* if (durationDiff < GenTime()) { QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect); for (int i = 0; i < collisionList.size(); ++i) { QGraphicsItem *item = collisionList.at(i); if (item->type() == type() && item->pos().x() < pos().x()) { kDebug() << "///////// COLLISION DETECTED!!!!!!!!!"; GenTime diff = ((AbstractClipItem *)item)->endPos() + GenTime(1, m_fps) - m_startPos; setRect(0, 0, (m_cropDuration - diff).frames(m_fps) - 0.02, rect().height()); setPos((m_startPos + diff).frames(m_fps), pos().y()); m_startPos += diff; if (type() == AVWIDGET) m_cropStart += diff; m_cropDuration = m_cropDuration - diff; break; } } }*/ }
void AbstractClipItem::updateItem() { m_info.track = (int)(scenePos().y() / KdenliveSettings::trackheight()); m_info.startPos = GenTime((int) scenePos().x(), m_fps); }
void AbstractClipItem::updateItem(int track) { m_info.track = track; m_info.startPos = GenTime((int) scenePos().x(), m_fps); }
//virtual QVariant Transition::itemChange(GraphicsItemChange change, const QVariant &value) { if (change == QGraphicsItem::ItemSelectedChange) { if (value.toBool()) setZValue(5); else setZValue(4); } CustomTrackScene *scene = NULL; if (change == ItemPositionChange) { scene = projectScene(); } if (scene) { // calculate new position. if (scene->isZooming) { // For some reason, mouse wheel on selected itm sometimes triggered // a position change event corrupting timeline, so discard it return pos(); } QPointF newPos = value.toPointF(); int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints()); xpos = qMax(xpos, 0); newPos.setX(xpos); int newTrack = trackForPos(newPos.y()); QStringList lockedTracks = property("locked_tracks").toStringList(); if (lockedTracks.contains(QString::number(newTrack))) { // Trying to move to a locked track return pos(); } int maximumTrack = projectScene()->tracksCount(); newTrack = qMin(newTrack, maximumTrack); newTrack = qMax(newTrack, 0); newPos.setY(posForTrack(newTrack) + itemOffset()); // Only one clip is moving QRectF sceneShape = rect(); sceneShape.translate(newPos); QList<QGraphicsItem*> items; // TODO: manage transitions in OVERWRITE MODE //if (projectScene()->editMode() == NORMALEDIT) items = scene->items(sceneShape, Qt::IntersectsItemShape); items.removeAll(this); bool forwardMove = newPos.x() > pos().x(); if (!items.isEmpty()) { for (int i = 0; i < items.count(); ++i) { if (!items.at(i)->isEnabled()) continue; if (items.at(i)->type() == type()) { int offset = 0; // Collision! QPointF otherPos = items.at(i)->pos(); if ((int) otherPos.y() != (int) pos().y()) { return pos(); } if (forwardMove) { offset = qMax(offset, (int)(newPos.x() - (static_cast < AbstractClipItem* >(items.at(i))->startPos() - cropDuration()).frames(m_fps))); } else { offset = qMax(offset, (int)((static_cast < AbstractClipItem* >(items.at(i))->endPos().frames(m_fps)) - newPos.x())); } if (offset > 0) { if (forwardMove) { sceneShape.translate(QPointF(-offset, 0)); newPos.setX(newPos.x() - offset); } else { sceneShape.translate(QPointF(offset, 0)); newPos.setX(newPos.x() + offset); } QList<QGraphicsItem*> subitems = scene->items(sceneShape, Qt::IntersectsItemShape); subitems.removeAll(this); for (int j = 0; j < subitems.count(); ++j) { if (!subitems.at(j)->isEnabled()) continue; if (subitems.at(j)->type() == type()) { // move was not successful, revert to previous pos m_info.startPos = GenTime((int) pos().x(), m_fps); return pos(); } } } m_info.track = newTrack; m_info.startPos = GenTime((int) newPos.x(), m_fps); return newPos; } } } m_info.track = newTrack; m_info.startPos = GenTime((int) newPos.x(), m_fps); ////qDebug()<<"// ITEM NEW POS: "<<newPos.x()<<", mapped: "<<mapToScene(newPos.x(), 0).x(); return newPos; } return QGraphicsItem::itemChange(change, value); }
CommentedTime::CommentedTime(): t(GenTime(0)), type(0) {}
// virtual void InsertSpaceCommand::undo() { m_view->insertSpace(m_clipsToMove, m_transToMove, m_track, GenTime() - m_duration, m_duration); }
// virtual void InsertSpaceCommand::undo() { // kDebug()<<"---- undoing action"; m_view->insertSpace(m_clipsToMove, m_transToMove, m_track, GenTime() - m_duration, m_duration); }