Salome HOME
0f183e5538e165ef6b5ba4ddb5f369abaf56a273
[modules/shaper.git] / src / PartSet / PartSet_SketcherReentrantMgr.h
1 // Copyright (C) 2014-2023  CEA/DEN, EDF R&D
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 PartSet_SketcherReentrantMgr_H
21 #define PartSet_SketcherReentrantMgr_H
22
23 #include "PartSet.h"
24
25 #include <ModelAPI_Feature.h>
26
27 #include <string>
28 #include <memory>
29
30 #include <QObject>
31
32 class ModuleBase_IWorkshop;
33 class ModuleBase_Operation;
34 class ModuleBase_ModelWidget;
35 class ModuleBase_IViewWindow;
36
37 class ModelAPI_CompositeFeature;
38
39 class QMouseEvent;
40
41 class XGUI_Workshop;
42 class PartSet_Module;
43 class ModuleBase_ViewerPrs;
44 class Events_Message;
45 class ModelAPI_Attribute;
46 class GeomAPI_Pnt2d;
47
48 /// \ingroup PartSet_SketcherReentrantMgr
49 /// It provides reentrant create operations in sketch, that is when all inputs are valid,
50 /// automatic validation of the creation and switch the created entity to edit mode
51 /// ('internal' edit operation), with the ability to simultaneously create the next entity
52 /// of same type (re-entrance of the operation).
53 /// OK valids the current edition and exits from the operation (no re-entrance).
54 /// Cancel removes (undo) the entity currently edited and
55 /// exits from the operation (no re-entrance).
56 class PARTSET_EXPORT PartSet_SketcherReentrantMgr : public QObject
57 {
58 Q_OBJECT
59
60 /// Enumeration to specify the restart operation properties.
61 enum RestartingMode {
62   RM_None, /// the operation should not be restarted
63   RM_Forbided, /// the operation should not be restarted after there is no active widget
64   RM_LastFeatureUsed, /// the operation is restarted and use
65                       /// the previous feature for own initialization
66   RM_EmptyFeatureUsed /// the operation is restarted and does not use the previous feature
67 };
68
69 public:
70   /// Constructor
71   /// \param theWorkshop a workshop instance
72   PartSet_SketcherReentrantMgr(ModuleBase_IWorkshop* theWorkshop);
73   virtual ~PartSet_SketcherReentrantMgr();
74
75 public:
76   /// Return true if the current edit operation is an internal
77   bool isInternalEditActive() const;
78
79   /// Stop internal edit if the operation feature is invalid
80   void updateInternalEditActiveState();
81
82   /// if the internal flags allow it and the manager is active, it starts an internal edit operation
83   /// for the created operation.
84   /// \param thePreviousAttributeID an index of the previous active attribute
85   //bool restartOperation(const std::string& thePreviousAttributeID);
86   bool processEnter(const std::string& thePreviousAttributeID);
87
88   /// Resets the internal flags
89   /// \param theOperation a started operation
90   void operationStarted(ModuleBase_Operation* theOperation);
91
92   /// Resets the internal flags
93   /// \param theOperation a started operation
94   /// \return state whether the internal edit operation was active
95   bool operationCommitted(ModuleBase_Operation* theOperation);
96
97   /// Resets the internal flags
98   /// \param theOperation a started operation
99   void operationAborted(ModuleBase_Operation* theOperation);
100
101   /// Return true if the manager processes the mouse move event
102   /// It happens if the current operation is an internal edit operation and the first
103   /// control can be filled by the mouse move event. The operation is restarted.
104   /// \return true if operation is committed.
105   bool processMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
106
107   /// Return true if the manager processes the mouse press event
108   /// \return true if the current operation is an internal edit operation.
109   bool processMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
110
111   /// Return true if the manager processes the mouse enter event
112   /// It happens if the current operation is an internal edit operation.
113   /// The operation is restarted. If the first widget of the started operation is
114   /// the point 2d, it processes this mouse event
115   /// \return true if operation is committed.
116   bool processMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
117
118   /// It is called by the current operation filling with the preselection.
119   /// Returns false if the reentrant mode of the operation is not empty.
120   bool canBeCommittedByPreselection();
121
122   /// Fills reentrant message during restarting operation
123   /// \param theMessage reentrant message
124   void setReentrantMessage(const std::shared_ptr<Events_Message>& theMessage)
125   { myReentrantMessage = theMessage; }
126
127   /// Returnss reentrant message
128   std::shared_ptr<Events_Message> reentrantMessage() const { return myReentrantMessage; }
129
130   /// Put current selection into reentrant message
131   /// \param theMessage a message of reentrant operation
132   void setReentrantPreSelection(const std::shared_ptr<Events_Message>& theMessage);
133
134   bool isAutoConstraints() const { return myIsAutoConstraints; }
135
136
137   bool isLastAutoConstraint(const ObjectPtr& theObj) const;
138
139 public slots:
140   /// The slot is called when user checks "Automatic constraints" button
141   /// \param isOn a state of the check box
142   void onAutoConstraints(bool isOn);
143
144
145 private slots:
146   /// SLOT, that is called by a widget activating in the property panel
147   /// If the 'internal' edit operation is started, it activates the first widget selection
148   //void onWidgetActivated();
149
150   /// SLOT, that is called by no more widget signal emitted by property panel
151   /// Start an internal edit operation or, if the internal flag is forbided, commits
152   /// the current operation
153   /// \param thePreviousAttributeID an index of the previous active attribute
154   void onNoMoreWidgets(const std::string& thePreviousAttributeID);
155
156   /// Processing of vertex selected. Set an internal reentrant flag to forbiddent state if
157   /// the current feature is a line and there are not obligate widgets anymore
158   void onVertexSelected();
159
160   /// Listens to the signal about the modification of the values
161   /// have been done in the property panel. If the manager has active edit operation and
162   /// the active widget does not process the modification of value, the manager will
163   /// restart current operation and fill a new feature attribute by the value of current
164   /// widget
165   void onAfterValuesChangedInPropertyPanel();
166
167   /// Deactivates selection and filters of the first operation widget if it is an internal
168   /// 'edit' operation
169   void onBeforeStopped();
170
171 private:
172   /// Returns true if the current operation is a sketch or a nested sketch operation
173   bool isActiveMgr() const;
174
175   /// Sets the focus to the last control of the property panel and activates selection
176   /// of the first widget to can select first value of the next create operation
177   /// \param thePreviousAttributeID an index of the previous attribute to set focus to this widget
178   /// \return true if it is started
179   bool startInternalEdit(const std::string& thePreviousAttributeID);
180
181   /// Disconnects this manager from operation signals, deactivate selection of the first control
182   /// in the viewer.
183   void beforeStopInternalEdit();
184
185   /// Commits the current operation and launches a new with the commited operation feature index
186   void restartOperation();
187
188   /// Creates an internal feature and controls to process it
189   void createInternalFeature();
190
191   /// A pair method for an internal creation to remove it and clear all created controls
192   void deleteInternalFeature();
193
194   /// Breaks sequense of automatically resterted operations
195   void resetFlags();
196
197   /// Copy some feature specific attributes from the source to a new feature
198   /// This is type for Circle and Arc features
199   /// \param theSourceFeature a source feature
200   /// \param theNewFeature a new feature
201   /// \param theSketch an active sketch
202   /// \param isTemporary is used to do not create additional features(e.g. coincidence for line)
203   /// \return true is something is copied
204   static bool copyReetntrantAttributes(const FeaturePtr& theSourceFeature,
205                                       const FeaturePtr& theNewFeature,
206                                       const std::shared_ptr<ModelAPI_CompositeFeature>& theSketch,
207                                       const bool isTemporary = false);
208
209   /// Checks whethe the feature of the given operation has kind an arc and the arc type is tangent
210   bool isTangentArc(ModuleBase_Operation* theOperation,
211                     const std::shared_ptr<ModelAPI_CompositeFeature>& /*theSketch*/) const;
212
213   /// Accept All action is enabled if an internal edit is started.
214   /// It updates the state of the button
215   void updateAcceptAllAction();
216
217   /// Returns the workshop
218   XGUI_Workshop* workshop() const;
219
220   /// Returns the workshop module
221   PartSet_Module* module() const;
222
223   void setInternalActiveWidget(ModuleBase_ModelWidget* theWidget);
224
225   void addConstraints(const FeaturePtr& theFeature);
226
227 private:
228   ModuleBase_IWorkshop* myWorkshop; /// the workshop
229
230   RestartingMode myRestartingMode;  /// automatical restarting mode flag
231   bool myIsFlagsBlocked; /// true when reset of flags should not be perfromed
232   bool myIsInternalEditOperation; /// true when the 'internal' edit is started
233
234   FeaturePtr myPreviousFeature; /// feature of the previous operation, which is restarted
235   FeaturePtr myInternalFeature;
236   QWidget* myInternalWidget;
237   std::string myNoMoreWidgetsAttribute;
238
239   std::shared_ptr<Events_Message> myReentrantMessage; /// message obtained by operation restart
240   ObjectPtr mySelectedObject; /// cashed selected object
241   std::shared_ptr<ModelAPI_Attribute> mySelectedAttribute; /// cashed selected attribute
242   std::shared_ptr<GeomAPI_Pnt2d> myClickedSketchPoint; /// cashed clicked point
243
244   bool myIsAutoConstraints;
245   void* myLastAutoConstraint; //< Stores address of last automatic constraint.
246                               //< Cannot be used as a pointer!!!
247 };
248
249 #endif