diff options
author | Alan Jeffrey <ajeffrey@mozilla.com> | 2018-10-30 17:12:12 -0500 |
---|---|---|
committer | Alan Jeffrey <ajeffrey@mozilla.com> | 2018-10-31 11:11:01 -0500 |
commit | c2f33709d158eaf489a2eae848b6eec21a312e37 (patch) | |
tree | 701e4eeba8e60525fb2b9fc4bbeb3eabccb05a50 /support/magicleap/Servo2D/code | |
parent | 4c5a3c0d9fda73fa639962a4fa61284d944c1581 (diff) | |
download | servo-c2f33709d158eaf489a2eae848b6eec21a312e37.tar.gz servo-c2f33709d158eaf489a2eae848b6eec21a312e37.zip |
Get the Servo2D URL bar to show the current URL, and to navigate when edited.
Diffstat (limited to 'support/magicleap/Servo2D/code')
-rw-r--r-- | support/magicleap/Servo2D/code/inc/Servo2D.h | 12 | ||||
-rw-r--r-- | support/magicleap/Servo2D/code/src/Servo2D.cpp | 47 |
2 files changed, 48 insertions, 11 deletions
diff --git a/support/magicleap/Servo2D/code/inc/Servo2D.h b/support/magicleap/Servo2D/code/inc/Servo2D.h index 490c6d60ece..29477cf3cd8 100644 --- a/support/magicleap/Servo2D/code/inc/Servo2D.h +++ b/support/magicleap/Servo2D/code/inc/Servo2D.h @@ -9,6 +9,9 @@ #include <lumin/event/ControlTouchPadInputEventData.h> #include <lumin/node/QuadNode.h> #include <lumin/resource/PlanarResource.h> +#include <lumin/ui/KeyboardDefines.h> +#include <lumin/ui/node/UiButton.h> +#include <lumin/ui/node/UiTextEdit.h> #include <SceneDescriptor.h> typedef struct Opaque ServoInstance; @@ -48,6 +51,11 @@ public: */ Servo2D& operator=(Servo2D&&) = delete; + /** + * Update the browser history UI + */ + void updateHistory(bool canGoBack, const char* url, bool canGoForward); + protected: /** * Initializes the Landscape Application. @@ -93,6 +101,7 @@ protected: virtual bool eventListener(lumin::ServerEvent* event) override; bool touchpadEventListener(lumin::ControlTouchPadInputEventData* event); bool keyEventListener(lumin::KeyInputEventData* event); + void urlBarEventListener(); /** * Get the current cursor position, with respect to the viewport. @@ -104,5 +113,8 @@ private: lumin::Prism* prism_ = nullptr; // represents the bounded space where the App renders. lumin::PlanarResource* plane_ = nullptr; // the plane we're rendering into lumin::QuadNode* content_node_ = nullptr; // the node containing the plane + lumin::ui::UiButton* back_button_ = nullptr; // the back button + lumin::ui::UiButton* fwd_button_ = nullptr; // the forward button + lumin::ui::UiTextEdit* url_bar_ = nullptr; // the URL bar ServoInstance* servo_ = nullptr; // the servo instance we're embedding }; diff --git a/support/magicleap/Servo2D/code/src/Servo2D.cpp b/support/magicleap/Servo2D/code/src/Servo2D.cpp index 54600362d09..d24316490b6 100644 --- a/support/magicleap/Servo2D/code/src/Servo2D.cpp +++ b/support/magicleap/Servo2D/code/src/Servo2D.cpp @@ -6,7 +6,6 @@ #include <lumin/node/RootNode.h> #include <lumin/node/QuadNode.h> #include <lumin/ui/Cursor.h> -#include <lumin/ui/node/UiButton.h> #include <ml_logging.h> #include <scenesGen.h> #include <SceneDescriptor.h> @@ -35,13 +34,20 @@ void logger(MLLogLevel lvl, char* msg) { } } +// A function which updates the history ui, suitable for passing into Servo +typedef void (*MLHistoryUpdate)(Servo2D* app, bool canGoBack, char* url, bool canGoForward); +void history(Servo2D* app, bool canGoBack, char* url, bool canGoForward) { + app->updateHistory(canGoBack, url, canGoForward); +} + // The functions Servo provides for hooking up to the ML. -// For the moment, this doesn't handle input events. -extern "C" ServoInstance* init_servo(EGLContext, EGLSurface, EGLDisplay, MLLogger, - const char* url, int width, int height, float hidpi); +extern "C" ServoInstance* init_servo(EGLContext, EGLSurface, EGLDisplay, + Servo2D*, MLLogger, MLHistoryUpdate, + const char* url, int width, int height, float hidpi); extern "C" void heartbeat_servo(ServoInstance*); extern "C" void cursor_servo(ServoInstance*, float x, float y, bool triggered); extern "C" void traverse_servo(ServoInstance*, int delta); +extern "C" void navigate_servo(ServoInstance*, const char* text); extern "C" void discard_servo(ServoInstance*); // Create a Servo2D instance @@ -120,7 +126,7 @@ int Servo2D::init() { EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); // Hook into servo - servo_ = init_servo(ctx, surf, dpy, logger, "https://servo.org/", VIEWPORT_H, VIEWPORT_W, HIDPI); + servo_ = init_servo(ctx, surf, dpy, this, logger, history, "https://servo.org/", VIEWPORT_H, VIEWPORT_W, HIDPI); if (!servo_) { ML_LOG(Error, "Servo2D Failed to init servo instance"); abort(); @@ -129,24 +135,33 @@ int Servo2D::init() { // Add a callback to the back button std::string back_button_id = Servo2D_exportedNodes::backButton; - lumin::ui::UiButton* back_button = lumin::ui::UiButton::CastFrom(prism_->findNode(back_button_id, root_node)); - if (!back_button) { + back_button_ = lumin::ui::UiButton::CastFrom(prism_->findNode(back_button_id, root_node)); + if (!back_button_) { ML_LOG(Error, "Servo2D Failed to get back button"); abort(); return 1; } - back_button->onActivateSub(std::bind(traverse_servo, servo_, -1)); + back_button_->onActivateSub(std::bind(traverse_servo, servo_, -1)); // Add a callback to the forward button std::string fwd_button_id = Servo2D_exportedNodes::fwdButton; - lumin::ui::UiButton* fwd_button = lumin::ui::UiButton::CastFrom(prism_->findNode(fwd_button_id, root_node)); - if (!fwd_button) { + fwd_button_ = lumin::ui::UiButton::CastFrom(prism_->findNode(fwd_button_id, root_node)); + if (!fwd_button_) { ML_LOG(Error, "Servo2D Failed to get forward button"); abort(); return 1; } - fwd_button->onActivateSub(std::bind(traverse_servo, servo_, +1)); + fwd_button_->onActivateSub(std::bind(traverse_servo, servo_, +1)); + // Add a callback to the URL bar + std::string url_bar_id = Servo2D_exportedNodes::urlBar; + url_bar_ = lumin::ui::UiTextEdit::CastFrom(prism_->findNode(url_bar_id, root_node)); + if (!url_bar_) { + ML_LOG(Error, "Servo2D Failed to get URL bar"); + abort(); + return 1; + } + url_bar_->onFocusLostSub(std::bind(&Servo2D::urlBarEventListener, this)); return 0; } @@ -268,3 +283,13 @@ bool Servo2D::keyEventListener(lumin::KeyInputEventData* event) { cursor_servo(servo_, pos.x, pos.y, true); return true; } + +void Servo2D::urlBarEventListener() { + navigate_servo(servo_, url_bar_->getText().c_str()); +} + +void Servo2D::updateHistory(bool canGoBack, const char* url, bool canGoForward) { + back_button_->setEnabled(canGoBack); + fwd_button_->setEnabled(canGoForward); + url_bar_->setText(url); +} |