X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_PartDataModel.cpp;h=fff14f9d4b0ae97eae84c6443eff4f5511391caa;hb=020e7187ee88afbd18286f149536cdef61d9f61e;hp=21896e81a388f3d428758b5457d48406b278ef22;hpb=e2c1d6fb594fe1234fa7a0786801d8c1c92d7ac6;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_PartDataModel.cpp b/src/PartSet/PartSet_PartDataModel.cpp index 21896e81a..fff14f9d4 100644 --- a/src/PartSet/PartSet_PartDataModel.cpp +++ b/src/PartSet/PartSet_PartDataModel.cpp @@ -17,252 +17,71 @@ #include #include #include +#include +#include + +#include #include #include -PartSet_TopDataModel::PartSet_TopDataModel(QObject* theParent) - : PartSet_FeaturesModel(theParent) +PartSet_PartDataModel::PartSet_PartDataModel(QObject* theParent) + : PartSet_PartModel(theParent) { } -PartSet_TopDataModel::~PartSet_TopDataModel() +PartSet_PartDataModel::~PartSet_PartDataModel() { } -QVariant PartSet_TopDataModel::data(const QModelIndex& theIndex, int theRole) const +QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) const { - switch (theRole) { - case Qt::DisplayRole: - // return a name - switch (theIndex.internalId()) { - case ParamsFolder: - return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex)); - case ParamObject: { - DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); - ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultParameter::group(), theIndex.row()); - if (aObject) { - ResultParameterPtr aParam = std::dynamic_pointer_cast(aObject); - AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE()); - QString aVal = QString::number(aValueAttribute->value()); - QString aTitle = QString(aObject->data()->name().c_str()); - return aTitle + " = " + aVal; - } - } - break; - case ConstructFolder: - return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex)); - case ConstructObject: { - DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); - ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultConstruction::group(), - theIndex.row()); - if (aObject) - return aObject->data()->name().c_str(); - } - break; - //case GroupsFolder: - // return tr("Groups") + QString(" (%1)").arg(rowCount(theIndex)); - //case GroupObject: { - // DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); - // ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultGroup::group(), - // theIndex.row()); - // if (aObject) - // return aObject->data()->name().c_str(); - //} - // break; - } - break; - - case Qt::DecorationRole: - { - // return an Icon - switch (theIndex.internalId()) { - case ParamsFolder: - return QIcon(":pictures/params_folder.png"); - case ConstructFolder: - return QIcon(":pictures/constr_folder.png"); - case ConstructObject: - return QIcon(":pictures/constr_object.png"); - //case GroupsFolder: - // return QIcon(":pictures/constr_folder.png"); + DocumentPtr aPartDoc = partDocument(); + if (theIndex.column() == 1) { + DocumentPtr aActiveDoc = ModelAPI_Session::get()->activeDocument(); + QModelIndex aParent = theIndex.parent(); + if (aActiveDoc == aPartDoc) { + if (!aParent.isValid()) { + switch (theRole) { + case Qt::DecorationRole: + if (theIndex.row() == lastHistoryRow()) + return QIcon(":pictures/arrow.png"); } } - break; - - case Qt::ToolTipRole: - // return Tooltip - break; - case Qt::ForegroundRole: - return QBrush(myItemsColor); - break; - } - return QVariant(); -} - -QVariant PartSet_TopDataModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - return QVariant(); -} - -int PartSet_TopDataModel::rowCount(const QModelIndex& theParent) const -{ - if (!theParent.isValid()) - return 2; // In case of groups using it has to be +1 - - DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); - if (theParent.internalId() == ParamsFolder) - return aRootDoc->size(ModelAPI_ResultParameter::group()); - - if (theParent.internalId() == ConstructFolder) - return aRootDoc->size(ModelAPI_ResultConstruction::group()); - - //if (theParent.internalId() == GroupsFolder) - // return aRootDoc->size(ModelAPI_ResultGroup::group()); - - return 0; -} - -int PartSet_TopDataModel::columnCount(const QModelIndex &parent) const -{ - return 1; -} - -QModelIndex PartSet_TopDataModel::index(int theRow, int theColumn, const QModelIndex& theParent) const -{ - if (!theParent.isValid()) { - switch (theRow) { - case 0: - return createIndex(theRow, theColumn, (qint32) ParamsFolder); - case 1: - return createIndex(theRow, theColumn, (qint32) ConstructFolder); - //case 2: - // return createIndex(theRow, theColumn, (qint32) GroupsFolder); - } - } else { - if (theParent.internalId() == ParamsFolder) - return createIndex(theRow, theColumn, (qint32) ParamObject); - - if (theParent.internalId() == ConstructFolder) - return createIndex(theRow, theColumn, (qint32) ConstructObject); - - //if (theParent.internalId() == GroupsFolder) - // return createIndex(theRow, theColumn, (qint32) GroupObject); - } - return QModelIndex(); -} - -QModelIndex PartSet_TopDataModel::parent(const QModelIndex& theIndex) const -{ - int aId = (int) theIndex.internalId(); - switch (aId) { - case ParamsFolder: - case ConstructFolder: - //case GroupsFolder: - return QModelIndex(); - case ParamObject: - return createIndex(0, 0, (qint32) ParamsFolder); - case ConstructObject: - return createIndex(1, 0, (qint32) ConstructFolder); - //case GroupObject: - // return createIndex(2, 0, (qint32) GroupsFolder); - } - return QModelIndex(); -} - -bool PartSet_TopDataModel::hasChildren(const QModelIndex& theParent) const -{ - return rowCount(theParent) > 0; -} - -ObjectPtr PartSet_TopDataModel::object(const QModelIndex& theIndex) const -{ - switch (theIndex.internalId()) { - case ParamsFolder: - case ConstructFolder: - return ObjectPtr(); - case ParamObject: { - DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); - return aRootDoc->object(ModelAPI_ResultParameter::group(), theIndex.row()); } - case ConstructObject: { - DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); - return aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row()); - } - //case GroupObject: { - // DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); - // return aRootDoc->object(ModelAPI_ResultGroup::group(), theIndex.row()); - //} + return QVariant(); } - return ObjectPtr(); -} - -QModelIndex PartSet_TopDataModel::findParent(const ObjectPtr& theObject) const -{ - return findGroup(theObject->groupName().c_str()); -} - -QModelIndex PartSet_TopDataModel::findGroup(const std::string& theGroup) const -{ - if (theGroup == ModelAPI_ResultParameter::group()) - return createIndex(0, 0, (qint32) ParamsFolder); - if (theGroup == ModelAPI_ResultConstruction::group()) - return createIndex(1, 0, (qint32) ConstructFolder); - //if (theGroup == ModelAPI_ResultGroup::group()) - // return createIndex(2, 0, (qint32) ConstructFolder); - return QModelIndex(); -} -QModelIndex PartSet_TopDataModel::objectIndex(const ObjectPtr& theObject) const -{ - QModelIndex aIndex; - if (theObject) { - DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); - std::string aGroup = theObject->groupName(); - int aNb = aRootDoc->size(aGroup); - int aRow = -1; - for (int i = 0; i < aNb; i++) { - if (aRootDoc->object(aGroup, i) == theObject) { - aRow = i; + if (theIndex.internalId() >= 0) { + ObjectPtr aObj = object(theIndex); + switch (theRole) { + case Qt::DisplayRole: + return aObj->data()->name().c_str(); + case Qt::DecorationRole: + { + FeaturePtr aFeature = std::dynamic_pointer_cast(aObj); + if (aFeature) + return PartSet_DocumentDataModel::featureIcon(aFeature); + } break; - } - } - if (aRow != -1) { - if (aGroup == ModelAPI_ResultParameter::group()) - return createIndex(aRow, 0, (qint32) ParamObject); - if (aGroup == ModelAPI_ResultConstruction::group()) - return createIndex(aRow, 0, (qint32) ConstructObject); - //if (aGroup == ModelAPI_ResultGroup::group()) - // return createIndex(aRow, 0, (qint32) GroupObject); + case Qt::ForegroundRole: + if (theIndex.internalId() > lastHistoryRow()) + return QBrush(Qt::lightGray); + return QBrush(myItemsColor); } } - return aIndex; -} - -//****************************************************************** -//****************************************************************** -//****************************************************************** -PartSet_PartDataModel::PartSet_PartDataModel(QObject* theParent) - : PartSet_PartModel(theParent) -{ -} - -PartSet_PartDataModel::~PartSet_PartDataModel() -{ -} -QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) const -{ switch (theRole) { case Qt::DisplayRole: // return a name switch (theIndex.internalId()) { - case MyRoot: { - DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); - ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId); - if (aObject) - return std::dynamic_pointer_cast(aObject)->data()->name().c_str(); - } + //case MyRoot: { + // DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); + // ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId); + // if (aObject) + // return std::dynamic_pointer_cast(aObject)->data()->name().c_str(); + //} case ParamsFolder: return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex)); case ConstructFolder: @@ -272,8 +91,7 @@ QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) c case GroupsFolder: return tr("Groups") + QString(" (%1)").arg(rowCount(theIndex)); case ParamObject: { - ObjectPtr aObject = partDocument()->object(ModelAPI_ResultParameter::group(), - theIndex.row()); + ObjectPtr aObject = aPartDoc->object(ModelAPI_ResultParameter::group(), theIndex.row()); if (aObject) { ResultParameterPtr aParam = std::dynamic_pointer_cast(aObject); AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE()); @@ -284,25 +102,24 @@ QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) c } break; case ConstructObject: { - ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(), - theIndex.row()); + ObjectPtr aObject = aPartDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row()); if (aObject) return std::dynamic_pointer_cast(aObject)->data()->name().c_str(); } break; case BodiesObject: { - ObjectPtr aObject = partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row()); + ObjectPtr aObject = aPartDoc->object(ModelAPI_ResultBody::group(), theIndex.row()); if (aObject) return aObject->data()->name().c_str(); } break; case GroupObject: { - ObjectPtr aObject = partDocument()->object(ModelAPI_ResultGroup::group(), theIndex.row()); + ObjectPtr aObject = aPartDoc->object(ModelAPI_ResultGroup::group(), theIndex.row()); if (aObject) return aObject->data()->name().c_str(); } case HistoryObject: { - ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber()); + ObjectPtr aObject = aPartDoc->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber()); if (aObject) return aObject->data()->name().c_str(); } @@ -311,8 +128,8 @@ QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) c case Qt::DecorationRole: // return an Icon switch (theIndex.internalId()) { - case MyRoot: - return QIcon(":pictures/part_ico.png"); + //case MyRoot: + // return QIcon(":pictures/part_ico.png"); case ParamsFolder: return QIcon(":pictures/params_folder.png"); case ConstructFolder: @@ -323,17 +140,24 @@ QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) c case ConstructObject: case GroupObject: case BodiesObject: { - std::string aGroup = theIndex.internalId() == ConstructObject ? - ModelAPI_ResultConstruction::group() : ModelAPI_ResultBody::group(); - ObjectPtr anObject = partDocument()->object(aGroup, theIndex.row()); - if (anObject && anObject->data() && - anObject->data()->execState() == ModelAPI_StateMustBeUpdated) { - return QIcon(":pictures/constr_object_modified.png"); + std::string aGroup; + if (theIndex.internalId() == ConstructObject) + aGroup = ModelAPI_ResultConstruction::group(); + else if (theIndex.internalId() == BodiesObject) + aGroup = ModelAPI_ResultBody::group(); + else if (theIndex.internalId() == GroupObject) + aGroup = ModelAPI_ResultGroup::group(); + if (aGroup.length() > 0) { + ObjectPtr anObject = aPartDoc->object(aGroup, theIndex.row()); + if (anObject && anObject->data() && + anObject->data()->execState() == ModelAPI_StateMustBeUpdated) { + return QIcon(":pictures/constr_object_modified.png"); + } } return QIcon(":pictures/constr_object.png"); } case HistoryObject: { - ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber()); + ObjectPtr aObject = aPartDoc->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber()); FeaturePtr aFeature = std::dynamic_pointer_cast(aObject); if (aFeature) return PartSet_DocumentDataModel::featureIcon(aFeature); @@ -344,8 +168,11 @@ QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) c // return Tooltip break; case Qt::ForegroundRole: + if (theIndex.internalId() == HistoryObject) { + if (theIndex.row() > lastHistoryRow()) + return QBrush(Qt::lightGray); + } return QBrush(myItemsColor); - break; } return QVariant(); } @@ -358,21 +185,13 @@ QVariant PartSet_PartDataModel::headerData(int section, Qt::Orientation orientat int PartSet_PartDataModel::rowCount(const QModelIndex& parent) const { if (!parent.isValid()) { - DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); - if (aRootDoc->object(ModelAPI_ResultPart::group(), myId)) - return 1; - else + DocumentPtr aDoc = partDocument(); + if (aDoc.get()) { + return getRowsNumber() + aDoc->size(ModelAPI_Feature::group()); + } else return 0; } switch (parent.internalId()) { - case MyRoot: - { - DocumentPtr aDoc = partDocument(); - if (aDoc) { - return getRowsNumber() + aDoc->size(ModelAPI_Feature::group()); - } else - return 0; - } case ParamsFolder: return partDocument()->size(ModelAPI_ResultParameter::group()); case ConstructFolder: @@ -381,64 +200,78 @@ int PartSet_PartDataModel::rowCount(const QModelIndex& parent) const return partDocument()->size(ModelAPI_ResultBody::group()); case GroupsFolder: return partDocument()->size(ModelAPI_ResultGroup::group()); + case HistoryObject: + { + ObjectPtr aObj = object(parent); + CompositeFeaturePtr aCompFeature = + std::dynamic_pointer_cast(aObj); + if (aCompFeature.get()) { + return aCompFeature->numberOfSubs(true); + } + } } return 0; } int PartSet_PartDataModel::columnCount(const QModelIndex &parent) const { - return 1; + return 2; } QModelIndex PartSet_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const { - if (!theParent.isValid()) - return createIndex(theRow, 0, (qint32) MyRoot); - - int aId = (int) theParent.internalId(); - switch (aId) { - case MyRoot: - switch (theRow) { - case 0: - return createIndex(theRow, 0, (qint32) ParamsFolder); - case 1: - return createIndex(theRow, 0, (qint32) ConstructFolder); - case 2: - return createIndex(theRow, 0, (qint32) BodiesFolder); - case 3: - { - int aSize = partDocument()->size(ModelAPI_ResultGroup::group()); - if (aSize > 0) - return createIndex(theRow, 0, (qint32) GroupsFolder); - else - return createIndex(theRow, theColumn, (qint32) HistoryObject); - } - default: + if (!theParent.isValid()) { + switch (theRow) { + case 0: + return createIndex(theRow, theColumn, (qint32) ParamsFolder); + case 1: + return createIndex(theRow, theColumn, (qint32) ConstructFolder); + case 2: + return createIndex(theRow, theColumn, (qint32) BodiesFolder); + case 3: + { + int aSize = partDocument()->size(ModelAPI_ResultGroup::group()); + if (aSize > 0) + return createIndex(theRow, theColumn, (qint32) GroupsFolder); + else return createIndex(theRow, theColumn, (qint32) HistoryObject); - } - case ParamsFolder: - return createIndex(theRow, 0, (qint32) ParamObject); - case ConstructFolder: - return createIndex(theRow, 0, (qint32) ConstructObject); - case BodiesFolder: - return createIndex(theRow, 0, (qint32) BodiesObject); - case GroupsFolder: - return createIndex(theRow, 0, (qint32) GroupObject); + } + default: + return createIndex(theRow, theColumn, (qint32) HistoryObject); + } + } else { + int aId = (int) theParent.internalId(); + switch (aId) { + case ParamsFolder: + return createIndex(theRow, theColumn, (qint32) ParamObject); + case ConstructFolder: + return createIndex(theRow, theColumn, (qint32) ConstructObject); + case BodiesFolder: + return createIndex(theRow, theColumn, (qint32) BodiesObject); + case GroupsFolder: + return createIndex(theRow, theColumn, (qint32) GroupObject); + case HistoryObject: + { + return createIndex(theRow, theColumn, (qint32) theParent.row()); + } + } } return QModelIndex(); } QModelIndex PartSet_PartDataModel::parent(const QModelIndex& theIndex) const { + if (theIndex.internalId() >= 0) { + int aPRow = theIndex.internalId(); + return createIndex(aPRow, 0, (qint32) HistoryObject); + } switch (theIndex.internalId()) { - case MyRoot: - return QModelIndex(); case ParamsFolder: case ConstructFolder: case BodiesFolder: case GroupsFolder: case HistoryObject: - return createIndex(0, 0, (qint32) MyRoot); + return QModelIndex(); case ParamObject: return createIndex(0, 0, (qint32) ParamsFolder); @@ -459,21 +292,26 @@ bool PartSet_PartDataModel::hasChildren(const QModelIndex& theParent) const DocumentPtr PartSet_PartDataModel::partDocument() const { - DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); - ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId); - ResultPartPtr aPart = std::dynamic_pointer_cast(aObject); - if (aPart) + ResultPartPtr aPart = std::dynamic_pointer_cast(myPart->firstResult()); + if (aPart.get()) // this may be null is Part feature is disabled return aPart->partDoc(); - return DocumentPtr(); // null if not found + return DocumentPtr(); } ObjectPtr PartSet_PartDataModel::object(const QModelIndex& theIndex) const { - switch (theIndex.internalId()) { - case MyRoot: { - DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); - return aRootDoc->object(ModelAPI_ResultPart::group(), myId); + if (theIndex.internalId() >= 0) { + int aPRow = theIndex.internalId(); + ObjectPtr aObj = + partDocument()->object(ModelAPI_Feature::group(), aPRow - getRowsNumber()); + CompositeFeaturePtr aCompFeature = + std::dynamic_pointer_cast(aObj); + if (aCompFeature.get()) { + return aCompFeature->subFeature(theIndex.row(), true); } + return ObjectPtr(); + } + switch (theIndex.internalId()) { case ParamsFolder: case ConstructFolder: case BodiesFolder: @@ -517,13 +355,6 @@ QModelIndex PartSet_PartDataModel::findGroup(const std::string& theGroup) const return QModelIndex(); } -ResultPartPtr PartSet_PartDataModel::part() const -{ - DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); - ObjectPtr aObj = aRootDoc->object(ModelAPI_ResultPart::group(), myId); - return std::dynamic_pointer_cast(aObj); -} - QModelIndex PartSet_PartDataModel::objectIndex(const ObjectPtr& theObject) const { QModelIndex aIndex; @@ -564,4 +395,55 @@ int PartSet_PartDataModel::getRowsNumber() const if (aSize == 0) // If there are no groups then do not show group folder return 3; return 4; -} \ No newline at end of file +} + +int PartSet_PartDataModel::lastHistoryRow() const +{ + DocumentPtr aDoc = partDocument(); + FeaturePtr aFeature = aDoc->currentFeature(true); + if (aFeature.get()) + return getRowsNumber() + aDoc->index(aFeature); + else + return getRowsNumber() - 1; +} + +void PartSet_PartDataModel::setLastHistoryItem(const QModelIndex& theIndex) +{ + SessionPtr aMgr = ModelAPI_Session::get(); + DocumentPtr aDoc = partDocument(); + std::string aOpName = tr("History change").toStdString(); + if (theIndex.internalId() == HistoryObject) { + ObjectPtr aObject = object(theIndex); + aMgr->startOperation(aOpName); + aDoc->setCurrentFeature(std::dynamic_pointer_cast(aObject), true); + aMgr->finishOperation(); + } else { + aMgr->startOperation(aOpName); + aDoc->setCurrentFeature(FeaturePtr(), true); + aMgr->finishOperation(); + } +} + +QModelIndex PartSet_PartDataModel::lastHistoryItem() const +{ + return index(lastHistoryRow(), 1); +} + +Qt::ItemFlags PartSet_PartDataModel::flags(const QModelIndex& theIndex) const +{ + // Disable sub-features at column 1 + if ((theIndex.column() == 1) && (theIndex.internalId() >= 0)) + return 0; + + Qt::ItemFlags aFlags = Qt::ItemIsSelectable; + if (object(theIndex)) { + aFlags |= Qt::ItemIsEditable; + } + + if (theIndex.internalId() == HistoryObject) { + if (theIndex.row() <= lastHistoryRow() || (theIndex.column() == 1)) + aFlags |= Qt::ItemIsEnabled; + } else + aFlags |= Qt::ItemIsEnabled; + return aFlags; +}