diff --git a/.github/workflows/master_build.yml b/.github/workflows/master_build.yml index 3d87061b09..499f317f80 100644 --- a/.github/workflows/master_build.yml +++ b/.github/workflows/master_build.yml @@ -13,13 +13,13 @@ on: env: APP_NAME: interface BUILD_TYPE: Release - BUILD_NUMBER: ${{ github.run_number }} + BUILD_NUMBER: ${{ github.event.number }}_${{ github.sha }} CI_BUILD: Github GIT_COMMIT: ${{ github.sha }} # VCPKG did not build well on OSX disabling HIFI_VCPKG_BOOTSTRAP, which invokes a download to a working version of vcpkg # HIFI_VCPKG_BOOTSTRAP: true RELEASE_TYPE: PRODUCTION - RELEASE_NUMBER: ${{ github.run_number }} + RELEASE_NUMBER: ${{ github.event.number }}_${{ github.sha }} STABLE_BUILD: 0 UPLOAD_BUCKET: overte-public UPLOAD_REGION: fra1 @@ -108,7 +108,7 @@ jobs: # Build type variables if [ "${{ matrix.build_type }}" = "full" ]; then echo "CLIENT_ONLY=FALSE" >> $GITHUB_ENV - echo "INSTALLER=Overte-master$BUILD_NUMBER-${{ steps.buildenv1.outputs.github_sha_short }}.$INSTALLER_EXT" >> $GITHUB_ENV + echo "INSTALLER=Overte-${{ github.event.number }}_${{ github.sha }}.$INSTALLER_EXT" >> $GITHUB_ENV else echo "CLIENT_ONLY=TRUE" >> $GITHUB_ENV echo "INSTALLER=Overte-Interface-master$BUILD_NUMBER-${{ steps.buildenv1.outputs.github_sha_short }}.$INSTALLER_EXT" >> $GITHUB_ENV @@ -247,8 +247,8 @@ jobs: - name: Upload artifact to GitHub uses: actions/upload-artifact@v4 with: - name: ${{ env.ARTIFACT_PATTERN }} - path: ./build/${{ env.ARTIFACT_PATTERN }} + name: ${{ env.INSTALLER }} + path: ${{runner.workspace}}/build/${{ env.INSTALLER }} if-no-files-found: error #- name: Archive symbols diff --git a/.gitignore b/.gitignore index c3cb03f201..90ff187027 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ cmake-build-release-visual-studio/ cmake-build-relwithdebinfo-visual-studio/ cmake-build-debug-visual-studio/ cmake-build-debug/ +/cmake-build-*/ /release*/ /debug*/ /gprof*/ diff --git a/interface/resources/icons/tablet-icons/avatar-a.svg b/interface/resources/icons/tablet-icons/avatar-a.svg index 065ad4fc6f..8cb3b4d342 100644 --- a/interface/resources/icons/tablet-icons/avatar-a.svg +++ b/interface/resources/icons/tablet-icons/avatar-a.svg @@ -1,14 +1,72 @@ - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/interface/resources/icons/tablet-icons/avatar-i.svg b/interface/resources/icons/tablet-icons/avatar-i.svg index 2d3f80cbf8..20e2709257 100644 --- a/interface/resources/icons/tablet-icons/avatar-i.svg +++ b/interface/resources/icons/tablet-icons/avatar-i.svg @@ -1,17 +1,85 @@ - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/interface/resources/images/avatarapp/guy-in-circle.svg b/interface/resources/images/avatarapp/guy-in-circle.svg index 78cbf5186b..ebeb09392e 100644 --- a/interface/resources/images/avatarapp/guy-in-circle.svg +++ b/interface/resources/images/avatarapp/guy-in-circle.svg @@ -1,20 +1,70 @@ - - - - - - - + + + + + + + + diff --git a/interface/resources/qml/hifi/avatarapp/AvatarAppHeader.qml b/interface/resources/qml/hifi/avatarapp/AvatarAppHeader.qml index d3c9cd1d5f..bf8282f947 100644 --- a/interface/resources/qml/hifi/avatarapp/AvatarAppHeader.qml +++ b/interface/resources/qml/hifi/avatarapp/AvatarAppHeader.qml @@ -20,16 +20,6 @@ ShadowRectangle { color: style.colors.lightGrayBackground - HiFiGlyphs { - id: avatarIcon - anchors.left: parent.left - anchors.leftMargin: 23 - anchors.verticalCenter: header.verticalCenter - - size: 38 - text: "<" - } - // TextStyle6 RalewaySemiBold { id: title diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 8d1b923db6..78ba7dbde8 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -46,6 +46,7 @@ #include "avatar/AvatarManager.h" #include "avatar/AvatarPackager.h" #include "AvatarBookmarks.h" +#include #include "DomainAccountManager.h" #include "MainWindow.h" #include "render/DrawStatus.h" @@ -546,6 +547,13 @@ Menu::Menu() { drawStatusConfig, SLOT(setShowFade(bool))); } + { + action = addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::ExtraLinearTosRGBConversion, 0, OpenGLDisplayPlugin::getExtraLinearToSRGBConversion()); + connect(action, &QAction::triggered, [action] { + OpenGLDisplayPlugin::setExtraLinearToSRGBConversion(action->isChecked()); + }); + } + // Developer > Assets >>> // Menu item is not currently needed but code should be kept in case it proves useful again at some stage. //#define WANT_ASSET_MIGRATION diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 4eb985cf8c..61b028269e 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -237,7 +237,8 @@ namespace MenuOption { const QString ComputeBlendshapes = "Compute Blendshapes"; const QString HighlightTransitions = "Highlight Transitions"; const QString MaterialProceduralShaders = "Enable Procedural Materials"; -} + const QString ExtraLinearTosRGBConversion = "Extra Linear to sRGB Conversion"; + } #endif // hifi_Menu_h diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp index 024d9a0ab6..97c73603e1 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp @@ -112,14 +112,6 @@ bool Basic2DWindowOpenGLDisplayPlugin::internalActivate() { return Parent::internalActivate(); } -gpu::PipelinePointer Basic2DWindowOpenGLDisplayPlugin::getRenderTexturePipeline() { -#if defined(Q_OS_ANDROID) - return _linearToSRGBPipeline; -#else - return _drawTexturePipeline; -#endif -} - void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() { #if defined(Q_OS_ANDROID) auto& virtualPadManager = VirtualPad::Manager::instance(); diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h index 68301ff8b4..cc304c19c2 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h @@ -37,8 +37,6 @@ public: virtual void pluginUpdate() override {}; - virtual gpu::PipelinePointer getRenderTexturePipeline() override; - protected: mutable bool _isThrottled = false; diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 47f22dfaee..00771927fb 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -57,6 +58,8 @@ using namespace shader::gpu::program; extern QThread* RENDER_THREAD; +Setting::Handle OpenGLDisplayPlugin::_extraLinearToSRGBConversionSetting("extraLinearToSRGBConversion", false); + class PresentThread : public QThread, public Dependency { using Mutex = std::mutex; using Condition = std::condition_variable; @@ -956,5 +959,16 @@ void OpenGLDisplayPlugin::copyTextureToQuickFramebuffer(NetworkTexturePointer ne } gpu::PipelinePointer OpenGLDisplayPlugin::getRenderTexturePipeline() { - return _drawTexturePipeline; +#ifdef USE_GLES + if (!_extraLinearToSRGBConversionSetting.isSet()) { + const gl::ContextInfo &contextInfo = gl::ContextInfo::get(); + _extraLinearToSRGBConversionSetting.set(std::find(contextInfo.extensions.cbegin(), contextInfo.extensions.cend(), "GL_EXT_framebuffer_sRGB") == contextInfo.extensions.cend()); + } +#endif + + if (getExtraLinearToSRGBConversion()) { + return _linearToSRGBPipeline; + } else { + return _drawTexturePipeline; + } } diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index 15cebf7e3a..0df0d9ac3e 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -86,6 +87,9 @@ public: QOpenGLFramebufferObject* target, GLsync* fenceSync) override; + static void setExtraLinearToSRGBConversion(bool value) { _extraLinearToSRGBConversionSetting.set(value); } + static bool getExtraLinearToSRGBConversion() { return _extraLinearToSRGBConversionSetting.get(); }; + protected: friend class PresentThread; @@ -201,4 +205,7 @@ protected: QImage getScreenshot(float aspectRatio); QImage getSecondaryCameraScreenshot(); + +private: + static Setting::Handle _extraLinearToSRGBConversionSetting; }; diff --git a/scripts/communityScripts/armored-chat/armored_chat.qml b/scripts/communityScripts/armored-chat/armored_chat.qml index ede60fca71..d1e46f57a6 100644 --- a/scripts/communityScripts/armored-chat/armored_chat.qml +++ b/scripts/communityScripts/armored-chat/armored_chat.qml @@ -487,13 +487,17 @@ Rectangle { var last_item_index = channel.count - 1; var last_item = channel.get(last_item_index); - if (last_message_user === username && elapsed_minutes < 1 && last_item){ - message = "
" + message - last_item.text = last_item.text += "\n" + message; - scrollToBottom() - last_message_time = new Date(); - return; - } + // FIXME: When adding a new message this would check to see if we could append the incoming message + // to the bottom of the last message. This current implimentation causes issues with scrollToBottom() + // Specifically, scrolling to the bottom does not like image embeds. + // This needs to be reworked entirely before it can be reimplimented + // if (last_message_user === username && elapsed_minutes < 1 && last_item){ + // message = "
" + message + // last_item.text = last_item.text += "\n" + message; + // scrollToBottom() + // last_message_time = new Date(); + // return; + // } last_message_user = username; last_message_time = new Date(); @@ -510,7 +514,7 @@ Rectangle { mess = mess.replace(arrow, "<"); var link = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/g; - mess = mess.replace(link, (match) => {return `` + match + ` `}); + mess = mess.replace(link, (match) => {return `` + match + ` 🗗`}); var newline = /\n/gi; mess = mess.replace(newline, "
"); diff --git a/scripts/communityScripts/notificationCore/notificationCore.js b/scripts/communityScripts/notificationCore/notificationCore.js index 51e1eadde1..f7ab6e73cd 100644 --- a/scripts/communityScripts/notificationCore/notificationCore.js +++ b/scripts/communityScripts/notificationCore/notificationCore.js @@ -21,6 +21,8 @@ var DEFAULT_SIZE = 30; var DEFAULT_OFFSET = 10; var FLOOF_NOTIFICATION_CHANNEL = "Floof-Notif"; var MAIN_CHAT_APP_CHANNEL = "Chat"; +var ARROW_REGEX = /\= 0; i--) { if (i === 0) { diff --git a/scripts/defaultScripts.js b/scripts/defaultScripts.js index a9bc2be591..31afd6e2db 100644 --- a/scripts/defaultScripts.js +++ b/scripts/defaultScripts.js @@ -37,7 +37,6 @@ var DEFAULT_SCRIPTS_COMBINED = [ "system/inspect.js", "system/keyboardShortcuts/keyboardShortcuts.js", "system/onEscape.js", - "system/onFirstRun.js", "system/places/places.js" //"developer/debugging/scriptMemoryReport.js" ]; diff --git a/scripts/system/create/entityList/entityList.js b/scripts/system/create/entityList/entityList.js index a5c58a7bcd..9a1df1f76f 100644 --- a/scripts/system/create/entityList/entityList.js +++ b/scripts/system/create/entityList/entityList.js @@ -210,8 +210,8 @@ var EntityListTool = function(shouldUseEditTabletApp, selectionManager) { var cameraPosition = Camera.position; PROFILE("getMultipleProperties", function () { var multipleProperties = Entities.getMultipleEntityProperties(ids, ['position', 'name', 'type', 'locked', - 'visible', 'renderInfo', 'modelURL', 'materialURL', 'imageURL', 'script', 'serverScripts', - 'skybox.url', 'ambientLight.url', 'soundURL', 'created', 'lastEdited']); + 'visible', 'renderInfo', 'modelURL', 'materialURL', 'imageURL', 'script', 'serverScripts', + 'skybox.url', 'ambientLight.url', 'soundURL', 'created', 'lastEdited', 'entityHostType']); for (var i = 0; i < multipleProperties.length; i++) { var properties = multipleProperties[i]; @@ -258,7 +258,8 @@ var EntityListTool = function(shouldUseEditTabletApp, selectionManager) { hasScript: (properties.script !== "" || properties.serverScripts !== ""), parentState: parentState, created: formatToStringDateTime(properties.created), - lastEdited: formatToStringDateTime(properties.lastEdited) + lastEdited: formatToStringDateTime(properties.lastEdited), + entityHostType: properties.entityHostType }); } } diff --git a/scripts/system/create/entityList/html/js/entityList.js b/scripts/system/create/entityList/html/js/entityList.js index d25bf54079..a642c9e722 100644 --- a/scripts/system/create/entityList/html/js/entityList.js +++ b/scripts/system/create/entityList/html/js/entityList.js @@ -989,6 +989,7 @@ function loaded() { parentState: entity.parentState, created: entity.created, lastEdited: entity.lastEdited, + entityHostType: entity.entityHostType, elRow: null, // if this entity has a visible row element assigned to it selected: false // if this entity is selected for edit regardless of having a visible row }; @@ -1185,7 +1186,11 @@ function loaded() { if (entity !== undefined) { entity.selected = false; if (entity.elRow) { - entity.elRow.className = ""; + if (entity.entityHostType === "avatar") { + entity.elRow.className = "avatarEntity"; + } else { + entity.elRow.className = ""; + } } } }); @@ -1199,9 +1204,17 @@ function loaded() { entity.selected = true; if (entity.elRow) { if (id === lastSelectedEntity) { - entity.elRow.className = "last-selected"; + if (entity.entityHostType === "avatar") { + entity.elRow.className = "lastSelAvatarEntity"; + } else { + entity.elRow.className = "last-selected"; + } } else { - entity.elRow.className = "selected"; + if (entity.entityHostType === "avatar") { + entity.elRow.className = "selAvatarEntity"; + } else { + entity.elRow.className = "selected"; + } } } } else { @@ -1272,12 +1285,24 @@ function loaded() { // if this entity was previously selected flag it's row as selected if (itemData.selected) { if (itemData.id === lastSelectedEntity) { - elRow.className = "last-selected"; + if (itemData.entityHostType === "avatar") { + elRow.className = "lastSelAvatarEntity"; + } else { + elRow.className = "last-selected"; + } } else { - elRow.className = "selected"; + if (itemData.entityHostType === "avatar") { + elRow.className = "selAvatarEntity"; + } else { + elRow.className = "selected"; + } } } else { - elRow.className = ""; + if (itemData.entityHostType === "avatar") { + elRow.className = "avatarEntity"; + } else { + elRow.className = ""; + } } // if this row previously had an associated entity ID that wasn't the new entity ID then clear diff --git a/scripts/system/create/entityProperties/html/js/entityProperties.js b/scripts/system/create/entityProperties/html/js/entityProperties.js index 20f34ba8b8..8eab673e31 100644 --- a/scripts/system/create/entityProperties/html/js/entityProperties.js +++ b/scripts/system/create/entityProperties/html/js/entityProperties.js @@ -15,6 +15,10 @@ var currentTab = "base"; const DEGREES_TO_RADIANS = Math.PI / 180.0; +const ENTITY_HOST_TYPE_COLOR_DOMAIN = "#afafaf"; +const ENTITY_HOST_TYPE_COLOR_AVATAR = "#7fdb98"; +const ENTITY_HOST_TYPE_COLOR_LOCAL = "#f0d769"; + const NO_SELECTION = ","; const PROPERTY_SPACE_MODE = Object.freeze({ @@ -2675,6 +2679,11 @@ function updateMultiDiffProperties(propertiesMapToUpdate, onlyUpdateEntity) { function createEmitTextPropertyUpdateFunction(property) { return function() { + // If we don't have canViewAssetURLs permissions, ignore clearing URLs + if (!canViewAssetURLs && property.data.placeholder === "URL" && this.value === "") { + return; + } + property.elInput.classList.remove('multi-diff'); updateProperty(property.name, this.value, property.isParticleProperty); }; @@ -4875,6 +4884,8 @@ function handleEntitySelectionUpdate(selections, isPropertiesToolUpdate) { disableProperties(); } else { + let entityHostType = selections[0].properties.entityHostType; + if (!isPropertiesToolUpdate && !hasSelectedEntityChanged && document.hasFocus()) { // in case the selection has not changed and we still have focus on the properties page, // we will ignore the event. @@ -4961,9 +4972,31 @@ function handleEntitySelectionUpdate(selections, isPropertiesToolUpdate) { property.elInput.classList.add('multi-diff'); property.elInput.value = ""; } + if (propertyName === "id") { + property.elInput.style.color = ENTITY_HOST_TYPE_COLOR_DOMAIN; + } } else { property.elInput.classList.remove('multi-diff'); property.elInput.value = propertyValue; + if (propertyName === "name" || propertyName === "id") { + if (selections.length === 1) { + switch (entityHostType) { + case "domain": + property.elInput.style.color = ENTITY_HOST_TYPE_COLOR_DOMAIN; + break; + case "avatar": + property.elInput.style.color = ENTITY_HOST_TYPE_COLOR_AVATAR; + break; + case "local": + property.elInput.style.color = ENTITY_HOST_TYPE_COLOR_LOCAL; + break; + default: + property.elInput.style.color = ENTITY_HOST_TYPE_COLOR_DOMAIN; + } + } else { + property.elInput.style.color = ENTITY_HOST_TYPE_COLOR_DOMAIN; + } + } } break; } diff --git a/scripts/system/create/qml/NewMaterialDialog.qml b/scripts/system/create/qml/NewMaterialDialog.qml index ab61bc05a2..423afe4b18 100644 --- a/scripts/system/create/qml/NewMaterialDialog.qml +++ b/scripts/system/create/qml/NewMaterialDialog.qml @@ -2,9 +2,10 @@ // NewMaterialDialog.qml // qml/hifi // -// Created by Sam Gondelman on 1/17/18 +// Created by Sam Gondelman on January 17th, 2018 // Copyright 2018 High Fidelity, Inc. // Copyright 2020 Vircadia contributors +// Copyright 2024 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -54,17 +55,32 @@ Rectangle { Text { id: text1 - text: qsTr("Material URL (Optional)") + text: qsTr("Material URL (Optional)   ") color: "#ffffff" font.pixelSize: 12 } + Button { + id: pasteBtn + text: "Paste" + font.pixelSize: 11 + height: 16 + width: 40 + radius: 4 + anchors.top: text1.top + anchors.left: text1.right + anchors.bottom: text1.bottom + onClicked: { + materialURL.paste() + } + } + TextInput { id: materialURL height: 20 text: qsTr("") color: "white" - anchors.top: text1.bottom + anchors.top: pasteBtn.bottom anchors.topMargin: 5 anchors.left: parent.left anchors.leftMargin: 0 diff --git a/scripts/system/create/qml/NewModelDialog.qml b/scripts/system/create/qml/NewModelDialog.qml index 8df6bad33f..ad70f47085 100644 --- a/scripts/system/create/qml/NewModelDialog.qml +++ b/scripts/system/create/qml/NewModelDialog.qml @@ -2,9 +2,10 @@ // NewModelDialog.qml // qml/hifi // -// Created by Seth Alves on 2017-2-10 +// Created by Seth Alves on February 10th, 2017 // Copyright 2017 High Fidelity, Inc. // Copyright 2020 Vircadia contributors +// Copyright 2024 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -54,17 +55,30 @@ Rectangle { Text { id: text1 - text: qsTr("Model URL (.fbx, .fst, .glb, .gltf, .obj, .gz)") + text: qsTr("Model URL (.fbx, .fst, .glb, .gltf, .obj, .gz)   ") color: "#ffffff" font.pixelSize: 12 } - + Button { + id: pasteBtn + text: "Paste" + font.pixelSize: 11 + height: 16 + width: 40 + radius: 4 + anchors.top: text1.top + 10 + anchors.left: text1.right + anchors.bottom: text1.bottom + onClicked: { + modelURL.paste() + } + } TextInput { id: modelURL height: 20 text: qsTr("") color: "white" - anchors.top: text1.bottom + anchors.top: pasteBtn.bottom anchors.topMargin: 5 anchors.left: parent.left anchors.leftMargin: 0 diff --git a/scripts/system/create/qml/NewPolyVoxDialog.qml b/scripts/system/create/qml/NewPolyVoxDialog.qml index c10b32840b..97e3f9d341 100644 --- a/scripts/system/create/qml/NewPolyVoxDialog.qml +++ b/scripts/system/create/qml/NewPolyVoxDialog.qml @@ -1,12 +1,12 @@ // // NewPolyVoxDialog.qml -// Created by dr Karol Suprynowicz on 2022.05.17. +// Created by dr Karol Suprynowicz on May 17th, 2022 // based on NewModelDialog.qml // qml/hifi // // Copyright 2017 High Fidelity, Inc. // Copyright 2020 Vircadia contributors -// Copyright 2022 Overte e.V. +// Copyright 2022-2024 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -116,17 +116,32 @@ Rectangle { id: text1 anchors.top: texturePreset.bottom anchors.topMargin: 5 - text: qsTr("X Texture URL") + text: qsTr("X Texture URL    ") color: "#ffffff" font.pixelSize: 12 } + Button { + id: pasteBtn1 + text: "Paste" + font.pixelSize: 11 + height: 16 + width: 40 + radius: 4 + anchors.top: text1.top + anchors.left: text1.right + anchors.bottom: text1.bottom + onClicked: { + xTextureURL.paste() + } + } + TextInput { id: xTextureURL height: 20 text: qsTr("") color: "white" - anchors.top: text1.bottom + anchors.top: pasteBtn1.bottom anchors.topMargin: 5 anchors.left: parent.left anchors.leftMargin: 0 @@ -166,19 +181,33 @@ Rectangle { Text { id: text2 - text: qsTr("Y Texture URL") + text: qsTr("Y Texture URL    ") color: "#ffffff" font.pixelSize: 12 anchors.top: textInputBox1.bottom anchors.topMargin: 5 } + Button { + id: pasteBtn2 + text: "Paste" + font.pixelSize: 11 + height: 16 + width: 40 + radius: 4 + anchors.top: text2.top + anchors.left: text2.right + anchors.bottom: text2.bottom + onClicked: { + yTextureURL.paste() + } + } TextInput { id: yTextureURL height: 20 text: qsTr("") color: "white" - anchors.top: text2.bottom + anchors.top: pasteBtn2.bottom anchors.topMargin: 5 anchors.left: parent.left anchors.leftMargin: 0 @@ -218,19 +247,33 @@ Rectangle { Text { id: text3 - text: qsTr("Z Texture URL") + text: qsTr("Z Texture URL    ") color: "#ffffff" font.pixelSize: 12 anchors.top: textInputBox2.bottom anchors.topMargin: 5 } + Button { + id: pasteBtn3 + text: "Paste" + font.pixelSize: 11 + height: 16 + width: 40 + radius: 4 + anchors.top: text3.top + anchors.left: text3.right + anchors.bottom: text3.bottom + onClicked: { + zTextureURL.paste() + } + } TextInput { id: zTextureURL height: 20 text: qsTr("") color: "white" - anchors.top: text3.bottom + anchors.top: pasteBtn3.bottom anchors.topMargin: 5 anchors.left: parent.left anchors.leftMargin: 0 diff --git a/scripts/system/html/css/edit-style.css b/scripts/system/html/css/edit-style.css index 27f1ce23f3..3ec78eb6cc 100644 --- a/scripts/system/html/css/edit-style.css +++ b/scripts/system/html/css/edit-style.css @@ -175,6 +175,28 @@ tr:focus { outline: none; } +tr.avatarEntity { + color: #7fdb98; +} + +tr.selAvatarEntity { + color: #000000; + background-color: #7fdb98; +} + +tr.selAvatarEntity + tr.selAvatarEntity { + border-top: 1px solid #2e2e2e; +} + +tr.lastSelAvatarEntity { + color: #000000; + background-color: #06c73a; +} + +tr.lastSelAvatarEntity + tr.lastSelAvatarEntity { + border-top: 1px solid #2e2e2e; +} + tr.selected { color: #000000; background-color: #00b4ef; diff --git a/scripts/system/onFirstRun.js b/scripts/system/onFirstRun.js deleted file mode 100644 index e7052c0e3a..0000000000 --- a/scripts/system/onFirstRun.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -// -// onFirstRun.js -// -// Created by Kalila L. on Oct 5 2020. -// Copyright 2020 Vircadia contributors. -// -// This script triggers on first run to perform bootstrapping actions. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -(function() { // BEGIN LOCAL_SCOPE - // Check to see if we should run this script or bail... - var SETTING_TO_CHECK = 'firstRun'; - var DEFAULT_DISPLAY_NAME = ''; - - if (!Settings.getValue(SETTING_TO_CHECK, false)) { - return; - } - - // If this is our first run, then proceed... - - if (MyAvatar.displayName === '') { - var selectedDisplayName = Window.prompt('Enter a display name.', MyAvatar.displayName); - - if (selectedDisplayName === '') { - MyAvatar.displayName = DEFAULT_DISPLAY_NAME; - } else { - MyAvatar.displayName = selectedDisplayName; - } - } -}());