#pragma once
#include "../view.hpp"
#include <ftl/utility/gltexture.hpp>
#include "../widgets/window.hpp"
#include "../widgets/soundctrl.hpp"
#include "../widgets/imageview.hpp"
#include "../widgets/popupbutton.hpp"
#include "../modules/camera_tools.hpp"
namespace ftl {
namespace gui2 {
class Camera;
class MediaPanel;
class CameraView;
class ToolPanel : public FixedWindow {
public:
ToolPanel(nanogui::Widget *parent, Camera* ctrl, CameraView* view);
virtual ~ToolPanel();
void setAvailable(const std::unordered_set<ftl::gui2::CameraTools> &);
void setEnabled(const std::unordered_set<ftl::gui2::CameraTools> &);
void enable(const std::unordered_set<ftl::gui2::CameraTools> &);
void disable(const std::unordered_set<ftl::gui2::CameraTools> &);
void draw(NVGcontext *ctx) override;
/** add button to position. */
nanogui::Button* addButton(int position = -1);
inline ftl::gui2::CameraTools activeTool() const { return active_; }
void setTool(ftl::gui2::CameraTools tool);
inline void addCallback(const std::function<bool(ftl::gui2::CameraTools)> &cb) { callbacks_.push_back(cb); }
private:
Camera* ctrl_;
CameraView* view_;
nanogui::Widget *container_;
std::unordered_map<ftl::gui2::CameraTools, nanogui::Button*> buttons_;
ftl::gui2::CameraTools active_ = ftl::gui2::CameraTools::NONE;
std::list<std::function<bool(ftl::gui2::CameraTools)>> callbacks_;
void _addButton(ftl::gui2::CameraTools, int icon, const std::string &tooltip);
void _addButton(ftl::gui2::PopupButton *parent, ftl::gui2::CameraTools, const std::string &label);
ftl::gui2::PopupButton *_addButton(std::unordered_set<ftl::gui2::CameraTools> tools, int icon, const std::string &tooltip);
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
class CameraView : public View {
public:
CameraView(Screen* parent, Camera* ctrl);
virtual ~CameraView();
virtual void draw(NVGcontext* ctx) override;
virtual void performLayout(NVGcontext* ctx) override;
virtual bool mouseButtonEvent(const Eigen::Vector2i &p, int button, bool down, int modifiers) override;
virtual bool mouseMotionEvent(const Eigen::Vector2i &p, const Eigen::Vector2i &rel, int button, int modifiers) override;
void refresh();
void setZoom(bool enable);
void setPan(bool enable);
void setStereo(bool v);
protected:
bool enable_zoom_;
bool enable_pan_;
Camera* ctrl_;
MediaPanel* panel_;
ToolPanel* tools_;
FTLImageView* imview_;
nanogui::Window *context_menu_;
private:
StereoImageView* stereoim_;
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
}
}