#include "XGUI_Displayer.h"
#include "XGUI_OperationMgr.h"
#include "XGUI_SalomeConnector.h"
-#include "XGUI_SalomeViewer.h"
#include "XGUI_ActionsMgr.h"
#include "XGUI_ErrorDialog.h"
#include "XGUI_ViewerProxy.h"
#include <ModuleBase_Operation.h>
#include <ModuleBase_OperationDescription.h>
#include <ModuleBase_SelectionValidator.h>
-#include "ModuleBase_WidgetFactory.h"
+#include <ModuleBase_WidgetFactory.h>
+#include <ModuleBase_Tools.h>
+#include <ModuleBase_IViewer.h>
#include <Config_Common.h>
#include <Config_FeatureMessage.h>
myModuleConnector = new XGUI_ModuleConnector(this);
- connect(myOperationMgr, SIGNAL(operationStarted()), SLOT(onOperationStarted()));
+ connect(myOperationMgr, SIGNAL(operationStarted(ModuleBase_Operation*)),
+ SLOT(onOperationStarted()));
connect(myOperationMgr, SIGNAL(operationResumed()), SLOT(onOperationStarted()));
connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)),
SLOT(onOperationStopped(ModuleBase_Operation*)));
//******************************************************
XGUI_Workshop::~XGUI_Workshop(void)
{
+ delete myDisplayer;
}
//******************************************************
aLoop->registerListener(this, Events_Loop::eventByName("LongOperation"));
aLoop->registerListener(this, Events_Loop::eventByName(EVENT_PLUGIN_LOADED));
aLoop->registerListener(this, Events_Loop::eventByName("CurrentDocumentChanged"));
+ aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TOSHOW));
+ aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TOHIDE));
registerValidators();
activateModule();
false);
connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onRedo()));
salomeConnector()->addEditMenuSeparator();
+ aAction = salomeConnector()->addEditCommand("REBUILD_CMD", tr("Rebuild"), tr("Rebuild data objects"),
+ QIcon(":pictures/rebuild.png"), QKeySequence(),
+ false);
+ connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onRebuild()));
+ salomeConnector()->addEditMenuSeparator();
return;
}
// File commands group
aCommand->connectTo(this, SLOT(onRedo()));
aCommand = aGroup->addFeature("REBUILD_CMD", tr("Rebuild"), tr("Rebuild data objects"),
- QIcon(":pictures/rebuild.png"));
+ QIcon(":pictures/rebuild.png"), QKeySequence());
+ aCommand->connectTo(this, SLOT(onRebuild()));
aCommand = aGroup->addFeature("SAVEAS_CMD", tr("Save as..."), tr("Save the document into a file"),
- QIcon(":pictures/save.png"));
+ QIcon(":pictures/save.png"), QKeySequence());
aCommand->connectTo(this, SLOT(onSaveAs()));
//aCommand->disable();
QApplication::restoreOverrideCursor();
}
+ else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TOSHOW)) {
+ boost::shared_ptr<ModelAPI_ObjectUpdatedMessage> anUpdateMsg =
+ boost::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+ const std::set<ObjectPtr>& aObjList = anUpdateMsg->objects();
+ QList<ObjectPtr> aList;
+ std::set<ObjectPtr>::const_iterator aIt;
+ for (aIt = aObjList.cbegin(); aIt != aObjList.cend(); ++aIt)
+ aList.append(*aIt);
+ showObjects(aList, true);
+ }
+
+ else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TOHIDE)) {
+ boost::shared_ptr<ModelAPI_ObjectUpdatedMessage> anUpdateMsg =
+ boost::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+ const std::set<ObjectPtr>& aObjList = anUpdateMsg->objects();
+ QList<ObjectPtr> aList;
+ std::set<ObjectPtr>::const_iterator aIt;
+ for (aIt = aObjList.cbegin(); aIt != aObjList.cend(); ++aIt)
+ aList.append(*aIt);
+ showObjects(aList, false);
+ }
+
//An operation passed by message. Start it, process and commit.
else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OPERATION_LAUNCHED)) {
boost::shared_ptr<Config_PointerMessage> aPartSetMsg =
}
}
else if (theMessage->eventID() == Events_Loop::loop()->eventByName("CurrentDocumentChanged")) {
+ myActionsMgr->update();
// Find and Activate active part
if (myPartActivating)
return;
{
std::set<ObjectPtr> aObjects = theMsg->objects();
std::set<ObjectPtr>::const_iterator aIt;
+ QIntList aModes;
for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) {
ObjectPtr aObj = (*aIt);
- if (!aObj->data() || !aObj->data()->isValid())
+ bool aHide = !aObj->data() || !aObj->data()->isValid();
+ if (!aHide) { // check that this is not hidden result
+ ResultPtr aRes = boost::dynamic_pointer_cast<ModelAPI_Result>(aObj);
+ aHide = aRes && aRes->isConcealed();
+ }
+ if (aHide)
myDisplayer->erase(aObj, false);
else {
- if (myDisplayer->isVisible(aObj)) // TODO VSV: Correction sketch drawing
+ if (myDisplayer->isVisible(aObj)) {
myDisplayer->display(aObj, false); // In order to update presentation
- else {
if (myOperationMgr->hasOperation()) {
ModuleBase_Operation* aOperation = myOperationMgr->currentOperation();
- if (aOperation->hasObject(aObj)) { // Display only current operation results
+ if (!aOperation->hasObject(aObj))
+ if (!myDisplayer->isActive(aObj))
+ myDisplayer->activate(aObj, aModes);
+ }
+ } else {
+ if (myOperationMgr->hasOperation()) {
+ ModuleBase_Operation* aOperation = myOperationMgr->currentOperation();
+ // Display only current operation results if operation has preview
+ if (aOperation->hasObject(aObj) && aOperation->hasPreview()) {
myDisplayer->display(aObj, false);
+ // Deactivate object of current operation from selection
+ if (myDisplayer->isActive(aObj))
+ myDisplayer->deactivate(aObj);
}
}
}
myObjectBrowser->processEvent(theMsg);
if (isDisplayed)
myDisplayer->updateViewer();
- if (aHasPart) {
- activateLastPart();
- }
+ //if (aHasPart) { // TODO: Avoid activate last part on loading of document
+ // activateLastPart();
+ //}
}
//******************************************************
myPropertyPanel->cleanContent();
aFactory.createWidget(myPropertyPanel->contentWidget());
+ ModuleBase_Tools::zeroMargins(myPropertyPanel->contentWidget());
QList<ModuleBase_ModelWidget*> aWidgets = aFactory.getModelWidgets();
- QList<ModuleBase_ModelWidget*>::const_iterator anIt = aWidgets.begin(), aLast = aWidgets.end();
- ModuleBase_ModelWidget* aWidget;
- for (; anIt != aLast; anIt++) {
- aWidget = *anIt;
+ foreach (ModuleBase_ModelWidget* aWidget, aWidgets) {
aWidget->setFeature(aOperation->feature());
+ aWidget->enableFocusProcessing();
QObject::connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onWidgetValuesChanged()));
// Init default values
if (!aOperation->isEditOperation() && !aWidget->isComputedDefault()) {
}
}
+ aOperation->setPropertyPanel(myPropertyPanel);
myPropertyPanel->setModelWidgets(aWidgets);
- myPropertyPanel->onActivateNextWidget(NULL);
- myPropertyPanel->setWindowTitle(aOperation->getDescription()->description());
+ if (!aOperation->activateByPreselection())
+ myPropertyPanel->activateNextWidget(NULL);
+ // Widget activation (from the previous method) may commit the current operation
+ // if pre-selection is enougth for it. So we shouldn't update prop panel's title
+ if(myOperationMgr->isCurrentOperation(aOperation)) {
+ myPropertyPanel->setWindowTitle(aOperation->getDescription()->description());
+ }
}
updateCommandStatus();
}
{
PostponeMessageQtEvent* aPostponedEv = dynamic_cast<PostponeMessageQtEvent*>(theEvent);
if (aPostponedEv) {
-#ifdef _DEBUG
- std::cout << "XGUI_Workshop::event " << "Got PostponeMessageQtEvent" << std::endl;
- bool isMyThread = (QApplication::instance()->thread() == QThread::currentThread());
- std::cout << "XGUI_Workshop::event " << "I am in the Qt's thread: "
- << isMyThread << std::endl;
-#endif
boost::shared_ptr<Events_Message> aEventPtr = aPostponedEv->postponedMessage();
processEvent(aEventPtr);
return true;
QString::fromStdString(theMessage->text()),
QString::fromStdString(theMessage->tooltip()),
QIcon(theMessage->icon().c_str()),
- QKeySequence(), isUsePropPanel);
+ QKeySequence(),
+ isUsePropPanel);
salomeConnector()->setNestedActions(aFeatureId, aNestedFeatures.split(" ", QString::SkipEmptyParts));
+ salomeConnector()->setDocumentKind(aFeatureId, QString::fromStdString(theMessage->documentKind()));
+
myActionsMgr->addCommand(aAction);
myModule->featureCreated(aAction);
} else {
if (!aGroup) {
aGroup = aPage->addGroup(aGroupName);
}
+ QString aDocKind = QString::fromStdString(theMessage->documentKind());
// Check if hotkey sequence is already defined:
QKeySequence aHotKey = myActionsMgr->registerShortcut(
QString::fromStdString(theMessage->keysequence()));
XGUI_Command* aCommand = aGroup->addFeature(aFeatureId,
QString::fromStdString(theMessage->text()),
QString::fromStdString(theMessage->tooltip()),
- QIcon(theMessage->icon().c_str()), aHotKey,
+ QIcon(theMessage->icon().c_str()),
+ aDocKind,
+ aHotKey,
isUsePropPanel);
aCommand->setNestedCommands(aNestedFeatures.split(" ", QString::SkipEmptyParts));
myActionsMgr->addCommand(aCommand);
updateCommandStatus();
}
+//******************************************************
+void XGUI_Workshop::onRebuild()
+{
+ SessionPtr aMgr = ModelAPI_Session::get();
+ bool aWasOperation = aMgr->isOperation(); // keep this value
+ if (!aWasOperation) {
+ aMgr->startOperation();
+ }
+ static const Events_ID aRebuildEvent = Events_Loop::loop()->eventByName("Rebuild");
+ Events_Loop::loop()->send(boost::shared_ptr<Events_Message>(
+ new Events_Message(aRebuildEvent, this)));
+ if (!aWasOperation) {
+ aMgr->finishOperation();
+ }
+}
+
//******************************************************
void XGUI_Workshop::onPreferences()
{
}
#endif
- ModuleBase_IModule* aModule = crtInst ? crtInst(this) : 0;
+ ModuleBase_IModule* aModule = crtInst ? crtInst(myModuleConnector) : 0;
if (!err.isEmpty()) {
if (mainWindow()) {
- QMessageBox::warning(mainWindow(), tr("Error"), err);
+ Events_Error::send(err.toStdString());
} else {
qWarning(qPrintable(err));
}
hidePropertyPanel(); //<! Invisible by default
hideObjectBrowser();
aDesktop->tabifyDockWidget(aObjDock, myPropertyPanel);
+ myPropertyPanel->installEventFilter(myOperationMgr);
QPushButton* aOkBtn = myPropertyPanel->findChild<QPushButton*>(XGUI::PROP_PANEL_OK);
connect(aOkBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onCommitOperation()));
connect(aCancelBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onAbortOperation()));
connect(myPropertyPanel, SIGNAL(keyReleased(QKeyEvent*)), myOperationMgr,
SLOT(onKeyReleased(QKeyEvent*)));
- connect(myPropertyPanel, SIGNAL(widgetActivated(ModuleBase_ModelWidget*)), myOperationMgr,
- SLOT(onWidgetActivated(ModuleBase_ModelWidget*)));
- connect(myOperationMgr, SIGNAL(activateNextWidget(ModuleBase_ModelWidget*)), myPropertyPanel,
- SLOT(onActivateNextWidget(ModuleBase_ModelWidget*)));
connect(myOperationMgr, SIGNAL(operationValidated(bool)), myPropertyPanel,
SLOT(setAcceptEnabled(bool)));
}
//**************************************************************
-XGUI_SalomeViewer* XGUI_Workshop::salomeViewer() const
+ModuleBase_IViewer* XGUI_Workshop::salomeViewer() const
{
return mySalomeConnector->viewer();
}
showObjects(aObjects, false);
else if (theId == "SHOW_ONLY_CMD")
showOnlyObjects(aObjects);
+ else if (theId == "SHADING_CMD")
+ setDisplayMode(aObjects, XGUI_Displayer::Shading);
+ else if (theId == "WIREFRAME_CMD")
+ setDisplayMode(aObjects, XGUI_Displayer::Wireframe);
+ else if (theId == "HIDEALL_CMD")
+ myDisplayer->eraseAll();
}
//**************************************************************
for (int i = 0; i < theDoc->size(theGroup); i++)
myDisplayer->display(theDoc->object(theGroup, i), false);
}
+
+//**************************************************************
+void XGUI_Workshop::setDisplayMode(const QList<ObjectPtr>& theList, int theMode)
+{
+ foreach(ObjectPtr aObj, theList) {
+ myDisplayer->setDisplayMode(aObj, (XGUI_Displayer::DisplayMode)theMode, false);
+ }
+ if (theList.size() > 0)
+ myDisplayer->updateViewer();
+}
+
+//**************************************************************
+void XGUI_Workshop::closeDocument()
+{
+ myDisplayer->closeLocalContexts();
+ myDisplayer->eraseAll();
+ objectBrowser()->clearContent();
+
+ SessionPtr aMgr = ModelAPI_Session::get();
+ aMgr->moduleDocument()->close();
+ objectBrowser()->clearContent();
+}