/***************************************************************************************** * * * OpenSpace * * * * Copyright (c) 2014-2018 * * * * Permission is hereby granted, free of charge, to any person obtaining a copy of this * * software and associated documentation files (the "Software"), to deal in the Software * * without restriction, including without limitation the rights to use, copy, modify, * * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * * permit persons to whom the Software is furnished to do so, subject to the following * * conditions: * * * * The above copyright notice and this permission notice shall be included in all copies * * or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include namespace { constexpr const char* _loggerCat = "CefWebGui"; constexpr openspace::properties::Property::PropertyInfo EnabledInfo = { "Enabled", "Is Enabled", "This setting determines whether the browser should be enabled or not." }; constexpr openspace::properties::Property::PropertyInfo VisibleInfo = { "Visible", "Is Visible", "This setting determines whether the browser should be visible or not." }; constexpr openspace::properties::Property::PropertyInfo GuiUrlInfo = { "GuiUrl", "GUI URL", "The URL of the webpage that is used to load the WebGUI from." }; constexpr openspace::properties::Property::PropertyInfo GuiScaleInfo = { "GuiScale", "Gui Scale", "GUI scale multiplier." }; } // namespace namespace openspace { CefWebGuiModule::CefWebGuiModule() : OpenSpaceModule(CefWebGuiModule::Name) , _enabled(EnabledInfo, true) , _visible(VisibleInfo, true) , _url(GuiUrlInfo, "") , _guiScale(GuiScaleInfo, 1.0, 0.1, 3.0) { addProperty(_enabled); addProperty(_visible); addProperty(_url); addProperty(_guiScale); } void CefWebGuiModule::startOrStopGui() { WebBrowserModule* webBrowserModule = global::moduleEngine.module(); const bool isGuiWindow = global::windowDelegate.hasGuiWindow() ? global::windowDelegate.isGuiWindow() : true; const bool isMaster = global::windowDelegate.isMaster(); if (_enabled && isGuiWindow && isMaster) { LDEBUGC("WebBrowser", fmt::format("Loading GUI from {}", _url)); if (!_instance) { _instance = std::make_unique( new GUIRenderHandler, new GUIKeyboardHandler ); _instance->initialize(); _instance->loadUrl(_url); } if (_visible) { webBrowserModule->attachEventHandler(_instance.get()); } _instance->setZoom(_guiScale); webBrowserModule->addBrowser(_instance.get()); } else if (_instance) { _instance->close(true); webBrowserModule->removeBrowser(_instance.get()); webBrowserModule->detachEventHandler(); _instance.reset(); } } void CefWebGuiModule::internalInitialize(const ghoul::Dictionary& configuration) { WebBrowserModule* webBrowserModule = global::moduleEngine.module(); bool available = webBrowserModule && webBrowserModule->isEnabled(); if (!available) { return; } _enabled.onChange([this]() { startOrStopGui(); }); _url.onChange([this]() { if (_instance) { _instance->loadUrl(_url); } }); _guiScale.onChange([this]() { if (_instance) { _instance->setZoom(_guiScale); } }); _visible.onChange([this, webBrowserModule]() { if (_visible && _instance) { webBrowserModule->attachEventHandler(_instance.get()); } else { webBrowserModule->detachEventHandler(); } }); if (configuration.hasValue(GuiUrlInfo.identifier)) { _url = configuration.value(GuiUrlInfo.identifier); } else { WebGuiModule* webGuiModule = global::moduleEngine.module(); _url = "http://localhost:" + std::to_string(webGuiModule->port()) + "/#/onscreen"; } if (configuration.hasValue(GuiScaleInfo.identifier)) { _guiScale = configuration.value(GuiScaleInfo.identifier); } _enabled = configuration.hasValue(EnabledInfo.identifier) && configuration.value(EnabledInfo.identifier); _visible = configuration.hasValue(VisibleInfo.identifier) && configuration.value(VisibleInfo.identifier); global::callback::initializeGL.emplace_back([this]() { startOrStopGui(); }); global::callback::draw2D.emplace_back([this](){ const bool isGuiWindow = global::windowDelegate.hasGuiWindow() ? global::windowDelegate.isGuiWindow() : true; const bool isMaster = global::windowDelegate.isMaster(); if (isGuiWindow && isMaster && _instance) { if (global::windowDelegate.windowHasResized()) { _instance->reshape(global::windowDelegate.currentWindowSize()); } if (_visible) { _instance->draw(); } } }); global::callback::deinitializeGL.emplace_back([this]() { _enabled = false; startOrStopGui(); }); } } // namespace openspace