Salome HOME
Merge remote-tracking branch 'origin/pre/hydro/imps_2017' into hydro/imps_2017_salome_83
[modules/geom.git] / src / CurveCreator / CurveCreator_Widget.h
1 // Copyright (C) 2013-2016  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
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, or (at your option) any later version.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #ifndef CURVECREATOR_WIDGET_H
21 #define CURVECREATOR_WIDGET_H
22
23 #include "CurveCreator_Macro.hxx"
24 #include "CurveCreator.hxx"
25 #include "CurveCreator_ICurve.hxx"
26
27 #include <SUIT_ViewWindow.h>
28 #include <OCCViewer_ViewWindow.h>
29
30 #include <AIS_InteractiveObject.hxx>
31 #include <AIS_InteractiveContext.hxx>
32 #include <AIS_ListOfInteractive.hxx>
33 #include <Geom_Curve.hxx>
34 #include <V3d_View.hxx>
35 #include <gp_Pnt.hxx>
36
37 #include <QWidget>
38 #include <QMap>
39
40 class CurveCreator_TableView;
41 class CurveCreator_TreeView;
42 class CurveCreator_NewSectionDlg;
43
44 class OCCViewer_Viewer;
45 class OCCViewer_ViewPort3d;
46
47 class QAction;
48 class QPixmap;
49
50 class CURVECREATOR_EXPORT CurveCreator_Widget : public QWidget
51 {
52   Q_OBJECT
53
54 public:
55   enum ActionFlags {
56     NoFlags              = 0x00000000,
57     DisableDetectionMode = 0x00000001,
58     DisableNewSection    = 0x00000002,
59     DisableClosedSection = 0x00000004
60   };
61
62   enum ActionMode {
63     NoneMode,
64     AdditionMode,
65     ModificationMode,
66     DetectionMode
67   };
68
69 public:
70   explicit CurveCreator_Widget( QWidget* parent,
71                                 CurveCreator_ICurve *theCurve,
72                                 const int theActionFlags = NoFlags,
73                                 const QStringList& theCoordTitles = QStringList(),
74                                 Qt::WindowFlags fl=0,
75                                 int theLocalPointRowLimit = 20);
76
77   // OCC viewer manipulation
78   void setOCCViewer( OCCViewer_Viewer* theViewer );
79
80   Handle(AIS_InteractiveContext) getAISContext();
81   OCCViewer_ViewPort3d* getViewPort();
82   int changeInteractionStyle( int theStyle );
83
84   void reset();
85   void setCurve( CurveCreator_ICurve* theCurve );
86
87   QList<int> getSelectedSections();
88   void setSelectedSections( const QList<int>& theSections );
89
90   void  removeSelected();
91   bool  removeEnabled();
92
93   void setActionMode( const ActionMode& theMode );
94   ActionMode getActionMode() const;
95
96   void SetViewer2DMode(const bool To2D);
97
98   void setSelectedPoints( const CurveCreator_ICurve::SectionToPointList& =
99                                CurveCreator_ICurve::SectionToPointList() );
100
101   void updateLocalPointView();
102   void setLocalPointContext( const bool theOpen, const bool isUpdateTable = false );
103
104 signals:
105   void selectionChanged();
106   void subOperationStarted( QWidget*, bool );
107   void subOperationFinished( QWidget* );
108
109 public slots:
110   void     onAdditionMode(bool checked);
111   void     onModificationMode(bool checked);
112   void     onDetectionMode(bool checked);
113   void     onModeChanged(bool checked);
114   void     onNewSection();
115   void     onSelectionChanged();
116   void     onAddNewSection();
117   void     onEditSection( int theSection );
118   void     onModifySection();
119   void     onCancelSection();
120   void     onJoin();
121   void     onBringTogether();
122   void     onRemove();
123   void     onClearAll();
124   void     onJoinAll();
125   void     onSetSpline();
126   void     onSetPolyline();
127   void     onCloseSections();
128   void     onUncloseSections();
129   void     onUndo();
130   void     onRedo();
131   void     onUndoSettings();
132   void     onContextMenu(QPoint thePoint);
133
134   void     onMousePress( SUIT_ViewWindow*, QMouseEvent* theEvent );
135   void     onMouseRelease( SUIT_ViewWindow*, QMouseEvent* theEvent );
136   void     onMouseMove( SUIT_ViewWindow*, QMouseEvent* theEvent );
137   void     onLastViewClosed( SUIT_ViewManager* theManager );
138
139   void     onMousePress( QMouseEvent* theEvent );
140   void     onMouseRelease( QMouseEvent* theEvent );
141   void     onMouseMove( QMouseEvent* theEvent );
142
143   void     onCellChanged( int theRow, int theColumn );
144
145 protected:
146   void     addCoordsByClick( QMouseEvent* );
147
148 protected:
149   enum ActionId{ NONE_ID,
150                  UNDO_ID, 
151                  REDO_ID, 
152                  NEW_SECTION_ID, 
153                  ADDITION_MODE_ID, 
154                  REMOVE_ID, 
155                  REMOVE_ALL_ID, 
156                  JOIN_ID,
157                  JOIN_ALL_ID, 
158                  CLOSE_SECTIONS_ID, 
159                  UNCLOSE_SECTIONS_ID,
160                  SET_SECTIONS_POLYLINE_ID, 
161                  SET_SECTIONS_SPLINE_ID, 
162                  CLEAR_ALL_ID, 
163                  SEPARATOR_ID, 
164                  MODIFICATION_MODE_ID, 
165                  DETECTION_MODE_ID,
166                  BRING_TOGETHER_ID
167   };
168
169 public:
170   QAction* getAction(ActionId theId);
171   QAction* getAction(ActionMode theMode);
172
173 private:
174   OCCViewer_Viewer* getOCCViewer();
175
176   QAction* createAction( ActionId theId, const QString& theName, const QPixmap& theImage,
177                          const QString& theToolTip, const QKeySequence& theShortcut );
178
179   void updateActionsStates();
180   void updateUndoRedo();
181
182   void removeSection();
183   void removePoint();
184   void addNewPoint(const CurveCreator::Coordinates& theCoords);
185   void insertPointToSelectedSegment( const int theXPosition,
186                                      const int theYPosition );
187   void moveSelectedPoints( const int theXPosition, const int theYPosition );
188
189   void setDragStarted( const bool theState, const QPoint& thePoint = QPoint() );
190
191   void getSelectedPoints( CurveCreator_ICurve::SectionToPointList& thePoints );
192
193   void stopActionMode();
194
195   void startCurveModification( CurveCreator_ICurve::SectionToPointList& thePoints,
196                                const bool theFillPoints = true );
197   void finishCurveModification( const CurveCreator_ICurve::SectionToPointList& thePoints = 
198                                       CurveCreator_ICurve::SectionToPointList() );
199
200   // curve algorithm
201   int  findLocalPointIndex( int theSectionId, double theX, double theY );
202   void findSectionsToPoints( const double theX, const double theY,
203                              CurveCreator_ICurve::SectionToPointList& thePoints );
204   void convert( const CurveCreator_ICurve::SectionToPointList& thePoints,
205                 QMap<int, QList<int> >& theConvPoints );
206
207   bool contains( const CurveCreator_ICurve::SectionToPointList& theList,
208                  const CurveCreator_ICurve::SectionToPoint& theValue ) const;
209
210 protected:
211   // Boundary points of mouse to select the points
212   QPoint myStartPoint;
213   QPoint myEndPoint;
214
215 private:
216   QMap<ActionId, QAction*>    myActionMap;
217   CurveCreator_ICurve*        myCurve;
218   CurveCreator_TreeView*      mySectionView;
219   CurveCreator_TableView*     myLocalPointView;
220   CurveCreator_ICurve::SectionToPointList myLocalPoints;
221   CurveCreator_NewSectionDlg* myNewSectionEditor;
222   OCCViewer_Viewer*           myOCCViewer;
223   int                         myLocalPointRowLimit;
224   int                         mySection;
225   int                         myPointNum;
226   bool                        myDragStarted;
227   QPoint                      myDragStartPosition;
228   int                         myDragInteractionStyle;
229   CurveCreator_ICurve::SectionToPointList myDragPoints;
230   QMap<CurveCreator_ICurve::SectionToPoint, CurveCreator::Coordinates> myInitialDragPointsCoords;
231   bool                        myDragged;
232   QByteArray                  myGuiState;
233   OCCViewer_ViewWindow::Mode2dType myOld2DMode;
234 };
235
236 #endif // CURVECREATOR_WIDGET_H