]> SALOME platform Git repositories - modules/shaper.git/blob - src/XGUI/XGUI_ErrorMgr.cpp
Salome HOME
7156e296fffbb4bb4edfef22b9d78a65dfebad6a
[modules/shaper.git] / src / XGUI / XGUI_ErrorMgr.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:        XGUI_ErrorMgr.cpp
4 // Created:     22 July 2015
5 // Author:      Sergey POKHODENKO
6
7 #include "XGUI_ErrorMgr.h"
8
9 #include "XGUI_OperationMgr.h"
10 #include "XGUI_ModuleConnector.h"
11 #include "XGUI_Workshop.h"
12 #include "XGUI_ActionsMgr.h"
13
14 #include <ModuleBase_IPropertyPanel.h>
15 #include <ModuleBase_IWorkshop.h>
16 #include <ModuleBase_IModule.h>
17 #include <ModuleBase_ModelWidget.h>
18 #include <ModuleBase_OperationFeature.h>
19
20 #include <ModelAPI_Attribute.h>
21 #include <ModelAPI_Session.h>
22 #include <ModelAPI_Validator.h>
23
24 #include <QLabel>
25 #include <QAction>
26 #include <QApplication>
27 #include <QDesktopWidget>
28 #include <QDialog>
29 #include <QCursor>
30 #include <QHBoxLayout>
31 #include <QLabel>
32
33 const QString INVALID_VALUE = "invalid_action";
34
35
36 XGUI_ErrorMgr::XGUI_ErrorMgr(QObject* theParent, ModuleBase_IWorkshop* theWorkshop)
37   : ModuleBase_IErrorMgr(theParent),
38     myErrorDialog(0),
39     myErrorLabel(0),
40     myWorkshop(theWorkshop)
41 {
42
43 }
44
45 XGUI_ErrorMgr::~XGUI_ErrorMgr()
46 {
47
48 }
49
50 void XGUI_ErrorMgr::updateActions(const FeaturePtr& theFeature)
51 {
52   //update Ok Action and header of property panel if the current operation started for the feature
53   XGUI_ActionsMgr* anActionsMgr = workshop()->actionsMgr();
54   ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
55                                       (workshop()->operationMgr()->currentOperation());
56   if (aFOperation && aFOperation->feature() == theFeature) {
57     QAction* anOkAction = anActionsMgr->operationStateAction(XGUI_ActionsMgr::Accept);
58     
59     ModuleBase_ModelWidget* anActiveWidget = activeWidget();
60     bool isApplyEnabledByActiveWidget = false;
61     if (anActiveWidget)
62       isApplyEnabledByActiveWidget = anActiveWidget->getValueState() ==
63                                      ModuleBase_ModelWidget::ModifiedInPP;
64     QString anError = "";
65     QString aWidgetError = "";
66     if (!isApplyEnabledByActiveWidget) {
67       anError = myWorkshop->module()->getFeatureError(theFeature);
68       aWidgetError = myWorkshop->module()->getWidgetError(anActiveWidget);
69       if (anError.isEmpty())
70         anError = aWidgetError;
71     }
72     updateActionState(anOkAction, anError);
73     updateToolTip(anActiveWidget, aWidgetError);
74   }
75 }
76
77 void XGUI_ErrorMgr::updateAcceptAllAction(const FeaturePtr& theFeature)
78 {
79   QString anError = myWorkshop->module()->getFeatureError(theFeature);
80   if (anError.isEmpty())
81     anError = myWorkshop->module()->getWidgetError(activeWidget());
82
83   XGUI_ActionsMgr* anActionsMgr = workshop()->actionsMgr();
84   if (workshop()->isFeatureOfNested(theFeature)) {
85     QAction* anAcceptAllAction = anActionsMgr->operationStateAction(XGUI_ActionsMgr::AcceptAll, NULL);
86     bool anEnabled = anError.isEmpty();
87     anAcceptAllAction->setEnabled(anEnabled);
88     anAcceptAllAction->setToolTip(anError);
89   }
90 }
91
92 bool XGUI_ErrorMgr::isApplyEnabled() const
93 {
94   bool isEnabled = false;
95   XGUI_ActionsMgr* anActionsMgr = workshop()->actionsMgr();
96   ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
97                                       (workshop()->operationMgr()->currentOperation());
98   if (aFOperation) {
99     QAction* anOkAction = anActionsMgr->operationStateAction(XGUI_ActionsMgr::Accept);
100     isEnabled = anOkAction && anOkAction->isEnabled();
101   }
102   return isEnabled;
103 }
104
105 void XGUI_ErrorMgr::updateActionState(QAction* theAction, const QString& theError)
106 {
107   bool anEnabled = theError.isEmpty();
108
109   theAction->setEnabled(anEnabled);
110   // some operations have no property panel, so it is important to check that it is not null
111   if (myPropertyPanel) {
112     // update controls error information
113     QWidget* aWidget = myPropertyPanel->headerWidget();
114     if (aWidget)
115       aWidget->setToolTip(theError);
116   }
117 }
118 void XGUI_ErrorMgr::onWidgetChanged()
119 {
120   ModuleBase_ModelWidget* aModelWidget = dynamic_cast<ModuleBase_ModelWidget*>(sender());
121   if (!aModelWidget || !aModelWidget->feature().get())
122     return;
123
124   QString aWidgetError = myWorkshop->module()->getWidgetError(aModelWidget);
125   updateToolTip(aModelWidget, aWidgetError);
126 }
127
128 void XGUI_ErrorMgr::updateToolTip(ModuleBase_ModelWidget* theWidget,
129                                   const QString& theError)
130 {
131   if (!theWidget)
132     return;
133
134   QList<QWidget*> aWidgetList = theWidget->getControls();
135   foreach(QWidget* aWidget, aWidgetList) {
136     QLabel* aLabel = qobject_cast<QLabel*>(aWidget);
137     // We won't set the effect to QLabels - it looks ugly
138     if (aLabel) continue;
139
140     // Get the original tool tip of the widget
141     QString aTTip = aWidget->toolTip().section("Errors:\n", 0, 0).trimmed();
142     // Add the error message into the tool tip
143     if (!theError.isEmpty()) {
144       if (!aTTip.isEmpty())
145         aTTip.append('\n');
146       aTTip += "Errors:\n" + theError;
147     }
148     aWidget->setToolTip(aTTip);
149     //aWidget->setStyleSheet(anError.isEmpty() ? "" : "background-color:pink;");
150   }
151 }
152
153 XGUI_Workshop* XGUI_ErrorMgr::workshop() const
154 {
155   XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(myWorkshop);
156   return aConnector->workshop();
157 }
158
159 ModuleBase_ModelWidget* XGUI_ErrorMgr::activeWidget() const
160 {
161   ModuleBase_ModelWidget* anActiveWidget = 0;
162
163   ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
164                                       (workshop()->operationMgr()->currentOperation());
165   if (aFOperation) {
166     ModuleBase_IPropertyPanel* aPropertyPanel = aFOperation->propertyPanel();
167     if (aPropertyPanel) {
168       anActiveWidget = aPropertyPanel->activeWidget();
169     }
170   }
171   return anActiveWidget;
172 }
173