aboutsummaryrefslogtreecommitdiffstats
path: root/support/magicleap/Servo2D/code
diff options
context:
space:
mode:
authorAlan Jeffrey <ajeffrey@mozilla.com>2018-10-30 17:12:12 -0500
committerAlan Jeffrey <ajeffrey@mozilla.com>2018-10-31 11:11:01 -0500
commitc2f33709d158eaf489a2eae848b6eec21a312e37 (patch)
tree701e4eeba8e60525fb2b9fc4bbeb3eabccb05a50 /support/magicleap/Servo2D/code
parent4c5a3c0d9fda73fa639962a4fa61284d944c1581 (diff)
downloadservo-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.h12
-rw-r--r--support/magicleap/Servo2D/code/src/Servo2D.cpp47
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);
+}