Salome HOME
Merge branch 'Dev_1.1.1' of newgeom:newgeom into Dev_1.2.0
[modules/shaper.git] / src / ModuleBase / ModuleBase_Operation.h
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 /*
4  * ModuleBase_Operation.h
5  *
6  *  Created on: Apr 2, 2014
7  *      Author: sbh
8  */
9
10 #ifndef ModuleBase_Operation_H
11 #define ModuleBase_Operation_H
12
13 #include <ModuleBase.h>
14 #include <ModuleBase_ViewerPrs.h>
15
16 #include <ModelAPI_CompositeFeature.h>
17 #include <ModelAPI_Document.h>
18
19 #include <QObject>
20 #include <QString>
21 #include <QStringList>
22
23 class ModuleBase_ModelWidget;
24 class ModuleBase_OperationDescription;
25 class ModuleBase_IPropertyPanel;
26 class ModuleBase_ISelection;
27 class ModuleBase_IViewer;
28
29 class QKeyEvent;
30
31 /*!
32  * \class ModuleBase_Operation
33  * \ingroup GUI
34  * \brief Base class for all operations
35  *
36  *  Base class for all operations. If you perform an action it is reasonable to create
37  *  operation intended for this. This is a base class for all operations which provides
38  *  mechanism for correct starting operations, starting operations above already started
39  *  ones, committing operations and so on. To create own operation it is reasonable to
40  *  inherit it from this class and redefines virtual methods to provide own behavior
41  *  Main virtual methods are
42  *  - virtual bool      isReadyToStart();
43  *  - virtual void      startOperation();
44  *  - virtual void      abortOperation();
45  *  - virtual void      commitOperation();
46  */
47
48 class MODULEBASE_EXPORT ModuleBase_Operation : public QObject
49 {
50 Q_OBJECT
51
52  public:
53
54   /// Appends to operation's history id, if it is an "edit" operation (myIsEditing == true)
55   static QString EditSuffix() { return "_E"; }
56   /// Constructor
57   /// \param theId the operation identifier
58   /// \param theParent the QObject parent
59   ModuleBase_Operation(const QString& theId = "", QObject* theParent = 0);
60   /// Destructor
61   virtual ~ModuleBase_Operation();
62
63   /// Returns the operation description
64   /// /returns the instance of the description class
65   ModuleBase_OperationDescription* getDescription() const { return myDescription; }
66
67   /**
68   * Must return true if this operation can be launched as nested for any current operation
69   * and it is not necessary to check this operation on validity. By default 
70   * the operation is not granted.
71   * The method has to be redefined for granted operations.
72   */
73   virtual bool isGranted(QString theId) const;
74
75
76   /// Returns True if data of its feature was modified during operation
77   virtual bool isModified() const { return myIsModified; }
78
79   /// Returns True id the current operation is launched in editing mode
80   bool isEditOperation() const { return myIsEditing; }
81
82   /// Returns list of nested features
83   QStringList nestedFeatures() const { return myNestedFeatures; }
84
85   /// Sets list of nested features
86   void setNestedFeatures(const QStringList& theList) { myNestedFeatures = theList; }
87
88
89   /// Returns operations Id from it's description
90   QString id() const;
91
92   /// Returns the operation feature
93   /// \return the feature
94   FeaturePtr feature() const;
95
96   /**
97   * Must return True if the operation's feature is valid.
98   * Since IOperation does not have any feature returns false.
99   */
100   virtual bool isValid() const;
101
102   /// Sets the operation feature
103   void setFeature(FeaturePtr theFeature);
104
105   /// Returns True if the current operation works with the given object (feature or result)
106   virtual bool hasObject(ObjectPtr theObj) const;
107
108   /// Initialisation of operation with preliminary selection
109   /// \param theSelection an instance of Selection class
110   /// \param theViewer a viewer to have the viewer the eye position
111   virtual void initSelection(ModuleBase_ISelection* theSelection,
112                              ModuleBase_IViewer* theViewer);
113
114   /// \brief Set property pane to the operation
115   /// \param theProp a property panel instance
116   virtual void setPropertyPanel(ModuleBase_IPropertyPanel* theProp);
117
118   /// \return Currently installed property panel
119   ModuleBase_IPropertyPanel* propertyPanel() const { return myPropertyPanel; }
120
121   /// Activates widgets by preselection if it is accepted. Emits signal if the activation is correct
122   virtual void activateByPreselection();
123
124   /// If the operation works with feature which is sub-feature of another one
125   /// then this variable has to be initialised by parent feature 
126   /// before operation feature creating
127   void setParentFeature(CompositeFeaturePtr theParent);
128
129   /// \return Installed parent feature (can be NULL)
130   CompositeFeaturePtr parentFeature() const;
131
132 signals:
133   /// The operation is started
134   void started();  
135
136   /// The operation is aborted
137   void aborted();  
138
139   /// The operation is committed
140   void committed();  
141
142   /// The operation is aborted or committed
143   void stopped();  
144
145   /// The operation is resumed
146   void resumed();  
147
148   /// The operation is postponed
149   void postponed();  
150
151   /// The operation is triggered
152   /// \param theState a new triggered state
153   void triggered(bool theState);
154
155   /// The operation is filled with existing preselection
156   void activatedByPreselection(); 
157
158  public slots:
159   /// Starts operation
160   /// Public slot. Verifies whether operation can be started and starts operation.
161   /// This slot is not virtual and cannot be redefined. Redefine startOperation method
162   /// to change behavior of operation. There is no point in using this method. It would
163   /// be better to inherit own operator from base one and redefine startOperation method
164   /// instead.
165   void start();
166
167   /// Deactivates current operation which can be resumed later.
168   void postpone();
169
170   /// Resumes operation
171   /// Public slot. Verifies whether operation can be started and starts operation.
172   /// This slot is not virtual and cannot be redefined. Redefine startOperation method
173   /// to change behavior of operation. There is no point in using this method. It would
174   /// be better to inherit own operator from base one and redefine startOperation method
175   /// instead.
176   void resume();
177
178   /// Aborts operation
179   /// Public slot. Aborts operation. This slot is not virtual and cannot be redefined.
180   /// Redefine abortOperation method to change behavior of operation instead
181   void abort();
182
183   /// Commits operation
184   /// Public slot. Commits operation. This slot is not virtual and cannot be redefined.
185   /// Redefine commitOperation method to change behavior of operation instead
186   bool commit();
187
188   /// Alias for start/abort slots
189   /// Public slot. Aborts operation if false, else does nothing.
190   /// Provided for S/S compatibility with QAction's toggle(bool)
191   /// \param theState th flag to abort, if it is true, do nothing, overwise abort
192   void setRunning(bool theState);
193
194  protected:
195   /// Virtual method called when operation started (see start() method for more description)
196   /// Default impl calls corresponding slot and commits immediately.
197    virtual void startOperation() {}
198
199   /// Implementation of specific steps on postpone operation
200   virtual void postponeOperation() {}
201
202   /// Virtual method called when operation stopped - committed or aborted.
203   virtual void stopOperation() {}
204
205   /// Virtual method called when operation aborted (see abort() method for more description)
206   virtual void abortOperation() {}
207
208   /// Virtual method called when operation committed (see commit() method for more description)
209   virtual void commitOperation() {}
210
211   /// Virtual method called after operation committed (see commit() method for more description)
212   virtual void afterCommitOperation() {}
213
214   /// Virtual method called after operation resume (see resume() method for more description)
215   virtual void resumeOperation() {}
216
217   /// Creates an operation new feature
218   /// \param theFlushMessage the flag whether the create message should be flushed
219   /// \returns the created feature
220   virtual FeaturePtr createFeature(const bool theFlushMessage = true);
221
222   /// Verifies whether this operator can be commited.
223   /// \return Returns TRUE if current operation can be committed, e.g. all parameters are filled
224   virtual bool canBeCommitted() const;
225
226   /// Return a widget value point by the selection and the viewer position
227   /// The default realization returns false
228   /// \param thePrs the presentation
229   /// \param theViewer a viewer to have the viewer the eye position
230   /// \param theX the horizontal coordinate
231   /// \param theY the vertical coordinate
232   /// \return true if the point exits in the selection
233   virtual bool getViewerPoint(ModuleBase_ViewerPrs thePrs,
234                                    ModuleBase_IViewer* theViewer,
235                                    double& theX, double& theY);
236
237   /// Removes the preselection information and clears the map of preselection
238   void clearPreselection();
239
240  protected:
241    /// The operation feature to be handled
242   FeaturePtr myFeature;  
243
244   /// the container to have the operation description
245   ModuleBase_OperationDescription* myDescription;  
246
247   /// Editing feature flag
248   bool myIsEditing;
249
250   /// Modified feature flag
251   bool myIsModified;
252
253   /// List of nested operations IDs
254   QStringList myNestedFeatures;
255
256   /// List of pre-selected object 
257   QList<ModuleBase_ViewerPrs> myPreSelection;
258
259   /// Access to property panel
260   ModuleBase_IPropertyPanel* myPropertyPanel;
261
262   /// If the operation works with feature which is sub-feature of another one
263   /// then this variable has to be initialised by parent feature 
264   /// before operation feature creating
265   CompositeFeaturePtr myParentFeature;  
266
267   /// Last current feature before editing operation
268   FeaturePtr myCurrentFeature;
269 };
270
271 #endif