From cf138eb1fd401a1d8f3f59f897f582213cf13202 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Thu, 12 Jan 2017 10:49:41 -0800 Subject: [PATCH 1/2] Fixes for qt asserts in debug * The TabletScriptingInterface destructor is invoked on app shutdown after the logging system has been destroyed. To avoid this I removed the destructor. The log was only for debug purposes anyway. * Removed calls to setProperty() these calls are not thread safe and were causing asserts during debug. Instead of getting and setting the property we maintain the TabletProxy state using an enum. --- .../src/TabletScriptingInterface.cpp | 30 +++++++++---------- .../src/TabletScriptingInterface.h | 4 ++- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index 45635d0cbb..10a1006d76 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -21,10 +21,6 @@ TabletScriptingInterface::TabletScriptingInterface() { qmlRegisterType("Hifi", 1, 0, "SoundEffect"); } -TabletScriptingInterface::~TabletScriptingInterface() { - qDebug() << "Shutting down TabletScriptingInterface"; -} - QObject* TabletScriptingInterface::getTablet(const QString& tabletId) { std::lock_guard guard(_mutex); @@ -95,38 +91,40 @@ void TabletProxy::setQmlTabletRoot(QQuickItem* qmlTabletRoot, QObject* qmlOffscr gotoHomeScreen(); } else { removeButtonsFromHomeScreen(); + _state = State::Uninitialized; } } void TabletProxy::gotoMenuScreen() { if (_qmlTabletRoot) { - _qmlTabletRoot->setProperty(LOADER_SOURCE_PROPERTY_NAME, VRMENU_SOURCE_URL); - auto loader = _qmlTabletRoot->findChild("loader"); - QObject::connect(loader, SIGNAL(loaded()), this, SLOT(addButtonsToMenuScreen())); - QMetaObject::invokeMethod(_qmlTabletRoot, "loadSource", Q_ARG(const QVariant&, QVariant(VRMENU_SOURCE_URL))); + if (_state != State::Menu) { + auto loader = _qmlTabletRoot->findChild("loader"); + QObject::connect(loader, SIGNAL(loaded()), this, SLOT(addButtonsToMenuScreen())); + QMetaObject::invokeMethod(_qmlTabletRoot, "loadSource", Q_ARG(const QVariant&, QVariant(VRMENU_SOURCE_URL))); + _state = State::Menu; + } } } void TabletProxy::gotoHomeScreen() { if (_qmlTabletRoot) { - QString tabletSource = _qmlTabletRoot->property(LOADER_SOURCE_PROPERTY_NAME).toString(); - if (tabletSource != TABLET_SOURCE_URL) { - _qmlTabletRoot->setProperty(LOADER_SOURCE_PROPERTY_NAME, TABLET_SOURCE_URL); + if (_state != State::Home) { auto loader = _qmlTabletRoot->findChild("loader"); QObject::connect(loader, SIGNAL(loaded()), this, SLOT(addButtonsToHomeScreen())); QMetaObject::invokeMethod(_qmlTabletRoot, "loadSource", Q_ARG(const QVariant&, QVariant(TABLET_SOURCE_URL))); + _state = State::Home; } } } void TabletProxy::gotoWebScreen(const QString& url) { if (_qmlTabletRoot) { - removeButtonsFromHomeScreen(); - QString tabletSource = _qmlTabletRoot->property(LOADER_SOURCE_PROPERTY_NAME).toString(); - if (tabletSource != WEB_VIEW_SOURCE_URL) { - _qmlTabletRoot->setProperty(LOADER_SOURCE_PROPERTY_NAME, WEB_VIEW_SOURCE_URL); + if (_state == State::Home) { + removeButtonsFromHomeScreen(); + } + if (_state != State::Web) { QMetaObject::invokeMethod(_qmlTabletRoot, "loadSource", Q_ARG(const QVariant&, QVariant(WEB_VIEW_SOURCE_URL))); - // TABLET_UI_HACK: TODO: addEventBridge to tablet.... + _state = State::Web; } QMetaObject::invokeMethod(_qmlTabletRoot, "loadWebUrl", Q_ARG(const QVariant&, QVariant(url))); } diff --git a/libraries/script-engine/src/TabletScriptingInterface.h b/libraries/script-engine/src/TabletScriptingInterface.h index f49c9ea498..28bd32ef9e 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.h +++ b/libraries/script-engine/src/TabletScriptingInterface.h @@ -36,7 +36,6 @@ class TabletScriptingInterface : public QObject, public Dependency { Q_OBJECT public: TabletScriptingInterface(); - virtual ~TabletScriptingInterface(); /**jsdoc * Creates or retruns a new TabletProxy and returns it. @@ -132,6 +131,9 @@ protected: std::vector> _tabletButtonProxies; QQuickItem* _qmlTabletRoot { nullptr }; QObject* _qmlOffscreenSurface { nullptr }; + + enum class State { Uninitialized, Home, Web, Menu }; + State _state { State::Uninitialized }; }; /**jsdoc From 37804d18751a264ae3b6ca8b9ef366cf35a7f736 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Thu, 12 Jan 2017 13:32:01 -0800 Subject: [PATCH 2/2] Fix for linux warning --- libraries/script-engine/src/TabletScriptingInterface.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index 10a1006d76..57e8ce1d23 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -53,7 +53,6 @@ void TabletScriptingInterface::setQmlTabletRoot(QString tabletId, QQuickItem* qm static const char* TABLET_SOURCE_URL = "Tablet.qml"; static const char* WEB_VIEW_SOURCE_URL = "TabletWebView.qml"; -static const char* LOADER_SOURCE_PROPERTY_NAME = "LoaderSource"; static const char* VRMENU_SOURCE_URL = "TabletMenu.qml"; TabletProxy::TabletProxy(QString name) : _name(name) {