-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgroupelement.cpp
125 lines (92 loc) · 2.95 KB
/
groupelement.cpp
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
#include "groupelement.h"
#include "elementpicker.h"
#include "QContextMenuEvent"
#include "basespace.h"
#include <QMatrix4x4>
#include <QGraphicsTransform>
#include <QRectF>
#include <QDebug>
static QRectF childElementsBoundingRect(BaseGroupElement *groupElement)
{
//if element is an ancester of BaseGroupElement
QRectF rect;
foreach(BaseElement * element,groupElement->childElements()){
rect = rect.united(element->mapToScene(element->boundingRect()).boundingRect());
}
return groupElement->mapFromScene(rect).boundingRect();
}
BaseGroupElement::BaseGroupElement(BaseElement *parent, BaseSpace *space, QRectF initRect):
BaseElement(parent,space,initRect)
{
setHandlesChildEvents(true);
m_picker = createPicker();
}
BasePicker *BaseGroupElement::createPicker()
{
return new ElementPicker(this);
}
void BaseGroupElement::addToGroup(BaseElement *element)
{
if (!element) {
//cannot add null item
qWarning("addToGroup:cannot add null element to group");
return;
}
if (element == this) {
qWarning("addToGroup:cannot add a group to itself");
return;
}
foreach(BaseElement * item,m_childElements){
if (item==element){
qWarning("addToGroup:cannot add a item already existed");
return;
}
}
m_childElements.insert(0,element);
element->setParentElement(this);
//element->setParentItem(this);
this->setRect(childElementsBoundingRect(this));
return;
}
void BaseGroupElement::removeFromGroup(BaseElement *element)
{
if (!element) {
qWarning("removeFromGroup: cannot remove null element");
return;
}
m_childElements.removeOne(element);
element->setParentElement(nullptr);
this->setRect(childElementsBoundingRect(this));
}
bool BaseGroupElement::isObscuredBy(const QGraphicsItem *item) const
{
return BaseElement::isObscuredBy(item);
}
QPainterPath BaseGroupElement::opaqueArea() const
{
return BaseElement::opaqueArea();
}
void BaseGroupElement::clear()
{
foreach(BaseElement * element,m_childElements){
element->setParentElement(0);
}
m_childElements.clear();
// this->setTransform(QTransform());
// this->m_picker->setTransform(QTransform());
// this->setRect(this->childrenBoundingRect());
}
GroupPickerElement::GroupPickerElement(BaseSpace *space):
BaseGroupElement(nullptr,space,QRectF())
{
m_picker->show();
// disconnect(static_cast<BaseSpaceScene *>(space->scene()),&BaseSpaceScene::elementUnpicked,this,0);
connect(static_cast<BaseSpaceScene *>(space->scene()),&BaseSpaceScene::elementUnpicked,this,[this](){
this->hide();
});
}
GroupElement::GroupElement(BaseElement *parent, BaseSpace *space):
BaseGroupElement(parent,space,QRectF())
{
setElementName(space->nameElementAuto(this->type()));
}