/
diagramscene.cpp
115 lines (102 loc) · 3.4 KB
/
diagramscene.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
#include <QtGui>
#include "diagramscene.h"
#include "link.h"
DiagramScene::DiagramScene(QMenu *itemMenu, QObject *parent)
: QGraphicsScene(parent)
{
myItemMenu = itemMenu;
myMode = MoveItem;
myItemType = DiagramItem::PC_item;
line = 0;
}
void DiagramScene::setMode(Mode mode)
{
myMode = mode;
}
void DiagramScene::setItemType(DiagramItem::DiagramType type)
{
myItemType = type;
}
void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if (mouseEvent->button() != Qt::LeftButton)
return;
DiagramItem *item;
switch (myMode) {
case InsertItem:
item = new DiagramItem(myItemType, myItemMenu);
addItem(item);
connect(item, SIGNAL(itemSelected(DiagramItem*)), this, SIGNAL(itemSelected(DiagramItem*)));
connect(item, SIGNAL(PropertiesRequest(DiagramItem*)), this, SIGNAL(propertiesRequest(DiagramItem*)));
item->setPos(mouseEvent->scenePos());
emit itemInserted(item);
break;
case InsertLine:
line = new QGraphicsLineItem(QLineF(mouseEvent->scenePos(),
mouseEvent->scenePos()));
addItem(line);
break;
default:
;
}
QGraphicsScene::mousePressEvent(mouseEvent);
}
void DiagramScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if (myMode == InsertLine && line != 0) {
QLineF newLine(line->line().p1(), mouseEvent->scenePos());
line->setLine(newLine);
} else if (myMode == MoveItem) {
QGraphicsScene::mouseMoveEvent(mouseEvent);
} else if (myMode == InsertItem)
return;
}
void DiagramScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if (line != 0 && myMode == InsertLine)
{
QList<QGraphicsItem *> firstItems = items(line->line().p1());
if (firstItems.count() && firstItems.first() == line)
firstItems.removeFirst();
QList<QGraphicsItem *> secondItems = items(line->line().p2());
if (secondItems.count() && secondItems.first() == line)
secondItems.removeFirst();
removeItem(line);
delete line;
if (firstItems.count() > 0 && secondItems.count() > 0 &&
firstItems.first()->type() == DiagramItem::Type &&
secondItems.first()->type() == DiagramItem::Type &&
firstItems.first() != secondItems.first()) {
DiagramItem *firstItem = qgraphicsitem_cast<DiagramItem *>(firstItems.first());
DiagramItem *secondItem = qgraphicsitem_cast<DiagramItem *>(secondItems.first());
if (firstItem->CheckEmployment())
{
line = 0;
return;
}
if (secondItem->CheckEmployment())
{
line = 0;
return;
}
Link *link = new Link(firstItem, secondItem);
firstItem->addLink(link);
secondItem->addLink(link);
link->setZValue(-1000.0);
addItem(link);
link->updatePosition();
emit linkInserted(firstItem, secondItem, link);
}
myMode = MoveItem;
}
line = 0;
QGraphicsScene::mouseReleaseEvent(mouseEvent);
}
bool DiagramScene::isItemChange(int type)
{
foreach (QGraphicsItem *item, selectedItems()) {
if (item->type() == type)
return true;
}
return false;
}