#include "abstractclipitem.h"
#include "customtrackscene.h"
+#include "kdenlivesettings.h"
AbstractClipItem::AbstractClipItem(const ItemInfo info, const QRectF& rect, double fps): QGraphicsRectItem(rect), m_track(0), m_fps(fps), m_editedKeyframe(-1), m_selectedKeyframe(0), m_keyframeFactor(1) {
setFlags(/*QGraphicsItem::ItemClipsToShape | */QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
m_cropStart = pos;
}
+void AbstractClipItem::updateItem() {
+ m_track = (int)(scenePos().y() / KdenliveSettings::trackheight());
+ m_startPos = GenTime((int) scenePos().x(), m_fps);
+}
+
void AbstractClipItem::updateRectGeometry() {
setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height());
}
ItemInfo info() const;
CustomTrackScene* projectScene();
void updateRectGeometry();
+ void updateItem();
virtual OPERATIONTYPE operationMode(QPointF pos) = 0;
virtual GenTime startPos() const ;
QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant &value) {
if (change == ItemPositionChange && scene()) {
// calculate new position.
+ const int trackHeight = KdenliveSettings::trackheight();
QPointF newPos = value.toPointF();
int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints());
xpos = qMax(xpos, 0);
QPointF start = pos();//sceneBoundingRect().topLeft();
int posx = start.x() + newPos.x(); //projectScene()->getSnapPointForPos(start.x() + sc.x(), KdenliveSettings::snaptopoints());
- int startTrack = (start.y() + KdenliveSettings::trackheight() / 2) / KdenliveSettings::trackheight();
- int newTrack = (newPos.y()) / KdenliveSettings::trackheight();
+ int startTrack = (start.y() + trackHeight / 2) / trackHeight;
+ int newTrack = (newPos.y()) / trackHeight;
//kDebug()<<"// GROUP NEW T:"<<newTrack<<",START T:"<<startTrack<<",MAX:"<<projectScene()->tracksCount() - 1;
- newTrack = qMin(newTrack, projectScene()->tracksCount() - (int)(boundingRect().height() + 5) / KdenliveSettings::trackheight());
+ newTrack = qMin(newTrack, projectScene()->tracksCount() - (int)(boundingRect().height() + 5) / trackHeight);
newTrack = qMax(newTrack, 0);
- newPos.setY((int)((newTrack) * KdenliveSettings::trackheight()));
+
+ // Check if top item is a clip or a transition
+ int offset = 0;
+ int topTrack = -1;
+ QList<QGraphicsItem *> children = childItems();
+ for (int i = 0; i < children.count(); i++) {
+ int currentTrack = (int)(children.at(i)->scenePos().y() / trackHeight);
+ if (children.at(i)->type() == AVWIDGET) {
+ kDebug() << "// CLIP ITEM TRK: " << currentTrack << "; POS: " << children.at(i)->scenePos().y();
+ if (topTrack == -1 || currentTrack <= topTrack) {
+ offset = 0;
+ topTrack = currentTrack;
+ }
+ } else if (children.at(i)->type() == TRANSITIONWIDGET) {
+ kDebug() << "// TRANS ITEM TRK: " << currentTrack << "; POS: " << children.at(i)->scenePos().y();
+ if (topTrack == -1 || currentTrack < topTrack) {
+ offset = (int)(trackHeight / 3 * 2 - 1);
+ topTrack = currentTrack;
+ }
+ }
+ }
+ kDebug() << "// OFFSET: " << offset << "\n------------------------------------\n------------";
+
+ newPos.setY((int)((newTrack) * trackHeight) + offset);
//kDebug() << "------------------------------------GRUOP MOVE";
QPolygonF sceneShape = groupShape(newPos - pos());
QList<QGraphicsItem*> collindingItems = scene()->items(sceneShape, Qt::IntersectsItemShape);
- QList<QGraphicsItem *> children = childItems();
for (int i = 0; i < children.count(); i++) {
collindingItems.removeAll(children.at(i));
}
if (m_selectedEffect >= 0) setSelectedEffect(m_selectedEffect);
}
-
//virtual
QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value) {
if (change == ItemPositionChange && scene()) {
int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints());
xpos = qMax(xpos, 0);
newPos.setX(xpos);
- int newTrack = (newPos.y() + KdenliveSettings::trackheight() / 2) / KdenliveSettings::trackheight();
+ int newTrack = newPos.y() / KdenliveSettings::trackheight();
newTrack = qMin(newTrack, projectScene()->tracksCount() - 1);
newTrack = qMax(newTrack, 0);
newPos.setY((int)(newTrack * KdenliveSettings::trackheight() + 1));
m_blockRefresh = false;
return;
}
+ if (m_document->renderer()->mltRemoveClip(m_scene->m_tracksList.count() - info.track, cutTime) == false) {
+ emit displayMessage(i18n("Error removing clip at %1 on track %2", cutTime.frames(m_document->fps()), info.track), ErrorMessage);
+ return;
+ }
kDebug() << "// UNCUTTING CLIPS: ITEM 1 (" << item->startPos().frames(25) << "x" << item->endPos().frames(25) << ")";
kDebug() << "// UNCUTTING CLIPS: ITEM 2 (" << dup->startPos().frames(25) << "x" << dup->endPos().frames(25) << ")";
m_document->updateClip(dup->baseClip()->getId());
scene()->removeItem(dup);
delete dup;
- m_document->renderer()->mltRemoveClip(m_scene->m_tracksList.count() - info.track, cutTime);
ItemInfo clipinfo = item->info();
clipinfo.track = m_scene->m_tracksList.count() - clipinfo.track;
AbstractClipItem *item = static_cast <AbstractClipItem *>(items.at(i));
ItemInfo info = item->info();
if (item->type() == AVWIDGET) {
- ClipItem *clip = static_cast <ClipItem*>(item);
- new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), false, true, moveClips);
- m_document->renderer()->mltRemoveClip(m_scene->m_tracksList.count() - info.track, info.startPos);
+ if (m_document->renderer()->mltRemoveClip(m_scene->m_tracksList.count() - info.track, info.startPos) == false) {
+ // error, clip cannot be removed from playlist
+ emit displayMessage(i18n("Error removing clip at %1 on track %2", info.startPos.frames(m_document->fps()), info.track), ErrorMessage);
+ } else {
+ // clip removed from playlist, create command
+ ClipItem *clip = static_cast <ClipItem*>(item);
+ new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), false, true, moveClips);
+ }
} else {
Transition *tr = static_cast <Transition*>(item);
new AddTransitionCommand(this, info, tr->transitionEndTrack(), tr->toXML(), true, false, moveClips);
for (int i = 0; i < items.count(); i++) {
// re-add items in correct place
AbstractClipItem *item = static_cast <AbstractClipItem *>(items.at(i));
+ item->updateItem();
ItemInfo info = item->info();
- info.startPos = info.startPos + timeOffset;
+ /*info.startPos = info.startPos + timeOffset;
info.endPos = info.endPos + timeOffset;
- info.track = info.track + trackOffset;
+ info.track = info.track + trackOffset;*/
if (item->type() == AVWIDGET) {
ClipItem *clip = static_cast <ClipItem*>(item);
new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), false, false, moveClips);
void CustomTrackView::deleteClip(ItemInfo info) {
ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()) + 1, info.track);
- if (!item) {
- kDebug() << "---------------- ERROR, CANNOT find clip to delete at...";// << rect.x();
+
+ if (!item || m_document->renderer()->mltRemoveClip(m_scene->m_tracksList.count() - info.track, info.startPos) == false) {
+ emit displayMessage(i18n("Error removing clip at %1 on track %2", info.startPos.frames(m_document->fps()), info.track), ErrorMessage);
return;
}
if (item->isSelected()) emit clipItemSelected(NULL);
scene()->removeItem(item);
if (m_dragItem == item) m_dragItem = NULL;
delete item;
- m_document->renderer()->mltRemoveClip(m_scene->m_tracksList.count() - info.track, info.startPos);
m_document->renderer()->doRefresh();
}