Skip to content
Snippets Groups Projects
media_panel.cpp 6.01 KiB
Newer Older
Nicolas Pope's avatar
Nicolas Pope committed
#include "media_panel.hpp"
#include "screen.hpp"
#include "camera.hpp"

#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) : nanogui::Window(screen, ""), screen_(screen) {
Sebastian Hahta's avatar
Sebastian Hahta committed
	using namespace nanogui;
Sebastian Hahta's avatar
Sebastian Hahta committed
	paused_ = false;
	writer_ = nullptr;
Sebastian Hahta's avatar
Sebastian Hahta committed
	setLayout(new BoxLayout(Orientation::Horizontal,
Nicolas Pope's avatar
Nicolas Pope committed
									Alignment::Middle, 5, 10));

Sebastian Hahta's avatar
Sebastian Hahta committed
	auto size = Vector2i(400, 60);
	//setFixedSize(size);
	setPosition(Vector2i(screen->width() / 2 - size[0]/2, screen->height() - 30 - size[1]));
Sebastian Hahta's avatar
Sebastian Hahta committed
	auto button = new Button(this, "", ENTYPO_ICON_EDIT);
Nicolas Pope's avatar
Nicolas Pope committed
	button->setTooltip("Edit camera properties");
Sebastian Hahta's avatar
Sebastian Hahta committed
	button->setCallback([this]() {
		auto *cam = screen_->activeCamera();
		if (cam) cam->showPoseWindow();
	});

	button = new Button(this, "", ENTYPO_ICON_CONTROLLER_RECORD);
	button->setFlags(Button::ToggleButton);
	button->setChangeCallback([this,button](bool state) {
		if (state){
			auto *cam = screen_->activeCamera();

			button->setTextColor(nanogui::Color(1.0f,0.1f,0.1f,1.0f));
			char timestamp[18];
Nicolas Pope's avatar
Nicolas Pope committed
			std::time_t t=std::time(NULL);
			std::strftime(timestamp, sizeof(timestamp), "%F-%H%M%S", std::localtime(&t));
			writer_ = new ftl::rgbd::SnapshotStreamWriter(std::string(timestamp) + ".tar.gz", 1000 / 25);
Sebastian Hahta's avatar
Sebastian Hahta committed
			writer_->addSource(cam->source());
			writer_->start();
		} else {
			button->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f));
			if (writer_) {
				writer_->stop();
				delete writer_;
				writer_ = nullptr;
			}
		}
		//if (state) ... start
		//else ... stop
	});
Nicolas Pope's avatar
Nicolas Pope committed

Nicolas Pope's avatar
Nicolas Pope committed
	button = new Button(this, "", ENTYPO_ICON_CONTROLLER_STOP);
Sebastian Hahta's avatar
Sebastian Hahta committed
	button->setCallback([this]() {
		screen_->setActiveCamera(nullptr);
	});

	button = new Button(this, "", ENTYPO_ICON_CONTROLLER_PAUS);
	button->setCallback([this,button]() {
		paused_ = !paused_;
		screen_->control()->pause();
		if (paused_) {
			button->setIcon(ENTYPO_ICON_CONTROLLER_PLAY);
		} else {
			button->setIcon(ENTYPO_ICON_CONTROLLER_PAUS);
		}
	});

	//button = new Button(this, "", ENTYPO_ICON_CONTROLLER_RECORD);
Nicolas Pope's avatar
Nicolas Pope committed

 #ifdef HAVE_LIBARCHIVE
	auto button_snapshot = new Button(this, "", ENTYPO_ICON_IMAGES);
Sebastian Hahta's avatar
Sebastian Hahta committed
	button_snapshot->setTooltip("Screen capture");
Nicolas Pope's avatar
Nicolas Pope committed
	button_snapshot->setCallback([this] {
Sebastian Hahta's avatar
Sebastian Hahta committed
	ftl::gui::Camera *cam = screen_->activeCamera();
	if (!cam) return;

	try {
		char timestamp[18];
Nicolas Pope's avatar
Nicolas Pope committed
			std::time_t t=std::time(NULL);
			std::strftime(timestamp, sizeof(timestamp), "%F-%H%M%S", std::localtime(&t));
			auto writer = ftl::rgbd::SnapshotWriter(std::string(timestamp) + ".tar.gz");
			cv::Mat rgb, depth;
			cam->source()->getFrames(rgb, depth);
Sebastian Hahta's avatar
Sebastian Hahta committed
			writer.addSource(	cam->source()->getURI(),
								cam->source()->parameters(),
								cam->source()->getPose());
			writer.addRGBD(0, rgb, depth);
Nicolas Pope's avatar
Nicolas Pope committed
		}
		catch(std::runtime_error) {
			LOG(ERROR) << "Snapshot failed (file error)";
		}
	});
#endif

    auto popbutton = new PopupButton(this, "", ENTYPO_ICON_LAYERS);
    popbutton->setSide(Popup::Side::Right);
	popbutton->setChevronIcon(ENTYPO_ICON_CHEVRON_SMALL_RIGHT);
    Popup *popup = popbutton->popup();
    popup->setLayout(new GroupLayout());
	popup->setTheme(screen->toolbuttheme);
    popup->setAnchorHeight(150);
Nicolas Pope's avatar
Nicolas Pope committed

    button = new Button(popup, "Left");
    button->setFlags(Button::RadioButton);
    button->setPushed(true);
    button->setCallback([this]() {
        ftl::gui::Camera *cam = screen_->activeCamera();
        if (cam) {
            cam->setChannel(ftl::rgbd::kChanLeft);
        }
    });

	right_button_ = new Button(popup, "Right");
    right_button_->setFlags(Button::RadioButton);
    right_button_->setCallback([this]() {
        ftl::gui::Camera *cam = screen_->activeCamera();
        if (cam) {
            cam->setChannel(ftl::rgbd::kChanRight);
        }
    });

    depth_button_ = new Button(popup, "Depth");
    depth_button_->setFlags(Button::RadioButton);
    depth_button_->setCallback([this]() {
Nicolas Pope's avatar
Nicolas Pope committed
        ftl::gui::Camera *cam = screen_->activeCamera();
        if (cam) {
            cam->setChannel(ftl::rgbd::kChanDepth);
        }
    });

	popbutton = new PopupButton(popup, "More");
    popbutton->setSide(Popup::Side::Right);
	popbutton->setChevronIcon(ENTYPO_ICON_CHEVRON_SMALL_RIGHT);
    popup = popbutton->popup();
    popup->setLayout(new GroupLayout());
	popup->setTheme(screen->toolbuttheme);
    popup->setAnchorHeight(150);

Nicolas Pope's avatar
Nicolas Pope committed
    button = new Button(popup, "Deviation");
    button->setFlags(Button::RadioButton);
    button->setCallback([this]() {
        ftl::gui::Camera *cam = screen_->activeCamera();
        if (cam) {
            cam->setChannel(ftl::rgbd::kChanDeviation);
        }
    });

	button = new Button(popup, "Normals");
    button->setFlags(Button::RadioButton);
    button->setCallback([this]() {
        ftl::gui::Camera *cam = screen_->activeCamera();
        if (cam) {
            cam->setChannel(ftl::rgbd::kChanNormals);
        }
    });

	button = new Button(popup, "Flow");
    button->setFlags(Button::RadioButton);
    button->setCallback([this]() {
        ftl::gui::Camera *cam = screen_->activeCamera();
        if (cam) {
            cam->setChannel(ftl::rgbd::kChanFlow);
        }
    });

	button = new Button(popup, "Confidence");
    button->setFlags(Button::RadioButton);
    button->setCallback([this]() {
        ftl::gui::Camera *cam = screen_->activeCamera();
        if (cam) {
            cam->setChannel(ftl::rgbd::kChanConfidence);
        }
    });

    button = new Button(popup, "Energy");
    button->setFlags(Button::RadioButton);
    button->setCallback([this]() {
        ftl::gui::Camera *cam = screen_->activeCamera();
        if (cam) {
            cam->setChannel(ftl::rgbd::kChanEnergy);
        }
    });

Nicolas Pope's avatar
Nicolas Pope committed
}

MediaPanel::~MediaPanel() {

}

// Update button enabled status
void MediaPanel::cameraChanged() {
    ftl::gui::Camera *cam = screen_->activeCamera();
    if (cam) {
        if (cam->source()->hasCapabilities(ftl::rgbd::kCapStereo)) {
            right_button_->setEnabled(true);
        } else {
            right_button_->setEnabled(false);
        }
    }
}