1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
3 #ifndef PartSet_SketcherReentrantMgr_H
4 #define PartSet_SketcherReentrantMgr_H
8 #include <ModelAPI_Feature.h>
14 class ModuleBase_IWorkshop;
15 class ModuleBase_Operation;
16 class ModuleBase_ModelWidget;
17 class ModuleBase_IViewWindow;
19 class ModelAPI_CompositeFeature;
26 /// \ingroup PartSet_SketcherReentrantMgr
27 /// It provides reentrant create operations in sketch, that is when all inputs are valid,
28 /// automatic validation of the creation and switch the created entity to edit mode
29 /// ('internal' edit operation), with the ability to simultaneously create the next entity
30 /// of same type (re-entrance of the operation).
31 /// OK valids the current edition and exits from the operation (no re-entrance).
32 /// Cancel removes (undo) the entity currently edited and
33 /// exits from the operation (no re-entrance).
34 class PARTSET_EXPORT PartSet_SketcherReentrantMgr : public QObject
38 /// Enumeration to specify the restart operation properties.
40 RM_None, /// the operation should not be restarted
41 RM_Forbided, /// the operation should not be restarted after there is no active widget
42 RM_LastFeatureUsed, /// the operation is restarted and use
43 /// the previous feature for own initialization
44 RM_EmptyFeatureUsed /// the operation is restarted and does not use the previous feature
49 /// \param theWorkshop a workshop instance
50 PartSet_SketcherReentrantMgr(ModuleBase_IWorkshop* theWorkshop);
51 virtual ~PartSet_SketcherReentrantMgr();
54 /// Returns a first widget of the current opeation if the internal edit operation is active
55 /// or return null. If the current widget of the operation is a viewer selector, it returns null.
56 ModuleBase_ModelWidget* internalActiveWidget() const;
58 /// Return true if the current edit operation is an internal
59 bool isInternalEditActive() const;
61 /// Stop internal edit if the operation feature is invalid
62 void updateInternalEditActiveState();
64 /// if the internal flags allow it and the manager is active, it starts an internal edit operation
65 /// for the created operation.
66 /// \param thePreviousAttributeID an index of the previous active attribute
67 //bool restartOperation(const std::string& thePreviousAttributeID);
68 bool processEnter(const std::string& thePreviousAttributeID);
70 /// Resets the internal flags
71 /// \param theOperation a started operation
72 void operationStarted(ModuleBase_Operation* theOperation);
74 /// Resets the internal flags
75 /// \param theOperation a started operation
76 /// \return state whether the internal edit operation was active
77 bool operationCommitted(ModuleBase_Operation* theOperation);
79 /// Resets the internal flags
80 /// \param theOperation a started operation
81 void operationAborted(ModuleBase_Operation* theOperation);
83 /// Return true if the manager processes the mouse move event
84 /// It happens if the current operation is an internal edit operation and the first
85 /// control can be filled by the mouse move event. The operation is restarted.
86 /// \return true if operation is committed.
87 bool processMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
89 /// Return true if the manager processes the mouse press event
90 /// \return true if the current operation is an internal edit operation.
91 bool processMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
93 /// Return true if the manager processes the mouse enter event
94 /// It happens if the current operation is an internal edit operation.
95 /// The operation is restarted. If the first widget of the started operation is
96 /// the point 2d, it processes this mouse event
97 /// \return true if operation is committed.
98 bool processMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
100 /// It is called by the current operation filling with the preselection.
101 /// Returns false if the reentrant mode of the operation is not empty.
102 bool canBeCommittedByPreselection();
104 /// Put information about created objects into a cash. It will be processed in
105 /// restart operation.
106 /// \param theObjects a list of created objects
107 void appendCreatedObjects(const std::set<ObjectPtr>& theObjects);
110 /// SLOT, that is called by a widget activating in the property panel
111 /// If the 'internal' edit operation is started, it activates the first widget selection
112 void onWidgetActivated();
114 /// SLOT, that is called by no more widget signal emitted by property panel
115 /// Start an internal edit operation or, if the internal flag is forbided, commits
116 /// the current operation
117 /// \param thePreviousAttributeID an index of the previous active attribute
118 void onNoMoreWidgets(const std::string& thePreviousAttributeID);
120 /// Processing of vertex selected. Set an internal reentrant flag to forbiddent state if
121 /// the current feature is a line and there are not obligate widgets anymore
122 void onVertexSelected();
124 /// Listens to the signal about the modification of the values
125 /// have been done in the property panel. If the manager has active edit operation and
126 /// the active widget does not process the modification of value, the manager will
127 /// restart current operation and fill a new feature attribute by the value of current
129 void onAfterValuesChangedInPropertyPanel();
131 /// Deactivates selection and filters of the first operation widget if it is an internal
133 void onBeforeStopped();
136 /// Returns true if the current operation is a sketch or a nested sketch operation
137 bool isActiveMgr() const;
139 /// Sets the focus to the last control of the property panel and activates selection
140 /// of the first widget to can select first value of the next create operation
141 /// \param thePreviousAttributeID an index of the previous attribute to set focus to this widget
142 /// \return true if it is started
143 bool startInternalEdit(const std::string& thePreviousAttributeID);
145 /// Disconnects this manager from operation signals, deactivate selection of the first control
147 void beforeStopInternalEdit();
149 /// Commits the current operation and launches a new with the commited operation feature index
150 void restartOperation();
152 /// Creates an internal feature and controls to process it
153 void createInternalFeature();
155 /// A pair method for an internal creation to remove it and clear all created controls
156 void deleteInternalFeature();
158 /// Breaks sequense of automatically resterted operations
161 /// Copy some feature specific attributes from the source to a new feature
162 /// This is type for Circle and Arc features
163 /// \param theSourceFeature a source feature
164 /// \param theNewFeature a new feature
165 /// \param theSketch an active sketch
166 /// \param isTemporary is used to do not create additional features(e.g. coicidence for line)
167 /// \return true is something is copied
168 static bool copyReetntrantAttributes(const FeaturePtr& theSourceFeature,
169 const FeaturePtr& theNewFeature,
170 const std::shared_ptr<ModelAPI_CompositeFeature>& theSketch,
171 const bool isTemporary = false);
173 /// Checks whethe the feature of the given operation has kind an arc and the arc type is tangent
174 bool isTangentArc(ModuleBase_Operation* theOperation,
175 const std::shared_ptr<ModelAPI_CompositeFeature>& /*theSketch*/) const;
177 /// Accept All action is enabled if an internal edit is started.
178 /// It updates the state of the button
179 void updateAcceptAllAction();
181 /// Returns the workshop
182 XGUI_Workshop* workshop() const;
184 /// Returns the workshop module
185 PartSet_Module* module() const;
188 ModuleBase_IWorkshop* myWorkshop; /// the workshop
190 RestartingMode myRestartingMode; /// automatical restarting mode flag
191 bool myIsFlagsBlocked; /// true when reset of flags should not be perfromed
192 bool myIsInternalEditOperation; /// true when the 'internal' edit is started
193 bool myIsValueChangedBlocked; /// blocked flag to avoid circling by value changed
195 FeaturePtr myPreviousFeature; /// feature of the previous operation, which is restarted
196 std::set<FeaturePtr> myCreatedFeatures; /// list of created features by restart operation
197 FeaturePtr myInternalFeature;
198 QWidget* myInternalWidget;
199 ModuleBase_ModelWidget* myInternalActiveWidget;
200 std::string myNoMoreWidgetsAttribute;