void TwoDModelEngineFacade::init(const kitBase::EventsForKitPluginInterface &eventsForKitPlugin , const qReal::SystemEvents &systemEvents , qReal::LogicalModelAssistInterface &logicalModel , qReal::ControllerInterface &controller , qReal::gui::MainWindowInterpretersInterface &interpretersInterface , qReal::gui::MainWindowDockInterface &dockInterface , const qReal::ProjectManagementInterface &projectManager , kitBase::InterpreterControlInterface &interpreterControl) { mModel->init(*interpretersInterface.errorReporter(), interpreterControl); dockInterface.registerEditor(*mView); mView->setController(controller); const auto onActiveTabChanged = [this](const qReal::TabInfo &info) { mView->setEnabled(info.type() != qReal::TabInfo::TabType::other); }; const auto reloadWorld = [this, &logicalModel, &interpretersInterface, &projectManager]() { QLOG_DEBUG() << "Reloading 2D world model..."; const QString xml = projectManager.somethingOpened() ? logicalModel.logicalRepoApi().metaInformation("worldModel").toString() : QString(); QDomDocument worldModel; QString errorMessage; int errorLine, errorColumn; if (!xml.isEmpty() && !worldModel.setContent(xml, &errorMessage, &errorLine, &errorColumn)) { interpretersInterface.errorReporter()->addError(QString("%1:%2: %3") .arg(QString::number(errorLine), QString::number(errorColumn), errorMessage)); } mView->loadXml(worldModel); loadReadOnlyFlags(logicalModel); QLOG_DEBUG() << "Reloading 2D world done"; }; const auto connectTwoDModel = [this, &eventsForKitPlugin, &interpreterControl]() { connect(&eventsForKitPlugin, &kitBase::EventsForKitPluginInterface::interpretationStarted , this, &twoDModel::TwoDModelControlInterface::onStartInterpretation , Qt::UniqueConnection); connect(&eventsForKitPlugin, &kitBase::EventsForKitPluginInterface::interpretationStopped , this, &twoDModel::TwoDModelControlInterface::onStopInterpretation , Qt::UniqueConnection); connect(this, &twoDModel::TwoDModelControlInterface::runButtonPressed , &interpreterControl, &kitBase::InterpreterControlInterface::interpret , Qt::UniqueConnection); connect(this, &twoDModel::TwoDModelControlInterface::stopButtonPressed , &interpreterControl, &kitBase::InterpreterControlInterface::userStopRobot , Qt::UniqueConnection); }; auto disconnectTwoDModel = [this, &eventsForKitPlugin, &interpreterControl]() { disconnect(&eventsForKitPlugin, &kitBase::EventsForKitPluginInterface::interpretationStarted , this, &twoDModel::TwoDModelControlInterface::onStartInterpretation); disconnect(&eventsForKitPlugin, &kitBase::EventsForKitPluginInterface::interpretationStopped , this, &twoDModel::TwoDModelControlInterface::onStopInterpretation); disconnect(this, &twoDModel::TwoDModelControlInterface::runButtonPressed , &interpreterControl, &kitBase::InterpreterControlInterface::interpret); disconnect(this, &twoDModel::TwoDModelControlInterface::stopButtonPressed , &interpreterControl, &kitBase::InterpreterControlInterface::userStopRobot); }; connect(&projectManager, &qReal::ProjectManagementInterface::afterOpen, this, reloadWorld); connect(&projectManager, &qReal::ProjectManagementInterface::closed, this, reloadWorld); connect(&systemEvents, &qReal::SystemEvents::activeTabChanged, this, onActiveTabChanged); connect(mModel.data(), &model::Model::modelChanged, [this, &logicalModel] (const QDomDocument &xml) { logicalModel.mutableLogicalRepoApi().setMetaInformation("worldModel", xml.toString(4)); }); // Queued connection cause such actions like stopRobot() must be performed earlier. connect(&systemEvents, &qReal::SystemEvents::closedMainWindow, this, [=](){ mView.reset(); delete mDock; } , Qt::QueuedConnection); connect(&eventsForKitPlugin , &kitBase::EventsForKitPluginInterface::robotModelChanged , [this, connectTwoDModel, disconnectTwoDModel](const QString &modelName) { const bool isCurrentModel = modelName == mRobotModelName; if (isCurrentModel) { connectTwoDModel(); mDock->attachToMainWindow(Qt::TopDockWidgetArea); } else { disconnectTwoDModel(); mDock->detachFromMainWindow(); } } ); }
void TwoDModelEngineFacade::init(const kitBase::EventsForKitPluginInterface &eventsForKitPlugin , const qReal::SystemEvents &systemEvents , qReal::LogicalModelAssistInterface &logicalModel , qReal::gui::MainWindowInterpretersInterface &interpretersInterface , kitBase::InterpreterControlInterface &interpreterControl) { mModel->init(*interpretersInterface.errorReporter(), interpreterControl); const auto onActiveTabChanged = [this, &logicalModel, &interpretersInterface](const qReal::TabInfo &info) { mView->setEnabled(info.type() == qReal::TabInfo::TabType::editor); const QString xml = logicalModel.logicalRepoApi().metaInformation("worldModel").toString(); QDomDocument worldModel; QString errorMessage; int errorLine, errorColumn; if (!xml.isEmpty() && !worldModel.setContent(xml, &errorMessage, &errorLine, &errorColumn)) { interpretersInterface.errorReporter()->addError(QString("%1:%2: %3") .arg(QString::number(errorLine), QString::number(errorColumn), errorMessage)); } mView->loadXml(worldModel); loadReadOnlyFlags(logicalModel); }; auto connectTwoDModel = [this, &eventsForKitPlugin, &interpreterControl]() { connect(&eventsForKitPlugin, &kitBase::EventsForKitPluginInterface::interpretationStarted , this, &twoDModel::TwoDModelControlInterface::onStartInterpretation , Qt::UniqueConnection); connect(&eventsForKitPlugin, &kitBase::EventsForKitPluginInterface::interpretationStopped , this, &twoDModel::TwoDModelControlInterface::onStopInterpretation , Qt::UniqueConnection); connect(this, &twoDModel::TwoDModelControlInterface::runButtonPressed , &interpreterControl, &kitBase::InterpreterControlInterface::interpret , Qt::UniqueConnection); connect(this, &twoDModel::TwoDModelControlInterface::stopButtonPressed , &interpreterControl, &kitBase::InterpreterControlInterface::stopRobot , Qt::UniqueConnection); }; auto disconnectTwoDModel = [this, &eventsForKitPlugin, &interpreterControl]() { disconnect(&eventsForKitPlugin, &kitBase::EventsForKitPluginInterface::interpretationStarted , this, &twoDModel::TwoDModelControlInterface::onStartInterpretation); disconnect(&eventsForKitPlugin, &kitBase::EventsForKitPluginInterface::interpretationStopped , this, &twoDModel::TwoDModelControlInterface::onStopInterpretation); disconnect(this, &twoDModel::TwoDModelControlInterface::runButtonPressed , &interpreterControl, &kitBase::InterpreterControlInterface::interpret); disconnect(this, &twoDModel::TwoDModelControlInterface::stopButtonPressed , &interpreterControl, &kitBase::InterpreterControlInterface::stopRobot); }; connect(&systemEvents, &qReal::SystemEvents::activeTabChanged, onActiveTabChanged); connect(mModel.data(), &model::Model::modelChanged, [this, &logicalModel] (const QDomDocument &xml) { logicalModel.mutableLogicalRepoApi().setMetaInformation("worldModel", xml.toString(4)); }); connect(&systemEvents, &qReal::SystemEvents::closedMainWindow, [=](){ mView.reset(); delete mDock; }); connect(&eventsForKitPlugin , &kitBase::EventsForKitPluginInterface::robotModelChanged , [this, connectTwoDModel, disconnectTwoDModel](const QString &modelName) { const bool isCurrentModel = modelName == mRobotModelName; if (isCurrentModel) { connectTwoDModel(); mDock->attachToMainWindow(Qt::TopDockWidgetArea); } else { disconnectTwoDModel(); mDock->detachFromMainWindow(); } } ); }