1 // Copyright (C) 2014-2019 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "ParametersPlugin_WidgetParamsMgr.h"
21 #include "ParametersPlugin_Parameter.h"
22 #include "ParametersPlugin_Validators.h"
24 #include <Events_InfoMessage.h>
26 #include <ModelAPI_ResultParameter.h>
27 #include <ModelAPI_AttributeString.h>
28 #include <ModelAPI_AttributeRefList.h>
29 #include <ModelAPI_AttributeDouble.h>
30 #include <ModelAPI_AttributeInteger.h>
31 #include <ModelAPI_Events.h>
32 #include <ModelAPI_Session.h>
33 #include <ModelAPI_Tools.h>
34 #include <ModelAPI_Expression.h>
36 #include <GeomDataAPI_Point.h>
37 #include <GeomDataAPI_Point2D.h>
39 #include <ModuleBase_Tools.h>
41 #include <Events_Loop.h>
44 #include <QPushButton>
45 #include <QToolButton>
46 #include <QStyledItemDelegate>
48 #include <QMessageBox>
52 #include <QDialogButtonBox>
61 const char* NoName = "<NoName>";
62 const char* NoValue = "<NoValue>";
63 const char* NotValid = "<NotValid>";
67 * ItemDelegate object in order to redefine items behavior
69 class ParametersPlugin_ItemDelegate : public QStyledItemDelegate
73 /// \param thaParent a parent
74 ParametersPlugin_ItemDelegate(QObject* thaParent) :
75 QStyledItemDelegate(thaParent) {}
77 /// Redefinition of virtual method
78 /// \param painter a painter object
79 /// \param option the item options
80 /// \param index the current index
81 virtual void paint(QPainter* painter,
82 const QStyleOptionViewItem& option,
83 const QModelIndex& index ) const;
85 /// Redefinition of virtual method
86 /// \param parent a parent widget
87 /// \param option the item options
88 /// \param index the current index
89 virtual QWidget* createEditor(QWidget* parent,
90 const QStyleOptionViewItem& option,
91 const QModelIndex& index) const;
93 /// Returns True if the given index is editable item
94 /// \param theIndex an item index
95 bool isEditable(const QModelIndex& theIndex) const;
97 /// Returns currently editing index
98 QModelIndex editIndex() const { return myEditingIdx; }
101 mutable QModelIndex myEditingIdx;
104 bool ParametersPlugin_ItemDelegate::isEditable(const QModelIndex& theIndex) const
106 QModelIndex aParent = theIndex.parent();
107 if (aParent.isValid() && (aParent.row() == 0)) {
108 if (theIndex.column() == 2)
115 void ParametersPlugin_ItemDelegate::paint(QPainter* painter,
116 const QStyleOptionViewItem& option,
117 const QModelIndex& index ) const
119 QBrush aBrush = painter->brush();
120 QPen aPen = painter->pen();
121 //if (!isEditable(index))
122 // painter->setBrush(Qt::lightGray);
123 if (!index.parent().isValid())
124 painter->setBrush(Qt::lightGray);
126 painter->setPen(Qt::lightGray);
127 painter->drawRect(option.rect);
128 painter->setPen(aPen);
130 QStyledItemDelegate::paint(painter, option, index);
131 painter->setBrush(aBrush);
134 QWidget* ParametersPlugin_ItemDelegate::createEditor(QWidget* parent,
135 const QStyleOptionViewItem& option,
136 const QModelIndex& index) const
138 myEditingIdx = index;
139 return QStyledItemDelegate::createEditor(parent, option, index);
142 /////////////////////////////////////////////////////////////////////////////////////////////////
143 void ParametersPlugin_TreeWidget::closeEditor(QWidget* theEditor,
144 QAbstractItemDelegate::EndEditHint theHint)
146 if (theHint == QAbstractItemDelegate::EditNextItem) {
147 QModelIndex aCurrent = currentIndex();
148 QModelIndex aParent = model()->index(0, 0);
149 int aNbRows = model()->rowCount(aParent);
151 switch (aCurrent.column()) {
153 aIdx = model()->index(aCurrent.row(), 1, aParent);
156 if (aCurrent.row() < (aNbRows - 1))
157 aIdx = model()->index(aCurrent.row() + 1, 0, aParent);
159 QTreeWidget::closeEditor(theEditor, QAbstractItemDelegate::NoHint);
164 QTreeWidget::closeEditor(theEditor, theHint);
167 if (aIdx.isValid()) {
168 QTreeWidget::closeEditor(theEditor, QAbstractItemDelegate::NoHint);
169 setCurrentIndex(aIdx);
174 QTreeWidget::closeEditor(theEditor, theHint);
177 /////////////////////////////////////////////////////////////////////////////////////////////////
179 ParametersPlugin_WidgetParamsMgr::ParametersPlugin_WidgetParamsMgr(QWidget* theParent,
180 const Config_WidgetAPI* theData)
181 : ModuleBase_ModelDialogWidget(theParent, theData),
182 isUpplyBlocked(false)
184 QVBoxLayout* aLayout = new QVBoxLayout(this);
186 myTable = new ParametersPlugin_TreeWidget(this);
187 myTable->setColumnCount(4);
188 QStringList aHeaders;
189 aHeaders << tr("Name") << tr("Expression") << tr("Result") << tr("Comment");
190 myTable->setHeaderLabels(aHeaders);
191 myTable->setColumnWidth(Col_Name, 200);
192 myTable->setColumnWidth(Col_Equation, 100);
193 myTable->setColumnWidth(Col_Result, 80);
194 myTable->setColumnWidth(Col_Comment, 200);
195 myTable->setMinimumWidth(600);
196 myTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
197 myTable->setSelectionMode(QAbstractItemView::SingleSelection);
199 connect(myTable, SIGNAL(doubleClicked(const QModelIndex&)),
200 SLOT(onDoubleClick(const QModelIndex&)));
201 connect(myTable, SIGNAL(itemSelectionChanged()), SLOT(onSelectionChanged()));
203 myDelegate = new ParametersPlugin_ItemDelegate(myTable);
204 connect(myDelegate, SIGNAL(closeEditor(QWidget*, QAbstractItemDelegate::EndEditHint)),
205 SLOT(onCloseEditor(QWidget*, QAbstractItemDelegate::EndEditHint)));
207 myTable->setItemDelegate(myDelegate);
208 aLayout->addWidget(myTable);
212 aNames<<tr("Parameters");
213 myParameters = new QTreeWidgetItem(aNames);
214 myParameters->setFlags(Qt::ItemIsEnabled);
215 myTable->addTopLevelItem(myParameters);
218 aNames<<tr("Features");
219 myFeatures = new QTreeWidgetItem(aNames);
220 myFeatures->setFlags(Qt::ItemIsEnabled);
221 myTable->addTopLevelItem(myFeatures);
223 QHBoxLayout* aBtnLayout = new QHBoxLayout(this);
225 myUpBtn = new QToolButton(this);
226 myUpBtn->setArrowType(Qt::UpArrow);
227 connect(myUpBtn, SIGNAL(clicked(bool)), SLOT(onUp()));
228 aBtnLayout->addWidget(myUpBtn);
230 myDownBtn = new QToolButton(this);
231 myDownBtn->setArrowType(Qt::DownArrow);
232 connect(myDownBtn, SIGNAL(clicked(bool)), SLOT(onDown()));
233 aBtnLayout->addWidget(myDownBtn);
235 aBtnLayout->addStretch();
237 myAddBtn = new QPushButton(tr("Add"), this);
238 connect(myAddBtn, SIGNAL(clicked(bool)), SLOT(onAdd()));
239 aBtnLayout->addWidget(myAddBtn);
241 myInsertBtn = new QPushButton(tr("Insert"), this);
242 connect(myInsertBtn, SIGNAL(clicked(bool)), SLOT(onInsert()));
243 aBtnLayout->addWidget(myInsertBtn);
245 myRemoveBtn = new QPushButton(tr("Remove"), this);
246 connect(myRemoveBtn, SIGNAL(clicked(bool)), SLOT(onRemove()));
247 aBtnLayout->addWidget(myRemoveBtn);
249 aLayout->addLayout(aBtnLayout);
251 onSelectionChanged();
254 void ParametersPlugin_WidgetParamsMgr::setDialogButtons(QDialogButtonBox* theButtons)
256 ModuleBase_ModelDialogWidget::setDialogButtons(theButtons);
258 QWidget* aBtnParentWgt = myOkCancelBtn->parentWidget();
259 QHBoxLayout* aBtnParentLayout = dynamic_cast<QHBoxLayout*>(aBtnParentWgt->layout());
261 QPushButton* aPreviewBtn = new QPushButton(tr("See preview"), aBtnParentWgt);
262 aBtnParentLayout->insertWidget(0, aPreviewBtn);
263 aBtnParentLayout->insertStretch(1, 1);
264 connect(aPreviewBtn, SIGNAL(clicked(bool)), SLOT(onShowPreview()));
268 QList<QWidget*> ParametersPlugin_WidgetParamsMgr::getControls() const
270 QList<QWidget*> aList;
275 void ParametersPlugin_WidgetParamsMgr::selectItemScroll(QTreeWidgetItem* aItem)
277 myTable->clearSelection();
278 QModelIndex aParent = myTable->model()->index(0, 0);
279 int aChildIdx = myParameters->indexOfChild(aItem);
280 QModelIndex aIndex = myTable->model()->index(aChildIdx, Col_Name, aParent);
281 myTable->selectionModel()->select(aIndex,
282 QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
283 myTable->scrollToItem(aItem);
287 bool ParametersPlugin_WidgetParamsMgr::storeValueCustom()
289 ParametersPlugin_ExpressionValidator aValidator;
290 std::list<std::string> aArgs;
291 std::string aAttrId = ParametersPlugin_Parameter::VARIABLE_ID();
292 Events_InfoMessage aErr;
294 foreach(FeaturePtr aFeature, myParametersList) {
295 if (!aValidator.isValid(aFeature->attribute(aAttrId), aArgs, aErr)) {
296 // TODO(spo): translate
297 QMessageBox::warning(this, tr("Warning"), aErr.messageString().c_str());
298 selectItemScroll(myParameters->child(aId));
303 // #2813 : make the current feature the latest in the document
304 std::list<FeaturePtr> allFeatures = myFeature->document()->allFeatures();
305 if (!allFeatures.empty()) {
306 myFeature->document()->setCurrentFeature(*(allFeatures.rbegin()), true);
311 bool ParametersPlugin_WidgetParamsMgr::restoreValueCustom()
316 void ParametersPlugin_WidgetParamsMgr::activateCustom()
318 updateParametersFeatures();
319 updateParametersPart();
320 updateFeaturesPart();
322 myFeatures->setExpanded(true);
323 myParameters->setExpanded(true);
326 void ParametersPlugin_WidgetParamsMgr::updateParametersFeatures()
328 myParametersList.clear();
329 FeaturePtr aFeature = feature();
330 DocumentPtr aDoc = aFeature->document();
332 FeaturePtr aParamFeature;
333 int aNbFeatures = aDoc->numInternalFeatures();
334 for (int i = 0; i < aNbFeatures; i++) {
335 aParamFeature = aDoc->internalFeature(i);
336 if (aParamFeature && aParamFeature->getKind() == ParametersPlugin_Parameter::ID()) {
337 myParametersList.append(aParamFeature);
342 void ParametersPlugin_WidgetParamsMgr::updateFeaturesPart()
344 QList<FeaturePtr> aFeatureList;
345 updateItem(myFeatures, featuresItems(myParametersList, aFeatureList));
348 void ParametersPlugin_WidgetParamsMgr::updateParametersPart()
350 updateItem(myParameters, parametersItems(myParametersList));
351 bool aIsValid = isValid();
352 enableButtons(aIsValid);
356 QList<QStringList> ParametersPlugin_WidgetParamsMgr::
357 featuresItems(const QList<FeaturePtr>& theFeatures, QList<FeaturePtr>& theFeatureList) const
359 QList<QStringList> aItemsList;
360 ResultParameterPtr aParam;
361 foreach(FeaturePtr aParameter, theFeatures) {
362 aParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aParameter->firstResult());
363 const std::set<std::shared_ptr<ModelAPI_Attribute>>& aRefs = aParam->data()->refsToMe();
364 std::set<std::shared_ptr<ModelAPI_Attribute> >::const_iterator aIt;
365 for(aIt = aRefs.cbegin(); aIt != aRefs.cend(); aIt++) {
366 std::shared_ptr<ModelAPI_Attribute> aAttr = (*aIt);
367 FeaturePtr aReferenced = std::dynamic_pointer_cast<ModelAPI_Feature>(aAttr->owner());
368 if (aReferenced.get() && (aReferenced != aParameter)) {
369 if (aReferenced->getKind() == ParametersPlugin_Parameter::ID()) {
370 // Find referenced feature Recursive
371 QList<FeaturePtr> aList;
372 aList.append(aReferenced);
373 QList<QStringList> aItems = featuresItems(aList, theFeatureList);
374 aItemsList.append(aItems);
376 if (!theFeatureList.contains(aReferenced)) {
377 QStringList aValNames;
378 aValNames << aReferenced->data()->name().c_str();
380 std::string aId = aAttr->attributeType();
381 if (aId == ModelAPI_AttributeDouble::typeId()) {
382 AttributeDoublePtr aDouble =
383 std::dynamic_pointer_cast<ModelAPI_AttributeDouble>(aAttr);
384 aValNames << aDouble->text().c_str();
385 aValNames << QString::number(aDouble->value());
387 else if (aId == ModelAPI_AttributeInteger::typeId()) {
388 AttributeIntegerPtr aInt =
389 std::dynamic_pointer_cast<ModelAPI_AttributeInteger>(aAttr);
390 aValNames << aInt->text().c_str();
391 aValNames << QString::number(aInt->value());
393 else if (aId == GeomDataAPI_Point::typeId()) {
394 std::shared_ptr<GeomDataAPI_Point> aPnt =
395 std::dynamic_pointer_cast<GeomDataAPI_Point>(aAttr);
397 QString aExpr = QString("%1,%2,%3").arg(aPnt->textX().c_str()).
398 arg(aPnt->textY().c_str()).arg(aPnt->textZ().c_str());
401 QString aRes = QString("%1,%2,%3").arg(aPnt->x()).arg(aPnt->y()).arg(aPnt->z());
404 else if (aId == GeomDataAPI_Point2D::typeId()) {
405 std::shared_ptr<GeomDataAPI_Point2D> aPnt =
406 std::dynamic_pointer_cast<GeomDataAPI_Point2D>(aAttr);
408 QString aExpr = QString("%1,%2").arg(aPnt->textX().c_str()).
409 arg(aPnt->textY().c_str());
412 QString aRes = QString("%1,%2").arg(aPnt->x()).arg(aPnt->y());
415 aItemsList.append(aValNames);
416 theFeatureList.append(aReferenced);
426 QList<QStringList> ParametersPlugin_WidgetParamsMgr::
427 parametersItems(const QList<FeaturePtr>& theFeatures) const
429 std::list<std::string> aArgs;
431 QList<QStringList> aItemsList;
432 foreach(FeaturePtr aParameter, theFeatures) {
433 ResultPtr aParam = aParameter->firstResult();
436 std::string aName = aParameter->string(ParametersPlugin_Parameter::VARIABLE_ID())->value();
440 aValues << aName.c_str();
442 std::string aExpr = aParameter->string(ParametersPlugin_Parameter::EXPRESSION_ID())->value();
446 aValues << aExpr.c_str();
449 aParameter->data()->string(ParametersPlugin_Parameter::EXPRESSION_ERROR_ID())->value();
451 AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
452 aValues << QString::number(aValueAttribute->value());
454 aValues << aErr.c_str();
456 aValues << aParameter->string(ParametersPlugin_Parameter::COMMENT_ID())->value().c_str();
457 aItemsList.append(aValues);
463 void ParametersPlugin_WidgetParamsMgr::onDoubleClick(const QModelIndex& theIndex)
465 if (myDelegate->isEditable(theIndex)) {
466 myTable->setCurrentIndex(theIndex);
467 myTable->edit(theIndex);
471 void ParametersPlugin_WidgetParamsMgr::onCloseEditor(QWidget* theEditor,
472 QAbstractItemDelegate::EndEditHint theHint)
474 FeaturePtr aFeature = myParametersList.at(myDelegate->editIndex().row());
475 QTreeWidgetItem* aItem = myParameters->child(myDelegate->editIndex().row());
476 int aColumn = myDelegate->editIndex().column();
477 QString aText = aItem->text(aColumn);
478 bool isModified = false;
483 AttributeStringPtr aStringAttr = aFeature->string(ParametersPlugin_Parameter::VARIABLE_ID());
484 if (!aText.isEmpty()) {
485 while (aText.indexOf(" ") != -1) {
486 aText.replace(" ", "");
488 if (hasName(aText)) {
489 myMessage = tr("Name '%1' already exists.").arg(aText);
490 QTimer::singleShot(50, this, SLOT(sendWarning()));
493 aStringAttr->setValue(aText.toStdString());
500 AttributeStringPtr aStringAttr =
501 aFeature->string(ParametersPlugin_Parameter::EXPRESSION_ID());
502 if (!aText.isEmpty()) {
503 if (aText != aStringAttr->value().c_str()) {
504 aStringAttr->setValue(aText.toStdString());
513 AttributeStringPtr aStringAttr = aFeature->string(ParametersPlugin_Parameter::COMMENT_ID());
514 aStringAttr->setValue(aText.toStdString());
522 Events_Loop* aLoop = Events_Loop::loop();
523 aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
524 aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
525 aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_DELETED));
527 if (aColumn != Col_Comment)
528 updateParametersPart();
529 updateFeaturesPart();
531 onSelectionChanged();
534 void ParametersPlugin_WidgetParamsMgr::updateItem(QTreeWidgetItem* theItem,
535 const QList<QStringList>& theFeaturesList)
537 if (theFeaturesList.count() != theItem->childCount()) {
538 if (theItem->childCount() < theFeaturesList.count()) {
539 while (theItem->childCount() != theFeaturesList.count())
540 theItem->addChild(createNewItem(theItem));
542 while (theItem->childCount() != theFeaturesList.count())
543 theItem->removeChild(theItem->child(theItem->childCount() - 1));
547 foreach(QStringList aFeature, theFeaturesList) {
549 foreach(QString aText, aFeature) {
550 if (aText.length() > 0) {
551 theItem->child(i)->setText(aCol, aText);
552 theItem->child(i)->setToolTip(aCol, aText);
560 FeaturePtr ParametersPlugin_WidgetParamsMgr::createParameter() const
562 SessionPtr aMgr = ModelAPI_Session::get();
563 std::shared_ptr<ModelAPI_Document> aDoc = aMgr->activeDocument();
565 FeaturePtr aFeature = aDoc->addFeature(ParametersPlugin_Parameter::ID());
566 if (aFeature.get()) {
567 Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
568 Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
574 QTreeWidgetItem* ParametersPlugin_WidgetParamsMgr::createNewItem(QTreeWidgetItem* theParent) const
580 QTreeWidgetItem* aItem = new QTreeWidgetItem(aValues);
581 if (theParent == myParameters) {
582 aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
583 aItem->setForeground(2, Qt::darkGray);
585 aItem->setFlags(Qt::NoItemFlags);
590 void ParametersPlugin_WidgetParamsMgr::onAdd()
592 FeaturePtr aFeature = createParameter();
596 myParametersList.append(aFeature);
597 updateParametersPart();
599 QTreeWidgetItem* aItem = myParameters->child(myParameters->childCount() - 1);
601 myTable->scrollToItem(aItem);
602 myTable->setCurrentItem(aItem);
603 myTable->editItem(aItem);
605 enableButtons(false);
608 QTreeWidgetItem* ParametersPlugin_WidgetParamsMgr::selectedItem() const
610 QList<QTreeWidgetItem*> aItemsList = myTable->selectedItems();
611 if (aItemsList.count() == 0)
614 QTreeWidgetItem* aCurrentItem = aItemsList.first();
615 if (aCurrentItem->parent() != myParameters)
622 void ParametersPlugin_WidgetParamsMgr::onInsert()
624 QTreeWidgetItem* aCurrentItem = selectedItem();
628 SessionPtr aMgr = ModelAPI_Session::get();
629 std::shared_ptr<ModelAPI_Document> aDoc = aMgr->activeDocument();
631 FeaturePtr aNewFeature = createParameter();
632 if (!aNewFeature.get())
635 int aCurrentPos = myParameters->indexOfChild(aCurrentItem);
636 if (aCurrentPos == 0) {
637 aDoc->moveFeature(aNewFeature, FeaturePtr());
639 FeaturePtr aCurFeature = myParametersList.at(aCurrentPos - 1);
640 aDoc->moveFeature(aNewFeature, aCurFeature);
642 updateParametersFeatures();
643 updateParametersPart();
645 myTable->scrollToItem(aCurrentItem);
646 myTable->setCurrentItem(aCurrentItem);
647 myTable->editItem(aCurrentItem);
650 void ParametersPlugin_WidgetParamsMgr::onRemove()
652 QTreeWidgetItem* aCurrentItem = selectedItem();
656 SessionPtr aMgr = ModelAPI_Session::get();
657 std::shared_ptr<ModelAPI_Document> aDoc = aMgr->activeDocument();
659 int aCurrentPos = myParameters->indexOfChild(aCurrentItem);
660 FeaturePtr aCurFeature = myParametersList.at(aCurrentPos);
662 QObjectPtrList anObjects;
663 anObjects.append(aCurFeature);
665 std::map<FeaturePtr, std::set<FeaturePtr> > aReferences;
666 std::set<FeaturePtr> aFeatures;
667 ModuleBase_Tools::convertToFeatures(anObjects, aFeatures);
668 ModelAPI_Tools::findAllReferences(aFeatures, aReferences);
670 std::set<FeaturePtr> aFeatureRefsToDelete;
671 if (ModuleBase_Tools::askToDelete(aFeatures, aReferences, this, aFeatureRefsToDelete)) {
672 if (!aFeatureRefsToDelete.empty())
673 aFeatures.insert(aFeatureRefsToDelete.begin(), aFeatureRefsToDelete.end());
674 ModelAPI_Tools::removeFeatures(aFeatures, false);
676 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED));
677 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY));
678 updateParametersFeatures();
679 updateFeaturesPart();
680 updateParametersPart();
684 void ParametersPlugin_WidgetParamsMgr::onUp()
686 QTreeWidgetItem* aCurrentItem = selectedItem();
690 int aCurrentPos = myParameters->indexOfChild(aCurrentItem);
691 if (aCurrentPos == 0)
693 FeaturePtr aCurFeature = myParametersList.at(aCurrentPos);
695 SessionPtr aMgr = ModelAPI_Session::get();
696 std::shared_ptr<ModelAPI_Document> aDoc = aMgr->activeDocument();
698 if (aCurrentPos == 1)
699 aDoc->moveFeature(aCurFeature, FeaturePtr());
701 aDoc->moveFeature(aCurFeature, myParametersList.at(aCurrentPos - 2));
703 // add the updated also the feature that goes down
704 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED));
705 static Events_ID EVENT_UPD = Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED);
706 ModelAPI_EventCreator::get()->sendUpdated(myParametersList.at(aCurrentPos - 1), EVENT_UPD);
707 Events_Loop::loop()->flush(EVENT_UPD);
708 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED));
709 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED));
710 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY));
711 updateParametersFeatures();
712 updateParametersPart();
713 updateFeaturesPart();
715 if (aCurrentPos > 0) {
716 aCurrentItem = myParameters->child(aCurrentPos - 1);
717 myTable->setCurrentItem(aCurrentItem);
718 selectItemScroll(aCurrentItem);
722 void ParametersPlugin_WidgetParamsMgr::onDown()
724 QTreeWidgetItem* aCurrentItem = selectedItem();
728 int aCurrentPos = myParameters->indexOfChild(aCurrentItem);
729 if (aCurrentPos == (myParametersList.count() - 1))
731 FeaturePtr aCurFeature = myParametersList.at(aCurrentPos);
733 SessionPtr aMgr = ModelAPI_Session::get();
734 std::shared_ptr<ModelAPI_Document> aDoc = aMgr->activeDocument();
735 aDoc->moveFeature(aCurFeature, myParametersList.at(aCurrentPos + 1));
736 // add the updated also the feature that goes up
737 static Events_ID EVENT_UPD = Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED);
738 ModelAPI_EventCreator::get()->sendUpdated(myParametersList.at(aCurrentPos + 1), EVENT_UPD);
740 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED));
741 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED));
742 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED));
743 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED));
744 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY));
745 updateParametersFeatures();
746 updateParametersPart();
747 updateFeaturesPart();
749 if (aCurrentPos < myParameters->childCount() - 1) {
750 aCurrentItem = myParameters->child(aCurrentPos + 1);
751 myTable->setCurrentItem(aCurrentItem);
752 selectItemScroll(aCurrentItem);
757 bool ParametersPlugin_WidgetParamsMgr::hasName(const QString& theName) const
759 int aCurrent = myDelegate->editIndex().row();
761 foreach(FeaturePtr aFeature, myParametersList) {
762 if ((i != aCurrent) && (aFeature->data()->name() == theName.toStdString()))
769 void ParametersPlugin_WidgetParamsMgr::sendWarning()
771 QMessageBox::warning(this, tr("Warning"), myMessage);
772 QTreeWidgetItem* aItem = myTable->currentItem();
774 myTable->editItem(aItem);
777 void ParametersPlugin_WidgetParamsMgr::onSelectionChanged()
779 QList<QTreeWidgetItem*> aItemsList = myTable->selectedItems();
780 bool aIsValid = isValid();
782 bool isParameter = false;
783 foreach(QTreeWidgetItem* aItem, aItemsList) {
784 if (aItem->parent() == myParameters) {
789 myInsertBtn->setEnabled(isParameter);
790 //myRemoveBtn->setEnabled(isParameter);
791 myUpBtn->setEnabled(isParameter);
792 myDownBtn->setEnabled(isParameter);
794 myInsertBtn->setEnabled(false);
795 //myRemoveBtn->setEnabled(false);
796 myUpBtn->setEnabled(false);
797 myDownBtn->setEnabled(false);
799 myRemoveBtn->setEnabled(!aItemsList.isEmpty());
802 void ParametersPlugin_WidgetParamsMgr::enableButtons(bool theEnable)
804 myAddBtn->setEnabled(theEnable);
806 onSelectionChanged();
808 myInsertBtn->setEnabled(theEnable);
809 //myRemoveBtn->setEnabled(theEnable);
810 myUpBtn->setEnabled(theEnable);
811 myDownBtn->setEnabled(theEnable);
813 myOkCancelBtn->button(QDialogButtonBox::Ok)->setEnabled(theEnable);
816 bool ParametersPlugin_WidgetParamsMgr::isValid()
818 QTreeWidgetItem* aItem;
819 for(int i = 0; i < myParameters->childCount(); i++) {
820 aItem = myParameters->child(i);
821 if ((aItem->text(Col_Name) == NoName) ||
822 (aItem->text(Col_Equation) == NoValue) ||
823 (!ModelAPI_Expression::isVariable(aItem->text(Col_Name).toStdString())) ) {
830 void ParametersPlugin_WidgetParamsMgr::showEvent(QShowEvent* theEvent)
832 ModuleBase_ModelDialogWidget::showEvent(theEvent);
833 SessionPtr aMgr = ModelAPI_Session::get();
834 isUpplyBlocked = aMgr->isAutoUpdateBlocked();
835 aMgr->blockAutoUpdate(true);
836 Events_Loop* aLoop = Events_Loop::loop();
837 aLoop->flush(aLoop->eventByName(EVENT_AUTOMATIC_RECOMPUTATION_DISABLE));
840 void ParametersPlugin_WidgetParamsMgr::hideEvent(QHideEvent* theEvent)
842 ModuleBase_ModelDialogWidget::hideEvent(theEvent);
843 SessionPtr aMgr = ModelAPI_Session::get();
844 aMgr->blockAutoUpdate(isUpplyBlocked);
847 void ParametersPlugin_WidgetParamsMgr::onShowPreview()
849 SessionPtr aMgr = ModelAPI_Session::get();
850 aMgr->blockAutoUpdate(false);
851 aMgr->blockAutoUpdate(true);