Various fixes for group move, allow individual resize with Ctrl+click

parent cb7b5f35
......@@ -55,7 +55,7 @@ public:
bool isItemLocked() const;
void closeAnimation();
virtual OperationType operationMode(const QPointF &pos) = 0;
virtual OperationType operationMode(const QPointF &pos, Qt::KeyboardModifiers modifiers) = 0;
virtual void updateKeyframes(QDomElement effect) = 0;
virtual GenTime startPos() const ;
virtual GenTime endPos() const ;
......
......@@ -42,7 +42,6 @@ AbstractGroupItem::AbstractGroupItem(double /* fps */) :
setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
setAcceptDrops(true);
m_resizeInfos = QList <ItemInfo>();
}
int AbstractGroupItem::type() const
......@@ -177,7 +176,7 @@ void AbstractGroupItem::paint(QPainter *p, const QStyleOptionGraphicsItem *optio
pen.setStyle(Qt::DashLine);
pen.setWidthF(0.0);
p->setPen(pen);
p->drawRoundedRect(boundingRect().adjusted(0, 0, -1, 0), 3, 3);
p->drawRoundedRect(childrenBoundingRect().adjusted(0, 0, -1, 0), 3, 3);
}
int AbstractGroupItem::trackForPos(int position)
......@@ -492,70 +491,29 @@ void AbstractGroupItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event)
void AbstractGroupItem::resizeStart(int diff)
{
bool info = false;
if (m_resizeInfos.isEmpty())
info = true;
int maximum = diff;
QList <QGraphicsItem *> children = childItems();
QList <AbstractClipItem *> items;
int itemcount = 0;
for (int i = 0; i < children.count(); ++i) {
AbstractClipItem *item = static_cast <AbstractClipItem *>(children.at(i));
if (item && item->type() == AVWidget) {
items << item;
if (info)
m_resizeInfos << item->info();
item->resizeStart((int)(m_resizeInfos.at(itemcount).startPos.frames(item->fps())) + diff);
int itemdiff = (int)(item->startPos() - m_resizeInfos.at(itemcount).startPos).frames(item->fps());
if (qAbs(itemdiff) < qAbs(maximum))
maximum = itemdiff;
++itemcount;
item->resizeStart(diff);
}
}
for (int i = 0; i < items.count(); ++i)
items.at(i)->resizeStart((int)(m_resizeInfos.at(i).startPos.frames(items.at(i)->fps())) + maximum);
update();
}
void AbstractGroupItem::resizeEnd(int diff)
{
bool info = false;
if (m_resizeInfos.isEmpty())
info = true;
int maximum = diff;
QList <QGraphicsItem *> children = childItems();
QList <AbstractClipItem *> items;
int itemcount = 0;
for (int i = 0; i < children.count(); ++i) {
AbstractClipItem *item = static_cast <AbstractClipItem *>(children.at(i));
if (item && item->type() == AVWidget) {
items << item;
if (info)
m_resizeInfos << item->info();
item->resizeEnd((int)(m_resizeInfos.at(itemcount).endPos.frames(item->fps())) + diff);
int itemdiff = (int)(item->endPos() - m_resizeInfos.at(itemcount).endPos).frames(item->fps());
if (qAbs(itemdiff) < qAbs(maximum))
maximum = itemdiff;
++itemcount;
item->resizeEnd(diff);
}
}
for (int i = 0; i < items.count(); ++i)
items.at(i)->resizeEnd((int)(m_resizeInfos.at(i).endPos.frames(items.at(i)->fps())) + maximum);
}
QList< ItemInfo > AbstractGroupItem::resizeInfos()
{
return m_resizeInfos;
}
void AbstractGroupItem::clearResizeInfos()
{
// m_resizeInfos.clear() will crash in some cases for unknown reasons - ttill
m_resizeInfos = QList <ItemInfo>();
update();
}
GenTime AbstractGroupItem::duration()
GenTime AbstractGroupItem::duration() const
{
QList <QGraphicsItem *> children = childItems();
GenTime start = GenTime(-1.0);
......@@ -576,7 +534,7 @@ GenTime AbstractGroupItem::duration()
return end - start;
}
GenTime AbstractGroupItem::startPos()
GenTime AbstractGroupItem::startPos() const
{
QList <QGraphicsItem *> children = childItems();
GenTime start = GenTime(-1.0);
......
......@@ -53,15 +53,11 @@ public:
/** @brief Resizes all clips in this group from end.
* @param diff Difference to endPos stored in m_resizeInfos */
void resizeEnd(int diff);
/** @brief Gets m_resizeInfos */
QList <ItemInfo> resizeInfos();
/** @brief Clears m_resizeInfos */
void clearResizeInfos();
/** @brief Gets the duration (length) of the group. */
GenTime duration();
GenTime duration() const;
/** @brief Gets the start frame of the group. */
GenTime startPos();
GenTime startPos() const;
protected:
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);
......@@ -78,8 +74,6 @@ protected:
private:
QPainterPath groupShape(GraphicsRectItem type, const QPointF &offset) const;
QPainterPath spacerGroupShape(GraphicsRectItem type, const QPointF &offset) const;
/** Stores the original info of the items being resized. */
QList <ItemInfo> m_resizeInfos;
};
#endif
......@@ -910,7 +910,7 @@ ProjectClip *ClipItem::binClip() const
}
OperationType ClipItem::operationMode(const QPointF &pos)
OperationType ClipItem::operationMode(const QPointF &pos, Qt::KeyboardModifiers modifiers)
{
if (isItemLocked()) return None;
// Position is relative to item
......@@ -930,6 +930,8 @@ OperationType ClipItem::operationMode(const QPointF &pos)
return FadeIn;
} else if ((pos.x() <= rect.width() / 2) && pos.x() < maximumOffset && (rect.height() - pos.y() > addtransitionOffset)) {
// If we are in a group, allow resize only if all clips start at same position
if (modifiers & Qt::ControlModifier)
return ResizeStart;
if (parentItem()) {
QGraphicsItemGroup *dragGroup = static_cast <QGraphicsItemGroup *>(parentItem());
QList<QGraphicsItem *> list = dragGroup->childItems();
......@@ -944,6 +946,8 @@ OperationType ClipItem::operationMode(const QPointF &pos)
} else if (qAbs((int)(pos.x() - (rect.width() - m_endFade))) < maximumOffset && qAbs((int)(pos.y())) < 10) {
return FadeOut;
} else if ((pos.x() >= rect.width() / 2) && (rect.width() - pos.x() < maximumOffset) && (rect.height() - pos.y() > addtransitionOffset)) {
if (modifiers & Qt::ControlModifier)
return ResizeEnd;
// If we are in a group, allow resize only if all clips end at same position
if (parentItem()) {
QGraphicsItemGroup *dragGroup = static_cast <QGraphicsItemGroup *>(parentItem());
......
......@@ -55,7 +55,7 @@ public:
virtual int type() const;
void resizeStart(int posx, bool size = true, bool emitChange = true);
void resizeEnd(int posx, bool emitChange = true);
OperationType operationMode(const QPointF &pos);
OperationType operationMode(const QPointF &pos, Qt::KeyboardModifiers modifiers);
void updateKeyframes(QDomElement effect);
static int itemHeight();
ClipType clipType() const;
......
......@@ -591,7 +591,6 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
return;
}
if (m_moveOpMode != None && m_moveOpMode != WaitingForConfirm && event->buttons() != Qt::NoButton) {
qDebug()<<"* * *MOVING MOUSE: "<<m_moveOpMode;
if (m_dragItem && m_operationMode != ZoomTimeline) m_clipDrag = true;
if (m_dragItem && m_tool == SelectTool) {
if (m_moveOpMode == MoveOperation && m_clipDrag) {
......@@ -607,7 +606,6 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
m_scrollTimer.stop();
}
} else if (m_moveOpMode == RollingStart || m_moveOpMode == RollingEnd) {
qDebug()<<" + + +TRIM MOVE";
m_toolManagers.value(TrimType)->mouseMove(snappedPos);
} else if (m_moveOpMode == ResizeStart || m_moveOpMode == ResizeEnd) {
m_document->renderer()->switchPlay(false);
......@@ -1114,7 +1112,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
// If the item is very small, only allow move
m_operationMode = MoveOperation;
}
else m_operationMode = m_dragItem->operationMode(m_dragItem->mapFromScene(mapToScene(event->pos())));
else m_operationMode = m_dragItem->operationMode(m_dragItem->mapFromScene(mapToScene(event->pos())), event->modifiers());
if (m_operationMode == ResizeEnd) {
// FIXME: find a better way to avoid move in ClipItem::itemChange?
m_dragItem->setProperty("resizingEnd", true);
......@@ -1130,7 +1128,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
if (m_operationMode == ResizeEnd || m_operationMode == ResizeStart) {
updateSnapPoints(NULL);
// Start Ripple edit
if (event->modifiers() & Qt::ControlModifier) {
if (event->modifiers() & Qt::ControlModifier && event->modifiers() & Qt::ShiftModifier) {
// Rolling edit
m_toolManagers.value(TrimType)->mousePress(m_dragItemInfo);
} else {
......@@ -4259,8 +4257,6 @@ void CustomTrackView::completeSpaceOperation(int track, GenTime &timeOffset)
void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
{
if (event->button() != Qt::LeftButton) {
//event->ignore();
//m_moveOpMode = None;
QGraphicsView::mouseReleaseEvent(event);
return;
}
......@@ -4272,55 +4268,44 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
QGraphicsView::mouseReleaseEvent(event);
setDragMode(QGraphicsView::NoDrag);
if (m_moveOpMode == Seek) m_moveOpMode = None;
if (m_moveOpMode == ScrollTimeline || m_moveOpMode == ZoomTimeline) {
if (m_moveOpMode == Seek || m_moveOpMode == ScrollTimeline || m_moveOpMode == ZoomTimeline) {
m_moveOpMode = None;
//QGraphicsView::mouseReleaseEvent(event);
//setDragMode(QGraphicsView::NoDrag);
return;
}
m_clipDrag = false;
//setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate);
/*if (m_dragItem) {
m_dragItem->setGraphicsEffect(NULL);
}*/
if (m_scrollTimer.isActive()) m_scrollTimer.stop();
if (m_moveOpMode == MoveGuide) {
m_toolManagers.value(GuideType)->mouseMove();
qSort(m_guides.begin(), m_guides.end(), sortGuidesList);
return;
} else if (m_moveOpMode == Spacer) {
m_toolManagers.value(SpacerType)->mouseRelease();
} else if (m_moveOpMode == RubberSelection) {
//setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate);
if (event->modifiers() != Qt::ControlModifier) {
if (m_dragItem) m_dragItem->setMainSelectedClip(false);
m_dragItem = NULL;
}
//event->accept();
resetSelectionGroup();
groupSelectedItems();
if (m_selectionGroup == NULL && m_dragItem) {
// Only 1 item selected
if (m_dragItem->type() == AVWidget) {
m_dragItem->setMainSelectedClip(true);
emit clipItemSelected(static_cast<ClipItem *>(m_dragItem), false);
}
}
}
if (m_dragItem == NULL && m_selectionGroup == NULL) {
/*if (m_dragItem == NULL && m_selectionGroup == NULL) {
emit transitionItemSelected(NULL);
m_moveOpMode = None;
return;
}*/
switch ((int) m_moveOpMode) {
case MoveGuide:
m_toolManagers.value(GuideType)->mouseRelease();
break;
case Spacer:
m_toolManagers.value(SpacerType)->mouseRelease();
break;
case RubberSelection:
m_toolManagers.value(SelectType)->mouseRelease();
break;
case MoveOperation:
m_toolManagers.value(MoveType)->mouseRelease();
break;
case RollingStart:
case RollingEnd:
m_toolManagers.value(TrimType)->mouseRelease(m_selectionGroup ? m_selectionGroup->startPos() : GenTime());
break;
case ResizeStart:
case ResizeEnd:
m_toolManagers.value(ResizeType)->mouseRelease();
break;
}
if (m_moveOpMode == MoveOperation) {
m_toolManagers.value(MoveType)->mouseRelease();
} else if (m_moveOpMode == RollingStart || m_moveOpMode == RollingEnd) {
m_toolManagers.value(TrimType)->mouseRelease(m_selectionGroup ? m_selectionGroup->startPos() : GenTime());
} else if (m_moveOpMode == ResizeStart || m_moveOpMode == ResizeEnd) {
m_toolManagers.value(ResizeType)->mouseRelease();
} else if (m_moveOpMode == FadeIn && m_dragItem) {
if (m_moveOpMode == FadeIn && m_dragItem) {
ClipItem * item = static_cast <ClipItem *>(m_dragItem);
// find existing video fade, if none then audio fade
......@@ -4440,6 +4425,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
} else if (m_moveOpMode == WaitingForConfirm && m_operationMode == KeyFrame && m_dragItem) {
emit setActiveKeyframe(m_dragItem->selectedKeyFramePos());
}
m_moveOpMode = None;
}
......@@ -8527,3 +8513,8 @@ void CustomTrackView::reloadTrack(ItemInfo info)
{
m_timeline->reloadTrack(info);
}
void CustomTrackView::sortGuides()
{
qSort(m_guides.begin(), m_guides.end(), sortGuidesList);
}
......@@ -314,6 +314,8 @@ public:
* @param cutPos The absolute position of the cut */
void razorGroup(AbstractGroupItem *group, GenTime cutPos);
void reloadTrack(ItemInfo info);
GenTime groupSelectedItems(QList <QGraphicsItem *> selection = QList <QGraphicsItem *>(), bool createNewGroup = false, bool selectNewGroup = false);
void sortGuides();
public slots:
/** @brief Send seek request to MLT. */
......@@ -522,7 +524,6 @@ private:
bool canBeMoved(QList<AbstractClipItem *> items, GenTime offset, int trackOffset) const;
ClipItem *getClipUnderCursor() const;
AbstractClipItem *getMainActiveClip() const;
GenTime groupSelectedItems(QList <QGraphicsItem *> selection = QList <QGraphicsItem *>(), bool createNewGroup = false, bool selectNewGroup = false);
/** Get available space for clip move (min and max free positions) */
void getClipAvailableSpace(AbstractClipItem *item, GenTime &minimum, GenTime &maximum);
/** Get available space for transition move (min and max free positions) */
......
......@@ -31,6 +31,7 @@ GuideManager::GuideManager(CustomTrackView *view, DocUndoStack *commandStack) :
bool GuideManager::mousePress(ItemInfo info, Qt::KeyboardModifiers, QList<QGraphicsItem *> list)
{
Q_UNUSED(info);
m_collisionList = list;
// if a guide and a clip were pressed, just select the guide
for (int i = 0; i < m_collisionList.count(); ++i) {
......@@ -51,6 +52,10 @@ bool GuideManager::mousePress(ItemInfo info, Qt::KeyboardModifiers, QList<QGraph
void GuideManager::mouseMove(int pos)
{
Q_UNUSED(pos);
}
void GuideManager::mouseRelease(GenTime pos)
{
m_view->setCursor(Qt::ArrowCursor);
m_dragGuide->setFlag(QGraphicsItem::ItemIsMovable, false);
GenTime newPos = GenTime(m_dragGuide->pos().x(), m_view->fps());
......@@ -67,10 +72,7 @@ void GuideManager::mouseMove(int pos)
dragItem = NULL;
m_view->setOperationMode(None);
}
}
void GuideManager::mouseRelease(GenTime pos)
{
m_view->sortGuides();
m_collisionList.clear();
Q_UNUSED(pos);
}
......
......@@ -42,22 +42,33 @@ bool ResizeManager::mousePress(ItemInfo info, Qt::KeyboardModifiers modifiers, Q
m_view->resetSelectionGroup(false);
dragItem->setSelected(true);
}
m_startInfos.clear();
if (dragItem->type() == AVWidget && dragItem->parentItem()) {
// Store start infos
AbstractGroupItem *parent = static_cast <AbstractGroupItem *>(dragItem->parentItem());
if (parent) {
QList <QGraphicsItem *> items = parent->childItems();
for (int i = 0; i < items.count(); ++i) {
if (items.at(i)->type() == AVWidget) {
AbstractClipItem *item = static_cast<AbstractClipItem *>(items.at(i));
m_startInfos << item->info();
}
}
}
}
return true;
}
void ResizeManager::mouseMove(int pos)
{
AbstractClipItem *dragItem = m_view->dragItem();
AbstractGroupItem *selectionGroup = m_view->selectionGroup();
if (!(m_controlModifier & Qt::ControlModifier) && dragItem->type() == AVWidget && dragItem->parentItem() && dragItem->parentItem() != selectionGroup) {
if (!(m_controlModifier & Qt::ControlModifier) && dragItem->type() == AVWidget && dragItem->parentItem()) {
AbstractGroupItem *parent = static_cast <AbstractGroupItem *>(dragItem->parentItem());
if (parent) {
qDebug()<<"* * * GROUP RESIzE: "<<pos<< " - "<< m_dragItemInfo.startPos.frames(25);
if (m_view->operationMode() == ResizeStart)
parent->resizeStart((int)(pos - m_dragItemInfo.startPos.frames(m_view->fps())));
parent->resizeStart(pos);
else
parent->resizeEnd((int)(pos - m_dragItemInfo.endPos.frames(m_view->fps())));
parent->resizeEnd(pos);
}
} else {
if (m_view->operationMode() == ResizeStart)
......@@ -75,12 +86,11 @@ void ResizeManager::mouseRelease(GenTime pos)
{
Q_UNUSED(pos);
AbstractClipItem *dragItem = m_view->dragItem();
AbstractGroupItem *selectionGroup = m_view->selectionGroup();
if (dragItem) {
if (m_view->operationMode() == ResizeStart) {
if (dragItem->startPos() != m_dragItemInfo.startPos) {
// resize start
if (!(m_controlModifier & Qt::ControlModifier) && dragItem->type() == AVWidget && dragItem->parentItem() && dragItem->parentItem() != selectionGroup) {
if (/*!(m_controlModifier & Qt::ControlModifier) &&*/ dragItem->type() == AVWidget && dragItem->parentItem()) {
AbstractGroupItem *parent = static_cast <AbstractGroupItem *>(dragItem->parentItem());
if (parent) {
QUndoCommand *resizeCommand = new QUndoCommand();
......@@ -88,13 +98,11 @@ void ResizeManager::mouseRelease(GenTime pos)
QList <QGraphicsItem *> items = parent->childItems();
GenTime min = parent->startPos();
GenTime max = min;
QList <ItemInfo> infos = parent->resizeInfos();
parent->clearResizeInfos();
int itemcount = 0;
for (int i = 0; i < items.count(); ++i) {
AbstractClipItem *item = static_cast<AbstractClipItem *>(items.at(i));
if (item && item->type() == AVWidget) {
ItemInfo info = infos.at(itemcount);
ItemInfo info = m_startInfos.at(itemcount);
m_view->prepareResizeClipStart(item, info, item->startPos().frames(m_view->fps()), false, resizeCommand);
ClipItem *cp = qobject_cast<ClipItem *>(item);
if (cp && cp->hasVisibleVideo()) {
......@@ -111,6 +119,8 @@ void ResizeManager::mouseRelease(GenTime pos)
nfo.endPos = max;
m_view->monitorRefresh(nfo, true);
}
} else {
qDebug()<<" * * * * *PARENT GRP NOT FOUND";
}
} else {
m_view->prepareResizeClipStart(dragItem, m_dragItemInfo, dragItem->startPos().frames(m_view->fps()));
......@@ -145,7 +155,7 @@ void ResizeManager::mouseRelease(GenTime pos)
} else if (m_view->operationMode() == ResizeEnd) {
dragItem->setProperty("resizingEnd",QVariant());
if (dragItem->endPos() != m_dragItemInfo.endPos) {
if (!(m_controlModifier & Qt::ControlModifier) && dragItem->type() == AVWidget && dragItem->parentItem() && dragItem->parentItem() != selectionGroup) {
if (!(m_controlModifier & Qt::ControlModifier) && dragItem->type() == AVWidget && dragItem->parentItem()) {
AbstractGroupItem *parent = static_cast <AbstractGroupItem *>(dragItem->parentItem());
if (parent) {
QUndoCommand *resizeCommand = new QUndoCommand();
......@@ -153,13 +163,11 @@ void ResizeManager::mouseRelease(GenTime pos)
QList <QGraphicsItem *> items = parent->childItems();
GenTime min = parent->startPos() + parent->duration();
GenTime max = min;
QList <ItemInfo> infos = parent->resizeInfos();
parent->clearResizeInfos();
int itemcount = 0;
for (int i = 0; i < items.count(); ++i) {
AbstractClipItem *item = static_cast<AbstractClipItem *>(items.at(i));
if (item && item->type() == AVWidget) {
ItemInfo info = infos.at(itemcount);
ItemInfo info = m_startInfos.at(itemcount);
m_view->prepareResizeClipEnd(item, info, item->endPos().frames(m_view->fps()), false, resizeCommand);
ClipItem *cp = qobject_cast<ClipItem *>(item);
if (cp && cp->hasVisibleVideo()) {
......@@ -199,6 +207,7 @@ void ResizeManager::mouseRelease(GenTime pos)
}
}
}
m_startInfos.clear();
m_view->setCursor(Qt::OpenHandCursor);
m_view->setOperationMode(None);
}
......
......@@ -40,6 +40,7 @@ public:
private:
ItemInfo m_dragItemInfo;
QList <ItemInfo> m_startInfos;
Qt::KeyboardModifiers m_controlModifier;
};
......
......@@ -38,7 +38,8 @@ SelectManager::SelectManager(CustomTrackView *view, DocUndoStack *commandStack)
bool SelectManager::mousePress(ItemInfo info, Qt::KeyboardModifiers modifiers, QList<QGraphicsItem *>)
{
Q_UNUSED(info);
if (modifiers & Qt::ShiftModifier) {
m_modifiers = modifiers;
if (m_modifiers & Qt::ShiftModifier) {
m_view->createRectangleSelection(modifiers);
return true;
}
......@@ -54,6 +55,21 @@ void SelectManager::mouseMove(int pos)
void SelectManager::mouseRelease(GenTime pos)
{
Q_UNUSED(pos);
AbstractClipItem *dragItem = m_view->dragItem();
if (!(m_modifiers & Qt::ControlModifier)) {
if (dragItem) dragItem->setMainSelectedClip(false);
dragItem = NULL;
}
m_view->resetSelectionGroup();
m_view->groupSelectedItems();
AbstractGroupItem *selectionGroup = m_view->selectionGroup();
if (selectionGroup == NULL && dragItem) {
// Only 1 item selected
if (dragItem->type() == AVWidget) {
dragItem->setMainSelectedClip(true);
m_view->clipItemSelected(static_cast<ClipItem *>(dragItem), false);
}
}
}
void SelectManager::checkOperation(QGraphicsItem *item, CustomTrackView *view, QMouseEvent *event, AbstractGroupItem *group, OperationType &operationMode, OperationType moveOperation)
......@@ -71,7 +87,7 @@ void SelectManager::checkOperation(QGraphicsItem *item, CustomTrackView *view, Q
// If the item is very small, only allow move
operationMode = MoveOperation;
}
else operationMode = clip->operationMode(clip->mapFromScene(view->mapToScene(event->pos())));
else operationMode = clip->operationMode(clip->mapFromScene(view->mapToScene(event->pos())), event->modifiers());
}
if (operationMode == moveOperation) {
......
......@@ -47,6 +47,8 @@ public:
* @param abort Will be set to true if an operation matched and the items list should not be tested for further operation modes
**/
static void checkOperation(QGraphicsItem *item, CustomTrackView *view, QMouseEvent *event, AbstractGroupItem *group, OperationType &operationMode, OperationType moveOperation);
private:
Qt::KeyboardModifiers m_modifiers;
};
#endif
......@@ -316,7 +316,7 @@ QVariant Transition::itemChange(GraphicsItemChange change, const QVariant &value
}
OperationType Transition::operationMode(const QPointF &pos)
OperationType Transition::operationMode(const QPointF &pos, Qt::KeyboardModifiers)
{
if (isItemLocked()) return None;
......
......@@ -54,7 +54,7 @@ public:
int transitionEndTrack() const;
QString transitionTag() const;
QStringList transitionInfo() const;
OperationType operationMode(const QPointF &pos);
OperationType operationMode(const QPointF &pos, Qt::KeyboardModifiers modifiers);
void updateKeyframes(QDomElement effect);
static int itemHeight();
static int itemOffset();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment