1
2
3 // TnzCore includes
4 #include "tofflinegl.h"
5 #include "tstroke.h"
6 #include "tconvert.h"
7 #include "tvectorimage.h"
8 #include "tundo.h"
9 #include "tconst.h"
10
11 // TnzLib includes
12 #include "toonz/tstageobjectid.h"
13 #include "toonz/tstageobject.h"
14 #include "toonz/tstageobjectspline.h"
15 #include "toonz/txsheet.h"
16 #include "toonz/txshcell.h"
17 #include "toonz/txshcolumn.h"
18 #include "toonz/toonzscene.h"
19 #include "toonz/sceneproperties.h"
20 #include "toonz/tstageobjectcmd.h"
21 #include "toonz/fxcommand.h"
22 #include "toonz/txshzeraryfxcolumn.h"
23 #include "toonz/tcolumnfx.h"
24 #include "toonz/tstageobjecttree.h"
25 #include "toonz/tframehandle.h"
26 #include "toonz/txshchildlevel.h"
27 #include "toonz/txshlevelcolumn.h"
28 #include "toonz/txshleveltypes.h"
29 #include "toonz/tcolumnhandle.h"
30 #include "toonz/hook.h"
31 #include "toonz/preferences.h"
32 #include "toonz/txshsimplelevel.h"
33
34 // TnzQt includes
35 #include "toonzqt/gutil.h"
36 #include "toonzqt/icongenerator.h"
37 #include "toonzqt/stageschematicscene.h"
38 #include "toonzqt/menubarcommand.h"
39
40 // Qt includes
41 #include <QPixmap>
42 #include <QRegExpValidator>
43 #include <QGraphicsSceneMouseEvent>
44 #include <QFocusEvent>
45 #include <QTimer>
46 #include <QMenu>
47 #include <QTextCursor>
48 #include <QSet>
49
50 #include "toonzqt/stageschematicnode.h"
51
52 namespace {
drawCamera(QPainter * painter,const QColor & color,const QPen & pen,double width,double height)53 void drawCamera(QPainter *painter, const QColor &color, const QPen &pen,
54 double width, double height) {
55 QPointF points[3];
56 points[0] = QPointF(width, height);
57 points[1] = QPointF(width, height * 0.5);
58 points[2] = QPointF(width - (height * 2 / 3), height * 0.75);
59 painter->setBrush(color);
60 painter->drawPolygon(points, 3);
61 painter->drawRect(
62 QRectF(width * 0.25, height * 0.5, width * 0.5, height * 0.5));
63 QRectF rect(0, 0, height * 0.49, height * 0.49);
64 rect.moveCenter(QPointF(width * 0.20, height * 0.4));
65 painter->drawEllipse(rect);
66 rect.moveCenter(QPointF((width * 3 / 5) + 1, height * 0.25));
67 painter->drawEllipse(rect);
68 painter->drawLine(0, height * 0.75, width * 0.25, height * 0.75);
69 painter->drawLine(width, height * 0.75, width + 5, height * 0.75);
70 painter->setBrush(QColor(235, 235, 235, 255));
71 painter->drawRect(0, -14, width, 14);
72 }
73 } // namespace
74
75 //========================================================
76 //
77 // ColumnPainter
78 //
79 //========================================================
80
ColumnPainter(StageSchematicColumnNode * parent,double width,double height,const QString & name)81 ColumnPainter::ColumnPainter(StageSchematicColumnNode *parent, double width,
82 double height, const QString &name)
83 : QGraphicsItem(parent)
84 , m_parent(parent)
85 , m_width(width)
86 , m_height(height)
87 , m_name(name) {
88 setFlag(QGraphicsItem::ItemIsMovable, false);
89 setFlag(QGraphicsItem::ItemIsSelectable, false);
90 setFlag(QGraphicsItem::ItemIsFocusable, false);
91 assert(parent->getStageObject()->getId().isColumn());
92 connect(IconGenerator::instance(), SIGNAL(iconGenerated()), this,
93 SLOT(onIconGenerated()));
94
95 StageSchematicScene *stageScene =
96 dynamic_cast<StageSchematicScene *>(scene());
97 if (!stageScene) return;
98
99 TXsheet *xsh = stageScene->getXsheet();
100 int r0, r1, index = parent->getStageObject()->getId().getIndex();
101 xsh->getCellRange(index, r0, r1);
102 if (r0 > r1) return;
103 TXshCell firstCell = xsh->getCell(r0, index);
104 if (!firstCell.isEmpty())
105 m_type = firstCell.m_level->getType();
106 else
107 m_type = NO_XSHLEVEL;
108 }
109
110 //--------------------------------------------------------
111
~ColumnPainter()112 ColumnPainter::~ColumnPainter() {}
113
114 //--------------------------------------------------------
115
boundingRect() const116 QRectF ColumnPainter::boundingRect() const {
117 // iwasawa
118 if (m_parent->isOpened())
119 return QRectF(-5, -54, m_width + 10, m_height + 59);
120 else
121 return QRectF(-5, -5, m_width + 10, m_height + 10);
122 }
123
124 //--------------------------------------------------------
125
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)126 void ColumnPainter::paint(QPainter *painter,
127 const QStyleOptionGraphicsItem *option,
128 QWidget *widget) {
129 StageSchematicScene *stageScene =
130 dynamic_cast<StageSchematicScene *>(scene());
131 if (!stageScene) return;
132 // obtain level name and type
133 int levelType;
134 QString levelName;
135 m_parent->getLevelTypeAndName(levelType, levelName);
136
137 QColor nodeColor;
138 SchematicViewer *viewer = stageScene->getSchematicViewer();
139 viewer->getNodeColor(levelType, nodeColor);
140
141 if (m_isReference && levelType != PLT_XSHLEVEL) {
142 painter->setBrush(viewer->getReferenceColumnColor());
143 painter->setPen(nodeColor);
144 } else {
145 painter->setBrush(nodeColor);
146 painter->setPen(Qt::NoPen);
147 }
148
149 if (levelType == PLT_XSHLEVEL)
150 painter->drawRoundRect(0, 0, m_width, m_height, 32, 99);
151 else
152 painter->drawRect(0, 0, m_width, m_height);
153
154 // draw palette icon for palette node
155 if (levelType == PLT_XSHLEVEL) {
156 QPixmap palettePm = QPixmap(":Resources/schematic_palette.png");
157 QRect paletteRect(-3, -1, 20, 16);
158 painter->drawPixmap(paletteRect, palettePm);
159 }
160
161 if (m_parent->isOpened()) {
162 // Draw the pixmap
163 painter->setBrush(Qt::NoBrush);
164 painter->setPen(QColor(0, 0, 0, 255));
165 QPixmap pixmap = scalePixmapKeepingAspectRatio(
166 m_parent->getPixmap(), QSize(m_width, 49), Qt::transparent);
167 if (!pixmap.isNull()) {
168 painter->drawPixmap(QPointF(0, -pixmap.height()), pixmap);
169 } else {
170 painter->setBrush(QColor(255, 255, 255, 255));
171 painter->drawRect(0, -pixmap.height(), m_width, pixmap.height());
172 }
173 }
174 painter->setPen(viewer->getTextColor());
175 painter->setBrush(Qt::NoBrush);
176
177 //! draw the name only if it is not editing
178 if (!m_parent->isNameEditing()) {
179 StageSchematicScene *stageScene =
180 dynamic_cast<StageSchematicScene *>(scene());
181 if (!stageScene) return;
182
183 // if this is current object
184 if (stageScene->getCurrentObject() == m_parent->getStageObject()->getId())
185 painter->setPen(viewer->getSelectedNodeTextColor());
186 QRectF columnNameRect(18, 2, 54, 14);
187 QString elidedName =
188 elideText(m_name, painter->font(), columnNameRect.width());
189 painter->drawText(columnNameRect, Qt::AlignLeft | Qt::AlignVCenter,
190 elidedName);
191 }
192
193 // level names
194 QRectF levelNameRect(18, 16, 54, 14);
195 QString elidedName =
196 elideText(levelName, painter->font(), levelNameRect.width());
197 painter->drawText(levelNameRect, Qt::AlignLeft | Qt::AlignVCenter,
198 elidedName);
199 }
200
201 //--------------------------------------------------------
202
contextMenuEvent(QGraphicsSceneContextMenuEvent * cme)203 void ColumnPainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) {
204 StageSchematicScene *stageScene =
205 dynamic_cast<StageSchematicScene *>(scene());
206 QMenu menu(stageScene->views()[0]);
207
208 QAction *resetCenter = new QAction(tr("&Reset Center"), &menu);
209 connect(resetCenter, SIGNAL(triggered()), stageScene, SLOT(onResetCenter()));
210 QAction *collapse = CommandManager::instance()->getAction("MI_Collapse");
211 QAction *openSubxsh = CommandManager::instance()->getAction("MI_OpenChild");
212 QAction *explodeChild =
213 CommandManager::instance()->getAction("MI_ExplodeChild");
214 QAction *group = CommandManager::instance()->getAction("MI_Group");
215
216 QAction *clear = CommandManager::instance()->getAction("MI_Clear");
217 QAction *copy = CommandManager::instance()->getAction("MI_Copy");
218 QAction *cut = CommandManager::instance()->getAction("MI_Cut");
219 QAction *paste = CommandManager::instance()->getAction("MI_Paste");
220
221 menu.addAction(resetCenter);
222 menu.addSeparator();
223 menu.addAction(collapse);
224 TFrameHandle *frameHandle = stageScene->getFrameHandle();
225 if (frameHandle->getFrameType() == TFrameHandle::SceneFrame) {
226 int col = m_parent->getStageObject()->getId().getIndex();
227 int fr = frameHandle->getFrame();
228 TXsheet *xsh = stageScene->getXsheet();
229 TXshCell cell = xsh->getCell(fr, col);
230 if (dynamic_cast<TXshChildLevel *>(cell.m_level.getPointer())) {
231 menu.addAction(openSubxsh);
232 menu.addAction(explodeChild);
233 }
234 }
235 menu.addSeparator();
236
237 menu.addAction(clear);
238 menu.addAction(copy);
239 menu.addAction(cut);
240 menu.addAction(paste);
241 menu.addSeparator();
242
243 menu.addAction(group);
244 menu.exec(cme->screenPos());
245 }
246
247 //--------------------------------------------------------
248
onIconGenerated()249 void ColumnPainter::onIconGenerated() {
250 if (m_type != OVL_XSHLEVEL) return;
251 StageSchematicScene *stageScene =
252 dynamic_cast<StageSchematicScene *>(scene());
253 if (!stageScene) return;
254
255 TXsheet *xsh = stageScene->getXsheet();
256 int r0, r1, index = m_parent->getStageObject()->getId().getIndex();
257 xsh->getCellRange(index, r0, r1);
258 if (r0 > r1) return;
259 TXshCell firstCell = xsh->getCell(r0, index);
260 int type = firstCell.m_level->getType();
261 if (m_type != type) {
262 m_type = type;
263 update();
264 }
265 }
266
267 //========================================================
268 //
269 // GroupPainter
270 //
271 //========================================================
272
GroupPainter(StageSchematicGroupNode * parent,double width,double height,const QString & name)273 GroupPainter::GroupPainter(StageSchematicGroupNode *parent, double width,
274 double height, const QString &name)
275 : QGraphicsItem(parent)
276 , m_parent(parent)
277 , m_width(width)
278 , m_height(height)
279 , m_name(name) {
280 setFlag(QGraphicsItem::ItemIsMovable, false);
281 setFlag(QGraphicsItem::ItemIsSelectable, false);
282 setFlag(QGraphicsItem::ItemIsFocusable, false);
283 }
284
285 //--------------------------------------------------------
286
~GroupPainter()287 GroupPainter::~GroupPainter() {}
288
289 //--------------------------------------------------------
290
boundingRect() const291 QRectF GroupPainter::boundingRect() const {
292 return QRectF(-5, -5, m_width + 10, m_height + 10);
293 }
294
295 //--------------------------------------------------------
296
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)297 void GroupPainter::paint(QPainter *painter,
298 const QStyleOptionGraphicsItem *option,
299 QWidget *widget) {
300 StageSchematicScene *stageScene =
301 dynamic_cast<StageSchematicScene *>(scene());
302 if (!stageScene) return;
303
304 SchematicViewer *viewer = stageScene->getSchematicViewer();
305
306 painter->save();
307 QPen pen;
308 if (m_parent->isSelected()) {
309 painter->setBrush(QColor(0, 0, 0, 0));
310 pen.setColor(QColor(255, 255, 255, 255));
311 pen.setWidth(4.0);
312 pen.setJoinStyle(Qt::RoundJoin);
313 painter->setPen(pen);
314 painter->drawRect(-2, -2, m_width + 4, m_height + 4);
315 }
316 painter->restore();
317
318 {
319 painter->setBrush(viewer->getGroupColor());
320 painter->setPen(Qt::NoPen);
321 painter->drawRect(QRectF(0, 0, m_width, m_height));
322 }
323
324 //! draw the name only if it is not editing
325 if (!m_parent->isNameEditing()) {
326 QFont font("Verdana", 8);
327 painter->setFont(font);
328 if (stageScene->getCurrentObject() == m_parent->getStageObject()->getId())
329 painter->setPen(viewer->getSelectedNodeTextColor());
330 else
331 painter->setPen(viewer->getTextColor());
332
333 QRectF rect(18, 0, 54, 18);
334 QString elidedName = elideText(m_name, painter->font(), rect.width());
335 painter->drawText(rect, Qt::AlignLeft | Qt::AlignVCenter, elidedName);
336 }
337 }
338
339 //--------------------------------------------------------
340
contextMenuEvent(QGraphicsSceneContextMenuEvent * cme)341 void GroupPainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) {
342 StageSchematicScene *stageScene =
343 dynamic_cast<StageSchematicScene *>(scene());
344 QMenu menu(stageScene->views()[0]);
345
346 QAction *group = CommandManager::instance()->getAction("MI_Group");
347 QAction *ungroup = CommandManager::instance()->getAction("MI_Ungroup");
348
349 QAction *editGroup = new QAction(tr("&Open Group"), &menu);
350 connect(editGroup, SIGNAL(triggered()), stageScene, SLOT(onEditGroup()));
351
352 menu.addAction(group);
353 menu.addAction(ungroup);
354 menu.addAction(editGroup);
355 menu.exec(cme->screenPos());
356 }
357
358 //========================================================
359 //
360 // PegbarPainter
361 //
362 //========================================================
363
PegbarPainter(StageSchematicPegbarNode * parent,double width,double height,const QString & name)364 PegbarPainter::PegbarPainter(StageSchematicPegbarNode *parent, double width,
365 double height, const QString &name)
366 : QGraphicsItem(parent)
367 , m_width(width)
368 , m_height(height)
369 , m_parent(parent)
370 , m_name(name) {}
371
372 //--------------------------------------------------------
373
~PegbarPainter()374 PegbarPainter::~PegbarPainter() {}
375
376 //--------------------------------------------------------
377
boundingRect() const378 QRectF PegbarPainter::boundingRect() const {
379 return QRectF(-5, -5, m_width + 10, m_height + 10);
380 }
381
382 //--------------------------------------------------------
383
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)384 void PegbarPainter::paint(QPainter *painter,
385 const QStyleOptionGraphicsItem *option,
386 QWidget *widget) {
387 StageSchematicScene *stageScene =
388 dynamic_cast<StageSchematicScene *>(scene());
389
390 if (!stageScene) return;
391 SchematicViewer *viewer = stageScene->getSchematicViewer();
392
393 painter->setBrush(viewer->getPegColor());
394 painter->setPen(Qt::NoPen);
395 painter->drawRect(QRectF(0, 0, m_width, m_height));
396
397 if (!m_parent->isNameEditing()) {
398 if (stageScene->getCurrentObject() == m_parent->getStageObject()->getId())
399 painter->setPen(viewer->getSelectedNodeTextColor());
400 else
401 painter->setPen(viewer->getTextColor());
402 // Draw the name
403 QRectF rect(18, 0, 54, 18);
404 QString elidedName = elideText(m_name, painter->font(), rect.width());
405 painter->drawText(rect, Qt::AlignLeft | Qt::AlignVCenter, elidedName);
406 }
407 }
408
409 //--------------------------------------------------------
410
contextMenuEvent(QGraphicsSceneContextMenuEvent * cme)411 void PegbarPainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) {
412 StageSchematicScene *stageScene =
413 dynamic_cast<StageSchematicScene *>(scene());
414 QMenu menu(stageScene->views()[0]);
415
416 QAction *resetCenter = new QAction(tr("&Reset Center"), &menu);
417 connect(resetCenter, SIGNAL(triggered()), stageScene, SLOT(onResetCenter()));
418
419 QAction *group = CommandManager::instance()->getAction("MI_Group");
420
421 QAction *clear = CommandManager::instance()->getAction("MI_Clear");
422 QAction *copy = CommandManager::instance()->getAction("MI_Copy");
423 QAction *cut = CommandManager::instance()->getAction("MI_Cut");
424 QAction *paste = CommandManager::instance()->getAction("MI_Paste");
425
426 menu.addAction(resetCenter);
427 menu.addSeparator();
428 menu.addAction(clear);
429 menu.addAction(copy);
430 menu.addAction(cut);
431 menu.addAction(paste);
432 menu.addSeparator();
433 menu.addAction(group);
434 menu.exec(cme->screenPos());
435 }
436
437 //========================================================
438 //
439 // CameraPainter
440 //
441 //========================================================
442
CameraPainter(StageSchematicCameraNode * parent,double width,double height,const QString & name)443 CameraPainter::CameraPainter(StageSchematicCameraNode *parent, double width,
444 double height, const QString &name)
445 : QGraphicsItem(parent)
446 , m_width(width)
447 , m_height(height)
448 , m_parent(parent)
449 , m_name(name) {
450 StageSchematicScene *stageScene =
451 dynamic_cast<StageSchematicScene *>(scene());
452 TXsheet *xsh = stageScene->getXsheet();
453 m_isActive = xsh->getStageObjectTree()->getCurrentCameraId() ==
454 parent->getStageObject()->getId();
455 }
456
457 //--------------------------------------------------------
458
~CameraPainter()459 CameraPainter::~CameraPainter() {}
460
461 //--------------------------------------------------------
462
boundingRect() const463 QRectF CameraPainter::boundingRect() const {
464 return QRectF(-5, -5, m_width + 10, m_height + 10);
465 }
466
467 //--------------------------------------------------------
468
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)469 void CameraPainter::paint(QPainter *painter,
470 const QStyleOptionGraphicsItem *option,
471 QWidget *widget) {
472 StageSchematicScene *stageScene =
473 dynamic_cast<StageSchematicScene *>(scene());
474 if (!stageScene) return;
475
476 SchematicViewer *viewer = stageScene->getSchematicViewer();
477 QColor cameraColor = m_isActive ? viewer->getActiveCameraColor()
478 : viewer->getOtherCameraColor();
479
480 painter->setBrush(cameraColor);
481 painter->setPen(Qt::NoPen);
482 painter->drawRect(QRectF(0, 0, m_width, m_height));
483
484 if (!m_parent->isNameEditing()) {
485 if (stageScene->getCurrentObject() == m_parent->getStageObject()->getId())
486 painter->setPen(viewer->getSelectedNodeTextColor());
487 else
488 painter->setPen(viewer->getTextColor());
489 // Draw the name
490 QRectF rect(18, 0, 54, 18);
491 QString elidedName = elideText(m_name, painter->font(), rect.width());
492 painter->drawText(rect, Qt::AlignLeft | Qt::AlignVCenter, elidedName);
493 }
494 }
495
496 //--------------------------------------------------------
497
contextMenuEvent(QGraphicsSceneContextMenuEvent * cme)498 void CameraPainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) {
499 StageSchematicScene *stageScene =
500 dynamic_cast<StageSchematicScene *>(scene());
501 QMenu menu(stageScene->views()[0]);
502
503 QAction *cameraSettings =
504 CommandManager::instance()->getAction("MI_CameraStage");
505
506 QAction *resetCenter = new QAction(tr("&Reset Center"), &menu);
507 connect(resetCenter, SIGNAL(triggered()), stageScene, SLOT(onResetCenter()));
508
509 QAction *activate = new QAction(tr("&Activate"), &menu);
510 connect(activate, SIGNAL(triggered()), stageScene, SLOT(onCameraActivate()));
511
512 QAction *clear = CommandManager::instance()->getAction("MI_Clear");
513 QAction *copy = CommandManager::instance()->getAction("MI_Copy");
514 QAction *cut = CommandManager::instance()->getAction("MI_Cut");
515 QAction *paste = CommandManager::instance()->getAction("MI_Paste");
516
517 bool isDeactivated =
518 m_parent->getStageObject()->getId() !=
519 stageScene->getXsheet()->getStageObjectTree()->getCurrentCameraId();
520
521 if (isDeactivated)
522 menu.addAction(activate);
523 else
524 menu.addAction(cameraSettings);
525 menu.addAction(resetCenter);
526 menu.addSeparator();
527 if (isDeactivated) menu.addAction(clear);
528 menu.addAction(copy);
529 if (isDeactivated) menu.addAction(cut);
530 menu.addAction(paste);
531 menu.exec(cme->screenPos());
532 }
533
534 //========================================================
535 //
536 // TablePainter
537 //
538 //========================================================
539
TablePainter(StageSchematicTableNode * parent,double width,double height)540 TablePainter::TablePainter(StageSchematicTableNode *parent, double width,
541 double height)
542 : QGraphicsItem(parent)
543 , m_width(width)
544 , m_height(height)
545 , m_parent(parent) {}
546
547 //--------------------------------------------------------
548
~TablePainter()549 TablePainter::~TablePainter() {}
550
551 //--------------------------------------------------------
552
boundingRect() const553 QRectF TablePainter::boundingRect() const {
554 return QRectF(-5, -5, m_width + 10, m_height + 10);
555 }
556
557 //--------------------------------------------------------
558
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)559 void TablePainter::paint(QPainter *painter,
560 const QStyleOptionGraphicsItem *option,
561 QWidget *widget) {
562 QPixmap tablePm = QPixmap(":Resources/schematic_tablenode.png");
563
564 StageSchematicScene *stageScene =
565 dynamic_cast<StageSchematicScene *>(scene());
566 if (!stageScene) return;
567
568 SchematicViewer *viewer = stageScene->getSchematicViewer();
569
570 painter->setBrush(viewer->getTableColor());
571 painter->setPen(Qt::NoPen);
572 painter->drawRect(QRectF(0, 0, m_width, m_height));
573
574 QRect imgRect(3, -3, 24, 24);
575
576 painter->drawPixmap(imgRect, tablePm);
577
578 if (stageScene->getCurrentObject() == m_parent->getStageObject()->getId())
579 painter->setPen(viewer->getSelectedNodeTextColor());
580 else
581 painter->setPen(viewer->getTextColor());
582
583 // Draw the name
584 QRectF rect(30, 0, 42, 18);
585 painter->drawText(rect, Qt::AlignLeft | Qt::AlignVCenter,
586 QString(tr("Table")));
587 }
588
589 //--------------------------------------------------------
590
contextMenuEvent(QGraphicsSceneContextMenuEvent * cme)591 void TablePainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) {
592 StageSchematicScene *stageScene =
593 dynamic_cast<StageSchematicScene *>(scene());
594 QMenu menu(stageScene->views()[0]);
595
596 QAction *resetCenter = new QAction(tr("&Reset Center"), &menu);
597 connect(resetCenter, SIGNAL(triggered()), stageScene, SLOT(onResetCenter()));
598
599 menu.addAction(resetCenter);
600 menu.exec(cme->screenPos());
601 }
602
603 //========================================================
604 //
605 // SplinePainter
606 //
607 //========================================================
608
SplinePainter(StageSchematicSplineNode * parent,double width,double height,const QString & name)609 SplinePainter::SplinePainter(StageSchematicSplineNode *parent, double width,
610 double height, const QString &name)
611 : QGraphicsItem(parent)
612 , m_parent(parent)
613 , m_width(width)
614 , m_height(height)
615 , m_name(name) {}
616
617 //--------------------------------------------------------
618
~SplinePainter()619 SplinePainter::~SplinePainter() {}
620
621 //--------------------------------------------------------
622
boundingRect() const623 QRectF SplinePainter::boundingRect() const {
624 if (m_parent->isOpened())
625 return QRectF(-5, -5, m_width + 10, m_height + 59);
626 else
627 return QRectF(-5, -5, m_width + 10, m_height + 10);
628 }
629
630 //--------------------------------------------------------
631
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)632 void SplinePainter::paint(QPainter *painter,
633 const QStyleOptionGraphicsItem *option,
634 QWidget *widget) {
635 StageSchematicScene *stageScene =
636 dynamic_cast<StageSchematicScene *>(scene());
637 if (!stageScene) return;
638
639 SchematicViewer *viewer = stageScene->getSchematicViewer();
640
641 painter->setBrush(viewer->getSplineColor());
642 painter->setPen(Qt::NoPen);
643 painter->drawRoundRect(QRectF(0, 0, m_width, m_height), 20, 99);
644 if (m_parent->isOpened()) {
645 // Draw the pixmap
646 painter->setBrush(Qt::NoBrush);
647 painter->setPen(QColor(0, 0, 0, 255));
648 QPixmap pixmap = scalePixmapKeepingAspectRatio(
649 m_parent->getPixmap(), QSize(m_width, 49), Qt::transparent);
650 if (!pixmap.isNull()) {
651 painter->drawPixmap(QPointF(0, 18), pixmap);
652 } else {
653 painter->setBrush(QColor(255, 255, 255, 255));
654 painter->drawRect(0, 18, m_width, 49);
655 }
656 }
657
658 //! draw the name only if it is not editing
659 if (!m_parent->isNameEditing()) {
660 /* There is no current spline
661 TStageObjectId currObj = stageScene->getCurrentObject();
662 if(currObj.getCode() == m_parent->getSpline()->getId())
663 painter->setPen(viewer->getSelectedNodeTextColor());
664 else
665 */
666 painter->setPen(viewer->getTextColor());
667 QRectF rect(18, 0, 72, 18);
668 QString elidedName = elideText(m_name, painter->font(), rect.width());
669 painter->drawText(rect, Qt::AlignLeft | Qt::AlignVCenter, elidedName);
670 }
671 }
672
673 //--------------------------------------------------------
674
contextMenuEvent(QGraphicsSceneContextMenuEvent * cme)675 void SplinePainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) {
676 StageSchematicScene *stageScene =
677 dynamic_cast<StageSchematicScene *>(scene());
678 QMenu menu(stageScene->views()[0]);
679
680 QAction *removeSpline = new QAction(tr("&Delete"), &menu);
681 connect(removeSpline, SIGNAL(triggered()), stageScene,
682 SLOT(onRemoveSpline()));
683 QAction *saveSpline = new QAction(tr("&Save Motion Path..."), &menu);
684 connect(saveSpline, SIGNAL(triggered()), stageScene, SLOT(onSaveSpline()));
685 QAction *loadSpline = new QAction(tr("&Load Motion Path..."), &menu);
686 connect(loadSpline, SIGNAL(triggered()), stageScene, SLOT(onLoadSpline()));
687
688 QAction *copy = CommandManager::instance()->getAction("MI_Copy");
689 QAction *cut = CommandManager::instance()->getAction("MI_Cut");
690 QAction *paste = CommandManager::instance()->getAction("MI_Paste");
691
692 menu.addAction(saveSpline);
693 menu.addAction(loadSpline);
694 menu.addSeparator();
695 menu.addAction(removeSpline);
696 menu.addAction(copy);
697 menu.addAction(cut);
698 menu.addAction(paste);
699 menu.exec(cme->screenPos());
700 }
701
702 //========================================================
703 //
704 // StageSchematicNodePort
705 //
706 //========================================================
707
StageSchematicNodePort(StageSchematicNodeDock * parent,int type)708 StageSchematicNodePort::StageSchematicNodePort(StageSchematicNodeDock *parent,
709 int type)
710 : SchematicPort(parent, parent->getNode(), type), m_handle("") {
711 QRectF rect = boundingRect();
712 if (parent->isParentPort())
713 m_hook = QPointF(rect.left(), (rect.top() + rect.bottom()) * 0.5);
714 else
715 m_hook = QPointF(rect.right(), (rect.top() + rect.bottom()) * 0.5);
716 }
717
718 //--------------------------------------------------------
719
~StageSchematicNodePort()720 StageSchematicNodePort::~StageSchematicNodePort() {}
721
722 //--------------------------------------------------------
723
boundingRect() const724 QRectF StageSchematicNodePort::boundingRect() const {
725 return QRectF(0, 0, 18, 18);
726 }
727
728 //--------------------------------------------------------
729
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)730 void StageSchematicNodePort::paint(QPainter *painter,
731 const QStyleOptionGraphicsItem *option,
732 QWidget *widget) {
733 // StageSchematicNode *node = dynamic_cast<StageSchematicNode *>(getNode());
734 StageSchematicScene *scene =
735 dynamic_cast<StageSchematicScene *>(this->scene());
736 if (scene && scene->isShowLetterOnPortFlagEnabled()) {
737 painter->setBrush(QColor(255, 255, 255, 255));
738 painter->setPen(QColor(180, 180, 180, 255));
739 painter->drawRect(boundingRect());
740 if (m_type == 103 || m_type == 104 || m_type == 105) return;
741 painter->setPen(QColor(0, 0, 0, 255));
742 QFont font("Verdana", 8);
743 painter->setFont(font);
744 QTextOption textOption(Qt::AlignCenter);
745 QString text = m_handle;
746 if (text.size() > 1 && text.at(0) == 'H') text.remove("H");
747 painter->drawText(boundingRect(), text, textOption);
748 } else {
749 QRect imgRect(2, 2, 14, 14);
750 QRect sourceRect = scene->views()[0]->matrix().mapRect(imgRect);
751 QPixmap pixmap;
752
753 if (getType() == eStageParentPort || getType() == eStageParentGroupPort) {
754 if (isHighlighted())
755 pixmap = QIcon(":Resources/port_blue_highlight.svg")
756 .pixmap(sourceRect.size());
757 else
758 pixmap = QIcon(":Resources/port_blue.svg").pixmap(sourceRect.size());
759 } else {
760 if (isHighlighted())
761 pixmap = QIcon(":Resources/port_red_highlight.svg")
762 .pixmap(sourceRect.size());
763 else
764 pixmap = QIcon(":Resources/port_red.svg").pixmap(sourceRect.size());
765 }
766 sourceRect = QRect(0, 0, sourceRect.width() * getDevPixRatio(),
767 sourceRect.height() * getDevPixRatio());
768 painter->drawPixmap(imgRect, pixmap, sourceRect);
769 }
770 }
771
772 //--------------------------------------------------------
773
linkTo(SchematicPort * port,bool checkOnly)774 bool StageSchematicNodePort::linkTo(SchematicPort *port, bool checkOnly) {
775 StageSchematicScene *stageScene =
776 dynamic_cast<StageSchematicScene *>(scene());
777 if (!port) return false;
778
779 StageSchematicNode *srcNode = dynamic_cast<StageSchematicNode *>(getNode());
780 if (this == port && !srcNode->getStageObject()->isGrouped()) {
781 if (!checkOnly)
782 TStageObjectCmd::setParent(srcNode->getStageObject()->getId(),
783 TStageObjectId::NoneId, "",
784 stageScene->getXsheetHandle());
785 return true;
786 }
787 StageSchematicNode *dstNode =
788 dynamic_cast<StageSchematicNode *>(port->getNode());
789 if (!dstNode) return false;
790 if (srcNode == dstNode) return false;
791
792 TStageObject *pegbar = 0, *parentPegbar = 0;
793 SchematicPort *childPort, *parentPort;
794 if (getType() == eStageParentPort && port->getType() == eStageChildPort) {
795 pegbar = srcNode->getStageObject();
796 parentPegbar = dstNode->getStageObject();
797 childPort = this;
798 parentPort = port;
799 } else if (getType() == eStageChildPort &&
800 port->getType() == eStageParentPort) {
801 pegbar = dstNode->getStageObject();
802 parentPegbar = srcNode->getStageObject();
803 childPort = port;
804 parentPort = this;
805 } else
806 return false;
807 if (pegbar->getId().isTable()) return false;
808 if (pegbar->getId().isPegbar() && !parentPegbar->getId().isTable() &&
809 !parentPegbar->getId().isPegbar() && !parentPegbar->getId().isCamera())
810 return false;
811
812 if (parentPegbar == pegbar || parentPegbar->isAncestor(pegbar)) return false;
813 if (parentPegbar->isGrouped() || pegbar->isGrouped()) return false;
814 if (checkOnly) return true;
815
816 StageSchematicNodePort *dstPort =
817 dynamic_cast<StageSchematicNodePort *>(parentPort);
818 if (!dstPort) return false;
819 TStageObjectCmd::setParent(pegbar->getId(), parentPegbar->getId(),
820 dstPort->getHandle().toStdString(),
821 stageScene->getXsheetHandle());
822 return true;
823 }
824
825 //--------------------------------------------------------
826
searchPort(const QPointF & scenePos)827 SchematicPort *StageSchematicNodePort::searchPort(const QPointF &scenePos) {
828 QList<QGraphicsItem *> items = scene()->items(scenePos);
829 int i;
830 for (i = 0; i < items.size(); i++) {
831 StageSchematicNodePort *linkingTo =
832 dynamic_cast<StageSchematicNodePort *>(items[i]);
833 if (linkingTo) {
834 StageSchematicNode *node =
835 dynamic_cast<StageSchematicNode *>(linkingTo->getNode());
836 if (!node->getStageObject()->isGrouped()) return linkingTo;
837 }
838 }
839 return 0;
840 }
841
842 //--------------------------------------------------------
843
hideSnappedLinks(SchematicPort * linkingPort)844 void StageSchematicNodePort::hideSnappedLinks(SchematicPort *linkingPort) {
845 if (!linkingPort) return;
846 if (getType() == eStageChildPort &&
847 linkingPort->getType() == eStageParentPort &&
848 linkingPort->getLinkCount() == 1)
849 linkingPort->getLink(0)->hide();
850 if (getType() == eStageParentPort &&
851 linkingPort->getType() == eStageChildPort && getLinkCount() == 1)
852 getLink(0)->hide();
853 }
854
855 //--------------------------------------------------------
856
showSnappedLinks(SchematicPort * linkingPort)857 void StageSchematicNodePort::showSnappedLinks(SchematicPort *linkingPort) {
858 if (!linkingPort) return;
859 if (getType() == eStageChildPort &&
860 linkingPort->getType() == eStageParentPort &&
861 linkingPort->getLinkCount() == 1) {
862 linkingPort->getLink(0)->show();
863 linkingPort->highLight(true);
864 linkingPort->update();
865 }
866 if (getType() == eStageParentPort &&
867 linkingPort->getType() == eStageChildPort && getLinkCount() == 1) {
868 getLink(0)->show();
869 linkingPort->highLight(true);
870 linkingPort->update();
871 }
872 }
873
874 //========================================================
875 //
876 // StageSchematicSplinePort
877 //
878 //========================================================
879
StageSchematicSplinePort(StageSchematicSplineDock * parent,int type)880 StageSchematicSplinePort::StageSchematicSplinePort(
881 StageSchematicSplineDock *parent, int type)
882 : SchematicPort(parent, parent->getNode(), type), m_parent(parent) {
883 m_squarePixmap = QPixmap(":Resources/schematic_spline_aim_square.svg");
884 m_rhombPixmap = QPixmap(":Resources/schematic_spline_aim_rhomb.svg");
885 QRectF rect = boundingRect();
886 if (parent->isParentPort())
887 m_hook = QPointF((rect.left() + rect.right()) * 0.5, rect.bottom() - 5);
888 else
889 m_hook = QPointF((rect.left() + rect.right()) * 0.5, rect.top() + 5);
890 }
891
892 //--------------------------------------------------------
893
~StageSchematicSplinePort()894 StageSchematicSplinePort::~StageSchematicSplinePort() {}
895
896 //--------------------------------------------------------
897
boundingRect() const898 QRectF StageSchematicSplinePort::boundingRect() const {
899 return QRectF(0, 0, 16, 8);
900 }
901
902 //--------------------------------------------------------
903
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)904 void StageSchematicSplinePort::paint(QPainter *painter,
905 const QStyleOptionGraphicsItem *option,
906 QWidget *widget) {
907 QRect rect(0, 0, 16, 8);
908 QRect sourceRect = scene()->views()[0]->matrix().mapRect(rect);
909 QPixmap pixmap;
910
911 if (!m_parent->isParentPort()) {
912 if (getLinkCount() > 0) {
913 static QIcon splineChildIcon(":Resources/spline_child_port.svg");
914 pixmap = splineChildIcon.pixmap(sourceRect.size());
915 } else {
916 static QIcon splineChildDisconIcon(
917 ":Resources/spline_child_port_disconnect.svg");
918 pixmap = splineChildDisconIcon.pixmap(sourceRect.size());
919 }
920 } else {
921 static QIcon splineParentIcon(":Resources/spline_parent_port.svg");
922 pixmap = splineParentIcon.pixmap(sourceRect.size());
923 }
924 sourceRect = QRect(0, 0, sourceRect.width() * getDevPixRatio(),
925 sourceRect.height() * getDevPixRatio());
926 painter->drawPixmap(rect, pixmap, sourceRect);
927 }
928
929 //--------------------------------------------------------
930
linkTo(SchematicPort * port,bool checkOnly)931 bool StageSchematicSplinePort::linkTo(SchematicPort *port, bool checkOnly) {
932 assert(port != 0);
933 StageSchematicScene *stageScene =
934 dynamic_cast<StageSchematicScene *>(scene());
935 StageSchematicNode *node = dynamic_cast<StageSchematicNode *>(getNode());
936 StageSchematicSplineNode *splineNode =
937 dynamic_cast<StageSchematicSplineNode *>(getNode());
938 if (node) {
939 StageSchematicSplineNode *targetSplineNode =
940 dynamic_cast<StageSchematicSplineNode *>(port->getNode());
941 if (!targetSplineNode && port != this) return false;
942 if (!checkOnly && targetSplineNode) {
943 TStageObjectSpline *spline = targetSplineNode->getSpline();
944 TStageObjectCmd::setSplineParent(spline, node->getStageObject(),
945 stageScene->getXsheetHandle());
946 } else if (!checkOnly && port == this)
947 node->getStageObject()->setSpline(0);
948 return true;
949 } else if (splineNode) {
950 StageSchematicNode *targetNode =
951 dynamic_cast<StageSchematicNode *>(port->getNode());
952 if (!targetNode || port->getType() != eStageSplinePort) return false;
953 if (!checkOnly) {
954 TStageObjectSpline *spline = splineNode->getSpline();
955 TStageObjectCmd::setSplineParent(spline, targetNode->getStageObject(),
956 stageScene->getXsheetHandle());
957 }
958 return true;
959 }
960 return false;
961 }
962
963 //--------------------------------------------------------
964
searchPort(const QPointF & scenePos)965 SchematicPort *StageSchematicSplinePort::searchPort(const QPointF &scenePos) {
966 QList<QGraphicsItem *> items = scene()->items(scenePos);
967 int i;
968 for (i = 0; i < items.size(); i++) {
969 StageSchematicSplinePort *linkingTo =
970 dynamic_cast<StageSchematicSplinePort *>(items[i]);
971 if (linkingTo) return linkingTo;
972 }
973 return 0;
974 }
975
976 //--------------------------------------------------------
977
hideSnappedLinks(SchematicPort *)978 void StageSchematicSplinePort::hideSnappedLinks(SchematicPort *) {
979 if (!m_linkingTo) return;
980 StageSchematicNode *node = dynamic_cast<StageSchematicNode *>(getNode());
981 StageSchematicSplineNode *splineNode =
982 dynamic_cast<StageSchematicSplineNode *>(getNode());
983 if (node && getLinkCount() == 1) getLink(0)->hide();
984 if (splineNode && m_linkingTo->getLinkCount() == 1)
985 m_linkingTo->getLink(0)->hide();
986 }
987
988 //--------------------------------------------------------
989
showSnappedLinks(SchematicPort *)990 void StageSchematicSplinePort::showSnappedLinks(SchematicPort *) {
991 if (!m_linkingTo) return;
992 StageSchematicNode *node = dynamic_cast<StageSchematicNode *>(getNode());
993 StageSchematicSplineNode *splineNode =
994 dynamic_cast<StageSchematicSplineNode *>(getNode());
995 if (node && getLinkCount() == 1) getLink(0)->show();
996 if (splineNode && m_linkingTo->getLinkCount() == 1)
997 m_linkingTo->getLink(0)->show();
998 }
999
1000 //========================================================
1001 //
1002 // class SplineAimChanger
1003 //
1004 //========================================================
1005
SplineAimChanger(QGraphicsItem * parent)1006 SplineAimChanger::SplineAimChanger(QGraphicsItem *parent)
1007 : SchematicHandleSpinBox(parent), m_aim(false) {}
1008
1009 //--------------------------------------------------------
1010
~SplineAimChanger()1011 SplineAimChanger::~SplineAimChanger() {}
1012
1013 //--------------------------------------------------------
1014
mouseMoveEvent(QGraphicsSceneMouseEvent * me)1015 void SplineAimChanger::mouseMoveEvent(QGraphicsSceneMouseEvent *me) {
1016 if (m_buttonState == Qt::LeftButton) {
1017 bool increase = false;
1018 int delta = me->screenPos().y() - me->lastScreenPos().y();
1019 if (delta < 0) increase = true;
1020 m_delta += abs(delta);
1021 if (m_delta > 15) {
1022 emit(changeStatus());
1023 m_delta = 0;
1024 }
1025 }
1026 }
1027
1028 //--------------------------------------------------------
1029
mousePressEvent(QGraphicsSceneMouseEvent * me)1030 void SplineAimChanger::mousePressEvent(QGraphicsSceneMouseEvent *me) {
1031 SchematicHandleSpinBox::mousePressEvent(me);
1032 }
1033
1034 //--------------------------------------------------------
1035
mouseReleaseEvent(QGraphicsSceneMouseEvent * me)1036 void SplineAimChanger::mouseReleaseEvent(QGraphicsSceneMouseEvent *me) {
1037 SchematicHandleSpinBox::mouseReleaseEvent(me);
1038 m_delta = 0;
1039 }
1040
1041 //========================================================
1042 //
1043 // class StageSchematicNodeDock
1044 //
1045 //========================================================
1046
StageSchematicNodeDock(StageSchematicNode * parent,bool isParentPort,eStageSchematicPortType type)1047 StageSchematicNodeDock::StageSchematicNodeDock(StageSchematicNode *parent,
1048 bool isParentPort,
1049 eStageSchematicPortType type)
1050 : QGraphicsItem(parent), m_parent(parent), m_isParentPort(isParentPort) {
1051 setFlag(QGraphicsItem::ItemIsSelectable, false);
1052 setFlag(QGraphicsItem::ItemIsFocusable, false);
1053 m_port = new StageSchematicNodePort(this, type);
1054
1055 m_handleSpinBox = new SchematicHandleSpinBox(this);
1056
1057 m_port->setPos(0, 0);
1058 if (isParentPort) {
1059 StageSchematicScene *stageScene =
1060 dynamic_cast<StageSchematicScene *>(scene());
1061 if (stageScene && stageScene->isShowLetterOnPortFlagEnabled())
1062 m_port->setPos(m_handleSpinBox->boundingRect().width(), 0);
1063 m_handleSpinBox->setPos(0, 1);
1064 } else
1065 m_handleSpinBox->setPos(m_port->boundingRect().width(), 1);
1066
1067 m_handleSpinBox->hide();
1068 connect(m_handleSpinBox, SIGNAL(modifyHandle(int)), this,
1069 SLOT(onModifyHandle(int)));
1070 connect(m_handleSpinBox, SIGNAL(sceneChanged()), parent,
1071 SIGNAL(sceneChanged()));
1072 connect(m_handleSpinBox, SIGNAL(handleReleased()), parent,
1073 SLOT(onHandleReleased()));
1074
1075 connect(this, SIGNAL(sceneChanged()), parent, SIGNAL(sceneChanged()));
1076
1077 connect(m_port, SIGNAL(isClicked()), this, SLOT(onPortClicked()));
1078 connect(m_port, SIGNAL(isReleased(const QPointF &)), this,
1079 SLOT(onPortReleased(const QPointF &)));
1080
1081 m_timer = new QTimer(this);
1082 m_timer->setInterval(200);
1083 m_timer->setSingleShot(true);
1084 connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimeOut()));
1085
1086 connect(m_port, SIGNAL(sceneChanged()), parent, SIGNAL(sceneChanged()));
1087 connect(m_port, SIGNAL(xsheetChanged()), parent, SIGNAL(xsheetChanged()));
1088
1089 setZValue(1.5);
1090 #if QT_VERSION >= 0x050000
1091 setAcceptHoverEvents(true);
1092 #else
1093 setAcceptsHoverEvents(true);
1094 #endif
1095 }
1096
1097 //--------------------------------------------------------
1098
~StageSchematicNodeDock()1099 StageSchematicNodeDock::~StageSchematicNodeDock() {}
1100
1101 //--------------------------------------------------------
1102
boundingRect() const1103 QRectF StageSchematicNodeDock::boundingRect() const {
1104 StageSchematicScene *stageScene =
1105 dynamic_cast<StageSchematicScene *>(scene());
1106 QRectF portRect = m_port->boundingRect();
1107 portRect.moveTopLeft(QPointF(0, 0));
1108 if (stageScene && stageScene->isShowLetterOnPortFlagEnabled()) {
1109 QRectF handleRect = m_handleSpinBox->boundingRect();
1110 handleRect.moveTopLeft(QPointF(portRect.width(), handleRect.topLeft().y()));
1111 #if QT_VERSION >= 0x050000
1112 portRect = portRect.united(handleRect);
1113 #else
1114 portRect = portRect.unite(handleRect);
1115 #endif
1116 }
1117 return portRect;
1118 }
1119
1120 //--------------------------------------------------------
1121
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)1122 void StageSchematicNodeDock::paint(QPainter *painter,
1123 const QStyleOptionGraphicsItem *option,
1124 QWidget *widget) {}
1125
1126 //--------------------------------------------------------
1127
onModifyHandle(int increase)1128 void StageSchematicNodeDock::onModifyHandle(int increase) {
1129 StageSchematicScene *stageScene =
1130 dynamic_cast<StageSchematicScene *>(scene());
1131 std::string handle(getPort()->getHandle().toStdString());
1132
1133 int index;
1134 if (handle[0] == 'H' && handle.length() > 1)
1135 index = -(std::stoi(handle.substr(1)));
1136 else
1137 index = handle[0] - 'A';
1138 index += -increase; //==1 ? -1 : 1;
1139
1140 int min = (getNode()->getStageObject()->getId().isColumn())
1141 ? -HookSet::maxHooksCount
1142 : 0;
1143 index = tcrop(index, min, 25);
1144
1145 if (index >= 0)
1146 handle = std::string(1, (char)('A' + index));
1147 else
1148 handle = "H" + std::to_string(-index);
1149
1150 if (m_isParentPort)
1151 TStageObjectCmd::setHandle(getNode()->getStageObject()->getId(), handle,
1152 stageScene->getXsheetHandle());
1153 else {
1154 int i, linkCount = getPort()->getLinkCount();
1155 std::vector<TStageObjectId> ids;
1156 for (i = 0; i < linkCount; i++) {
1157 StageSchematicNode *node =
1158 dynamic_cast<StageSchematicNode *>(getPort()->getLinkedNode(i));
1159 if (node) ids.push_back(node->getStageObject()->getId());
1160 }
1161 TStageObjectCmd::setParentHandle(ids, handle,
1162 stageScene->getXsheetHandle());
1163 }
1164 getPort()->setHandle(QString::fromStdString(handle));
1165 getPort()->update();
1166 }
1167
1168 //--------------------------------------------------------
1169
hoverEnterEvent(QGraphicsSceneHoverEvent * he)1170 void StageSchematicNodeDock::hoverEnterEvent(QGraphicsSceneHoverEvent *he) {
1171 QList<QGraphicsItem *> items = scene()->items(he->scenePos());
1172 eStageSchematicPortType type = (eStageSchematicPortType)getPort()->getType();
1173 if (items.contains(m_port) && type != 103 && type != 104 && type != 105) {
1174 m_port->highLight(true);
1175 m_timer->start();
1176 }
1177 QGraphicsItem::hoverEnterEvent(he);
1178 }
1179
1180 //--------------------------------------------------------
1181
hoverLeaveEvent(QGraphicsSceneHoverEvent * he)1182 void StageSchematicNodeDock::hoverLeaveEvent(QGraphicsSceneHoverEvent *he) {
1183 m_port->highLight(false);
1184 m_timer->stop();
1185 m_handleSpinBox->hide();
1186 QGraphicsItem::hoverLeaveEvent(he);
1187 int i;
1188 for (i = 0; i < m_port->getLinkCount(); i++) m_port->getLink(i)->updatePath();
1189 }
1190
1191 //--------------------------------------------------------
1192
hoverMoveEvent(QGraphicsSceneHoverEvent * he)1193 void StageSchematicNodeDock::hoverMoveEvent(QGraphicsSceneHoverEvent *he) {
1194 QList<QGraphicsItem *> items = scene()->items(he->scenePos());
1195 if (!m_port->isHighlighted() && items.contains(m_port)) {
1196 m_port->highLight(true);
1197 eStageSchematicPortType type =
1198 (eStageSchematicPortType)getPort()->getType();
1199 if (!m_timer->isActive() && type != 103 && type != 104 && type != 105)
1200 m_timer->start();
1201 }
1202 QGraphicsItem::hoverMoveEvent(he);
1203 update();
1204 }
1205
1206 //--------------------------------------------------------
1207
onPortClicked()1208 void StageSchematicNodeDock::onPortClicked() {
1209 m_handleSpinBox->hide();
1210 m_timer->stop();
1211 int i;
1212 for (i = 0; i < m_port->getLinkCount(); i++) m_port->getLink(i)->updatePath();
1213 }
1214
1215 //--------------------------------------------------------
1216
onPortReleased(const QPointF & pos)1217 void StageSchematicNodeDock::onPortReleased(const QPointF &pos) {
1218 QRectF portRect = m_port->boundingRect();
1219 portRect.moveTopLeft(m_port->scenePos());
1220 if (portRect.contains(pos)) m_timer->start();
1221 }
1222
1223 //--------------------------------------------------------
1224
onTimeOut()1225 void StageSchematicNodeDock::onTimeOut() {
1226 StageSchematicScene *stageScene =
1227 dynamic_cast<StageSchematicScene *>(scene());
1228 if (stageScene && stageScene->isShowLetterOnPortFlagEnabled())
1229 m_handleSpinBox->show();
1230 StageSchematicNodePort *port = getPort();
1231 int i;
1232 for (i = 0; i < port->getLinkCount(); i++) {
1233 SchematicLink *link = port->getLink(i);
1234 SchematicPort *startPort = link->getStartPort();
1235 SchematicPort *endPort = link->getEndPort();
1236 QPointF startPos = startPort->getLinkEndPoint();
1237 QPointF endPos = endPort->getLinkEndPoint();
1238 if (startPort == port) {
1239 if (port->getType() == 101 && startPos.x() > endPos.x())
1240 startPos = mapToScene(0, boundingRect().height() * 0.5);
1241 if (port->getType() == 102 && startPos.x() < endPos.x())
1242 startPos =
1243 mapToScene(boundingRect().width(), boundingRect().height() * 0.5);
1244 link->updatePath(startPos, endPos);
1245 } else {
1246 if (port->getType() == 101 && startPos.x() < endPos.x())
1247 endPos = mapToScene(0, boundingRect().height() * 0.5);
1248 if (port->getType() == 102 && startPos.x() > endPos.x())
1249 endPos =
1250 mapToScene(boundingRect().width(), boundingRect().height() * 0.5);
1251 link->updatePath(startPos, endPos);
1252 }
1253 }
1254 }
1255
1256 //========================================================
1257 //
1258 // class StageSchematicSplineDock
1259 //
1260 //========================================================
1261
StageSchematicSplineDock(SchematicNode * parent,bool isParentPort,eStageSchematicPortType type)1262 StageSchematicSplineDock::StageSchematicSplineDock(SchematicNode *parent,
1263 bool isParentPort,
1264 eStageSchematicPortType type)
1265 : QGraphicsItem(parent), m_parent(parent), m_isParentPort(isParentPort) {
1266 setFlag(QGraphicsItem::ItemIsSelectable, false);
1267 setFlag(QGraphicsItem::ItemIsFocusable, false);
1268 m_port = new StageSchematicSplinePort(this, type);
1269 #if QT_VERSION >= 0x050000
1270 setAcceptHoverEvents(true);
1271 #else
1272 setAcceptsHoverEvents(true);
1273 #endif
1274
1275 connect(m_port, SIGNAL(sceneChanged()), parent, SIGNAL(sceneChanged()));
1276 connect(m_port, SIGNAL(xsheetChanged()), parent, SIGNAL(xsheetChanged()));
1277 connect(this, SIGNAL(sceneChanged()), parent, SIGNAL(sceneChanged()));
1278 }
1279
1280 //--------------------------------------------------------
1281
~StageSchematicSplineDock()1282 StageSchematicSplineDock::~StageSchematicSplineDock() {}
1283
1284 //--------------------------------------------------------
1285
boundingRect() const1286 QRectF StageSchematicSplineDock::boundingRect() const {
1287 QRectF portRect = m_port->boundingRect();
1288 portRect.moveTopLeft(QPointF(0, 0));
1289 return portRect;
1290 }
1291
1292 //--------------------------------------------------------
1293
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)1294 void StageSchematicSplineDock::paint(QPainter *painter,
1295 const QStyleOptionGraphicsItem *option,
1296 QWidget *widget) {}
1297
1298 //========================================================
1299 //
1300 // class StageSchematicNode
1301 //
1302 //========================================================
1303
StageSchematicNode(StageSchematicScene * scene,TStageObject * obj,int width,int height,bool isGroup)1304 StageSchematicNode::StageSchematicNode(StageSchematicScene *scene,
1305 TStageObject *obj, int width, int height,
1306 bool isGroup)
1307 : SchematicNode(scene), m_stageObject(obj), m_isGroup(isGroup) {
1308 m_stageObject->addRef();
1309 m_width = width;
1310 m_height = height;
1311
1312 // aggiunge le porte
1313 qreal y = m_height * 0.5 - 5;
1314 qreal x = m_width * 0.5 - 8;
1315
1316 if (m_isGroup)
1317 m_splineDock =
1318 new StageSchematicSplineDock(this, false, eStageSplineGroupPort);
1319 else
1320 m_splineDock = new StageSchematicSplineDock(this, false, eStageSplinePort);
1321 addPort(-1, m_splineDock->getPort());
1322 m_splineDock->setPos(x, m_height);
1323
1324 m_pathToggle = new SchematicToggle_SplineOptions(
1325 this, QIcon(":Resources/schematic_spline_aim_rhomb.svg"),
1326 QIcon(":Resources/schematic_spline_aim_square.svg"), 0);
1327 m_cpToggle = new SchematicToggle_SplineOptions(
1328 this, QIcon(":Resources/schematic_spline_cp.svg"), 0);
1329 m_pathToggle->setSize(16, 16);
1330 m_cpToggle->setSize(16, 16);
1331 m_cpToggle->setPos(m_splineDock->pos() - QPointF(16, 0));
1332 m_pathToggle->setPos(m_cpToggle->pos() - QPointF(16, 0));
1333 m_pathToggle->setToolTip(tr("Toggle Autorotate Along Motion Path"));
1334 m_cpToggle->setToolTip(tr("Toggle Link Motion Path to Control Points"));
1335
1336 if (m_stageObject->isPathEnabled()) {
1337 if (m_stageObject->isAimEnabled())
1338 m_pathToggle->setState(1);
1339 else
1340 m_pathToggle->setState(2);
1341 }
1342 m_cpToggle->setIsActive(m_stageObject->isUppkEnabled());
1343
1344 connect(m_pathToggle, SIGNAL(stateChanged(int)), scene,
1345 SLOT(onPathToggled(int)));
1346 connect(m_cpToggle, SIGNAL(toggled(bool)), scene, SLOT(onCpToggled(bool)));
1347
1348 if (!m_stageObject->getSpline()) {
1349 m_pathToggle->hide();
1350 m_cpToggle->hide();
1351 }
1352
1353 if (m_isGroup)
1354 m_parentDock =
1355 new StageSchematicNodeDock(this, true, eStageParentGroupPort);
1356 else
1357 m_parentDock = new StageSchematicNodeDock(this, true, eStageParentPort);
1358 addPort(0, m_parentDock->getPort());
1359 if (scene->isShowLetterOnPortFlagEnabled())
1360 m_parentDock->setPos(-m_parentDock->boundingRect().width(), m_height - 15);
1361 else
1362 m_parentDock->setPos(0, 0);
1363 m_parentDock->getPort()->setHandle("B");
1364
1365 StageSchematicNodeDock *childDock;
1366 if (m_isGroup)
1367 childDock = new StageSchematicNodeDock(this, false, eStageChildGroupPort);
1368 else
1369 childDock = new StageSchematicNodeDock(this, false, eStageChildPort);
1370 addPort(1, childDock->getPort());
1371 m_childDocks.append(childDock);
1372 if (scene->isShowLetterOnPortFlagEnabled())
1373 childDock->setPos(m_width, m_height - 15);
1374 else
1375 childDock->setPos(m_width - 18, 0);
1376 childDock->getPort()->setHandle("B");
1377 }
1378
1379 //--------------------------------------------------------
1380
~StageSchematicNode()1381 StageSchematicNode::~StageSchematicNode() { m_stageObject->release(); }
1382
1383 //--------------------------------------------------------
1384
setSchematicNodePos(const QPointF & pos) const1385 void StageSchematicNode::setSchematicNodePos(const QPointF &pos) const {
1386 if (!m_stageObject->isGrouped() || m_stageObject->isGroupEditing())
1387 m_stageObject->setDagNodePos(TPointD(pos.x(), pos.y()));
1388 else {
1389 const StageSchematicGroupNode *groupNode =
1390 dynamic_cast<const StageSchematicGroupNode *>(this);
1391 assert(groupNode);
1392 groupNode->updateObjsDagPosition(TPointD(pos.x(), pos.y()));
1393 }
1394 }
1395
1396 //--------------------------------------------------------
1397
makeChildPort(const QString & label)1398 StageSchematicNodePort *StageSchematicNode::makeChildPort(
1399 const QString &label) {
1400 int i, n = m_childDocks.size();
1401 assert(n > 0);
1402 for (i = 0; i < n - 1; i++)
1403 if (m_childDocks[i]->getPort()->getHandle() == label)
1404 return m_childDocks[i]->getPort();
1405 StageSchematicNodeDock *dock = m_childDocks.back();
1406 dock->getPort()->setHandle(label);
1407 int k;
1408 QString newPortName;
1409 for (k = 0;; k++) {
1410 newPortName = QString(1, (char)('A' + k));
1411 int j;
1412 for (j = 0; j < n; j++) {
1413 QString name = m_childDocks[j]->getPort()->getHandle();
1414 if (name == newPortName) break;
1415 }
1416 if (j == n) break;
1417 }
1418 StageSchematicScene *stageScene =
1419 dynamic_cast<StageSchematicScene *>(scene());
1420 if (stageScene && stageScene->isShowLetterOnPortFlagEnabled()) {
1421 StageSchematicNodeDock *newDock;
1422 if (m_isGroup)
1423 newDock = new StageSchematicNodeDock(this, false, eStageChildGroupPort);
1424 else
1425 newDock = new StageSchematicNodeDock(this, false, eStageChildPort);
1426 addPort(m_childDocks.size() + 1, newDock->getPort());
1427 m_childDocks.append(newDock);
1428 newDock->getPort()->setHandle(newPortName);
1429 }
1430 updateChildDockPositions();
1431 return dock->getPort();
1432 }
1433
1434 //--------------------------------------------------------
1435
makeParentPort(const QString & label)1436 StageSchematicNodePort *StageSchematicNode::makeParentPort(
1437 const QString &label) {
1438 m_parentDock->getPort()->setHandle(label);
1439 return m_parentDock->getPort();
1440 }
1441
1442 //--------------------------------------------------------
1443
setPosition(const QPointF & newPos)1444 void StageSchematicNode::setPosition(const QPointF &newPos) {
1445 if (m_stageObject->isGrouped() && m_stageObject->getEditingGroupId() != -1) {
1446 StageSchematicScene *stageScene =
1447 dynamic_cast<StageSchematicScene *>(scene());
1448 assert(stageScene);
1449 stageScene->updateNestedGroupEditors(this, newPos);
1450 } else
1451 setPos(newPos);
1452 }
1453
1454 //--------------------------------------------------------
1455
updateChildDockPositions()1456 void StageSchematicNode::updateChildDockPositions() {
1457 int i, size = m_childDocks.size();
1458 StageSchematicScene *stageScene =
1459 dynamic_cast<StageSchematicScene *>(scene());
1460 if (stageScene && stageScene->isShowLetterOnPortFlagEnabled()) {
1461 double portHeight = m_childDocks.at(0)->getPort()->boundingRect().height();
1462 double height = size * portHeight;
1463 double y = (m_height - 15 - portHeight * 0.5) + height * 0.5;
1464 for (i = 0; i < size; i++) {
1465 m_childDocks[i]->setPos(m_width, y);
1466 m_childDocks[i]->getPort()->updateLinksGeometry();
1467 y -= portHeight;
1468 }
1469 } else {
1470 double y = 18;
1471 for (i = 0; i < size; i++) {
1472 m_childDocks[i]->setPos(m_width - 18, m_height - y);
1473 m_childDocks[i]->getPort()->updateLinksGeometry();
1474 y += m_childDocks.at(0)->getPort()->boundingRect().height();
1475 }
1476 }
1477 }
1478
1479 //--------------------------------------------------------
1480
onClicked()1481 void StageSchematicNode::onClicked() {
1482 TStageObjectId id = m_stageObject->getId();
1483 emit currentObjectChanged(id, false);
1484 if (id.isColumn())
1485 emit currentColumnChanged(id.getIndex());
1486 else if (id.isCamera() || id.isPegbar() || id.isTable())
1487 emit editObject();
1488 }
1489
1490 //--------------------------------------------------------
1491
onHandleReleased()1492 void StageSchematicNode::onHandleReleased() {
1493 int i;
1494 bool updated = false;
1495 for (i = m_childDocks.size() - 1; i >= 0; i--) {
1496 StageSchematicNodePort *port = m_childDocks[i]->getPort();
1497 assert(port);
1498 if (!port) continue;
1499 QString label = port->getHandle();
1500 int j;
1501 for (j = 0; j < m_childDocks.size(); j++) {
1502 StageSchematicNodePort *refPort = m_childDocks[j]->getPort();
1503 assert(refPort);
1504 if (!refPort) continue;
1505 if (refPort->getHandle() == label && i != j) {
1506 StageSchematicNodeDock *dock = m_childDocks[i];
1507 int k;
1508 if (port->getLinkCount() == 0 || refPort->getLinkCount() == 0) {
1509 updated = true;
1510 break;
1511 }
1512 for (k = port->getLinkCount() - 1; k >= 0; k--) {
1513 SchematicLink *link = port->getLink(k);
1514 assert(link);
1515 if (!link) continue;
1516 if (link->getStartPort() == port)
1517 link->setStartPort(refPort);
1518 else if (link->getEndPort() == port)
1519 link->setEndPort(refPort);
1520 port->removeLink(link);
1521 refPort->addLink(link);
1522 }
1523 m_childDocks.removeAt(i);
1524 delete dock;
1525 updateChildDockPositions();
1526 update();
1527 updated = true;
1528 break;
1529 }
1530 }
1531 if (updated) break;
1532 }
1533
1534 if (updated) {
1535 QSet<QString> labels;
1536 StageSchematicNodePort *freePort = 0;
1537 for (i = 0; i < m_childDocks.size(); i++) {
1538 StageSchematicNodePort *port = m_childDocks[i]->getPort();
1539 assert(port);
1540 if (!port) continue;
1541 if (port->getLinkCount() == 0)
1542 freePort = port;
1543 else
1544 labels.insert(port->getHandle());
1545 }
1546
1547 i = 0;
1548 while (labels.contains(QString(1, (char)('A' + i)))) i++;
1549 freePort->setHandle(QString(1, (char)('A' + i)));
1550 freePort->update();
1551 }
1552 }
1553
1554 //========================================================
1555 //
1556 // class StageSchematicPegbarNode
1557 //
1558 //========================================================
1559
StageSchematicPegbarNode(StageSchematicScene * scene,TStageObject * pegbar)1560 StageSchematicPegbarNode::StageSchematicPegbarNode(StageSchematicScene *scene,
1561 TStageObject *pegbar)
1562 : StageSchematicNode(scene, pegbar, 90, 18) {
1563 std::string name = m_stageObject->getFullName();
1564 std::string id = m_stageObject->getId().toString();
1565 m_name = QString::fromStdString(name);
1566 m_nameItem = new SchematicName(this, 72, 20);
1567 m_nameItem->setName(m_name);
1568 m_nameItem->setPos(16, -1);
1569 m_nameItem->setZValue(2);
1570 connect(m_nameItem, SIGNAL(focusOut()), this, SLOT(onNameChanged()));
1571 m_nameItem->hide();
1572
1573 m_pegbarPainter = new PegbarPainter(this, m_width, m_height, m_name);
1574 m_pegbarPainter->setZValue(1);
1575
1576 QString toolTip =
1577 name == id ? m_name : m_name + " (" + QString::fromStdString(id) + ")";
1578 setToolTip(toolTip);
1579 }
1580
1581 //--------------------------------------------------------
1582
~StageSchematicPegbarNode()1583 StageSchematicPegbarNode::~StageSchematicPegbarNode() {}
1584
1585 //--------------------------------------------------------
1586
boundingRect() const1587 QRectF StageSchematicPegbarNode::boundingRect() const {
1588 return QRectF(-5, -5, m_width + 10, m_height + 10);
1589 }
1590
1591 //--------------------------------------------------------
1592
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)1593 void StageSchematicPegbarNode::paint(QPainter *painter,
1594 const QStyleOptionGraphicsItem *option,
1595 QWidget *widget) {
1596 StageSchematicNode::paint(painter, option, widget);
1597 }
1598
1599 //--------------------------------------------------------
1600
mouseDoubleClickEvent(QGraphicsSceneMouseEvent * me)1601 void StageSchematicPegbarNode::mouseDoubleClickEvent(
1602 QGraphicsSceneMouseEvent *me) {
1603 QRectF nameArea(18, 0, m_width - 36, 14);
1604 if (nameArea.contains(me->pos())) {
1605 m_nameItem->setPlainText(m_name);
1606 m_nameItem->show();
1607 m_nameItem->setFocus();
1608 setFlag(QGraphicsItem::ItemIsSelectable, false);
1609 return;
1610 }
1611 }
1612
1613 //--------------------------------------------------------
1614
onNameChanged()1615 void StageSchematicPegbarNode::onNameChanged() {
1616 StageSchematicScene *stageScene =
1617 dynamic_cast<StageSchematicScene *>(scene());
1618 m_nameItem->hide();
1619 m_name = m_nameItem->toPlainText();
1620 m_pegbarPainter->setName(m_name);
1621 setFlag(QGraphicsItem::ItemIsSelectable, true);
1622
1623 TStageObjectId id = m_stageObject->getId();
1624 std::string strId = id.toString();
1625 std::string name = m_name.toStdString();
1626 QString toolTip = name == strId
1627 ? m_name
1628 : m_name + " (" + QString::fromStdString(strId) + ")";
1629 setToolTip(toolTip);
1630 if (id.isPegbar())
1631 TStageObjectCmd::rename(id, m_name.toStdString(),
1632 stageScene->getXsheetHandle());
1633 update();
1634 }
1635
1636 //========================================================
1637 //
1638 // class StageSchematicTableNode
1639 //
1640 //========================================================
1641
StageSchematicTableNode(StageSchematicScene * scene,TStageObject * pegbar)1642 StageSchematicTableNode::StageSchematicTableNode(StageSchematicScene *scene,
1643 TStageObject *pegbar)
1644 : StageSchematicNode(scene, pegbar, 90, 18) {
1645 m_parentDock->hide();
1646 updateChildDockPositions();
1647
1648 m_tablePainter = new TablePainter(this, m_width, m_height);
1649 m_tablePainter->setZValue(1);
1650 }
1651
1652 //--------------------------------------------------------
1653
~StageSchematicTableNode()1654 StageSchematicTableNode::~StageSchematicTableNode() {}
1655
1656 //--------------------------------------------------------
1657
boundingRect() const1658 QRectF StageSchematicTableNode::boundingRect() const {
1659 return QRectF(-5, -5, m_width + 10, m_height + 10);
1660 }
1661
1662 //--------------------------------------------------------
1663
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)1664 void StageSchematicTableNode::paint(QPainter *painter,
1665 const QStyleOptionGraphicsItem *option,
1666 QWidget *widget) {
1667 StageSchematicNode::paint(painter, option, widget);
1668 }
1669
1670 //--------------------------------------------------------
1671
1672 //========================================================
1673 //
1674 // class StageSchematicColumnNode
1675 //
1676 //========================================================
1677
StageSchematicColumnNode(StageSchematicScene * scene,TStageObject * pegbar)1678 StageSchematicColumnNode::StageSchematicColumnNode(StageSchematicScene *scene,
1679 TStageObject *pegbar)
1680 : StageSchematicNode(scene, pegbar, 90, 32), m_isOpened(true) {
1681 bool ret = true;
1682
1683 assert(pegbar && pegbar->getId().isColumn());
1684
1685 SchematicViewer *viewer = scene->getSchematicViewer();
1686
1687 TXshColumn *column =
1688 scene->getXsheet()->getColumn(pegbar->getId().getIndex());
1689
1690 std::string name = m_stageObject->getName();
1691
1692 if (column) {
1693 // ZeraryFx columns store name elsewhere
1694 TXshZeraryFxColumn *zColumn = dynamic_cast<TXshZeraryFxColumn *>(column);
1695 if (zColumn)
1696 name =
1697 ::to_string(zColumn->getZeraryColumnFx()->getZeraryFx()->getName());
1698 }
1699
1700 m_name = QString::fromStdString(name);
1701 m_resizeItem = new SchematicThumbnailToggle(this, m_stageObject->isOpened());
1702 m_resizeItem->setPos(2, 0);
1703 m_resizeItem->setZValue(2);
1704 ret = ret && connect(m_resizeItem, SIGNAL(toggled(bool)), this,
1705 SLOT(onChangedSize(bool)));
1706
1707 m_nameItem = new SchematicName(this, 54, 20);
1708 m_nameItem->setName(m_name);
1709 m_nameItem->setPos(16, -1);
1710 m_nameItem->setZValue(2);
1711 ret = ret &&
1712 connect(m_nameItem, SIGNAL(focusOut()), this, SLOT(onNameChanged()));
1713 m_nameItem->hide();
1714
1715 m_renderToggle =
1716 new SchematicToggle(this, viewer->getSchematicPreviewButtonOnImage(),
1717 viewer->getSchematicPreviewButtonBgOnColor(),
1718 viewer->getSchematicPreviewButtonOffImage(),
1719 viewer->getSchematicPreviewButtonBgOffColor(),
1720 SchematicToggle::eIsParentColumn);
1721 ret = ret && connect(m_renderToggle, SIGNAL(toggled(bool)), this,
1722 SLOT(onRenderToggleClicked(bool)));
1723 if (scene) {
1724 if (column) m_renderToggle->setIsActive(column->isPreviewVisible());
1725
1726 m_renderToggle->setPos(72, 0);
1727 m_renderToggle->setZValue(2);
1728
1729 m_cameraStandToggle = new SchematicToggle(
1730 this, viewer->getSchematicCamstandButtonOnImage(),
1731 viewer->getSchematicCamstandButtonTranspImage(),
1732 viewer->getSchematicCamstandButtonBgOnColor(),
1733 viewer->getSchematicCamstandButtonOffImage(),
1734 viewer->getSchematicCamstandButtonBgOffColor(),
1735 SchematicToggle::eIsParentColumn | SchematicToggle::eEnableNullState);
1736 ret = ret && connect(m_cameraStandToggle, SIGNAL(stateChanged(int)), this,
1737 SLOT(onCameraStandToggleClicked(int)));
1738 if (column)
1739 m_cameraStandToggle->setState(column->isCamstandVisible()
1740 ? (column->getOpacity() < 255 ? 2 : 1)
1741 : 0);
1742
1743 m_cameraStandToggle->setPos(72, 7);
1744 m_cameraStandToggle->setZValue(2);
1745 }
1746
1747 qreal y = 14;
1748 m_parentDock->setY(y);
1749 m_childDocks[0]->setY(y);
1750
1751 m_columnPainter = new ColumnPainter(this, m_width, m_height, m_name);
1752 m_columnPainter->setZValue(1);
1753
1754 if (column && !column->isControl() && !column->isRendered() &&
1755 !column->getMeshColumn())
1756 m_columnPainter->setIsReference();
1757
1758 int levelType;
1759 QString levelName;
1760 getLevelTypeAndName(levelType, levelName);
1761 setToolTip(QString("%1 : %2").arg(m_name, levelName));
1762
1763 onChangedSize(m_stageObject->isOpened());
1764 assert(ret);
1765
1766 if (levelType == PLT_XSHLEVEL) {
1767 m_resizeItem->hide();
1768 m_cameraStandToggle->hide();
1769 }
1770 }
1771
1772 //--------------------------------------------------------
1773
~StageSchematicColumnNode()1774 StageSchematicColumnNode::~StageSchematicColumnNode() {}
1775
1776 //--------------------------------------------------------
1777
boundingRect() const1778 QRectF StageSchematicColumnNode::boundingRect() const {
1779 // iwasawa
1780 if (m_isOpened)
1781 return QRectF(-5, -54, m_width + 10, m_height + 59);
1782 else
1783 return QRectF(-5, -5, m_width + 10, m_height + 10);
1784 }
1785
1786 //--------------------------------------------------------
1787
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)1788 void StageSchematicColumnNode::paint(QPainter *painter,
1789 const QStyleOptionGraphicsItem *option,
1790 QWidget *widget) {
1791 StageSchematicNode::paint(painter, option, widget);
1792 TStageObjectId id = m_stageObject->getId();
1793 assert(id.isColumn());
1794 QString colNumber = QString::number(id.getIndex() + 1);
1795 QFont font("Verdana", 8);
1796 painter->setFont(font);
1797 StageSchematicScene *scene = dynamic_cast<StageSchematicScene *>(m_scene);
1798 SchematicViewer *viewer = scene->getSchematicViewer();
1799 if (scene && scene->getCurrentObject() == id)
1800 painter->setPen(viewer->getSelectedNodeTextColor());
1801 QFontMetrics metrix(font);
1802 int srcWidth = metrix.width(colNumber);
1803 int srcHeight = metrix.height();
1804 QPointF pos(m_cameraStandToggle->pos() -
1805 QPointF(srcWidth + 1, -srcHeight + 3));
1806 painter->drawText(pos, colNumber);
1807 }
1808
1809 //--------------------------------------------------------
1810
getPixmap()1811 QPixmap StageSchematicColumnNode::getPixmap() {
1812 StageSchematicScene *stageScene =
1813 dynamic_cast<StageSchematicScene *>(scene());
1814 if (!stageScene) return QPixmap();
1815 int columnIndex = m_stageObject->getId().getIndex();
1816 TXsheet *xsh = stageScene->getXsheet();
1817 if (xsh && !xsh->isColumnEmpty(columnIndex)) {
1818 int r0, r1;
1819 xsh->getCellRange(columnIndex, r0, r1);
1820 if (r1 >= r0) {
1821 TXshCell cell = xsh->getCell(r0, columnIndex);
1822 TXshLevel *xl = cell.m_level.getPointer();
1823 if (xl) {
1824 bool onDemand = false;
1825 if (Preferences::instance()->getColumnIconLoadingPolicy() ==
1826 Preferences::LoadOnDemand)
1827 onDemand =
1828 stageScene->getColumnHandle()->getColumnIndex() != columnIndex;
1829 return IconGenerator::instance()->getIcon(xl, cell.m_frameId, false,
1830 onDemand);
1831 }
1832 }
1833 }
1834 return QPixmap();
1835 }
1836
1837 //--------------------------------------------------------
1838
resize(bool maximized)1839 void StageSchematicColumnNode::resize(bool maximized) {
1840 m_resizeItem->setIsDown(!maximized);
1841 }
1842
1843 //--------------------------------------------------------
1844
getLevelTypeAndName(int & ltype,QString & levelName)1845 void StageSchematicColumnNode::getLevelTypeAndName(int <ype,
1846 QString &levelName) {
1847 StageSchematicScene *stageScene =
1848 dynamic_cast<StageSchematicScene *>(scene());
1849 if (!stageScene) {
1850 ltype = NO_XSHLEVEL;
1851 levelName = QString();
1852 return;
1853 }
1854
1855 int columnIndex = m_stageObject->getId().getIndex();
1856 TXsheet *xsh = stageScene->getXsheet();
1857 if (xsh && !xsh->isColumnEmpty(columnIndex)) {
1858 int r0, r1;
1859 xsh->getCellRange(columnIndex, r0, r1);
1860 if (r1 >= r0) {
1861 TXshCell cell = xsh->getCell(r0, columnIndex);
1862 TXshLevel *xl = cell.m_level.getPointer();
1863 if (xl) {
1864 ltype = cell.m_level->getType();
1865
1866 // for Zerary Fx, display FxId
1867 if (ltype == ZERARYFX_XSHLEVEL) {
1868 TXshZeraryFxColumn *zColumn =
1869 dynamic_cast<TXshZeraryFxColumn *>(xsh->getColumn(columnIndex));
1870 if (zColumn) {
1871 TFx *fx = zColumn->getZeraryColumnFx()->getZeraryFx();
1872 levelName = QString::fromStdWString(fx->getFxId());
1873 return;
1874 }
1875 }
1876
1877 levelName = QString::fromStdWString(xl->getName());
1878 return;
1879 }
1880 }
1881 }
1882
1883 ltype = NO_XSHLEVEL;
1884 levelName = QString();
1885 return;
1886 }
1887 //--------------------------------------------------------
1888
onChangedSize(bool expand)1889 void StageSchematicColumnNode::onChangedSize(bool expand) {
1890 prepareGeometryChange();
1891 m_isOpened = expand;
1892 m_stageObject->setIsOpened(m_isOpened);
1893 m_height = 32;
1894 updatePortsPosition();
1895 updateLinksGeometry();
1896 update();
1897 emit nodeChangedSize();
1898 }
1899
1900 //--------------------------------------------------------
1901
updatePortsPosition()1902 void StageSchematicColumnNode::updatePortsPosition() {
1903 qreal x = m_width * 0.5 - 5;
1904 m_splineDock->setPos(x, m_height);
1905 updateChildDockPositions();
1906 }
1907
1908 //--------------------------------------------------------
1909
mouseDoubleClickEvent(QGraphicsSceneMouseEvent * me)1910 void StageSchematicColumnNode::mouseDoubleClickEvent(
1911 QGraphicsSceneMouseEvent *me) {
1912 StageSchematicScene *stageScene =
1913 dynamic_cast<StageSchematicScene *>(scene());
1914 if (!stageScene) return;
1915 QRectF nameArea(14, 0, m_width - 15, 14);
1916 if (nameArea.contains(me->pos())) {
1917 std::string name = m_stageObject->getName();
1918
1919 TStageObjectId id = m_stageObject->getId();
1920 TXshColumn *column = stageScene->getXsheet()->getColumn(id.getIndex());
1921 if (column) {
1922 TXshZeraryFxColumn *fxColumn = dynamic_cast<TXshZeraryFxColumn *>(column);
1923 if (fxColumn)
1924 name = ::to_string(
1925 fxColumn->getZeraryColumnFx()->getZeraryFx()->getName());
1926 }
1927
1928 m_name = QString::fromStdString(name);
1929 m_nameItem->setPlainText(m_name);
1930 m_nameItem->show();
1931 m_nameItem->setFocus();
1932 setFlag(QGraphicsItem::ItemIsSelectable, false);
1933 }
1934 }
1935
1936 //--------------------------------------------------------
1937
onNameChanged()1938 void StageSchematicColumnNode::onNameChanged() {
1939 StageSchematicScene *stageScene =
1940 dynamic_cast<StageSchematicScene *>(scene());
1941 if (!stageScene) return;
1942 m_nameItem->hide();
1943 m_name = m_nameItem->toPlainText();
1944 m_columnPainter->setName(m_name);
1945
1946 int levelType;
1947 QString levelName;
1948 getLevelTypeAndName(levelType, levelName);
1949 setToolTip(QString("%1 : %2").arg(m_name, levelName));
1950
1951 setFlag(QGraphicsItem::ItemIsSelectable, true);
1952
1953 TStageObjectId id = m_stageObject->getId();
1954 if (!id.isColumn()) return;
1955 TXshColumn *column = stageScene->getXsheet()->getColumn(id.getIndex());
1956 TXshZeraryFxColumn *fxColumn = dynamic_cast<TXshZeraryFxColumn *>(column);
1957 if (fxColumn)
1958 TFxCommand::renameFx(fxColumn->getZeraryColumnFx(), m_name.toStdWString(),
1959 stageScene->getXsheetHandle());
1960 else {
1961 TStageObjectCmd::rename(id, m_name.toStdString(),
1962 stageScene->getXsheetHandle());
1963 update();
1964 }
1965 }
1966
1967 //--------------------------------------------------------
1968
onRenderToggleClicked(bool isActive)1969 void StageSchematicColumnNode::onRenderToggleClicked(bool isActive) {
1970 StageSchematicScene *stageScene =
1971 dynamic_cast<StageSchematicScene *>(scene());
1972 if (!stageScene) return;
1973 TXshColumn *column =
1974 stageScene->getXsheet()->getColumn(m_stageObject->getId().getIndex());
1975 if (column) {
1976 column->setPreviewVisible(isActive);
1977 emit sceneChanged();
1978 emit xsheetChanged();
1979 }
1980 }
1981
1982 //--------------------------------------------------------
1983
onCameraStandToggleClicked(int state)1984 void StageSchematicColumnNode::onCameraStandToggleClicked(int state) {
1985 StageSchematicScene *stageScene =
1986 dynamic_cast<StageSchematicScene *>(scene());
1987 if (!stageScene) return;
1988 TXshColumn *column =
1989 stageScene->getXsheet()->getColumn(m_stageObject->getId().getIndex());
1990 if (column) {
1991 // column->setCamstandNextState();
1992 column->setCamstandVisible(!column->isCamstandVisible());
1993 emit sceneChanged();
1994 emit xsheetChanged();
1995 }
1996 }
1997
1998 //========================================================
1999 //
2000 // class StageSchematicCameraNode
2001 //
2002 //========================================================
2003
StageSchematicCameraNode(StageSchematicScene * scene,TStageObject * pegbar)2004 StageSchematicCameraNode::StageSchematicCameraNode(StageSchematicScene *scene,
2005 TStageObject *pegbar)
2006 : StageSchematicNode(scene, pegbar, 90, 18) {
2007 std::string name = m_stageObject->getFullName();
2008 m_name = QString::fromStdString(name);
2009
2010 m_nameItem = new SchematicName(this, 54, 20);
2011 m_nameItem->setName(m_name);
2012
2013 m_nameItem->setPos(16, -2);
2014 connect(m_nameItem, SIGNAL(focusOut()), this, SLOT(onNameChanged()));
2015 m_nameItem->hide();
2016 m_nameItem->setZValue(2);
2017
2018 m_cameraPainter = new CameraPainter(this, m_width, m_height, m_name);
2019 m_cameraPainter->setZValue(1);
2020
2021 setToolTip(m_name);
2022 }
2023
2024 //--------------------------------------------------------
2025
~StageSchematicCameraNode()2026 StageSchematicCameraNode::~StageSchematicCameraNode() {}
2027
2028 //--------------------------------------------------------
2029
boundingRect() const2030 QRectF StageSchematicCameraNode::boundingRect() const {
2031 return QRectF(-5, -5, m_width + 10, m_height + 10);
2032 }
2033
2034 //--------------------------------------------------------
2035
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)2036 void StageSchematicCameraNode::paint(QPainter *painter,
2037 const QStyleOptionGraphicsItem *option,
2038 QWidget *widget) {
2039 StageSchematicNode::paint(painter, option, widget);
2040 }
2041
2042 //--------------------------------------------------------
2043
mouseDoubleClickEvent(QGraphicsSceneMouseEvent * me)2044 void StageSchematicCameraNode::mouseDoubleClickEvent(
2045 QGraphicsSceneMouseEvent *me) {
2046 QRectF nameArea(0, -14, m_width, 14);
2047 if (nameArea.contains(me->pos())) {
2048 m_nameItem->setPlainText(m_name);
2049 m_nameItem->show();
2050 m_nameItem->setFocus();
2051 setFlag(QGraphicsItem::ItemIsSelectable, false);
2052 } else {
2053 QAction *cameraSettingsPopup =
2054 CommandManager::instance()->getAction("MI_CameraStage");
2055 cameraSettingsPopup->trigger();
2056 }
2057 }
2058
2059 //--------------------------------------------------------
2060
onNameChanged()2061 void StageSchematicCameraNode::onNameChanged() {
2062 StageSchematicScene *stageScene =
2063 dynamic_cast<StageSchematicScene *>(scene());
2064 m_nameItem->hide();
2065 m_name = m_nameItem->toPlainText();
2066 m_cameraPainter->setName(m_name);
2067 setToolTip(m_name);
2068 setFlag(QGraphicsItem::ItemIsSelectable, true);
2069
2070 TStageObjectId id = m_stageObject->getId();
2071 if (id.isCamera())
2072 TStageObjectCmd::rename(id, m_name.toStdString(),
2073 stageScene->getXsheetHandle());
2074 update();
2075 }
2076
2077 //========================================================
2078 //
2079 // class StageSchematicSplineNode
2080 //
2081 //========================================================
2082
StageSchematicSplineNode(StageSchematicScene * scene,TStageObjectSpline * spline)2083 StageSchematicSplineNode::StageSchematicSplineNode(StageSchematicScene *scene,
2084 TStageObjectSpline *spline)
2085 : SchematicNode(scene), m_spline(spline), m_isOpened(false) {
2086 m_width = 90;
2087 m_height = 18;
2088 assert(spline);
2089
2090 m_dock = new StageSchematicSplineDock(this, true, eStageSplinePort);
2091 addPort(-1, m_dock->getPort());
2092 QRectF rect = m_dock->getPort()->boundingRect();
2093 m_dock->setPos(m_width * 0.5 - rect.width() * 0.5, -rect.height());
2094
2095 m_resizeItem = new SchematicThumbnailToggle(this, m_spline->isOpened());
2096 m_resizeItem->setPos(2, 2);
2097 m_resizeItem->setZValue(2);
2098 connect(m_resizeItem, SIGNAL(toggled(bool)), this, SLOT(onChangedSize(bool)));
2099
2100 std::string name = m_spline->getName();
2101 m_splineName = QString::fromStdString(name);
2102 m_nameItem = new SchematicName(this, 72, 20);
2103 m_nameItem->setName(m_splineName);
2104 m_nameItem->setPos(16, -1);
2105 m_nameItem->setZValue(2);
2106 connect(m_nameItem, SIGNAL(focusOut()), this, SLOT(onNameChanged()));
2107 m_nameItem->hide();
2108
2109 m_splinePainter = new SplinePainter(this, m_width, m_height, m_splineName);
2110 m_splinePainter->setZValue(1);
2111
2112 setToolTip(m_splineName);
2113 onChangedSize(m_spline->isOpened());
2114 }
2115
2116 //--------------------------------------------------------
2117
~StageSchematicSplineNode()2118 StageSchematicSplineNode::~StageSchematicSplineNode() {}
2119
2120 //--------------------------------------------------------
2121
boundingRect() const2122 QRectF StageSchematicSplineNode::boundingRect() const {
2123 if (m_isOpened)
2124 return QRectF(-5, -5, m_width + 10, m_height + 59);
2125 else
2126 return QRectF(-5, -5, m_width + 10, m_height + 10);
2127 }
2128
2129 //--------------------------------------------------------
2130
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)2131 void StageSchematicSplineNode::paint(QPainter *painter,
2132 const QStyleOptionGraphicsItem *option,
2133 QWidget *widget) {
2134 SchematicNode::paint(painter, option, widget);
2135 }
2136
2137 //--------------------------------------------------------
2138
onClicked()2139 void StageSchematicSplineNode::onClicked() {
2140 if (m_dock->getPort()->getLinkCount() > 0) {
2141 StageSchematicNode *parentNode =
2142 dynamic_cast<StageSchematicNode *>(m_dock->getPort()->getLinkedNode(0));
2143 TStageObjectId parentId = parentNode->getStageObject()->getId();
2144 emit currentObjectChanged(parentId, true);
2145 }
2146 }
2147
2148 //--------------------------------------------------------
2149
setSchematicNodePos(const QPointF & pos) const2150 void StageSchematicSplineNode::setSchematicNodePos(const QPointF &pos) const {
2151 m_spline->setDagNodePos(TPointD(pos.x(), pos.y()));
2152 }
2153
2154 //--------------------------------------------------------
2155
getPixmap()2156 QPixmap StageSchematicSplineNode::getPixmap() {
2157 return IconGenerator::instance()->getIcon(m_spline);
2158 return QPixmap();
2159 }
2160
2161 //--------------------------------------------------------
2162
resize(bool maximized)2163 void StageSchematicSplineNode::resize(bool maximized) {
2164 m_resizeItem->setIsDown(!maximized);
2165 }
2166
2167 //--------------------------------------------------------
2168
mouseDoubleClickEvent(QGraphicsSceneMouseEvent * me)2169 void StageSchematicSplineNode::mouseDoubleClickEvent(
2170 QGraphicsSceneMouseEvent *me) {
2171 QRectF nameArea(14, 0, m_width - 15, 14);
2172 if (nameArea.contains(me->pos())) {
2173 m_nameItem->setPlainText(m_splineName);
2174 m_nameItem->show();
2175 m_nameItem->setFocus();
2176 setFlag(QGraphicsItem::ItemIsSelectable, false);
2177 }
2178 }
2179
2180 //--------------------------------------------------------
2181
onNameChanged()2182 void StageSchematicSplineNode::onNameChanged() {
2183 m_nameItem->hide();
2184 m_splineName = m_nameItem->toPlainText();
2185 m_splinePainter->setName(m_splineName);
2186 setToolTip(m_splineName);
2187 setFlag(QGraphicsItem::ItemIsSelectable, true);
2188
2189 m_spline->setName(m_splineName.toStdString());
2190 update();
2191 }
2192
2193 //--------------------------------------------------------
2194
onChangedSize(bool expanded)2195 void StageSchematicSplineNode::onChangedSize(bool expanded) {
2196 prepareGeometryChange();
2197 m_isOpened = expanded;
2198 m_spline->setIsOpened(m_isOpened);
2199 m_height = 18;
2200 updateLinksGeometry();
2201 update();
2202 }
2203
2204 //========================================================
2205 //
2206 // class StageSchematicSplineNode
2207 //
2208 //========================================================
2209
StageSchematicGroupNode(StageSchematicScene * scene,TStageObject * root,const QList<TStageObject * > groupedObj)2210 StageSchematicGroupNode::StageSchematicGroupNode(
2211 StageSchematicScene *scene, TStageObject *root,
2212 const QList<TStageObject *> groupedObj)
2213 : StageSchematicNode(scene, root, 90, 18, true)
2214 , m_root(root)
2215 , m_groupedObj(groupedObj) {
2216 int i;
2217 for (i = 0; i < m_groupedObj.size(); i++) m_groupedObj[i]->addRef();
2218 bool ret = true;
2219 std::wstring name = m_stageObject->getGroupName(false);
2220 m_name = QString::fromStdWString(name);
2221
2222 m_nameItem = new SchematicName(this, 72, 20);
2223 m_nameItem->setName(m_name);
2224 m_nameItem->setPos(16, -1);
2225 m_nameItem->setZValue(2);
2226 ret = ret &&
2227 connect(m_nameItem, SIGNAL(focusOut()), this, SLOT(onNameChanged()));
2228 m_nameItem->hide();
2229
2230 // m_childDocks[0]->setPos(m_width - 18, 0);
2231 // m_parentDock->setPos(0, 0);
2232
2233 m_painter = new GroupPainter(this, m_width, m_height, m_name);
2234 m_painter->setZValue(1);
2235
2236 QString id = "Group " + QString::number(getGroupId());
2237 if (m_name != id)
2238 setToolTip(QString("%1 (%2)").arg(m_name, id));
2239 else
2240 setToolTip(m_name);
2241
2242 assert(ret);
2243 }
2244
2245 //--------------------------------------------------------
2246
~StageSchematicGroupNode()2247 StageSchematicGroupNode::~StageSchematicGroupNode() {
2248 int i;
2249 for (i = 0; i < m_groupedObj.size(); i++) m_groupedObj[i]->release();
2250 }
2251
2252 //--------------------------------------------------------
2253
boundingRect() const2254 QRectF StageSchematicGroupNode::boundingRect() const {
2255 return QRectF(-5, -5, m_width + 10, m_height + 10);
2256 }
2257
2258 //--------------------------------------------------------
2259
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)2260 void StageSchematicGroupNode::paint(QPainter *painter,
2261 const QStyleOptionGraphicsItem *option,
2262 QWidget *widget) {}
2263
2264 //--------------------------------------------------------
2265
mouseDoubleClickEvent(QGraphicsSceneMouseEvent * me)2266 void StageSchematicGroupNode::mouseDoubleClickEvent(
2267 QGraphicsSceneMouseEvent *me) {
2268 QRectF nameArea(14, 0, m_width - 15, 14);
2269 if (nameArea.contains(me->pos())) {
2270 m_name = QString::fromStdWString(m_root->getGroupName(false));
2271 m_nameItem->setPlainText(m_name);
2272 m_nameItem->show();
2273 m_nameItem->setFocus();
2274 setFlag(QGraphicsItem::ItemIsSelectable, false);
2275 }
2276 }
2277
2278 //--------------------------------------------------------
2279
onNameChanged()2280 void StageSchematicGroupNode::onNameChanged() {
2281 StageSchematicScene *stageScene =
2282 dynamic_cast<StageSchematicScene *>(scene());
2283 if (!stageScene) return;
2284 m_nameItem->hide();
2285 m_name = m_nameItem->toPlainText();
2286 m_painter->setName(m_name);
2287 QString id = "Group " + QString::number(getGroupId());
2288 if (m_name != id)
2289 setToolTip(QString("%1 (%2)").arg(m_name, id));
2290 else
2291 setToolTip(m_name);
2292 setFlag(QGraphicsItem::ItemIsSelectable, true);
2293
2294 TStageObjectCmd::renameGroup(m_groupedObj, m_name.toStdWString(), false,
2295 stageScene->getXsheetHandle());
2296 update();
2297 }
2298
2299 //--------------------------------------------------------
2300
getGroupId()2301 int StageSchematicGroupNode::getGroupId() { return m_root->getGroupId(); }
2302
2303 //--------------------------------------------------------
2304
onChangedSize(bool expanded)2305 void StageSchematicGroupNode::onChangedSize(bool expanded) {
2306 prepareGeometryChange();
2307 m_isOpened = expanded;
2308 int i;
2309 for (i = 0; i < m_groupedObj.size(); i++)
2310 m_groupedObj[i]->setIsOpened(m_isOpened);
2311 if (m_isOpened) {
2312 m_height = 59;
2313 m_nameItem->setPos(4, -6);
2314 } else {
2315 m_height = 14;
2316 m_nameItem->setPos(8, -2);
2317 }
2318 updatePortsPosition();
2319 updateLinksGeometry();
2320 update();
2321 }
2322
2323 //--------------------------------------------------------
2324
updateObjsDagPosition(const TPointD & pos) const2325 void StageSchematicGroupNode::updateObjsDagPosition(const TPointD &pos) const {
2326 TPointD oldPos = m_root->getDagNodePos();
2327 TPointD delta = pos - oldPos;
2328 int i;
2329 for (i = 0; i < m_groupedObj.size(); i++) {
2330 // If the node position is unidentified, then leave the placement of it to
2331 // placeNode() function.
2332 if (m_groupedObj[i]->getDagNodePos() != TConst::nowhere)
2333 m_groupedObj[i]->setDagNodePos(m_groupedObj[i]->getDagNodePos() + delta);
2334 }
2335 }
2336
2337 //--------------------------------------------------------
2338
updatePortsPosition()2339 void StageSchematicGroupNode::updatePortsPosition() {
2340 qreal middleY = m_isOpened ? (14 + m_height) * 0.5 : m_height * 0.5;
2341 qreal y = middleY - (m_parentDock->getPort()->boundingRect().height() * 0.5);
2342
2343 m_parentDock->setPos(-m_parentDock->boundingRect().width(), y);
2344 updateChildDockPositions();
2345 }
2346
2347 //--------------------------------------------------------
2348
resize(bool maximized)2349 void StageSchematicGroupNode::resize(bool maximized) {}
2350