From 08b07e57d0c2a1b27415dfa99c26fc498dd2736f Mon Sep 17 00:00:00 2001 From: Alexander Ivash Date: Thu, 20 Sep 2018 00:42:39 +0300 Subject: [PATCH 1/8] FB12459 - Keyboard shouldn't lower when move between property values in Create app in HMD mode --- .../resources/html/raiseAndLowerKeyboard.js | 9 +++++- .../qml/controls/FlickableWebViewCore.qml | 30 +++++++++++++++++-- .../qml/controls/TabletWebScreen.qml | 2 ++ .../resources/qml/controls/TabletWebView.qml | 2 ++ interface/resources/qml/controls/WebView.qml | 2 ++ 5 files changed, 41 insertions(+), 4 deletions(-) diff --git a/interface/resources/html/raiseAndLowerKeyboard.js b/interface/resources/html/raiseAndLowerKeyboard.js index f40c0d7376..8cdb3c2327 100644 --- a/interface/resources/html/raiseAndLowerKeyboard.js +++ b/interface/resources/html/raiseAndLowerKeyboard.js @@ -18,6 +18,11 @@ window.isKeyboardRaised = false; window.isNumericKeyboard = false; window.isPasswordField = false; + window.lastActiveElement = null; + + function getActiveElement() { + return document.activeElement; + } function shouldSetPasswordField() { var nodeType = document.activeElement.type; @@ -65,10 +70,11 @@ var keyboardRaised = shouldRaiseKeyboard(); var numericKeyboard = shouldSetNumeric(); var passwordField = shouldSetPasswordField(); + var activeElement = getActiveElement(); if (isWindowFocused && (keyboardRaised !== window.isKeyboardRaised || numericKeyboard !== window.isNumericKeyboard - || passwordField !== window.isPasswordField)) { + || passwordField !== window.isPasswordField || activeElement !== window.lastActiveElement)) { if (typeof EventBridge !== "undefined" && EventBridge !== null) { EventBridge.emitWebEvent( @@ -90,6 +96,7 @@ window.isKeyboardRaised = keyboardRaised; window.isNumericKeyboard = numericKeyboard; window.isPasswordField = passwordField; + window.lastActiveElement = activeElement; } }, POLL_FREQUENCY); diff --git a/interface/resources/qml/controls/FlickableWebViewCore.qml b/interface/resources/qml/controls/FlickableWebViewCore.qml index 943f15e1de..bc5883425f 100644 --- a/interface/resources/qml/controls/FlickableWebViewCore.qml +++ b/interface/resources/qml/controls/FlickableWebViewCore.qml @@ -34,10 +34,34 @@ Item { webViewCore.stop(); } + Timer { + id: delayedUnfocuser + repeat: false + interval: 200 + onTriggered: { + + // The idea behind this is to delay unfocusing, so that fast lower/raise will not result actual unfocusing. + // Fast lower/raise happens every time keyboard is being re-raised (see the code below in OffscreenQmlSurface::setKeyboardRaised) + // + // if (raised) { + // item->setProperty("keyboardRaised", QVariant(!raised)); + // } + // + // item->setProperty("keyboardRaised", QVariant(raised)); + // + + webViewCore.runJavaScript("if (document.activeElement) document.activeElement.blur();", function(result) { + console.log('unfocus completed: ', result); + }); + } + } + function unfocus() { - webViewCore.runJavaScript("if (document.activeElement) document.activeElement.blur();", function(result) { - console.log('unfocus completed: ', result); - }); + delayedUnfocuser.start(); + } + + function stopUnfocus() { + delayedUnfocuser.stop(); } function onLoadingChanged(loadRequest) { diff --git a/interface/resources/qml/controls/TabletWebScreen.qml b/interface/resources/qml/controls/TabletWebScreen.qml index bb037ad478..a33dc8a1d7 100644 --- a/interface/resources/qml/controls/TabletWebScreen.qml +++ b/interface/resources/qml/controls/TabletWebScreen.qml @@ -13,6 +13,8 @@ Item { onKeyboardRaisedChanged: { if(!keyboardRaised) { webroot.unfocus(); + } else { + webroot.stopUnfocus(); } } property bool punctuationMode: false diff --git a/interface/resources/qml/controls/TabletWebView.qml b/interface/resources/qml/controls/TabletWebView.qml index db695dbfb2..41127c2190 100644 --- a/interface/resources/qml/controls/TabletWebView.qml +++ b/interface/resources/qml/controls/TabletWebView.qml @@ -17,6 +17,8 @@ Item { onKeyboardRaisedChanged: { if(!keyboardRaised) { webroot.unfocus(); + } else { + webroot.stopUnfocus(); } } property bool punctuationMode: false diff --git a/interface/resources/qml/controls/WebView.qml b/interface/resources/qml/controls/WebView.qml index 71bf69fdc8..8e7e5493ae 100644 --- a/interface/resources/qml/controls/WebView.qml +++ b/interface/resources/qml/controls/WebView.qml @@ -15,6 +15,8 @@ Item { onKeyboardRaisedChanged: { if(!keyboardRaised) { webroot.unfocus(); + } else { + webroot.stopUnfocus(); } } property bool punctuationMode: false From ca4fe0682e1d555e4f492a6994115dd4ec4d3b91 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 13 Oct 2018 10:22:05 +1300 Subject: [PATCH 2/8] Fix collisionless entities not being able to be far grabbed --- scripts/system/controllers/controllerDispatcher.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/system/controllers/controllerDispatcher.js b/scripts/system/controllers/controllerDispatcher.js index db622a6724..417a2a49bb 100644 --- a/scripts/system/controllers/controllerDispatcher.js +++ b/scripts/system/controllers/controllerDispatcher.js @@ -425,7 +425,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); this.leftPointer = this.pointerManager.createPointer(false, PickType.Ray, { joint: "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND", - filter: Picks.PICK_OVERLAYS | Picks.PICK_ENTITIES, + filter: Picks.PICK_OVERLAYS | Picks.PICK_ENTITIES | Picks.PICK_INCLUDE_NONCOLLIDABLE, triggers: [{action: Controller.Standard.LTClick, button: "Focus"}, {action: Controller.Standard.LTClick, button: "Primary"}], posOffset: getGrabPointSphereOffset(Controller.Standard.LeftHand, true), hover: true, @@ -435,7 +435,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); }); this.rightPointer = this.pointerManager.createPointer(false, PickType.Ray, { joint: "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND", - filter: Picks.PICK_OVERLAYS | Picks.PICK_ENTITIES, + filter: Picks.PICK_OVERLAYS | Picks.PICK_ENTITIES | Picks.PICK_INCLUDE_NONCOLLIDABLE, triggers: [{action: Controller.Standard.RTClick, button: "Focus"}, {action: Controller.Standard.RTClick, button: "Primary"}], posOffset: getGrabPointSphereOffset(Controller.Standard.RightHand, true), hover: true, From 3bc4581f82fa3b9e7bf94007223f151c54190bc0 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 13 Oct 2018 10:22:27 +1300 Subject: [PATCH 3/8] Fix far grabbing collisionless entity removing collisionless property --- .../controllers/controllerModules/farActionGrabEntity.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/system/controllers/controllerModules/farActionGrabEntity.js b/scripts/system/controllers/controllerModules/farActionGrabEntity.js index 2e73526728..d9b63ad534 100644 --- a/scripts/system/controllers/controllerModules/farActionGrabEntity.js +++ b/scripts/system/controllers/controllerModules/farActionGrabEntity.js @@ -102,7 +102,6 @@ Script.include("/~/system/libraries/Xform.js"); this.potentialEntityWithContextOverlay = false; this.entityWithContextOverlay = false; this.contextOverlayTimer = false; - this.previousCollisionStatus = false; this.locked = false; this.highlightedEntity = null; this.reticleMinX = MARGIN; @@ -490,7 +489,8 @@ Script.include("/~/system/libraries/Xform.js"); var targetProps = Entities.getEntityProperties(entityID, [ "dynamic", "shapeType", "position", "rotation", "dimensions", "density", - "userData", "locked", "type", "href" + "userData", "locked", "type", "href", + "collisionless" ]); if (targetProps.href !== "") { AddressManager.handleLookupString(targetProps.href); @@ -543,7 +543,8 @@ Script.include("/~/system/libraries/Xform.js"); var selectionTargetProps = Entities.getEntityProperties(targetEntityID, [ "dynamic", "shapeType", "position", "rotation", "dimensions", "density", - "userData", "locked", "type", "href" + "userData", "locked", "type", "href", + "collisionless" ]); var selectionTargetObject = new TargetObject(targetEntityID, selectionTargetProps); From 7d3eca57bb4a721351162fbdc51ce67a5b875c9a Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 13 Oct 2018 10:22:41 +1300 Subject: [PATCH 4/8] Fix mouse pointer not recognizing or highlighting collisionless entities --- scripts/system/controllers/controllerDispatcher.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/controllers/controllerDispatcher.js b/scripts/system/controllers/controllerDispatcher.js index 417a2a49bb..f5bf0f8e4c 100644 --- a/scripts/system/controllers/controllerDispatcher.js +++ b/scripts/system/controllers/controllerDispatcher.js @@ -467,7 +467,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); }); this.mouseRayPick = Pointers.createPointer(PickType.Ray, { joint: "Mouse", - filter: Picks.PICK_ENTITIES | Picks.PICK_OVERLAYS, + filter: Picks.PICK_OVERLAYS | Picks.PICK_ENTITIES | Picks.PICK_INCLUDE_NONCOLLIDABLE, enabled: true }); this.handleHandMessage = function(channel, data, sender) { From 51d56ddf22ffd2cedb2ab26f9da6ffc981debf02 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 26 Oct 2018 12:17:04 +1300 Subject: [PATCH 5/8] Make tablet page indicators clickable to scroll tablet --- .../resources/qml/hifi/tablet/TabletHome.qml | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/interface/resources/qml/hifi/tablet/TabletHome.qml b/interface/resources/qml/hifi/tablet/TabletHome.qml index 1922b02f93..c2dd847821 100644 --- a/interface/resources/qml/hifi/tablet/TabletHome.qml +++ b/interface/resources/qml/hifi/tablet/TabletHome.qml @@ -251,17 +251,29 @@ Item { height: 15 Rectangle { + property bool isHovered: false anchors.centerIn: parent - opacity: index === pageIndicator.currentIndex ? 0.95 : 0.45 - implicitWidth: index === pageIndicator.currentIndex ? 15 : 10 + opacity: index === pageIndicator.currentIndex || isHovered ? 0.95 : 0.45 + implicitWidth: index === pageIndicator.currentIndex || isHovered ? 15 : 10 implicitHeight: implicitWidth radius: width/2 - color: "white" + color: isHovered && index !== pageIndicator.currentIndex ? "#1fc6a6" : "white" Behavior on opacity { OpacityAnimator { duration: 100 } } + + MouseArea { + anchors.centerIn: parent + width: 20 + height: 30 // Make it easier to target with laser. + hoverEnabled: true + enabled: true + onEntered: parent.isHovered = true; + onExited: parent.isHovered = false; + onClicked: swipeView.currentIndex = index; + } } } From 1a129335dd93d44253d3e11bcf77cc633a0f007e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 30 Oct 2018 19:57:07 +1300 Subject: [PATCH 6/8] Fix Goto app cards staying highlighted if move off dialog while dragging --- interface/resources/qml/hifi/Card.qml | 18 +++++++++++++----- interface/resources/qml/hifi/Feed.qml | 2 ++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/interface/resources/qml/hifi/Card.qml b/interface/resources/qml/hifi/Card.qml index 83bf1e2c54..e848dcd862 100644 --- a/interface/resources/qml/hifi/Card.qml +++ b/interface/resources/qml/hifi/Card.qml @@ -49,6 +49,7 @@ Item { property string defaultThumbnail: Qt.resolvedUrl("../../images/default-domain.gif"); property int shadowHeight: 10; property bool hovered: false + property bool scrolling: false HifiConstants { id: hifi } @@ -236,11 +237,12 @@ Item { property var hoverThunk: function () { }; property var unhoverThunk: function () { }; Rectangle { - anchors.fill: parent; - visible: root.hovered - color: "transparent"; - border.width: 4; border.color: hifiStyleConstants.colors.primaryHighlight; - z: 1; + anchors.fill: parent + visible: root.hovered && !root.scrolling + color: "transparent" + border.width: 4 + border.color: hifiStyleConstants.colors.primaryHighlight + z: 1 } MouseArea { anchors.fill: parent; @@ -255,6 +257,12 @@ Item { hoverThunk(); } onExited: unhoverThunk(); + onCanceled: unhoverThunk(); + } + MouseArea { + // This second mouse area causes onEntered to fire on the first if you scroll just a little and the cursor stays on + // the original card. I.e., the original card is re-highlighted if the cursor is on it after scrolling finishes. + anchors.fill: parent } StateImage { id: actionIcon; diff --git a/interface/resources/qml/hifi/Feed.qml b/interface/resources/qml/hifi/Feed.qml index 346481fe1f..a8337530c6 100644 --- a/interface/resources/qml/hifi/Feed.qml +++ b/interface/resources/qml/hifi/Feed.qml @@ -141,6 +141,8 @@ Column { textSizeSmall: root.textSizeSmall; stackShadowNarrowing: root.stackShadowNarrowing; shadowHeight: root.stackedCardShadowHeight; + scrolling: scroll.moving + hoverThunk: function () { hovered = true; if(root.autoScrollTimerEnabled) { From ae2715af31f5469f1cacac45dc175a541d84a08a Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 1 Nov 2018 08:57:12 +1300 Subject: [PATCH 7/8] Add option to start up at home location --- interface/src/Application.cpp | 12 +++++++++++- interface/src/Menu.cpp | 8 ++++++++ interface/src/Menu.h | 3 +++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7cd91d76a0..04d3a07ad4 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3503,7 +3503,17 @@ void Application::handleSandboxStatus(QNetworkReply* reply) { } else { #if !defined(Q_OS_ANDROID) - qCDebug(interfaceapp) << "Not first run... going to" << qPrintable(addressLookupString.isEmpty() ? QString("previous location") : addressLookupString); + QString goingTo = ""; + if (addressLookupString.isEmpty()) { + if (Menu::getInstance()->isOptionChecked(MenuOption::HomeLocation)) { + auto locationBookmarks = DependencyManager::get(); + addressLookupString = locationBookmarks->addressForBookmark(LocationBookmarks::HOME_BOOKMARK); + goingTo = "home location"; + } else { + goingTo = "previous location"; + } + } + qCDebug(interfaceapp) << "Not first run... going to" << qPrintable(!goingTo.isEmpty() ? goingTo : addressLookupString); DependencyManager::get()->loadSettings(addressLookupString); sentTo = SENT_TO_PREVIOUS_LOCATION; #endif diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 539bdabe7d..df6de25118 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -226,6 +226,14 @@ Menu::Menu() { addActionToQMenuAndActionHash(navigateMenu, MenuOption::CopyPath, 0, addressManager.data(), SLOT(copyPath())); + // Navigate > Start-up Location + MenuWrapper* startupLocationMenu = navigateMenu->addMenu(MenuOption::StartUpLocation); + QActionGroup* startupLocatiopnGroup = new QActionGroup(startupLocationMenu); + startupLocatiopnGroup->setExclusive(true); + startupLocatiopnGroup->addAction(addCheckableActionToQMenuAndActionHash(startupLocationMenu, MenuOption::HomeLocation, 0, + false)); + startupLocatiopnGroup->addAction(addCheckableActionToQMenuAndActionHash(startupLocationMenu, MenuOption::LastLocation, 0, + true)); // Settings menu ---------------------------------- MenuWrapper* settingsMenu = addMenu("Settings"); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 1e9955a760..885ef08ce9 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -117,9 +117,11 @@ namespace MenuOption { const QString FrameTimer = "Show Timer"; const QString FullscreenMirror = "Mirror"; const QString Help = "Help..."; + const QString HomeLocation = "Home"; const QString IncreaseAvatarSize = "Increase Avatar Size"; const QString IndependentMode = "Independent Mode"; const QString ActionMotorControl = "Enable Default Motor Control"; + const QString LastLocation = "Last Location"; const QString LoadScript = "Open and Run Script File..."; const QString LoadScriptURL = "Open and Run Script from URL..."; const QString LodTools = "LOD Tools"; @@ -197,6 +199,7 @@ namespace MenuOption { const QString SimulateEyeTracking = "Simulate"; const QString SMIEyeTracking = "SMI Eye Tracking"; const QString SparseTextureManagement = "Enable Sparse Texture Management"; + const QString StartUpLocation = "Start-Up Location"; const QString Stats = "Show Statistics"; const QString AnimStats = "Show Animation Stats"; const QString StopAllScripts = "Stop All Scripts"; From f88168bdfb34e2db081795f183272de294caa63a Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 6 Nov 2018 17:29:02 -0800 Subject: [PATCH 8/8] Send avatar-joint translations at world scale --- libraries/animation/src/Rig.cpp | 12 ++++++++---- libraries/networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index c2f909dd24..223305cf47 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -1927,6 +1927,7 @@ AnimPose Rig::getJointPose(int jointIndex) const { void Rig::copyJointsIntoJointData(QVector& jointDataVec) const { const AnimPose geometryToRigPose(_geometryToRigTransform); + const glm::vec3 geometryToRigScale(geometryToRigPose.scale()); jointDataVec.resize((int)getJointStateCount()); for (auto i = 0; i < jointDataVec.size(); i++) { @@ -1939,9 +1940,10 @@ void Rig::copyJointsIntoJointData(QVector& jointDataVec) const { // translations are in relative frame but scaled so that they are in meters, // instead of model units. - glm::vec3 defaultRelTrans = _geometryOffset.scale() * _animSkeleton->getRelativeDefaultPose(i).trans(); - data.translation = _geometryOffset.scale() * (!_sendNetworkNode ? _internalPoseSet._relativePoses[i].trans() : _networkPoseSet._relativePoses[i].trans()); - data.translationIsDefaultPose = isEqual(data.translation, defaultRelTrans); + glm::vec3 defaultRelTrans = _animSkeleton->getRelativeDefaultPose(i).trans(); + glm::vec3 currentRelTrans = _sendNetworkNode ? _networkPoseSet._relativePoses[i].trans() : _internalPoseSet._relativePoses[i].trans(); + data.translation = geometryToRigScale * currentRelTrans; + data.translationIsDefaultPose = isEqual(currentRelTrans, defaultRelTrans); } else { data.translationIsDefaultPose = true; data.rotationIsDefaultPose = true; @@ -1967,6 +1969,8 @@ void Rig::copyJointsFromJointData(const QVector& jointDataVec) { std::vector rotations; rotations.reserve(numJoints); const glm::quat rigToGeometryRot(glmExtractRotation(_rigToGeometryTransform)); + const glm::vec3 rigToGeometryScale(extractScale(_rigToGeometryTransform)); + for (int i = 0; i < numJoints; i++) { const JointData& data = jointDataVec.at(i); if (data.rotationIsDefaultPose) { @@ -1992,7 +1996,7 @@ void Rig::copyJointsFromJointData(const QVector& jointDataVec) { _internalPoseSet._relativePoses[i].trans() = relativeDefaultPoses[i].trans(); } else { // JointData translations are in scaled relative-frame so we scale back to regular relative-frame - _internalPoseSet._relativePoses[i].trans() = _invGeometryOffset.scale() * data.translation; + _internalPoseSet._relativePoses[i].trans() = rigToGeometryScale * data.translation; } } } diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 9eed463d2d..18e439aa77 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -40,7 +40,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::AvatarData: case PacketType::BulkAvatarData: case PacketType::KillAvatar: - return static_cast(AvatarMixerPacketVersion::FarGrabJointsRedux); + return static_cast(AvatarMixerPacketVersion::JointTransScaled); case PacketType::MessagesData: return static_cast(MessageDataVersion::TextOrBinaryData); // ICE packets diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 37a4b32940..8d734c1043 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -297,7 +297,8 @@ enum class AvatarMixerPacketVersion : PacketVersion { FarGrabJoints, MigrateSkeletonURLToTraits, MigrateAvatarEntitiesToTraits, - FarGrabJointsRedux + FarGrabJointsRedux, + JointTransScaled }; enum class DomainConnectRequestVersion : PacketVersion {