diff --git a/applications/gui/src/media_panel.cpp b/applications/gui/src/media_panel.cpp index abfff4a034c93e7be25d919982ed67f98f2d7df8..c04552fcd2207971e12e9b8e49a04491629ea63f 100644 --- a/applications/gui/src/media_panel.cpp +++ b/applications/gui/src/media_panel.cpp @@ -1,6 +1,5 @@ #include "media_panel.hpp" #include "screen.hpp" -#include "camera.hpp" #include <nanogui/layout.h> #include <nanogui/button.h> @@ -34,6 +33,9 @@ MediaPanel::MediaPanel(ftl::gui::Screen *screen) : nanogui::Window(screen, ""), if (cam) cam->showPoseWindow(); }); + virtualCameraRecording_ = std::optional<ftl::gui::Camera*>(); + sceneRecording_ = std::optional<ftl::Configurable*>(); + auto recordbutton = new PopupButton(this, "", ENTYPO_ICON_CONTROLLER_RECORD); recordbutton->setTooltip("Record"); recordbutton->setSide(Popup::Side::Right); @@ -49,20 +51,11 @@ MediaPanel::MediaPanel(ftl::gui::Screen *screen) : nanogui::Window(screen, ""), }); itembutton = new Button(recordpopup, "Virtual camera recording (.ftl)"); itembutton->setCallback([this,recordbutton]() { - std::cout << "Toggling video recording in itembutton callback." << '\n'; - screen_->activeCamera()->toggleVideoRecording(); - recordbutton->setCallback([this,recordbutton]() { - std::cout << "Toggling video recording in recordbutton callback." << '\n'; - screen_->activeCamera()->toggleVideoRecording(); - recordbutton->setCallback([]() {}); - recordbutton->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f)); - - // Prevents the popup from being opened, though it is shown while the button - // is being pressed. - recordbutton->setPushed(false); - }); + auto activeCamera = screen_->activeCamera(); + activeCamera->toggleVideoRecording(); recordbutton->setTextColor(nanogui::Color(1.0f,0.1f,0.1f,1.0f)); recordbutton->setPushed(false); + virtualCameraRecording_ = std::optional<ftl::gui::Camera*>(activeCamera); }); itembutton = new Button(recordpopup, "3D scene recording (.ftl)"); itembutton->setCallback([this,recordbutton]() { @@ -74,18 +67,30 @@ MediaPanel::MediaPanel(ftl::gui::Screen *screen) : nanogui::Window(screen, ""), ftl::Configurable *configurable = configurables[0]; configurable->set("record", true); recordbutton->setTextColor(nanogui::Color(1.0f,0.1f,0.1f,1.0f)); - recordbutton->setCallback([this,recordbutton,configurable]() { - configurable->set("record", false); - recordbutton->setCallback([]() {}); - recordbutton->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f)); - recordbutton->setPushed(false); - }); + sceneRecording_ = std::optional<ftl::Configurable*>(configurable); } } recordbutton->setPushed(false); }); itembutton = new Button(recordpopup, "Detailed recording options"); + recordbutton->setCallback([this,recordbutton](){ + if (virtualCameraRecording_) { + virtualCameraRecording_.value()->toggleVideoRecording(); + recordbutton->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f)); + + // Prevents the popup from being opened, though it is shown while the button + // is being pressed. + recordbutton->setPushed(false); + virtualCameraRecording_ = std::nullopt; + } else if (sceneRecording_) { + sceneRecording_.value()->set("record", false); + recordbutton->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f)); + recordbutton->setPushed(false); + sceneRecording_ = std::nullopt; + } + }); + button = new Button(this, "", ENTYPO_ICON_CONTROLLER_STOP); button->setCallback([this]() { screen_->setActiveCamera(nullptr); diff --git a/applications/gui/src/media_panel.hpp b/applications/gui/src/media_panel.hpp index 0279cb3fadab41003ceefef538e8f42a20f00139..df0b0802294cbe64800c850faa60fadf4f3de55b 100644 --- a/applications/gui/src/media_panel.hpp +++ b/applications/gui/src/media_panel.hpp @@ -1,6 +1,8 @@ #ifndef _FTL_GUI_MEDIAPANEL_HPP_ #define _FTL_GUI_MEDIAPANEL_HPP_ +#include "camera.hpp" + #include <nanogui/window.h> namespace ftl { @@ -30,6 +32,15 @@ class MediaPanel : public nanogui::Window { nanogui::PopupButton *button_channels_; nanogui::Button *right_button_; nanogui::Button *depth_button_; + + /** + * These members indicate which type of recording is active, if any. + * They also include a pointer to an object which is used + * to end the recording. Only one of these members should have a value + * at any given time. + */ + std::optional<ftl::gui::Camera*> virtualCameraRecording_; + std::optional<ftl::Configurable*> sceneRecording_; }; }