Newer
Older
#include <nanogui/layout.h>
#include <nanogui/button.h>
#include <nanogui/popupbutton.h>
#include <nanogui/entypo.h>
#ifdef HAVE_LIBARCHIVE
#include "ftl/rgbd/snapshot.hpp"
#endif
using ftl::gui::MediaPanel;
MediaPanel::MediaPanel(ftl::gui::Screen *screen, ftl::gui::SourceWindow *sourceWindow) : nanogui::Window(screen, ""), screen_(screen), sourceWindow_(sourceWindow) {
setLayout(new BoxLayout(Orientation::Horizontal,
auto size = Vector2i(400, 60);
//setFixedSize(size);
setPosition(Vector2i(screen->width() / 2 - size[0]/2, screen->height() - 30 - size[1]));
auto button = new Button(this, "", ENTYPO_ICON_EDIT);
button->setCallback([this]() {
auto *cam = screen_->activeCamera();
if (cam) cam->showPoseWindow();
});
recordbutton_ = new PopupButton(this, "", ENTYPO_ICON_CONTROLLER_RECORD);
recordbutton_->setTooltip("Record");
recordbutton_->setSide(Popup::Side::Right);
recordbutton_->setChevronIcon(0);
auto recordpopup = recordbutton_->popup();
recordpopup->setLayout(new GroupLayout());
recordpopup->setTheme(screen->toolbuttheme);
recordpopup->setAnchorHeight(150);
auto itembutton = new Button(recordpopup, "2D snapshot (.png)");
});
itembutton = new Button(recordpopup, "Virtual camera recording (.ftl)");
recordbutton_->setTextColor(nanogui::Color(1.0f,0.1f,0.1f,1.0f));
recordbutton_->setPushed(false);
});
itembutton = new Button(recordpopup, "3D scene snapshot (.ftl)");
itembutton->setCallback([this]() {
});
itembutton = new Button(recordpopup, "3D scene recording (.ftl)");
recordbutton_->setTextColor(nanogui::Color(1.0f,0.1f,0.1f,1.0f));
recordbutton_->setPushed(false);
itembutton = new Button(recordpopup, "Detailed recording options");
itembutton->setCallback([this,sourceWindow] {
auto record_window = new RecordWindow(screen_, screen_, sourceWindow->getCameras(), this);
record_window->setTheme(screen_->windowtheme);
recordbutton_->setPushed(false);
recordbutton_->setEnabled(false);
});
if (record_mode_ != RecordMode::None) {
_stopRecording();
recordbutton_->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f));
recordbutton_->setPushed(false);
button = new Button(this, "", ENTYPO_ICON_CONTROLLER_STOP);
button->setCallback([this]() {
screen_->setActiveCamera(nullptr);
});
button = new Button(this, "", ENTYPO_ICON_CONTROLLER_PAUS);
button->setCallback([this,button,sourceWindow]() {
//paused_ = !(bool)ftl::config::get("[reconstruction]/controls/paused");
//ftl::config::update("[reconstruction]/controls/paused", paused_);
paused_ = !paused_;
sourceWindow->paused(paused_);
if (paused_) {
button->setIcon(ENTYPO_ICON_CONTROLLER_PLAY);
} else {
button->setIcon(ENTYPO_ICON_CONTROLLER_PAUS);
}
});
/*auto button_dual = new Button(this, "", ENTYPO_ICON_MAP);
button_dual->setCallback([this]() {
screen_->setDualView(!screen_->getDualView());
});
*/
#ifdef HAVE_OPENVR
if (this->screen_->isHmdPresent()) {
auto button_vr = new Button(this, "VR");
button_vr->setFlags(Button::ToggleButton);
button_vr->setChangeCallback([this, button_vr](bool state) {
if (!screen_->isVR()) {
if (screen_->switchVR(true) == true) {
button_vr->setTextColor(nanogui::Color(0.5f,0.5f,1.0f,1.0f));
//this->button_channels_->setEnabled(false);
}
}
else {
if (screen_->switchVR(false) == false) {
button_vr->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f));
//this->button_channels_->setEnabled(true);
}
}
});
}
#endif
button_channels_ = new PopupButton(this, "", ENTYPO_ICON_LAYERS);
button_channels_->setSide(Popup::Side::Right);
button_channels_->setChevronIcon(ENTYPO_ICON_CHEVRON_SMALL_RIGHT);
Popup *popup = button_channels_->popup();
popup->setLayout(new GroupLayout());
popup->setTheme(screen->toolbuttheme);
for (int i=0; i<=2; ++i) {
ftl::codecs::Channel c = static_cast<ftl::codecs::Channel>(i);
button = new Button(popup, ftl::codecs::name(c));
button->setFlags(Button::RadioButton);
//button->setPushed(true);
button->setVisible(false);
button->setCallback([this,c]() {
ftl::gui::Camera *cam = screen_->activeCamera();
if (cam) {
cam->setChannel(c);
}
});
channel_buttons_[i] = button;
}
auto *stereobut = new Button(popup, "Stereo On");
stereobut->setCallback([this,stereobut]() {
ftl::gui::Camera *cam = screen_->activeCamera();
if (cam) {
cam->setStereo(!cam->isStereo());
if (cam->isStereo()) {
stereobut->setCaption("Stereo Off");
} else {
stereobut->setCaption("Stereo On");
}
}
});
auto *popbutton = new PopupButton(popup, "More");
popbutton->setSide(Popup::Side::Right);
popbutton->setChevronIcon(ENTYPO_ICON_CHEVRON_SMALL_RIGHT);
popup = popbutton->popup();
popup->setLayout(new GroupLayout());
for (int i=3; i<32; ++i) {
ftl::codecs::Channel c = static_cast<ftl::codecs::Channel>(i);
button = new Button(popup, ftl::codecs::name(c));
button->setFlags(Button::RadioButton);
//button->setPushed(true);
button->setVisible(false);
button->setCallback([this,c]() {
ftl::gui::Camera *cam = screen_->activeCamera();
if (cam) {
cam->setChannel(c);
}
});
channel_buttons_[i] = button;
}
}
void MediaPanel::_startRecording(MediaPanel::RecordMode mode) {
char timestamp[18];
std::time_t t=std::time(NULL);
std::strftime(timestamp, sizeof(timestamp), "%F-%H%M%S", std::localtime(&t));
std::string filename(timestamp);
switch(mode) {
case RecordMode::Snapshot2D : filename += ".png"; break;
case RecordMode::Snapshot3D :
case RecordMode::Video3D : filename += ".ftl"; break;
case RecordMode::Video2D : filename += ".ftl"; break;
}
if (mode == RecordMode::Video3D) {
record_mode_ = mode;
sourceWindow_->recordVideo(filename);
} else if (mode == RecordMode::Snapshot2D) {
screen_->activeCamera()->snapshot(filename);
} else if (mode == RecordMode::Video2D) {
record_mode_ = mode;
screen_->activeCamera()->startVideoRecording(filename);
}
void MediaPanel::_stopRecording() {
if (record_mode_ == RecordMode::Video3D) {
sourceWindow_->stopRecordingVideo();
} else if (record_mode_ == RecordMode::Video2D) {
screen_->activeCamera()->stopVideoRecording();
}
record_mode_ = RecordMode::None;
// Update button enabled status
void MediaPanel::cameraChanged() {
ftl::gui::Camera *cam = screen_->activeCamera();
if (cam) {
auto channels = cam->availableChannels();
for (int i=0; i<32; ++i) {
if (channels.has(static_cast<ftl::codecs::Channel>(i))) {
channel_buttons_[i]->setVisible(true);
} else {
channel_buttons_[i]->setVisible(false);
if (cam->getChannel() == static_cast<ftl::codecs::Channel>(i)) {
channel_buttons_[i]->setPushed(true);
} else {
channel_buttons_[i]->setPushed(false);
}
}
}
}
void MediaPanel::recordWindowClosed() {
recordbutton_->setEnabled(true);
}