1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
3 // File: ParametersPlugin_WidgetParamsMgr.cpp
4 // Created: 11 Apr 2016
5 // Author: Vitaly SMETANNIKOV
7 #include "ParametersPlugin_WidgetParamsMgr.h"
8 #include "ParametersPlugin_Parameter.h"
10 #include <ModelAPI_ResultParameter.h>
11 #include <ModelAPI_AttributeString.h>
12 #include <ModelAPI_AttributeRefList.h>
13 #include <ModelAPI_AttributeDouble.h>
14 #include <ModelAPI_AttributeInteger.h>
15 #include <ModelAPI_Events.h>
16 #include <ModelAPI_Session.h>
18 #include <Events_Loop.h>
21 #include <QTreeWidget>
22 #include <QPushButton>
23 #include <QToolButton>
24 #include <QStyledItemDelegate>
26 #include <QMessageBox>
36 const char* NoName = "<NoName>";
37 const char* NoValue = "<NoValue>";
39 class ParametersPlugin_ItemDelegate : public QStyledItemDelegate
42 ParametersPlugin_ItemDelegate(QObject* thaParent) :
43 QStyledItemDelegate(thaParent) {}
45 virtual void paint(QPainter* painter,
46 const QStyleOptionViewItem& option,
47 const QModelIndex& index ) const;
49 //virtual QWidget* createEditor(QWidget* parent,
50 // const QStyleOptionViewItem& option,
51 // const QModelIndex& index) const;
53 bool isEditable(const QModelIndex& theIndex) const;
56 bool ParametersPlugin_ItemDelegate::isEditable(const QModelIndex& theIndex) const
58 QModelIndex aParent = theIndex.parent();
59 if (aParent.isValid() && (aParent.row() == 0)) {
60 if (theIndex.column() == 2)
67 void ParametersPlugin_ItemDelegate::paint(QPainter* painter,
68 const QStyleOptionViewItem& option,
69 const QModelIndex& index ) const
71 QBrush aBrush = painter->brush();
72 QPen aPen = painter->pen();
73 if (!isEditable(index))
74 painter->setBrush(Qt::lightGray);
76 painter->setPen(Qt::darkGray);
77 painter->drawRect(option.rect);
78 painter->setPen(aPen);
80 //QString aText = index.data().toString();
81 //if ((aText == NoName) || (aText == NoValue))
82 // painter->setPen(Qt::red);
84 QStyledItemDelegate::paint(painter, option, index);
86 //painter->setPen(aPen);
87 painter->setBrush(aBrush);
91 //QWidget* ParametersPlugin_ItemDelegate::createEditor(QWidget* parent,
92 // const QStyleOptionViewItem& option,
93 // const QModelIndex& index) const
95 // QWidget* aWgt = QStyledItemDelegate::createEditor(parent, option, index);
96 // aWgt->setMinimumSize(option.rect.width() - option.decorationSize.width(),
97 // option.rect.height());
102 /////////////////////////////////////////////////////////////////////////////////////////////////
104 ParametersPlugin_WidgetParamsMgr::ParametersPlugin_WidgetParamsMgr(QWidget* theParent, const Config_WidgetAPI* theData)
105 : ModuleBase_ModelWidget(theParent, theData)
107 QVBoxLayout* aLayout = new QVBoxLayout(this);
109 myTable = new QTreeWidget(this);
110 myTable->setColumnCount(4);
111 QStringList aHeaders;
112 aHeaders << tr("Name") << tr("Equation") << tr("Result") << tr("Comment");
113 myTable->setHeaderLabels(aHeaders);
114 myTable->setColumnWidth(Col_Name, 200);
115 myTable->setColumnWidth(Col_Equation, 100);
116 myTable->setColumnWidth(Col_Result, 80);
117 myTable->setColumnWidth(Col_Comment, 200);
118 myTable->setMinimumWidth(600);
119 myTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
120 connect(myTable, SIGNAL(doubleClicked(const QModelIndex&)),
121 SLOT(onDoubleClick(const QModelIndex&)));
122 //myTable->viewport()->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum));
124 myDelegate = new ParametersPlugin_ItemDelegate(myTable);
125 connect(myDelegate, SIGNAL(closeEditor(QWidget*, QAbstractItemDelegate::EndEditHint)),
126 SLOT(onCloseEditor(QWidget*, QAbstractItemDelegate::EndEditHint)));
128 myTable->setItemDelegate(myDelegate);
129 aLayout->addWidget(myTable);
133 aNames<<tr("Parameters");
134 myParameters = new QTreeWidgetItem(aNames);
135 myTable->addTopLevelItem(myParameters);
138 aNames<<tr("Features");
139 myFeatures = new QTreeWidgetItem(aNames);
140 myTable->addTopLevelItem(myFeatures);
142 QHBoxLayout* aBtnLayout = new QHBoxLayout(this);
144 QToolButton* aUpBtn = new QToolButton(this);
145 aUpBtn->setArrowType(Qt::UpArrow);
146 connect(aUpBtn, SIGNAL(clicked(bool)), SLOT(onUp()));
147 aBtnLayout->addWidget(aUpBtn);
149 QToolButton* aDownBtn = new QToolButton(this);
150 aDownBtn->setArrowType(Qt::DownArrow);
151 connect(aDownBtn, SIGNAL(clicked(bool)), SLOT(onDown()));
152 aBtnLayout->addWidget(aDownBtn);
154 aBtnLayout->addStretch();
156 QPushButton* aAddBtn = new QPushButton(tr("Add"), this);
157 connect(aAddBtn, SIGNAL(clicked(bool)), SLOT(onAdd()));
158 aBtnLayout->addWidget(aAddBtn);
160 QPushButton* aInsertBtn = new QPushButton(tr("Insert"), this);
161 connect(aInsertBtn, SIGNAL(clicked(bool)), SLOT(onInsert()));
162 aBtnLayout->addWidget(aInsertBtn);
164 QPushButton* aRemoveBtn = new QPushButton(tr("Remove"), this);
165 connect(aRemoveBtn, SIGNAL(clicked(bool)), SLOT(onRemove()));
166 aBtnLayout->addWidget(aRemoveBtn);
168 aLayout->addLayout(aBtnLayout);
171 QList<QWidget*> ParametersPlugin_WidgetParamsMgr::getControls() const
173 QList<QWidget*> aList;
178 bool ParametersPlugin_WidgetParamsMgr::storeValueCustom()
180 for(int i = 0; i < myParameters->childCount(); i++) {
181 QTreeWidgetItem* aItem = myParameters->child(i);
182 if ((aItem->text(Col_Name) == NoName) || (aItem->text(Col_Equation) == NoValue)) {
183 QMessageBox::warning(this, tr("Warning"), tr("Created parameter is not defined properly."));
185 // The index of myParameters item
186 QModelIndex aParent = myTable->model()->index(0, 0);
187 int aRow = myParameters->indexOfChild(aItem);
188 QModelIndex aIndex = myTable->model()->index(aRow, Col_Name, aParent);
189 myTable->selectionModel()->select(aIndex,
190 QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
191 myTable->scrollToItem(aItem);
198 bool ParametersPlugin_WidgetParamsMgr::restoreValueCustom()
203 void ParametersPlugin_WidgetParamsMgr::activateCustom()
205 FeaturePtr aFeature = feature();
206 DocumentPtr aDoc = aFeature->document();
207 int aNbParam = aDoc->size(ModelAPI_ResultParameter::group());
209 QTreeWidgetItem* aItem;
210 ResultParameterPtr aParam;
211 FeaturePtr aParamFeature;
212 for (int i = 0; i < aNbParam; i++) {
213 aObj = aDoc->object(ModelAPI_ResultParameter::group(), i);
214 aParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aObj);
216 // Set parameter feature
217 aParamFeature = ModelAPI_Feature::feature(aParam);
220 aValues << aParamFeature->string(ParametersPlugin_Parameter::VARIABLE_ID())->value().c_str();
221 aValues << aParamFeature->string(ParametersPlugin_Parameter::EXPRESSION_ID())->value().c_str();
223 AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
224 aValues << QString::number(aValueAttribute->value());
226 aValues << aParamFeature->string(ParametersPlugin_Parameter::COMMENT_ID())->value().c_str();
228 aItem = new QTreeWidgetItem(aValues);
229 aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
230 myParameters->addChild(aItem);
232 myParametersList.append(aParamFeature);
234 // Set features where the parameter is used
235 const std::set<std::shared_ptr<ModelAPI_Attribute>>& aRefs = aParam->data()->refsToMe();
236 std::set<std::shared_ptr<ModelAPI_Attribute> >::const_iterator aIt;
237 for(aIt = aRefs.cbegin(); aIt != aRefs.cend(); aIt++) {
238 std::shared_ptr<ModelAPI_Attribute> aAttr = (*aIt);
239 FeaturePtr aReferenced = std::dynamic_pointer_cast<ModelAPI_Feature>(aAttr->owner());
240 if (aReferenced.get()) {
241 QStringList aValNames;
242 aValNames << aReferenced->data()->name().c_str();
244 AttributeDoublePtr aDouble = std::dynamic_pointer_cast<ModelAPI_AttributeDouble>(aAttr);
246 aValNames << aDouble->text().c_str();
247 aValNames << QString::number(aDouble->value());
249 AttributeIntegerPtr aInt = std::dynamic_pointer_cast<ModelAPI_AttributeInteger>(aAttr);
251 aValNames << aInt->text().c_str();
252 aValNames << QString::number(aInt->value());
256 aItem = new QTreeWidgetItem(aValNames);
257 myFeatures->addChild(aItem);
262 myFeatures->setExpanded(true);
263 myParameters->setExpanded(true);
267 void ParametersPlugin_WidgetParamsMgr::onDoubleClick(const QModelIndex& theIndex)
269 if (myDelegate->isEditable(theIndex)) {
270 myTable->edit(theIndex);
271 myEditingIndex = theIndex;
275 void ParametersPlugin_WidgetParamsMgr::onCloseEditor(QWidget* theEditor,
276 QAbstractItemDelegate::EndEditHint theHint)
278 FeaturePtr aFeature = myParametersList.at(myEditingIndex.row());
279 QTreeWidgetItem* aItem = myParameters->child(myEditingIndex.row());
280 int aColumn = myEditingIndex.column();
281 QString aText = aItem->text(aColumn);
282 bool isModified = false;
287 AttributeStringPtr aStringAttr = aFeature->string(ParametersPlugin_Parameter::VARIABLE_ID());
288 if (!aText.isEmpty()) {
289 if (hasName(aText)) {
290 myMessage = tr("Name %1 already exists.").arg(aText);
291 aItem->setText(Col_Name, aStringAttr->value().c_str());
292 QTimer::singleShot(50, this, SLOT(sendWarning()));
295 aStringAttr->setValue(aText.toStdString());
298 aItem->setText(Col_Name, aStringAttr->value().c_str());
304 AttributeStringPtr aStringAttr = aFeature->string(ParametersPlugin_Parameter::EXPRESSION_ID());
305 if (!aText.isEmpty()) {
306 if (aText != aStringAttr->value().c_str()) {
307 aStringAttr->setValue(aText.toStdString());
311 aItem->setText(Col_Equation, aStringAttr->value().c_str());
317 AttributeStringPtr aStringAttr = aFeature->string(ParametersPlugin_Parameter::COMMENT_ID());
318 aStringAttr->setValue(aText.toStdString());
326 Events_Loop* aLoop = Events_Loop::loop();
327 aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
329 ResultParameterPtr aResult =
330 std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aFeature->firstResult());
332 AttributeDoublePtr aValueAttribute =
333 aResult->data()->real(ModelAPI_ResultParameter::VALUE());
334 aItem->setText(Col_Result, QString::number(aValueAttribute->value()));
336 myEditingIndex = QModelIndex();
337 updateFeaturesPart();
340 void ParametersPlugin_WidgetParamsMgr::updateFeaturesPart()
342 std::shared_ptr<ModelAPI_ResultParameter> aParam;
344 foreach(FeaturePtr aFeature, myParametersList) {
345 aParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aFeature->firstResult());
346 const std::set<std::shared_ptr<ModelAPI_Attribute>>& aRefs = aParam->data()->refsToMe();
347 std::set<std::shared_ptr<ModelAPI_Attribute> >::const_iterator aIt;
348 for(aIt = aRefs.cbegin(); aIt != aRefs.cend(); aIt++) {
349 std::shared_ptr<ModelAPI_Attribute> aAttr = (*aIt);
350 FeaturePtr aReferenced = std::dynamic_pointer_cast<ModelAPI_Feature>(aAttr->owner());
351 if (aReferenced.get()) {
352 QStringList aValNames;
353 aValNames << aReferenced->data()->name().c_str();
355 AttributeDoublePtr aDouble = std::dynamic_pointer_cast<ModelAPI_AttributeDouble>(aAttr);
357 aValNames << aDouble->text().c_str();
358 aValNames << QString::number(aDouble->value());
360 AttributeIntegerPtr aInt = std::dynamic_pointer_cast<ModelAPI_AttributeInteger>(aAttr);
362 aValNames << aInt->text().c_str();
363 aValNames << QString::number(aInt->value());
367 QTreeWidgetItem* aItem = myFeatures->child(i++);
368 for(int i = 0; i < aValNames.count(); i++)
369 aItem->setText(i, aValNames.at(i));
375 void ParametersPlugin_WidgetParamsMgr::onAdd()
377 SessionPtr aMgr = ModelAPI_Session::get();
378 std::shared_ptr<ModelAPI_Document> aDoc = aMgr->activeDocument();
380 FeaturePtr aFeature = aDoc->addFeature(ParametersPlugin_Parameter::ID());
383 Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
384 Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
390 QTreeWidgetItem* aItem = new QTreeWidgetItem(aValues);
391 aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
392 myParameters->addChild(aItem);
393 myParametersList.append(aFeature);
395 myTable->scrollToItem(aItem);
398 void ParametersPlugin_WidgetParamsMgr::onInsert()
402 void ParametersPlugin_WidgetParamsMgr::onRemove()
406 void ParametersPlugin_WidgetParamsMgr::onUp()
410 void ParametersPlugin_WidgetParamsMgr::onDown()
415 bool ParametersPlugin_WidgetParamsMgr::hasName(const QString& theName) const
417 foreach(FeaturePtr aFeature, myParametersList) {
418 if (aFeature->data()->name() == theName.toStdString())
424 void ParametersPlugin_WidgetParamsMgr::sendWarning()
426 QMessageBox::warning(this, tr("Warning"), myMessage);