2 * XGUI_PropertyPanel.cpp
4 * Created on: Apr 29, 2014
8 #include <XGUI_PropertyPanel.h>
9 #include <XGUI_Constants.h>
10 #include <ModuleBase_WidgetMultiSelector.h>
13 #include <QVBoxLayout>
15 #include <QPushButton>
17 #include <QVBoxLayout>
20 #include <QLayoutItem>
26 XGUI_PropertyPanel::XGUI_PropertyPanel(QWidget* theParent)
27 : ModuleBase_IPropertyPanel(theParent),
30 this->setWindowTitle(tr("Property Panel"));
31 QAction* aViewAct = this->toggleViewAction();
32 this->setObjectName(XGUI::PROP_PANEL);
33 setStyleSheet("::title { position: relative; padding-left: 5px; text-align: left center }");
35 QWidget* aContent = new QWidget(this);
36 myMainLayout = new QVBoxLayout(aContent);
37 myMainLayout->setContentsMargins(3, 3, 3, 3);
38 this->setWidget(aContent);
40 QFrame* aFrm = new QFrame(aContent);
41 aFrm->setFrameStyle(QFrame::Sunken);
42 aFrm->setFrameShape(QFrame::Panel);
43 QHBoxLayout* aBtnLay = new QHBoxLayout(aFrm);
44 aBtnLay->setContentsMargins(0, 0, 0, 0);
45 myMainLayout->addWidget(aFrm);
47 QPushButton* aBtn = new QPushButton(QIcon(":pictures/button_help.png"), "", aFrm);
49 aBtnLay->addWidget(aBtn);
50 aBtnLay->addStretch(1);
51 aBtn = new QPushButton(QIcon(":pictures/button_ok.png"), "", aFrm);
52 aBtn->setObjectName(XGUI::PROP_PANEL_OK);
53 aBtn->setToolTip(tr("Ok"));
55 aBtnLay->addWidget(aBtn);
57 aBtn = new QPushButton(QIcon(":pictures/button_cancel.png"), "", aFrm);
58 aBtn->setToolTip(tr("Cancel"));
59 aBtn->setObjectName(XGUI::PROP_PANEL_CANCEL);
61 aBtn->setShortcut(QKeySequence(Qt::Key_Escape));
62 aBtnLay->addWidget(aBtn);
64 myCustomWidget = new QWidget(aContent);
65 myMainLayout->addWidget(myCustomWidget);
66 setStretchEnabled(true);
69 XGUI_PropertyPanel::~XGUI_PropertyPanel()
73 void XGUI_PropertyPanel::cleanContent()
76 myActiveWidget->deactivate();
78 qDeleteAll(myCustomWidget->children());
79 myActiveWidget = NULL;
82 void XGUI_PropertyPanel::setModelWidgets(const QList<ModuleBase_ModelWidget*>& theWidgets)
84 myWidgets = theWidgets;
85 if (theWidgets.empty()) return;
86 bool isEnableStretch = true;
87 QList<ModuleBase_ModelWidget*>::const_iterator anIt = theWidgets.begin(), aLast =
89 for (; anIt != aLast; anIt++) {
90 connect(*anIt, SIGNAL(keyReleased(QKeyEvent*)), this, SIGNAL(keyReleased(QKeyEvent*)));
91 connect(*anIt, SIGNAL(focusOutWidget(ModuleBase_ModelWidget*)),
92 this, SLOT(activateNextWidget(ModuleBase_ModelWidget*)));
93 connect(*anIt, SIGNAL(focusInWidget(ModuleBase_ModelWidget*)),
94 this, SLOT(activateWidget(ModuleBase_ModelWidget*)));
96 //ModuleBase_WidgetPoint2D* aPointWidget = dynamic_cast<ModuleBase_WidgetPoint2D*>(*anIt);
98 // connect(aPointWidget, SIGNAL(storedPoint2D(ObjectPtr, const std::string&)), this,
99 // SIGNAL(storedPoint2D(ObjectPtr, const std::string&)))
102 if (!isEnableStretch) continue;
103 foreach(QWidget* eachWidget, (*anIt)->getControls()) {
104 QSizePolicy::Policy aVPolicy = eachWidget->sizePolicy().verticalPolicy();
105 if(aVPolicy == QSizePolicy::Expanding ||
106 aVPolicy == QSizePolicy::MinimumExpanding) {
107 isEnableStretch = false;
111 setStretchEnabled(isEnableStretch);
112 ModuleBase_ModelWidget* aLastWidget = theWidgets.last();
114 QList<QWidget*> aControls = aLastWidget->getControls();
115 if (!aControls.empty()) {
116 QWidget* aLastControl = aControls.last();
118 QPushButton* anOkBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_OK);
119 QPushButton* aCancelBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_CANCEL);
121 setTabOrder(aLastControl, anOkBtn);
122 setTabOrder(anOkBtn, aCancelBtn);
127 const QList<ModuleBase_ModelWidget*>& XGUI_PropertyPanel::modelWidgets() const
132 QWidget* XGUI_PropertyPanel::contentWidget()
134 return myCustomWidget;
137 void XGUI_PropertyPanel::updateContentWidget(FeaturePtr theFeature)
139 // Invalid feature case on abort of the operation
140 if(!theFeature->data())
142 foreach(ModuleBase_ModelWidget* eachWidget, myWidgets)
144 eachWidget->setFeature(theFeature);
145 eachWidget->restoreValue();
147 // the repaint is used here to immediately react in GUI to the values change.
151 void XGUI_PropertyPanel::activateNextWidget(ModuleBase_ModelWidget* theWidget)
153 // TO CHECK: Editing operation does not have automatical activation of widgets
154 if (isEditingMode()) {
155 activateWidget(NULL);
158 ModuleBase_ModelWidget* aNextWidget = 0;
159 QList<ModuleBase_ModelWidget*>::const_iterator anIt = myWidgets.begin(), aLast = myWidgets.end();
160 bool isFoundWidget = false;
161 for (; anIt != aLast && !aNextWidget; anIt++) {
162 if (isFoundWidget || !theWidget) {
163 if ((*anIt)->focusTo()) {
167 isFoundWidget = (*anIt) == theWidget;
169 // Normaly focusTo is enough to activate widget
170 // here is a special case on mouse click in the viewer
171 //if(aNextWidget == NULL) {
172 activateWidget(aNextWidget);
176 void XGUI_PropertyPanel::setStretchEnabled(bool isEnabled)
178 if (myMainLayout->count() == 0)
180 int aStretchIdx = myMainLayout->count() - 1;
181 bool hasStretch = myMainLayout->itemAt(aStretchIdx)->spacerItem() != NULL;
184 if (!hasStretch) myMainLayout->addStretch(1);
185 } else if (hasStretch) {
186 aChild = myMainLayout->takeAt(aStretchIdx);
191 void XGUI_PropertyPanel::activateNextWidget()
193 activateNextWidget(myActiveWidget);
196 void XGUI_PropertyPanel::setAcceptEnabled(bool isEnabled)
198 QPushButton* anOkBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_OK);
199 anOkBtn->setEnabled(isEnabled);
202 void XGUI_PropertyPanel::activateWidget(ModuleBase_ModelWidget* theWidget)
204 // Avoid activation of already actve widget. It could happen on focusIn event many times
205 if (theWidget == myActiveWidget)
208 myActiveWidget->deactivate();
209 myActiveWidget->setHighlighted(false);
212 theWidget->activate();
213 theWidget->setHighlighted(true);
215 myActiveWidget = theWidget;
217 emit widgetActivated(theWidget);
218 else if (!isEditingMode())
219 emit noMoreWidgets();