]> Creatis software - cpPlugins.git/blob - lib/cpPipelineEditor/Block.cxx
...
[cpPlugins.git] / lib / cpPipelineEditor / Block.cxx
1 #include "Block.h"\r
2 \r
3 #include <QPen>\r
4 #include <QGraphicsScene>\r
5 #include <QGraphicsSceneContextMenuEvent>\r
6 #include <QFontMetrics>\r
7 #include <QMenu>\r
8 #include <QPainter>\r
9 #include <QStyleOptionGraphicsItem>\r
10 #include <QGraphicsWidget>\r
11 \r
12 #include "Port.h"\r
13 #include "Connection.h"\r
14 #include "Editor.h"\r
15 \r
16 // -------------------------------------------------------------------------\r
17 cpPipelineEditor::Block::\r
18 Block( TFilter* filter, QGraphicsItem* parent, QGraphicsScene* scene )\r
19   : Superclass( parent, scene ),\r
20     m_HorzMargin( 20 ),\r
21     m_VertMargin( 5 ),\r
22     m_NamePort( NULL ),\r
23     m_TypePort( NULL ),\r
24     m_Filter( filter ),\r
25     m_Editor( NULL )\r
26 {\r
27   QPainterPath p;\r
28   p.addRoundedRect( -50, -15, 100, 30, 5, 5 );\r
29 \r
30   this->setPath( p );\r
31   this->setPen( QPen( Qt::darkGreen ) );\r
32   this->setBrush( Qt::green );\r
33   this->setFlag( QGraphicsItem::ItemIsMovable );\r
34   this->setFlag( QGraphicsItem::ItemIsSelectable );\r
35 \r
36   this->m_Width = this->m_HorzMargin;\r
37   this->m_Height = this->m_VertMargin;\r
38 \r
39   // Configure names\r
40   this->setNamePort( this->m_Filter->GetName( ) );\r
41   this->_setTypePort( this->m_Filter->GetClassName( ) );\r
42 \r
43   // Add input ports\r
44   auto inputs = this->m_Filter->GetInputsNames( );\r
45   for( auto iIt = inputs.begin( ); iIt != inputs.end( ); ++iIt )\r
46     this->addInputPort( iIt->c_str( ) );\r
47 \r
48   // Add output ports\r
49   auto outputs = this->m_Filter->GetOutputsNames( );\r
50   for( auto oIt = outputs.begin( ); oIt != outputs.end( ); ++oIt )\r
51     this->addOutputPort( oIt->c_str( ) );\r
52 }\r
53 \r
54 // -------------------------------------------------------------------------\r
55 cpPipelineEditor::Block::\r
56 ~Block( )\r
57 {\r
58 }\r
59 \r
60 // -------------------------------------------------------------------------\r
61 cpPipelineEditor::Editor* cpPipelineEditor::Block::\r
62 editor( )\r
63 {\r
64   return( this->m_Editor );\r
65 }\r
66 \r
67 // -------------------------------------------------------------------------\r
68 const cpPipelineEditor::Editor* cpPipelineEditor::Block::\r
69 editor( ) const\r
70 {\r
71   return( this->m_Editor );\r
72 }\r
73 \r
74 // -------------------------------------------------------------------------\r
75 void cpPipelineEditor::Block::\r
76 setEditor( cpPipelineEditor::Editor* editor )\r
77 {\r
78   this->m_Editor = editor;\r
79 }\r
80 \r
81 // -------------------------------------------------------------------------\r
82 void cpPipelineEditor::Block::\r
83 setNamePort( const QString& txt )\r
84 {\r
85   if( this->m_NamePort == NULL )\r
86     this->m_NamePort = new NamePort( this );\r
87   this->m_NamePort->setName( txt );\r
88   this->_configPort( this->m_NamePort );\r
89 }\r
90 \r
91 // -------------------------------------------------------------------------\r
92 cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
93 addInputPort( const QString& txt )\r
94 {\r
95   InputPort* ip = new InputPort( this );\r
96   ip->setExtendedName(\r
97     (\r
98       txt.toStdString( ) +\r
99       std::string( "@" ) +\r
100       this->namePort( ).toStdString( )\r
101       ).c_str( )\r
102     );\r
103   ip->setName( txt );\r
104   this->m_InputPorts[ txt.toStdString( ) ] = ip;\r
105   this->_configPort( ip );\r
106   return( ip );\r
107 }\r
108 \r
109 // -------------------------------------------------------------------------\r
110 cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
111 addOutputPort( const QString& txt )\r
112 {\r
113   OutputPort* op = new OutputPort( this );\r
114   op->setExtendedName(\r
115     (\r
116       txt.toStdString( ) +\r
117       std::string( "@" ) +\r
118       this->namePort( ).toStdString( )\r
119       ).c_str( )\r
120     );\r
121   op->setName( txt );\r
122   this->m_OutputPorts[ txt.toStdString( ) ] = op;\r
123   this->_configPort( op );\r
124   return( op );\r
125 }\r
126 \r
127 // -------------------------------------------------------------------------\r
128 cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
129 inputPort( const QString& txt )\r
130 {\r
131   auto i = this->m_InputPorts.find( txt.toStdString( ) );\r
132   if( i != this->m_InputPorts.end( ) )\r
133     return( i->second );\r
134   else\r
135     return( NULL );\r
136 }\r
137 \r
138 // -------------------------------------------------------------------------\r
139 cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
140 outputPort( const QString& txt )\r
141 {\r
142   auto o = this->m_OutputPorts.find( txt.toStdString( ) );\r
143   if( o != this->m_OutputPorts.end( ) )\r
144     return( o->second );\r
145   else\r
146     return( NULL );\r
147 }\r
148 \r
149 // -------------------------------------------------------------------------\r
150 QString cpPipelineEditor::Block::\r
151 namePort( ) const\r
152 {\r
153   return( this->m_NamePort->name( ) );\r
154 }\r
155 \r
156 // -------------------------------------------------------------------------\r
157 const cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
158 inputPort( const QString& txt ) const\r
159 {\r
160   auto i = this->m_InputPorts.find( txt.toStdString( ) );\r
161   if( i != this->m_InputPorts.end( ) )\r
162     return( i->second );\r
163   else\r
164     return( NULL );\r
165 }\r
166 \r
167 // -------------------------------------------------------------------------\r
168 const cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
169 outputPort( const QString& txt ) const\r
170 {\r
171   auto o = this->m_OutputPorts.find( txt.toStdString( ) );\r
172   if( o != this->m_OutputPorts.end( ) )\r
173     return( o->second );\r
174   else\r
175     return( NULL );\r
176 }\r
177 \r
178 // -------------------------------------------------------------------------\r
179 void cpPipelineEditor::Block::\r
180 paint(\r
181   QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget\r
182   )\r
183 {\r
184   Q_UNUSED( option );\r
185   Q_UNUSED( widget );\r
186 \r
187   if( this->isSelected( ) )\r
188   {\r
189     painter->setPen( QPen( Qt::darkYellow ) );\r
190     painter->setBrush( Qt::yellow );\r
191   }\r
192   else\r
193   {\r
194     painter->setPen( QPen( Qt::darkGreen ) );\r
195     painter->setBrush( Qt::green );\r
196 \r
197   } // fi\r
198   painter->drawPath( this->path( ) );\r
199 }\r
200 \r
201 // -------------------------------------------------------------------------\r
202 QVariant cpPipelineEditor::Block::\r
203 itemChange( GraphicsItemChange change, const QVariant& value )\r
204 {\r
205   return( value );\r
206 }\r
207 \r
208 // -------------------------------------------------------------------------\r
209 void cpPipelineEditor::Block::\r
210 _setTypePort( const QString& txt )\r
211 {\r
212   /* TODO\r
213      if( this->m_TypePort == NULL )\r
214      this->m_TypePort = new TypePort( this );\r
215      this->m_TypePort->setName( txt );\r
216      this->_configPort( this->m_TypePort );\r
217   */\r
218   this->setToolTip( txt );\r
219 }\r
220 \r
221 // -------------------------------------------------------------------------\r
222 void cpPipelineEditor::Block::\r
223 _configPort( Port* port )\r
224 {\r
225   port->setBlock( this );\r
226 \r
227   QFontMetrics fm( this->scene( )->font( ) );\r
228   int w = fm.width( port->name( ) ) + ( 4 * port->radius( ) );\r
229   int h = fm.height( );\r
230   if( w > this->m_Width - this->m_HorzMargin )\r
231     this->m_Width = w + this->m_HorzMargin;\r
232   this->m_Height = this->m_InputPorts.size( ) + this->m_OutputPorts.size( );\r
233   this->m_Height += 4;\r
234   this->m_Height *= h;\r
235 \r
236   QPainterPath pth;\r
237   pth.addRoundedRect(\r
238     -this->m_Width / 2,\r
239     -this->m_Height / 2,\r
240     this->m_Width,\r
241     this->m_Height, 5, 5\r
242     );\r
243   this->setPath( pth );\r
244 \r
245   int y = -this->m_Height / 2 + this->m_VertMargin + port->radius( );\r
246   foreach( QGraphicsItem* i, this->children( ) )\r
247   {\r
248     Port* p = dynamic_cast< Port* >( i );\r
249     if( p == NULL )\r
250       continue;\r
251 \r
252     if( dynamic_cast< NamePort* >( i ) != NULL )\r
253       i->setPos( -this->m_Width / 2 + port->radius( ), y );\r
254     else if( dynamic_cast< TypePort* >( i ) != NULL )\r
255     {\r
256       i->setPos( -this->m_Width / 2 + port->radius( ), y );\r
257       y += h;\r
258     }\r
259     else if( dynamic_cast< InputPort* >( i ) != NULL )\r
260       i->setPos( -this->m_Width / 2 - 2 * port->radius( ), y );\r
261     else if( dynamic_cast< OutputPort* >( i ) != NULL )\r
262       i->setPos( this->m_Width / 2, y );\r
263     y += h;\r
264 \r
265   } // rof\r
266 }\r
267 \r
268 // -------------------------------------------------------------------------\r
269 void cpPipelineEditor::Block::\r
270 mouseReleaseEvent( QGraphicsSceneMouseEvent* evt )\r
271 {\r
272   if( this->m_Filter != NULL )\r
273     this->m_Filter->SetViewCoords(\r
274       this->scenePos( ).x( ), this->scenePos( ).y( )\r
275       );\r
276   this->Superclass::mouseReleaseEvent( evt );\r
277 }\r
278 \r
279 // -------------------------------------------------------------------------\r
280 void cpPipelineEditor::Block::\r
281 contextMenuEvent( QGraphicsSceneContextMenuEvent* evt )\r
282 {\r
283   QMenu menu;\r
284   QAction* configureAction = menu.addAction( "Configure" );\r
285   QAction* updateAction = menu.addAction( "Update" );\r
286   QAction* selectedAction = menu.exec( evt->screenPos( ) );\r
287 \r
288   if( selectedAction == configureAction )\r
289   {\r
290     auto res = this->m_Filter->ExecConfigurationDialog( NULL );\r
291   }\r
292   else if( selectedAction == updateAction )\r
293     this->m_Editor->updateFilter( this->namePort( ).toStdString( ) );\r
294 }\r
295 \r
296 // eof - $RCSfile$\r