Salome HOME
Merge branch 'master' of newgeom:newgeom.git
[modules/shaper.git] / src / ModuleBase / ModuleBase_Operation.h
1 /*
2  * ModuleBase_Operation.h
3  *
4  *  Created on: Apr 2, 2014
5  *      Author: sbh
6  */
7
8
9 #ifndef MODULEBASE_OPERATION_H
10 #define MODULEBASE_OPERATION_H
11
12 #include <ModuleBase.h>
13
14 #include <QObject>
15 #include <QString>
16
17 #include <memory>
18
19 class SUIT_Study;
20 class XGUI_Workshop;
21 class ModelAPI_Feature;
22 class ModelAPI_Document;
23
24 /*!
25  \class ModuleBase_Operation
26  * \brief Base class for all operations
27  *
28  *  Base class for all operations. If you perform an action it is reasonable to create
29  *  operation intended for this. This is a base class for all operations which provides
30  *  mechanism for correct starting operations, starting operations above already started
31  *  ones, committing operations and so on. To create own operation it is reasonable to
32  *  inherit it from this class and redefines virtual methods to provide own behavior
33  *  Main virtual methods are
34  *  - virtual bool      isReadyToStart();
35  *  - virtual void      startOperation();
36  *  - virtual void      abortOperation();
37  *  - virtual void      commitOperation();
38  */
39
40 class MODULEBASE_EXPORT ModuleBase_Operation: public QObject
41 {
42 Q_OBJECT
43
44 public:
45   /*! Enum describes state of operation */
46   enum OperationState
47   {
48     Waiting,  //!< Operation is not used (it is not run or suspended)
49     Running  //!< Operation is started
50   };
51
52   /*!
53    * Enum describes execution status of operation. Execution status often used after
54    * ending work of operation which was started from this one. In this case this
55    * operation can ask previously started operation whether it finished successfully.
56    */
57   enum ExecStatus
58   {
59     Rejected, //!< Operation has not performed any action (modification of data model for example)
60     Accepted  //!< Operation has performed an actions and must be stopped
61   };
62
63   /*!
64    * Enum describes setting of the operation.
65    */
66   enum Flags
67   {
68     None = 0x00, //!< None options
69     Transaction = 0x01 //!< Automatically open (commit/abort) transaction during start (commit/abort).
70   };
71
72 public:
73   ModuleBase_Operation(const QString& theId = "", QObject* parent = 0);
74   virtual ~ModuleBase_Operation();
75
76   // Operation processing.
77   virtual QString operationId() const;
78
79   std::shared_ptr<ModelAPI_Feature> feature() const;
80
81   OperationState state() const;
82   bool isRunning() const;
83   virtual bool isValid(ModuleBase_Operation* theOtherOp) const;
84   virtual bool isGranted() const;
85
86   bool setSlot(const QObject* theReceiver, const char* theSlot);
87
88   void setFlags(const int);
89   void clearFlags(const int);
90   bool testFlags(const int) const;
91
92   int execStatus() const;
93
94   // Widget processing.
95   const QString& xmlRepresentation() const;
96   void setXmlRepresentation(const QString& xmlRepr);
97
98 signals:
99   void started();
100   void aborted();
101   void committed();
102   void stopped(); //!< operation aborted or committed
103
104   void callSlot();
105
106 public slots:
107   void start();
108   void abort();
109   void commit();
110
111   //true = do nothing, false = abort()
112   //Provided for S/S compatibility with QAction's toggle(bool)
113   void setRunning(bool);
114
115   // Data model operations.
116   void storeReal(double);
117
118 protected:
119   virtual bool isReadyToStart() const;
120
121   virtual void startOperation();
122   virtual void stopOperation();
123   virtual void abortOperation();
124   virtual void commitOperation();
125
126   void setExecStatus(const int);
127   void setState(const OperationState);
128
129   std::shared_ptr<ModelAPI_Document> document() const;
130
131 private:
132   int myFlags;               //!< Operation flags
133   OperationState myState;    //!< Operation state
134   ExecStatus myExecStatus;   //!< Execution status
135
136   //!< Next fields could be extracted into a subclass;
137   QString myOperationId;
138   QString myXmlRepr;
139   std::shared_ptr<ModelAPI_Feature> myFeature;
140 };
141
142 #endif