32
32
void WbScene::regenerateTransformations() {
33
33
foreach(QPointer<WbItem> item, pendingTranformations_) {
35
// qDebug() << QString("Regenerating %1 transform.").arg((unsigned int) &(*item)).toAscii();
35
// qDebug() << QString("Regenerating %1 transform.").arg((unsigned int) &(*item)).toAscii();
36
36
item->regenerateTransform();
39
39
pendingTranformations_.clear();
43
43
QPointF WbScene::selectionCenter() const {
44
QList<QGraphicsItem*> items = selectedItems();
49
QRectF box = items.at(0)->sceneBoundingRect();
50
foreach(QGraphicsItem* item, items) {
51
box = box.united(item->sceneBoundingRect());
54
// qDebug() << QString("Selection center: %1 %2").arg(box.center().x()).arg(box.center().y()).toAscii();
44
QList<QGraphicsItem*> items = selectedItems();
46
if(items.size() < 1) {
50
QRectF box = items.at(0)->sceneBoundingRect();
51
foreach(QGraphicsItem* item, items) {
52
box = box.united(item->sceneBoundingRect());
55
// qDebug() << QString("Selection center: %1 %2").arg(box.center().x()).arg(box.center().y()).toAscii();
59
60
void WbScene::bringForward(int n) {
63
64
void WbScene::bringToFront() {
67
68
void WbScene::sendBackwards(int n) {
71
72
void WbScene::sendToBack() {
75
76
static bool zValueLessThan(QGraphicsItem* item1, QGraphicsItem* item2) {
76
return (item1->zValue() < item2->zValue());
77
return (item1->zValue() < item2->zValue());
79
80
void WbScene::group() {
80
if(selectedItems().size() > 1) {
82
QDomElement temp = QDomDocument().createElement("g");
83
temp.setAttribute("id", "e" + SxeSession::generateUUID());
84
const QDomNode group = session_->insertNodeAfter(temp, session_->document().documentElement());
86
// Arrange the items by Z coordinate
87
QList<QGraphicsItem*> selected = selectedItems();
88
qSort(selected.begin(), selected.end(), zValueLessThan);
90
// Reparent each selected item
91
foreach(QGraphicsItem* item, selected) {
92
WbItem* wbitem = dynamic_cast<WbItem*>(item);
94
session_->insertNodeAfter(wbitem->node(), group);
81
if(selectedItems().size() > 1) {
83
QDomElement temp = QDomDocument().createElement("g");
84
temp.setAttribute("id", "e" + SxeSession::generateUUID());
85
const QDomNode group = session_->insertNodeAfter(temp, session_->document().documentElement());
87
// Arrange the items by Z coordinate
88
QList<QGraphicsItem*> selected = selectedItems();
89
qSort(selected.begin(), selected.end(), zValueLessThan);
91
// Reparent each selected item
92
foreach(QGraphicsItem* item, selected) {
93
WbItem* wbitem = dynamic_cast<WbItem*>(item);
95
session_->insertNodeAfter(wbitem->node(), group);
102
103
void WbScene::ungroup() {
103
foreach(QGraphicsItem* item, selectedItems()) {
104
// find the QDomElement matching the selected item
105
WbItem* wbitem = dynamic_cast<WbItem*>(item);
107
QDomElement group = wbitem->node().toElement();
109
if(group.nodeName() == "g") {
110
QDomNodeList children = group.childNodes();
112
QMatrix groupTransform = WbItem::parseSvgTransform(group.attribute("transform"));
114
for(int i = children.size() - 1; i >= 0; i--) {
115
QDomElement child = children.at(i).toElement();
116
if(!child.isNull()) {
118
if(!groupTransform.isIdentity()) {
119
// combine the transformations of the group and the child
120
QMatrix childTransform = WbItem::parseSvgTransform(child.attribute("transform"));
121
session_->setAttribute(child, "transform", WbItem::toSvgTransform(childTransform * groupTransform));
124
// move the child from the group to the root <svg/>
125
session_->insertNodeAfter(children.at(i), session_->document().documentElement(), group);
130
// delete the group itself
131
session_->removeNode(group);
104
foreach(QGraphicsItem* item, selectedItems()) {
105
// find the QDomElement matching the selected item
106
WbItem* wbitem = dynamic_cast<WbItem*>(item);
108
QDomElement group = wbitem->node().toElement();
110
if(group.nodeName() == "g") {
111
QDomNodeList children = group.childNodes();
113
QMatrix groupTransform = WbItem::parseSvgTransform(group.attribute("transform"));
115
for(int i = children.size() - 1; i >= 0; i--) {
116
QDomElement child = children.at(i).toElement();
117
if(!child.isNull()) {
119
if(!groupTransform.isIdentity()) {
120
// combine the transformations of the group and the child
121
QMatrix childTransform = WbItem::parseSvgTransform(child.attribute("transform"));
122
session_->setAttribute(child, "transform", WbItem::toSvgTransform(childTransform * groupTransform));
125
// move the child from the group to the root <svg/>
126
session_->insertNodeAfter(children.at(i), session_->document().documentElement(), group);
131
// delete the group itself
132
session_->removeNode(group);
141
142
void WbScene::bring(int n, bool toExtremum) {
145
// bring each selected item
146
foreach(QGraphicsItem* selecteditem, selectedItems()) {
148
if (!(selecteditem->parentItem() && selecteditem->parentItem()->isSelected())) {
150
WbItem* selectedwbitem = dynamic_cast<WbItem*>(selecteditem);
154
QList<QGraphicsItem*> colliding = selecteditem->collidingItems();
156
// find the relative position of selecteditem itself and
157
// remove other selected items from the list colliding
159
while(i < colliding.size()) {
160
if(selectedItems().contains(colliding[i])) {
161
colliding.removeAt(i);
162
} else if(colliding[i]->zValue() < selecteditem->zValue()) {
170
// bring the selected node n levels above/below the item itself
171
if(colliding.size() > 0) {
172
WbItem* referencewbitem;
174
if(i - n > 0 && !toExtremum)
175
referencewbitem = dynamic_cast<WbItem*>(colliding[i - n]);
177
referencewbitem = dynamic_cast<WbItem*>(colliding[0]);
179
if(i - n < colliding.size() && !toExtremum)
180
referencewbitem = dynamic_cast<WbItem*>(colliding[i - n]);
182
referencewbitem = dynamic_cast<WbItem*>(colliding[colliding.size() - 1]);
185
if(referencewbitem && !referencewbitem->node().isNull()) {
187
session_->insertNodeAfter(selectedwbitem->node(), selectedwbitem->node().parentNode(), referencewbitem->node());
189
session_->insertNodeBefore(selectedwbitem->node(), selectedwbitem->node().parentNode(), referencewbitem->node());
146
// bring each selected item
147
foreach(QGraphicsItem* selecteditem, selectedItems()) {
149
if (!(selecteditem->parentItem() && selecteditem->parentItem()->isSelected())) {
151
WbItem* selectedwbitem = dynamic_cast<WbItem*>(selecteditem);
155
QList<QGraphicsItem*> colliding = selecteditem->collidingItems();
157
// find the relative position of selecteditem itself and
158
// remove other selected items from the list colliding
160
while(i < colliding.size()) {
161
if(selectedItems().contains(colliding[i])) {
162
colliding.removeAt(i);
163
} else if(colliding[i]->zValue() < selecteditem->zValue()) {
171
// bring the selected node n levels above/below the item itself
172
if(colliding.size() > 0) {
173
WbItem* referencewbitem;
175
if(i - n > 0 && !toExtremum)
176
referencewbitem = dynamic_cast<WbItem*>(colliding[i - n]);
178
referencewbitem = dynamic_cast<WbItem*>(colliding[0]);
180
if(i - n < colliding.size() && !toExtremum)
181
referencewbitem = dynamic_cast<WbItem*>(colliding[i - n]);
183
referencewbitem = dynamic_cast<WbItem*>(colliding[colliding.size() - 1]);
186
if(referencewbitem && !referencewbitem->node().isNull()) {
188
session_->insertNodeAfter(selectedwbitem->node(), selectedwbitem->node().parentNode(), referencewbitem->node());
190
session_->insertNodeBefore(selectedwbitem->node(), selectedwbitem->node().parentNode(), referencewbitem->node());