Salome HOME
05f20230615ee5e4983521701cdc14a9382a8c7f
[modules/shaper.git] / src / ModuleBase / ModuleBase_WidgetCheckGroupBox.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
2
3 // File:        ModuleBase_WidgetCheckGroupBox.cpp
4 // Created:     13 Dec 2015
5 // Author:      Natalia ERMOLAEVA
6
7 #include <ModuleBase_WidgetCheckGroupBox.h>
8 #include <ModelAPI_AttributeString.h>
9
10 #include <Config_WidgetAPI.h>
11 #include <Config_Keywords.h>
12
13 #include <QWidget>
14 #include <QGroupBox>
15 #include <QCheckBox>
16 #include <QGridLayout>
17 #include <QVBoxLayout>
18
19 #include <QList>
20
21 ModuleBase_WidgetCheckGroupBox::ModuleBase_WidgetCheckGroupBox(QWidget* theParent,
22                                                                const Config_WidgetAPI* theData)
23 : ModuleBase_ModelWidget(theParent, theData),
24   ModuleBase_PageBase(),
25   myOptionType(CheckBox),
26   myCheckBoxFrame(0),
27   myCheckBox(0),
28   myCheckBoxLayout(0),
29   myCheckBoxWidget(0),
30   myGroupBox(0),
31   myGroupBoxLayout(0)
32 {
33   myToolTip = theData->widgetTooltip();
34   myGroupTitle = theData->getProperty(CONTAINER_PAGE_NAME);
35
36   bool isChecked = theData->getBooleanAttribute(ATTR_DEFAULT, false);
37   setDefaultValue(isChecked ? "true" : "false");
38
39   myMainLayout = new QVBoxLayout(this);
40   ModuleBase_Tools::adjustMargins(myMainLayout);
41 }
42
43 ModuleBase_WidgetCheckGroupBox::~ModuleBase_WidgetCheckGroupBox()
44 {
45 }
46
47 QWidget* ModuleBase_WidgetCheckGroupBox::pageWidget()
48 {
49   return myOptionType == GroupBox ? myGroupBox : (QWidget*)myCheckBoxFrame;
50 }
51
52 QList<QWidget*> ModuleBase_WidgetCheckGroupBox::getControls() const
53 {
54   QList<QWidget*> aControls;
55   if (myOptionType == GroupBox)
56     aControls.append(myGroupBox);
57   else
58     aControls.append(myCheckBoxFrame);
59
60   return aControls;
61 }
62
63 void ModuleBase_WidgetCheckGroupBox::onPageClicked()
64 {
65   storeValue();
66   updateControlsVisibility();
67 }
68
69 void ModuleBase_WidgetCheckGroupBox::addPageStretch()
70 {
71 }
72
73 void ModuleBase_WidgetCheckGroupBox::placeModelWidget(ModuleBase_ModelWidget* theWidget)
74 {
75   if(!isCheckBoxFilled() && myOptionType == CheckBox) {
76     createControl(CheckBox);
77     setOptionType(CheckBox);
78
79     myCheckBoxWidget = theWidget; /// check box frame becomes filled
80     myCheckBoxLayout->addWidget(theWidget);
81   }
82   else {
83     createControl(GroupBox);
84     setOptionType(GroupBox);
85
86     ModuleBase_ModelWidget* aCheckBoxWidget = myCheckBoxWidget;
87     myCheckBoxWidget = 0;
88     if (aCheckBoxWidget) // move the model widget from check box frame to group box frame
89       placeModelWidget(aCheckBoxWidget);
90
91     const int kCol = 0;
92     const int kRow = myGroupBoxLayout->count();
93     // it seems, that the align on left is not necessary here, but leads to widgets, which are
94     // not extended on full width of the parent page. The case is grouped widgets in
95     // the sketch translation operation
96     myGroupBoxLayout->addWidget(theWidget, kRow, kCol, Qt::AlignTop);// | Qt::AlignLeft);
97     myGroupBoxLayout->setRowStretch(kRow, 0);
98   }
99 }
100
101 void ModuleBase_WidgetCheckGroupBox::placeWidget(QWidget* theWidget)
102 {
103   createControl(GroupBox);
104   setOptionType(GroupBox);
105   if (isCheckBoxFilled())
106     placeModelWidget(myCheckBoxWidget);
107
108
109   if (!theWidget) {
110 #ifdef _DEBUG
111     std::cout << "ModuleBase_PageGroupBox::placePageWidget: can not cast page" << std::endl;
112 #endif
113     return;
114   }
115   const int kCol = 0;
116   const int kRow = myGroupBoxLayout->count();
117   myGroupBoxLayout->addWidget(theWidget, kRow, kCol);
118   myGroupBoxLayout->setRowStretch(kRow, 0);
119 }
120
121 QLayout* ModuleBase_WidgetCheckGroupBox::pageLayout()
122 {
123   return myOptionType == GroupBox ? myGroupBoxLayout : (QLayout*)myCheckBoxLayout;
124 }
125
126 void ModuleBase_WidgetCheckGroupBox::createControl(const OptionType& theType)
127 {
128   if (theType == GroupBox && !myGroupBox) {
129     // group box: more than one model widget is inside
130     myGroupBox = new QGroupBox(this);
131     myGroupBox->setTitle(QString::fromStdString(myGroupTitle));
132     myGroupBox->setVisible(false);
133     myGroupBox->setCheckable(true);
134     myGroupBox->setChecked(getDefaultValue() == "true");
135     myGroupBox->setToolTip(QString::fromStdString(myToolTip));
136
137     myGroupBoxLayout = new QGridLayout(myGroupBox);
138     ModuleBase_Tools::zeroMargins(myGroupBoxLayout);
139     myGroupBox->setLayout(myGroupBoxLayout);
140
141     // default vertical size policy is preferred
142     myMainLayout->addWidget(myGroupBox);
143     connect(myGroupBox, SIGNAL(clicked(bool)), this, SLOT(onPageClicked()));
144   }
145   else if (theType == CheckBox && !myCheckBoxFrame) {
146     myCheckBoxFrame = new QFrame(this);
147     myMainLayout->addWidget(myCheckBoxFrame);
148
149     myCheckBoxLayout = new QHBoxLayout(myCheckBoxFrame);
150     ModuleBase_Tools::adjustMargins(myCheckBoxLayout);
151     myCheckBox = new QCheckBox(myCheckBoxFrame);
152     myCheckBox->setChecked(getDefaultValue() == "true");
153     myCheckBoxLayout->addWidget(myCheckBox);
154
155     connect(myCheckBox, SIGNAL(clicked(bool)), this, SLOT(onPageClicked()));
156   }
157 }
158
159 bool ModuleBase_WidgetCheckGroupBox::storeValueCustom()
160 {
161   DataPtr aData = myFeature->data();
162   AttributeStringPtr aStringAttr = aData->string(attributeID());
163   aStringAttr->setValue(getCurrentValue() ? attributeID() : "");
164
165   updateObject(myFeature);
166
167   return true;
168 }
169
170 bool ModuleBase_WidgetCheckGroupBox::restoreValueCustom()
171 {
172   DataPtr aData = myFeature->data();
173   AttributeStringPtr aStringAttr = aData->string(attributeID());
174   setCurrentValue(!aStringAttr->value().empty());
175
176   return true;
177 }
178
179 void ModuleBase_WidgetCheckGroupBox::setOptionType(
180                          const ModuleBase_WidgetCheckGroupBox::OptionType& theType)
181 {
182   myOptionType = theType;
183
184   bool isGroupBox = myOptionType == GroupBox;
185   if (myCheckBoxFrame)
186     myCheckBoxFrame->setVisible(!isGroupBox);
187   if (myGroupBox)
188     myGroupBox->setVisible(isGroupBox);
189 }
190
191 bool ModuleBase_WidgetCheckGroupBox::isCheckBoxFilled() const
192 {
193   return myCheckBoxWidget != 0;
194 }
195
196 bool ModuleBase_WidgetCheckGroupBox::getCurrentValue() const
197 {
198   bool isGroupBox = myOptionType == GroupBox;
199   return isGroupBox ? myGroupBox->isChecked() : myCheckBox->isChecked();
200 }
201
202 void ModuleBase_WidgetCheckGroupBox::setCurrentValue(const bool& theValue)
203 {
204   bool isGroupBox = myOptionType == GroupBox;
205   if (isGroupBox) {
206     bool isBlocked = myGroupBox->blockSignals(true);
207     myGroupBox->setChecked(theValue);
208     myGroupBox->blockSignals(isBlocked);
209   }
210   else {
211     bool isBlocked = myCheckBox->blockSignals(true);
212     myCheckBox->setChecked(theValue);
213     myCheckBox->blockSignals(isBlocked);
214   }
215   updateControlsVisibility();
216 }
217
218 void ModuleBase_WidgetCheckGroupBox::updateControlsVisibility()
219 {
220   if (myOptionType == GroupBox) {
221     bool aChecked = myGroupBox->isChecked();
222     if (aChecked)
223       ModuleBase_Tools::zeroMargins(myGroupBoxLayout);
224     else
225       ModuleBase_Tools::adjustMargins(myGroupBoxLayout);
226
227     int aNbSubControls = myGroupBoxLayout->count();
228     for (int i = 0; i < aNbSubControls; i++) {
229       QWidget* aWidget = myGroupBoxLayout->itemAt(i)->widget();
230       if (aWidget)
231         aWidget->setVisible(aChecked);
232     }
233   }
234   else {
235     bool aChecked = myCheckBox->isChecked();
236     myCheckBoxWidget->setEnabled(aChecked);
237   }
238 }