int CastStringOffsetProvider::offset() { if (!vis_ || !vis_->itemOrChildHasFocus()) return -1; QStringList components = this->components(); int result = 0; int focused = vis_->layout()->focusedElementIndex(); result += itemOffset(vis_->layout()->at<Visualization::Item>(focused), components[focused ? 0 : 1].length()); if (focused == 0) for (int i = 0; i< 3; ++i ) result += components[i].size(); else if (focused == 1) result += components[0].size(); return result; }
int StringOffsetProvider::listItemOffset(Visualization::VList* list, const QString& prefix, const QString& separator, const QString& postfix, Qt::Key key) { QStringList components = StringOffsetProvider::components(list->node()); int result = prefix.size(); if (list->scene()->mainCursor() && list->scene()->mainCursor()->owner() == list->layout()) { int index = list->layout()->correspondingSceneCursor<Visualization::LayoutCursor>()->index(); if (index < 0) result = 0; else { // Adjust for the range but only if the cursor is inside the list index += list->rangeBegin(); if (index > components.size()) { result += postfix.size(); --index; } for (int i = 0; i<index; ++i) { if (i>0) result += separator.size(); result += components[i].size(); } } } else { int focusedNodeIndex = list->focusedNodeIndex(); Q_ASSERT(focusedNodeIndex >= 0); for(int i = 0; i<focusedNodeIndex; ++i) result += components[i].size() + separator.size(); result += itemOffset(list->itemAt<Visualization::Item>(list->focusedItemIndex()), components[focusedNodeIndex].length(), key); } return result; }
int StringOffsetProvider::listItemOffset(Visualization::VList* list, const QString& prefix, const QString& separator, const QString& postfix, Qt::Key key) { QStringList components = StringOffsetProvider::components(list->node()); int result = prefix.size(); if (list->scene()->mainCursor() && list->scene()->mainCursor()->owner() == list->layout()) { int index = list->layout()->correspondingSceneCursor<Visualization::LayoutCursor>()->index(); if (index < 0) result = 0; else { if (index > components.size()) { result += postfix.size(); --index; } for (int i = 0; i<index; ++i) { if (i>0) result += separator.size(); result += components[i].size(); } } } else { int focused = list->focusedElementIndex(); Q_ASSERT(focused >= 0); for(int i = 0; i<focused; ++i) result += components[i].size() + separator.size(); result += itemOffset(list->at<Visualization::Item>(focused), components[focused].length(), key); } return result; }
int StaticStringOffsetProvider::offset(Qt::Key key) { if (!vis_ || !vis_->itemOrChildHasFocus()) return -1; return itemOffset(vis_->item(), string().size(), key); }
//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); }