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.
This commit is contained in:
Anthony J. Thibault 2017-01-12 10:49:41 -08:00
parent 0746d38cae
commit cf138eb1fd
2 changed files with 17 additions and 17 deletions

View file

@ -21,10 +21,6 @@ TabletScriptingInterface::TabletScriptingInterface() {
qmlRegisterType<SoundEffect>("Hifi", 1, 0, "SoundEffect");
}
TabletScriptingInterface::~TabletScriptingInterface() {
qDebug() << "Shutting down TabletScriptingInterface";
}
QObject* TabletScriptingInterface::getTablet(const QString& tabletId) {
std::lock_guard<std::mutex> 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<QQuickItem*>("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<QQuickItem*>("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<QQuickItem*>("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)));
}

View file

@ -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<QSharedPointer<TabletButtonProxy>> _tabletButtonProxies;
QQuickItem* _qmlTabletRoot { nullptr };
QObject* _qmlOffscreenSurface { nullptr };
enum class State { Uninitialized, Home, Web, Menu };
State _state { State::Uninitialized };
};
/**jsdoc