Salome HOME
Fix compilation problem with OCCT 6.7.0
[modules/hexablock.git] / src / HEXABLOCKGUI / HEXABLOCKGUI_DocumentDelegate.cxx
1
2 // Copyright (C) 2009-2013  CEA/DEN, EDF R&D
3 //
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
8 //
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 // Lesser General Public License for more details.
13 //
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 //
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 //
20 #include <iostream>
21 #include <QtGui>
22 #include <qpixmap.h>
23 #include <qrect.h>
24 #include <qstyle.h>
25
26
27 #include "utilities.h"
28 #include "HEXABLOCKGUI.hxx"
29
30
31 #include "HEXABLOCKGUI_DocumentDelegate.hxx"
32
33 using namespace std;
34 using namespace HEXABLOCK::GUI;
35
36
37 //QWidget* currentEditor = NULL;
38
39 DocumentDelegate::DocumentDelegate(QDockWidget *dw, QObject *parent)
40     : QItemDelegate(parent),
41       _dw(dw),
42       _currentEditor(NULL)
43 {
44 }
45
46
47 QWidget *DocumentDelegate::createEditor( QWidget                    *parent,
48                                          const QStyleOptionViewItem &option,
49                                          const QModelIndex          &index ) const
50 {
51   //close current editor if there's one before creating a new one
52   if (_currentEditor != NULL)
53   {
54           delete _currentEditor;
55           _currentEditor = NULL;
56   }
57
58   HexaBaseDialog *editor = NULL;
59
60   if (_dw->widget()) _dw->widget()->close();
61   if ( !_dw->isVisible() ) _dw->setVisible(true);
62
63   switch ( index.data(HEXA_TREE_ROLE).toInt() )
64   {
65     case VERTEX_TREE :   editor = new VertexDialog(_dw, HexaBaseDialog::INFO_MODE);   break;
66     case EDGE_TREE :     editor = new EdgeDialog(_dw, HexaBaseDialog::INFO_MODE);     break;
67     case QUAD_TREE :     editor = new QuadDialog(_dw, HexaBaseDialog::INFO_MODE);     break;
68     case HEXA_TREE :     editor = new HexaDialog(_dw, HexaBaseDialog::INFO_MODE);     break;
69     case VECTOR_TREE :   editor = new VectorDialog(_dw, HexaBaseDialog::INFO_MODE);   break;
70
71 //    case ELEMENTS_DIR_TREE : trouver le type exact (cylinder ou pipe) et creer la boite d'info en fonction.
72
73     // * OBSOLETE ******
74 //    case CYLINDER_TREE : editor = new CylinderDialog(_dw, HexaBaseDialog::INFO_MODE);   break;
75 //    case PIPE_TREE :     editor = new PipeDialog(_dw, HexaBaseDialog::INFO_MODE);       break;
76     // ******************
77
78     case GROUP_TREE       : editor = new GroupDialog(_dw, HexaBaseDialog::INFO_MODE/*UPDATE_MODE*/); break;
79     case LAW_TREE         : editor = new LawDialog(_dw, HexaBaseDialog::INFO_MODE); break;
80     case PROPAGATION_TREE : editor = new PropagationDialog(_dw, HexaBaseDialog::INFO_MODE); break;
81   }
82
83   if ( editor != NULL )
84   {
85     HEXABLOCKGUI::assocInProgress = false;
86
87     //show the editor in the dockwidget
88     editor->resetSizeAndShow(_dw);
89   }
90   else
91           _dw->close();
92
93   _currentEditor = editor;
94
95   return editor;
96 }
97
98 //Close the current edition dialog
99 void DocumentDelegate::closeDialog()
100 {
101         if (_currentEditor!=NULL)
102         {
103                 _currentEditor->close();
104                 emit closeEditor(_currentEditor, NoHint); //Problem
105                 delete _currentEditor;
106                 _currentEditor = NULL;
107         }
108 }
109
110 void DocumentDelegate::setEditorData( QWidget *editor,
111                                       const QModelIndex &index) const
112 {
113   HexaBaseDialog* hexaEditor = dynamic_cast<HexaBaseDialog*>( editor );
114   if (hexaEditor == NULL) return;
115   DocumentModel* documentModel = hexaEditor->getDocumentModel();
116   if (documentModel == NULL) return;
117
118   switch ( index.data(HEXA_TREE_ROLE).toInt() ){
119     case VERTEX_TREE : {
120       HEXA_NS::Vertex *value = documentModel->getHexaPtr<HEXA_NS::Vertex *>(index);
121       VertexDialog *vertexEditor = static_cast<VertexDialog*>(editor);
122       vertexEditor->setValue(value);
123     }
124     break;
125     case EDGE_TREE : {
126       HEXA_NS::Edge *value = documentModel->getHexaPtr<HEXA_NS::Edge*>(index);
127       EdgeDialog *edgeEditor = static_cast<EdgeDialog*>(editor);
128       edgeEditor->setValue(value);
129     }
130     break;
131     case QUAD_TREE : {
132       HEXA_NS::Quad *value = documentModel->getHexaPtr<HEXA_NS::Quad*>(index);
133       QuadDialog *quadEditor = static_cast<QuadDialog*>(editor);
134       quadEditor->setValue(value);
135     }
136     break;
137     case HEXA_TREE : {
138       HEXA_NS::Hexa *value = documentModel->getHexaPtr<HEXA_NS::Hexa*>(index);
139       HexaDialog *hexaEditor = static_cast<HexaDialog*>(editor);
140       hexaEditor->setValue(value);
141     }
142     break;
143     case VECTOR_TREE : {
144       HEXA_NS::Vector *value = documentModel->getHexaPtr<HEXA_NS::Vector*>(index);
145       VectorDialog *vectorEditor = static_cast<VectorDialog*>(editor);
146       vectorEditor->setValue(value);
147     }
148     break;
149
150     /*
151     case ELEMENTS_DIR_TREE : {
152         HEXA_NS::Elements* value = documentModel->getHexaPtr<HEXA_NS::Elements*>(index);
153         // trouver le type exact (cylinder ou pipe) pour choisir le bon editor
154         // editor->setValue(value)
155     }
156     break;
157     */
158
159     // ************ OBSOLETE ********************
160 //    case CYLINDER_TREE : {
161 //      HEXA_NS::Cylinder *value = documentModel->getHexaPtr<HEXA_NS::Cylinder*>(index);
162 //      CylinderDialog *cylinderEditor = static_cast<CylinderDialog*>(editor);
163 //      cylinderEditor->setValue(value);
164 //    }
165 //    break;
166 //    case PIPE_TREE : {
167 //      HEXA_NS::Pipe *value = documentModel->getHexaPtr<HEXA_NS::Pipe*>(index);
168 //      PipeDialog *pipeEditor= static_cast<PipeDialog*>(editor);
169 //      pipeEditor->setValue(value);
170 //    }
171 //    break;
172     // ************ FIN OBSOLETE *****************
173
174     case GROUP_TREE : {
175       HEXA_NS::Group *value = index.data( HEXA_DATA_ROLE ).value< HEXA_NS::Group* >();
176       GroupDialog *groupEditor = static_cast<GroupDialog*>(editor);
177       groupEditor->setValue(value);
178     }
179     break;
180     case LAW_TREE : {
181       HEXA_NS::Law *value = index.data( HEXA_DATA_ROLE ).value< HEXA_NS::Law* >();
182       LawDialog *lawEditor = static_cast<LawDialog*>(editor);
183       lawEditor->setValue(value);
184     }
185     break;
186     case PROPAGATION_TREE : {
187       HEXA_NS::Propagation *value = index.data( HEXA_DATA_ROLE ).value< HEXA_NS::Propagation* >();
188       PropagationDialog *propagationEditor = static_cast<PropagationDialog*>(editor);
189       propagationEditor->setValue(value);
190     }
191     break;
192   }
193 }
194
195
196 bool DocumentDelegate::editorEvent ( QEvent                     *event,
197                                      QAbstractItemModel         *model,
198                                      const QStyleOptionViewItem &option,
199                                      const QModelIndex          &index )
200 {
201         return QItemDelegate::editorEvent ( event, model, option, index );
202 }
203
204 bool DocumentDelegate::eventFilter ( QObject * editor, QEvent * event )
205 {
206         if ( event->type() == QEvent::FocusOut ){
207                 return true; //do nothing for this signal
208         }
209         else if (event->type() == QEvent::HideToParent && editor != NULL)
210         {
211             //close the current editor when the tree is reduced
212             ((QWidget*) editor->parent())->close();
213         }
214
215         return false;
216 }