X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_Operation.cpp;h=68dd1322176bd6a73e83687402f769d7f0e99946;hb=af851100774c4ff33b515c884abe0cd03c3f0528;hp=89b1957d30a4585c5d0827674d2c6875c7645df6;hpb=8a5d97eb28fa3b1058c64942fed24347916a5c40;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_Operation.cpp b/src/ModuleBase/ModuleBase_Operation.cpp index 89b1957d3..68dd13221 100644 --- a/src/ModuleBase/ModuleBase_Operation.cpp +++ b/src/ModuleBase/ModuleBase_Operation.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + /* * ModuleBase_Operation.cpp * @@ -64,54 +66,26 @@ bool ModuleBase_Operation::isValid() const { if (!myFeature) return true; // rename operation + if (myFeature->isAction()) + return true; //Get validators for the Id SessionPtr aMgr = ModelAPI_Session::get(); ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); return aFactory->validate(myFeature); } -bool ModuleBase_Operation::isNestedOperationsEnabled() const -{ - return true; -} - -//void ModuleBase_Operation::storeCustomValue() -//{ -// if (!myFeature) { -//#ifdef _DEBUG -// qDebug() << "ModuleBase_Operation::storeCustom: " << -// "trying to store value without opening a transaction."; -//#endif -// return; -// } -// -// ModuleBase_ModelWidget* aCustom = dynamic_cast(sender()); -// if (aCustom) -// aCustom->storeValue(); -//} - bool ModuleBase_Operation::canBeCommitted() const { return isValid(); } -void ModuleBase_Operation::flushUpdated() -{ - Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); -} - -void ModuleBase_Operation::flushCreated() -{ - Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED)); -} - FeaturePtr ModuleBase_Operation::createFeature(const bool theFlushMessage) { - if (myParentFeature) { + if (myParentFeature.get()) { myFeature = myParentFeature->addFeature(getDescription()->operationId().toStdString()); } else { - std::shared_ptr aDoc = document(); + std::shared_ptr aDoc = ModelAPI_Session::get()->activeDocument(); myFeature = aDoc->addFeature(getDescription()->operationId().toStdString()); } if (myFeature) { // TODO: generate an error if feature was not created @@ -127,7 +101,7 @@ FeaturePtr ModuleBase_Operation::createFeature(const bool theFlushMessage) } if (theFlushMessage) - flushCreated(); + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED)); return myFeature; } @@ -153,35 +127,40 @@ bool ModuleBase_Operation::hasObject(ObjectPtr theObj) const return false; } - -std::shared_ptr ModuleBase_Operation::document() const -{ - return ModelAPI_Session::get()->moduleDocument(); -} - - void ModuleBase_Operation::start() { - ModelAPI_Session::get()->startOperation(); - - if (!myIsEditing) - createFeature(); + QString anId = getDescription()->operationId(); + if (myIsEditing) { + anId = anId.append(EditSuffix()); + } + ModelAPI_Session::get()->startOperation(anId.toStdString()); + + if (!myIsEditing) { + FeaturePtr aFeature = createFeature(); + // if the feature is not created, there is no sense to start the operation + if (aFeature.get() == NULL) { + // it is necessary to abor the operation in the session and emit the aborted signal + // in order to update commands status in the workshop, to be exact the feature action + // to be unchecked + abort(); + return; + } + } startOperation(); emit started(); + } void ModuleBase_Operation::postpone() { - if (myPropertyPanel) - disconnect(myPropertyPanel, 0, this, 0); + postponeOperation(); emit postponed(); } void ModuleBase_Operation::resume() { - // connect(myPropertyPanel, SIGNAL(widgetActivated(ModuleBase_ModelWidget*)), - // this, SLOT(onWidgetActivated(ModuleBase_ModelWidget*))); + resumeOperation(); emit resumed(); } @@ -189,8 +168,6 @@ void ModuleBase_Operation::abort() { abortOperation(); emit aborted(); - if (myPropertyPanel) - disconnect(myPropertyPanel, 0, this, 0); stopOperation(); @@ -201,9 +178,6 @@ void ModuleBase_Operation::abort() bool ModuleBase_Operation::commit() { if (canBeCommitted()) { - if (myPropertyPanel) - disconnect(myPropertyPanel, 0, this, 0); - commitOperation(); // check whether there are modifications performed during the current operation // in the model @@ -230,20 +204,23 @@ void ModuleBase_Operation::setRunning(bool theState) } } -bool ModuleBase_Operation::activateByPreselection() +void ModuleBase_Operation::activateByPreselection() { - if (!myPropertyPanel) - return false; - if (myPreSelection.empty()) - return false; + if (!myPropertyPanel || myPreSelection.empty()) { + myPropertyPanel->activateNextWidget(NULL); + return; + } const QList& aWidgets = myPropertyPanel->modelWidgets(); - if (aWidgets.empty()) - return false; + if (aWidgets.empty()) { + myPropertyPanel->activateNextWidget(NULL); + return; + } ModuleBase_ModelWidget* aWgt, *aFilledWgt = 0; QList::const_iterator aWIt; QList::const_iterator aPIt; bool isSet = false; + // 1. apply the selection to controls for (aWIt = aWidgets.constBegin(), aPIt = myPreSelection.constBegin(); (aWIt != aWidgets.constEnd()) && (aPIt != myPreSelection.constEnd()); ++aWIt) { @@ -261,20 +238,29 @@ bool ModuleBase_Operation::activateByPreselection() aFilledWgt = aWgt; } } - if (isSet && canBeCommitted()) { - // if all widgets are filled with selection - commit - // in order to commit the operation outside of starting procedure - use timer event - QTimer::singleShot(50, this, SLOT(commit())); - return true; - } - else { - //activate next widget - if (aFilledWgt) { - myPropertyPanel->activateNextWidget(aFilledWgt); - return true; - } - } - return false; + // 2. ignore not obligatory widgets + /*for (; aWIt != aWidgets.constEnd(); ++aWIt) { + aWgt = (*aWIt); + if (aWgt && aWgt->isObligatory()) + continue; + aFilledWgt = aWgt; + }*/ + + // 3. activate the next obligatory widget + myPropertyPanel->activateNextWidget(aFilledWgt); + if (aFilledWgt) + emit activatedByPreselection(); + +} + +void ModuleBase_Operation::setParentFeature(CompositeFeaturePtr theParent) +{ + myParentFeature = theParent; +} + +CompositeFeaturePtr ModuleBase_Operation::parentFeature() const +{ + return myParentFeature; } void ModuleBase_Operation::initSelection(ModuleBase_ISelection* theSelection, @@ -356,11 +342,14 @@ void ModuleBase_Operation::setPropertyPanel(ModuleBase_IPropertyPanel* theProp) { myPropertyPanel = theProp; myPropertyPanel->setEditingMode(isEditOperation()); - //connect(myPropertyPanel, SIGNAL(widgetActivated(ModuleBase_ModelWidget*)), this, - // SLOT(onWidgetActivated(ModuleBase_ModelWidget*))); + + // Do not activate widgets by default if the current operation is editing operation + // Because we don't know which widget is going to be edited. + if (!isEditOperation()) + activateByPreselection(); } bool ModuleBase_Operation::isGranted(QString theId) const { return myNestedFeatures.contains(theId); -} \ No newline at end of file +}