2 * XGUI_PropertyPanel.cpp
4 * Created on: Apr 29, 2014
8 #include <XGUI_PropertyPanel.h>
9 //#include <AppElements_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(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(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(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;
80 setWindowTitle(tr("Property Panel"));
83 void XGUI_PropertyPanel::setModelWidgets(const QList<ModuleBase_ModelWidget*>& theWidgets)
85 myWidgets = theWidgets;
86 if (theWidgets.empty()) return;
87 bool isEnableStretch = true;
88 QList<ModuleBase_ModelWidget*>::const_iterator anIt = theWidgets.begin(), aLast =
90 for (; anIt != aLast; anIt++) {
91 connect(*anIt, SIGNAL(keyReleased(QKeyEvent*)), this, SIGNAL(keyReleased(QKeyEvent*)));
92 connect(*anIt, SIGNAL(focusOutWidget(ModuleBase_ModelWidget*)),
93 this, SLOT(activateNextWidget(ModuleBase_ModelWidget*)));
94 connect(*anIt, SIGNAL(focusInWidget(ModuleBase_ModelWidget*)),
95 this, SLOT(activateWidget(ModuleBase_ModelWidget*)));
97 //ModuleBase_WidgetPoint2D* aPointWidget = dynamic_cast<ModuleBase_WidgetPoint2D*>(*anIt);
99 // connect(aPointWidget, SIGNAL(storedPoint2D(ObjectPtr, const std::string&)), this,
100 // SIGNAL(storedPoint2D(ObjectPtr, const std::string&)))
103 if (!isEnableStretch) continue;
104 foreach(QWidget* eachWidget, (*anIt)->getControls()) {
105 QSizePolicy::Policy aVPolicy = eachWidget->sizePolicy().verticalPolicy();
106 if(aVPolicy == QSizePolicy::Expanding ||
107 aVPolicy == QSizePolicy::MinimumExpanding) {
108 isEnableStretch = false;
112 setStretchEnabled(isEnableStretch);
113 ModuleBase_ModelWidget* aLastWidget = theWidgets.last();
115 QList<QWidget*> aControls = aLastWidget->getControls();
116 if (!aControls.empty()) {
117 QWidget* aLastControl = aControls.last();
119 QPushButton* anOkBtn = findChild<QPushButton*>(PROP_PANEL_OK);
120 QPushButton* aCancelBtn = findChild<QPushButton*>(PROP_PANEL_CANCEL);
122 setTabOrder(aLastControl, anOkBtn);
123 setTabOrder(anOkBtn, aCancelBtn);
128 const QList<ModuleBase_ModelWidget*>& XGUI_PropertyPanel::modelWidgets() const
133 QWidget* XGUI_PropertyPanel::contentWidget()
135 return myCustomWidget;
138 void XGUI_PropertyPanel::updateContentWidget(FeaturePtr theFeature)
140 // Invalid feature case on abort of the operation
141 if(!theFeature->data())
143 foreach(ModuleBase_ModelWidget* eachWidget, myWidgets)
145 eachWidget->setFeature(theFeature);
146 eachWidget->restoreValue();
148 // the repaint is used here to immediately react in GUI to the values change.
152 void XGUI_PropertyPanel::activateNextWidget(ModuleBase_ModelWidget* theWidget)
154 // TO CHECK: Editing operation does not have automatical activation of widgets
155 if (isEditingMode()) {
156 activateWidget(NULL);
159 ModuleBase_ModelWidget* aNextWidget = 0;
160 QList<ModuleBase_ModelWidget*>::const_iterator anIt = myWidgets.begin(), aLast = myWidgets.end();
161 bool isFoundWidget = false;
162 for (; anIt != aLast && !aNextWidget; anIt++) {
163 if (isFoundWidget || !theWidget) {
164 if ((*anIt)->focusTo()) {
168 isFoundWidget = (*anIt) == theWidget;
170 // Normaly focusTo is enough to activate widget
171 // here is a special case on mouse click in the viewer
172 //if(aNextWidget == NULL) {
173 activateWidget(aNextWidget);
177 void XGUI_PropertyPanel::setStretchEnabled(bool isEnabled)
179 if (myMainLayout->count() == 0)
181 int aStretchIdx = myMainLayout->count() - 1;
182 bool hasStretch = myMainLayout->itemAt(aStretchIdx)->spacerItem() != NULL;
185 if (!hasStretch) myMainLayout->addStretch(1);
186 } else if (hasStretch) {
187 aChild = myMainLayout->takeAt(aStretchIdx);
192 void XGUI_PropertyPanel::activateNextWidget()
194 activateNextWidget(myActiveWidget);
197 void XGUI_PropertyPanel::setAcceptEnabled(bool isEnabled)
199 QPushButton* anOkBtn = findChild<QPushButton*>(PROP_PANEL_OK);
200 anOkBtn->setEnabled(isEnabled);
203 void XGUI_PropertyPanel::activateWidget(ModuleBase_ModelWidget* theWidget)
205 // Avoid activation of already actve widget. It could happen on focusIn event many times
206 if (theWidget == myActiveWidget)
209 myActiveWidget->deactivate();
210 myActiveWidget->setHighlighted(false);
213 theWidget->activate();
214 theWidget->setHighlighted(true);
216 myActiveWidget = theWidget;
218 emit widgetActivated(theWidget);
219 else if (!isEditingMode())
220 emit noMoreWidgets();