Salome HOME
Issue #979: Manage parameters
[modules/shaper.git] / src / ModuleBase / ModuleBase_Dialog.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3
4 #include "ModuleBase_Dialog.h"
5 #include "ModuleBase_WidgetFactory.h"
6 #include "ModuleBase_IWorkshop.h"
7 #include "ModuleBase_IPropertyPanel.h"
8 #include "ModuleBase_PageWidget.h"
9
10 #include <ModelAPI_Session.h>
11 #include <ModelAPI_Events.h>
12 #include <Events_Loop.h>
13
14 #include <QMainWindow>
15 #include <QLayout>
16 #include <QDialogButtonBox>
17 #include <QPushButton>
18
19
20 ModuleBase_Dialog::ModuleBase_Dialog(ModuleBase_IWorkshop* theParent, const QString& theId, 
21                                      const std::string& theDescription) : 
22                                      QDialog(theParent->desktop()), 
23                                      myId(theId), 
24                                      myDescription(theDescription), 
25                                      myWorkshop(theParent),
26                                      myActiveWidget(0)
27 {
28   ModuleBase_WidgetFactory aFactory(myDescription, myWorkshop);
29
30   SessionPtr aMgr = ModelAPI_Session::get();
31   std::shared_ptr<ModelAPI_Document> aDoc = aMgr->activeDocument();
32
33   aMgr->startOperation(myId.toStdString());
34   myFeature = aDoc->addFeature(myId.toStdString());
35   if (!myFeature.get())
36     return;
37   Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
38   Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
39
40   QVBoxLayout* aLayout = new QVBoxLayout(this);
41   aLayout->setContentsMargins(0, 0, 0, 0);
42   aLayout->setSpacing(1);
43   //setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred));
44
45   ModuleBase_PageWidget* aPage = new ModuleBase_PageWidget(this);
46   aLayout->addWidget(aPage);
47
48   aFactory.createWidget(aPage, false);
49   myWidgets = aFactory.getModelWidgets();
50   foreach (ModuleBase_ModelWidget* aWidget, myWidgets) {
51     initializeWidget(aWidget);
52   }
53
54   QFrame* aFrame = new QFrame(this);
55   aFrame->setFrameStyle(QFrame::WinPanel | QFrame::Raised);
56   aLayout->addWidget(aFrame);
57
58   QVBoxLayout* aBtnLayout = new QVBoxLayout(aFrame);
59   ModuleBase_Tools::adjustMargins(aBtnLayout);
60
61   QDialogButtonBox* aBtnBox = new QDialogButtonBox(
62     QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, aFrame);
63   aBtnLayout->addWidget(aBtnBox);
64
65   aBtnBox->button(QDialogButtonBox::Ok)->setIcon(QIcon(":pictures/button_ok.png"));
66   aBtnBox->button(QDialogButtonBox::Cancel)->setIcon(QIcon(":pictures/button_cancel.png"));
67
68   connect(aBtnBox, SIGNAL(accepted()), this, SLOT(accept()));
69   connect(aBtnBox, SIGNAL(rejected()), this, SLOT(reject()));
70 }
71
72 void ModuleBase_Dialog::initializeWidget(ModuleBase_ModelWidget* theWidget)
73 {
74   theWidget->setFeature(myFeature);
75 }
76
77 void ModuleBase_Dialog::showEvent(QShowEvent* theEvent)
78 {
79   QDialog::showEvent(theEvent);
80   if (myWidgets.length() > 0) {
81     myActiveWidget = myWidgets.first();
82     myActiveWidget->activate();
83   }
84 }
85
86 void ModuleBase_Dialog::accept()
87 {
88   if (myActiveWidget) {
89     if (!myActiveWidget->storeValue())
90       return;
91   }
92   QDialog::accept();
93 }