/*
nanogui/screen.h -- Top-level widget and interface between NanoGUI and GLFW
A significant redesign of this code was contributed by Christian Schueller.
NanoGUI was developed by Wenzel Jakob <wenzel.jakob@epfl.ch>.
The widget drawing code is based on the NanoVG demo application
by Mikko Mononen.
All rights reserved. Use of this source code is governed by a
BSD-style license that can be found in the LICENSE.txt file.
*/
#pragma once
#include <nanogui/widget.h>
NAMESPACE_BEGIN(nanogui)
class NANOGUI_EXPORT Screen : public Widget {
friend class Widget;
friend class Window;
public:
Screen(const Vector2i &size, const std::string &caption,
bool resizable = true, bool fullscreen = false, int colorBits = 8,
int alphaBits = 8, int depthBits = 24, int stencilBits = 8,
int nSamples = 0,
unsigned int glMajor = 3, unsigned int glMinor = 3);
virtual ~Screen();
const std::string &caption() const { return mCaption; }
void setCaption(const std::string &caption);
const Color &background() const { return mBackground; }
void setBackground(const Color &background) { mBackground = background; }
void setVisible(bool visible);
void setSize(const Vector2i& size);
virtual void drawAll();
virtual void drawContents() { /* To be overridden */ }
float pixelRatio() const { return mPixelRatio; }
virtual bool dropEvent(const std::vector<std::string> & /* filenames */) { return false; /* To be overridden */ }
virtual bool keyboardEvent(int key, int scancode, int action, int modifiers);
virtual bool keyboardCharacterEvent(unsigned int codepoint);
virtual bool resizeEvent(const Vector2i& size);
std::function<void(Vector2i)> resizeCallback() const { return mResizeCallback; }
void setResizeCallback(const std::function<void(Vector2i)> &callback) { mResizeCallback = callback; }
Vector2i mousePos() const { return mMousePos; }
GLFWwindow *glfwWindow() { return mGLFWWindow; }
NVGcontext *nvgContext() { return mNVGContext; }
void setShutdownGLFWOnDestruct(bool v) { mShutdownGLFWOnDestruct = v; }
bool shutdownGLFWOnDestruct() { return mShutdownGLFWOnDestruct; }
using Widget::performLayout;
void performLayout() {
Widget::performLayout(mNVGContext);
}
public:
/********* API for applications which manage GLFW themselves *********/
Screen();
void initialize(GLFWwindow *window, bool shutdownGLFWOnDestruct);
/* Event handlers */
bool cursorPosCallbackEvent(double x, double y);
bool mouseButtonCallbackEvent(int button, int action, int modifiers);
bool keyCallbackEvent(int key, int scancode, int action, int mods);
bool charCallbackEvent(unsigned int codepoint);
bool dropCallbackEvent(int count, const char **filenames);
bool scrollCallbackEvent(double x, double y);
bool resizeCallbackEvent(int width, int height);
/* Internal helper functions */
void updateFocus(Widget *widget);
void disposeWindow(Window *window);
void centerWindow(Window *window);
void moveWindowToFront(Window *window);
void drawWidgets();
protected:
GLFWwindow *mGLFWWindow;
NVGcontext *mNVGContext;
GLFWcursor *mCursors[(int) Cursor::CursorCount];
Cursor mCursor;
std::vector<Widget *> mFocusPath;
Vector2i mFBSize;
float mPixelRatio;
int mMouseState, mModifiers;
Vector2i mMousePos;
bool mDragActive;
Widget *mDragWidget = nullptr;
double mLastInteraction;
bool mProcessEvents;
Color mBackground;
std::string mCaption;
bool mShutdownGLFWOnDestruct;
bool mFullscreen;
std::function<void(Vector2i)> mResizeCallback;
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
NAMESPACE_END(nanogui)