]> SALOME platform Git repositories - modules/shaper.git/blob - src/XGUI/XGUI_PropertyPanel.cpp
Salome HOME
Merge branch 'GeomAPI'
[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   QVBoxLayout* aMainLay = new QVBoxLayout(aContent);
33   aMainLay->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   aMainLay->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   aMainLay->addWidget(myCustomWidget);
62   aMainLay->addStretch(1);
63
64   aBtn->installEventFilter(this);
65 }
66
67 XGUI_PropertyPanel::~XGUI_PropertyPanel()
68 {
69 }
70
71 void XGUI_PropertyPanel::setModelWidgets(const QList<ModuleBase_ModelWidget*>& theWidgets)
72 {
73   myWidgets = theWidgets;
74
75   if (!theWidgets.empty()) {
76
77     QList<ModuleBase_ModelWidget*>::const_iterator anIt = theWidgets.begin(), aLast = theWidgets.end();
78     for (; anIt != aLast; anIt++) {
79       connect(*anIt, SIGNAL(keyReleased(const std::string&, QKeyEvent*)),
80               this, SIGNAL(keyReleased(const std::string&, QKeyEvent*)));
81     }
82     ModuleBase_ModelWidget* aLastWidget = theWidgets.last();
83     if (aLastWidget) {
84       QList<QWidget*> aControls = aLastWidget->getControls();
85       if (!aControls.empty()) {
86         QWidget* aLastControl = aControls.last();
87
88         QPushButton* anOkBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_OK);
89         QPushButton* aCancelBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_CANCEL);
90
91         setTabOrder(aLastControl, anOkBtn);
92         setTabOrder(anOkBtn, aCancelBtn);
93       }
94     }
95   }
96 }
97
98 bool XGUI_PropertyPanel::eventFilter(QObject *theObject, QEvent *theEvent)
99 {
100   QPushButton* anOkBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_OK);
101   QPushButton* aCancelBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_CANCEL);
102   if (theObject == anOkBtn || theObject == aCancelBtn) {
103     if (theEvent->type() == QEvent::KeyRelease) {
104       QKeyEvent* aKeyEvent = (QKeyEvent*)theEvent;
105       if (aKeyEvent && aKeyEvent->key() == Qt::Key_Return) {
106         // TODO: this is enter button processing when the focus is on "Apply" or "Cancel" buttons
107         emit keyReleased("", (QKeyEvent*) theEvent);
108         return true;
109       }
110     }
111   }
112   return QDockWidget::eventFilter(theObject, theEvent);
113 }
114
115 QWidget* XGUI_PropertyPanel::contentWidget()
116 {
117   return myCustomWidget;
118 }
119
120 void XGUI_PropertyPanel::updateContentWidget(boost::shared_ptr<ModelAPI_Feature> theFeature)
121 {
122   foreach(ModuleBase_ModelWidget* eachWidget, myWidgets) {
123     eachWidget->restoreValue(theFeature);
124   }
125   // the repaint is used here to immediatelly react in GUI to the values change.
126   repaint();
127 }
128
129 void XGUI_PropertyPanel::onFocusActivated(const std::string& theAttributeName)
130 {
131   if (theAttributeName == XGUI::PROP_PANEL_OK) {
132     QPushButton* aBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_OK);
133     aBtn->setFocus();
134   }
135   if (theAttributeName == XGUI::PROP_PANEL_CANCEL) {
136     QPushButton* aBtn = findChild<QPushButton*>(XGUI::PROP_PANEL_CANCEL);
137     aBtn->setFocus();
138   }
139   else {
140     foreach(ModuleBase_ModelWidget* eachWidget, myWidgets) {
141       if (eachWidget->focusTo(theAttributeName))
142         break;
143     }
144   }
145 }