]> SALOME platform Git repositories - modules/shaper.git/blob - src/XGUI/XGUI_PropertyPanel.cpp
Salome HOME
Merge branch 'master' of newgeom:newgeom
[modules/shaper.git] / src / XGUI / XGUI_PropertyPanel.cpp
1 /*
2  * XGUI_PropertyPanel.cpp
3  *
4  *  Created on: Apr 29, 2014
5  *      Author: sbh
6  */
7
8 #include <XGUI_Constants.h>
9 #include <XGUI_PropertyPanel.h>
10
11 #include <QWidget>
12 #include <QVBoxLayout>
13 #include <QFrame>
14 #include <QPushButton>
15 #include <QIcon>
16 #include <QVBoxLayout>
17 #include <QEvent>
18 #include <QKeyEvent>
19
20 #ifdef _DEBUG
21 #include <iostream>
22 #endif
23
24 XGUI_PropertyPanel::XGUI_PropertyPanel(QWidget* theParent)
25 {
26   this->setWindowTitle(tr("Property Panel"));
27   QAction* aViewAct = this->toggleViewAction();
28   this->setObjectName(XGUI::PROP_PANEL);
29   setStyleSheet("::title { position: relative; padding-left: 5px; text-align: left center }");
30
31   QWidget* aContent = new QWidget(this);
32   myMainLayout = new QVBoxLayout(aContent);
33   myMainLayout->setContentsMargins(3, 3, 3, 3);
34   this->setWidget(aContent);
35
36   QFrame* aFrm = new QFrame(aContent);
37   aFrm->setFrameStyle(QFrame::Sunken);
38   aFrm->setFrameShape(QFrame::Panel);
39   QHBoxLayout* aBtnLay = new QHBoxLayout(aFrm);
40   aBtnLay->setContentsMargins(0, 0, 0, 0);
41   myMainLayout->addWidget(aFrm);
42
43   QPushButton* aBtn = new QPushButton(QIcon(":pictures/button_help.png"), "", aFrm);
44   aBtn->setFlat(true);
45   aBtnLay->addWidget(aBtn);
46   aBtnLay->addStretch(1);
47   aBtn = new QPushButton(QIcon(":pictures/button_ok.png"), "", aFrm);
48   aBtn->setObjectName(XGUI::PROP_PANEL_OK);
49   aBtn->setToolTip(tr("Ok"));
50   aBtn->setFlat(true);
51   aBtnLay->addWidget(aBtn);
52   aBtn->installEventFilter(this);
53
54   aBtn = new QPushButton(QIcon(":pictures/button_cancel.png"), "", aFrm);
55   aBtn->setToolTip(tr("Cancel"));
56   aBtn->setObjectName(XGUI::PROP_PANEL_CANCEL);
57   aBtn->setFlat(true);
58   aBtnLay->addWidget(aBtn);
59
60   myCustomWidget = new QWidget(aContent);
61   myMainLayout->addWidget(myCustomWidget);
62   myMainLayout->addStretch(1);
63
64   aBtn->installEventFilter(this);
65 }
66
67 XGUI_PropertyPanel::~XGUI_PropertyPanel()
68 {
69 }
70
71 void XGUI_PropertyPanel::cleanContent()
72 {
73   myWidgets.clear();
74   
75   QLayoutItem* aItem = myMainLayout->takeAt(myMainLayout->count() - 1);
76   delete aItem;
77
78   myMainLayout->removeWidget(myCustomWidget);
79   delete myCustomWidget;
80
81   myCustomWidget = new QWidget(widget());
82   myMainLayout->addWidget(myCustomWidget);
83   myMainLayout->addStretch(1);
84 }
85
86 void XGUI_PropertyPanel::setModelWidgets(const QList<ModuleBase_ModelWidget*>& theWidgets)
87 {
88   myWidgets = theWidgets;
89
90   if (!theWidgets.empty()) {
91     QList<ModuleBase_ModelWidget*>::const_iterator anIt = theWidgets.begin(), aLast = theWidgets.end();
92     for (; anIt != aLast; anIt++) {
93       connect(*anIt, SIGNAL(keyReleased(const std::string&, QKeyEvent*)),
94               this, SIGNAL(keyReleased(const std::string&, QKeyEvent*)));
95
96       connect(*anIt, SIGNAL(focusOutWidget(ModuleBase_ModelWidget*)),
97               this, SLOT(onActivateNextWidget(ModuleBase_ModelWidget*)));
98     }
99     ModuleBase_ModelWidget* aLastWidget = theWidgets.last();
100     if (aLastWidget) {
101       QList<QWidget*> aControls = aLastWidget->getControls();
102       if (!aControls.empty()) {
103         QWidget* aLastControl = aControls.last();
104
105         QPushButton* anOkBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_OK);
106         QPushButton* aCancelBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_CANCEL);
107
108         setTabOrder(aLastControl, anOkBtn);
109         setTabOrder(anOkBtn, aCancelBtn);
110       }
111     }
112     ModuleBase_ModelWidget* aWidget = theWidgets.first();
113     if (aWidget) {
114       activateWidget(aWidget);
115     }
116   }
117 }
118
119 bool XGUI_PropertyPanel::eventFilter(QObject *theObject, QEvent *theEvent)
120 {
121   QPushButton* anOkBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_OK);
122   QPushButton* aCancelBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_CANCEL);
123   if (theObject == anOkBtn || theObject == aCancelBtn) {
124     if (theEvent->type() == QEvent::KeyRelease) {
125       QKeyEvent* aKeyEvent = (QKeyEvent*)theEvent;
126       if (aKeyEvent && aKeyEvent->key() == Qt::Key_Return) {
127         // TODO: this is enter button processing when the focus is on "Apply" or "Cancel" buttons
128         emit keyReleased("", (QKeyEvent*) theEvent);
129         return true;
130       }
131     }
132   }
133   return QDockWidget::eventFilter(theObject, theEvent);
134 }
135
136 QWidget* XGUI_PropertyPanel::contentWidget()
137 {
138   return myCustomWidget;
139 }
140
141 void XGUI_PropertyPanel::updateContentWidget(FeaturePtr theFeature)
142 {
143   foreach(ModuleBase_ModelWidget* eachWidget, myWidgets) {
144     eachWidget->restoreValue(theFeature);
145   }
146   // the repaint is used here to immediatelly react in GUI to the values change.
147   repaint();
148 }
149
150 void XGUI_PropertyPanel::onFocusActivated(const std::string& theAttributeName)
151 {
152   if (theAttributeName == XGUI::PROP_PANEL_OK) {
153     QPushButton* aBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_OK);
154     aBtn->setFocus();
155   }
156   if (theAttributeName == XGUI::PROP_PANEL_CANCEL) {
157     QPushButton* aBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_CANCEL);
158     aBtn->setFocus();
159   }
160   else {
161     foreach(ModuleBase_ModelWidget* eachWidget, myWidgets) {
162       if (eachWidget->canFocusTo(theAttributeName)) {
163         eachWidget->focusTo();
164         break;
165       }
166     }
167   }
168 }
169
170 void XGUI_PropertyPanel::onActivateNextWidget(ModuleBase_ModelWidget* theWidget)
171 {
172   ModuleBase_ModelWidget* aNextWidget = 0;
173
174   QList<ModuleBase_ModelWidget*>::const_iterator anIt = myWidgets.begin(),
175                                                  aLast = myWidgets.end();
176   for (;anIt != aLast; anIt++)
177   {
178     if ((*anIt) == theWidget) {
179       anIt++;
180       if (anIt != aLast)
181         aNextWidget = *anIt;
182       break;
183     }
184   }
185   activateWidget(aNextWidget);
186 }
187
188 void XGUI_PropertyPanel::activateWidget(ModuleBase_ModelWidget* theWidget)
189 {
190   if (theWidget)
191     theWidget->focusTo();
192   emit widgetActivated(theWidget);
193 }