aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/scxmleditor/plugin_interface/tagtextitem.cpp
blob: 791a704db1e42c34dfcf4fb4990ae06548db2877 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#include "tagtextitem.h"

#include <QGraphicsScene>
#include <QGraphicsSceneHoverEvent>
#include <QLabel>
#include <QPainter>
#include <QTextDocument>

using namespace ScxmlEditor::PluginInterface;

TagTextItem::TagTextItem(QGraphicsItem *parent)
    : QGraphicsObject(parent)
{
    setFlag(ItemIsMovable, true);
    setFlag(ItemIsFocusable, true);
    setFlag(ItemIsSelectable, true);
    m_textItem = new TextItem(this);
    connect(m_textItem, &TextItem::textChanged, this, [this] {
        m_textItem->setTextWidth(m_maxWidth);
        emit textChanged();
    });
    connect(m_textItem, &TextItem::textReady,
            this, [this](const QString &text) { emit textReady(text); });
    connect(m_textItem, &TextItem::selected, this, [this](bool sel) { emit selected(sel); });
    setAcceptHoverEvents(true);
}

QRectF TagTextItem::boundingRect() const
{
    return m_textItem->boundingRect().adjusted(-8, -8, 8, 8);
}

void TagTextItem::setText(const QString &text)
{
    m_textItem->setText(text);
}

void TagTextItem::setDefaultTextColor(const QColor &col)
{
    m_textItem->setDefaultTextColor(col);
}

bool TagTextItem::needIgnore(const QPointF sPos)
{
    // If we found QuickTransition-item or CornerGrabber at this point, we must ignore mouse press here
    // So we can press QuickTransition/CornerGrabber item although there is transition lines front of these items
    const QList<QGraphicsItem *> items = scene()->items(sPos);
    for (QGraphicsItem *item : items) {
        if (item->type() == QuickTransitionType || (item->type() == CornerGrabberType && item->parentItem() != this))
            return true;
    }

    return false;
}

void TagTextItem::hoverEnterEvent(QGraphicsSceneHoverEvent *e)
{
    if (needIgnore(e->scenePos())) {
        e->ignore();
        return;
    }

    setCursor(Qt::SizeAllCursor);
    QGraphicsObject::hoverEnterEvent(e);
}

void TagTextItem::hoverMoveEvent(QGraphicsSceneHoverEvent *e)
{
    if (needIgnore(e->scenePos())) {
        setCursor(Qt::ArrowCursor);
        e->ignore();
        return;
    }

    setCursor(Qt::SizeAllCursor);
    QGraphicsObject::hoverEnterEvent(e);
}

void TagTextItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *e)
{
    setCursor(Qt::ArrowCursor);
    QGraphicsObject::hoverLeaveEvent(e);
}

void TagTextItem::mousePressEvent(QGraphicsSceneMouseEvent *e)
{
    if (needIgnore(e->scenePos())) {
        e->ignore();
        return;
    }

    m_startPos = pos();
    QGraphicsObject::mousePressEvent(e);
}

void TagTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e)
{
    m_movePoint += (pos() - m_startPos);
    emit movePointChanged();
    QGraphicsObject::mouseReleaseEvent(e);
}

void TagTextItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(painter)
    Q_UNUSED(option)
    Q_UNUSED(widget)
}

void TagTextItem::resetMovePoint(const QPointF &point)
{
    m_movePoint = point;
}

QPointF TagTextItem::movePoint() const
{
    return m_movePoint;
}

void TagTextItem::setTextMaxWidth(qreal width)
{
    m_maxWidth = width;
    QTextOption opt = m_textItem->document()->defaultTextOption();
    opt.setWrapMode(QTextOption::WordWrap);
    m_textItem->document()->setDefaultTextOption(opt);
    m_textItem->setTextWidth(m_maxWidth);
}