diff --git a/interface/resources/qml/AssetServer.qml b/interface/resources/qml/hifi/AssetServer.qml similarity index 81% rename from interface/resources/qml/AssetServer.qml rename to interface/resources/qml/hifi/AssetServer.qml index 649ea49153..6b60cbff7b 100644 --- a/interface/resources/qml/AssetServer.qml +++ b/interface/resources/qml/hifi/AssetServer.qml @@ -14,10 +14,10 @@ import QtQuick.Controls.Styles 1.4 import QtQuick.Dialogs 1.2 as OriginalDialogs import Qt.labs.settings 1.0 -import "styles-uit" -import "controls-uit" as HifiControls -import "windows" -import "dialogs" +import "../styles-uit" +import "../controls-uit" as HifiControls +import "../windows" +import "../dialogs" ScrollingWindow { id: root @@ -38,7 +38,7 @@ ScrollingWindow { property var assetMappingsModel: Assets.mappingModel; property var currentDirectory; property var selectedItems: treeView.selection.selectedIndexes.length; - + Settings { category: "Overlay.AssetServer" property alias x: root.x @@ -58,6 +58,23 @@ ScrollingWindow { assetMappingsModel.autoRefreshEnabled = false; } + function letterbox(headerGlyph, headerText, message) { + letterboxMessage.headerGlyph = headerGlyph; + letterboxMessage.headerText = headerText; + letterboxMessage.text = message; + letterboxMessage.visible = true; + letterboxMessage.popupRadius = 0; + } + + function errorMessageBox(message) { + return desktop.messageBox({ + icon: hifi.icons.warning, + defaultButton: OriginalDialogs.StandardButton.Ok, + title: "Error", + text: message + }); + } + function doDeleteFile(path) { console.log("Deleting " + path); @@ -154,10 +171,7 @@ ScrollingWindow { } function handleGetMappingsError(errorString) { - errorMessageBox( - "There was a problem retreiving the list of assets from your Asset Server.\n" - + errorString - ); + errorMessageBox("There was a problem retreiving the list of assets from your Asset Server.\n" + errorString); } function addToWorld() { @@ -332,7 +346,7 @@ ScrollingWindow { if (!path) { return; } - + var modalMessage = ""; var items = selectedItems.toString(); var isFolder = assetProxyModel.data(treeView.selection.currentIndex, 0x101); @@ -448,19 +462,16 @@ ScrollingWindow { }); } } - - function errorMessageBox(message) { - return desktop.messageBox({ - icon: hifi.icons.warning, - defaultButton: OriginalDialogs.StandardButton.Ok, - title: "Error", - text: message - }); - } - + Item { width: pane.contentWidth height: pane.height + + // The letterbox used for popup messages + LetterboxMessage { + id: letterboxMessage; + z: 999; // Force the popup on top of everything else + } HifiControls.ContentSection { id: assetDirectory @@ -476,21 +487,21 @@ ScrollingWindow { HifiControls.Button { text: "Add To World" - color: hifi.buttons.black + color: hifi.buttons.blue colorScheme: root.colorScheme width: 120 - + enabled: canAddToWorld(assetProxyModel.data(treeView.selection.currentIndex, 0x100)) - + onClicked: root.addToWorld() } - + HifiControls.Button { text: "Rename" color: hifi.buttons.black colorScheme: root.colorScheme width: 80 - + onClicked: root.renameFile() enabled: canRename() } @@ -513,6 +524,7 @@ ScrollingWindow { id: treeView anchors.top: assetDirectory.bottom anchors.bottom: infoRow.top + anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y anchors.margins: hifi.dimensions.contentMargin.x + 2 // Extra for border anchors.left: parent.left anchors.right: parent.right @@ -555,7 +567,7 @@ ScrollingWindow { case "Not Baked": return hifi.glyphs.circleSlash; case "Baked": - return hifi.glyphs.check_2_01; + return hifi.glyphs.checkmark; case "Error": return hifi.glyphs.alert; default: @@ -584,8 +596,24 @@ ScrollingWindow { ? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight) : (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText) - elide: Text.ElideRight horizontalAlignment: styleData.column === 1 ? TextInput.AlignHCenter : TextInput.AlignLeft + + elide: Text.ElideMiddle + + MouseArea { + id: mouseArea + anchors.fill: parent + + acceptedButtons: Qt.NoButton + hoverEnabled: true + + onEntered: { + if (parent.truncated) { + treeLabelToolTip.show(parent); + } + } + onExited: treeLabelToolTip.hide(); + } } } Component { @@ -668,6 +696,42 @@ ScrollingWindow { } } + Rectangle { + id: treeLabelToolTip + visible: false + z: 100 // Render on top + + width: toolTipText.width + 2 * hifi.dimensions.textPadding + height: hifi.dimensions.tableRowHeight + color: colorScheme == hifi.colorSchemes.light ? hifi.colors.tableRowLightOdd : hifi.colors.tableRowDarkOdd + border.color: colorScheme == hifi.colorSchemes.light ? hifi.colors.black : hifi.colors.lightGrayText + + FiraSansSemiBold { + id: toolTipText + anchors.centerIn: parent + + size: hifi.fontSizes.tableText + color: colorScheme == hifi.colorSchemes.light ? hifi.colors.black : hifi.colors.lightGrayText + } + + Timer { + id: showTimer + interval: 1000 + onTriggered: { treeLabelToolTip.visible = true; } + } + function show(item) { + var coord = item.mapToItem(parent, item.x, item.y); + + toolTipText.text = item.text; + treeLabelToolTip.x = coord.x - hifi.dimensions.textPadding; + treeLabelToolTip.y = coord.y; + showTimer.start(); + } + function hide() { + showTimer.stop(); + treeLabelToolTip.visible = false; + } + } MouseArea { propagateComposedEvents: true @@ -717,26 +781,35 @@ ScrollingWindow { anchors.left: treeView.left anchors.right: treeView.right anchors.bottom: uploadSection.top - anchors.bottomMargin: hifi.dimensions.contentSpacing.y - spacing: hifi.dimensions.contentSpacing.x RalewayRegular { + anchors.verticalCenter: parent.verticalCenter + + function makeText() { + var numPendingBakes = assetMappingsModel.numPendingBakes; + if (selectedItems > 1 || numPendingBakes === 0) { + return selectedItems + " items selected"; + } else { + return numPendingBakes + " bakes pending" + } + } + size: hifi.fontSizes.sectionName font.capitalization: Font.AllUppercase - text: selectedItems + " items selected" + text: makeText() color: hifi.colors.lightGrayText } - HifiControls.CheckBox { - function isChecked() { - var status = assetProxyModel.data(treeView.selection.currentIndex, 0x105); - var bakingDisabled = (status === "Not Baked" || status === "--"); - return selectedItems === 1 && !bakingDisabled; - } + HifiControls.HorizontalSpacer { } - text: "Use baked (optimized) versions" + HifiControls.CheckBox { + id: bakingCheckbox + anchors.leftMargin: 2 * hifi.dimensions.contentSpacing.x + anchors.verticalCenter: parent.verticalCenter + + text: " Use baked version" colorScheme: root.colorScheme - enabled: selectedItems === 1 && assetProxyModel.data(treeView.selection.currentIndex, 0x105) !== "--" + enabled: isEnabled() checked: isChecked() onClicked: { var mappings = []; @@ -752,7 +825,66 @@ ScrollingWindow { checked = Qt.binding(isChecked); } + + function isEnabled() { + if (!treeView.selection.hasSelection) { + return false; + } + + var status = assetProxyModel.data(treeView.selection.currentIndex, 0x105); + if (status === "--") { + return false; + } + var bakingEnabled = status !== "Not Baked"; + + for (var i in treeView.selection.selectedIndexes) { + var thisStatus = assetProxyModel.data(treeView.selection.selectedIndexes[i], 0x105); + if (thisStatus === "--") { + return false; + } + var thisBakingEnalbed = (thisStatus !== "Not Baked"); + + if (bakingEnabled !== thisBakingEnalbed) { + return false; + } + } + + return true; + } + function isChecked() { + if (!treeView.selection.hasSelection) { + return false; + } + + var status = assetProxyModel.data(treeView.selection.currentIndex, 0x105); + return isEnabled() && status !== "Not Baked"; + } } + + Item { + anchors.verticalCenter: parent.verticalCenter + width: infoGlyph.size; + height: infoGlyph.size; + + HiFiGlyphs { + id: infoGlyph; + anchors.fill: parent; + horizontalAlignment: Text.AlignHCenter; + verticalAlignment: Text.AlignVCenter; + text: hifi.glyphs.question; + size: 35; + color: hifi.colors.lightGrayText; + } + MouseArea { + anchors.fill: parent; + hoverEnabled: true; + onEntered: infoGlyph.color = hifi.colors.blueHighlight; + onExited: infoGlyph.color = hifi.colors.lightGrayText; + onClicked: letterbox(hifi.glyphs.question, + "What is baking?", + "Baking compresses and optimizes files for faster network transfer and display. We recommend you bake your content to reduce initial load times for your visitors."); + } + } } HifiControls.ContentSection { @@ -790,7 +922,7 @@ ScrollingWindow { id: image width: 24 height: 24 - source: "../images/Loading-Outer-Ring.png" + source: "../../images/Loading-Outer-Ring.png" RotationAnimation on rotation { loops: Animation.Infinite from: 0 @@ -801,7 +933,7 @@ ScrollingWindow { Image { width: 24 height: 24 - source: "../images/Loading-Inner-H.png" + source: "../../images/Loading-Inner-H.png" } HifiControls.Label { id: uploadProgressLabel @@ -811,10 +943,9 @@ ScrollingWindow { text: "In progress..." colorScheme: root.colorScheme } - } } - } } } + diff --git a/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml b/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml index e7ff8489d1..f0338bf1f1 100644 --- a/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml +++ b/interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml @@ -76,6 +76,8 @@ Item { height: 50; echoMode: TextInput.Password; placeholderText: "enter current passphrase"; + activeFocusOnPress: true; + activeFocusOnTab: true; onFocusChanged: { if (focus) { @@ -87,9 +89,9 @@ Item { MouseArea { anchors.fill: parent; - onClicked: { - parent.focus = true; + onPressed: { sendSignalToWallet({method: 'walletSetup_raiseKeyboard'}); + mouse.accepted = false; } } @@ -109,6 +111,16 @@ Item { height: 50; echoMode: TextInput.Password; placeholderText: root.isShowingTip ? "" : "enter new passphrase"; + activeFocusOnPress: true; + activeFocusOnTab: true; + + MouseArea { + anchors.fill: parent; + onPressed: { + sendSignalToWallet({method: 'walletSetup_raiseKeyboard'}); + mouse.accepted = false; + } + } onFocusChanged: { if (focus) { @@ -118,18 +130,11 @@ Item { } } - MouseArea { - anchors.fill: parent; - onClicked: { - parent.focus = true; - sendMessageToLightbox({method: 'walletSetup_raiseKeyboard'}); - } - } - onAccepted: { passphraseFieldAgain.focus = true; } } + HifiControlsUit.TextField { id: passphraseFieldAgain; colorScheme: hifi.colorSchemes.dark; @@ -140,6 +145,16 @@ Item { height: 50; echoMode: TextInput.Password; placeholderText: root.isShowingTip ? "" : "re-enter new passphrase"; + activeFocusOnPress: true; + activeFocusOnTab: true; + + MouseArea { + anchors.fill: parent; + onPressed: { + sendSignalToWallet({method: 'walletSetup_raiseKeyboard'}); + mouse.accepted = false; + } + } onFocusChanged: { if (focus) { @@ -149,14 +164,6 @@ Item { } } - MouseArea { - anchors.fill: parent; - onClicked: { - parent.focus = true; - sendMessageToLightbox({method: 'walletSetup_raiseKeyboard'}); - } - } - onAccepted: { focus = false; } diff --git a/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml b/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml index 3f1fcf6bda..44cd700eac 100644 --- a/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml +++ b/interface/resources/qml/hifi/dialogs/TabletAssetServer.qml @@ -17,6 +17,7 @@ import Qt.labs.settings 1.0 import "../../styles-uit" import "../../controls-uit" as HifiControls import "../../windows" +import ".." Rectangle { id: root @@ -57,6 +58,23 @@ Rectangle { Component.onDestruction: { assetMappingsModel.autoRefreshEnabled = false; } + + function letterbox(headerGlyph, headerText, message) { + letterboxMessage.headerGlyph = headerGlyph; + letterboxMessage.headerText = headerText; + letterboxMessage.text = message; + letterboxMessage.visible = true; + letterboxMessage.popupRadius = 0; + } + + function errorMessageBox(message) { + return tabletRoot.messageBox({ + icon: hifi.icons.warning, + defaultButton: OriginalDialogs.StandardButton.Ok, + title: "Error", + text: message + }); + } function doDeleteFile(path) { console.log("Deleting " + path); @@ -154,10 +172,7 @@ Rectangle { } function handleGetMappingsError(errorString) { - errorMessageBox( - "There was a problem retreiving the list of assets from your Asset Server.\n" - + errorString - ); + errorMessageBox("There was a problem retreiving the list of assets from your Asset Server.\n" + errorString); } function addToWorld() { @@ -448,14 +463,11 @@ Rectangle { }); } } - - function errorMessageBox(message) { - return tabletRoot.messageBox({ - icon: hifi.icons.warning, - defaultButton: OriginalDialogs.StandardButton.Ok, - title: "Error", - text: message - }); + + // The letterbox used for popup messages + LetterboxMessage { + id: letterboxMessage; + z: 999; // Force the popup on top of everything else } Column { @@ -477,7 +489,7 @@ Rectangle { HifiControls.Button { text: "Add To World" - color: hifi.buttons.black + color: hifi.buttons.blue colorScheme: root.colorScheme width: 120 @@ -554,7 +566,7 @@ Rectangle { case "Not Baked": return hifi.glyphs.circleSlash; case "Baked": - return hifi.glyphs.check_2_01; + return hifi.glyphs.checkmark; case "Error": return hifi.glyphs.alert; default: @@ -583,8 +595,24 @@ Rectangle { ? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight) : (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText) - elide: Text.ElideRight horizontalAlignment: styleData.column === 1 ? TextInput.AlignHCenter : TextInput.AlignLeft + + elide: Text.ElideMiddle + + MouseArea { + id: mouseArea + anchors.fill: parent + + acceptedButtons: Qt.NoButton + hoverEnabled: true + + onEntered: { + if (parent.truncated) { + treeLabelToolTip.show(parent); + } + } + onExited: treeLabelToolTip.hide(); + } } } Component { @@ -667,6 +695,42 @@ Rectangle { } } + Rectangle { + id: treeLabelToolTip + visible: false + z: 100 // Render on top + + width: toolTipText.width + 2 * hifi.dimensions.textPadding + height: hifi.dimensions.tableRowHeight + color: colorScheme == hifi.colorSchemes.light ? hifi.colors.tableRowLightOdd : hifi.colors.tableRowDarkOdd + border.color: colorScheme == hifi.colorSchemes.light ? hifi.colors.black : hifi.colors.lightGrayText + + FiraSansSemiBold { + id: toolTipText + anchors.centerIn: parent + + size: hifi.fontSizes.tableText + color: colorScheme == hifi.colorSchemes.light ? hifi.colors.black : hifi.colors.lightGrayText + } + + Timer { + id: showTimer + interval: 1000 + onTriggered: { treeLabelToolTip.visible = true; } + } + function show(item) { + var coord = item.mapToItem(parent, item.x, item.y); + + toolTipText.text = item.text; + treeLabelToolTip.x = coord.x - hifi.dimensions.textPadding; + treeLabelToolTip.y = coord.y; + showTimer.start(); + } + function hide() { + showTimer.stop(); + treeLabelToolTip.visible = false; + } + } MouseArea { propagateComposedEvents: true @@ -716,25 +780,35 @@ Rectangle { anchors.left: treeView.left anchors.right: treeView.right anchors.bottomMargin: hifi.dimensions.contentSpacing.y - spacing: hifi.dimensions.contentSpacing.x RalewayRegular { + anchors.verticalCenter: parent.verticalCenter + + function makeText() { + var numPendingBakes = assetMappingsModel.numPendingBakes; + if (selectedItems > 1 || numPendingBakes === 0) { + return selectedItems + " items selected"; + } else { + return numPendingBakes + " bakes pending" + } + } + size: hifi.fontSizes.sectionName font.capitalization: Font.AllUppercase - text: selectedItems + " items selected" + text: makeText() color: hifi.colors.lightGrayText } - HifiControls.CheckBox { - function isChecked() { - var status = assetProxyModel.data(treeView.selection.currentIndex, 0x105); - var bakingDisabled = (status === "Not Baked" || status === "--"); - return selectedItems === 1 && !bakingDisabled; - } + HifiControls.HorizontalSpacer { } - text: "Use baked (optimized) versions" + HifiControls.CheckBox { + id: bakingCheckbox + anchors.leftMargin: 2 * hifi.dimensions.contentSpacing.x + anchors.verticalCenter: parent.verticalCenter + + text: " Use baked version" colorScheme: root.colorScheme - enabled: selectedItems === 1 && assetProxyModel.data(treeView.selection.currentIndex, 0x105) !== "--" + enabled: isEnabled() checked: isChecked() onClicked: { var mappings = []; @@ -750,7 +824,66 @@ Rectangle { checked = Qt.binding(isChecked); } + + function isEnabled() { + if (!treeView.selection.hasSelection) { + return false; + } + + var status = assetProxyModel.data(treeView.selection.currentIndex, 0x105); + if (status === "--") { + return false; + } + var bakingEnabled = status !== "Not Baked"; + + for (var i in treeView.selection.selectedIndexes) { + var thisStatus = assetProxyModel.data(treeView.selection.selectedIndexes[i], 0x105); + if (thisStatus === "--") { + return false; + } + var thisBakingEnalbed = (thisStatus !== "Not Baked"); + + if (bakingEnabled !== thisBakingEnalbed) { + return false; + } + } + + return true; + } + function isChecked() { + if (!treeView.selection.hasSelection) { + return false; + } + + var status = assetProxyModel.data(treeView.selection.currentIndex, 0x105); + return isEnabled() && status !== "Not Baked"; + } } + + Item { + anchors.verticalCenter: parent.verticalCenter + width: infoGlyph.size; + height: infoGlyph.size; + + HiFiGlyphs { + id: infoGlyph; + anchors.fill: parent; + horizontalAlignment: Text.AlignHCenter; + verticalAlignment: Text.AlignVCenter; + text: hifi.glyphs.question; + size: 35; + color: hifi.colors.lightGrayText; + } + MouseArea { + anchors.fill: parent; + hoverEnabled: true; + onEntered: infoGlyph.color = hifi.colors.blueHighlight; + onExited: infoGlyph.color = hifi.colors.lightGrayText; + onClicked: letterbox(hifi.glyphs.question, + "What is baking?", + "Baking compresses and optimizes files for faster network transfer and display. We recommend you bake your content to reduce initial load times for your visitors."); + } + } } HifiControls.TabletContentSection { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 36e5b3d859..a61c149b9c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -289,6 +289,10 @@ static QTimer locationUpdateTimer; static QTimer identityPacketTimer; static QTimer pingTimer; +static const QString DISABLE_WATCHDOG_FLAG("HIFI_DISABLE_WATCHDOG"); +static bool DISABLE_WATCHDOG = QProcessEnvironment::systemEnvironment().contains(DISABLE_WATCHDOG_FLAG); + + static const int MAX_CONCURRENT_RESOURCE_DOWNLOADS = 16; // For processing on QThreadPool, we target a number of threads after reserving some @@ -805,8 +809,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo nodeList->startThread(); // Set up a watchdog thread to intentionally crash the application on deadlocks - _deadlockWatchdogThread = new DeadlockWatchdogThread(); - _deadlockWatchdogThread->start(); + if (!DISABLE_WATCHDOG) { + (new DeadlockWatchdogThread())->start(); + } if (steamClient) { qCDebug(interfaceapp) << "[VERSION] SteamVR buildID:" << steamClient->getSteamVRBuildID(); @@ -1933,7 +1938,7 @@ void Application::showCursor(const Cursor::Icon& cursor) { } void Application::updateHeartbeat() const { - static_cast(_deadlockWatchdogThread)->updateHeartbeat(); + DeadlockWatchdogThread::updateHeartbeat(); } void Application::onAboutToQuit() { @@ -6379,7 +6384,7 @@ void Application::showAssetServerWidget(QString filePath) { if (!DependencyManager::get()->getThisNodeCanWriteAssets()) { return; } - static const QUrl url { "AssetServer.qml" }; + static const QUrl url { "hifi/AssetServer.qml" }; auto startUpload = [=](QQmlContext* context, QObject* newObject){ if (!filePath.isEmpty()) { diff --git a/interface/src/Application.h b/interface/src/Application.h index a706ce2b63..b0cac6bb87 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -650,8 +650,6 @@ private: Qt::CursorShape _desiredCursor{ Qt::BlankCursor }; bool _cursorNeedsChanging { false }; - QThread* _deadlockWatchdogThread; - std::map> _postUpdateLambdas; std::mutex _postUpdateLambdasLock; diff --git a/interface/src/scripting/AssetMappingsScriptingInterface.cpp b/interface/src/scripting/AssetMappingsScriptingInterface.cpp index 5031016c3f..5308be59bf 100644 --- a/interface/src/scripting/AssetMappingsScriptingInterface.cpp +++ b/interface/src/scripting/AssetMappingsScriptingInterface.cpp @@ -239,6 +239,7 @@ void AssetMappingModel::refresh() { connect(request, &GetAllMappingsRequest::finished, this, [this](GetAllMappingsRequest* request) mutable { if (request->getError() == MappingRequest::NoError) { + int numPendingBakes = 0; auto mappings = request->getMappings(); auto existingPaths = _pathToItemMap.keys(); for (auto& mapping : mappings) { @@ -287,6 +288,9 @@ void AssetMappingModel::refresh() { auto statusString = isFolder ? "--" : bakingStatusToString(mapping.second.status); lastItem->setData(statusString, Qt::UserRole + 5); lastItem->setData(mapping.second.bakingErrors, Qt::UserRole + 6); + if (mapping.second.status == Pending) { + ++numPendingBakes; + } } Q_ASSERT(fullPath == path); @@ -334,6 +338,11 @@ void AssetMappingModel::refresh() { item = nextItem; } } + + if (numPendingBakes != _numPendingBakes) { + _numPendingBakes = numPendingBakes; + emit numPendingBakesChanged(_numPendingBakes); + } } else { emit errorGettingMappings(request->getErrorString()); } @@ -364,4 +373,4 @@ void AssetMappingModel::setupRoles() { roleNames[Qt::DisplayRole] = "name"; roleNames[Qt::UserRole + 5] = "baked"; setItemRoleNames(roleNames); -} \ No newline at end of file +} diff --git a/interface/src/scripting/AssetMappingsScriptingInterface.h b/interface/src/scripting/AssetMappingsScriptingInterface.h index 04ab488838..1a4c7dae48 100644 --- a/interface/src/scripting/AssetMappingsScriptingInterface.h +++ b/interface/src/scripting/AssetMappingsScriptingInterface.h @@ -26,6 +26,7 @@ class AssetMappingModel : public QStandardItemModel { Q_OBJECT Q_PROPERTY(bool autoRefreshEnabled READ isAutoRefreshEnabled WRITE setAutoRefreshEnabled) + Q_PROPERTY(int numPendingBakes READ getNumPendingBakes NOTIFY numPendingBakesChanged) public: AssetMappingModel(); @@ -38,10 +39,13 @@ public: bool isKnownMapping(QString path) const { return _pathToItemMap.contains(path); } bool isKnownFolder(QString path) const; + int getNumPendingBakes() const { return _numPendingBakes; } + public slots: void clear(); signals: + void numPendingBakesChanged(int newCount); void errorGettingMappings(QString errorString); void updated(); @@ -50,6 +54,7 @@ private: QHash _pathToItemMap; QTimer _autoRefreshTimer; + int _numPendingBakes{ 0 }; }; Q_DECLARE_METATYPE(AssetMappingModel*) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 2260cea616..a2dac7ed43 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -97,6 +97,9 @@ static const bool HIFI_AUTOREFRESH_FILE_SCRIPTS { true }; Q_DECLARE_METATYPE(QScriptEngine::FunctionSignature) int functionSignatureMetaID = qRegisterMetaType(); +Q_DECLARE_METATYPE(ScriptEnginePointer) +int scriptEnginePointerMetaID = qRegisterMetaType(); + Q_LOGGING_CATEGORY(scriptengineScript, "hifi.scriptengine.script") static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine) {