1 // Copyright (C) 2006-2012 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "SceneCtrlPortItem.hxx"
21 #include "SceneTextItem.hxx"
22 #include "SceneNodeItem.hxx"
23 #include "SceneHeaderNodeItem.hxx"
25 #include "ItemMimeData.hxx"
26 #include "QtGuiContext.hxx"
28 // #include "QtGuiContext.hxx"
30 #include <QGraphicsSceneMouseEvent>
31 #include <QApplication>
35 // #include <QGraphicsSceneHoverEvent>
40 #include "Resource.hxx"
43 #include "YacsTrace.hxx"
46 using namespace YACS::ENGINE;
47 using namespace YACS::HMI;
49 SceneCtrlPortItem::SceneCtrlPortItem(QGraphicsScene *scene, SceneItem *parent,
51 : SceneItem(scene, parent, label), ScenePortItem(label)
54 _width = Resource::CtrlPort_Width;
55 _height = Resource::CtrlPort_Height;
56 _brushColor = Resource::CtrlPort_brush;
57 _hiBrushColor = Resource::CtrlPort_hiBrush;
58 _penColor = Resource::CtrlPort_pen;
59 _hiPenColor = Resource::CtrlPort_hiPen;
62 SceneCtrlPortItem::~SceneCtrlPortItem()
66 void SceneCtrlPortItem::paint(QPainter *painter,
67 const QStyleOptionGraphicsItem *option,
70 //DEBTRACE("ScenePortItem::paint");
73 QPen pen(getPenColor());
74 pen.setWidth(Resource::Thickness);
76 SceneHeaderNodeItem* hd = dynamic_cast<SceneHeaderNodeItem*>(_parent);
77 painter->setBrush(hd->getValidColor());
78 painter->drawRoundedRect(QRectF(0, 0, Resource::CtrlPort_Width, Resource::CtrlPort_Height), Resource::Radius, Resource::Radius);
83 void SceneCtrlPortItem::setText(QString label)
86 _text = new SceneTextItem(_scene,
91 SceneNodeItem* SceneCtrlPortItem::getParentNode()
94 return dynamic_cast<SceneNodeItem*>(_parent->getParent());
99 SubjectNode* SceneCtrlPortItem::getSubjectNode()
101 SceneNodeItem* nodeItem = getParentNode();
102 if (!nodeItem) return 0;
103 return dynamic_cast<SubjectNode*>(nodeItem->getSubject());
106 QString SceneCtrlPortItem::getMimeFormat()
108 return "yacs/subjectGate";
111 void SceneCtrlPortItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
113 DEBTRACE("SceneCtrlPortItem::mousePressEvent " << _label.toStdString()
114 << " " << acceptedMouseButtons ());
115 if (!_scene->isZooming())
117 getSubjectNode()->select(true);
118 if (_dragable && (event->button() == _dragButton) && QtGuiContext::getQtCurrent()->isEdition())
120 setCursor(Qt::ClosedHandCursor);
122 _dragModifier= event->modifiers() & Qt::ControlModifier;
128 * creation of mime data if drag detected.
129 * setData mime type must be coherent with SchemaModel::mimeTypes to allow drop
130 * on port item in tree view
132 void SceneCtrlPortItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
136 //DEBTRACE("_draging");
137 if (QLineF(event->screenPos(),
138 event->buttonDownScreenPos(_dragButton)).length()
139 < QApplication::startDragDistance())
144 QDrag *drag = new QDrag(event->widget());
145 ItemMimeData *mime = new ItemMimeData;
146 drag->setMimeData(mime);
147 mime->setSubject(getSubjectNode());
148 mime->setData(getMimeFormat(), "_subject");
150 QPixmap pixmap(34, 34);
151 pixmap.fill(Qt::white);
153 QPainter painter(&pixmap);
154 painter.translate(15, 15);
155 painter.setRenderHint(QPainter::Antialiasing);
156 paint(&painter, 0, 0);
159 pixmap.setMask(pixmap.createHeuristicMask());
161 drag->setPixmap(pixmap);
162 drag->setHotSpot(QPoint(15, 20));
165 setCursor(Qt::ArrowCursor);
167 _dragModifier= false;
171 void SceneCtrlPortItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
175 setCursor(Qt::ArrowCursor);
178 _dragModifier= false;