#include "XGUI_Workshop.h"
#include "XGUI_ActionsMgr.h"
+#include "XGUI_MenuMgr.h"
#include "XGUI_ColorDialog.h"
#include "XGUI_ContextMenuMgr.h"
#include "XGUI_Displayer.h"
#include <ModuleBase_OperationAction.h>
#include <ModuleBase_PagedContainer.h>
#include <ModuleBase_WidgetValidated.h>
+#include <ModuleBase_ModelWidget.h>
#include <Config_Common.h>
#include <Config_FeatureMessage.h>
#include <Config_PointerMessage.h>
#include <Config_PropManager.h>
#include <Config_SelectionFilterMessage.h>
+#include <Config_DataModelReader.h>
#include <SUIT_ResourceMgr.h>
QLocale::setDefault( QLocale::system() );
#endif
+ myDataModelXMLReader = new Config_DataModelReader();
+ myDataModelXMLReader->readAll();
+
myDisplayer = new XGUI_Displayer(this);
mySelector = new XGUI_SelectionMgr(this);
myOperationMgr = new XGUI_OperationMgr(this, 0);
myActionsMgr = new XGUI_ActionsMgr(this);
+ myMenuMgr = new XGUI_MenuMgr(this);
myErrorDlg = new XGUI_ErrorDialog(QApplication::desktop());
myContextMenuMgr = new XGUI_ContextMenuMgr(this);
connect(myContextMenuMgr, SIGNAL(actionTriggered(const QString&, bool)), this,
SLOT(onContextMenuCommand(const QString&, bool)));
myViewerProxy = new XGUI_ViewerProxy(this);
- connect(myViewerProxy, SIGNAL(selectionChanged()),
- myActionsMgr, SLOT(updateOnViewSelection()));
+ //connect(myViewerProxy, SIGNAL(selectionChanged()),
+ // myActionsMgr, SLOT(updateOnViewSelection()));
myModuleConnector = new XGUI_ModuleConnector(this);
XGUI_Workshop::~XGUI_Workshop(void)
{
delete myDisplayer;
+ delete myDataModelXMLReader;
}
//******************************************************
}
}
+//******************************************************
+void XGUI_Workshop::onPreviewActionClicked()
+{
+ ModuleBase_IPropertyPanel* aPanel = propertyPanel();
+ if (aPanel) {
+ ModuleBase_ModelWidget* anActiveWidget = aPanel->activeWidget();
+ if (anActiveWidget && anActiveWidget->getValueState() == ModuleBase_ModelWidget::ModifiedInPP) {
+ anActiveWidget->storeValue();
+ }
+ }
+ std::shared_ptr<Events_Message> aMsg = std::shared_ptr<Events_Message>(
+ new Events_Message(Events_Loop::eventByName(EVENT_PREVIEW_REQUESTED)));
+ Events_Loop::loop()->send(aMsg);
+}
+
//******************************************************
void XGUI_Workshop::deactivateActiveObject(const ObjectPtr& theObject, const bool theUpdateViewer)
{
// check compatibility of feature and widgets
FeaturePtr aFeature = aFOperation->feature();
+ std::string aFeatureKind = aFeature->getKind();
foreach (ModuleBase_ModelWidget* aWidget, aWidgets) {
if (!aWidget->attributeID().empty() && !aFeature->attribute(aWidget->attributeID()).get()) {
- std::string anErrorMsg = "The feature '" + aFeature->getKind() + "' has no attribute '"
+ std::string anErrorMsg = "The feature '" + aFeatureKind + "' has no attribute '"
+ aWidget->attributeID() + "' used by widget '"
+ aWidget->metaObject()->className() + "'.";
Events_Error::send(anErrorMsg);
return;
}
}
-
+ // for performance purpose, flush should be done after all controls are filled
+ bool isUpdateFlushed = false;
foreach (ModuleBase_ModelWidget* aWidget, aWidgets) {
bool isStoreValue = !aFOperation->isEditOperation() &&
!aWidget->getDefaultValue().empty() &&
!aWidget->isComputedDefault();
- aWidget->setFeature(aFOperation->feature(), isStoreValue);
+ aWidget->setFeature(aFeature, isStoreValue, isUpdateFlushed);
+ if (!isStoreValue)
+ aWidget->restoreValue();
aWidget->enableFocusProcessing();
}
+ ModuleBase_Tools::flushUpdated(aFeature);
+ // update visible state of Preview button
+#ifdef HAVE_SALOME
+ bool anIsAutoPreview = mySalomeConnector->featureInfo(aFeatureKind.c_str())->isAutoPreview();
+#else
+ AppElements_MainMenu* aMenuBar = mainWindow()->menuObject();
+ AppElements_Command* aCommand = aMenuBar->feature(aFeatureKind.c_str());
+ bool anIsAutoPreview = aCommand && aCommand->featureMessage()->isAutoPreview();
+#endif
+ if (!anIsAutoPreview) {
+ myPropertyPanel->findButton(PROP_PANEL_PREVIEW)->setVisible(true);
+ // send signal about preview should not be computed automatically, click on preview
+ // button should initiate it
+ std::shared_ptr<Events_Message> aMsg = std::shared_ptr<Events_Message>(
+ new Events_Message(Events_Loop::eventByName(EVENT_PREVIEW_BLOCKED)));
+ Events_Loop::loop()->send(aMsg);
+ }
myPropertyPanel->setModelWidgets(aWidgets);
aFOperation->setPropertyPanel(myPropertyPanel);
if (isToConnect) {
connect(aWidget, SIGNAL(valueStateChanged(int)), this, SLOT(onWidgetStateChanged(int)));
connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onValuesChanged()));
- }
+ connect(aWidget, SIGNAL(objectUpdated()), this, SLOT(onWidgetObjectUpdated()));
+ }
else {
disconnect(aWidget, SIGNAL(valueStateChanged(int)), this, SLOT(onWidgetStateChanged(int)));
disconnect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onValuesChanged()));
+ disconnect(aWidget, SIGNAL(objectUpdated()), this, SLOT(onWidgetObjectUpdated()));
}
}
}
return;
QStringList aGrantedIds;
- if (isSalomeMode())
- aGrantedIds = mySalomeConnector->nestedActions(theOperation->id());
+ if (isSalomeMode()) {
+ const std::shared_ptr<Config_FeatureMessage>& anInfo =
+ mySalomeConnector->featureInfo(theOperation->id());
+ if (anInfo.get())
+ aGrantedIds = QString::fromStdString(anInfo->nestedFeatures())
+ .split(" ", QString::SkipEmptyParts);
+ }
else
aGrantedIds = myActionsMgr->nestedCommands(theOperation->id());
}
}
+void XGUI_Workshop::onWidgetObjectUpdated()
+{
+ operationMgr()->onValidateOperation();
+}
+
ModuleBase_IModule* XGUI_Workshop::loadModule(const QString& theModule)
{
QString libName = QString::fromStdString(library(theModule.toStdString()));
// myModule, SLOT(onBeforeObjectErase(ObjectPtr, AISObjectPtr)));
myModule->createFeatures();
+#ifdef HAVE_SALOME
+ salomeConnector()->createFeatureActions();
+#endif
//myActionsMgr->update();
return true;
}
aObjDock->setStyleSheet(
"::title { position: relative; padding-left: 5px; text-align: left center }");
myObjectBrowser = new XGUI_ObjectsBrowser(aObjDock);
+ myObjectBrowser->setXMLReader(myDataModelXMLReader);
myModule->customizeObjectBrowser(myObjectBrowser);
aObjDock->setWidget(myObjectBrowser);
QAction* aCancelAct = myActionsMgr->operationStateAction(XGUI_ActionsMgr::Abort);
connect(aCancelAct, SIGNAL(triggered()), myOperationMgr, SLOT(onAbortOperation()));
+
+ QAction* aPreviewAct = myActionsMgr->operationStateAction(XGUI_ActionsMgr::Preview);
+ connect(aPreviewAct, SIGNAL(triggered()), this, SLOT(onPreviewActionClicked()));
+
connect(myPropertyPanel, SIGNAL(keyReleased(QObject*, QKeyEvent*)),
myOperationMgr, SLOT(onKeyReleased(QObject*, QKeyEvent*)));
-
connect(myPropertyPanel, SIGNAL(enterClicked(QObject*)),
myOperationMgr, SLOT(onProcessEnter(QObject*)));
}
setViewerSelectionMode(TopAbs_FACE);
} else if (theId == "SELECT_RESULT_CMD") {
setViewerSelectionMode(-1);
+ } else if (theId == "SHOW_RESULTS_CMD") {
+ highlightResults(aObjects);
}
}
bool hasResult = false;
bool hasFeature = false;
bool hasParameter = false;
- bool hasSubFeature = false;
- ModuleBase_Tools::checkObjects(anObjects, hasResult, hasFeature, hasParameter, hasSubFeature);
+ bool hasCompositeOwner = false;
+ ModuleBase_Tools::checkObjects(anObjects, hasResult, hasFeature, hasParameter, hasCompositeOwner);
if (!(hasFeature || hasParameter))
return;
// 3. delete objects
std::set<FeaturePtr> anIgnoredFeatures;
std::set<FeaturePtr> aDirectRefFeatures, aIndirectRefFeatures;
- findReferences(anObjects, aDirectRefFeatures, aIndirectRefFeatures);
+ ModuleBase_Tools::findReferences(anObjects, aDirectRefFeatures, aIndirectRefFeatures);
bool doDeleteReferences = true;
- if (isDeleteFeatureWithReferences(anObjects, aDirectRefFeatures, aIndirectRefFeatures,
- desktop(), doDeleteReferences)) {
+ if (ModuleBase_Tools::isDeleteFeatureWithReferences(anObjects, aDirectRefFeatures,
+ aIndirectRefFeatures, desktop(), doDeleteReferences)) {
// start operation
QString aDescription = contextMenuMgr()->action("DELETE_CMD")->text();
aDescription += " " + aDescription.arg(XGUI_Tools::unionOfObjectNames(anObjects, ", "));
if (aFeature.get()) {
std::set<FeaturePtr> alreadyProcessed;
aDirectRefFeatures.clear();
- XGUI_Tools::refsDirectToFeatureInAllDocuments(aFeature, aFeature, aFeatures,
+ ModuleBase_Tools::refsDirectToFeatureInAllDocuments(aFeature, aFeature, aFeatures,
aDirectRefFeatures, alreadyProcessed);
if (aDirectRefFeatures.empty() && !anUnusedObjects.contains(aFeature))
anUnusedObjects.append(aFeature);
mySelector->clearSelection();
std::set<FeaturePtr> anIgnoredFeatures;
- if (removeFeatures(anUnusedObjects, anIgnoredFeatures, anActionId)) {
+ if (removeFeatures(anUnusedObjects, anIgnoredFeatures, anActionId, true)) {
operationMgr()->commitOperation();
}
else {
}
//**************************************************************
-void XGUI_Workshop::findReferences(const QObjectPtrList& theList,
- std::set<FeaturePtr>& aDirectRefFeatures,
- std::set<FeaturePtr>& aIndirectRefFeatures)
-{
- foreach (ObjectPtr aDeletedObj, theList) {
- std::set<FeaturePtr> alreadyProcessed;
- XGUI_Tools::refsToFeatureInAllDocuments(aDeletedObj, aDeletedObj, theList, aDirectRefFeatures,
- aIndirectRefFeatures, alreadyProcessed);
- std::set<FeaturePtr> aDifference;
- std::set_difference(aIndirectRefFeatures.begin(), aIndirectRefFeatures.end(),
- aDirectRefFeatures.begin(), aDirectRefFeatures.end(),
- std::inserter(aDifference, aDifference.begin()));
- aIndirectRefFeatures = aDifference;
- }
-}
-
-bool XGUI_Workshop::isDeleteFeatureWithReferences(const QObjectPtrList& theList,
- const std::set<FeaturePtr>& aDirectRefFeatures,
- const std::set<FeaturePtr>& aIndirectRefFeatures,
- QWidget* theParent,
- bool& doDeleteReferences)
-{
- doDeleteReferences = true;
-
- QString aDirectNames, aIndirectNames;
- if (!aDirectRefFeatures.empty()) {
- QStringList aDirectRefNames;
- foreach (const FeaturePtr& aFeature, aDirectRefFeatures)
- aDirectRefNames.append(aFeature->name().c_str());
- aDirectNames = aDirectRefNames.join(", ");
-
- QStringList aIndirectRefNames;
- foreach (const FeaturePtr& aFeature, aIndirectRefFeatures)
- aIndirectRefNames.append(aFeature->name().c_str());
- aIndirectNames = aIndirectRefNames.join(", ");
- }
-
- bool aCanReplaceParameters = !aDirectRefFeatures.empty();
- QStringList aPartFeatureNames;
- foreach (ObjectPtr aObj, theList) {
- FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
- // invalid feature data means that the feature is already removed in model,
- // we needn't process it. E.g. delete of feature from create operation. The operation abort
- // will delete the operation
- if (!aFeature->data()->isValid())
- continue;
- ResultPtr aFirstResult = aFeature->firstResult();
- if (!aFirstResult.get())
- continue;
- std::string aResultGroupName = aFirstResult->groupName();
- if (aResultGroupName == ModelAPI_ResultPart::group())
- aPartFeatureNames.append(aFeature->name().c_str());
-
- if (aCanReplaceParameters && aResultGroupName != ModelAPI_ResultParameter::group())
- aCanReplaceParameters = false;
- }
- QString aPartNames = aPartFeatureNames.join(", ");
-
- QMessageBox aMessageBox(theParent);
- aMessageBox.setWindowTitle(tr("Delete features"));
- aMessageBox.setIcon(QMessageBox::Warning);
- aMessageBox.setStandardButtons(QMessageBox::No | QMessageBox::Yes);
- aMessageBox.setDefaultButton(QMessageBox::No);
-
- QString aText;
- if (!aDirectNames.isEmpty() || !aIndirectNames.isEmpty()) {
- if (aCanReplaceParameters) {
- aText = QString(tr("Selected parameters are used in the following features: %1.\nThese features will be deleted.\nOr parameters could be replaced by their values.\n")
- .arg(aDirectNames));
- if (!aIndirectNames.isEmpty())
- aText += QString(tr("(Also these features will be deleted: %1)\n")).arg(aIndirectNames);
- QPushButton *aReplaceButton = aMessageBox.addButton(tr("Replace"), QMessageBox::ActionRole);
- } else {
- aText = QString(tr("Selected features are used in the following features: %1.\nThese features will be deleted.\n")).arg(aDirectNames);
- if (!aIndirectNames.isEmpty())
- aText += QString(tr("(Also these features will be deleted: %1)\n")).arg(aIndirectNames);
- }
- }
- if (!aPartNames.isEmpty())
- aText += QString(tr("The following parts will be deleted: %1.\n")).arg(aPartNames);
-
- if (!aText.isEmpty()) {
- aText += "Would you like to continue?";
- aMessageBox.setText(aText);
- aMessageBox.exec();
- QMessageBox::ButtonRole aButtonRole = aMessageBox.buttonRole(aMessageBox.clickedButton());
-
- if (aButtonRole == QMessageBox::NoRole)
- return false;
-
- if (aButtonRole == QMessageBox::ActionRole) {
- foreach (ObjectPtr aObj, theList)
- ModelAPI_ReplaceParameterMessage::send(aObj, this);
- doDeleteReferences = false;
- }
- }
- return true;
-}
-
bool XGUI_Workshop::deleteFeatures(const QObjectPtrList& theFeatures,
const std::set<FeaturePtr>& theIgnoredFeatures)
{
std::set<FeaturePtr> aDirectRefFeatures, aIndirectRefFeatures;
- findReferences(theFeatures, aDirectRefFeatures, aIndirectRefFeatures);
+ ModuleBase_Tools::findReferences(theFeatures, aDirectRefFeatures, aIndirectRefFeatures);
return deleteFeaturesInternal(theFeatures, aDirectRefFeatures, aIndirectRefFeatures,
theIgnoredFeatures);
}
const std::set<FeaturePtr>& theIgnoredFeatures,
const bool doDeleteReferences)
{
+ bool isDone = false;
if (doDeleteReferences) {
std::set<FeaturePtr> aFeaturesToDelete = aDirectRefFeatures;
aFeaturesToDelete.insert(aIndirectRefFeatures.begin(), aIndirectRefFeatures.end());
FeaturePtr aFeature = (*anIt);
DocumentPtr aDoc = aFeature->document();
if (theIgnoredFeatures.find(aFeature) == theIgnoredFeatures.end()) {
+ // flush REDISPLAY signal after remove feature
aDoc->removeFeature(aFeature);
+ isDone = true;
#ifdef DEBUG_DELETE
anInfo.append(ModuleBase_Tools::objectInfo(aFeature).toStdString().c_str());
#endif
}
QString anActionId = "DELETE_CMD";
- return removeFeatures(theList, theIgnoredFeatures, anActionId);
+ isDone = removeFeatures(theList, theIgnoredFeatures, anActionId, false) || isDone;
+
+ if (isDone) {
+ // the redisplay signal should be flushed in order to erase the feature presentation in the viewer
+ // if should be done after removeFeature() of document
+ Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY));
+ }
+ return isDone;
}
//**************************************************************
bool XGUI_Workshop::removeFeatures(const QObjectPtrList& theList,
const std::set<FeaturePtr>& theIgnoredFeatures,
- const QString& theActionId)
+ const QString& theActionId,
+ const bool theFlushRedisplay)
{
bool isDone = false;
anInfo.append(anInfoStr);
qDebug(QString("remove feature :%1").arg(anInfoStr).toStdString().c_str());
#endif
+ // flush REDISPLAY signal after remove feature
aDoc->removeFeature(aFeature);
isDone = true;
}
}
}
+ if (isDone && theFlushRedisplay) {
+ // the redisplay signal should be flushed in order to erase the feature presentation in the viewer
+ // if should be done after removeFeature() of document
+ Events_Loop::loop()->flush(Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY));
+ }
+
#ifdef DEBUG_DELETE
qDebug(QString("remove features:%1").arg(anInfo.join("; ")).toStdString().c_str());
#endif
std::set<FeaturePtr> aPlacedFeatures(aFeaturesBetween.begin(), aFeaturesBetween.end());
// 2. Get all reference features to the selected object in the document
std::set<FeaturePtr> aRefFeatures;
- XGUI_Tools::refsToFeatureInFeatureDocument(aObject, aRefFeatures);
+ ModuleBase_Tools::refsToFeatureInFeatureDocument(aObject, aRefFeatures);
if (aRefFeatures.empty())
continue;
if (theUpdateViewer)
myDisplayer->updateViewer();
}
+
+void XGUI_Workshop::highlightResults(const QObjectPtrList& theObjects)
+{
+ FeaturePtr aFeature;
+ QObjectPtrList aSelList = theObjects;
+ std::list<ResultPtr> aResList;
+ foreach(ObjectPtr aObj, theObjects) {
+ aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aObj);
+ if (aFeature.get()) {
+ aResList = aFeature->results();
+ std::list<std::shared_ptr<ModelAPI_Result> >::const_iterator aIt;
+ for(aIt = aResList.cbegin(); aIt != aResList.cend(); aIt++) {
+ aSelList.append(*aIt);
+ }
+ }
+ }
+ if (aSelList.count() > theObjects.count()) {
+ // if something was found
+ bool aBlocked = objectBrowser()->blockSignals(true);
+ objectBrowser()->setObjectsSelected(aSelList);
+ objectBrowser()->blockSignals(aBlocked);
+ }
+}