1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
3 #ifndef PartSet_SketcherReetntrantMgr_H
4 #define PartSet_SketcherReetntrantMgr_H
8 #include <ModelAPI_Feature.h>
14 class ModuleBase_IWorkshop;
15 class ModuleBase_Operation;
16 class ModuleBase_ModelWidget;
17 class ModuleBase_IViewWindow;
24 /// \ingroup PartSet_SketcherReetntrantMgr
25 /// It provides reentrant create operations in sketch, that is when all inputs are valid,
26 /// automatic validation of the creation and switch the created entity to edit mode
27 /// ('internal' edit operation), with the ability to simultaneously create the next entity
28 /// of same type (re-entrance of the operation).
29 /// OK valids the current edition and exits from the operation (no re-entrance).
30 /// Cancel removes (undo) the entity currently edited and exits from the operation (no re-entrance).
31 class PARTSET_EXPORT PartSet_SketcherReetntrantMgr : public QObject
35 /// Enumeration to specify the restart operation properties.
37 RM_None, /// the operation should not be restarted
38 RM_Forbided, /// the operation should not be restarted after there is no active widget
39 RM_LastFeatureUsed, /// the operation is restarted and use the previous feature for own initialization
40 RM_EmptyFeatureUsed /// the operation is restarted and does not use the previous feature
45 /// \param theParent a parent object
46 PartSet_SketcherReetntrantMgr(ModuleBase_IWorkshop* theWorkshop);
47 virtual ~PartSet_SketcherReetntrantMgr();
50 /// Returns a first widget of the current opeation if the internal edit operation is active
51 /// or return null. If the current widget of the operation is a viewer selector, it returns null.
52 ModuleBase_ModelWidget* internalActiveWidget() const;
54 /// Return true if the current edit operation is an internal
55 bool isInternalEditActive() const;
57 /// if the internal flags allow it and the manager is active, it starts an internal edit operation
58 /// for the created operation.
59 /// \param thePreviousAttributeID an index of the previous active attribute
60 //bool restartOperation(const std::string& thePreviousAttributeID);
61 bool processEnter(const std::string& thePreviousAttributeID);
63 /// Resets the internal flags
64 /// \param theOperation a started operation
65 void operationStarted(ModuleBase_Operation* theOperation);
67 /// Resets the internal flags
68 /// \param theOperation a started operation
69 /// \return state whether the internal edit operation was active
70 bool operationCommitted(ModuleBase_Operation* theOperation);
72 /// Resets the internal flags
73 /// \param theOperation a started operation
74 void operationAborted(ModuleBase_Operation* theOperation);
76 /// Return true if the manager processes the mouse move event
77 /// It happens if the current operation is an internal edit operation and the first
78 /// control can be filled by the mouse move event. The operation is restarted.
79 /// \return true if operation is committed.
80 bool processMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
82 /// Return true if the manager processes the mouse press event
83 /// \return true if the current operation is an internal edit operation.
84 bool processMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
86 /// Return true if the manager processes the mouse enter event
87 /// It happens if the current operation is an internal edit operation.
88 /// The operation is restarted. If the first widget of the started operation is
89 /// the point 2d, it processes this mouse event
90 /// \return true if operation is committed.
91 bool processMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
93 /// It is called by the current operation filling with the preselection.
94 /// Returns false if the reentrant mode of the operation is not empty.
95 bool canBeCommittedByPreselection();
98 /// SLOT, that is called by a widget activating in the property panel
99 /// If the 'internal' edit operation is started, it activates the first widget selection
100 void onWidgetActivated();
102 /// SLOT, that is called by no more widget signal emitted by property panel
103 /// Start an internal edit operation or, if the internal flag is forbided, commits
104 /// the current operation
105 /// \param thePreviousAttributeID an index of the previous active attribute
106 void onNoMoreWidgets(const std::string& thePreviousAttributeID);
108 /// Processing of vertex selected. Set an internal reentrant flag to forbiddent state if
109 /// the current feature is a line and there are not obligate widgets anymore
110 void onVertexSelected();
112 /// Deactivates selection and filters of the first operation widget if it is an internal
114 void onBeforeStopped();
117 /// Returns true if the current operation is a sketch or a nested sketch operation
118 bool isActiveMgr() const;
120 /// Sets the focus to the last control of the property panel and activates selection
121 /// of the first widget to can select first value of the next create operation
122 /// \param thePreviousAttributeID an index of the previous attribute to set focus to this widget
123 /// \return true if it is started
124 bool startInternalEdit(const std::string& thePreviousAttributeID);
126 /// Disconnects this manager from operation signals, deactivate selection of the first control
128 void beforeStopInternalEdit();
130 /// Commits the current operation and launches a new with the commited operation feature index
131 void restartOperation();
133 /// Creates an internal feature and controls to process it
134 void createInternalFeature();
136 /// A pair method for an internal creation to remove it and clear all created controls
137 void deleteInternalFeature();
139 /// Breaks sequense of automatically resterted operations
142 /// Returns the workshop
143 XGUI_Workshop* workshop() const;
145 /// Returns the workshop module
146 PartSet_Module* module() const;
149 ModuleBase_IWorkshop* myWorkshop; /// the workshop
151 RestartingMode myRestartingMode; /// automatical restarting mode flag
152 bool myIsFlagsBlocked; /// true when reset of flags should not be perfromed
153 bool myIsInternalEditOperation; /// true when the 'internal' edit is started
155 FeaturePtr myInternalFeature;
156 QWidget* myInternalWidget;
157 ModuleBase_ModelWidget* myInternalActiveWidget;
158 std::string myNoMoreWidgetsAttribute;