Salome HOME
Multiple fixes (issue #1757 , issue #1799 , issue #1842 , etc):
[modules/shaper.git] / src / Model / Model_Update.h
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:        Model_Update.hxx
4 // Created:     25 Jun 2014
5 // Author:      Mikhail PONIKAROV
6
7 #ifndef Model_Update_H_
8 #define Model_Update_H_
9
10 #include "Model.h"
11 #include <ModelAPI_Data.h>
12 #include "Events_Listener.h"
13 #include <memory>
14 #include <set>
15 #include <map>
16
17 class ModelAPI_Object;
18 class ModelAPI_Feature;
19 class ModelAPI_CompositeFeature;
20 class Model_Objects;
21
22 /**\class Model_Update
23  * \ingroup DataModel
24  * \brief Updates the results of features when it is needed.
25  */
26 class Model_Update : public Events_Listener
27 {
28   /// Features and results that were modified and not yet processed.
29   /// The second set is the objects that causes this object is modified
30   std::map<std::shared_ptr<ModelAPI_Feature>, std::set<std::shared_ptr<ModelAPI_Feature> > >
31     myModified;
32   /// Features which arguments were modified by not-persistent changes.
33   /// So, these referencing arguments must be updated due to these features info also before execution).
34   std::map<std::shared_ptr<ModelAPI_Feature>, std::set<std::shared_ptr<ModelAPI_Feature> > >
35     myNotPersistentRefs;
36   /// features that must be additionally processed after execution of finish operation
37   std::set<std::shared_ptr<ModelAPI_Feature> > myWaitForFinish;
38   /// to know that some parameter was changed during this operation (to enable update expressions)
39   bool myIsParamUpdated;
40   /// to execute features on finish if preview is needed only on finish operation
41   bool myIsFinish;
42   /// try if processing is currently performed
43   bool myIsProcessed;
44   /// set that contains features that must be executed only on finish of the operation
45   std::set<std::shared_ptr<ModelAPI_Feature> > myProcessOnFinish;
46   /// to avoid infinitive cycling: feature -> count of the processing periods during this update
47   std::map<std::shared_ptr<ModelAPI_Feature>, int > myProcessed;
48   /// if preview in hte property panel is blocked and any update is postponed until the end of operation
49   bool myIsPreviewBlocked;
50
51  public:
52   /// Is called only once, on startup of the application
53   Model_Update();
54
55   /// Processes the feature argument update: executes the results
56   MODEL_EXPORT virtual void processEvent(const std::shared_ptr<Events_Message>& theMessage);
57
58 protected:
59   /// Appends the new modified feature to the myModified, clears myProcessed if needed
60   /// Returns true if some feature really was marked as modified
61   /// theReason is the object that causes modification of this feature
62   /// returns true if something reallsy was added to the modified and must be processed
63   bool addModified(
64     std::shared_ptr<ModelAPI_Feature> theFeature, std::shared_ptr<ModelAPI_Feature> theReason);
65
66   /// Recoursively checks and updates features if needed (calls the execute method)
67   /// Returns true if feature was updated.
68   bool processFeature(std::shared_ptr<ModelAPI_Feature> theFeature);
69
70   /// Updates the selection and parametrical arguments before the later feature analysis
71   /// Returns true if something really was updated
72   void updateArguments(std::shared_ptr<ModelAPI_Feature> theFeature);
73
74   /// Sends the redisplay events for feature and results, updates the updated status
75   void redisplayWithResults(std::shared_ptr<ModelAPI_Feature> theFeature, 
76     const ModelAPI_ExecState theState);
77
78   /// On operation start/end/abort the "Just" fileds must be cleared and processed in the right way
79   //! \param theFlushRedisplay a boolean value if the redisplay signal should be flushed
80   void processFeatures(const bool theFlushRedisplay = true);
81
82   /// Performs the feature execution
83   /// \returns the status of execution
84   void executeFeature(std::shared_ptr<ModelAPI_Feature> theFeature);
85
86   /// Updates the properties of object because of stability state changes
87   void updateStability(void* theSender);
88
89   /// Returns true if theFeature modification was caused by theReason (may be feature of result of this feature)
90   bool isReason(
91     std::shared_ptr<ModelAPI_Feature>& theFeature, std::shared_ptr<ModelAPI_Object> theReason);
92
93   /// Updates a selection attributes for the features that possible were affected by creation
94   /// or reorder of features upper in the history line (issue #1757)
95   void updateSelection(const std::set<std::shared_ptr<ModelAPI_Object> >& theObjects);
96
97 };
98
99 #endif