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>
16 #include <QTreeWidget>
17 #include <QPushButton>
18 #include <QToolButton>
19 #include <QStyledItemDelegate>
29 class ParametersPlugin_ItemDelegate : public QStyledItemDelegate
32 ParametersPlugin_ItemDelegate(QObject* thaParent) :
33 QStyledItemDelegate(thaParent) {}
35 virtual void paint(QPainter* painter,
36 const QStyleOptionViewItem& option,
37 const QModelIndex& index ) const;
39 //virtual QWidget* createEditor(QWidget* parent,
40 // const QStyleOptionViewItem& option,
41 // const QModelIndex& index) const;
43 bool isEditable(const QModelIndex& theIndex) const;
46 bool ParametersPlugin_ItemDelegate::isEditable(const QModelIndex& theIndex) const
48 QModelIndex aParent = theIndex.parent();
49 if (aParent.isValid() && (aParent.row() == 0)) {
50 if (theIndex.column() == 2)
57 void ParametersPlugin_ItemDelegate::paint(QPainter* painter,
58 const QStyleOptionViewItem& option,
59 const QModelIndex& index ) const
61 QBrush aBrush = painter->brush();
62 QPen aPen = painter->pen();
63 if (!isEditable(index))
64 painter->setBrush(Qt::lightGray);
66 painter->setPen(Qt::darkGray);
67 painter->drawRect(option.rect);
69 QStyledItemDelegate::paint(painter, option, index);
71 painter->setPen(aPen);
72 painter->setBrush(aBrush);
76 //QWidget* ParametersPlugin_ItemDelegate::createEditor(QWidget* parent,
77 // const QStyleOptionViewItem& option,
78 // const QModelIndex& index) const
80 // QWidget* aWgt = QStyledItemDelegate::createEditor(parent, option, index);
81 // aWgt->setMinimumSize(option.rect.width() - option.decorationSize.width(),
82 // option.rect.height());
87 /////////////////////////////////////////////////////////////////////////////////////////////////
89 ParametersPlugin_WidgetParamsMgr::ParametersPlugin_WidgetParamsMgr(QWidget* theParent, const Config_WidgetAPI* theData)
90 : ModuleBase_ModelWidget(theParent, theData)
92 QVBoxLayout* aLayout = new QVBoxLayout(this);
94 myTable = new QTreeWidget(this);
95 myTable->setColumnCount(4);
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));
109 myDelegate = new ParametersPlugin_ItemDelegate(myTable);
110 connect(myDelegate, SIGNAL(closeEditor(QWidget*, QAbstractItemDelegate::EndEditHint)),
111 SLOT(onCloseEditor(QWidget*, QAbstractItemDelegate::EndEditHint)));
113 myTable->setItemDelegate(myDelegate);
114 aLayout->addWidget(myTable);
118 aNames<<tr("Parameters");
119 myParameters = new QTreeWidgetItem(aNames);
120 myTable->addTopLevelItem(myParameters);
123 aNames<<tr("Features");
124 myFeatures = new QTreeWidgetItem(aNames);
125 myTable->addTopLevelItem(myFeatures);
127 QHBoxLayout* aBtnLayout = new QHBoxLayout(this);
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);
136 aBtnLayout->addStretch();
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);
145 aLayout->addLayout(aBtnLayout);
148 QList<QWidget*> ParametersPlugin_WidgetParamsMgr::getControls() const
150 QList<QWidget*> aList;
155 bool ParametersPlugin_WidgetParamsMgr::storeValueCustom() const
160 bool ParametersPlugin_WidgetParamsMgr::restoreValueCustom()
165 void ParametersPlugin_WidgetParamsMgr::activateCustom()
167 FeaturePtr aFeature = feature();
168 DocumentPtr aDoc = aFeature->document();
169 int aNbParam = aDoc->size(ModelAPI_ResultParameter::group());
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);
178 aParamFeature = ModelAPI_Feature::feature(aParam);
181 aValues << aParamFeature->string(ParametersPlugin_Parameter::VARIABLE_ID())->value().c_str();
182 aValues << aParamFeature->string(ParametersPlugin_Parameter::EXPRESSION_ID())->value().c_str();
184 AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
185 aValues << QString::number(aValueAttribute->value());
187 //AttributeRefListPtr aParams = aParamFeature->reflist(ParametersPlugin_Parameter::ARGUMENTS_ID());
188 //std::list<ObjectPtr> aList = aParams->list();
190 //std::list<ObjectPtr>::iterator aIt;
191 //for(aIt = aList.begin(); aIt != aList.end(); aIt++) {
193 // aName = aObj->data()->name();
195 aItem = new QTreeWidgetItem(aValues);
196 aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
197 myParameters->addChild(aItem);
199 myFeatureList.append(aParamFeature);
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();
209 //AttributeDoublePtr aValue = aReferenced->data()->real(SketchPlugin_Constraint::VALUE());
211 aItem = new QTreeWidgetItem(aValNames);
212 myFeatures->addChild(aItem);
217 myFeatures->setExpanded(true);
218 myParameters->setExpanded(true);
222 void ParametersPlugin_WidgetParamsMgr::onDoubleClick(const QModelIndex& theIndex)
224 if (myDelegate->isEditable(theIndex)) {
225 myTable->edit(theIndex);
226 myEditingIndex = theIndex;
230 void ParametersPlugin_WidgetParamsMgr::onCloseEditor(QWidget* theEditor,
231 QAbstractItemDelegate::EndEditHint theHint)
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());
241 ResultParameterPtr aResult =
242 std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aFeature->firstResult());
244 AttributeDoublePtr aValueAttribute =
245 aResult->data()->real(ModelAPI_ResultParameter::VALUE());
246 aItem->setText(Col_Result, QString::number(aValueAttribute->value()));
250 myEditingIndex = QModelIndex();