Salome HOME
Set default value for case id attribute of Paged Containers (like Toolbox)
[modules/shaper.git] / src / ModuleBase / ModuleBase_ModelWidget.h
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:        ModuleBase_ModelWidget.h
4 // Created:     25 Apr 2014
5 // Author:      Natalia ERMOLAEVA
6
7 #ifndef MODULEBASE_MODELWIDGET_H
8 #define MODULEBASE_MODELWIDGET_H
9
10 #include <ModuleBase.h>
11 #include <ModuleBase_ViewerPrs.h>
12
13 #include <ModelAPI_Feature.h>
14
15 #include <QWidget>
16
17 #include <memory>
18
19 class Config_WidgetAPI;
20 class QKeyEvent;
21
22 /**\class ModuleBase_ModelWidget
23  * \ingroup GUI
24  * \brief An abstract custom widget class. This class realization is assumed to create some controls.
25  * The controls values modification should send signal about values change.
26  *
27  * Common interface for widgets in the property panel.
28  * Every widget are able to save/restore data from the model and/or to contain other widgets.
29  *
30  */
31 class MODULEBASE_EXPORT ModuleBase_ModelWidget : public QWidget
32 {
33 Q_OBJECT
34  public:
35   /// Constructor
36   /// \param theParent the parent object
37   /// \param theData the widget configuation. The attribute of the model widget is obtained from
38   /// \param theParentId is Id of a parent of the current attribute
39   ModuleBase_ModelWidget(QWidget* theParent, const Config_WidgetAPI* theData,
40                          const std::string& theParentId);
41   /// Destructor
42   virtual ~ModuleBase_ModelWidget()
43   {
44   }
45
46   /// Fills the widget with default values
47   virtual void reset() {};
48
49   /// Returns the state whether the attribute of the feature is initialized
50   /// \param theObject a model feature to be checked
51   /// \return the boolean result
52   bool isInitialized(ObjectPtr theObject) const;
53
54   /// Returns true, if default value of the widget should be computed
55   /// on operation's execute, like radius for circle's constraint (can not be zero)
56   bool isComputedDefault() const { return myIsComputedDefault; }
57
58   /// Returns true, if default value of the widget is defined in the XML and it is not the
59   /// computed value
60   /// \return the boolean result
61   std::string getDefaultValue() const { return myDefaultValue; }
62
63   /// Returns true, if the obligatory value of the widget is not defined in the XML or has true value
64   /// \return the boolean result
65   bool isObligatory() const { return myIsObligatory; }
66
67   /// Defines if it is supposed that the widget should interact with the viewer.
68   virtual bool isViewerSelector() { return false; }
69
70   /// Defines if it is supported to set the value in this widget
71   /// By default it returns true
72   virtual bool canSetValue() const { return true; };
73
74   /// Set the given wrapped value to the current widget
75   /// This value should be processed in the widget according to the needs
76   /// \param theValue the wrapped widget value
77   virtual bool setSelection(ModuleBase_ViewerPrs theValue)
78   {
79     return false;
80   }
81
82   /// Restore value from attribute data to the widget's control
83   virtual bool restoreValue() = 0;
84
85   /// Set focus to the first control of the current widget. The focus policy of the control is checked.
86   /// If the widget has the NonFocus focus policy, it is skipped.
87   /// \return the state whether the widget can accept the focus
88   virtual bool focusTo();
89
90   /// The methiod called when widget is activated
91   void activate();
92
93   /// The methiod called when widget is deactivated
94   virtual void deactivate() {}
95
96   /// Returns list of widget controls
97   /// \return a control list
98   virtual QList<QWidget*> getControls() const = 0;
99
100   /// FocusIn events processing
101   virtual bool eventFilter(QObject* theObject, QEvent *theEvent);
102
103   /// \brief Enables processing of focus event on all controls by the widget
104   /// if this widget is not obligatory and set no-focus policy otherwise
105   virtual void enableFocusProcessing();
106
107   //! Switch On/Off highlighting of the widget
108   virtual void setHighlighted(bool isHighlighted);
109
110   /// Returns the attribute name
111   /// \returns the string value
112   std::string attributeID() const
113   {
114     return myAttributeID;
115   }
116
117   /// Returns the parent of the attribute
118   /// \returns the string value
119   std::string parentID() const
120   {
121     return myParentId;
122   }
123
124   /// \return Current feature
125   FeaturePtr feature() const
126   {
127     return myFeature;
128   }
129
130   /// Set feature which is processing by active operation
131   /// \param theToStoreValue a value about necessity to store the widget value to the feature
132   void setFeature(const FeaturePtr& theFeature, const bool theToStoreValue = false);
133
134   /// Editing mode depends on mode of current operation. This value is defined by it.
135   void setEditingMode(bool isEditing) { myIsEditing = isEditing; }
136
137   /// \return Current Editing mode
138   bool isEditingMode() const { return myIsEditing; }
139
140 signals:
141   /// The signal about widget values are to be changed
142   void beforeValuesChanged();
143   /// The signal about widget values changed
144   void valuesChanged();
145   /// The signal about widget values are to be changed
146   void afterValuesChanged();
147
148   /// The signal about key release on the control, that corresponds to the attribute
149   /// \param theEvent key release event
150   void keyReleased(QKeyEvent* theEvent);
151
152   /// The signal about the widget is get focus
153   /// \param theWidget the model base widget
154   void focusInWidget(ModuleBase_ModelWidget* theWidget);
155
156   /// The signal about the widget is lost focus
157   /// \param theWidget the model base widget
158   void focusOutWidget(ModuleBase_ModelWidget* theWidget);
159
160  protected:
161   /// Sets default value of widget. Nornaly, widget should fetch this value 
162   /// from the xml. However, some widgets derived widgets could define it
163   void setDefaultValue(const std::string& theValue);
164   /// \brief Set the attribute name
165   /// \param theAttribute the string value with attribute name
166   void setAttributeID(const std::string& theAttribute)
167   {
168     myAttributeID = theAttribute;
169   }
170
171   /// Saves the internal parameters to the given feature. Emits signals before and after store
172   /// \return True in success
173   bool storeValue();
174
175   /// Saves the internal parameters to the given feature
176   /// \return True in success
177   virtual bool storeValueCustom() const = 0;
178
179   /// The methiod called when widget is activated
180   virtual void activateCustom() {};
181
182   /// Sends Update and Redisplay for the given object
183   /// \param theObj is updating object
184   void updateObject(ObjectPtr theObj) const;
185
186   /// Sends Move event for the given object
187   /// \param theObj is object for moving
188   void moveObject(ObjectPtr theObj) const;
189
190 protected slots:
191   /// Processing of values changed in model widget by store the current value to the feature
192   void onWidgetValuesChanged();
193
194  protected:
195
196   /// The attribute name of the model feature
197   std::string myAttributeID; 
198
199   /// Name of parent
200   std::string myParentId;    
201
202   /// A feature which is processing by active operation
203   FeaturePtr myFeature;      
204
205   /// Flag which shows that current operation is in editing mode
206   bool myIsEditing; 
207
208   /// Flag which shows whether current widget is obligatory
209   /// The non-obligatory widgets should not accept the focus in the property panel
210   bool myIsObligatory;
211
212 private:
213   /// Value should be computed on execute, like radius for circle's constraint (can not be zero)
214   bool myIsComputedDefault; 
215                         
216   /// the default value, which is defined in the XML for this attribute    
217   std::string myDefaultValue; 
218 };
219
220 #endif