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;
}
예제 #2
0
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;
}
예제 #3
0
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);
}
예제 #5
0
//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);
}