Salome HOME
Merge remote-tracking branch 'remotes/origin/occ/compounds_processing'
[modules/shaper.git] / src / ModuleBase / ModuleBase_WidgetSelectionFilter.h
1 // Copyright (C) 2014-2019  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #ifndef ModuleBase_WidgetSelectionFilter_H
21 #define ModuleBase_WidgetSelectionFilter_H
22
23 #include "ModuleBase.h"
24 #include "ModuleBase_ModelWidget.h"
25 #include "ModuleBase_ViewerPrs.h"
26
27 #include <ModelAPI_FiltersFeature.h>
28
29 #include <SelectMgr_IndexedMapOfOwner.hxx>
30 #include <AIS_Shape.hxx>
31 #include <AIS_ListOfInteractive.hxx>
32
33 #include <QWidget>
34 #include <QList>
35
36 class QLabel;
37 class QComboBox;
38 class QGroupBox;
39 class QToolButton;
40 class QVBoxLayout;
41 class QPushButton;
42 class QCheckBox;
43
44 class ModuleBase_IWorkshop;
45
46 /**
47 * \ingroup GUI
48 * An object which lets to start a Filters operation as
49 * a sub-operation of the current one.
50 */
51 class MODULEBASE_EXPORT ModuleBase_FilterStarter: public QWidget
52 {
53   Q_OBJECT
54 public:
55   /// Constructor
56   /// \param theFeature a name of feature for filtering
57   /// \param theParent a parent widget which will get control after filtering
58   /// \param theWorkshop a pointer on a current workshop
59   ModuleBase_FilterStarter(const std::string& theFeature, QWidget* theParent,
60     ModuleBase_IWorkshop* theWorkshop);
61
62   /// Destructor
63   ~ModuleBase_FilterStarter() {}
64
65 private slots:
66   /// A slot to launch filtering operation
67   void onFiltersLaunch();
68
69 private:
70   /// Name of filtering feature
71   std::string myFeatureName;
72
73   /// A workshop
74   ModuleBase_IWorkshop* myWorkshop;
75 };
76
77
78 class ModuleBase_WidgetSelectionFilter;
79 /**
80 * \ingroup GUI
81 * A widget which reperesents a one filter item in filters list
82 * Also it includes filter GUI if it exists
83 */
84 class ModuleBase_FilterItem : public QWidget
85 {
86   Q_OBJECT
87 public:
88
89   /// Constructor
90   /// \param theFilter the filter ID
91   /// \param theParent a parent widget of ModuleBase_WidgetSelectionFilter class
92   ModuleBase_FilterItem(const std::string& theFilter, ModuleBase_WidgetSelectionFilter* theParent);
93
94   /// Returns filter Id
95   std::string filter() const { return myFilterID; }
96
97   /// Returns list of widgets which reperesent the current filter GUI
98   QList<ModuleBase_ModelWidget*> widgets() const {
99     return myWidgets;
100   }
101
102 signals:
103   /// The seignal is sent on deletion of the item
104   void deleteItem(ModuleBase_FilterItem* theItem);
105
106   /// The seignal is sent on reversing of the item
107   void reversedItem(ModuleBase_FilterItem* theItem);
108
109 private slots:
110   /// A slot to process reverse button click
111   /// \param theCheck a current state of the button
112   void onReverse(bool theCheck);
113
114   /// A slot to process delete button click
115   void onDelete();
116
117 private:
118   /// A function which adds standard widgets of the item
119   void addItemRow(QWidget* theParent);
120
121   /// Current filter Id
122   std::string myFilterID;
123
124   /// Filters feature
125   FiltersFeaturePtr mySelection;
126
127   /// Reverce button
128   QToolButton* myRevBtn;
129
130   /// A list of sub-widgets
131   QList<ModuleBase_ModelWidget*> myWidgets;
132 };
133
134 /**
135 * \ingroup GUI
136 * A widget for selection by filters
137 */
138 class ModuleBase_WidgetSelectionFilter : public ModuleBase_ModelWidget
139 {
140   Q_OBJECT
141 public:
142   static FeaturePtr SelectorFeature;
143   static std::string AttributeId;
144
145
146   /// Constructor
147   /// \param theParent the parent object
148   /// \param theData the widget configuration. The attribute of the model widget is obtained from
149   /// a low-level API for reading xml definitions of widgets
150   ModuleBase_WidgetSelectionFilter(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop,
151     const Config_WidgetAPI* theData, bool theReadOnly = false);
152
153   /// Destructor
154   ~ModuleBase_WidgetSelectionFilter();
155
156   /// Returns list of widget controls
157   /// \return a control list
158   virtual QList<QWidget*> getControls() const;
159
160   /// It is called when user press Ok or OkPlus buttons in the parent property panel
161   /// By default this slot does nothing
162   virtual void onFeatureAccepted();
163
164   /// Returns current workshop
165   ModuleBase_IWorkshop* workshop() const { return myWorkshop; }
166
167   /// Returns a container widget for filter items
168   QWidget* filtersWidget() const { return myFiltersWgt; }
169
170   /// Returns error string
171   virtual QString getError(const bool theValueStateChecked = true) const;
172
173 protected:
174   /// Saves the internal parameters to the given feature (not ussed for this widget)
175   /// \return True in success
176   virtual bool storeValueCustom();
177
178   /// Restore value from attribute data to the widget's control (not ussed for this widget)
179   virtual bool restoreValueCustom();
180
181 private slots:
182   /// Add a filter by Id in combo box
183   void onAddFilter(int);
184
185   /// Process deletion of a filter item
186   void onDeleteItem(ModuleBase_FilterItem* theItem);
187
188   /// Process reversion of a filter item
189   void onReverseItem(ModuleBase_FilterItem* theItem);
190
191   /// Process selection
192   void onSelect();
193
194   /// Show only selected objects
195   void onShowOnly(bool theErase);
196
197   /// Process update of a filter item
198   void onObjectUpdated();
199
200 private:
201   /// Update state of button State
202   void updateSelectBtn();
203
204   /// Update number of selected objects
205   void updateNumberSelected();
206
207   /// Clear selection
208   void clearCurrentSelection(bool toUpdate = false);
209
210   /// Update preview
211   /// \param theShape a preview shape
212   void updatePreview(const TopoDS_Shape& theShape);
213
214   /// Call to redisplay the fiter feature
215   void redisplayFeature();
216
217   /// Add a filter by name
218   ModuleBase_FilterItem* onAddFilter(const std::string& theFilter);
219
220   /// Return currently created filter items
221   QList<ModuleBase_FilterItem*> itemsList() const;
222
223 private:
224   ModuleBase_IWorkshop* myWorkshop;
225
226   QWidget* myFiltersWgt;
227   QVBoxLayout* myFiltersLayout;
228
229   QComboBox* myFiltersCombo;
230   QPushButton* mySelectBtn;
231   QLabel* myNbLbl;
232   QCheckBox* myShowBtn;
233
234   /// Type of selection mode
235   int mySelectionType;
236
237   /// Result of filtering
238   QList<ModuleBase_ViewerPrsPtr> myValues;
239
240   /// A preview shape
241   Handle(AIS_Shape) myPreview;
242
243   /// List of displayed objects before "Show only"
244   AIS_ListOfInteractive myListIO;
245
246   /// A Feature which will get result of filtering
247   FeaturePtr mySelectorFeature;
248
249   /// Attribute name which will get result of filtering
250   std::string mySelectorAttribute;
251 };
252
253
254 #endif