1 // Copyright (C) 2014-2024 CEA, EDF
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>
40 #include <ModuleBase_IWorkshop.h>
41 #include <ModuleBase_IViewer.h>
43 #include <Events_Loop.h>
44 #include <Config_PropManager.h>
47 #include <QPushButton>
48 #include <QToolButton>
49 #include <QStyledItemDelegate>
51 #include <QMessageBox>
55 #include <QDialogButtonBox>
57 #include <QFileDialog>
60 #pragma warning(disable : 4456) // for nested foreach
70 const char* NoName = "<NoName>";
71 const char* NoValue = "<NoValue>";
75 * ItemDelegate object in order to redefine items behavior
77 class ParametersPlugin_ItemDelegate : public QStyledItemDelegate
81 /// \param thaParent a parent
82 ParametersPlugin_ItemDelegate(QObject* thaParent) :
83 QStyledItemDelegate(thaParent) {}
85 /// Redefinition of virtual method
86 /// \param painter a painter object
87 /// \param option the item options
88 /// \param index the current index
89 virtual void paint(QPainter* painter,
90 const QStyleOptionViewItem& option,
91 const QModelIndex& index ) const;
93 /// Redefinition of virtual method
94 /// \param parent a parent widget
95 /// \param option the item options
96 /// \param index the current index
97 virtual QWidget* createEditor(QWidget* parent,
98 const QStyleOptionViewItem& option,
99 const QModelIndex& index) const;
101 /// Returns True if the given index is editable item
102 /// \param theIndex an item index
103 bool isEditable(const QModelIndex& theIndex) const;
105 /// Returns currently editing index
106 QModelIndex editIndex() const { return myEditingIdx; }
109 mutable QModelIndex myEditingIdx;
112 bool ParametersPlugin_ItemDelegate::isEditable(const QModelIndex& theIndex) const
114 QModelIndex aParent = theIndex.parent();
115 if (aParent.isValid() && (aParent.row() == 0)) {
116 if (theIndex.column() == 2)
123 void ParametersPlugin_ItemDelegate::paint(QPainter* painter,
124 const QStyleOptionViewItem& option,
125 const QModelIndex& index ) const
127 QBrush aBrush = painter->brush();
128 QPen aPen = painter->pen();
129 //if (!isEditable(index))
130 // painter->setBrush(Qt::lightGray);
131 if (!index.parent().isValid())
132 painter->setBrush(Qt::lightGray);
134 painter->setPen(Qt::lightGray);
135 painter->drawRect(option.rect);
136 painter->setPen(aPen);
138 QStyledItemDelegate::paint(painter, option, index);
139 painter->setBrush(aBrush);
142 QWidget* ParametersPlugin_ItemDelegate::createEditor(QWidget* parent,
143 const QStyleOptionViewItem& option,
144 const QModelIndex& index) const
146 myEditingIdx = index;
147 return QStyledItemDelegate::createEditor(parent, option, index);
150 /////////////////////////////////////////////////////////////////////////////////////////////////
151 void ParametersPlugin_TreeWidget::closeEditor(QWidget* theEditor,
152 QAbstractItemDelegate::EndEditHint theHint)
154 if (theHint == QAbstractItemDelegate::EditNextItem) {
155 QModelIndex aCurrent = currentIndex();
156 QModelIndex aParent = model()->index(0, 0);
157 int aNbRows = model()->rowCount(aParent);
159 switch (aCurrent.column()) {
161 aIdx = model()->index(aCurrent.row(), 1, aParent);
164 if (aCurrent.row() < (aNbRows - 1))
165 aIdx = model()->index(aCurrent.row() + 1, 0, aParent);
167 QTreeWidget::closeEditor(theEditor, QAbstractItemDelegate::NoHint);
172 QTreeWidget::closeEditor(theEditor, theHint);
175 if (aIdx.isValid()) {
176 QTreeWidget::closeEditor(theEditor, QAbstractItemDelegate::NoHint);
177 setCurrentIndex(aIdx);
182 QTreeWidget::closeEditor(theEditor, theHint);
185 /////////////////////////////////////////////////////////////////////////////////////////////////
187 ParametersPlugin_WidgetParamsMgr::ParametersPlugin_WidgetParamsMgr(QWidget* theParent,
188 const Config_WidgetAPI* theData, ModuleBase_IWorkshop* theWorkshop)
189 : ModuleBase_ModelDialogWidget(theParent, theData),
190 myWorkshop(theWorkshop), isUpplyBlocked(false)
192 QVBoxLayout* aLayout = new QVBoxLayout(this);
194 myTable = new ParametersPlugin_TreeWidget(this);
195 myTable->setColumnCount(4);
196 QStringList aHeaders;
197 aHeaders << translate("Name") << translate("Expression")
198 << translate("Result") << translate("Comment");
199 myTable->setHeaderLabels(aHeaders);
200 myTable->setColumnWidth(Col_Name, 200);
201 myTable->setColumnWidth(Col_Equation, 100);
202 myTable->setColumnWidth(Col_Result, 80);
203 myTable->setColumnWidth(Col_Comment, 200);
204 myTable->setMinimumWidth(600);
205 myTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
206 myTable->setSelectionMode(QAbstractItemView::SingleSelection);
208 connect(myTable, SIGNAL(doubleClicked(const QModelIndex&)),
209 SLOT(onDoubleClick(const QModelIndex&)));
210 connect(myTable, SIGNAL(itemSelectionChanged()), SLOT(onSelectionChanged()));
212 myDelegate = new ParametersPlugin_ItemDelegate(myTable);
213 connect(myDelegate, SIGNAL(closeEditor(QWidget*, QAbstractItemDelegate::EndEditHint)),
214 SLOT(onCloseEditor(QWidget*, QAbstractItemDelegate::EndEditHint)));
216 myTable->setItemDelegate(myDelegate);
217 aLayout->addWidget(myTable);
221 aNames<<translate("Parameters");
222 myParameters = new QTreeWidgetItem(aNames);
223 myParameters->setFlags(Qt::ItemIsEnabled);
224 myTable->addTopLevelItem(myParameters);
227 aNames<<translate("Features");
228 myFeatures = new QTreeWidgetItem(aNames);
229 myFeatures->setFlags(Qt::ItemIsEnabled);
230 myTable->addTopLevelItem(myFeatures);
232 QHBoxLayout* aBtnLayout = new QHBoxLayout(this);
234 myUpBtn = new QToolButton(this);
235 myUpBtn->setArrowType(Qt::UpArrow);
236 connect(myUpBtn, SIGNAL(clicked(bool)), SLOT(onUp()));
237 aBtnLayout->addWidget(myUpBtn);
239 myDownBtn = new QToolButton(this);
240 myDownBtn->setArrowType(Qt::DownArrow);
241 connect(myDownBtn, SIGNAL(clicked(bool)), SLOT(onDown()));
242 aBtnLayout->addWidget(myDownBtn);
244 aBtnLayout->addStretch();
246 myAddBtn = new QPushButton(translate("Add"), this);
247 connect(myAddBtn, SIGNAL(clicked(bool)), SLOT(onAdd()));
248 aBtnLayout->addWidget(myAddBtn);
250 myInsertBtn = new QPushButton(translate("Insert"), this);
251 connect(myInsertBtn, SIGNAL(clicked(bool)), SLOT(onInsert()));
252 aBtnLayout->addWidget(myInsertBtn);
254 myImportBtn = new QPushButton(translate("Import file"), this);
255 connect(myImportBtn, SIGNAL(clicked(bool)), SLOT(onImport()));
256 aBtnLayout->addWidget(myImportBtn);
258 myRemoveBtn = new QPushButton(translate("Remove"), this);
259 connect(myRemoveBtn, SIGNAL(clicked(bool)), SLOT(onRemove()));
260 aBtnLayout->addWidget(myRemoveBtn);
262 aLayout->addLayout(aBtnLayout);
264 onSelectionChanged();
267 void ParametersPlugin_WidgetParamsMgr::setDialogButtons(QDialogButtonBox* theButtons)
269 ModuleBase_ModelDialogWidget::setDialogButtons(theButtons);
271 QWidget* aBtnParentWgt = myOkCancelBtn->parentWidget();
272 QHBoxLayout* aBtnParentLayout = dynamic_cast<QHBoxLayout*>(aBtnParentWgt->layout());
274 QPushButton* aPreviewBtn = new QPushButton(translate("See preview"), aBtnParentWgt);
275 aBtnParentLayout->insertWidget(0, aPreviewBtn);
276 aBtnParentLayout->insertStretch(1, 1);
277 connect(aPreviewBtn, SIGNAL(clicked(bool)), SLOT(onShowPreview()));
281 QList<QWidget*> ParametersPlugin_WidgetParamsMgr::getControls() const
283 QList<QWidget*> aList;
288 void ParametersPlugin_WidgetParamsMgr::selectItemScroll(QTreeWidgetItem* aItem)
290 myTable->clearSelection();
291 QModelIndex aParent = myTable->model()->index(0, 0);
292 int aChildIdx = myParameters->indexOfChild(aItem);
293 QModelIndex aIndex = myTable->model()->index(aChildIdx, Col_Name, aParent);
294 myTable->selectionModel()->select(aIndex,
295 QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
296 myTable->scrollToItem(aItem);
300 bool ParametersPlugin_WidgetParamsMgr::storeValueCustom()
302 ParametersPlugin_ExpressionValidator aValidator;
303 std::list<std::string> aArgs;
304 std::string aAttrId = ParametersPlugin_Parameter::VARIABLE_ID();
305 Events_InfoMessage aErr;
307 foreach(FeaturePtr aFeature, myParametersList) {
308 if (!aValidator.isValid(aFeature->attribute(aAttrId), aArgs, aErr)) {
309 QMessageBox::warning(this, translate("Warning"), aErr.messageString().c_str());
310 selectItemScroll(myParameters->child(aId));
315 // #2813 : make the current feature the latest in the document
316 std::list<FeaturePtr> allFeatures = myFeature->document()->allFeatures();
317 if (!allFeatures.empty()) {
318 myFeature->document()->setCurrentFeature(*(allFeatures.rbegin()), true);
323 bool ParametersPlugin_WidgetParamsMgr::restoreValueCustom()
328 void ParametersPlugin_WidgetParamsMgr::activateCustom()
330 updateParametersFeatures();
331 updateParametersPart();
332 updateFeaturesPart();
334 myFeatures->setExpanded(true);
335 myParameters->setExpanded(true);
338 void ParametersPlugin_WidgetParamsMgr::updateParametersFeatures()
340 myParametersList.clear();
341 FeaturePtr aFeature = feature();
342 DocumentPtr aDoc = aFeature->document();
344 FeaturePtr aParamFeature;
345 int aNbFeatures = aDoc->numInternalFeatures();
346 for (int i = 0; i < aNbFeatures; i++) {
347 aParamFeature = aDoc->internalFeature(i);
348 if (aParamFeature && aParamFeature->getKind() == ParametersPlugin_Parameter::ID()) {
349 myParametersList.append(aParamFeature);
354 void ParametersPlugin_WidgetParamsMgr::updateFeaturesPart()
356 QList<FeaturePtr> aFeatureList;
357 updateItem(myFeatures, featuresItems(myParametersList, aFeatureList));
360 void ParametersPlugin_WidgetParamsMgr::updateParametersPart()
362 updateItem(myParameters, parametersItems(myParametersList));
363 bool aIsValid = isValid();
364 enableButtons(aIsValid);
368 QList<QStringList> ParametersPlugin_WidgetParamsMgr::
369 featuresItems(const QList<FeaturePtr>& theFeatures, QList<FeaturePtr>& theFeatureList) const
371 QList<QStringList> aItemsList;
372 ResultParameterPtr aParam;
373 foreach(FeaturePtr aParameter, theFeatures) {
374 aParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aParameter->firstResult());
375 const std::set<std::shared_ptr<ModelAPI_Attribute>>& aRefs = aParam->data()->refsToMe();
376 std::set<std::shared_ptr<ModelAPI_Attribute> >::const_iterator aIt;
377 for(aIt = aRefs.cbegin(); aIt != aRefs.cend(); aIt++) {
378 std::shared_ptr<ModelAPI_Attribute> aAttr = (*aIt);
379 FeaturePtr aReferenced = std::dynamic_pointer_cast<ModelAPI_Feature>(aAttr->owner());
380 if (aReferenced.get() && (aReferenced != aParameter)) {
381 if (aReferenced->getKind() == ParametersPlugin_Parameter::ID()) {
382 // Find referenced feature Recursive
383 QList<FeaturePtr> aList;
384 aList.append(aReferenced);
385 QList<QStringList> aItems = featuresItems(aList, theFeatureList);
386 aItemsList.append(aItems);
388 if (!theFeatureList.contains(aReferenced)) {
389 QStringList aValNames;
390 aValNames << QString::fromStdWString(aReferenced->data()->name());
392 std::string aId = aAttr->attributeType();
393 if (aId == ModelAPI_AttributeDouble::typeId()) {
394 AttributeDoublePtr aDouble =
395 std::dynamic_pointer_cast<ModelAPI_AttributeDouble>(aAttr);
396 aValNames << QString::fromStdWString(aDouble->text());
397 aValNames << QString::number(aDouble->value());
399 else if (aId == ModelAPI_AttributeInteger::typeId()) {
400 AttributeIntegerPtr aInt =
401 std::dynamic_pointer_cast<ModelAPI_AttributeInteger>(aAttr);
402 aValNames << QString::fromStdWString(aInt->text());
403 aValNames << QString::number(aInt->value());
405 else if (aId == GeomDataAPI_Point::typeId()) {
406 std::shared_ptr<GeomDataAPI_Point> aPnt =
407 std::dynamic_pointer_cast<GeomDataAPI_Point>(aAttr);
409 QString aExpr = QString("%1,%2,%3").arg(QString::fromStdWString(aPnt->textX())).
410 arg(QString::fromStdWString(aPnt->textY())).
411 arg(QString::fromStdWString(aPnt->textZ()));
414 QString aRes = QString("%1,%2,%3").arg(aPnt->x()).arg(aPnt->y()).arg(aPnt->z());
417 else if (aId == GeomDataAPI_Point2D::typeId()) {
418 std::shared_ptr<GeomDataAPI_Point2D> aPnt =
419 std::dynamic_pointer_cast<GeomDataAPI_Point2D>(aAttr);
421 QString aExpr = QString("%1,%2").arg(QString::fromStdWString(aPnt->textX())).
422 arg(QString::fromStdWString(aPnt->textY()));
425 QString aRes = QString("%1,%2").arg(aPnt->x()).arg(aPnt->y());
428 aItemsList.append(aValNames);
429 theFeatureList.append(aReferenced);
439 QList<QStringList> ParametersPlugin_WidgetParamsMgr::
440 parametersItems(const QList<FeaturePtr>& theFeatures) const
442 std::list<std::string> aArgs;
444 QList<QStringList> aItemsList;
445 foreach(FeaturePtr aParameter, theFeatures) {
446 ResultPtr aParam = aParameter->firstResult();
449 std::string aName = aParameter->string(ParametersPlugin_Parameter::VARIABLE_ID())->value();
451 aValues << translate(NoName);
453 aValues << aName.c_str();
455 std::string aExpr = aParameter->string(ParametersPlugin_Parameter::EXPRESSION_ID())->value();
457 aValues << translate(NoValue);
459 aValues << aExpr.c_str();
461 aErr = aParameter->data()->string(ParametersPlugin_Parameter::EXPRESSION_ERROR_ID())->value();
463 AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
464 aValues << QString::number(aValueAttribute->value());
466 aValues << aErr.c_str();
468 aValues << aParameter->string(ParametersPlugin_Parameter::COMMENT_ID())->value().c_str();
469 aItemsList.append(aValues);
475 void ParametersPlugin_WidgetParamsMgr::onDoubleClick(const QModelIndex& theIndex)
477 if (myDelegate->isEditable(theIndex)) {
478 myTable->setCurrentIndex(theIndex);
479 myTable->edit(theIndex);
483 void ParametersPlugin_WidgetParamsMgr::onCloseEditor(QWidget* theEditor,
484 QAbstractItemDelegate::EndEditHint theHint)
486 FeaturePtr aFeature = myParametersList.at(myDelegate->editIndex().row());
487 QTreeWidgetItem* aItem = myParameters->child(myDelegate->editIndex().row());
488 int aColumn = myDelegate->editIndex().column();
489 int aRow = myDelegate->editIndex().row();
490 QString aText = aItem->text(aColumn);
491 bool isModified = false;
496 AttributeStringPtr aStringAttr = aFeature->string(ParametersPlugin_Parameter::VARIABLE_ID());
497 if (!aText.isEmpty()) {
498 while (aText.indexOf(" ") != -1) {
499 aText.replace(" ", "");
501 if (hasName(aText, aRow)) {
502 myMessage = translate("Name '%1' already exists.").arg(aText);
503 QTimer::singleShot(50, this, SLOT(sendWarning()));
506 aStringAttr->setValue(aText.toStdString());
513 AttributeStringPtr aStringAttr =
514 aFeature->string(ParametersPlugin_Parameter::EXPRESSION_ID());
515 if (!aText.isEmpty()) {
516 if (aText != aStringAttr->value().c_str()) {
517 aStringAttr->setValue(aText.toStdString());
526 AttributeStringPtr aStringAttr = aFeature->string(ParametersPlugin_Parameter::COMMENT_ID());
527 aStringAttr->setValue(aText.toStdWString());
535 Events_Loop* aLoop = Events_Loop::loop();
536 aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
537 aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
538 aLoop->flush(Events_Loop::eventByName(EVENT_OBJECT_DELETED));
540 if (aColumn != Col_Comment)
541 updateParametersPart();
542 updateFeaturesPart();
544 onSelectionChanged();
547 void ParametersPlugin_WidgetParamsMgr::updateItem(QTreeWidgetItem* theItem,
548 const QList<QStringList>& theFeaturesList)
550 if (theFeaturesList.count() != theItem->childCount()) {
551 if (theItem->childCount() < theFeaturesList.count()) {
552 while (theItem->childCount() != theFeaturesList.count())
553 theItem->addChild(createNewItem(theItem));
555 while (theItem->childCount() != theFeaturesList.count())
556 theItem->removeChild(theItem->child(theItem->childCount() - 1));
560 foreach(QStringList aFeature, theFeaturesList) {
562 foreach(QString aText, aFeature) {
563 if (aText.length() > 0) {
564 theItem->child(i)->setText(aCol, aText);
565 theItem->child(i)->setToolTip(aCol, aText);
573 FeaturePtr ParametersPlugin_WidgetParamsMgr::createParameter() const
575 SessionPtr aMgr = ModelAPI_Session::get();
576 std::shared_ptr<ModelAPI_Document> aDoc = aMgr->activeDocument();
578 FeaturePtr aFeature = aDoc->addFeature(ParametersPlugin_Parameter::ID());
579 if (aFeature.get()) {
580 Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
581 Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
587 QTreeWidgetItem* ParametersPlugin_WidgetParamsMgr::createNewItem(QTreeWidgetItem* theParent) const
590 aValues << translate(NoName);
591 aValues << translate(NoValue);
593 QTreeWidgetItem* aItem = new QTreeWidgetItem(aValues);
594 if (theParent == myParameters) {
595 aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
596 aItem->setForeground(2, Qt::darkGray);
598 aItem->setFlags(Qt::NoItemFlags);
603 void ParametersPlugin_WidgetParamsMgr::onAdd()
605 FeaturePtr aFeature = createParameter();
609 myParametersList.append(aFeature);
610 updateParametersPart();
612 QTreeWidgetItem* aItem = myParameters->child(myParameters->childCount() - 1);
614 myTable->scrollToItem(aItem);
615 myTable->setCurrentItem(aItem);
616 myTable->editItem(aItem);
618 enableButtons(false);
621 QTreeWidgetItem* ParametersPlugin_WidgetParamsMgr::selectedItem() const
623 QList<QTreeWidgetItem*> aItemsList = myTable->selectedItems();
624 if (aItemsList.count() == 0)
627 QTreeWidgetItem* aCurrentItem = aItemsList.first();
628 if (aCurrentItem->parent() != myParameters)
635 void ParametersPlugin_WidgetParamsMgr::onInsert()
637 QTreeWidgetItem* aCurrentItem = selectedItem();
641 SessionPtr aMgr = ModelAPI_Session::get();
642 std::shared_ptr<ModelAPI_Document> aDoc = aMgr->activeDocument();
644 FeaturePtr aNewFeature = createParameter();
645 if (!aNewFeature.get())
648 int aCurrentPos = myParameters->indexOfChild(aCurrentItem);
649 if (aCurrentPos == 0) {
650 aDoc->moveFeature(aNewFeature, FeaturePtr());
652 FeaturePtr aCurFeature = myParametersList.at(aCurrentPos - 1);
653 aDoc->moveFeature(aNewFeature, aCurFeature);
655 updateParametersFeatures();
656 updateParametersPart();
658 myTable->scrollToItem(aCurrentItem);
659 myTable->setCurrentItem(aCurrentItem);
660 myTable->editItem(aCurrentItem);
663 void ParametersPlugin_WidgetParamsMgr::onRemove()
665 QTreeWidgetItem* aCurrentItem = selectedItem();
669 SessionPtr aMgr = ModelAPI_Session::get();
670 std::shared_ptr<ModelAPI_Document> aDoc = aMgr->activeDocument();
672 int aCurrentPos = myParameters->indexOfChild(aCurrentItem);
673 FeaturePtr aCurFeature = myParametersList.at(aCurrentPos);
675 QObjectPtrList anObjects;
676 anObjects.append(aCurFeature);
678 std::map<FeaturePtr, std::set<FeaturePtr> > aReferences;
679 std::set<FeaturePtr> aFeatures;
680 ModuleBase_Tools::convertToFeatures(anObjects, aFeatures);
681 ModelAPI_Tools::findAllReferences(aFeatures, aReferences);
683 std::set<FeaturePtr> aFeatureRefsToDelete;
684 if (ModuleBase_Tools::askToDelete(aFeatures, aReferences, this, aFeatureRefsToDelete)) {
685 if (!aFeatureRefsToDelete.empty())
686 aFeatures.insert(aFeatureRefsToDelete.begin(), aFeatureRefsToDelete.end());
687 ModelAPI_Tools::removeFeatures(aFeatures, false);
689 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED));
690 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY));
691 updateParametersFeatures();
692 updateFeaturesPart();
693 updateParametersPart();
697 void ParametersPlugin_WidgetParamsMgr::onImport()
699 std::string aWinText("Select txt file");
700 std::string aFileType("Text files (*.txt);;All files (*.*)");
701 QString aQPath = QFileDialog::getOpenFileName(nullptr,
702 aWinText.c_str(), "",
704 if (aQPath.size() == 0)
707 std::string aPath(aQPath.toStdString());
708 std::shared_ptr<ModelAPI_ImportParametersMessage> aMessage =
709 std::shared_ptr<ModelAPI_ImportParametersMessage>(
710 new ModelAPI_ImportParametersMessage(ModelAPI_ImportParametersMessage::eventId()));
711 aMessage->setFilename(aPath);
712 Events_Loop::loop()->send(aMessage);
714 updateParametersFeatures();
715 updateParametersPart();
718 void ParametersPlugin_WidgetParamsMgr::onUp()
720 QTreeWidgetItem* aCurrentItem = selectedItem();
724 int aCurrentPos = myParameters->indexOfChild(aCurrentItem);
725 if (aCurrentPos == 0)
727 FeaturePtr aCurFeature = myParametersList.at(aCurrentPos);
729 SessionPtr aMgr = ModelAPI_Session::get();
730 std::shared_ptr<ModelAPI_Document> aDoc = aMgr->activeDocument();
732 if (aCurrentPos == 1)
733 aDoc->moveFeature(aCurFeature, FeaturePtr());
735 aDoc->moveFeature(aCurFeature, myParametersList.at(aCurrentPos - 2));
737 // add the updated also the feature that goes down
738 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED));
739 static Events_ID EVENT_UPD = Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED);
740 ModelAPI_EventCreator::get()->sendUpdated(myParametersList.at(aCurrentPos - 1), EVENT_UPD);
741 Events_Loop::loop()->flush(EVENT_UPD);
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 > 0) {
750 aCurrentItem = myParameters->child(aCurrentPos - 1);
751 myTable->setCurrentItem(aCurrentItem);
752 selectItemScroll(aCurrentItem);
756 void ParametersPlugin_WidgetParamsMgr::onDown()
758 QTreeWidgetItem* aCurrentItem = selectedItem();
762 int aCurrentPos = myParameters->indexOfChild(aCurrentItem);
763 if (aCurrentPos == (myParametersList.count() - 1))
765 FeaturePtr aCurFeature = myParametersList.at(aCurrentPos);
767 SessionPtr aMgr = ModelAPI_Session::get();
768 std::shared_ptr<ModelAPI_Document> aDoc = aMgr->activeDocument();
769 aDoc->moveFeature(aCurFeature, myParametersList.at(aCurrentPos + 1));
770 // add the updated also the feature that goes up
771 static Events_ID EVENT_UPD = Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED);
772 ModelAPI_EventCreator::get()->sendUpdated(myParametersList.at(aCurrentPos + 1), EVENT_UPD);
774 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED));
775 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED));
776 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED));
777 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED));
778 Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY));
779 updateParametersFeatures();
780 updateParametersPart();
781 updateFeaturesPart();
783 if (aCurrentPos < myParameters->childCount() - 1) {
784 aCurrentItem = myParameters->child(aCurrentPos + 1);
785 myTable->setCurrentItem(aCurrentItem);
786 selectItemScroll(aCurrentItem);
791 bool ParametersPlugin_WidgetParamsMgr::hasName(const QString& theName, int theIndex) const
794 foreach(FeaturePtr aFeature, myParametersList) {
795 if ((i != theIndex) && (aFeature->data()->name() == theName.toStdWString()))
802 void ParametersPlugin_WidgetParamsMgr::sendWarning()
804 QMessageBox::warning(this, translate("Warning"), myMessage);
805 QTreeWidgetItem* aItem = myTable->currentItem();
807 myTable->editItem(aItem);
810 void ParametersPlugin_WidgetParamsMgr::onSelectionChanged()
812 QList<QTreeWidgetItem*> aItemsList = myTable->selectedItems();
813 bool aIsValid = isValid();
815 bool isParameter = false;
816 foreach(QTreeWidgetItem* aItem, aItemsList) {
817 if (aItem->parent() == myParameters) {
822 myInsertBtn->setEnabled(isParameter);
823 //myRemoveBtn->setEnabled(isParameter);
824 myUpBtn->setEnabled(isParameter);
825 myDownBtn->setEnabled(isParameter);
826 myImportBtn->setEnabled(true);
828 myInsertBtn->setEnabled(false);
829 //myRemoveBtn->setEnabled(false);
830 myUpBtn->setEnabled(false);
831 myDownBtn->setEnabled(false);
832 myImportBtn->setEnabled(false);
834 myRemoveBtn->setEnabled(!aItemsList.isEmpty());
837 void ParametersPlugin_WidgetParamsMgr::enableButtons(bool theEnable)
839 myAddBtn->setEnabled(theEnable);
841 onSelectionChanged();
843 myInsertBtn->setEnabled(theEnable);
844 //myRemoveBtn->setEnabled(theEnable);
845 myUpBtn->setEnabled(theEnable);
846 myDownBtn->setEnabled(theEnable);
847 myImportBtn->setEnabled(theEnable);
849 myOkCancelBtn->button(QDialogButtonBox::Ok)->setEnabled(theEnable);
852 bool ParametersPlugin_WidgetParamsMgr::isValid()
854 QTreeWidgetItem* aItem;
855 for(int i = 0; i < myParameters->childCount(); i++) {
856 aItem = myParameters->child(i);
857 if ((aItem->text(Col_Name) == NoName) ||
858 (aItem->text(Col_Equation) == translate(NoValue)) ||
859 (!ModelAPI_Expression::isVariable(aItem->text(Col_Name).toStdString())) ||
860 (hasName(aItem->text(Col_Name), i)) ) {
867 void ParametersPlugin_WidgetParamsMgr::showEvent(QShowEvent* theEvent)
869 ModuleBase_ModelDialogWidget::showEvent(theEvent);
870 SessionPtr aMgr = ModelAPI_Session::get();
871 isUpplyBlocked = aMgr->isAutoUpdateBlocked();
872 aMgr->blockAutoUpdate(true);
873 Events_Loop* aLoop = Events_Loop::loop();
874 aLoop->flush(aLoop->eventByName(EVENT_AUTOMATIC_RECOMPUTATION_DISABLE));
877 void ParametersPlugin_WidgetParamsMgr::hideEvent(QHideEvent* theEvent)
879 ModuleBase_ModelDialogWidget::hideEvent(theEvent);
880 SessionPtr aMgr = ModelAPI_Session::get();
881 aMgr->blockAutoUpdate(isUpplyBlocked);
884 void ParametersPlugin_WidgetParamsMgr::onShowPreview()
886 SessionPtr aMgr = ModelAPI_Session::get();
887 aMgr->blockAutoUpdate(false);
888 aMgr->blockAutoUpdate(true);
889 myWorkshop->viewer()->update();