]> SALOME platform Git repositories - modules/shaper.git/blob - src/ParametersPlugin/ParametersPlugin_WidgetParamsMgr.cpp
Salome HOME
Parameters management implementation
[modules/shaper.git] / src / ParametersPlugin / ParametersPlugin_WidgetParamsMgr.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
2
3 // File:        ParametersPlugin_WidgetParamsMgr.cpp
4 // Created:     11 Apr 2016
5 // Author:      Vitaly SMETANNIKOV
6
7 #include "ParametersPlugin_WidgetParamsMgr.h"
8 #include "ParametersPlugin_Parameter.h"
9
10 #include <ModelAPI_ResultParameter.h>
11 #include <ModelAPI_AttributeString.h>
12 #include <ModelAPI_AttributeRefList.h>
13 #include <ModelAPI_AttributeDouble.h>
14
15 #include <QLayout>
16 #include <QTreeWidget>
17 #include <QPushButton>
18 #include <QToolButton>
19 #include <QStyledItemDelegate>
20 #include <QPainter>
21
22 enum ColumnType {
23   Col_Name,
24   Col_Equation,
25   Col_Result,
26   Col_Comment
27 };
28
29 class ParametersPlugin_ItemDelegate : public QStyledItemDelegate
30 {
31 public:
32   ParametersPlugin_ItemDelegate(QObject* thaParent) : 
33       QStyledItemDelegate(thaParent) {}
34
35   virtual void paint(QPainter* painter, 
36     const QStyleOptionViewItem& option, 
37     const QModelIndex& index ) const;
38   
39   //virtual QWidget* createEditor(QWidget* parent, 
40   //                              const QStyleOptionViewItem& option, 
41   //                              const QModelIndex& index) const;
42
43   bool isEditable(const QModelIndex& theIndex) const;
44 };
45
46 bool ParametersPlugin_ItemDelegate::isEditable(const QModelIndex& theIndex) const
47 {
48   QModelIndex aParent = theIndex.parent();
49   if (aParent.isValid() && (aParent.row() == 0)) {
50     if (theIndex.column() == 2)
51       return false;
52   } else
53     return false;
54   return true;
55 }
56
57 void ParametersPlugin_ItemDelegate::paint(QPainter* painter, 
58                                           const QStyleOptionViewItem& option, 
59                                           const QModelIndex& index ) const
60 {
61   QBrush aBrush = painter->brush();
62   QPen aPen = painter->pen();
63   if (!isEditable(index))
64     painter->setBrush(Qt::lightGray);
65
66   painter->setPen(Qt::darkGray);
67   painter->drawRect(option.rect);
68   
69   QStyledItemDelegate::paint(painter, option, index);
70
71   painter->setPen(aPen);
72   painter->setBrush(aBrush);
73 }
74
75
76 //QWidget* ParametersPlugin_ItemDelegate::createEditor(QWidget* parent, 
77 //                                                    const QStyleOptionViewItem& option, 
78 //                                                    const QModelIndex& index) const
79 //{
80 //  QWidget* aWgt = QStyledItemDelegate::createEditor(parent, option, index); 
81 //  aWgt->setMinimumSize(option.rect.width() - option.decorationSize.width(), 
82 //                       option.rect.height());
83 //  return aWgt;
84 //}
85
86
87 /////////////////////////////////////////////////////////////////////////////////////////////////
88
89 ParametersPlugin_WidgetParamsMgr::ParametersPlugin_WidgetParamsMgr(QWidget* theParent, const Config_WidgetAPI* theData)
90   : ModuleBase_ModelWidget(theParent, theData)
91 {
92   QVBoxLayout* aLayout = new QVBoxLayout(this);
93
94   myTable = new QTreeWidget(this);
95   myTable->setColumnCount(4);
96   QStringList aHeaders;
97   aHeaders << tr("Name") << tr("Equation") << tr("Result") << tr("Comment");
98   myTable->setHeaderLabels(aHeaders);
99   myTable->setColumnWidth(Col_Name, 200);
100   myTable->setColumnWidth(Col_Equation, 100);
101   myTable->setColumnWidth(Col_Result, 80);
102   myTable->setColumnWidth(Col_Comment, 200);
103   myTable->setMinimumWidth(600);
104   myTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
105   connect(myTable, SIGNAL(doubleClicked(const QModelIndex&)),
106           SLOT(onDoubleClick(const QModelIndex&)));
107   //myTable->viewport()->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum));
108
109   myDelegate = new ParametersPlugin_ItemDelegate(myTable);
110   connect(myDelegate, SIGNAL(closeEditor(QWidget*, QAbstractItemDelegate::EndEditHint)), 
111           SLOT(onCloseEditor(QWidget*, QAbstractItemDelegate::EndEditHint)));
112
113   myTable->setItemDelegate(myDelegate);
114   aLayout->addWidget(myTable);
115
116   // Define root nodes
117   QStringList aNames;
118   aNames<<tr("Parameters");
119   myParameters = new QTreeWidgetItem(aNames);
120   myTable->addTopLevelItem(myParameters);
121
122   aNames.clear();
123   aNames<<tr("Features");
124   myFeatures = new QTreeWidgetItem(aNames);
125   myTable->addTopLevelItem(myFeatures);
126
127   QHBoxLayout* aBtnLayout = new QHBoxLayout(this);
128
129   QToolButton* aUpBtn = new QToolButton(this);
130   aUpBtn->setArrowType(Qt::DownArrow);
131   aBtnLayout->addWidget(aUpBtn);
132   QToolButton* aDownBtn = new QToolButton(this);
133   aDownBtn->setArrowType(Qt::UpArrow);
134   aBtnLayout->addWidget(aDownBtn);
135
136   aBtnLayout->addStretch();
137
138   QPushButton* aAddBtn = new QPushButton(tr("Add"), this);
139   aBtnLayout->addWidget(aAddBtn);
140   QPushButton* aInsertBtn = new QPushButton(tr("Insert"), this);
141   aBtnLayout->addWidget(aInsertBtn);
142   QPushButton* aRemoveBtn = new QPushButton(tr("Remove"), this);
143   aBtnLayout->addWidget(aRemoveBtn);
144
145   aLayout->addLayout(aBtnLayout);
146 }
147
148 QList<QWidget*> ParametersPlugin_WidgetParamsMgr::getControls() const
149 {
150   QList<QWidget*> aList;
151
152   return aList;
153 }
154
155 bool ParametersPlugin_WidgetParamsMgr::storeValueCustom() const
156 {
157   return true;
158 }
159
160 bool ParametersPlugin_WidgetParamsMgr::restoreValueCustom()
161 {
162   return true;
163 }
164
165 void ParametersPlugin_WidgetParamsMgr::activateCustom()
166 {
167   FeaturePtr aFeature = feature();
168   DocumentPtr aDoc = aFeature->document();
169   int aNbParam = aDoc->size(ModelAPI_ResultParameter::group());
170   ObjectPtr aObj;
171   QTreeWidgetItem* aItem;
172   ResultParameterPtr aParam;
173   FeaturePtr aParamFeature;
174   for (int i = 0; i < aNbParam; i++) {
175     aObj = aDoc->object(ModelAPI_ResultParameter::group(), i);
176     aParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aObj);
177     if (aParam.get()) {
178       aParamFeature = ModelAPI_Feature::feature(aParam);
179
180       QStringList aValues;
181       aValues << aParamFeature->string(ParametersPlugin_Parameter::VARIABLE_ID())->value().c_str();
182       aValues << aParamFeature->string(ParametersPlugin_Parameter::EXPRESSION_ID())->value().c_str();
183
184       AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
185       aValues << QString::number(aValueAttribute->value());
186
187       //AttributeRefListPtr aParams = aParamFeature->reflist(ParametersPlugin_Parameter::ARGUMENTS_ID());
188       //std::list<ObjectPtr> aList = aParams->list();
189       //std::string aName;
190       //std::list<ObjectPtr>::iterator aIt;
191       //for(aIt = aList.begin(); aIt != aList.end(); aIt++) {
192       //  aObj = (*aIt);
193       //  aName = aObj->data()->name();
194       //}
195       aItem = new QTreeWidgetItem(aValues);
196       aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
197       myParameters->addChild(aItem);
198
199       myFeatureList.append(aParamFeature);
200
201       const std::set<std::shared_ptr<ModelAPI_Attribute>>& aRefs = aParam->data()->refsToMe();
202       std::set<std::shared_ptr<ModelAPI_Attribute> >::const_iterator aIt;
203       for(aIt = aRefs.cbegin(); aIt != aRefs.cend(); aIt++) {
204         FeaturePtr aReferenced = std::dynamic_pointer_cast<ModelAPI_Feature>((*aIt)->owner());
205         if (aReferenced.get()) {
206           QStringList aValNames;
207           aValNames << aReferenced->data()->name().c_str();
208
209           //AttributeDoublePtr aValue = aReferenced->data()->real(SketchPlugin_Constraint::VALUE());
210           //aReferenced
211           aItem = new QTreeWidgetItem(aValNames);
212           myFeatures->addChild(aItem);
213         }
214       }
215     }
216   }
217   myFeatures->setExpanded(true);
218   myParameters->setExpanded(true);
219 }
220
221
222 void ParametersPlugin_WidgetParamsMgr::onDoubleClick(const QModelIndex& theIndex)
223 {
224   if (myDelegate->isEditable(theIndex)) {
225     myTable->edit(theIndex);
226     myEditingIndex = theIndex;
227   }
228 }
229
230 void ParametersPlugin_WidgetParamsMgr::onCloseEditor(QWidget* theEditor, 
231                                                      QAbstractItemDelegate::EndEditHint theHint)
232 {
233   if (myEditingIndex.column() == Col_Equation) {
234     QTreeWidgetItem* aItem = myParameters->child(myEditingIndex.row());
235     QString aText = aItem->text(myEditingIndex.column());
236     if (!aText.isEmpty()) {
237       FeaturePtr aFeature = myFeatureList.at(myEditingIndex.row());
238       AttributeStringPtr aStringAttr = aFeature->string(ParametersPlugin_Parameter::EXPRESSION_ID());
239       aStringAttr->setValue(aText.toStdString());
240       aFeature->execute();
241       ResultParameterPtr aResult = 
242         std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aFeature->firstResult());
243       if (aResult.get()) {
244         AttributeDoublePtr aValueAttribute = 
245           aResult->data()->real(ModelAPI_ResultParameter::VALUE());
246         aItem->setText(Col_Result, QString::number(aValueAttribute->value()));
247       }
248     }
249   }
250   myEditingIndex = QModelIndex();
251 }