void StreamSubscriptionResponderBase::onErrorImpl(
    folly::exception_wrapper ex) noexcept {
  debugCheckOnNextOnCompleteOnError();
  switch (state_) {
    case State::RESPONDING: {
      state_ = State::CLOSED;
      applicationError(ex.what().toStdString());
    } break;
    case State::CLOSED:
      break;
  }
}
MainWindowBase::MainWindowBase(Application& application)
    : m_application(application),
      m_camera(application.getCamera())
{
    setupUi(this);
    actionReload_scene->setVisible(false);
    //connect(&application.getOutputSettingsModel(), SIGNAL(resolutionUpdated()), this, SLOT(onOutputSettingsResolutionUpdated()));
    //connect(&application.getPPMSettingsModel(), SIGNAL(updated()), this, SLOT(onPPMSettingsModelUpdated()));

    connect(&application, SIGNAL(applicationError(QString)), this, SLOT(onApplicationError(QString)));

    // Render Information Dock
    RenderInformationDock* renderInformationDock = new RenderInformationDock(this, application.getRenderStatisticsModel(), application);
    this->addDockWidget(Qt::RightDockWidgetArea, renderInformationDock);
    connect(renderInformationDock, SIGNAL(renderStatusToggle()), this, SLOT(onRenderStatusToggle()));
    connect(renderInformationDock, SIGNAL(renderRestart()), this, SLOT(onRenderRestart()));

    // Output Dock

    OutputDock* outputDock = new OutputDock(this, application.getOutputSettingsModel());
    this->addDockWidget(Qt::RightDockWidgetArea, outputDock);

    // PPM Information dock

    PPMDock* ppmDock = new PPMDock(this, m_application, m_application.getPPMSettingsModel());
    this->addDockWidget(Qt::RightDockWidgetArea, ppmDock);

    // Camera Dock

    CameraDock* cameraDock = new CameraDock(this, application.getCamera(), application.getPPMSettingsModel(), application.getOutputSettingsModel());
    this->addDockWidget(Qt::RightDockWidgetArea, cameraDock);
    connect(&application, SIGNAL(cameraUpdated()), cameraDock, SLOT(onCameraUpdated()));
    connect(cameraDock, SIGNAL(cameraUpdated()), &application, SLOT(onCameraUpdated()));

    // Scene Dock

    SceneDock* sceneDock = new SceneDock(this, application.getSceneManager());
    this->addDockWidget(Qt::RightDockWidgetArea, sceneDock);

    // Status Bar Running Status and Time

    m_statusbar_runningStatusLabel = new QLabel(this);
    this->statusBar()->addPermanentWidget(m_statusbar_runningStatusLabel, 1);
    m_statusbar_runningStatusLabel->setGeometry(100, 0, 100, 12);
    QTimer* runningStatusLabelTimer = new QTimer(this);
    runningStatusLabelTimer->setInterval(100);
    connect(runningStatusLabelTimer, SIGNAL(timeout()), this, SLOT(onUpdateRunningStatusLabelTimer()));
    runningStatusLabelTimer->start();

    // Status Bar Render Method

    m_statusbar_renderMethodLabel = new QLabel(this);
    this->statusBar()->addPermanentWidget(m_statusbar_renderMethodLabel, 1);
    m_statusbar_renderMethodLabel->setGeometry(100, 0, 100, 12);

    // Render Widget
    m_renderWidget = new RenderWidget(centralwidget, application.getCamera(), application.getOutputSettingsModel());
    gridLayout->addWidget(m_renderWidget, 0, 0, 1, 1);
    connect(m_renderWidget, SIGNAL(cameraUpdated()), &application, SLOT(onCameraUpdated()));
    connect(&application, SIGNAL(newFrameReadyForDisplay(const float*, unsigned long long)), 
            m_renderWidget, SLOT(onNewFrameReadyForDisplay(const float*, unsigned long long)),
            Qt::QueuedConnection);

    connect(&application, SIGNAL(runningStatusChanged()), this, SLOT(onRunningStatusChanged()));
    connect(&application, SIGNAL(renderMethodChanged()), this, SLOT(onRenderMethodChanged()));
    connect(this, SIGNAL(renderRestart()), &m_application, SLOT(onRenderRestart()));
    connect(this, SIGNAL(renderStatusToggle()), &m_application, SLOT(onRenderStatusToggle()));

    onRunningStatusChanged();
    onRenderMethodChanged();
}