Unified · Split
| @@ -10,14 +10,11 @@ · 9 unmodified lines | |||
| 10 | - [cmake](https://cmake.org/download/): 3.9 | 10 | - [cmake](https://cmake.org/download/): 3.9 |
| 11 | - [Qt](https://www.qt.io/download-open-source): 5.10.1 | 11 | - [Qt](https://www.qt.io/download-open-source): 5.10.1 |
| 12 | - [Python](https://www.python.org/downloads/): 3.6 or higher | 12 | - [Python](https://www.python.org/downloads/): 3.6 or higher |
| 13 | - [OpenSSL](https://www.openssl.org/): Use the latest available 1.0 version (**NOT** 1.1) of OpenSSL to avoid security vulnerabilities. | ||
| 14 | - [VHACD](https://github.com/virneo/v-hacd)(clone this repository)(Optional) | ||
| 15 | 13 | ||
| 16 | ### CMake External Project Dependencies | 14 | ### CMake External Project Dependencies |
| 17 | 15 | ||
| 18 | These dependencies need not be installed manually. They are automatically downloaded on the platforms where they are required. | 16 | These dependencies need not be installed manually. They are automatically downloaded on the platforms where they are required. |
| 19 | - [Bullet Physics Engine](https://github.com/bulletphysics/bullet3/releases): 2.83 | 17 | - [Bullet Physics Engine](https://github.com/bulletphysics/bullet3/releases): 2.83 |
| 20 | - [GLEW](http://glew.sourceforge.net/): 1.13 | ||
| 21 | - [glm](https://glm.g-truc.net/0.9.8/index.html): 0.9.8 | 18 | - [glm](https://glm.g-truc.net/0.9.8/index.html): 0.9.8 |
| 22 | - [Oculus SDK](https://developer.oculus.com/downloads/): 1.11 (Win32) / 0.5 (Mac) | 19 | - [Oculus SDK](https://developer.oculus.com/downloads/): 1.11 (Win32) / 0.5 (Mac) |
| 23 | - [OpenVR](https://github.com/ValveSoftware/openvr): 1.0.6 (Win32 only) | 20 | - [OpenVR](https://github.com/ValveSoftware/openvr): 1.0.6 (Win32 only) |
| @@ -25,16 +22,15 @@ These dependencies need not be installed manually. They are automatically downlo · 1 unmodified line | |||
| 25 | - [QuaZip](https://sourceforge.net/projects/quazip/files/quazip/): 0.7.3 | 22 | - [QuaZip](https://sourceforge.net/projects/quazip/files/quazip/): 0.7.3 |
| 26 | - [SDL2](https://www.libsdl.org/download-2.0.php): 2.0.3 | 23 | - [SDL2](https://www.libsdl.org/download-2.0.php): 2.0.3 |
| 27 | - [Intel Threading Building Blocks](https://www.threadingbuildingblocks.org/): 4.3 | 24 | - [Intel Threading Building Blocks](https://www.threadingbuildingblocks.org/): 4.3 |
| 28 | - [Sixense](http://sixense.com/): 071615 | 25 | - [vcpkg](https://github.com/highfidelity/vcpkg): |
| 26 | - [VHACD](https://github.com/virneo/v-hacd) | ||
| 29 | - [zlib](http://www.zlib.net/): 1.28 (Win32 only) | 27 | - [zlib](http://www.zlib.net/): 1.28 (Win32 only) |
| 30 | - nVidia Texture Tools: 2.1 | 28 | - [nvtt](https://github.com/highfidelity/nvidia-texture-tools): 2.1.1 (customized) |
| 31 | 29 | ||
| 32 | The above dependencies will be downloaded, built, linked and included automatically by CMake where we require them. The CMakeLists files that handle grabbing each of the following external dependencies can be found in the [cmake/externals folder](cmake/externals). The resulting downloads, source files and binaries will be placed in the `build/ext` folder in each of the subfolders for each external project. | 30 | The above dependencies will be downloaded, built, linked and included automatically by CMake where we require them. The CMakeLists files that handle grabbing each of the following external dependencies can be found in the [cmake/externals folder](cmake/externals). The resulting downloads, source files and binaries will be placed in the `build/ext` folder in each of the subfolders for each external project. |
| 33 | 31 | ||
| 34 | These are not placed in your normal build tree when doing an out of source build so that they do not need to be re-downloaded and re-compiled every time the CMake build folder is cleared. Should you want to force a re-download and re-compile of a specific external, you can simply remove that directory from the appropriate subfolder in `build/ext`. Should you want to force a re-download and re-compile of all externals, just remove the `build/ext` folder. | 32 | These are not placed in your normal build tree when doing an out of source build so that they do not need to be re-downloaded and re-compiled every time the CMake build folder is cleared. Should you want to force a re-download and re-compile of a specific external, you can simply remove that directory from the appropriate subfolder in `build/ext`. Should you want to force a re-download and re-compile of all externals, just remove the `build/ext` folder. |
| 35 | 33 | ||
| 36 | If you would like to use a specific install of a dependency instead of the version that would be grabbed as a CMake ExternalProject, you can pass -DUSE\_LOCAL\_$NAME=0 (where $NAME is the name of the subfolder in [cmake/externals](cmake/externals)) when you run CMake to tell it not to get that dependency as an external project. | ||
| 37 | |||
| 38 | #### CMake | 34 | #### CMake |
| 39 | 35 | ||
| 40 | Hifi uses CMake to generate build files and project files for your platform. | 36 | Hifi uses CMake to generate build files and project files for your platform. |
| @@ -82,9 +78,22 @@ In the examples below the variable $NAME would be replaced by the name of the de · 41 unmodified lines | |||
| 82 | * $NAME_ROOT_DIR - set this variable in your ENV | 78 | * $NAME_ROOT_DIR - set this variable in your ENV |
| 83 | * HIFI_LIB_DIR - set this variable in your ENV to your High Fidelity lib folder, should contain a folder '$name' | 79 | * HIFI_LIB_DIR - set this variable in your ENV to your High Fidelity lib folder, should contain a folder '$name' |
| 84 | 80 | ||
| 85 | |||
| 86 | ### Optional Components | 81 | ### Optional Components |
| 87 | 82 | ||
| 83 | #### Build Options | ||
| 84 | |||
| 85 | The following build options can be used when running CMake | ||
| 86 | |||
| 87 | * BUILD_CLIENT | ||
| 88 | * BUILD_SERVER | ||
| 89 | * BUILD_TESTS | ||
| 90 | * BUILD_TOOLS | ||
| 91 | |||
| 92 | #### Developer Build Options | ||
| 93 | |||
| 94 | * USE_GLES | ||
| 95 | * DISABLE_UI | ||
| 96 | |||
| 88 | #### Devices | 97 | #### Devices |
| 89 | 98 | ||
| 90 | You can support external input/output devices such as Leap Motion, MIDI, and more by adding each individual SDK in the visible building path. Refer to the readme file available in each device folder in [interface/external/](interface/external) for the detailed explanation of the requirements to use the device. | 99 | You can support external input/output devices such as Leap Motion, MIDI, and more by adding each individual SDK in the visible building path. Refer to the readme file available in each device folder in [interface/external/](interface/external) for the detailed explanation of the requirements to use the device. |
| @@ -7,22 +7,36 @@ else() · 6 unmodified lines | |||
| 7 | cmake_minimum_required(VERSION 3.2) | 7 | cmake_minimum_required(VERSION 3.2) |
| 8 | endif() | 8 | endif() |
| 9 | 9 | ||
| 10 | # squelch the Policy CMP0074 warning without requiring an update to cmake 3.12. | 10 | include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/macros/TargetPython.cmake") |
| 11 | if ((${CMAKE_MAJOR_VERSION} EQUAL 3 AND ${CMAKE_MINOR_VERSION} GREATER 11) OR ${CMAKE_MAJOR_VERSION} GREATER 3) | 11 | target_python() |
| 12 | cmake_policy(SET CMP0074 NEW) | 12 | |
| 13 | if (HIFI_ANDROID ) | ||
| 14 | execute_process( | ||
| 15 | COMMAND ${HIFI_PYTHON_EXEC} ${CMAKE_CURRENT_SOURCE_DIR}/prebuild.py --android --build-root ${CMAKE_BINARY_DIR} | ||
| 16 | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} | ||
| 17 | ) | ||
| 18 | else() | ||
| 19 | execute_process( | ||
| 20 | COMMAND ${HIFI_PYTHON_EXEC} ${CMAKE_CURRENT_SOURCE_DIR}/prebuild.py --build-root ${CMAKE_BINARY_DIR} | ||
| 21 | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} | ||
| 22 | ) | ||
| 23 | # squelch the Policy CMP0074 warning without requiring an update to cmake 3.12. | ||
| 24 | if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.12) | ||
| 25 | cmake_policy(SET CMP0074 NEW) | ||
| 26 | endif() | ||
| 13 | endif() | 27 | endif() |
| 14 | 28 | ||
| 15 | project(hifi) | 29 | if(NOT EXISTS "${CMAKE_BINARY_DIR}/vcpkg.cmake") |
| 30 | message(FATAL_ERROR "vcpkg configuration missing.") | ||
| 31 | endif() | ||
| 16 | 32 | ||
| 33 | include("${CMAKE_BINARY_DIR}/vcpkg.cmake") | ||
| 34 | project(hifi) | ||
| 17 | include("cmake/init.cmake") | 35 | include("cmake/init.cmake") |
| 18 | |||
| 19 | include("cmake/compiler.cmake") | 36 | include("cmake/compiler.cmake") |
| 20 | 37 | ||
| 21 | if (BUILD_SCRIBE_ONLY) | 38 | add_paths_to_fixup_libs(${VCPKG_INSTALL_ROOT}/bin) |
| 22 | add_subdirectory(tools/scribe) | 39 | add_paths_to_fixup_libs(${VCPKG_INSTALL_ROOT}/debug/bin) |
| 23 | add_subdirectory(tools/shader_reflect) | ||
| 24 | return() | ||
| 25 | endif() | ||
| 26 | 40 | ||
| 27 | if (NOT DEFINED CLIENT_ONLY) | 41 | if (NOT DEFINED CLIENT_ONLY) |
| 28 | set(CLIENT_ONLY 0) | 42 | set(CLIENT_ONLY 0) |
| @@ -40,7 +54,8 @@ endif() · 11 unmodified lines | |||
| 40 | 54 | ||
| 41 | set(BUILD_CLIENT_OPTION ON) | 55 | set(BUILD_CLIENT_OPTION ON) |
| 42 | set(BUILD_SERVER_OPTION ON) | 56 | set(BUILD_SERVER_OPTION ON) |
| 43 | set(BUILD_TESTS_OPTION ON) | 57 | set(BUILD_TESTS_OPTION OFF) |
| 58 | set(BUILD_MANUAL_TESTS_OPTION ${BUILD_TESTS_OPTION}) | ||
| 44 | set(BUILD_TOOLS_OPTION ON) | 59 | set(BUILD_TOOLS_OPTION ON) |
| 45 | set(BUILD_INSTALLER_OPTION ON) | 60 | set(BUILD_INSTALLER_OPTION ON) |
| 46 | set(GLES_OPTION OFF) | 61 | set(GLES_OPTION OFF) |
| @@ -66,7 +81,7 @@ if (ANDROID) · 19 unmodified lines | |||
| 66 | set(GLES_OPTION ON) | 81 | set(GLES_OPTION ON) |
| 67 | set(PLATFORM_QT_COMPONENTS AndroidExtras WebView) | 82 | set(PLATFORM_QT_COMPONENTS AndroidExtras WebView) |
| 68 | else () | 83 | else () |
| 69 | set(PLATFORM_QT_COMPONENTS WebEngine WebEngineWidgets) | 84 | set(PLATFORM_QT_COMPONENTS WebEngine) |
| 70 | endif () | 85 | endif () |
| 71 | 86 | ||
| 72 | if (USE_GLES AND (NOT ANDROID)) | 87 | if (USE_GLES AND (NOT ANDROID)) |
| @@ -77,6 +92,7 @@ endif() · 4 unmodified lines | |||
| 77 | option(BUILD_CLIENT "Build client components" ${BUILD_CLIENT_OPTION}) | 92 | option(BUILD_CLIENT "Build client components" ${BUILD_CLIENT_OPTION}) |
| 78 | option(BUILD_SERVER "Build server components" ${BUILD_SERVER_OPTION}) | 93 | option(BUILD_SERVER "Build server components" ${BUILD_SERVER_OPTION}) |
| 79 | option(BUILD_TESTS "Build tests" ${BUILD_TESTS_OPTION}) | 94 | option(BUILD_TESTS "Build tests" ${BUILD_TESTS_OPTION}) |
| 95 | option(BUILD_MANUAL_TESTS "Build manual tests" ${BUILD_MANUAL_TESTS_OPTION}) | ||
| 80 | option(BUILD_TOOLS "Build tools" ${BUILD_TOOLS_OPTION}) | 96 | option(BUILD_TOOLS "Build tools" ${BUILD_TOOLS_OPTION}) |
| 81 | option(BUILD_INSTALLER "Build installer" ${BUILD_INSTALLER_OPTION}) | 97 | option(BUILD_INSTALLER "Build installer" ${BUILD_INSTALLER_OPTION}) |
| 82 | option(USE_GLES "Use OpenGL ES" ${GLES_OPTION}) | 98 | option(USE_GLES "Use OpenGL ES" ${GLES_OPTION}) |
| @@ -144,6 +160,8 @@ list(APPEND CMAKE_PREFIX_PATH "${QT_CMAKE_PREFIX_PATH}") · 61 unmodified lines | |||
| 144 | find_package( Threads ) | 160 | find_package( Threads ) |
| 145 | 161 | ||
| 146 | add_definitions(-DGLM_FORCE_RADIANS) | 162 | add_definitions(-DGLM_FORCE_RADIANS) |
| 163 | add_definitions(-DGLM_ENABLE_EXPERIMENTAL) | ||
| 164 | add_definitions(-DGLM_FORCE_CTOR_INIT) | ||
| 147 | set(HIFI_LIBRARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries") | 165 | set(HIFI_LIBRARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries") |
| 148 | 166 | ||
| 149 | set(EXTERNAL_PROJECT_PREFIX "project") | 167 | set(EXTERNAL_PROJECT_PREFIX "project") |
| @@ -191,7 +209,9 @@ if (BUILD_TESTS) · 41 unmodified lines | |||
| 191 | include(CTest) | 209 | include(CTest) |
| 192 | enable_testing() | 210 | enable_testing() |
| 193 | add_subdirectory(tests) | 211 | add_subdirectory(tests) |
| 194 | add_subdirectory(tests-manual) | 212 | if (BUILD_MANUAL_TESTS) |
| 213 | add_subdirectory(tests-manual) | ||
| 214 | endif() | ||
| 195 | endif() | 215 | endif() |
| 196 | 216 | ||
| 197 | if (BUILD_INSTALLER) | 217 | if (BUILD_INSTALLER) |
| @@ -1,4 +1,4 @@ | |||
| 1 | Copyright (c) 2013-2016, High Fidelity, Inc. | 1 | Copyright (c) 2013-2018, High Fidelity, Inc. |
| 2 | All rights reserved. | 2 | All rights reserved. |
| 3 | licensing@highfidelity.io | 3 | licensing@highfidelity.io |
| 4 | 4 | ||
| @@ -0,0 +1,75 @@ | |||
| 1 | [VCPKG](https://github.com/Microsoft/vcpkg) is an open source package management system created by Microsoft, intially just for Windows based system, but eventually extended to cover Linux and OSX as well, and in theory extensible enough to cover additional operating systems. | ||
| 2 | |||
| 3 | VCPKG is now our primary mechanism for managing the external libraries and tools on which we rely to build our applications. | ||
| 4 | |||
| 5 | Conventional usage of VCPKG involves cloning the repository, running the bootstrapping script to build the vcpkg binary, and then calling the binary to install a set of libraries. The libraries themselves are specified by a set of port files inside the [repository](https://github.com/Microsoft/vcpkg/tree/master/ports) | ||
| 6 | |||
| 7 | Because the main VCPKG repository does not contain all the ports we want, and because we want to be able to manage the precise versions of our dependencies, rather than allow it to be outside of our control, instead of using the main vcpkg repository, we use a combination of a [fork](https://github.com/highfidelity/vcpkg) of the repository (which allows us to customize the vcpkg binary, currently necessary to deal with some out of date tools on our build hosts) and a set of [custom port files](./cmake/ports) stored in our own repository. | ||
| 8 | |||
| 9 | ## Adding new packages to vcpkg | ||
| 10 | |||
| 11 | Note... Android vcpkg usage is still experimental. Contact Austin for more detailed information if you need to add a new package for use by Android. | ||
| 12 | |||
| 13 | ### Setup development environment | ||
| 14 | |||
| 15 | In order to add new packages, you will need to set up an environment for testing. This assumes you already have the tools for normal Hifi development (git, cmake, a working C++ compiler, etc) | ||
| 16 | |||
| 17 | * Clone our vcpkg [fork](https://github.com/highfidelity/vcpkg) | ||
| 18 | * Remove the ports directory from the checkout and symlink to our own [custom port files](./cmake/ports) | ||
| 19 | * Bootstrap the vcpkg binary with the `bootstrap-vcpkg.sh` or `bootstrap-vcpkg.bat` script | ||
| 20 | |||
| 21 | ### Add a new port skeleton | ||
| 22 | |||
| 23 | Your new package will require, at minimum, a `CONTROL` file and a `portfile.cmake` file, located in a subdirectory of the ports folder. Assuming you're creating a new dependency named `foo` it should be located in `ports/foo` under the vcpkg directory. The `CONTROL` file will contain a small number of fields, such as the name, version, description and any other vcpkg ports on which you depend. The `portfile.cmake` is a CMake script that will instruct vcpkg how to build the packages. We'll cover that in more depth in a moment. For now, just create one and leave it blank. | ||
| 24 | |||
| 25 | ### Add a reference to your package to one or more of the hifi meta-packages | ||
| 26 | |||
| 27 | We have three meta-packages used to do our building. When you modify one of these packages, make sure to bump the version number in the `CONTROL` file for the package | ||
| 28 | |||
| 29 | #### hifi-deps | ||
| 30 | |||
| 31 | This metapackage contains anything required for building the server or shared components. For instance, the `glm`, `tbb` and `zlib` packages are declared here because they're used everywhere, not just in our client application code. | ||
| 32 | |||
| 33 | #### hifi-client-deps | ||
| 34 | |||
| 35 | This metapackage contains anything required for building the client. For example, `sdl2` is listed here because it's required for our joystick input, but not for the server or shared components. Note that `hifi-client-deps` depends on `hifi-deps`, so you don't have to declare something twice if it's used in both he server and client. Just declare it in `hifi-deps` and it will still be includeded transitively. | ||
| 36 | |||
| 37 | #### hifi-host-tools | ||
| 38 | |||
| 39 | This metapackage contains anything we use to create executables that will then be used in the build process. The `hifi-deps` and `hifi-client-deps` packages are built for the target architecture, which may be different than the host architecture (for instance, when building for Android). The `hifi-host-tools` packages are always build for the host architecture, because they're tools that are intended to be run as part of the build process. Scribe for example is used at build time to generate shaders. Building an arm64 version of Scribe is useless because we need to run it on the host machine. | ||
| 40 | |||
| 41 | Note that packages can appear in both the `hifi-host-tools` and one of the other metapackages, indicating that the package both contains a library which we will use at runtime, and a tool which we will use at build time. The `spirv-tools` package is an example. | ||
| 42 | |||
| 43 | ### Implement the portfile.cmake | ||
| 44 | |||
| 45 | How the portfile is written depends on what kind of package you're working with. It's basically still a CMake script, but there are a number of [functions](https://vcpkg.readthedocs.io/en/latest/maintainers/portfile-functions/) available to make fetching and building packages easier. | ||
| 46 | |||
| 47 | Typically there are three areas you need to deal with | ||
| 48 | |||
| 49 | * Getting the source | ||
| 50 | * Building the source | ||
| 51 | * Installing the artifacts | ||
| 52 | |||
| 53 | #### Getting sources | ||
| 54 | |||
| 55 | Getting sources from github, gitlab or bitbucket is easy. There are special functions specifcially for those. See the [etc2comp portfile](./cmake/ports/etc2comp/portfile.cmake) for an example of fetching source via github. | ||
| 56 | |||
| 57 | If the project isn't available that way, you can still use the [vcpkg_download_distfile](https://vcpkg.readthedocs.io/en/latest/maintainers/vcpkg_download_distfile/) function to explicitly download an archive and then use [vcpkg_extract_source_archive](https://vcpkg.readthedocs.io/en/latest/maintainers/vcpkg_extract_source_archive/) to unpack it. See the [zlib portfile](./cmake/ports/zlib/portfile.cmake) for an example there. | ||
| 58 | |||
| 59 | #### Building | ||
| 60 | |||
| 61 | If your package uses CMake, you'll be able to use the [vcpkg_configure_cmake](https://vcpkg.readthedocs.io/en/latest/maintainers/vcpkg_configure_cmake/) and [vcpkg_build_cmake](https://vcpkg.readthedocs.io/en/latest/maintainers/vcpkg_build_cmake/) commands to configure and build the package. If you're going to be relying on the CMake installation functionality, you can just call [vcpkg_install_cmake](https://vcpkg.readthedocs.io/en/latest/maintainers/vcpkg_install_cmake/), since it will implicitly run the build before the install. | ||
| 62 | |||
| 63 | If your package is not binary, but doesn't use CMake, you're just going to have to figure it out. | ||
| 64 | |||
| 65 | If your package is binary, then you can just skip this step | ||
| 66 | |||
| 67 | #### Installing | ||
| 68 | |||
| 69 | Once you've built the package, you need to install the artifacts in the target directory. Ideally, your package's CMake INSTALL commands will do the right thing. However, there are usually some things you have to do manually. Since VCPKG will build both the release and debug versions for all packages, you need to make sure if your package installed headers that you remove the _debug_ versions of these headers. This is typically done with the `file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)`. Additionally, if your package creates any standalone executables, you need to make sure they're installed in the destination `tools` directory, not the `bin` or `lib` directories, which are specifically for shared library binaries (like .so or .dll files) and link library files (like .a or .lib files) respectively. | ||
| 70 | |||
| 71 | If you're dealing with a binary package, then you'll need to explicitly perform all the required copies from the location where you extracted the archive to the installation directory. An example of this is available in the [openssl-android portfile](./cmake/ports/openssl-android/portfile.cmake) | ||
| 72 | |||
| 73 | ### Commit and test | ||
| 74 | |||
| 75 | Once you've tested building your new package locally, you'll need to commit and push the changes and additions to the portfiles you've made and then monitor the build hosts to verify that the new package successfully built on all the target environments. | ||
| @@ -23,7 +23,6 @@ android { · 22 unmodified lines | |||
| 23 | '-DANDROID_TOOLCHAIN=clang', | 23 | '-DANDROID_TOOLCHAIN=clang', |
| 24 | '-DANDROID_STL=c++_shared', | 24 | '-DANDROID_STL=c++_shared', |
| 25 | '-DQT_CMAKE_PREFIX_PATH=' + HIFI_ANDROID_PRECOMPILED + '/qt/lib/cmake', | 25 | '-DQT_CMAKE_PREFIX_PATH=' + HIFI_ANDROID_PRECOMPILED + '/qt/lib/cmake', |
| 26 | '-DNATIVE_SCRIBE=' + HIFI_ANDROID_PRECOMPILED + '/scribe' + EXEC_SUFFIX, | ||
| 27 | '-DHIFI_ANDROID_PRECOMPILED=' + HIFI_ANDROID_PRECOMPILED, | 26 | '-DHIFI_ANDROID_PRECOMPILED=' + HIFI_ANDROID_PRECOMPILED, |
| 28 | '-DRELEASE_NUMBER=' + RELEASE_NUMBER, | 27 | '-DRELEASE_NUMBER=' + RELEASE_NUMBER, |
| 29 | '-DRELEASE_TYPE=' + RELEASE_TYPE, | 28 | '-DRELEASE_TYPE=' + RELEASE_TYPE, |
| @@ -106,11 +106,6 @@ def packages = [ · 105 unmodified lines | |||
| 106 | versionId: 'r5Zran.JSCtvrrB6Q4KaqfIoALPw3lYY', | 106 | versionId: 'r5Zran.JSCtvrrB6Q4KaqfIoALPw3lYY', |
| 107 | checksum: 'a8ee8584cf1ccd34766c7ddd9d5e5449', | 107 | checksum: 'a8ee8584cf1ccd34766c7ddd9d5e5449', |
| 108 | ], | 108 | ], |
| 109 | glm: [ | ||
| 110 | file: 'glm-0.9.8.5-patched.tgz', | ||
| 111 | versionId: 'cskfMoJrFlAeqI3WPxemyO_Cxt7rT9EJ', | ||
| 112 | checksum: '067b5fe16b220b5b1a1039ba51b062ae', | ||
| 113 | ], | ||
| 114 | gvr: [ | 109 | gvr: [ |
| 115 | file: 'gvrsdk_v1.101.0.tgz', | 110 | file: 'gvrsdk_v1.101.0.tgz', |
| 116 | versionId: 'nqBV_j81Uc31rC7bKIrlya_Hah4v3y5r', | 111 | versionId: 'nqBV_j81Uc31rC7bKIrlya_Hah4v3y5r', |
| @@ -161,21 +156,6 @@ def packages = [ · 44 unmodified lines | |||
| 161 | ] | 156 | ] |
| 162 | ] | 157 | ] |
| 163 | 158 | ||
| 164 | def scribeLocalFile='scribe' + EXEC_SUFFIX | ||
| 165 | def scribeFile='scribe_linux_x86_64' | ||
| 166 | def scribeChecksum='4635c28192724281d2367ce9e94380ab' | ||
| 167 | def scribeVersion='mPAY_N846oZH1tPY1bwChB_hzqkiYyoC' | ||
| 168 | |||
| 169 | if (Os.isFamily(Os.FAMILY_MAC)) { | ||
| 170 | scribeFile = 'scribe_osx_x86_64' | ||
| 171 | scribeChecksum='1ead61c285d265eba9a5ef91ae3b7c26' | ||
| 172 | scribeVersion='4TAXWdo9fviw60N2wUA8HNyQ9TabjZa3' | ||
| 173 | } else if (Os.isFamily(Os.FAMILY_WINDOWS)) { | ||
| 174 | scribeFile = 'scribe_win32_x86_64.exe' | ||
| 175 | scribeChecksum='9c29a62595daf4844f95f6744d568c15' | ||
| 176 | scribeVersion='DUoxjufeX8ZAIVRBKRczWTuZwT13enTv' | ||
| 177 | } | ||
| 178 | |||
| 179 | def options = [ | 159 | def options = [ |
| 180 | files: new TreeSet<File>(), | 160 | files: new TreeSet<File>(), |
| 181 | features: new HashSet<String>(), | 161 | features: new HashSet<String>(), |
| @@ -434,28 +414,6 @@ task copyDependencies(dependsOn: [ extractDependencies ]) { · 252 unmodified lines | |||
| 434 | } | 414 | } |
| 435 | } | 415 | } |
| 436 | 416 | ||
| 437 | task downloadScribe(type: Download) { | ||
| 438 | src baseUrl + scribeFile + '?versionId=' + scribeVersion | ||
| 439 | dest new File(baseFolder, scribeLocalFile) | ||
| 440 | onlyIfNewer true | ||
| 441 | } | ||
| 442 | |||
| 443 | task verifyScribe (type: Verify, dependsOn: downloadScribe) { | ||
| 444 | src new File(baseFolder, scribeLocalFile); | ||
| 445 | checksum scribeChecksum | ||
| 446 | } | ||
| 447 | |||
| 448 | task fixScribePermissions(type: Exec, dependsOn: verifyScribe) { | ||
| 449 | commandLine 'chmod', 'a+x', HIFI_ANDROID_PRECOMPILED + '/' + scribeLocalFile | ||
| 450 | } | ||
| 451 | |||
| 452 | task setupScribe(dependsOn: [verifyScribe]) { } | ||
| 453 | |||
| 454 | // On Windows, we don't need to set the executable bit, but on OSX and Unix we do | ||
| 455 | if (!Os.isFamily(Os.FAMILY_WINDOWS)) { | ||
| 456 | setupScribe.dependsOn fixScribePermissions | ||
| 457 | } | ||
| 458 | |||
| 459 | task extractGvrBinaries(dependsOn: extractDependencies) { | 417 | task extractGvrBinaries(dependsOn: extractDependencies) { |
| 460 | doLast { | 418 | doLast { |
| 461 | def gvrLibFolder = new File(HIFI_ANDROID_PRECOMPILED, 'gvr/gvr-android-sdk-1.101.0/libraries'); | 419 | def gvrLibFolder = new File(HIFI_ANDROID_PRECOMPILED, 'gvr/gvr-android-sdk-1.101.0/libraries'); |
| @@ -542,7 +500,7 @@ task qtBundle { · 80 unmodified lines | |||
| 542 | } | 500 | } |
| 543 | } | 501 | } |
| 544 | 502 | ||
| 545 | task setupDependencies(dependsOn: [setupScribe, copyDependencies, extractGvrBinaries, qtBundle]) { } | 503 | task setupDependencies(dependsOn: [copyDependencies, extractGvrBinaries, qtBundle]) { } |
| 546 | 504 | ||
| 547 | task cleanDependencies(type: Delete) { | 505 | task cleanDependencies(type: Delete) { |
| 548 | delete HIFI_ANDROID_PRECOMPILED | 506 | delete HIFI_ANDROID_PRECOMPILED |
| @@ -216,7 +216,7 @@ void Agent::requestScript() { · 215 unmodified lines | |||
| 216 | } | 216 | } |
| 217 | 217 | ||
| 218 | // make sure this is not a script request for the file scheme | 218 | // make sure this is not a script request for the file scheme |
| 219 | if (scriptURL.scheme() == URL_SCHEME_FILE) { | 219 | if (scriptURL.scheme() == HIFI_URL_SCHEME_FILE) { |
| 220 | qWarning() << "Cannot load script for Agent from local filesystem."; | 220 | qWarning() << "Cannot load script for Agent from local filesystem."; |
| 221 | scriptRequestFinished(); | 221 | scriptRequestFinished(); |
| 222 | return; | 222 | return; |
| @@ -89,7 +89,8 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : · 88 unmodified lines | |||
| 89 | PacketType::NodeIgnoreRequest, | 89 | PacketType::NodeIgnoreRequest, |
| 90 | PacketType::RadiusIgnoreRequest, | 90 | PacketType::RadiusIgnoreRequest, |
| 91 | PacketType::RequestsDomainListData, | 91 | PacketType::RequestsDomainListData, |
| 92 | PacketType::PerAvatarGainSet }, | 92 | PacketType::PerAvatarGainSet, |
| 93 | PacketType::AudioSoloRequest }, | ||
| 93 | this, "queueAudioPacket"); | 94 | this, "queueAudioPacket"); |
| 94 | 95 | ||
| 95 | // packets whose consequences are global should be processed on the main thread | 96 | // packets whose consequences are global should be processed on the main thread |
| @@ -13,7 +13,7 @@ · 12 unmodified lines | |||
| 13 | 13 | ||
| 14 | #include <random> | 14 | #include <random> |
| 15 | 15 | ||
| 16 | #include <glm/detail/func_common.hpp> | 16 | #include <glm/common.hpp> |
| 17 | 17 | ||
| 18 | #include <QtCore/QDebug> | 18 | #include <QtCore/QDebug> |
| 19 | #include <QtCore/QJsonArray> | 19 | #include <QtCore/QJsonArray> |
| @@ -98,6 +98,9 @@ int AudioMixerClientData::processPackets(ConcurrentAddedStreams& addedStreams) { · 78 unmodified lines | |||
| 98 | case PacketType::RadiusIgnoreRequest: | 98 | case PacketType::RadiusIgnoreRequest: |
| 99 | parseRadiusIgnoreRequest(packet, node); | 99 | parseRadiusIgnoreRequest(packet, node); |
| 100 | break; | 100 | break; |
| 101 | case PacketType::AudioSoloRequest: | ||
| 102 | parseSoloRequest(packet, node); | ||
| 103 | break; | ||
| 101 | default: | 104 | default: |
| 102 | Q_UNREACHABLE(); | 105 | Q_UNREACHABLE(); |
| 103 | } | 106 | } |
| @@ -202,7 +205,7 @@ void AudioMixerClientData::parsePerAvatarGainSet(ReceivedMessage& message, const · 98 unmodified lines | |||
| 202 | } | 205 | } |
| 203 | } | 206 | } |
| 204 | 207 | ||
| 205 | void AudioMixerClientData::setGainForAvatar(QUuid nodeID, uint8_t gain) { | 208 | void AudioMixerClientData::setGainForAvatar(QUuid nodeID, float gain) { |
| 206 | auto it = std::find_if(_streams.active.cbegin(), _streams.active.cend(), [nodeID](const MixableStream& mixableStream){ | 209 | auto it = std::find_if(_streams.active.cbegin(), _streams.active.cend(), [nodeID](const MixableStream& mixableStream){ |
| 207 | return mixableStream.nodeStreamID.nodeID == nodeID && mixableStream.nodeStreamID.streamID.isNull(); | 210 | return mixableStream.nodeStreamID.nodeID == nodeID && mixableStream.nodeStreamID.streamID.isNull(); |
| 208 | }); | 211 | }); |
| @@ -295,6 +298,25 @@ void AudioMixerClientData::parseRadiusIgnoreRequest(QSharedPointer<ReceivedMessa · 86 unmodified lines | |||
| 295 | } | 298 | } |
| 296 | } | 299 | } |
| 297 | 300 | ||
| 301 | |||
| 302 | void AudioMixerClientData::parseSoloRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node) { | ||
| 303 | |||
| 304 | uint8_t addToSolo; | ||
| 305 | message->readPrimitive(&addToSolo); | ||
| 306 | |||
| 307 | while (message->getBytesLeftToRead()) { | ||
| 308 | // parse out the UUID being soloed from the packet | ||
| 309 | QUuid soloedUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); | ||
| 310 | |||
| 311 | if (addToSolo) { | ||
| 312 | _soloedNodes.push_back(soloedUUID); | ||
| 313 | } else { | ||
| 314 | auto it = std::remove(std::begin(_soloedNodes), std::end(_soloedNodes), soloedUUID); | ||
| 315 | _soloedNodes.erase(it, std::end(_soloedNodes)); | ||
| 316 | } | ||
| 317 | } | ||
| 318 | } | ||
| 319 | |||
| 298 | AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() { | 320 | AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() { |
| 299 | auto it = std::find_if(_audioStreams.begin(), _audioStreams.end(), [](const SharedStreamPointer& stream){ | 321 | auto it = std::find_if(_audioStreams.begin(), _audioStreams.end(), [](const SharedStreamPointer& stream){ |
| 300 | return stream->getStreamIdentifier().isNull(); | 322 | return stream->getStreamIdentifier().isNull(); |
| @@ -65,6 +65,7 @@ public: · 64 unmodified lines | |||
| 65 | void parsePerAvatarGainSet(ReceivedMessage& message, const SharedNodePointer& node); | 65 | void parsePerAvatarGainSet(ReceivedMessage& message, const SharedNodePointer& node); |
| 66 | void parseNodeIgnoreRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node); | 66 | void parseNodeIgnoreRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node); |
| 67 | void parseRadiusIgnoreRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node); | 67 | void parseRadiusIgnoreRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node); |
| 68 | void parseSoloRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node); | ||
| 68 | 69 | ||
| 69 | // attempt to pop a frame from each audio stream, and return the number of streams from this client | 70 | // attempt to pop a frame from each audio stream, and return the number of streams from this client |
| 70 | int checkBuffersBeforeFrameSend(); | 71 | int checkBuffersBeforeFrameSend(); |
| @@ -150,6 +151,9 @@ public: · 79 unmodified lines | |||
| 150 | 151 | ||
| 151 | const Node::IgnoredNodeIDs& getIgnoringNodeIDs() const { return _ignoringNodeIDs; } | 152 | const Node::IgnoredNodeIDs& getIgnoringNodeIDs() const { return _ignoringNodeIDs; } |
| 152 | 153 | ||
| 154 | |||
| 155 | const std::vector<QUuid>& getSoloedNodes() const { return _soloedNodes; } | ||
| 156 | |||
| 153 | bool getHasReceivedFirstMix() const { return _hasReceivedFirstMix; } | 157 | bool getHasReceivedFirstMix() const { return _hasReceivedFirstMix; } |
| 154 | void setHasReceivedFirstMix(bool hasReceivedFirstMix) { _hasReceivedFirstMix = hasReceivedFirstMix; } | 158 | void setHasReceivedFirstMix(bool hasReceivedFirstMix) { _hasReceivedFirstMix = hasReceivedFirstMix; } |
| 155 | 159 | ||
| @@ -172,7 +176,7 @@ private: · 16 unmodified lines | |||
| 172 | 176 | ||
| 173 | void optionallyReplicatePacket(ReceivedMessage& packet, const Node& node); | 177 | void optionallyReplicatePacket(ReceivedMessage& packet, const Node& node); |
| 174 | 178 | ||
| 175 | void setGainForAvatar(QUuid nodeID, uint8_t gain); | 179 | void setGainForAvatar(QUuid nodeID, float gain); |
| 176 | 180 | ||
| 177 | bool containsValidPosition(ReceivedMessage& message) const; | 181 | bool containsValidPosition(ReceivedMessage& message) const; |
| 178 | 182 | ||
| @@ -209,6 +213,8 @@ private: · 30 unmodified lines | |||
| 209 | 213 | ||
| 210 | std::atomic_bool _isIgnoreRadiusEnabled { false }; | 214 | std::atomic_bool _isIgnoreRadiusEnabled { false }; |
| 211 | 215 | ||
| 216 | std::vector<QUuid> _soloedNodes; | ||
| 217 | |||
| 212 | bool _hasReceivedFirstMix { false }; | 218 | bool _hasReceivedFirstMix { false }; |
| 213 | }; | 219 | }; |
| 214 | 220 | ||
| @@ -272,6 +272,10 @@ bool shouldBeSkipped(MixableStream& stream, const Node& listener, · 271 unmodified lines | |||
| 272 | return true; | 272 | return true; |
| 273 | } | 273 | } |
| 274 | 274 | ||
| 275 | if (!listenerData.getSoloedNodes().empty()) { | ||
| 276 | return !contains(listenerData.getSoloedNodes(), stream.nodeStreamID.nodeID); | ||
| 277 | } | ||
| 278 | |||
| 275 | bool shouldCheckIgnoreBox = (listenerAudioStream.isIgnoreBoxEnabled() || | 279 | bool shouldCheckIgnoreBox = (listenerAudioStream.isIgnoreBoxEnabled() || |
| 276 | stream.positionalStream->isIgnoreBoxEnabled()); | 280 | stream.positionalStream->isIgnoreBoxEnabled()); |
| 277 | if (shouldCheckIgnoreBox && | 281 | if (shouldCheckIgnoreBox && |
| @@ -310,6 +314,7 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { · 32 unmodified lines | |||
| 310 | memset(_mixSamples, 0, sizeof(_mixSamples)); | 314 | memset(_mixSamples, 0, sizeof(_mixSamples)); |
| 311 | 315 | ||
| 312 | bool isThrottling = _numToRetain != -1; | 316 | bool isThrottling = _numToRetain != -1; |
| 317 | bool isSoloing = !listenerData->getSoloedNodes().empty(); | ||
| 313 | 318 | ||
| 314 | auto& streams = listenerData->getStreams(); | 319 | auto& streams = listenerData->getStreams(); |
| 315 | 320 | ||
| @@ -376,13 +381,14 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { · 60 unmodified lines | |||
| 376 | stream.approximateVolume = approximateVolume(stream, listenerAudioStream); | 381 | stream.approximateVolume = approximateVolume(stream, listenerAudioStream); |
| 377 | } else { | 382 | } else { |
| 378 | if (shouldBeSkipped(stream, *listener, *listenerAudioStream, *listenerData)) { | 383 | if (shouldBeSkipped(stream, *listener, *listenerAudioStream, *listenerData)) { |
| 379 | addStream(stream, *listenerAudioStream, 0.0f); | 384 | addStream(stream, *listenerAudioStream, 0.0f, isSoloing); |
| 380 | streams.skipped.push_back(move(stream)); | 385 | streams.skipped.push_back(move(stream)); |
| 381 | ++stats.activeToSkipped; | 386 | ++stats.activeToSkipped; |
| 382 | return true; | 387 | return true; |
| 383 | } | 388 | } |
| 384 | 389 | ||
| 385 | addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain()); | 390 | addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain(), |
| 391 | isSoloing); | ||
| 386 | 392 | ||
| 387 | if (shouldBeInactive(stream)) { | 393 | if (shouldBeInactive(stream)) { |
| 388 | // To reduce artifacts we still call render to flush the HRTF for every silent | 394 | // To reduce artifacts we still call render to flush the HRTF for every silent |
| @@ -417,7 +423,8 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { · 28 unmodified lines | |||
| 417 | return true; | 423 | return true; |
| 418 | } | 424 | } |
| 419 | 425 | ||
| 420 | addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain()); | 426 | addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain(), |
| 427 | isSoloing); | ||
| 421 | 428 | ||
| 422 | if (shouldBeInactive(stream)) { | 429 | if (shouldBeInactive(stream)) { |
| 423 | // To reduce artifacts we still call render to flush the HRTF for every silent | 430 | // To reduce artifacts we still call render to flush the HRTF for every silent |
| @@ -484,7 +491,7 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { · 60 unmodified lines | |||
| 484 | 491 | ||
| 485 | void AudioMixerSlave::addStream(AudioMixerClientData::MixableStream& mixableStream, | 492 | void AudioMixerSlave::addStream(AudioMixerClientData::MixableStream& mixableStream, |
| 486 | AvatarAudioStream& listeningNodeStream, | 493 | AvatarAudioStream& listeningNodeStream, |
| 487 | float masterListenerGain) { | 494 | float masterListenerGain, bool isSoloing) { |
| 488 | ++stats.totalMixes; | 495 | ++stats.totalMixes; |
| 489 | 496 | ||
| 490 | auto streamToAdd = mixableStream.positionalStream; | 497 | auto streamToAdd = mixableStream.positionalStream; |
| @@ -495,9 +502,13 @@ void AudioMixerSlave::addStream(AudioMixerClientData::MixableStream& mixableStre · 4 unmodified lines | |||
| 495 | glm::vec3 relativePosition = streamToAdd->getPosition() - listeningNodeStream.getPosition(); | 502 | glm::vec3 relativePosition = streamToAdd->getPosition() - listeningNodeStream.getPosition(); |
| 496 | 503 | ||
| 497 | float distance = glm::max(glm::length(relativePosition), EPSILON); | 504 | float distance = glm::max(glm::length(relativePosition), EPSILON); |
| 498 | float gain = computeGain(masterListenerGain, listeningNodeStream, *streamToAdd, relativePosition, distance, isEcho); | ||
| 499 | float azimuth = isEcho ? 0.0f : computeAzimuth(listeningNodeStream, listeningNodeStream, relativePosition); | 505 | float azimuth = isEcho ? 0.0f : computeAzimuth(listeningNodeStream, listeningNodeStream, relativePosition); |
| 500 | 506 | ||
| 507 | float gain = 1.0f; | ||
| 508 | if (!isSoloing) { | ||
| 509 | gain = computeGain(masterListenerGain, listeningNodeStream, *streamToAdd, relativePosition, distance, isEcho); | ||
| 510 | } | ||
| 511 | |||
| 501 | const int HRTF_DATASET_INDEX = 1; | 512 | const int HRTF_DATASET_INDEX = 1; |
| 502 | 513 | ||
| 503 | if (!streamToAdd->lastPopSucceeded()) { | 514 | if (!streamToAdd->lastPopSucceeded()) { |
| @@ -57,7 +57,7 @@ private: · 56 unmodified lines | |||
| 57 | bool prepareMix(const SharedNodePointer& listener); | 57 | bool prepareMix(const SharedNodePointer& listener); |
| 58 | void addStream(AudioMixerClientData::MixableStream& mixableStream, | 58 | void addStream(AudioMixerClientData::MixableStream& mixableStream, |
| 59 | AvatarAudioStream& listeningNodeStream, | 59 | AvatarAudioStream& listeningNodeStream, |
| 60 | float masterListenerGain); | 60 | float masterListenerGain, bool isSoloing); |
| 61 | void updateHRTFParameters(AudioMixerClientData::MixableStream& mixableStream, | 61 | void updateHRTFParameters(AudioMixerClientData::MixableStream& mixableStream, |
| 62 | AvatarAudioStream& listeningNodeStream, | 62 | AvatarAudioStream& listeningNodeStream, |
| 63 | float masterListenerGain); | 63 | float masterListenerGain); |
| @@ -541,7 +541,7 @@ void AvatarMixer::handleRequestsDomainListDataPacket(QSharedPointer<ReceivedMess · 540 unmodified lines | |||
| 541 | // ...For those nodes, reset the lastBroadcastTime to 0 | 541 | // ...For those nodes, reset the lastBroadcastTime to 0 |
| 542 | // so that the AvatarMixer will send Identity data to us | 542 | // so that the AvatarMixer will send Identity data to us |
| 543 | [&](const SharedNodePointer& node) { | 543 | [&](const SharedNodePointer& node) { |
| 544 | nodeData->setLastBroadcastTime(node->getUUID(), 0); | 544 | nodeData->setLastBroadcastTime(node->getLocalID(), 0); |
| 545 | nodeData->resetSentTraitData(node->getLocalID()); | 545 | nodeData->resetSentTraitData(node->getLocalID()); |
| 546 | } | 546 | } |
| 547 | ); | 547 | ); |
| @@ -565,7 +565,8 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer<ReceivedMessage> mes · 17 unmodified lines | |||
| 565 | // parse the identity packet and update the change timestamp if appropriate | 565 | // parse the identity packet and update the change timestamp if appropriate |
| 566 | bool identityChanged = false; | 566 | bool identityChanged = false; |
| 567 | bool displayNameChanged = false; | 567 | bool displayNameChanged = false; |
| 568 | avatar.processAvatarIdentity(message->getMessage(), identityChanged, displayNameChanged); | 568 | QDataStream avatarIdentityStream(message->getMessage()); |
| 569 | avatar.processAvatarIdentity(avatarIdentityStream, identityChanged, displayNameChanged); | ||
| 569 | 570 | ||
| 570 | if (identityChanged) { | 571 | if (identityChanged) { |
| 571 | QMutexLocker nodeDataLocker(&nodeData->getMutex()); | 572 | QMutexLocker nodeDataLocker(&nodeData->getMutex()); |
| @@ -637,7 +638,7 @@ void AvatarMixer::handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> · 65 unmodified lines | |||
| 637 | // Reset the lastBroadcastTime for the ignored avatar to 0 | 638 | // Reset the lastBroadcastTime for the ignored avatar to 0 |
| 638 | // so the AvatarMixer knows it'll have to send identity data about the ignored avatar | 639 | // so the AvatarMixer knows it'll have to send identity data about the ignored avatar |
| 639 | // to the ignorer if the ignorer unignores. | 640 | // to the ignorer if the ignorer unignores. |
| 640 | nodeData->setLastBroadcastTime(ignoredUUID, 0); | 641 | nodeData->setLastBroadcastTime(ignoredNode->getLocalID(), 0); |
| 641 | nodeData->resetSentTraitData(ignoredNode->getLocalID()); | 642 | nodeData->resetSentTraitData(ignoredNode->getLocalID()); |
| 642 | } | 643 | } |
| 643 | 644 | ||
| @@ -647,7 +648,7 @@ void AvatarMixer::handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> · 3 unmodified lines | |||
| 647 | // to the ignored if the ignorer unignores. | 648 | // to the ignored if the ignorer unignores. |
| 648 | AvatarMixerClientData* ignoredNodeData = reinterpret_cast<AvatarMixerClientData*>(ignoredNode->getLinkedData()); | 649 | AvatarMixerClientData* ignoredNodeData = reinterpret_cast<AvatarMixerClientData*>(ignoredNode->getLinkedData()); |
| 649 | if (ignoredNodeData) { | 650 | if (ignoredNodeData) { |
| 650 | ignoredNodeData->setLastBroadcastTime(senderNode->getUUID(), 0); | 651 | ignoredNodeData->setLastBroadcastTime(senderNode->getLocalID(), 0); |
| 651 | ignoredNodeData->resetSentTraitData(senderNode->getLocalID()); | 652 | ignoredNodeData->resetSentTraitData(senderNode->getLocalID()); |
| 652 | } | 653 | } |
| 653 | } | 654 | } |
| @@ -26,20 +26,20 @@ AvatarMixerClientData::AvatarMixerClientData(const QUuid& nodeID, Node::LocalID · 25 unmodified lines | |||
| 26 | _avatar->setID(nodeID); | 26 | _avatar->setID(nodeID); |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | uint64_t AvatarMixerClientData::getLastOtherAvatarEncodeTime(QUuid otherAvatar) const { | 29 | uint64_t AvatarMixerClientData::getLastOtherAvatarEncodeTime(NLPacket::LocalID otherAvatar) const { |
| 30 | std::unordered_map<QUuid, uint64_t>::const_iterator itr = _lastOtherAvatarEncodeTime.find(otherAvatar); | 30 | const auto itr = _lastOtherAvatarEncodeTime.find(otherAvatar); |
| 31 | if (itr != _lastOtherAvatarEncodeTime.end()) { | 31 | if (itr != _lastOtherAvatarEncodeTime.end()) { |
| 32 | return itr->second; | 32 | return itr->second; |
| 33 | } | 33 | } |
| 34 | return 0; | 34 | return 0; |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | void AvatarMixerClientData::setLastOtherAvatarEncodeTime(const QUuid& otherAvatar, uint64_t time) { | 37 | void AvatarMixerClientData::setLastOtherAvatarEncodeTime(NLPacket::LocalID otherAvatar, uint64_t time) { |
| 38 | std::unordered_map<QUuid, uint64_t>::iterator itr = _lastOtherAvatarEncodeTime.find(otherAvatar); | 38 | auto itr = _lastOtherAvatarEncodeTime.find(otherAvatar); |
| 39 | if (itr != _lastOtherAvatarEncodeTime.end()) { | 39 | if (itr != _lastOtherAvatarEncodeTime.end()) { |
| 40 | itr->second = time; | 40 | itr->second = time; |
| 41 | } else { | 41 | } else { |
| 42 | _lastOtherAvatarEncodeTime.emplace(std::pair<QUuid, uint64_t>(otherAvatar, time)); | 42 | _lastOtherAvatarEncodeTime.emplace(std::pair<NLPacket::LocalID, uint64_t>(otherAvatar, time)); |
| 43 | } | 43 | } |
| 44 | } | 44 | } |
| 45 | 45 | ||
| @@ -220,7 +220,7 @@ void AvatarMixerClientData::checkSkeletonURLAgainstWhitelist(const SlaveSharedDa · 174 unmodified lines | |||
| 220 | } | 220 | } |
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | uint64_t AvatarMixerClientData::getLastBroadcastTime(const QUuid& nodeUUID) const { | 223 | uint64_t AvatarMixerClientData::getLastBroadcastTime(NLPacket::LocalID nodeUUID) const { |
| 224 | // return the matching PacketSequenceNumber, or the default if we don't have it | 224 | // return the matching PacketSequenceNumber, or the default if we don't have it |
| 225 | auto nodeMatch = _lastBroadcastTimes.find(nodeUUID); | 225 | auto nodeMatch = _lastBroadcastTimes.find(nodeUUID); |
| 226 | if (nodeMatch != _lastBroadcastTimes.end()) { | 226 | if (nodeMatch != _lastBroadcastTimes.end()) { |
| @@ -229,9 +229,9 @@ uint64_t AvatarMixerClientData::getLastBroadcastTime(const QUuid& nodeUUID) cons · 2 unmodified lines | |||
| 229 | return 0; | 229 | return 0; |
| 230 | } | 230 | } |
| 231 | 231 | ||
| 232 | uint16_t AvatarMixerClientData::getLastBroadcastSequenceNumber(const QUuid& nodeUUID) const { | 232 | uint16_t AvatarMixerClientData::getLastBroadcastSequenceNumber(NLPacket::LocalID nodeID) const { |
| 233 | // return the matching PacketSequenceNumber, or the default if we don't have it | 233 | // return the matching PacketSequenceNumber, or the default if we don't have it |
| 234 | auto nodeMatch = _lastBroadcastSequenceNumbers.find(nodeUUID); | 234 | auto nodeMatch = _lastBroadcastSequenceNumbers.find(nodeID); |
| 235 | if (nodeMatch != _lastBroadcastSequenceNumbers.end()) { | 235 | if (nodeMatch != _lastBroadcastSequenceNumbers.end()) { |
| 236 | return nodeMatch->second; | 236 | return nodeMatch->second; |
| 237 | } | 237 | } |
| @@ -252,7 +252,7 @@ void AvatarMixerClientData::ignoreOther(const Node* self, const Node* other) { · 14 unmodified lines | |||
| 252 | } else { | 252 | } else { |
| 253 | killPacket->writePrimitive(KillAvatarReason::YourAvatarEnteredTheirBubble); | 253 | killPacket->writePrimitive(KillAvatarReason::YourAvatarEnteredTheirBubble); |
| 254 | } | 254 | } |
| 255 | setLastBroadcastTime(other->getUUID(), 0); | 255 | setLastBroadcastTime(other->getLocalID(), 0); |
| 256 | 256 | ||
| 257 | resetSentTraitData(other->getLocalID()); | 257 | resetSentTraitData(other->getLocalID()); |
| 258 | 258 | ||
| @@ -331,9 +331,9 @@ AvatarMixerClientData::TraitsCheckTimestamp AvatarMixerClientData::getLastOtherA · 72 unmodified lines | |||
| 331 | } | 331 | } |
| 332 | } | 332 | } |
| 333 | 333 | ||
| 334 | void AvatarMixerClientData::cleanupKilledNode(const QUuid& nodeUUID, Node::LocalID nodeLocalID) { | 334 | void AvatarMixerClientData::cleanupKilledNode(const QUuid&, Node::LocalID nodeLocalID) { |
| 335 | removeLastBroadcastSequenceNumber(nodeUUID); | 335 | removeLastBroadcastSequenceNumber(nodeLocalID); |
| 336 | removeLastBroadcastTime(nodeUUID); | 336 | removeLastBroadcastTime(nodeLocalID); |
| 337 | _lastSentTraitsTimestamps.erase(nodeLocalID); | 337 | _lastSentTraitsTimestamps.erase(nodeLocalID); |
| 338 | _sentTraitVersions.erase(nodeLocalID); | 338 | _sentTraitVersions.erase(nodeLocalID); |
| 339 | } | 339 | } |
| @@ -49,17 +49,16 @@ public: · 48 unmodified lines | |||
| 49 | const AvatarData* getConstAvatarData() const { return _avatar.get(); } | 49 | const AvatarData* getConstAvatarData() const { return _avatar.get(); } |
| 50 | AvatarSharedPointer getAvatarSharedPointer() const { return _avatar; } | 50 | AvatarSharedPointer getAvatarSharedPointer() const { return _avatar; } |
| 51 | 51 | ||
| 52 | uint16_t getLastBroadcastSequenceNumber(NLPacket::LocalID nodeID) const; | ||
| 53 | void setLastBroadcastSequenceNumber(NLPacket::LocalID nodeID, uint16_t sequenceNumber) | ||
| 54 | { _lastBroadcastSequenceNumbers[nodeID] = sequenceNumber; } | ||
| 55 | Q_INVOKABLE void removeLastBroadcastSequenceNumber(NLPacket::LocalID nodeID) { _lastBroadcastSequenceNumbers.erase(nodeID); } | ||
| 52 | bool isIgnoreRadiusEnabled() const { return _isIgnoreRadiusEnabled; } | 56 | bool isIgnoreRadiusEnabled() const { return _isIgnoreRadiusEnabled; } |
| 53 | void setIsIgnoreRadiusEnabled(bool enabled) { _isIgnoreRadiusEnabled = enabled; } | 57 | void setIsIgnoreRadiusEnabled(bool enabled) { _isIgnoreRadiusEnabled = enabled; } |
| 54 | 58 | ||
| 55 | uint16_t getLastBroadcastSequenceNumber(const QUuid& nodeUUID) const; | 59 | uint64_t getLastBroadcastTime(NLPacket::LocalID nodeUUID) const; |
| 56 | void setLastBroadcastSequenceNumber(const QUuid& nodeUUID, uint16_t sequenceNumber) | 60 | void setLastBroadcastTime(NLPacket::LocalID nodeUUID, uint64_t broadcastTime) { _lastBroadcastTimes[nodeUUID] = broadcastTime; } |
| 57 | { _lastBroadcastSequenceNumbers[nodeUUID] = sequenceNumber; } | 61 | Q_INVOKABLE void removeLastBroadcastTime(NLPacket::LocalID nodeUUID) { _lastBroadcastTimes.erase(nodeUUID); } |
| 58 | Q_INVOKABLE void removeLastBroadcastSequenceNumber(const QUuid& nodeUUID) { _lastBroadcastSequenceNumbers.erase(nodeUUID); } | ||
| 59 | |||
| 60 | uint64_t getLastBroadcastTime(const QUuid& nodeUUID) const; | ||
| 61 | void setLastBroadcastTime(const QUuid& nodeUUID, uint64_t broadcastTime) { _lastBroadcastTimes[nodeUUID] = broadcastTime; } | ||
| 62 | Q_INVOKABLE void removeLastBroadcastTime(const QUuid& nodeUUID) { _lastBroadcastTimes.erase(nodeUUID); } | ||
| 63 | 62 | ||
| 64 | Q_INVOKABLE void cleanupKilledNode(const QUuid& nodeUUID, Node::LocalID nodeLocalID); | 63 | Q_INVOKABLE void cleanupKilledNode(const QUuid& nodeUUID, Node::LocalID nodeLocalID); |
| 65 | 64 | ||
| @@ -93,7 +92,7 @@ public: · 27 unmodified lines | |||
| 93 | 92 | ||
| 94 | void loadJSONStats(QJsonObject& jsonObject) const; | 93 | void loadJSONStats(QJsonObject& jsonObject) const; |
| 95 | 94 | ||
| 96 | glm::vec3 getPosition() const { return _avatar ? _avatar->getWorldPosition() : glm::vec3(0); } | 95 | glm::vec3 getPosition() const { return _avatar ? _avatar->getClientGlobalPosition() : glm::vec3(0); } |
| 97 | bool isRadiusIgnoring(const QUuid& other) const; | 96 | bool isRadiusIgnoring(const QUuid& other) const; |
| 98 | void addToRadiusIgnoringSet(const QUuid& other); | 97 | void addToRadiusIgnoringSet(const QUuid& other); |
| 99 | void removeFromRadiusIgnoringSet(const QUuid& other); | 98 | void removeFromRadiusIgnoringSet(const QUuid& other); |
| @@ -114,10 +113,10 @@ public: · 14 unmodified lines | |||
| 114 | 113 | ||
| 115 | const ConicalViewFrustums& getViewFrustums() const { return _currentViewFrustums; } | 114 | const ConicalViewFrustums& getViewFrustums() const { return _currentViewFrustums; } |
| 116 | 115 | ||
| 117 | uint64_t getLastOtherAvatarEncodeTime(QUuid otherAvatar) const; | 116 | uint64_t getLastOtherAvatarEncodeTime(NLPacket::LocalID otherAvatar) const; |
| 118 | void setLastOtherAvatarEncodeTime(const QUuid& otherAvatar, uint64_t time); | 117 | void setLastOtherAvatarEncodeTime(NLPacket::LocalID otherAvatar, uint64_t time); |
| 119 | 118 | ||
| 120 | QVector<JointData>& getLastOtherAvatarSentJoints(QUuid otherAvatar) { return _lastOtherAvatarSentJoints[otherAvatar]; } | 119 | QVector<JointData>& getLastOtherAvatarSentJoints(NLPacket::LocalID otherAvatar) { return _lastOtherAvatarSentJoints[otherAvatar]; } |
| 121 | 120 | ||
| 122 | void queuePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer node); | 121 | void queuePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer node); |
| 123 | int processPackets(const SlaveSharedData& slaveSharedData); // returns number of packets processed | 122 | int processPackets(const SlaveSharedData& slaveSharedData); // returns number of packets processed |
| @@ -150,13 +149,13 @@ private: · 26 unmodified lines | |||
| 150 | AvatarSharedPointer _avatar { new AvatarData() }; | 149 | AvatarSharedPointer _avatar { new AvatarData() }; |
| 151 | 150 | ||
| 152 | uint16_t _lastReceivedSequenceNumber { 0 }; | 151 | uint16_t _lastReceivedSequenceNumber { 0 }; |
| 153 | std::unordered_map<QUuid, uint16_t> _lastBroadcastSequenceNumbers; | 152 | std::unordered_map<NLPacket::LocalID, uint16_t> _lastBroadcastSequenceNumbers; |
| 154 | std::unordered_map<QUuid, uint64_t> _lastBroadcastTimes; | 153 | std::unordered_map<NLPacket::LocalID, uint64_t> _lastBroadcastTimes; |
| 155 | 154 | ||
| 156 | // this is a map of the last time we encoded an "other" avatar for | 155 | // this is a map of the last time we encoded an "other" avatar for |
| 157 | // sending to "this" node | 156 | // sending to "this" node |
| 158 | std::unordered_map<QUuid, uint64_t> _lastOtherAvatarEncodeTime; | 157 | std::unordered_map<NLPacket::LocalID, uint64_t> _lastOtherAvatarEncodeTime; |
| 159 | std::unordered_map<QUuid, QVector<JointData>> _lastOtherAvatarSentJoints; | 158 | std::unordered_map<NLPacket::LocalID, QVector<JointData>> _lastOtherAvatarSentJoints; |
| 160 | 159 | ||
| 161 | uint64_t _identityChangeTimestamp; | 160 | uint64_t _identityChangeTimestamp; |
| 162 | bool _avatarSessionDisplayNameMustChange{ true }; | 161 | bool _avatarSessionDisplayNameMustChange{ true }; |
| @@ -68,13 +68,11 @@ void AvatarMixerSlave::processIncomingPackets(const SharedNodePointer& node) { · 67 unmodified lines | |||
| 68 | _stats.processIncomingPacketsElapsedTime += (end - start); | 68 | _stats.processIncomingPacketsElapsedTime += (end - start); |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | int AvatarMixerSlave::sendIdentityPacket(const AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode) { | 71 | int AvatarMixerSlave::sendIdentityPacket(NLPacketList& packetList, const AvatarMixerClientData* nodeData, const Node& destinationNode) { |
| 72 | if (destinationNode->getType() == NodeType::Agent && !destinationNode->isUpstream()) { | 72 | if (destinationNode.getType() == NodeType::Agent && !destinationNode.isUpstream()) { |
| 73 | QByteArray individualData = nodeData->getConstAvatarData()->identityByteArray(); | 73 | QByteArray individualData = nodeData->getConstAvatarData()->identityByteArray(); |
| 74 | individualData.replace(0, NUM_BYTES_RFC4122_UUID, nodeData->getNodeID().toRfc4122()); // FIXME, this looks suspicious | 74 | individualData.replace(0, NUM_BYTES_RFC4122_UUID, nodeData->getNodeID().toRfc4122()); // FIXME, this looks suspicious |
| 75 | auto identityPackets = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true); | 75 | packetList.write(individualData); |
| 76 | identityPackets->write(individualData); | ||
| 77 | DependencyManager::get<NodeList>()->sendPacketList(std::move(identityPackets), *destinationNode); | ||
| 78 | _stats.numIdentityPackets++; | 76 | _stats.numIdentityPackets++; |
| 79 | return individualData.size(); | 77 | return individualData.size(); |
| 80 | } else { | 78 | } else { |
| @@ -247,12 +245,12 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 166 unmodified lines | |||
| 247 | // reset the internal state for correct random number distribution | 245 | // reset the internal state for correct random number distribution |
| 248 | distribution.reset(); | 246 | distribution.reset(); |
| 249 | 247 | ||
| 248 | // Estimate number to sort on number sent last frame (with min. of 20). | ||
| 249 | const int numToSendEst = std::max(int(nodeData->getNumAvatarsSentLastFrame() * 2.5f), 20); | ||
| 250 | |||
| 250 | // reset the number of sent avatars | 251 | // reset the number of sent avatars |
| 251 | nodeData->resetNumAvatarsSentLastFrame(); | 252 | nodeData->resetNumAvatarsSentLastFrame(); |
| 252 | 253 | ||
| 253 | // keep a counter of the number of considered avatars | ||
| 254 | int numOtherAvatars = 0; | ||
| 255 | |||
| 256 | // keep track of outbound data rate specifically for avatar data | 254 | // keep track of outbound data rate specifically for avatar data |
| 257 | int numAvatarDataBytes = 0; | 255 | int numAvatarDataBytes = 0; |
| 258 | int identityBytesSent = 0; | 256 | int identityBytesSent = 0; |
| @@ -261,7 +259,6 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 2 unmodified lines | |||
| 261 | // max number of avatarBytes per frame | 259 | // max number of avatarBytes per frame |
| 262 | int maxAvatarBytesPerFrame = int(_maxKbpsPerNode * BYTES_PER_KILOBIT / AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND); | 260 | int maxAvatarBytesPerFrame = int(_maxKbpsPerNode * BYTES_PER_KILOBIT / AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND); |
| 263 | 261 | ||
| 264 | |||
| 265 | // keep track of the number of other avatars held back in this frame | 262 | // keep track of the number of other avatars held back in this frame |
| 266 | int numAvatarsHeldBack = 0; | 263 | int numAvatarsHeldBack = 0; |
| 267 | 264 | ||
| @@ -279,10 +276,6 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 11 unmodified lines | |||
| 279 | int minimumBytesPerAvatar = PALIsOpen ? AvatarDataPacket::AVATAR_HAS_FLAGS_SIZE + NUM_BYTES_RFC4122_UUID + | 276 | int minimumBytesPerAvatar = PALIsOpen ? AvatarDataPacket::AVATAR_HAS_FLAGS_SIZE + NUM_BYTES_RFC4122_UUID + |
| 280 | sizeof(AvatarDataPacket::AvatarGlobalPosition) + sizeof(AvatarDataPacket::AudioLoudness) : 0; | 277 | sizeof(AvatarDataPacket::AvatarGlobalPosition) + sizeof(AvatarDataPacket::AudioLoudness) : 0; |
| 281 | 278 | ||
| 282 | // setup a PacketList for the avatarPackets | ||
| 283 | auto avatarPacketList = NLPacketList::create(PacketType::BulkAvatarData); | ||
| 284 | static auto maxAvatarDataBytes = avatarPacketList->getMaxSegmentSize() - NUM_BYTES_RFC4122_UUID; | ||
| 285 | |||
| 286 | // compute node bounding box | 279 | // compute node bounding box |
| 287 | const float MY_AVATAR_BUBBLE_EXPANSION_FACTOR = 4.0f; // magic number determined emperically | 280 | const float MY_AVATAR_BUBBLE_EXPANSION_FACTOR = 4.0f; // magic number determined emperically |
| 288 | AABox nodeBox = computeBubbleBox(avatar, MY_AVATAR_BUBBLE_EXPANSION_FACTOR); | 281 | AABox nodeBox = computeBubbleBox(avatar, MY_AVATAR_BUBBLE_EXPANSION_FACTOR); |
| @@ -350,8 +343,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 61 unmodified lines | |||
| 350 | // Don't bother with these checks if the other avatar has their bubble enabled and we're gettingAnyIgnored | 343 | // Don't bother with these checks if the other avatar has their bubble enabled and we're gettingAnyIgnored |
| 351 | if (nodeData->isIgnoreRadiusEnabled() || (avatarClientNodeData->isIgnoreRadiusEnabled() && !getsAnyIgnored)) { | 344 | if (nodeData->isIgnoreRadiusEnabled() || (avatarClientNodeData->isIgnoreRadiusEnabled() && !getsAnyIgnored)) { |
| 352 | // Perform the collision check between the two bounding boxes | 345 | // Perform the collision check between the two bounding boxes |
| 353 | const float OTHER_AVATAR_BUBBLE_EXPANSION_FACTOR = 2.4f; // magic number determined empirically | 346 | AABox otherNodeBox = avatarClientNodeData->getAvatar().getDefaultBubbleBox(); |
| 354 | AABox otherNodeBox = computeBubbleBox(avatarClientNodeData->getAvatar(), OTHER_AVATAR_BUBBLE_EXPANSION_FACTOR); | ||
| 355 | if (nodeBox.touches(otherNodeBox)) { | 347 | if (nodeBox.touches(otherNodeBox)) { |
| 356 | nodeData->ignoreOther(destinationNode, avatarNode); | 348 | nodeData->ignoreOther(destinationNode, avatarNode); |
| 357 | shouldIgnore = !getsAnyIgnored; | 349 | shouldIgnore = !getsAnyIgnored; |
| @@ -364,7 +356,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 6 unmodified lines | |||
| 364 | } | 356 | } |
| 365 | 357 | ||
| 366 | if (!shouldIgnore) { | 358 | if (!shouldIgnore) { |
| 367 | AvatarDataSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(avatarNode->getUUID()); | 359 | AvatarDataSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(avatarNode->getLocalID()); |
| 368 | AvatarDataSequenceNumber lastSeqFromSender = avatarClientNodeData->getLastReceivedSequenceNumber(); | 360 | AvatarDataSequenceNumber lastSeqFromSender = avatarClientNodeData->getLastReceivedSequenceNumber(); |
| 369 | 361 | ||
| 370 | // FIXME - This code does appear to be working. But it seems brittle. | 362 | // FIXME - This code does appear to be working. But it seems brittle. |
| @@ -396,7 +388,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 25 unmodified lines | |||
| 396 | if (!shouldIgnore) { | 388 | if (!shouldIgnore) { |
| 397 | // sort this one for later | 389 | // sort this one for later |
| 398 | const AvatarData* avatarNodeData = avatarClientNodeData->getConstAvatarData(); | 390 | const AvatarData* avatarNodeData = avatarClientNodeData->getConstAvatarData(); |
| 399 | auto lastEncodeTime = nodeData->getLastOtherAvatarEncodeTime(avatarNodeData->getSessionUUID()); | 391 | auto lastEncodeTime = nodeData->getLastOtherAvatarEncodeTime(avatarNode->getLocalID()); |
| 400 | 392 | ||
| 401 | sortedAvatars.push(SortableAvatar(avatarNodeData, avatarNode, lastEncodeTime)); | 393 | sortedAvatars.push(SortableAvatar(avatarNodeData, avatarNode, lastEncodeTime)); |
| 402 | } | 394 | } |
| @@ -406,8 +398,13 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 3 unmodified lines | |||
| 406 | 398 | ||
| 407 | int remainingAvatars = (int)sortedAvatars.size(); | 399 | int remainingAvatars = (int)sortedAvatars.size(); |
| 408 | auto traitsPacketList = NLPacketList::create(PacketType::BulkAvatarTraits, QByteArray(), true, true); | 400 | auto traitsPacketList = NLPacketList::create(PacketType::BulkAvatarTraits, QByteArray(), true, true); |
| 401 | auto avatarPacket = NLPacket::create(PacketType::BulkAvatarData); | ||
| 402 | const int avatarPacketCapacity = avatarPacket->getPayloadCapacity(); | ||
| 403 | int avatarSpaceAvailable = avatarPacketCapacity; | ||
| 404 | int numPacketsSent = 0; | ||
| 405 | auto identityPacketList = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true); | ||
| 409 | 406 | ||
| 410 | const auto& sortedAvatarVector = sortedAvatars.getSortedVector(); | 407 | const auto& sortedAvatarVector = sortedAvatars.getSortedVector(numToSendEst); |
| 411 | for (const auto& sortedAvatar : sortedAvatarVector) { | 408 | for (const auto& sortedAvatar : sortedAvatarVector) { |
| 412 | const Node* otherNode = sortedAvatar.getNode(); | 409 | const Node* otherNode = sortedAvatar.getNode(); |
| 413 | auto lastEncodeForOther = sortedAvatar.getTimestamp(); | 410 | auto lastEncodeForOther = sortedAvatar.getTimestamp(); |
| @@ -432,21 +429,9 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 18 unmodified lines | |||
| 432 | 429 | ||
| 433 | auto startAvatarDataPacking = chrono::high_resolution_clock::now(); | 430 | auto startAvatarDataPacking = chrono::high_resolution_clock::now(); |
| 434 | 431 | ||
| 435 | ++numOtherAvatars; | ||
| 436 | |||
| 437 | const AvatarMixerClientData* otherNodeData = reinterpret_cast<const AvatarMixerClientData*>(otherNode->getLinkedData()); | 432 | const AvatarMixerClientData* otherNodeData = reinterpret_cast<const AvatarMixerClientData*>(otherNode->getLinkedData()); |
| 438 | const AvatarData* otherAvatar = otherNodeData->getConstAvatarData(); | 433 | const AvatarData* otherAvatar = otherNodeData->getConstAvatarData(); |
| 439 | 434 | ||
| 440 | // If the time that the mixer sent AVATAR DATA about Avatar B to Avatar A is BEFORE OR EQUAL TO | ||
| 441 | // the time that Avatar B flagged an IDENTITY DATA change, send IDENTITY DATA about Avatar B to Avatar A. | ||
| 442 | if (otherAvatar->hasProcessedFirstIdentity() | ||
| 443 | && nodeData->getLastBroadcastTime(otherNode->getUUID()) <= otherNodeData->getIdentityChangeTimestamp()) { | ||
| 444 | identityBytesSent += sendIdentityPacket(otherNodeData, node); | ||
| 445 | |||
| 446 | // remember the last time we sent identity details about this other node to the receiver | ||
| 447 | nodeData->setLastBroadcastTime(otherNode->getUUID(), usecTimestampNow()); | ||
| 448 | } | ||
| 449 | |||
| 450 | // Typically all out-of-view avatars but such avatars' priorities will rise with time: | 435 | // Typically all out-of-view avatars but such avatars' priorities will rise with time: |
| 451 | bool isLowerPriority = sortedAvatar.getPriority() <= OUT_OF_VIEW_THRESHOLD; | 436 | bool isLowerPriority = sortedAvatar.getPriority() <= OUT_OF_VIEW_THRESHOLD; |
| 452 | 437 | ||
| @@ -456,71 +441,56 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 3 unmodified lines | |||
| 456 | } else if (!overBudget) { | 441 | } else if (!overBudget) { |
| 457 | detail = distribution(generator) < AVATAR_SEND_FULL_UPDATE_RATIO ? AvatarData::SendAllData : AvatarData::CullSmallData; | 442 | detail = distribution(generator) < AVATAR_SEND_FULL_UPDATE_RATIO ? AvatarData::SendAllData : AvatarData::CullSmallData; |
| 458 | nodeData->incrementAvatarInView(); | 443 | nodeData->incrementAvatarInView(); |
| 459 | } | ||
| 460 | 444 | ||
| 461 | bool includeThisAvatar = true; | 445 | // If the time that the mixer sent AVATAR DATA about Avatar B to Avatar A is BEFORE OR EQUAL TO |
| 462 | QVector<JointData>& lastSentJointsForOther = nodeData->getLastOtherAvatarSentJoints(otherNode->getUUID()); | 446 | // the time that Avatar B flagged an IDENTITY DATA change, send IDENTITY DATA about Avatar B to Avatar A. |
| 463 | 447 | if (otherAvatar->hasProcessedFirstIdentity() | |
| 464 | lastSentJointsForOther.resize(otherAvatar->getJointCount()); | 448 | && nodeData->getLastBroadcastTime(otherNode->getLocalID()) <= otherNodeData->getIdentityChangeTimestamp()) { |
| 465 | 449 | identityBytesSent += sendIdentityPacket(*identityPacketList, otherNodeData, *destinationNode); | |
| 466 | bool distanceAdjust = true; | 450 | |
| 467 | glm::vec3 viewerPosition = myPosition; | 451 | // remember the last time we sent identity details about this other node to the receiver |
| 468 | AvatarDataPacket::HasFlags hasFlagsOut; // the result of the toByteArray | 452 | nodeData->setLastBroadcastTime(otherNode->getLocalID(), usecTimestampNow()); |
| 469 | bool dropFaceTracking = false; | ||
| 470 | |||
| 471 | auto startSerialize = chrono::high_resolution_clock::now(); | ||
| 472 | QByteArray bytes = otherAvatar->toByteArray(detail, lastEncodeForOther, lastSentJointsForOther, | ||
| 473 | hasFlagsOut, dropFaceTracking, distanceAdjust, viewerPosition, | ||
| 474 | &lastSentJointsForOther); | ||
| 475 | auto endSerialize = chrono::high_resolution_clock::now(); | ||
| 476 | _stats.toByteArrayElapsedTime += | ||
| 477 | (quint64) chrono::duration_cast<chrono::microseconds>(endSerialize - startSerialize).count(); | ||
| 478 | |||
| 479 | if (bytes.size() > maxAvatarDataBytes) { | ||
| 480 | qCWarning(avatars) << "otherAvatar.toByteArray() for" << otherNode->getUUID() | ||
| 481 | << "resulted in very large buffer of" << bytes.size() << "bytes - dropping facial data"; | ||
| 482 | |||
| 483 | dropFaceTracking = true; // first try dropping the facial data | ||
| 484 | bytes = otherAvatar->toByteArray(detail, lastEncodeForOther, lastSentJointsForOther, | ||
| 485 | hasFlagsOut, dropFaceTracking, distanceAdjust, viewerPosition, &lastSentJointsForOther); | ||
| 486 | |||
| 487 | if (bytes.size() > maxAvatarDataBytes) { | ||
| 488 | qCWarning(avatars) << "otherAvatar.toByteArray() for" << otherNode->getUUID() | ||
| 489 | << "without facial data resulted in very large buffer of" << bytes.size() | ||
| 490 | << "bytes - reducing to MinimumData"; | ||
| 491 | bytes = otherAvatar->toByteArray(AvatarData::MinimumData, lastEncodeForOther, lastSentJointsForOther, | ||
| 492 | hasFlagsOut, dropFaceTracking, distanceAdjust, viewerPosition, &lastSentJointsForOther); | ||
| 493 | |||
| 494 | if (bytes.size() > maxAvatarDataBytes) { | ||
| 495 | qCWarning(avatars) << "otherAvatar.toByteArray() for" << otherNode->getUUID() | ||
| 496 | << "MinimumData resulted in very large buffer of" << bytes.size() | ||
| 497 | << "bytes - refusing to send avatar"; | ||
| 498 | includeThisAvatar = false; | ||
| 499 | } | ||
| 500 | } | 453 | } |
| 501 | } | 454 | } |
| 502 | 455 | ||
| 503 | if (includeThisAvatar) { | 456 | QVector<JointData>& lastSentJointsForOther = nodeData->getLastOtherAvatarSentJoints(otherNode->getLocalID()); |
| 504 | // start a new segment in the PacketList for this avatar | 457 | |
| 505 | avatarPacketList->startSegment(); | 458 | const bool distanceAdjust = true; |
| 506 | numAvatarDataBytes += avatarPacketList->write(otherNode->getUUID().toRfc4122()); | 459 | const bool dropFaceTracking = false; |
| 507 | numAvatarDataBytes += avatarPacketList->write(bytes); | 460 | AvatarDataPacket::SendStatus sendStatus; |
| 508 | avatarPacketList->endSegment(); | 461 | sendStatus.sendUUID = true; |
| 462 | |||
| 463 | do { | ||
| 464 | auto startSerialize = chrono::high_resolution_clock::now(); | ||
| 465 | QByteArray bytes = otherAvatar->toByteArray(detail, lastEncodeForOther, lastSentJointsForOther, | ||
| 466 | sendStatus, dropFaceTracking, distanceAdjust, myPosition, | ||
| 467 | &lastSentJointsForOther, avatarSpaceAvailable); | ||
| 468 | auto endSerialize = chrono::high_resolution_clock::now(); | ||
| 469 | _stats.toByteArrayElapsedTime += | ||
| 470 | (quint64)chrono::duration_cast<chrono::microseconds>(endSerialize - startSerialize).count(); | ||
| 471 | |||
| 472 | avatarPacket->write(bytes); | ||
| 473 | avatarSpaceAvailable -= bytes.size(); | ||
| 474 | numAvatarDataBytes += bytes.size(); | ||
| 475 | if (!sendStatus || avatarSpaceAvailable < (int)AvatarDataPacket::MIN_BULK_PACKET_SIZE) { | ||
| 476 | // Weren't able to fit everything. | ||
| 477 | nodeList->sendPacket(std::move(avatarPacket), *destinationNode); | ||
| 478 | ++numPacketsSent; | ||
| 479 | avatarPacket = NLPacket::create(PacketType::BulkAvatarData); | ||
| 480 | avatarSpaceAvailable = avatarPacketCapacity; | ||
| 481 | } | ||
| 482 | } while (!sendStatus); | ||
| 509 | 483 | ||
| 510 | if (detail != AvatarData::NoData) { | 484 | if (detail != AvatarData::NoData) { |
| 511 | _stats.numOthersIncluded++; | 485 | _stats.numOthersIncluded++; |
| 512 | 486 | ||
| 513 | // increment the number of avatars sent to this reciever | 487 | // increment the number of avatars sent to this receiver |
| 514 | nodeData->incrementNumAvatarsSentLastFrame(); | 488 | nodeData->incrementNumAvatarsSentLastFrame(); |
| 515 | 489 | ||
| 516 | // set the last sent sequence number for this sender on the receiver | 490 | // set the last sent sequence number for this sender on the receiver |
| 517 | nodeData->setLastBroadcastSequenceNumber(otherNode->getUUID(), | 491 | nodeData->setLastBroadcastSequenceNumber(otherNode->getLocalID(), |
| 518 | otherNodeData->getLastReceivedSequenceNumber()); | 492 | otherNodeData->getLastReceivedSequenceNumber()); |
| 519 | nodeData->setLastOtherAvatarEncodeTime(otherNode->getUUID(), usecTimestampNow()); | 493 | nodeData->setLastOtherAvatarEncodeTime(otherNode->getLocalID(), usecTimestampNow()); |
| 520 | } | ||
| 521 | } else { | ||
| 522 | // TODO? this avatar is not included now, and will probably not be included next frame. | ||
| 523 | // It would be nice if we could tweak its future sort priority to put it at the back of the list. | ||
| 524 | } | 494 | } |
| 525 | 495 | ||
| 526 | auto endAvatarDataPacking = chrono::high_resolution_clock::now(); | 496 | auto endAvatarDataPacking = chrono::high_resolution_clock::now(); |
| @@ -532,17 +502,21 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 5 unmodified lines | |||
| 532 | remainingAvatars--; | 502 | remainingAvatars--; |
| 533 | } | 503 | } |
| 534 | 504 | ||
| 505 | if (nodeData->getNumAvatarsSentLastFrame() > numToSendEst) { | ||
| 506 | qCWarning(avatars) << "More avatars sent than upper estimate" << nodeData->getNumAvatarsSentLastFrame() | ||
| 507 | << " / " << numToSendEst; | ||
| 508 | } | ||
| 509 | |||
| 535 | quint64 startPacketSending = usecTimestampNow(); | 510 | quint64 startPacketSending = usecTimestampNow(); |
| 536 | 511 | ||
| 537 | // close the current packet so that we're always sending something | 512 | if (avatarPacket->getPayloadSize() != 0) { |
| 538 | avatarPacketList->closeCurrentPacket(true); | 513 | nodeList->sendPacket(std::move(avatarPacket), *destinationNode); |
| 514 | ++numPacketsSent; | ||
| 515 | } | ||
| 539 | 516 | ||
| 540 | _stats.numPacketsSent += (int)avatarPacketList->getNumPackets(); | 517 | _stats.numPacketsSent += numPacketsSent; |
| 541 | _stats.numBytesSent += numAvatarDataBytes; | 518 | _stats.numBytesSent += numAvatarDataBytes; |
| 542 | 519 | ||
| 543 | // send the avatar data PacketList | ||
| 544 | nodeList->sendPacketList(std::move(avatarPacketList), *destinationNode); | ||
| 545 | |||
| 546 | // record the bytes sent for other avatar data in the AvatarMixerClientData | 520 | // record the bytes sent for other avatar data in the AvatarMixerClientData |
| 547 | nodeData->recordSentAvatarData(numAvatarDataBytes); | 521 | nodeData->recordSentAvatarData(numAvatarDataBytes); |
| 548 | 522 | ||
| @@ -554,6 +528,12 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 5 unmodified lines | |||
| 554 | nodeList->sendPacketList(std::move(traitsPacketList), *destinationNode); | 528 | nodeList->sendPacketList(std::move(traitsPacketList), *destinationNode); |
| 555 | } | 529 | } |
| 556 | 530 | ||
| 531 | // Send any AvatarIdentity packets: | ||
| 532 | identityPacketList->closeCurrentPacket(); | ||
| 533 | if (identityBytesSent > 0) { | ||
| 534 | nodeList->sendPacketList(std::move(identityPacketList), *destinationNode); | ||
| 535 | } | ||
| 536 | |||
| 557 | // record the number of avatars held back this frame | 537 | // record the number of avatars held back this frame |
| 558 | nodeData->recordNumOtherAvatarStarves(numAvatarsHeldBack); | 538 | nodeData->recordNumOtherAvatarStarves(numAvatarsHeldBack); |
| 559 | nodeData->recordNumOtherAvatarSkips(numAvatarsWithSkippedFrames); | 539 | nodeData->recordNumOtherAvatarSkips(numAvatarsWithSkippedFrames); |
| @@ -599,20 +579,20 @@ void AvatarMixerSlave::broadcastAvatarDataToDownstreamMixer(const SharedNodePoin · 39 unmodified lines | |||
| 599 | // so we always send a full update for this avatar | 579 | // so we always send a full update for this avatar |
| 600 | 580 | ||
| 601 | quint64 start = usecTimestampNow(); | 581 | quint64 start = usecTimestampNow(); |
| 602 | AvatarDataPacket::HasFlags flagsOut; | 582 | AvatarDataPacket::SendStatus sendStatus; |
| 603 | 583 | ||
| 604 | QVector<JointData> emptyLastJointSendData { otherAvatar->getJointCount() }; | 584 | QVector<JointData> emptyLastJointSendData { otherAvatar->getJointCount() }; |
| 605 | 585 | ||
| 606 | QByteArray avatarByteArray = otherAvatar->toByteArray(AvatarData::SendAllData, 0, emptyLastJointSendData, | 586 | QByteArray avatarByteArray = otherAvatar->toByteArray(AvatarData::SendAllData, 0, emptyLastJointSendData, |
| 607 | flagsOut, false, false, glm::vec3(0), nullptr); | 587 | sendStatus, false, false, glm::vec3(0), nullptr, 0); |
| 608 | quint64 end = usecTimestampNow(); | 588 | quint64 end = usecTimestampNow(); |
| 609 | _stats.toByteArrayElapsedTime += (end - start); | 589 | _stats.toByteArrayElapsedTime += (end - start); |
| 610 | 590 | ||
| 611 | auto lastBroadcastTime = nodeData->getLastBroadcastTime(agentNode->getUUID()); | 591 | auto lastBroadcastTime = nodeData->getLastBroadcastTime(agentNode->getLocalID()); |
| 612 | if (lastBroadcastTime <= agentNodeData->getIdentityChangeTimestamp() | 592 | if (lastBroadcastTime <= agentNodeData->getIdentityChangeTimestamp() |
| 613 | || (start - lastBroadcastTime) >= REBROADCAST_IDENTITY_TO_DOWNSTREAM_EVERY_US) { | 593 | || (start - lastBroadcastTime) >= REBROADCAST_IDENTITY_TO_DOWNSTREAM_EVERY_US) { |
| 614 | sendReplicatedIdentityPacket(*agentNode, agentNodeData, *node); | 594 | sendReplicatedIdentityPacket(*agentNode, agentNodeData, *node); |
| 615 | nodeData->setLastBroadcastTime(agentNode->getUUID(), start); | 595 | nodeData->setLastBroadcastTime(agentNode->getLocalID(), start); |
| 616 | } | 596 | } |
| 617 | 597 | ||
| 618 | // figure out how large our avatar byte array can be to fit in the packet list | 598 | // figure out how large our avatar byte array can be to fit in the packet list |
| @@ -630,14 +610,14 @@ void AvatarMixerSlave::broadcastAvatarDataToDownstreamMixer(const SharedNodePoin · 11 unmodified lines | |||
| 630 | << "-" << avatarByteArray.size() << "bytes"; | 610 | << "-" << avatarByteArray.size() << "bytes"; |
| 631 | 611 | ||
| 632 | avatarByteArray = otherAvatar->toByteArray(AvatarData::SendAllData, 0, emptyLastJointSendData, | 612 | avatarByteArray = otherAvatar->toByteArray(AvatarData::SendAllData, 0, emptyLastJointSendData, |
| 633 | flagsOut, true, false, glm::vec3(0), nullptr); | 613 | sendStatus, true, false, glm::vec3(0), nullptr, 0); |
| 634 | 614 | ||
| 635 | if (avatarByteArray.size() > maxAvatarByteArraySize) { | 615 | if (avatarByteArray.size() > maxAvatarByteArraySize) { |
| 636 | qCWarning(avatars) << "Replicated avatar data without facial data still too large for" | 616 | qCWarning(avatars) << "Replicated avatar data without facial data still too large for" |
| 637 | << otherAvatar->getSessionUUID() << "-" << avatarByteArray.size() << "bytes"; | 617 | << otherAvatar->getSessionUUID() << "-" << avatarByteArray.size() << "bytes"; |
| 638 | 618 | ||
| 639 | avatarByteArray = otherAvatar->toByteArray(AvatarData::MinimumData, 0, emptyLastJointSendData, | 619 | avatarByteArray = otherAvatar->toByteArray(AvatarData::MinimumData, 0, emptyLastJointSendData, |
| 640 | flagsOut, true, false, glm::vec3(0), nullptr); | 620 | sendStatus, true, false, glm::vec3(0), nullptr, 0); |
| 641 | } | 621 | } |
| 642 | } | 622 | } |
| 643 | 623 | ||
| @@ -646,7 +626,7 @@ void AvatarMixerSlave::broadcastAvatarDataToDownstreamMixer(const SharedNodePoin · 2 unmodified lines | |||
| 646 | nodeData->incrementNumAvatarsSentLastFrame(); | 626 | nodeData->incrementNumAvatarsSentLastFrame(); |
| 647 | 627 | ||
| 648 | // set the last sent sequence number for this sender on the receiver | 628 | // set the last sent sequence number for this sender on the receiver |
| 649 | nodeData->setLastBroadcastSequenceNumber(agentNode->getUUID(), | 629 | nodeData->setLastBroadcastSequenceNumber(agentNode->getLocalID(), |
| 650 | agentNodeData->getLastReceivedSequenceNumber()); | 630 | agentNodeData->getLastReceivedSequenceNumber()); |
| 651 | 631 | ||
| 652 | // increment the number of avatars sent to this reciever | 632 | // increment the number of avatars sent to this reciever |
| @@ -101,7 +101,7 @@ public: · 100 unmodified lines | |||
| 101 | void harvestStats(AvatarMixerSlaveStats& stats); | 101 | void harvestStats(AvatarMixerSlaveStats& stats); |
| 102 | 102 | ||
| 103 | private: | 103 | private: |
| 104 | int sendIdentityPacket(const AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode); | 104 | int sendIdentityPacket(NLPacketList& packet, const AvatarMixerClientData* nodeData, const Node& destinationNode); |
| 105 | int sendReplicatedIdentityPacket(const Node& agentNode, const AvatarMixerClientData* nodeData, const Node& destinationNode); | 105 | int sendReplicatedIdentityPacket(const Node& agentNode, const AvatarMixerClientData* nodeData, const Node& destinationNode); |
| 106 | 106 | ||
| 107 | qint64 addChangedTraitsToBulkPacket(AvatarMixerClientData* listeningNodeData, | 107 | qint64 addChangedTraitsToBulkPacket(AvatarMixerClientData* listeningNodeData, |
| @@ -69,10 +69,10 @@ void ScriptableAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { · 68 unmodified lines | |||
| 69 | AvatarData::setSkeletonModelURL(skeletonModelURL); | 69 | AvatarData::setSkeletonModelURL(skeletonModelURL); |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | static AnimPose composeAnimPose(const FBXJoint& fbxJoint, const glm::quat rotation, const glm::vec3 translation) { | 72 | static AnimPose composeAnimPose(const HFMJoint& joint, const glm::quat rotation, const glm::vec3 translation) { |
| 73 | glm::mat4 translationMat = glm::translate(translation); | 73 | glm::mat4 translationMat = glm::translate(translation); |
| 74 | glm::mat4 rotationMat = glm::mat4_cast(fbxJoint.preRotation * rotation * fbxJoint.postRotation); | 74 | glm::mat4 rotationMat = glm::mat4_cast(joint.preRotation * rotation * joint.postRotation); |
| 75 | glm::mat4 finalMat = translationMat * fbxJoint.preTransform * rotationMat * fbxJoint.postTransform; | 75 | glm::mat4 finalMat = translationMat * joint.preTransform * rotationMat * joint.postTransform; |
| 76 | return AnimPose(finalMat); | 76 | return AnimPose(finalMat); |
| 77 | } | 77 | } |
| 78 | 78 | ||
| @@ -84,7 +84,7 @@ void ScriptableAvatar::update(float deltatime) { · 5 unmodified lines | |||
| 84 | // Run animation | 84 | // Run animation |
| 85 | if (_animation && _animation->isLoaded() && _animation->getFrames().size() > 0 && !_bind.isNull() && _bind->isLoaded()) { | 85 | if (_animation && _animation->isLoaded() && _animation->getFrames().size() > 0 && !_bind.isNull() && _bind->isLoaded()) { |
| 86 | if (!_animSkeleton) { | 86 | if (!_animSkeleton) { |
| 87 | _animSkeleton = std::make_shared<AnimSkeleton>(_bind->getGeometry()); | 87 | _animSkeleton = std::make_shared<AnimSkeleton>(_bind->getHFMModel()); |
| 88 | } | 88 | } |
| 89 | float currentFrame = _animationDetails.currentFrame + deltatime * _animationDetails.fps; | 89 | float currentFrame = _animationDetails.currentFrame + deltatime * _animationDetails.fps; |
| 90 | if (_animationDetails.loop || currentFrame < _animationDetails.lastFrame) { | 90 | if (_animationDetails.loop || currentFrame < _animationDetails.lastFrame) { |
| @@ -93,7 +93,7 @@ void ScriptableAvatar::update(float deltatime) { · 2 unmodified lines | |||
| 93 | } | 93 | } |
| 94 | _animationDetails.currentFrame = currentFrame; | 94 | _animationDetails.currentFrame = currentFrame; |
| 95 | 95 | ||
| 96 | const QVector<FBXJoint>& modelJoints = _bind->getGeometry().joints; | 96 | const QVector<HFMJoint>& modelJoints = _bind->getHFMModel().joints; |
| 97 | QStringList animationJointNames = _animation->getJointNames(); | 97 | QStringList animationJointNames = _animation->getJointNames(); |
| 98 | 98 | ||
| 99 | const int nJoints = modelJoints.size(); | 99 | const int nJoints = modelJoints.size(); |
| @@ -102,8 +102,8 @@ void ScriptableAvatar::update(float deltatime) { · 2 unmodified lines | |||
| 102 | } | 102 | } |
| 103 | 103 | ||
| 104 | const int frameCount = _animation->getFrames().size(); | 104 | const int frameCount = _animation->getFrames().size(); |
| 105 | const FBXAnimationFrame& floorFrame = _animation->getFrames().at((int)glm::floor(currentFrame) % frameCount); | 105 | const HFMAnimationFrame& floorFrame = _animation->getFrames().at((int)glm::floor(currentFrame) % frameCount); |
| 106 | const FBXAnimationFrame& ceilFrame = _animation->getFrames().at((int)glm::ceil(currentFrame) % frameCount); | 106 | const HFMAnimationFrame& ceilFrame = _animation->getFrames().at((int)glm::ceil(currentFrame) % frameCount); |
| 107 | const float frameFraction = glm::fract(currentFrame); | 107 | const float frameFraction = glm::fract(currentFrame); |
| 108 | std::vector<AnimPose> poses = _animSkeleton->getRelativeDefaultPoses(); | 108 | std::vector<AnimPose> poses = _animSkeleton->getRelativeDefaultPoses(); |
| 109 | 109 | ||
| @@ -113,7 +113,7 @@ void ScriptableAvatar::update(float deltatime) { · 3 unmodified lines | |||
| 113 | const QString& name = animationJointNames[i]; | 113 | const QString& name = animationJointNames[i]; |
| 114 | // As long as we need the model preRotations anyway, let's get the jointIndex from the bind skeleton rather than | 114 | // As long as we need the model preRotations anyway, let's get the jointIndex from the bind skeleton rather than |
| 115 | // trusting the .fst (which is sometimes not updated to match changes to .fbx). | 115 | // trusting the .fst (which is sometimes not updated to match changes to .fbx). |
| 116 | int mapping = _bind->getGeometry().getJointIndex(name); | 116 | int mapping = _bind->getHFMModel().getJointIndex(name); |
| 117 | if (mapping != -1 && !_maskedJoints.contains(name)) { | 117 | if (mapping != -1 && !_maskedJoints.contains(name)) { |
| 118 | 118 | ||
| 119 | AnimPose floorPose = composeAnimPose(modelJoints[mapping], floorFrame.rotations[i], floorFrame.translations[i] * UNIT_SCALE); | 119 | AnimPose floorPose = composeAnimPose(modelJoints[mapping], floorFrame.rotations[i], floorFrame.translations[i] * UNIT_SCALE); |
| @@ -1,20 +0,0 @@ | |||
| 1 | set(EXTERNAL_NAME boostconfig) | ||
| 2 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 3 | |||
| 4 | include(ExternalProject) | ||
| 5 | ExternalProject_Add( | ||
| 6 | ${EXTERNAL_NAME} | ||
| 7 | #URL https://github.com/boostorg/config/archive/boost-1.58.0.zip | ||
| 8 | URL https://public.highfidelity.com/dependencies/config-boost-1.58.0.zip | ||
| 9 | URL_MD5 42fa673bae2b7645a22736445e80eb8d | ||
| 10 | CONFIGURE_COMMAND "" | ||
| 11 | BUILD_COMMAND "" | ||
| 12 | INSTALL_COMMAND "" | ||
| 13 | LOG_DOWNLOAD 1 | ||
| 14 | ) | ||
| 15 | |||
| 16 | ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) | ||
| 17 | |||
| 18 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR}/include CACHE TYPE INTERNAL) | ||
| 19 | |||
| 20 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| @@ -1,85 +0,0 @@ | |||
| 1 | set(EXTERNAL_NAME bullet) | ||
| 2 | |||
| 3 | if (WIN32) | ||
| 4 | set(PLATFORM_CMAKE_ARGS "-DUSE_MSVC_RUNTIME_LIBRARY_DLL=1") | ||
| 5 | else () | ||
| 6 | set(PLATFORM_CMAKE_ARGS "-DBUILD_SHARED_LIBS=1") | ||
| 7 | |||
| 8 | if (ANDROID) | ||
| 9 | list(APPEND PLATFORM_CMAKE_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DANDROID_NATIVE_API_LEVEL=19") | ||
| 10 | elseif (APPLE) | ||
| 11 | list(APPEND PLATFORM_CMAKE_ARGS "-DCMAKE_INSTALL_NAME_DIR=<INSTALL_DIR>/lib") | ||
| 12 | endif() | ||
| 13 | endif () | ||
| 14 | |||
| 15 | include(ExternalProject) | ||
| 16 | |||
| 17 | if (WIN32) | ||
| 18 | ExternalProject_Add( | ||
| 19 | ${EXTERNAL_NAME} | ||
| 20 | URL https://public.highfidelity.com/dependencies/bullet-2.88.tgz | ||
| 21 | URL_MD5 0a6876607ebe83e227427215f15946fd | ||
| 22 | CMAKE_ARGS ${PLATFORM_CMAKE_ARGS} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DBUILD_EXTRAS=0 -DINSTALL_LIBS=1 -DBUILD_BULLET3=0 -DBUILD_OPENGL3_DEMOS=0 -DBUILD_BULLET2_DEMOS=0 -DBUILD_UNIT_TESTS=0 -DUSE_GLUT=0 -DUSE_DX11=0 | ||
| 23 | LOG_DOWNLOAD 1 | ||
| 24 | LOG_CONFIGURE 1 | ||
| 25 | LOG_BUILD 1 | ||
| 26 | BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build | ||
| 27 | ) | ||
| 28 | else () | ||
| 29 | ExternalProject_Add( | ||
| 30 | ${EXTERNAL_NAME} | ||
| 31 | URL https://public.highfidelity.com/dependencies/bullet-2.88.tgz | ||
| 32 | URL_MD5 0a6876607ebe83e227427215f15946fd | ||
| 33 | CMAKE_ARGS ${PLATFORM_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DBUILD_EXTRAS=0 -DINSTALL_LIBS=1 -DBUILD_BULLET3=0 -DBUILD_OPENGL3_DEMOS=0 -DBUILD_BULLET2_DEMOS=0 -DBUILD_UNIT_TESTS=0 -DUSE_GLUT=0 | ||
| 34 | LOG_DOWNLOAD 1 | ||
| 35 | LOG_CONFIGURE 1 | ||
| 36 | LOG_BUILD 1 | ||
| 37 | BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build | ||
| 38 | ) | ||
| 39 | endif () | ||
| 40 | |||
| 41 | # Hide this external target (for ide users) | ||
| 42 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| 43 | |||
| 44 | ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) | ||
| 45 | |||
| 46 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 47 | |||
| 48 | set(BULLET_LIB_DIR "${INSTALL_DIR}/lib") | ||
| 49 | |||
| 50 | if (APPLE OR UNIX OR ANDROID) | ||
| 51 | if (APPLE) | ||
| 52 | set(BULLET_LIB_EXT "dylib") | ||
| 53 | else () | ||
| 54 | set(BULLET_LIB_EXT "so") | ||
| 55 | endif () | ||
| 56 | |||
| 57 | set(LIB_PREFIX "lib") | ||
| 58 | elseif (WIN32) | ||
| 59 | set(BULLET_LIB_EXT "lib") | ||
| 60 | endif () | ||
| 61 | |||
| 62 | if (DEFINED BULLET_LIB_EXT) | ||
| 63 | set(_BULLET_LIB_PAIRS "DYNAMICS_LIBRARY\;BulletDynamics" "COLLISION_LIBRARY\;BulletCollision" "MATH_LIBRARY\;LinearMath" "SOFTBODY_LIBRARY\;BulletSoftBody") | ||
| 64 | |||
| 65 | foreach(_LIB_PAIR ${_BULLET_LIB_PAIRS}) | ||
| 66 | list(GET _LIB_PAIR 0 _LIB_VAR_NAME) | ||
| 67 | list(GET _LIB_PAIR 1 _LIB_NAME) | ||
| 68 | |||
| 69 | |||
| 70 | |||
| 71 | if (WIN32) | ||
| 72 | # on windows, we might end up with a library that ends with RelWithDebInfo if Visual Studio is building for that configuration | ||
| 73 | set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_RELEASE "${BULLET_LIB_DIR}/${LIB_PREFIX}${_LIB_NAME}$<$<CONFIG:RelWithDebInfo>:_RelWithDebugInfo>$<$<CONFIG:MinSizeRel>:_MinsizeRel>.${BULLET_LIB_EXT}" CACHE FILEPATH "${_LIB_NAME} release library location") | ||
| 74 | |||
| 75 | set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_DEBUG ${BULLET_LIB_DIR}/${LIB_PREFIX}${_LIB_NAME}_Debug.${BULLET_LIB_EXT} CACHE FILEPATH "${_LIB_NAME} debug library location") | ||
| 76 | else () | ||
| 77 | set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_RELEASE ${BULLET_LIB_DIR}/${LIB_PREFIX}${_LIB_NAME}.${BULLET_LIB_EXT} CACHE FILEPATH "${_LIB_NAME} release library location") | ||
| 78 | set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_DEBUG "" CACHE FILEPATH "${_LIB_NAME} debug library location") | ||
| 79 | endif () | ||
| 80 | endforeach() | ||
| 81 | endif () | ||
| 82 | |||
| 83 | if (DEFINED ${EXTERNAL_NAME_UPPER}_DYNAMICS_LIBRARY_RELEASE) | ||
| 84 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INSTALL_DIR}/include/bullet CACHE PATH "Path to bullet include directory") | ||
| 85 | endif () | ||
| @@ -1,41 +0,0 @@ | |||
| 1 | set(EXTERNAL_NAME draco) | ||
| 2 | |||
| 3 | if (ANDROID) | ||
| 4 | set(ANDROID_CMAKE_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DANDROID_NATIVE_API_LEVEL=19") | ||
| 5 | endif () | ||
| 6 | |||
| 7 | if (APPLE) | ||
| 8 | set(EXTRA_CMAKE_FLAGS -DCMAKE_CXX_FLAGS=-stdlib=libc++ -DCMAKE_EXE_LINKER_FLAGS=-stdlib=libc++) | ||
| 9 | endif () | ||
| 10 | |||
| 11 | include(ExternalProject) | ||
| 12 | ExternalProject_Add( | ||
| 13 | ${EXTERNAL_NAME} | ||
| 14 | URL https://public.highfidelity.com/dependencies/draco-1.1.0.zip | ||
| 15 | URL_MD5 208f8b04c91d5f1c73d731a3ea37c5bb | ||
| 16 | CONFIGURE_COMMAND CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>-$<CONFIG> ${EXTRA_CMAKE_FLAGS} | ||
| 17 | LOG_DOWNLOAD 1 | ||
| 18 | LOG_CONFIGURE 1 | ||
| 19 | LOG_BUILD 1 | ||
| 20 | ) | ||
| 21 | |||
| 22 | # Hide this external target (for ide users) | ||
| 23 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| 24 | |||
| 25 | ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) | ||
| 26 | set(SUFFIXED_INSTALL_DIR "${INSTALL_DIR}-$<CONFIG>") | ||
| 27 | |||
| 28 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 29 | |||
| 30 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SUFFIXED_INSTALL_DIR}/include CACHE PATH "List of Draco include directories") | ||
| 31 | |||
| 32 | if (UNIX) | ||
| 33 | set(LIB_PREFIX "lib") | ||
| 34 | set(LIB_EXT "a") | ||
| 35 | elseif (WIN32) | ||
| 36 | set(LIB_EXT "lib") | ||
| 37 | endif () | ||
| 38 | |||
| 39 | set(${EXTERNAL_NAME_UPPER}_LIBRARY ${SUFFIXED_INSTALL_DIR}/lib/${LIB_PREFIX}draco.${LIB_EXT} CACHE FILEPATH "Path to Draco release library") | ||
| 40 | set(${EXTERNAL_NAME_UPPER}_ENCODER_LIBRARY ${SUFFIXED_INSTALL_DIR}/lib/${LIB_PREFIX}dracoenc.${LIB_EXT} CACHE FILEPATH "Path to Draco encoder release library") | ||
| 41 | set(${EXTERNAL_NAME_UPPER}_DECODER_LIBRARY ${SUFFIXED_INSTALL_DIR}/lib/${LIB_PREFIX}dracodec.${LIB_EXT} CACHE FILEPATH "Path to Draco decoder release library") | ||
| @@ -1,58 +0,0 @@ | |||
| 1 | set(EXTERNAL_NAME etc2comp) | ||
| 2 | |||
| 3 | if (ANDROID) | ||
| 4 | set(ANDROID_CMAKE_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DANDROID_NATIVE_API_LEVEL=19") | ||
| 5 | endif () | ||
| 6 | |||
| 7 | if (APPLE) | ||
| 8 | set(EXTRA_CMAKE_FLAGS -DCMAKE_CXX_FLAGS=-stdlib=libc++ -DCMAKE_EXE_LINKER_FLAGS=-stdlib=libc++) | ||
| 9 | endif () | ||
| 10 | |||
| 11 | include(ExternalProject) | ||
| 12 | # We use a patched version of etc2comp that properly generates all the necessary mips | ||
| 13 | # See https://github.com/google/etc2comp/pull/29 | ||
| 14 | # We also use part of https://github.com/google/etc2comp/pull/1, which fixes a bug | ||
| 15 | # that would override CMAKE_CXX_FLAGS | ||
| 16 | ExternalProject_Add( | ||
| 17 | ${EXTERNAL_NAME} | ||
| 18 | URL https://public.highfidelity.com/dependencies/etc2comp-patched.zip | ||
| 19 | URL_MD5 4c96153eb179acbe619e3d99d3330595 | ||
| 20 | CMAKE_ARGS ${ANDROID_CMAKE_ARGS} ${EXTRA_CMAKE_FLAGS} | ||
| 21 | BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build | ||
| 22 | INSTALL_COMMAND "" | ||
| 23 | LOG_DOWNLOAD 1 | ||
| 24 | LOG_CONFIGURE 1 | ||
| 25 | LOG_BUILD 1 | ||
| 26 | ) | ||
| 27 | |||
| 28 | # Hide this external target (for ide users) | ||
| 29 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| 30 | |||
| 31 | ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) | ||
| 32 | ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) | ||
| 33 | |||
| 34 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 35 | |||
| 36 | if (WIN32 OR APPLE) | ||
| 37 | if (WIN32) | ||
| 38 | set(_LIB_FILE "EtcLib.lib") | ||
| 39 | else () | ||
| 40 | set(_LIB_FILE "libEtcLib.a") | ||
| 41 | endif () | ||
| 42 | |||
| 43 | set(${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG ${INSTALL_DIR}/build/EtcLib/Debug/${_LIB_FILE} CACHE FILEPATH "Path to Etc2Comp debug library") | ||
| 44 | |||
| 45 | # use generator expression to ensure the correct library is found when building different configurations in VS | ||
| 46 | set(_LIB_FOLDER "$<$<CONFIG:RelWithDebInfo>:build/EtcLib/RelWithDebInfo>") | ||
| 47 | set(_LIB_FOLDER "${_LIB_FOLDER}$<$<CONFIG:MinSizeRel>:build/EtcLib/MinSizeRel>") | ||
| 48 | set(_LIB_FOLDER "${_LIB_FOLDER}$<$<OR:$<CONFIG:Release>,$<CONFIG:Debug>>:build/EtcLib/Release>") | ||
| 49 | set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${INSTALL_DIR}/${_LIB_FOLDER}/${_LIB_FILE} CACHE FILEPATH "Path to Etc2Comp release library") | ||
| 50 | else () | ||
| 51 | set(${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG "" CACHE FILEPATH "Path to EtcLib debug library") | ||
| 52 | set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${INSTALL_DIR}/build/EtcLib/libEtcLib.a CACHE FILEPATH "Path to EtcLib release library") | ||
| 53 | |||
| 54 | endif () | ||
| 55 | |||
| 56 | set(ETC_INCLUDE_DIR ${SOURCE_DIR}/EtcLib/Etc CACHE FILEPATH "Path to Etc2Comp/Etc include directory") | ||
| 57 | set(ETCCODEC_INCLUDE_DIR ${SOURCE_DIR}/EtcLib/EtcCodec CACHE FILEPATH "Path to Etc2Comp/EtcCodec include directory") | ||
| 58 | # ETC2COMP_INCLUDE_DIRS will be set later by FindEtc2Comp | ||
| @@ -1,21 +0,0 @@ | |||
| 1 | set(EXTERNAL_NAME gli) | ||
| 2 | |||
| 3 | include(ExternalProject) | ||
| 4 | ExternalProject_Add( | ||
| 5 | ${EXTERNAL_NAME} | ||
| 6 | URL https://public.highfidelity.com/dependencies/gli-0.8.1.0.zip | ||
| 7 | URL_MD5 00c990f59c12bbf367956ef399d6f798 | ||
| 8 | BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build | ||
| 9 | CONFIGURE_COMMAND "" | ||
| 10 | BUILD_COMMAND "" | ||
| 11 | INSTALL_COMMAND "" | ||
| 12 | LOG_DOWNLOAD 1 | ||
| 13 | ) | ||
| 14 | |||
| 15 | # Hide this external target (for ide users) | ||
| 16 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| 17 | |||
| 18 | ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) | ||
| 19 | |||
| 20 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 21 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR} CACHE PATH "List of gli include directories") | ||
| @@ -1,21 +0,0 @@ | |||
| 1 | set(EXTERNAL_NAME glm) | ||
| 2 | |||
| 3 | include(ExternalProject) | ||
| 4 | ExternalProject_Add( | ||
| 5 | ${EXTERNAL_NAME} | ||
| 6 | URL https://public.highfidelity.com/dependencies/glm-0.9.8.5-patched.zip | ||
| 7 | URL_MD5 7d39ecc1cea275427534c3cfd6dd63f0 | ||
| 8 | BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build | ||
| 9 | CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> ${EXTERNAL_ARGS} | ||
| 10 | LOG_DOWNLOAD 1 | ||
| 11 | LOG_CONFIGURE 1 | ||
| 12 | LOG_BUILD 1 | ||
| 13 | ) | ||
| 14 | |||
| 15 | # Hide this external target (for ide users) | ||
| 16 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| 17 | |||
| 18 | ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) | ||
| 19 | |||
| 20 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 21 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${INSTALL_DIR}/include CACHE PATH "List of glm include directories") | ||
| @@ -1,42 +0,0 @@ | |||
| 1 | set(EXTERNAL_NAME glslang) | ||
| 2 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 3 | |||
| 4 | include(ExternalProject) | ||
| 5 | |||
| 6 | ExternalProject_Add( | ||
| 7 | ${EXTERNAL_NAME} | ||
| 8 | URL https://github.com/KhronosGroup/glslang/archive/7.8.2853.zip | ||
| 9 | URL_MD5 4f93e3818528176c622c137fba05cbf8 | ||
| 10 | CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>-$<CONFIG> | ||
| 11 | LOG_DOWNLOAD 1 | ||
| 12 | LOG_CONFIGURE 1 | ||
| 13 | LOG_BUILD 1 | ||
| 14 | ) | ||
| 15 | |||
| 16 | # Hide this external target (for ide users) | ||
| 17 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| 18 | |||
| 19 | # includes | ||
| 20 | ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) | ||
| 21 | set(SUFFIXED_INSTALL_DIR "${INSTALL_DIR}-$<CONFIG>") | ||
| 22 | |||
| 23 | list(APPEND INCLUDE_DIRS ${SUFFIXED_INSTALL_DIR}/include) | ||
| 24 | #list(APPEND INCLUDE_DIRS ${INSTALL_DIR}/include) | ||
| 25 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INCLUDE_DIRS} CACHE PATH "List of glslang include directories") | ||
| 26 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${${EXTERNAL_NAME_UPPER}_INCLUDE_DIR} CACHE PATH "List of glslang include directories") | ||
| 27 | |||
| 28 | |||
| 29 | set(LIB_DIR ${SUFFIXED_INSTALL_DIR}/lib) | ||
| 30 | list(APPEND LIB_NAMES glslang HLSL OGLCompiler OSDependent SPIRV SPVRemapper) | ||
| 31 | include(SelectLibraryConfigurations) | ||
| 32 | |||
| 33 | foreach(BASE_LIB ${LIB_NAMES}) | ||
| 34 | string(TOUPPER ${BASE_LIB} BASE_LIB_UPPER) | ||
| 35 | list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE "${LIB_DIR}/${BASE_LIB}.lib") | ||
| 36 | list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG "${LIB_DIR}/${BASE_LIB}d.lib") | ||
| 37 | endforeach() | ||
| 38 | |||
| 39 | select_library_configurations(${EXTERNAL_NAME_UPPER}) | ||
| 40 | |||
| 41 | set(${EXTERNAL_NAME_UPPER}_LIBRARY ${${EXTERNAL_NAME_UPPER}_LIBRARY} CACHE FILEPATH "Location of glslang libraries") | ||
| 42 | set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${${EXTERNAL_NAME_UPPER}_LIBRARIES} CACHE FILEPATH "Location of glslang libraries") | ||
| @@ -1,22 +0,0 @@ | |||
| 1 | set(EXTERNAL_NAME json) | ||
| 2 | |||
| 3 | include(ExternalProject) | ||
| 4 | ExternalProject_Add( | ||
| 5 | ${EXTERNAL_NAME} | ||
| 6 | URL https://hifi-public.s3.amazonaws.com/dependencies/json_3.1.2.zip | ||
| 7 | URL_MD5 94dbf6ea25a7569ddc0ab6e20862cf16 | ||
| 8 | BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build | ||
| 9 | CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> ${EXTERNAL_ARGS} | ||
| 10 | CONFIGURE_COMMAND "" | ||
| 11 | BUILD_COMMAND "" | ||
| 12 | INSTALL_COMMAND "" | ||
| 13 | LOG_DOWNLOAD 1 | ||
| 14 | ) | ||
| 15 | |||
| 16 | # Hide this external target (for ide users) | ||
| 17 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| 18 | |||
| 19 | ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) | ||
| 20 | |||
| 21 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 22 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR} CACHE PATH "List of json include directories") | ||
| @@ -1,87 +0,0 @@ | |||
| 1 | include(ExternalProject) | ||
| 2 | include(SelectLibraryConfigurations) | ||
| 3 | |||
| 4 | set(EXTERNAL_NAME nvtt) | ||
| 5 | |||
| 6 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 7 | |||
| 8 | if (WIN32) | ||
| 9 | ExternalProject_Add( | ||
| 10 | ${EXTERNAL_NAME} | ||
| 11 | URL https://public.highfidelity.com/dependencies/nvtt-win-2.1.0.hifi.zip | ||
| 12 | URL_MD5 10da01cf601f88f6dc12a6bc13c89136 | ||
| 13 | CONFIGURE_COMMAND "" | ||
| 14 | BUILD_COMMAND "" | ||
| 15 | INSTALL_COMMAND "" | ||
| 16 | LOG_DOWNLOAD 1 | ||
| 17 | ) | ||
| 18 | |||
| 19 | ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) | ||
| 20 | |||
| 21 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR}/include CACHE PATH "Location of NVTT include directory") | ||
| 22 | set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${SOURCE_DIR}/Release/x64/nvtt.lib CACHE FILEPATH "Path to NVTT release library") | ||
| 23 | set(${EXTERNAL_NAME_UPPER}_DLL_PATH "${SOURCE_DIR}/Release>/x64" CACHE PATH "Location of NVTT release DLL") | ||
| 24 | else () | ||
| 25 | |||
| 26 | if (ANDROID) | ||
| 27 | set(ANDROID_CMAKE_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DANDROID_NATIVE_API_LEVEL=19") | ||
| 28 | endif () | ||
| 29 | |||
| 30 | ExternalProject_Add( | ||
| 31 | ${EXTERNAL_NAME} | ||
| 32 | URL https://public.highfidelity.com/dependencies/nvidia-texture-tools-2.1.0.hifi-83462e4.zip | ||
| 33 | URL_MD5 602776e08515b54bfa1b8dc455003f0f | ||
| 34 | CONFIGURE_COMMAND CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DNVTT_SHARED=1 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DCMAKE_POSITION_INDEPENDENT_CODE=ON | ||
| 35 | LOG_DOWNLOAD 1 | ||
| 36 | LOG_CONFIGURE 1 | ||
| 37 | LOG_BUILD 1 | ||
| 38 | ) | ||
| 39 | |||
| 40 | ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) | ||
| 41 | |||
| 42 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${INSTALL_DIR}/include CACHE PATH "Location of NVTT include directory") | ||
| 43 | |||
| 44 | if (APPLE) | ||
| 45 | set(_LIB_EXT "dylib") | ||
| 46 | else () | ||
| 47 | set(_LIB_EXT "so") | ||
| 48 | endif () | ||
| 49 | |||
| 50 | set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${INSTALL_DIR}/lib/libnvtt.${_LIB_EXT} CACHE FILEPATH "Path to NVTT library") | ||
| 51 | |||
| 52 | if (APPLE) | ||
| 53 | # on OS X we have to use install_name_tool to fix the paths found in the NVTT shared libraries | ||
| 54 | # so that they can be found and linked during the linking phase | ||
| 55 | set(_NVTT_LIB_DIR "${INSTALL_DIR}/lib") | ||
| 56 | |||
| 57 | # first fix the install names of all present libraries | ||
| 58 | ExternalProject_Add_Step( | ||
| 59 | ${EXTERNAL_NAME} | ||
| 60 | change-install-name | ||
| 61 | COMMENT "Calling install_name_tool on NVTT libraries to fix install name for dylib linking" | ||
| 62 | COMMAND ${CMAKE_COMMAND} -DINSTALL_NAME_LIBRARY_DIR=${_NVTT_LIB_DIR} -P ${EXTERNAL_PROJECT_DIR}/OSXInstallNameChange.cmake | ||
| 63 | DEPENDEES install | ||
| 64 | WORKING_DIRECTORY <INSTALL_DIR> | ||
| 65 | LOG 1 | ||
| 66 | ) | ||
| 67 | |||
| 68 | # then, for the main library (libnvtt) fix the paths to the dependency libraries (core, image, math) | ||
| 69 | ExternalProject_Add_Step( | ||
| 70 | ${EXTERNAL_NAME} | ||
| 71 | change-dependency-paths | ||
| 72 | COMMENT "Calling install_name_tool on NVTT libraries to fix paths for dependency libraries" | ||
| 73 | COMMAND install_name_tool -change libnvimage.dylib ${INSTALL_DIR}/lib/libnvimage.dylib libnvtt.dylib | ||
| 74 | COMMAND install_name_tool -change libnvcore.dylib ${INSTALL_DIR}/lib/libnvcore.dylib libnvtt.dylib | ||
| 75 | COMMAND install_name_tool -change libnvmath.dylib ${INSTALL_DIR}/lib/libnvmath.dylib libnvtt.dylib | ||
| 76 | COMMAND install_name_tool -change libnvcore.dylib ${INSTALL_DIR}/lib/libnvcore.dylib libnvimage.dylib | ||
| 77 | COMMAND install_name_tool -change libnvmath.dylib ${INSTALL_DIR}/lib/libnvmath.dylib libnvimage.dylib | ||
| 78 | COMMAND install_name_tool -change libnvcore.dylib ${INSTALL_DIR}/lib/libnvcore.dylib libnvmath.dylib | ||
| 79 | DEPENDEES install | ||
| 80 | WORKING_DIRECTORY <INSTALL_DIR>/lib | ||
| 81 | LOG 1 | ||
| 82 | ) | ||
| 83 | endif () | ||
| 84 | endif () | ||
| 85 | |||
| 86 | # Hide this external target (for IDE users) | ||
| 87 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| @@ -1,49 +0,0 @@ | |||
| 1 | include(ExternalProject) | ||
| 2 | include(SelectLibraryConfigurations) | ||
| 3 | |||
| 4 | set(EXTERNAL_NAME OpenVR) | ||
| 5 | |||
| 6 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 7 | |||
| 8 | ExternalProject_Add( | ||
| 9 | ${EXTERNAL_NAME} | ||
| 10 | URL https://public.highfidelity.com/dependencies/openvr-1.0.6.zip | ||
| 11 | URL_MD5 f6892cd3a3078f505d03b4297f5a1951 | ||
| 12 | CONFIGURE_COMMAND "" | ||
| 13 | BUILD_COMMAND "" | ||
| 14 | INSTALL_COMMAND "" | ||
| 15 | LOG_DOWNLOAD 1 | ||
| 16 | ) | ||
| 17 | |||
| 18 | # Hide this external target (for ide users) | ||
| 19 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| 20 | |||
| 21 | ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) | ||
| 22 | |||
| 23 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR}/headers CACHE TYPE INTERNAL) | ||
| 24 | |||
| 25 | if (WIN32) | ||
| 26 | |||
| 27 | # FIXME need to account for different architectures | ||
| 28 | if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") | ||
| 29 | set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/lib/win64/openvr_api.lib CACHE TYPE INTERNAL) | ||
| 30 | add_paths_to_fixup_libs(${SOURCE_DIR}/bin/win64) | ||
| 31 | else() | ||
| 32 | set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/lib/win32/openvr_api.lib CACHE TYPE INTERNAL) | ||
| 33 | add_paths_to_fixup_libs(${SOURCE_DIR}/bin/win32) | ||
| 34 | endif() | ||
| 35 | |||
| 36 | elseif(APPLE) | ||
| 37 | |||
| 38 | # FIXME need to account for different architectures | ||
| 39 | set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/lib/osx32/libopenvr_api.dylib CACHE TYPE INTERNAL) | ||
| 40 | add_paths_to_fixup_libs(${SOURCE_DIR}/bin/osx32) | ||
| 41 | |||
| 42 | elseif(NOT ANDROID) | ||
| 43 | |||
| 44 | # FIXME need to account for different architectures | ||
| 45 | set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/lib/linux64/libopenvr_api.so CACHE TYPE INTERNAL) | ||
| 46 | add_paths_to_fixup_libs(${SOURCE_DIR}/bin/linux64) | ||
| 47 | |||
| 48 | endif() | ||
| 49 | |||
| @@ -3,7 +3,14 @@ string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) · 2 unmodified lines | |||
| 3 | 3 | ||
| 4 | include(ExternalProject) | 4 | include(ExternalProject) |
| 5 | 5 | ||
| 6 | set(QUAZIP_CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DCMAKE_PREFIX_PATH=${QT_CMAKE_PREFIX_PATH} -DCMAKE_INSTALL_NAME_DIR:PATH=<INSTALL_DIR>/lib -DZLIB_ROOT=${ZLIB_ROOT} -DCMAKE_POSITION_INDEPENDENT_CODE=ON) | 6 | set(QUAZIP_CMAKE_ARGS |
| 7 | -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} | ||
| 8 | -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> | ||
| 9 | -DCMAKE_PREFIX_PATH=${QT_CMAKE_PREFIX_PATH} | ||
| 10 | -DCMAKE_INSTALL_NAME_DIR:PATH=<INSTALL_DIR>/lib | ||
| 11 | -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} | ||
| 12 | -DZLIB_ROOT=${VCPKG_INSTALL_ROOT} | ||
| 13 | -DCMAKE_POSITION_INDEPENDENT_CODE=ON) | ||
| 7 | 14 | ||
| 8 | if (NOT APPLE) | 15 | if (NOT APPLE) |
| 9 | set(QUAZIP_CMAKE_ARGS ${QUAZIP_CMAKE_ARGS} -DCMAKE_CXX_STANDARD=11) | 16 | set(QUAZIP_CMAKE_ARGS ${QUAZIP_CMAKE_ARGS} -DCMAKE_CXX_STANDARD=11) |
| @@ -20,10 +27,6 @@ ExternalProject_Add( · 10 unmodified lines | |||
| 20 | LOG_BUILD 1 | 27 | LOG_BUILD 1 |
| 21 | ) | 28 | ) |
| 22 | 29 | ||
| 23 | if (WIN32) | ||
| 24 | add_dependencies(quazip zlib) | ||
| 25 | endif () | ||
| 26 | |||
| 27 | # Hide this external target (for ide users) | 30 | # Hide this external target (for ide users) |
| 28 | set_target_properties(${EXTERNAL_NAME} PROPERTIES | 31 | set_target_properties(${EXTERNAL_NAME} PROPERTIES |
| 29 | FOLDER "hidden/externals" | 32 | FOLDER "hidden/externals" |
| @@ -1,90 +0,0 @@ | |||
| 1 | set(EXTERNAL_NAME sdl2) | ||
| 2 | |||
| 3 | include(ExternalProject) | ||
| 4 | |||
| 5 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 6 | |||
| 7 | if (WIN32) | ||
| 8 | ExternalProject_Add( | ||
| 9 | ${EXTERNAL_NAME} | ||
| 10 | URL https://public.highfidelity.com/dependencies/SDL2-devel-2.0.3-VC.zip | ||
| 11 | URL_MD5 30a333bcbe94bc5016e8799c73e86233 | ||
| 12 | CONFIGURE_COMMAND "" | ||
| 13 | BUILD_COMMAND "" | ||
| 14 | INSTALL_COMMAND "" | ||
| 15 | LOG_DOWNLOAD 1 | ||
| 16 | ) | ||
| 17 | elseif (APPLE) | ||
| 18 | |||
| 19 | ExternalProject_Add( | ||
| 20 | ${EXTERNAL_NAME} | ||
| 21 | URL https://public.highfidelity.com/dependencies/SDL2-2.0.3.zip | ||
| 22 | URL_MD5 55f1eae5142d20db11c844d8d4d6deed | ||
| 23 | CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> -DVIDEO_OPENGL=OFF | ||
| 24 | BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build | ||
| 25 | LOG_DOWNLOAD 1 | ||
| 26 | LOG_CONFIGURE 1 | ||
| 27 | LOG_BUILD 1 | ||
| 28 | ) | ||
| 29 | |||
| 30 | ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) | ||
| 31 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INSTALL_DIR}/include/SDL2 CACHE PATH "Location of SDL2 include directory") | ||
| 32 | set(${EXTERNAL_NAME_UPPER}_LIBRARY "${INSTALL_DIR}/lib/libSDL2-2.0.dylib" CACHE STRING "Path to SDL2 library") | ||
| 33 | |||
| 34 | set(_SDL2_LIB_DIR "${INSTALL_DIR}/lib") | ||
| 35 | |||
| 36 | ExternalProject_Add_Step( | ||
| 37 | ${EXTERNAL_NAME} | ||
| 38 | change-install-name | ||
| 39 | COMMENT "Calling install_name_tool on SDL2 libraries to fix install name for dylib linking" | ||
| 40 | COMMAND ${CMAKE_COMMAND} -DINSTALL_NAME_LIBRARY_DIR=${_SDL2_LIB_DIR} -P ${EXTERNAL_PROJECT_DIR}/OSXInstallNameChange.cmake | ||
| 41 | DEPENDEES install | ||
| 42 | WORKING_DIRECTORY <INSTALL_DIR> | ||
| 43 | LOG 1 | ||
| 44 | ) | ||
| 45 | |||
| 46 | else () | ||
| 47 | if (ANDROID) | ||
| 48 | set(ANDROID_CMAKE_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DANDROID_NATIVE_API_LEVEL=19") | ||
| 49 | endif () | ||
| 50 | |||
| 51 | ExternalProject_Add( | ||
| 52 | ${EXTERNAL_NAME} | ||
| 53 | URL https://public.highfidelity.com/dependencies/SDL2-2.0.3.tar.gz | ||
| 54 | URL_MD5 fe6c61d2e9df9ef570e7e80c6e822537 | ||
| 55 | CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> | ||
| 56 | LOG_DOWNLOAD 1 | ||
| 57 | LOG_CONFIGURE 1 | ||
| 58 | LOG_BUILD 1 | ||
| 59 | ) | ||
| 60 | endif () | ||
| 61 | |||
| 62 | # Hide this external target (for ide users) | ||
| 63 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| 64 | |||
| 65 | if (APPLE) | ||
| 66 | |||
| 67 | # NOOP | ||
| 68 | |||
| 69 | elseif (WIN32) | ||
| 70 | |||
| 71 | ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) | ||
| 72 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${SOURCE_DIR}/include CACHE PATH "Location of SDL2 include directory") | ||
| 73 | |||
| 74 | if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") | ||
| 75 | set(${EXTERNAL_NAME_UPPER}_LIBRARY_TEMP ${SOURCE_DIR}/lib/x64/SDL2.lib CACHE FILEPATH "Path to SDL2 library") | ||
| 76 | set(${EXTERNAL_NAME_UPPER}_DLL_PATH ${SOURCE_DIR}/lib/x64 CACHE PATH "Location of SDL2 DLL") | ||
| 77 | else() | ||
| 78 | set(${EXTERNAL_NAME_UPPER}_LIBRARY_TEMP ${SOURCE_DIR}/lib/x86/SDL2.lib CACHE FILEPATH "Path to SDL2 library") | ||
| 79 | set(${EXTERNAL_NAME_UPPER}_DLL_PATH ${SOURCE_DIR}/lib/x86 CACHE PATH "Location of SDL2 DLL") | ||
| 80 | endif() | ||
| 81 | |||
| 82 | add_paths_to_fixup_libs(${${EXTERNAL_NAME_UPPER}_DLL_PATH}) | ||
| 83 | |||
| 84 | else () | ||
| 85 | |||
| 86 | ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) | ||
| 87 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INSTALL_DIR}/include/SDL2 CACHE PATH "Location of SDL2 include directory") | ||
| 88 | set(${EXTERNAL_NAME_UPPER}_LIBRARY_TEMP ${INSTALL_DIR}/lib/libSDL2.so CACHE FILEPATH "Path to SDL2 library") | ||
| 89 | |||
| 90 | endif () | ||
| @@ -1,34 +0,0 @@ | |||
| 1 | set(EXTERNAL_NAME spirv_binaries) | ||
| 2 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 3 | |||
| 4 | include(ExternalProject) | ||
| 5 | if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") | ||
| 6 | set(DOWNLOAD_URL https://public.highfidelity.com/dependencies/vulkan/vulkansdk-win32-1.1.82.1.tar.gz) | ||
| 7 | set(DOWNLOAD_MD5 3a83ef490bce248b1a4d6726a3e5893e) | ||
| 8 | set(BIN_DIR "Bin") | ||
| 9 | elseif (CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin") | ||
| 10 | set(DOWNLOAD_URL https://public.highfidelity.com/dependencies/vulkan/vulkansdk-macos-1.1.82.1.tar.gz) | ||
| 11 | set(DOWNLOAD_MD5 a57d37275b2c5db023ba8e84a63461ff) | ||
| 12 | set(BIN_DIR "macOS/bin") | ||
| 13 | else () | ||
| 14 | set(DOWNLOAD_URL https://public.highfidelity.com/dependencies/vulkan/vulkansdk-linux-x86_64-1.1.82.1.tar.gz) | ||
| 15 | set(DOWNLOAD_MD5 5a7c9eeda8cee6b36724da7f7cbe5ec6) | ||
| 16 | set(BIN_DIR "x86_64/bin") | ||
| 17 | endif () | ||
| 18 | |||
| 19 | ExternalProject_Add( | ||
| 20 | ${EXTERNAL_NAME} | ||
| 21 | URL ${DOWNLOAD_URL} | ||
| 22 | URL_MD5 ${DOWNLOAD_MD5} | ||
| 23 | BUILD_COMMAND "" | ||
| 24 | CONFIGURE_COMMAND "" | ||
| 25 | INSTALL_COMMAND "" | ||
| 26 | LOG_DOWNLOAD ON | ||
| 27 | ) | ||
| 28 | |||
| 29 | # Hide this external target (for ide users) | ||
| 30 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| 31 | ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) | ||
| 32 | |||
| 33 | set(${EXTERNAL_NAME_UPPER}_DIR "${SOURCE_DIR}/${BIN_DIR}" CACHE FILEPATH "SPIRV binary tools location") | ||
| 34 | |||
| @@ -1,35 +0,0 @@ | |||
| 1 | set(EXTERNAL_NAME spirv_cross) | ||
| 2 | |||
| 3 | include(ExternalProject) | ||
| 4 | ExternalProject_Add( | ||
| 5 | ${EXTERNAL_NAME} | ||
| 6 | URL https://github.com/KhronosGroup/SPIRV-Cross/archive/2018-08-07.zip | ||
| 7 | URL_MD5 11198e4dc6a815ffbdb7a0a56d2d9261 | ||
| 8 | CONFIGURE_COMMAND CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>-$<CONFIG> ${EXTRA_CMAKE_FLAGS} | ||
| 9 | LOG_DOWNLOAD 1 | ||
| 10 | LOG_CONFIGURE 1 | ||
| 11 | LOG_BUILD 1 | ||
| 12 | ) | ||
| 13 | |||
| 14 | # Hide this external target (for ide users) | ||
| 15 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| 16 | |||
| 17 | ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) | ||
| 18 | set(SUFFIXED_INSTALL_DIR "${INSTALL_DIR}-$<CONFIG>") | ||
| 19 | |||
| 20 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 21 | |||
| 22 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SUFFIXED_INSTALL_DIR}/include CACHE PATH "List of Draco include directories") | ||
| 23 | |||
| 24 | if (UNIX) | ||
| 25 | set(LIB_PREFIX "lib") | ||
| 26 | set(LIB_EXT "a") | ||
| 27 | elseif (WIN32) | ||
| 28 | set(LIB_EXT "lib") | ||
| 29 | endif () | ||
| 30 | |||
| 31 | foreach(lib glsl msl cpp hlsl reflect util core) | ||
| 32 | list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARIES ${SUFFIXED_INSTALL_DIR}/lib/spirv-cross-${lib}.${LIB_EXT}) | ||
| 33 | endforeach() | ||
| 34 | |||
| 35 | set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${${EXTERNAL_NAME_UPPER}_LIBRARIES} CACHE FILEPATH "Path to SPIRV-Cross libraries") | ||
| @@ -1,18 +0,0 @@ | |||
| 1 | set(EXTERNAL_NAME spirv_headers) | ||
| 2 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 3 | |||
| 4 | include(ExternalProject) | ||
| 5 | ExternalProject_Add( | ||
| 6 | ${EXTERNAL_NAME} | ||
| 7 | URL https://github.com/KhronosGroup/SPIRV-Headers/archive/2c512180ca03b5d4f56283efc85745775b45fdc4.zip | ||
| 8 | URL_MD5 83e652221b5f21d5fdb61c45f5b4d9f9 | ||
| 9 | CONFIGURE_COMMAND CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> ${EXTRA_CMAKE_FLAGS} | ||
| 10 | LOG_DOWNLOAD 1 | ||
| 11 | LOG_CONFIGURE 1 | ||
| 12 | LOG_BUILD 1 | ||
| 13 | ) | ||
| 14 | |||
| 15 | # Hide this external target (for ide users) | ||
| 16 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| 17 | ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) | ||
| 18 | set(${EXTERNAL_NAME_UPPER}_ROOT ${INSTALL_DIR} CACHE PATH "List of include directories") | ||
| @@ -1,33 +0,0 @@ | |||
| 1 | set(EXTERNAL_NAME spirv_tools) | ||
| 2 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 3 | |||
| 4 | include(ExternalProject) | ||
| 5 | ExternalProject_Add( | ||
| 6 | ${EXTERNAL_NAME} | ||
| 7 | URL https://github.com/KhronosGroup/SPIRV-Tools/archive/v2018.4.zip | ||
| 8 | URL_MD5 7a7c69cf6ff0318910b4bfbdf30bcfc9 | ||
| 9 | CONFIGURE_COMMAND CMAKE_ARGS ${ANDROID_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DSPIRV-Headers_SOURCE_DIR=${SPIRV_HEADERS_ROOT} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>-$<CONFIG> ${EXTRA_CMAKE_FLAGS} | ||
| 10 | LOG_DOWNLOAD 1 | ||
| 11 | LOG_CONFIGURE 1 | ||
| 12 | LOG_BUILD 1 | ||
| 13 | ) | ||
| 14 | |||
| 15 | # Hide this external target (for ide users) | ||
| 16 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| 17 | |||
| 18 | ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) | ||
| 19 | set(SUFFIXED_INSTALL_DIR "${INSTALL_DIR}-$<CONFIG>") | ||
| 20 | |||
| 21 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SUFFIXED_INSTALL_DIR}/include CACHE PATH "List of SPIRV-Tools include directories") | ||
| 22 | |||
| 23 | if (UNIX) | ||
| 24 | set(LIB_PREFIX "lib") | ||
| 25 | set(LIB_EXT "a") | ||
| 26 | elseif (WIN32) | ||
| 27 | set(LIB_EXT "lib") | ||
| 28 | endif () | ||
| 29 | |||
| 30 | list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARIES ${SUFFIXED_INSTALL_DIR}/lib/SPIRV-Tools-opt.${LIB_EXT}) | ||
| 31 | list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARIES ${SUFFIXED_INSTALL_DIR}/lib/SPIRV-Tools-link.${LIB_EXT}) | ||
| 32 | list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARIES ${SUFFIXED_INSTALL_DIR}/lib/SPIRV-Tools.${LIB_EXT}) | ||
| 33 | set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${${EXTERNAL_NAME_UPPER}_LIBRARIES} CACHE FILEPATH "Path to SPIRV-Tool libraries") | ||
| @@ -1,33 +0,0 @@ | |||
| 1 | set(EXTERNAL_NAME zlib) | ||
| 2 | string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) | ||
| 3 | |||
| 4 | include(ExternalProject) | ||
| 5 | |||
| 6 | ExternalProject_Add( | ||
| 7 | ${EXTERNAL_NAME} | ||
| 8 | URL https://public.highfidelity.com/dependencies/zlib128.zip | ||
| 9 | URL_MD5 126f8676442ffbd97884eb4d6f32afb4 | ||
| 10 | CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> | ||
| 11 | BINARY_DIR ${EXTERNAL_PROJECT_PREFIX}/build | ||
| 12 | LOG_DOWNLOAD 1 | ||
| 13 | LOG_CONFIGURE 1 | ||
| 14 | LOG_BUILD 1 | ||
| 15 | ) | ||
| 16 | |||
| 17 | # Hide this external target (for ide users) | ||
| 18 | set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") | ||
| 19 | |||
| 20 | ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR) | ||
| 21 | set(${EXTERNAL_NAME_UPPER}_ROOT ${INSTALL_DIR} CACHE PATH "Path for Zlib install root") | ||
| 22 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INSTALL_DIR}/include CACHE PATH "List of zlib include directories") | ||
| 23 | set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${${EXTERNAL_NAME_UPPER}_INCLUDE_DIR} CACHE PATH "List of zlib include directories") | ||
| 24 | set(${EXTERNAL_NAME_UPPER}_DLL_PATH ${INSTALL_DIR}/bin CACHE FILEPATH "Location of ZLib DLL") | ||
| 25 | set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${INSTALL_DIR}/lib/zlib.lib CACHE FILEPATH "Location of zlib release library") | ||
| 26 | set(${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG ${INSTALL_DIR}/lib/zlibd.lib CACHE FILEPATH "Location of zlib debug library") | ||
| 27 | |||
| 28 | include(SelectLibraryConfigurations) | ||
| 29 | select_library_configurations(${EXTERNAL_NAME_UPPER}) | ||
| 30 | |||
| 31 | # Force selected libraries into the cache | ||
| 32 | set(${EXTERNAL_NAME_UPPER}_LIBRARY ${${EXTERNAL_NAME_UPPER}_LIBRARY} CACHE FILEPATH "Location of zlib libraries") | ||
| 33 | set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${${EXTERNAL_NAME_UPPER}_LIBRARIES} CACHE FILEPATH "Location of zlib libraries") | ||
| @@ -14,13 +14,6 @@ macro(AUTOSCRIBE_APPEND_QRC) · 13 unmodified lines | |||
| 14 | string(CONCAT SHADER_QRC "${SHADER_QRC}" "<file alias=\"${ARGV0}\">${ARGV1}</file>\n") | 14 | string(CONCAT SHADER_QRC "${SHADER_QRC}" "<file alias=\"${ARGV0}\">${ARGV1}</file>\n") |
| 15 | endmacro() | 15 | endmacro() |
| 16 | 16 | ||
| 17 | set(VULKAN_DIR $ENV{VULKAN_SDK}) | ||
| 18 | set(GLSLANG_EXEC "${VULKAN_DIR}/Bin/glslangValidator.exe") | ||
| 19 | set(SPIRV_CROSS_EXEC "${VULKAN_DIR}/Bin/spirv-cross.exe") | ||
| 20 | set(SPIRV_OPT_EXEC "${VULKAN_DIR}/Bin/spirv-opt.exe") | ||
| 21 | set(GLSLC_EXEC "${VULKAN_DIR}/Bin/glslc.exe") | ||
| 22 | set(SCRIBE_EXEC "D:/scribe.exe") | ||
| 23 | |||
| 24 | macro(AUTOSCRIBE_PLATFORM_SHADER) | 17 | macro(AUTOSCRIBE_PLATFORM_SHADER) |
| 25 | set(AUTOSCRIBE_PLATFORM_PATH "${ARGV0}") | 18 | set(AUTOSCRIBE_PLATFORM_PATH "${ARGV0}") |
| 26 | string(REGEX MATCH "([0-9]+(es)?)(/stereo)?" PLATFORM_PATH_REGEX ${AUTOSCRIBE_PLATFORM_PATH}) | 19 | string(REGEX MATCH "([0-9]+(es)?)(/stereo)?" PLATFORM_PATH_REGEX ${AUTOSCRIBE_PLATFORM_PATH}) |
| @@ -75,36 +68,6 @@ macro(AUTOSCRIBE_PLATFORM_SHADER) · 48 unmodified lines | |||
| 75 | list(APPEND SHADER_GEN_LINE ${TEMP_PATH}) | 68 | list(APPEND SHADER_GEN_LINE ${TEMP_PATH}) |
| 76 | list(APPEND SHADER_GEN_LINE ${AUTOSCRIBE_SHADER_SEEN_LIBS}) | 69 | list(APPEND SHADER_GEN_LINE ${AUTOSCRIBE_SHADER_SEEN_LIBS}) |
| 77 | string(CONCAT AUTOSCRIBE_SHADERGEN_COMMANDS "${AUTOSCRIBE_SHADERGEN_COMMANDS}" "${SHADER_GEN_LINE}\n") | 70 | string(CONCAT AUTOSCRIBE_SHADERGEN_COMMANDS "${AUTOSCRIBE_SHADERGEN_COMMANDS}" "${SHADER_GEN_LINE}\n") |
| 78 | |||
| 79 | # # FIXME need better mechanism for determining the include files | ||
| 80 | # add_custom_command( | ||
| 81 | # OUTPUT ${AUTOSCRIBE_OUTPUT_FILE} | ||
| 82 | # COMMAND ${SCRIBE_COMMAND} ${SHADER_FILE} ${SCRIBE_ARGS} -o ${AUTOSCRIBE_OUTPUT_FILE} -h ${AUTOSCRIBE_DIALECT_HEADER} -h ${AUTOSCRIBE_VARIANT_HEADER} | ||
| 83 | # DEPENDS ${SCRIBE_COMMAND} ${SHADER_FILE} ${AUTOSCRIBE_DIALECT_HEADER} ${AUTOSCRIBE_VARIANT_HEADER}) | ||
| 84 | |||
| 85 | # # Generate the spirv file | ||
| 86 | # add_custom_command( | ||
| 87 | # OUTPUT ${AUTOSCRIBE_SPIRV_FILE} | ||
| 88 | # COMMAND ${GLSLANG_EXEC} -V110 -o ${AUTOSCRIBE_SPIRV_FILE} ${AUTOSCRIBE_OUTPUT_FILE} | ||
| 89 | # DEPENDS ${AUTOSCRIBE_OUTPUT_FILE} ${GLSLANG_EXEC}) | ||
| 90 | |||
| 91 | # # Generate the optimized spirv file | ||
| 92 | # add_custom_command( | ||
| 93 | # OUTPUT ${AUTOSCRIBE_SPIRV_OPT_FILE} | ||
| 94 | # COMMAND ${SPIRV_OPT_EXEC} -O ${AUTOSCRIBE_SPIRV_FILE} -o ${AUTOSCRIBE_SPIRV_OPT_FILE} | ||
| 95 | # DEPENDS ${AUTOSCRIBE_SPIRV_FILE} ${SPIRV_OPT_EXEC}) | ||
| 96 | |||
| 97 | # # Generate the optimized GLSL file | ||
| 98 | # add_custom_command( | ||
| 99 | # OUTPUT ${AUTOSCRIBE_SPIRV_GLSL_FILE} | ||
| 100 | # COMMAND ${SPIRV_CROSS_EXEC} ${SPIRV_CROSS_ARGS} ${AUTOSCRIBE_SPIRV_OPT_FILE} --output ${AUTOSCRIBE_SPIRV_GLSL_FILE} | ||
| 101 | # DEPENDS ${AUTOSCRIBE_SPIRV_OPT_FILE} ${SPIRV_CROSS_EXEC}) | ||
| 102 | |||
| 103 | # # Generate the optimized spirv file | ||
| 104 | # add_custom_command( | ||
| 105 | # OUTPUT ${AUTOSCRIBE_SPIRV_JSON_FILE} | ||
| 106 | # COMMAND ${SPIRV_CROSS_EXEC} --reflect json ${AUTOSCRIBE_SPIRV_OPT_FILE} --output ${AUTOSCRIBE_SPIRV_JSON_FILE} | ||
| 107 | # DEPENDS ${AUTOSCRIBE_SPIRV_OPT_FILE} ${SPIRV_CROSS_EXEC}) | ||
| 108 | endmacro() | 71 | endmacro() |
| 109 | 72 | ||
| 110 | macro(AUTOSCRIBE_SHADER) | 73 | macro(AUTOSCRIBE_SHADER) |
| @@ -307,38 +270,16 @@ macro(AUTOSCRIBE_SHADER_LIBS) · 196 unmodified lines | |||
| 307 | set(AUTOSCRIBE_SHADERGEN_COMMANDS_FILE ${CMAKE_CURRENT_BINARY_DIR}/shadergen.txt) | 270 | set(AUTOSCRIBE_SHADERGEN_COMMANDS_FILE ${CMAKE_CURRENT_BINARY_DIR}/shadergen.txt) |
| 308 | file(WRITE ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE} "${AUTOSCRIBE_SHADERGEN_COMMANDS}") | 271 | file(WRITE ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE} "${AUTOSCRIBE_SHADERGEN_COMMANDS}") |
| 309 | 272 | ||
| 310 | # grab the SPIRV binaries we require | 273 | # A custom python script which will generate all our shader artifacts |
| 311 | # note we don't use the normal ADD_DEPENDENCY_EXTERNAL_PROJECTS macro because only a custom command | 274 | add_custom_command( |
| 312 | # depends on these, not any of our build artifacts, so there's no valid target for the add_dependencies | 275 | OUTPUT ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS} |
| 313 | # call in ADD_DEPENDENCY_EXTERNAL_PROJECTS to use | 276 | COMMENT "Generating/updating shaders" |
| 314 | add_subdirectory(${EXTERNAL_PROJECT_DIR}/spirv_binaries ${EXTERNALS_BINARY_DIR}/spirv_binaries) | 277 | COMMAND ${HIFI_PYTHON_EXEC} ${CMAKE_SOURCE_DIR}/tools/shadergen.py |
| 315 | 278 | --commands ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE} | |
| 316 | target_python() | 279 | --tools-dir ${VCPKG_TOOLS_DIR} |
| 317 | 280 | --build-dir ${CMAKE_CURRENT_BINARY_DIR} | |
| 318 | # A custom python script which will generate | 281 | --source-dir ${CMAKE_SOURCE_DIR} |
| 319 | if (ANDROID) | 282 | DEPENDS ${AUTOSCRIBE_SHADER_HEADERS} ${CMAKE_SOURCE_DIR}/tools/shadergen.py ${ALL_SCRIBE_SHADERS}) |
| 320 | add_custom_command( | ||
| 321 | OUTPUT ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS} | ||
| 322 | COMMENT "Generating/updating shaders" | ||
| 323 | COMMAND ${HIFI_PYTHON_EXEC} ${CMAKE_SOURCE_DIR}/tools/shadergen.py | ||
| 324 | --commands ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE} | ||
| 325 | --spirv-binaries ${SPIRV_BINARIES_DIR} | ||
| 326 | --scribe ${NATIVE_SCRIBE} | ||
| 327 | --build-dir ${CMAKE_CURRENT_BINARY_DIR} | ||
| 328 | --source-dir ${CMAKE_SOURCE_DIR} | ||
| 329 | DEPENDS ${AUTOSCRIBE_SHADER_HEADERS} spirv_binaries ${CMAKE_SOURCE_DIR}/tools/shadergen.py ${ALL_SCRIBE_SHADERS}) | ||
| 330 | else() | ||
| 331 | add_custom_command( | ||
| 332 | OUTPUT ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS} | ||
| 333 | COMMENT "Generating/updating shaders" | ||
| 334 | COMMAND ${HIFI_PYTHON_EXEC} ${CMAKE_SOURCE_DIR}/tools/shadergen.py | ||
| 335 | --commands ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE} | ||
| 336 | --spirv-binaries ${SPIRV_BINARIES_DIR} | ||
| 337 | --scribe $<TARGET_FILE:scribe> | ||
| 338 | --build-dir ${CMAKE_CURRENT_BINARY_DIR} | ||
| 339 | --source-dir ${CMAKE_SOURCE_DIR} | ||
| 340 | DEPENDS ${AUTOSCRIBE_SHADER_HEADERS} scribe spirv_binaries ${CMAKE_SOURCE_DIR}/tools/shadergen.py ${ALL_SCRIBE_SHADERS}) | ||
| 341 | endif() | ||
| 342 | 283 | ||
| 343 | add_custom_target(shadergen DEPENDS ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS}) | 284 | add_custom_target(shadergen DEPENDS ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS}) |
| 344 | set_target_properties(shadergen PROPERTIES FOLDER "Shaders") | 285 | set_target_properties(shadergen PROPERTIES FOLDER "Shaders") |
| @@ -19,13 +19,13 @@ macro(manually_install_openssl_for_qt) · 18 unmodified lines | |||
| 19 | find_package(OpenSSL REQUIRED) | 19 | find_package(OpenSSL REQUIRED) |
| 20 | 20 | ||
| 21 | install( | 21 | install( |
| 22 | FILES "${OPENSSL_DLL_PATH}/ssleay32.dll" | 22 | FILES "${VCPKG_INSTALL_ROOT}/bin/ssleay32.dll" |
| 23 | DESTINATION ${TARGET_INSTALL_DIR} | 23 | DESTINATION ${TARGET_INSTALL_DIR} |
| 24 | COMPONENT ${TARGET_INSTALL_COMPONENT} | 24 | COMPONENT ${TARGET_INSTALL_COMPONENT} |
| 25 | ) | 25 | ) |
| 26 | 26 | ||
| 27 | install( | 27 | install( |
| 28 | FILES "${OPENSSL_DLL_PATH}/libeay32.dll" | 28 | FILES "${VCPKG_INSTALL_ROOT}/bin/libeay32.dll" |
| 29 | DESTINATION ${TARGET_INSTALL_DIR} | 29 | DESTINATION ${TARGET_INSTALL_DIR} |
| 30 | COMPONENT ${TARGET_INSTALL_COMPONENT} | 30 | COMPONENT ${TARGET_INSTALL_COMPONENT} |
| 31 | ) | 31 | ) |
| @@ -16,7 +16,6 @@ macro(TARGET_BULLET) · 15 unmodified lines | |||
| 16 | list(APPEND BULLET_LIBRARIES ${LIB_DIR}/libLinearMath.a) | 16 | list(APPEND BULLET_LIBRARIES ${LIB_DIR}/libLinearMath.a) |
| 17 | list(APPEND BULLET_LIBRARIES ${LIB_DIR}/libBulletSoftBody.a) | 17 | list(APPEND BULLET_LIBRARIES ${LIB_DIR}/libBulletSoftBody.a) |
| 18 | else() | 18 | else() |
| 19 | add_dependency_external_projects(bullet) | ||
| 20 | find_package(Bullet REQUIRED) | 19 | find_package(Bullet REQUIRED) |
| 21 | endif() | 20 | endif() |
| 22 | # perform the system include hack for OS X to ignore warnings | 21 | # perform the system include hack for OS X to ignore warnings |
| @@ -1,18 +1,24 @@ | |||
| 1 | macro(TARGET_DRACO) | 1 | macro(TARGET_DRACO) |
| 2 | set(LIBS draco dracodec dracoenc) | ||
| 3 | find_library(LIBPATH ${LIB} PATHS ) | ||
| 2 | if (ANDROID) | 4 | if (ANDROID) |
| 3 | set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/draco) | 5 | set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/draco) |
| 4 | set(DRACO_INCLUDE_DIRS "${INSTALL_DIR}/include" CACHE TYPE INTERNAL) | 6 | set(DRACO_INCLUDE_DIRS "${INSTALL_DIR}/include" CACHE TYPE INTERNAL) |
| 5 | |||
| 6 | set(LIB_DIR ${INSTALL_DIR}/lib) | 7 | set(LIB_DIR ${INSTALL_DIR}/lib) |
| 7 | list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdraco.a) | 8 | list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdraco.a) |
| 8 | list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdracodec.a) | 9 | list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdracodec.a) |
| 9 | list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdracoenc.a) | 10 | list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdracoenc.a) |
| 11 | target_link_libraries(${TARGET_NAME} ${DRACO_LIBRARIES}) | ||
| 10 | else() | 12 | else() |
| 11 | add_dependency_external_projects(draco) | 13 | set(LIB_SEARCH_PATH_RELEASE ${VCPKG_INSTALL_ROOT}/lib/) |
| 12 | find_package(Draco REQUIRED) | 14 | set(LIB_SEARCH_PATH_DEBUG ${VCPKG_INSTALL_ROOT}/debug/lib/) |
| 13 | list(APPEND DRACO_LIBRARIES ${DRACO_LIBRARY}) | 15 | foreach(LIB ${LIBS}) |
| 14 | list(APPEND DRACO_LIBRARIES ${DRACO_ENCODER_LIBRARY}) | 16 | find_library(${LIB}_LIBPATH ${LIB} PATHS ${LIB_SEARCH_PATH_RELEASE} NO_DEFAULT_PATH) |
| 17 | list(APPEND DRACO_LIBRARY_RELEASE ${${LIB}_LIBPATH}) | ||
| 18 | find_library(${LIB}D_LIBPATH ${LIB} PATHS ${LIB_SEARCH_PATH_DEBUG} NO_DEFAULT_PATH) | ||
| 19 | list(APPEND DRACO_LIBRARY_DEBUG ${${LIB}D_LIBPATH}) | ||
| 20 | endforeach() | ||
| 21 | select_library_configurations(DRACO) | ||
| 22 | target_link_libraries(${TARGET_NAME} ${DRACO_LIBRARY}) | ||
| 15 | endif() | 23 | endif() |
| 16 | target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${DRACO_INCLUDE_DIRS}) | 24 | endmacro() |
| 17 | target_link_libraries(${TARGET_NAME} ${DRACO_LIBRARIES}) | ||
| 18 | endmacro() | ||
| @@ -8,15 +8,16 @@ · 7 unmodified lines | |||
| 8 | macro(TARGET_ETC2COMP) | 8 | macro(TARGET_ETC2COMP) |
| 9 | if (ANDROID) | 9 | if (ANDROID) |
| 10 | set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/etc2comp) | 10 | set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/etc2comp) |
| 11 | set(ETC2COMP_INCLUDE_DIRS "${INSTALL_DIR}/include/Etc" "${INSTALL_DIR}/include/EtcCodec") | 11 | set(ETC2COMP_INCLUDE_DIRS "${INSTALL_DIR}/include" "${INSTALL_DIR}/include/Etc" "${INSTALL_DIR}/include/EtcCodec") |
| 12 | set(ETC2COMP_LIBRARY_DEBUG ${INSTALL_DIR}/lib/libEtcLib.a) | 12 | set(ETC2COMP_LIBRARY_DEBUG ${INSTALL_DIR}/lib/libEtcLib.a) |
| 13 | set(ETC2COMP_LIBRARY_RELEASE ${INSTALL_DIR}/lib/libEtcLib.a) | 13 | set(ETC2COMP_LIBRARY_RELEASE ${INSTALL_DIR}/lib/libEtcLib.a) |
| 14 | select_library_configurations(ETC2COMP) | 14 | target_include_directories(${TARGET_NAME} PRIVATE ${ETC2COMP_INCLUDE_DIRS}) |
| 15 | else() | 15 | else() |
| 16 | add_dependency_external_projects(etc2comp) | 16 | find_library(ETC2COMP_LIBRARY_DEBUG EtcLib PATHS ${VCPKG_INSTALL_ROOT}/debug/lib/ NO_DEFAULT_PATH) |
| 17 | find_package(Etc2Comp REQUIRED) | 17 | find_library(ETC2COMP_LIBRARY_RELEASE EtcLib PATHS ${VCPKG_INSTALL_ROOT}/lib/ NO_DEFAULT_PATH) |
| 18 | endif() | 18 | endif() |
| 19 | 19 | ||
| 20 | target_include_directories(${TARGET_NAME} PRIVATE ${ETC2COMP_INCLUDE_DIRS}) | 20 | select_library_configurations(ETC2COMP) |
| 21 | target_link_libraries(${TARGET_NAME} ${ETC2COMP_LIBRARIES}) | 21 | target_link_libraries(${TARGET_NAME} ${ETC2COMP_LIBRARIES}) |
| 22 | endmacro() | 22 | endmacro() |
| 23 | |||
| @@ -6,7 +6,6 @@ · 5 unmodified lines | |||
| 6 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | 6 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html |
| 7 | # | 7 | # |
| 8 | macro(TARGET_GLI) | 8 | macro(TARGET_GLI) |
| 9 | add_dependency_external_projects(gli) | 9 | # We use vcpkg for both gli and glm, so we just re-use the target_glm macro here |
| 10 | find_package(GLI REQUIRED) | 10 | target_glm() |
| 11 | target_include_directories(${TARGET_NAME} PUBLIC ${GLI_INCLUDE_DIRS}) | ||
| 12 | endmacro() | 11 | endmacro() |
| @@ -7,10 +7,12 @@ · 6 unmodified lines | |||
| 7 | # | 7 | # |
| 8 | macro(TARGET_GLM) | 8 | macro(TARGET_GLM) |
| 9 | if (ANDROID) | 9 | if (ANDROID) |
| 10 | set(GLM_INCLUDE_DIRS "${HIFI_ANDROID_PRECOMPILED}/glm/include") | 10 | target_include_directories(${TARGET_NAME} PUBLIC "${VCPKG_INSTALL_ROOT}/include") |
| 11 | else() | 11 | else() |
| 12 | add_dependency_external_projects(glm) | 12 | find_package(glm CONFIG REQUIRED) |
| 13 | find_package(GLM REQUIRED) | 13 | target_link_libraries(${TARGET_NAME} glm) |
| 14 | endif() | 14 | endif() |
| 15 | target_include_directories(${TARGET_NAME} PUBLIC ${GLM_INCLUDE_DIRS}) | 15 | target_compile_definitions(${TARGET_NAME} PUBLIC GLM_FORCE_RADIANS) |
| 16 | target_compile_definitions(${TARGET_NAME} PUBLIC GLM_ENABLE_EXPERIMENTAL) | ||
| 17 | target_compile_definitions(${TARGET_NAME} PUBLIC GLM_FORCE_CTOR_INIT) | ||
| 16 | endmacro() | 18 | endmacro() |
| @@ -6,7 +6,6 @@ · 5 unmodified lines | |||
| 6 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | 6 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html |
| 7 | # | 7 | # |
| 8 | macro(TARGET_JSON) | 8 | macro(TARGET_JSON) |
| 9 | add_dependency_external_projects(json) | 9 | # We use vcpkg for both json and glm, so we just re-use the target_glm macro here |
| 10 | find_package(JSON REQUIRED) | 10 | target_glm() |
| 11 | target_include_directories(${TARGET_NAME} PUBLIC ${JSON_INCLUDE_DIRS}) | ||
| 12 | endmacro() | 11 | endmacro() |
| @@ -15,12 +15,17 @@ macro(TARGET_NVTT) · 14 unmodified lines | |||
| 15 | list(APPEND NVTT_LIBS "${NVTT_LIB_DIR}/libnvimage.so") | 15 | list(APPEND NVTT_LIBS "${NVTT_LIB_DIR}/libnvimage.so") |
| 16 | list(APPEND NVTT_LIBS "${NVTT_LIB_DIR}/libnvtt.so") | 16 | list(APPEND NVTT_LIBS "${NVTT_LIB_DIR}/libnvtt.so") |
| 17 | set(NVTT_LIBRARIES ${NVTT_LIBS} CACHE TYPE INTERNAL) | 17 | set(NVTT_LIBRARIES ${NVTT_LIBS} CACHE TYPE INTERNAL) |
| 18 | target_include_directories(${TARGET_NAME} PRIVATE ${NVTT_INCLUDE_DIRS}) | ||
| 18 | else() | 19 | else() |
| 19 | add_dependency_external_projects(nvtt) | 20 | find_library(NVTT_LIBRARY_RELEASE nvtt PATHS ${VCPKG_INSTALL_ROOT}/lib NO_DEFAULT_PATH) |
| 20 | find_package(NVTT REQUIRED) | 21 | find_library(NVTT_LIBRARY_DEBUG nvtt PATHS ${VCPKG_INSTALL_ROOT}/debug/lib NO_DEFAULT_PATH) |
| 21 | add_paths_to_fixup_libs(${NVTT_DLL_PATH}) | 22 | select_library_configurations(NVTT) |
| 22 | endif() | 23 | endif() |
| 23 | 24 | ||
| 24 | target_include_directories(${TARGET_NAME} PRIVATE ${NVTT_INCLUDE_DIRS}) | ||
| 25 | target_link_libraries(${TARGET_NAME} ${NVTT_LIBRARIES}) | 25 | target_link_libraries(${TARGET_NAME} ${NVTT_LIBRARIES}) |
| 26 | if ((NOT WIN32) AND (NOT ANDROID) AND (NOT APPLE)) | ||
| 27 | find_package(OpenMP) | ||
| 28 | target_link_libraries(${TARGET_NAME} OpenMP::OpenMP_C OpenMP::OpenMP_CXX) | ||
| 29 | endif() | ||
| 30 | |||
| 26 | endmacro() | 31 | endmacro() |
| @@ -11,15 +11,8 @@ macro(TARGET_OPENSSL) · 10 unmodified lines | |||
| 11 | set(OPENSSL_INCLUDE_DIR "${OPENSSL_INSTALL_DIR}/include" CACHE TYPE INTERNAL) | 11 | set(OPENSSL_INCLUDE_DIR "${OPENSSL_INSTALL_DIR}/include" CACHE TYPE INTERNAL) |
| 12 | set(OPENSSL_LIBRARIES "${OPENSSL_INSTALL_DIR}/lib/libcrypto.a;${OPENSSL_INSTALL_DIR}/lib/libssl.a" CACHE TYPE INTERNAL) | 12 | set(OPENSSL_LIBRARIES "${OPENSSL_INSTALL_DIR}/lib/libcrypto.a;${OPENSSL_INSTALL_DIR}/lib/libssl.a" CACHE TYPE INTERNAL) |
| 13 | else() | 13 | else() |
| 14 | 14 | # using VCPKG for OpenSSL | |
| 15 | find_package(OpenSSL REQUIRED) | 15 | find_package(OpenSSL REQUIRED) |
| 16 | |||
| 17 | if (APPLE AND ${OPENSSL_INCLUDE_DIR} STREQUAL "/usr/include") | ||
| 18 | # this is a user on OS X using system OpenSSL, which is going to throw warnings since they're deprecating for their common crypto | ||
| 19 | message(WARNING "The found version of OpenSSL is the OS X system version. This will produce deprecation warnings." | ||
| 20 | "\nWe recommend you install a newer version (at least 1.0.1h) in a different directory and set OPENSSL_ROOT_DIR in your env so Cmake can find it.") | ||
| 21 | endif() | ||
| 22 | |||
| 23 | endif() | 16 | endif() |
| 24 | 17 | ||
| 25 | include_directories(SYSTEM "${OPENSSL_INCLUDE_DIR}") | 18 | include_directories(SYSTEM "${OPENSSL_INCLUDE_DIR}") |
| @@ -0,0 +1,13 @@ | |||
| 1 | # | ||
| 2 | # Created by Bradley Austin Davis on 2018/10/24 | ||
| 3 | # Copyright 2013-2018 High Fidelity, Inc. | ||
| 4 | # | ||
| 5 | # Distributed under the Apache License, Version 2.0. | ||
| 6 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 7 | # | ||
| 8 | macro(TARGET_OPENVR) | ||
| 9 | find_library(OPENVR_LIBRARY_RELEASE NAMES openvr_api PATHS ${VCPKG_INSTALL_ROOT}/lib) | ||
| 10 | find_library(OPENVR_LIBRARY_DEBUG NAMES openvr_api PATHS ${VCPKG_INSTALL_ROOT}/debug/lib) | ||
| 11 | select_library_configurations(OPENVR) | ||
| 12 | target_link_libraries(${TARGET_NAME} ${OPENVR_LIBRARY}) | ||
| 13 | endmacro() | ||
| @@ -6,9 +6,12 @@ · 5 unmodified lines | |||
| 6 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | 6 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html |
| 7 | # | 7 | # |
| 8 | macro(TARGET_SDL2) | 8 | macro(TARGET_SDL2) |
| 9 | add_dependency_external_projects(sdl2) | 9 | # using VCPKG for SDL2 |
| 10 | find_package(SDL2 REQUIRED) | 10 | find_package(SDL2 CONFIG REQUIRED) |
| 11 | target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${SDL2_INCLUDE_DIR}) | 11 | if (WIN32) |
| 12 | target_link_libraries(${TARGET_NAME} ${SDL2_LIBRARY}) | 12 | target_link_libraries(${TARGET_NAME} SDL2::SDL2) |
| 13 | else() | ||
| 14 | target_link_libraries(${TARGET_NAME} SDL2::SDL2-static) | ||
| 15 | endif() | ||
| 13 | add_definitions(-DHAVE_SDL2) | 16 | add_definitions(-DHAVE_SDL2) |
| 14 | endmacro() | 17 | endmacro() |
| @@ -13,12 +13,17 @@ if (ANDROID) · 12 unmodified lines | |||
| 13 | set(TBB_LIBRARY ${TBB_INSTALL_DIR}/lib/release/libtbb.so CACHE FILEPATH "TBB library location") | 13 | set(TBB_LIBRARY ${TBB_INSTALL_DIR}/lib/release/libtbb.so CACHE FILEPATH "TBB library location") |
| 14 | set(TBB_MALLOC_LIBRARY ${TBB_INSTALL_DIR}/lib/release/libtbbmalloc.so CACHE FILEPATH "TBB malloc library location") | 14 | set(TBB_MALLOC_LIBRARY ${TBB_INSTALL_DIR}/lib/release/libtbbmalloc.so CACHE FILEPATH "TBB malloc library location") |
| 15 | set(TBB_LIBRARIES ${TBB_LIBRARY} ${TBB_MALLOC_LIBRARY}) | 15 | set(TBB_LIBRARIES ${TBB_LIBRARY} ${TBB_MALLOC_LIBRARY}) |
| 16 | else() | 16 | target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${TBB_INCLUDE_DIRS}) |
| 17 | target_link_libraries(${TARGET_NAME} ${TBB_LIBRARIES}) | ||
| 18 | elseif(APPLE) | ||
| 17 | add_dependency_external_projects(tbb) | 19 | add_dependency_external_projects(tbb) |
| 18 | find_package(TBB REQUIRED) | 20 | find_package(TBB REQUIRED) |
| 21 | target_link_libraries(${TARGET_NAME} ${TBB_LIBRARIES}) | ||
| 22 | target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${TBB_INCLUDE_DIRS}) | ||
| 23 | else() | ||
| 24 | # using VCPKG for TBB | ||
| 25 | find_package(TBB CONFIG REQUIRED) | ||
| 26 | target_link_libraries(${TARGET_NAME} TBB::tbb) | ||
| 19 | endif() | 27 | endif() |
| 20 | 28 | ||
| 21 | target_link_libraries(${TARGET_NAME} ${TBB_LIBRARIES}) | ||
| 22 | target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${TBB_INCLUDE_DIRS}) | ||
| 23 | |||
| 24 | endmacro() | 29 | endmacro() |
| @@ -5,15 +5,7 @@ · 4 unmodified lines | |||
| 5 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | 5 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html |
| 6 | # | 6 | # |
| 7 | macro(TARGET_VULKAN) | 7 | macro(TARGET_VULKAN) |
| 8 | find_package(Vulkan) | 8 | find_package(Vulkan REQUIRED) |
| 9 | 9 | target_include_directories(${TARGET_NAME} PRIVATE ${VULKAN_INCLUDE_DIR}) | |
| 10 | if (Vulkan_FOUND) | 10 | target_link_libraries(${TARGET_NAME} ${VULKAN_LIBRARY}) |
| 11 | add_definitions(-DHAVE_VULKAN) | ||
| 12 | target_include_directories(${TARGET_NAME} PRIVATE ${Vulkan_INCLUDE_DIRS}) | ||
| 13 | target_link_libraries(${TARGET_NAME} ${Vulkan_LIBRARIES}) | ||
| 14 | |||
| 15 | add_dependency_external_projects(glslang) | ||
| 16 | target_include_directories(${TARGET_NAME} PRIVATE ${GLSLANG_INCLUDE_DIRS}) | ||
| 17 | target_link_libraries(${TARGET_NAME} ${GLSLANG_LIBRARIES}) | ||
| 18 | endif() | ||
| 19 | endmacro() | 11 | endmacro() |
| @@ -6,17 +6,8 @@ · 5 unmodified lines | |||
| 6 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | 6 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html |
| 7 | # | 7 | # |
| 8 | macro(TARGET_ZLIB) | 8 | macro(TARGET_ZLIB) |
| 9 | 9 | # using VCPKG for zlib | |
| 10 | if (WIN32) | ||
| 11 | add_dependency_external_projects(zlib) | ||
| 12 | endif() | ||
| 13 | |||
| 14 | find_package(ZLIB REQUIRED) | 10 | find_package(ZLIB REQUIRED) |
| 15 | |||
| 16 | if (WIN32) | ||
| 17 | add_paths_to_fixup_libs(${ZLIB_DLL_PATH}) | ||
| 18 | endif() | ||
| 19 | |||
| 20 | target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${ZLIB_INCLUDE_DIRS}) | 11 | target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${ZLIB_INCLUDE_DIRS}) |
| 21 | target_link_libraries(${TARGET_NAME} ${ZLIB_LIBRARIES}) | 12 | target_link_libraries(${TARGET_NAME} ${ZLIB_LIBRARIES}) |
| 22 | endmacro() | 13 | endmacro() |
| @@ -1,30 +0,0 @@ | |||
| 1 | # | ||
| 2 | # FindDraco.cmake | ||
| 3 | # | ||
| 4 | # Try to find Draco libraries and include path. | ||
| 5 | # Once done this will define | ||
| 6 | # | ||
| 7 | # DRACO_FOUND | ||
| 8 | # DRACO_INCLUDE_DIRS | ||
| 9 | # DRACO_LIBRARY | ||
| 10 | # DRACO_ENCODER_LIBRARY | ||
| 11 | # DRACO_DECODER_LIBRARY | ||
| 12 | # | ||
| 13 | # Created on 8/8/2017 by Stephen Birarda | ||
| 14 | # Copyright 2017 High Fidelity, Inc. | ||
| 15 | # | ||
| 16 | # Distributed under the Apache License, Version 2.0. | ||
| 17 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 18 | # | ||
| 19 | |||
| 20 | include("${MACRO_DIR}/HifiLibrarySearchHints.cmake") | ||
| 21 | hifi_library_search_hints("draco") | ||
| 22 | |||
| 23 | find_path(DRACO_INCLUDE_DIRS draco/core/draco_types.h PATH_SUFFIXES include/draco/src include HINTS ${DRACO_SEARCH_DIRS}) | ||
| 24 | |||
| 25 | find_library(DRACO_LIBRARY draco PATH_SUFFIXES "lib" HINTS ${DRACO_SEARCH_DIRS}) | ||
| 26 | find_library(DRACO_ENCODER_LIBRARY draco PATH_SUFFIXES "lib" HINTS ${DRACO_SEARCH_DIRS}) | ||
| 27 | find_library(DRACO_DECODER_LIBRARY draco PATH_SUFFIXES "lib" HINTS ${DRACO_SEARCH_DIRS}) | ||
| 28 | |||
| 29 | include(FindPackageHandleStandardArgs) | ||
| 30 | find_package_handle_standard_args(DRACO DEFAULT_MSG DRACO_INCLUDE_DIRS DRACO_LIBRARY DRACO_ENCODER_LIBRARY DRACO_DECODER_LIBRARY) | ||
| @@ -1,37 +0,0 @@ | |||
| 1 | # | ||
| 2 | # FindEtc2Comp.cmake | ||
| 3 | # | ||
| 4 | # Try to find the Etc2Comp compression library. | ||
| 5 | # | ||
| 6 | # Once done this will define | ||
| 7 | # | ||
| 8 | # ETC2COMP_FOUND - system found Etc2Comp | ||
| 9 | # ETC2COMP_INCLUDE_DIRS - the Etc2Comp include directory | ||
| 10 | # ETC2COMP_LIBRARIES - link to this to use Etc2Comp | ||
| 11 | # | ||
| 12 | # Created on 5/2/2018 by Sam Gondelman | ||
| 13 | # Copyright 2018 High Fidelity, Inc. | ||
| 14 | # | ||
| 15 | # Distributed under the Apache License, Version 2.0. | ||
| 16 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 17 | # | ||
| 18 | |||
| 19 | include("${MACRO_DIR}/HifiLibrarySearchHints.cmake") | ||
| 20 | hifi_library_search_hints("etc2comp") | ||
| 21 | |||
| 22 | find_path(ETC_INCLUDE_DIR NAMES Etc.h HINTS ${ETC2COMP_SEARCH_DIRS}) | ||
| 23 | find_path(ETCCODEC_INCLUDE_DIR NAMES EtcBlock4x4.h HINTS ${ETC2COMP_SEARCH_DIRS}) | ||
| 24 | set(ETC2COMP_INCLUDE_DIRS "${ETC_INCLUDE_DIR}" "${ETCCODEC_INCLUDE_DIR}") | ||
| 25 | |||
| 26 | find_library(ETC2COMP_LIBRARY_DEBUG NAMES ETC2COMP ETC2COMP_LIB PATH_SUFFIXES EtcLib/Debug HINTS ${ETC2COMP_SEARCH_DIRS}) | ||
| 27 | find_library(ETC2COMP_LIBRARY_RELEASE NAMES ETC2COMP ETC2COMP_LIB PATH_SUFFIXES EtcLib/Release EtcLib HINTS ${ETC2COMP_SEARCH_DIRS}) | ||
| 28 | |||
| 29 | include(SelectLibraryConfigurations) | ||
| 30 | select_library_configurations(ETC2COMP) | ||
| 31 | |||
| 32 | set(ETC2COMP_LIBRARIES ${ETC2COMP_LIBRARY}) | ||
| 33 | |||
| 34 | find_package_handle_standard_args(ETC2COMP "Could NOT find ETC2COMP, try to set the path to ETC2COMP root folder in the system variable ETC2COMP_ROOT_DIR or create a directory etc2comp in HIFI_LIB_DIR and paste the necessary files there" | ||
| 35 | ETC2COMP_INCLUDE_DIRS ETC2COMP_LIBRARIES) | ||
| 36 | |||
| 37 | mark_as_advanced(ETC2COMP_INCLUDE_DIRS ETC2COMP_LIBRARIES ETC2COMP_SEARCH_DIRS) | ||
| @@ -1,33 +0,0 @@ | |||
| 1 | # | ||
| 2 | # FindGLEW.cmake | ||
| 3 | # | ||
| 4 | # Try to find GLEW library and include path. Note that this only handles static GLEW. | ||
| 5 | # Once done this will define | ||
| 6 | # | ||
| 7 | # GLEW_FOUND | ||
| 8 | # GLEW_INCLUDE_DIRS | ||
| 9 | # GLEW_LIBRARIES | ||
| 10 | # | ||
| 11 | # Created on 2/6/2014 by Stephen Birarda | ||
| 12 | # Copyright 2014 High Fidelity, Inc. | ||
| 13 | # | ||
| 14 | # Adapted from FindGLEW.cmake available in the nvidia-texture-tools repository | ||
| 15 | # (https://code.google.com/p/nvidia-texture-tools/source/browse/trunk/cmake/FindGLEW.cmake?r=96) | ||
| 16 | # | ||
| 17 | # Distributed under the Apache License, Version 2.0. | ||
| 18 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 19 | # | ||
| 20 | |||
| 21 | include("${MACRO_DIR}/HifiLibrarySearchHints.cmake") | ||
| 22 | hifi_library_search_hints("glew") | ||
| 23 | |||
| 24 | find_path(GLEW_INCLUDE_DIRS GL/glew.h PATH_SUFFIXES include HINTS ${GLEW_SEARCH_DIRS}) | ||
| 25 | |||
| 26 | find_library(GLEW_LIBRARY_RELEASE glew32 PATH_SUFFIXES "lib/Release/Win32" "lib" HINTS ${GLEW_SEARCH_DIRS}) | ||
| 27 | find_library(GLEW_LIBRARY_DEBUG glew32d PATH_SUFFIXES "lib/Debug/Win32" "lib" HINTS ${GLEW_SEARCH_DIRS}) | ||
| 28 | |||
| 29 | include(SelectLibraryConfigurations) | ||
| 30 | select_library_configurations(GLEW) | ||
| 31 | |||
| 32 | include(FindPackageHandleStandardArgs) | ||
| 33 | find_package_handle_standard_args(GLEW DEFAULT_MSG GLEW_INCLUDE_DIRS GLEW_LIBRARIES) | ||
| @@ -1,19 +0,0 @@ | |||
| 1 | # | ||
| 2 | # Created by Bradley Austin Davis on 2018/07/22 | ||
| 3 | # Copyright 2013-2018 High Fidelity, Inc. | ||
| 4 | # | ||
| 5 | # Distributed under the Apache License, Version 2.0. | ||
| 6 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 7 | # | ||
| 8 | |||
| 9 | # setup hints for JSON search | ||
| 10 | include("${MACRO_DIR}/HifiLibrarySearchHints.cmake") | ||
| 11 | hifi_library_search_hints("json") | ||
| 12 | |||
| 13 | # locate header | ||
| 14 | find_path(JSON_INCLUDE_DIRS "json/json.hpp" HINTS ${JSON_SEARCH_DIRS}) | ||
| 15 | |||
| 16 | include(FindPackageHandleStandardArgs) | ||
| 17 | find_package_handle_standard_args(JSON DEFAULT_MSG JSON_INCLUDE_DIRS) | ||
| 18 | |||
| 19 | mark_as_advanced(JSON_INCLUDE_DIRS JSON_SEARCH_DIRS) | ||
| @@ -1,174 +0,0 @@ | |||
| 1 | # - Try to find the OpenSSL encryption library | ||
| 2 | # Once done this will define | ||
| 3 | # | ||
| 4 | # OPENSSL_ROOT_DIR - Set this variable to the root installation of OpenSSL | ||
| 5 | # | ||
| 6 | # Read-Only variables: | ||
| 7 | # OPENSSL_FOUND - system has the OpenSSL library | ||
| 8 | # OPENSSL_INCLUDE_DIR - the OpenSSL include directory | ||
| 9 | # OPENSSL_LIBRARIES - The libraries needed to use OpenSSL | ||
| 10 | # OPENSSL_VERSION - This is set to $major.$minor.$revision$path (eg. 0.9.8s) | ||
| 11 | # | ||
| 12 | # Modified on 7/16/2014 by Stephen Birarda | ||
| 13 | # This is an adapted version of the FindOpenSSL.cmake module distributed with Cmake 2.8.12.2 | ||
| 14 | # The original license for that file is displayed below. | ||
| 15 | # | ||
| 16 | #============================================================================= | ||
| 17 | # Copyright 2006-2009 Kitware, Inc. | ||
| 18 | # Copyright 2006 Alexander Neundorf <neundorf@kde.org> | ||
| 19 | # Copyright 2009-2011 Mathieu Malaterre <mathieu.malaterre@gmail.com> | ||
| 20 | # | ||
| 21 | # Distributed under the OSI-approved BSD License (the "License"); | ||
| 22 | # see accompanying file Copyright.txt for details. | ||
| 23 | # | ||
| 24 | # This software is distributed WITHOUT ANY WARRANTY; without even the | ||
| 25 | # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
| 26 | # See the License for more information. | ||
| 27 | #============================================================================= | ||
| 28 | # (To distribute this file outside of CMake, substitute the full | ||
| 29 | # License text for the above reference.) | ||
| 30 | |||
| 31 | if (UNIX) | ||
| 32 | find_package(PkgConfig QUIET) | ||
| 33 | pkg_check_modules(_OPENSSL QUIET openssl) | ||
| 34 | endif () | ||
| 35 | |||
| 36 | if (WIN32) | ||
| 37 | if (("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")) | ||
| 38 | set(_OPENSSL_ROOT_HINTS_AND_PATHS $ENV{VCPKG_ROOT}/installed/x64-windows) | ||
| 39 | else() | ||
| 40 | set(_OPENSSL_ROOT_HINTS_AND_PATHS $ENV{VCPKG_ROOT}/installed/x86-windows) | ||
| 41 | endif() | ||
| 42 | else () | ||
| 43 | include("${MACRO_DIR}/HifiLibrarySearchHints.cmake") | ||
| 44 | hifi_library_search_hints("openssl") | ||
| 45 | |||
| 46 | set(_OPENSSL_ROOT_HINTS_AND_PATHS ${OPENSSL_SEARCH_DIRS}) | ||
| 47 | endif () | ||
| 48 | |||
| 49 | find_path(OPENSSL_INCLUDE_DIR NAMES openssl/ssl.h HINTS ${_OPENSSL_ROOT_HINTS_AND_PATHS} ${_OPENSSL_INCLUDEDIR} | ||
| 50 | PATH_SUFFIXES include | ||
| 51 | ) | ||
| 52 | |||
| 53 | if (WIN32 AND NOT CYGWIN) | ||
| 54 | if (MSVC) | ||
| 55 | # Using vcpkg builds of openssl | ||
| 56 | find_library(LIB_EAY_LIBRARY_RELEASE NAMES libeay32 HINTS ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES "lib") | ||
| 57 | find_library(SSL_EAY_LIBRARY_RELEASE NAMES ssleay32 HINTS ${_OPENSSL_ROOT_HINTS_AND_PATHS} PATH_SUFFIXES "lib") | ||
| 58 | |||
| 59 | include(SelectLibraryConfigurations) | ||
| 60 | select_library_configurations(LIB_EAY) | ||
| 61 | select_library_configurations(SSL_EAY) | ||
| 62 | set(OPENSSL_LIBRARIES ${SSL_EAY_LIBRARY} ${LIB_EAY_LIBRARY}) | ||
| 63 | find_path(OPENSSL_DLL_PATH NAMES ssleay32.dll PATH_SUFFIXES "bin" HINTS ${_OPENSSL_ROOT_HINTS_AND_PATHS} NO_DEFAULT_PATH) | ||
| 64 | endif() | ||
| 65 | else() | ||
| 66 | |||
| 67 | find_library(OPENSSL_SSL_LIBRARY NAMES ssl ssleay32 ssleay32MD HINTS ${_OPENSSL_ROOT_HINTS_AND_PATHS} ${_OPENSSL_LIBDIR} | ||
| 68 | PATH_SUFFIXES lib | ||
| 69 | ) | ||
| 70 | |||
| 71 | find_library(OPENSSL_CRYPTO_LIBRARY NAMES crypto HINTS ${_OPENSSL_ROOT_HINTS_AND_PATHS} ${_OPENSSL_LIBDIR} | ||
| 72 | PATH_SUFFIXES lib | ||
| 73 | ) | ||
| 74 | |||
| 75 | mark_as_advanced(OPENSSL_CRYPTO_LIBRARY OPENSSL_SSL_LIBRARY) | ||
| 76 | |||
| 77 | # compat defines | ||
| 78 | set(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY}) | ||
| 79 | set(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY}) | ||
| 80 | |||
| 81 | set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY}) | ||
| 82 | |||
| 83 | endif () | ||
| 84 | |||
| 85 | function(from_hex HEX DEC) | ||
| 86 | string(TOUPPER "${HEX}" HEX) | ||
| 87 | set(_res 0) | ||
| 88 | string(LENGTH "${HEX}" _strlen) | ||
| 89 | |||
| 90 | while (_strlen GREATER 0) | ||
| 91 | math(EXPR _res "${_res} * 16") | ||
| 92 | string(SUBSTRING "${HEX}" 0 1 NIBBLE) | ||
| 93 | string(SUBSTRING "${HEX}" 1 -1 HEX) | ||
| 94 | if (NIBBLE STREQUAL "A") | ||
| 95 | math(EXPR _res "${_res} + 10") | ||
| 96 | elseif (NIBBLE STREQUAL "B") | ||
| 97 | math(EXPR _res "${_res} + 11") | ||
| 98 | elseif (NIBBLE STREQUAL "C") | ||
| 99 | math(EXPR _res "${_res} + 12") | ||
| 100 | elseif (NIBBLE STREQUAL "D") | ||
| 101 | math(EXPR _res "${_res} + 13") | ||
| 102 | elseif (NIBBLE STREQUAL "E") | ||
| 103 | math(EXPR _res "${_res} + 14") | ||
| 104 | elseif (NIBBLE STREQUAL "F") | ||
| 105 | math(EXPR _res "${_res} + 15") | ||
| 106 | else() | ||
| 107 | math(EXPR _res "${_res} + ${NIBBLE}") | ||
| 108 | endif() | ||
| 109 | |||
| 110 | string(LENGTH "${HEX}" _strlen) | ||
| 111 | endwhile() | ||
| 112 | |||
| 113 | set(${DEC} ${_res} PARENT_SCOPE) | ||
| 114 | endfunction() | ||
| 115 | |||
| 116 | if (OPENSSL_INCLUDE_DIR) | ||
| 117 | if(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h") | ||
| 118 | file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str | ||
| 119 | REGEX "^#[ ]?define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*") | ||
| 120 | |||
| 121 | # The version number is encoded as 0xMNNFFPPS: major minor fix patch status | ||
| 122 | # The status gives if this is a developer or prerelease and is ignored here. | ||
| 123 | # Major, minor, and fix directly translate into the version numbers shown in | ||
| 124 | # the string. The patch field translates to the single character suffix that | ||
| 125 | # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so | ||
| 126 | # on. | ||
| 127 | |||
| 128 | string(REGEX REPLACE "^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]).*$" | ||
| 129 | "\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}") | ||
| 130 | list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR) | ||
| 131 | list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR) | ||
| 132 | from_hex("${OPENSSL_VERSION_MINOR}" OPENSSL_VERSION_MINOR) | ||
| 133 | list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX) | ||
| 134 | from_hex("${OPENSSL_VERSION_FIX}" OPENSSL_VERSION_FIX) | ||
| 135 | list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH) | ||
| 136 | |||
| 137 | if (NOT OPENSSL_VERSION_PATCH STREQUAL "00") | ||
| 138 | from_hex("${OPENSSL_VERSION_PATCH}" _tmp) | ||
| 139 | # 96 is the ASCII code of 'a' minus 1 | ||
| 140 | math(EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96") | ||
| 141 | unset(_tmp) | ||
| 142 | # Once anyone knows how OpenSSL would call the patch versions beyond 'z' | ||
| 143 | # this should be updated to handle that, too. This has not happened yet | ||
| 144 | # so it is simply ignored here for now. | ||
| 145 | string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING) | ||
| 146 | endif () | ||
| 147 | |||
| 148 | set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}") | ||
| 149 | endif () | ||
| 150 | endif () | ||
| 151 | |||
| 152 | include(FindPackageHandleStandardArgs) | ||
| 153 | |||
| 154 | set(OPENSSL_REQUIREMENTS OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR) | ||
| 155 | if (WIN32) | ||
| 156 | list(APPEND OPENSSL_REQUIREMENTS OPENSSL_DLL_PATH) | ||
| 157 | endif () | ||
| 158 | |||
| 159 | if (OPENSSL_VERSION) | ||
| 160 | find_package_handle_standard_args(OpenSSL | ||
| 161 | REQUIRED_VARS | ||
| 162 | ${OPENSSL_REQUIREMENTS} | ||
| 163 | VERSION_VAR | ||
| 164 | OPENSSL_VERSION | ||
| 165 | FAIL_MESSAGE | ||
| 166 | "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" | ||
| 167 | ) | ||
| 168 | else () | ||
| 169 | find_package_handle_standard_args(OpenSSL "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR" | ||
| 170 | ${OPENSSL_REQUIREMENTS} | ||
| 171 | ) | ||
| 172 | endif () | ||
| 173 | |||
| 174 | mark_as_advanced(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES OPENSSL_SEARCH_DIRS) | ||
| @@ -1,21 +0,0 @@ | |||
| 1 | # | ||
| 2 | # FindLibOVR.cmake | ||
| 3 | # | ||
| 4 | # Try to find the LibOVR library to use the Oculus | ||
| 5 | |||
| 6 | # Once done this will define | ||
| 7 | # | ||
| 8 | # OPENVR_FOUND - system found LibOVR | ||
| 9 | # OPENVR_INCLUDE_DIRS - the LibOVR include directory | ||
| 10 | # OPENVR_LIBRARIES - Link this to use LibOVR | ||
| 11 | # | ||
| 12 | # Distributed under the Apache License, Version 2.0. | ||
| 13 | # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 14 | # | ||
| 15 | |||
| 16 | if (NOT ANDROID) | ||
| 17 | include(FindPackageHandleStandardArgs) | ||
| 18 | find_package_handle_standard_args(OPENVR DEFAULT_MSG OPENVR_INCLUDE_DIRS OPENVR_LIBRARIES) | ||
| 19 | endif() | ||
| 20 | |||
| 21 | mark_as_advanced(OPENVR_INCLUDE_DIRS OPENVR_LIBRARIES OPENVR_SEARCH_DIRS) | ||
| @@ -1,224 +0,0 @@ | |||
| 1 | # Locate SDL2 library | ||
| 2 | # This module defines | ||
| 3 | # SDL2_LIBRARY, the name of the library to link against | ||
| 4 | # SDL2_FOUND, if false, do not try to link to SDL2 | ||
| 5 | # SDL2_INCLUDE_DIR, where to find SDL.h | ||
| 6 | # | ||
| 7 | # This module responds to the the flag: | ||
| 8 | # SDL2_BUILDING_LIBRARY | ||
| 9 | # If this is defined, then no SDL2_main will be linked in because | ||
| 10 | # only applications need main(). | ||
| 11 | # Otherwise, it is assumed you are building an application and this | ||
| 12 | # module will attempt to locate and set the the proper link flags | ||
| 13 | # as part of the returned SDL2_LIBRARY variable. | ||
| 14 | # | ||
| 15 | # Don't forget to include SDL2main.h and SDL2main.m your project for the | ||
| 16 | # OS X framework based version. (Other versions link to -lSDL2main which | ||
| 17 | # this module will try to find on your behalf.) Also for OS X, this | ||
| 18 | # module will automatically add the -framework Cocoa on your behalf. | ||
| 19 | # | ||
| 20 | # | ||
| 21 | # Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration | ||
| 22 | # and no SDL2_LIBRARY, it means CMake did not find your SDL2 library | ||
| 23 | # (SDL2.dll, libsdl2.so, SDL2.framework, etc). | ||
| 24 | # Set SDL2_LIBRARY_TEMP to point to your SDL2 library, and configure again. | ||
| 25 | # Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value | ||
| 26 | # as appropriate. These values are used to generate the final SDL2_LIBRARY | ||
| 27 | # variable, but when these values are unset, SDL2_LIBRARY does not get created. | ||
| 28 | # | ||
| 29 | # | ||
| 30 | # $SDL2 is an environment variable that would | ||
| 31 | # correspond to the ./configure --prefix=$SDL2 | ||
| 32 | # used in building SDL2. | ||
| 33 | # l.e.galup 9-20-02 | ||
| 34 | # | ||
| 35 | # Modified by Eric Wing. | ||
| 36 | # Added code to assist with automated building by using environmental variables | ||
| 37 | # and providing a more controlled/consistent search behavior. | ||
| 38 | # Added new modifications to recognize OS X frameworks and | ||
| 39 | # additional Unix paths (FreeBSD, etc). | ||
| 40 | # Also corrected the header search path to follow "proper" SDL2 guidelines. | ||
| 41 | # Added a search for SDL2main which is needed by some platforms. | ||
| 42 | # Added a search for threads which is needed by some platforms. | ||
| 43 | # Added needed compile switches for MinGW. | ||
| 44 | # | ||
| 45 | # On OSX, this will prefer the Framework version (if found) over others. | ||
| 46 | # People will have to manually change the cache values of | ||
| 47 | # SDL2_LIBRARY to override this selection or set the CMake environment | ||
| 48 | # CMAKE_INCLUDE_PATH to modify the search paths. | ||
| 49 | # | ||
| 50 | # Note that the header path has changed from SDL2/SDL.h to just SDL.h | ||
| 51 | # This needed to change because "proper" SDL2 convention | ||
| 52 | # is #include "SDL.h", not <SDL2/SDL.h>. This is done for portability | ||
| 53 | # reasons because not all systems place things in SDL2/ (see FreeBSD). | ||
| 54 | # | ||
| 55 | # Ported by Johnny Patterson. This is a literal port for SDL2 of the FindSDL.cmake | ||
| 56 | # module with the minor edit of changing "SDL" to "SDL2" where necessary. This | ||
| 57 | # was not created for redistribution, and exists temporarily pending official | ||
| 58 | # SDL2 CMake modules. | ||
| 59 | # | ||
| 60 | # Note that on windows this will only search for the 32bit libraries, to search | ||
| 61 | # for 64bit change x86/i686-w64 to x64/x86_64-w64 | ||
| 62 | |||
| 63 | #============================================================================= | ||
| 64 | # Copyright 2003-2009 Kitware, Inc. | ||
| 65 | # | ||
| 66 | # CMake - Cross Platform Makefile Generator | ||
| 67 | # Copyright 2000-2014 Kitware, Inc. | ||
| 68 | # Copyright 2000-2011 Insight Software Consortium | ||
| 69 | # All rights reserved. | ||
| 70 | # | ||
| 71 | # Redistribution and use in source and binary forms, with or without | ||
| 72 | # modification, are permitted provided that the following conditions | ||
| 73 | # are met: | ||
| 74 | # | ||
| 75 | # * Redistributions of source code must retain the above copyright | ||
| 76 | # notice, this list of conditions and the following disclaimer. | ||
| 77 | # | ||
| 78 | # * Redistributions in binary form must reproduce the above copyright | ||
| 79 | # notice, this list of conditions and the following disclaimer in the | ||
| 80 | # documentation and/or other materials provided with the distribution. | ||
| 81 | # | ||
| 82 | # * Neither the names of Kitware, Inc., the Insight Software Consortium, | ||
| 83 | # nor the names of their contributors may be used to endorse or promote | ||
| 84 | # products derived from this software without specific prior written | ||
| 85 | # permission. | ||
| 86 | # | ||
| 87 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 88 | # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 89 | # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| 90 | # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| 91 | # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| 92 | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| 93 | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| 94 | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| 95 | # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| 96 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| 97 | # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 98 | # | ||
| 99 | # This software is distributed WITHOUT ANY WARRANTY; without even the | ||
| 100 | # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
| 101 | # See the License for more information. | ||
| 102 | #============================================================================= | ||
| 103 | # (To distribute this file outside of CMake, substitute the full | ||
| 104 | # License text for the above reference.) | ||
| 105 | include("${MACRO_DIR}/HifiLibrarySearchHints.cmake") | ||
| 106 | hifi_library_search_hints("sdl2") | ||
| 107 | |||
| 108 | FIND_PATH(SDL2_INCLUDE_DIR SDL.h | ||
| 109 | HINTS | ||
| 110 | ${SDL2_SEARCH_DIRS} | ||
| 111 | $ENV{SDL2} | ||
| 112 | PATH_SUFFIXES include/SDL2 include SDL2 | ||
| 113 | i686-w64-mingw32/include/SDL2 | ||
| 114 | x86_64-w64-mingw32/include/SDL2 | ||
| 115 | PATHS | ||
| 116 | ~/Library/Frameworks | ||
| 117 | /Library/Frameworks | ||
| 118 | /usr/local/include/SDL2 | ||
| 119 | /usr/include/SDL2 | ||
| 120 | /sw # Fink | ||
| 121 | /opt/local # DarwinPorts | ||
| 122 | /opt/csw # Blastwave | ||
| 123 | /opt | ||
| 124 | ) | ||
| 125 | |||
| 126 | # Lookup the 64 bit libs on x64 | ||
| 127 | IF(CMAKE_SIZEOF_VOID_P EQUAL 8) | ||
| 128 | FIND_LIBRARY(SDL2_LIBRARY_TEMP SDL2 | ||
| 129 | HINTS | ||
| 130 | ${SDL2_SEARCH_DIRS} | ||
| 131 | $ENV{SDL2} | ||
| 132 | PATH_SUFFIXES lib64 lib | ||
| 133 | lib/x64 | ||
| 134 | x86_64-w64-mingw32/lib | ||
| 135 | PATHS | ||
| 136 | /sw | ||
| 137 | /opt/local | ||
| 138 | /opt/csw | ||
| 139 | /opt | ||
| 140 | ) | ||
| 141 | |||
| 142 | if (WIN32) | ||
| 143 | find_path(SDL2_DLL_PATH SDL2.dll PATH_SUFFIXES lib/x64 HINTS ${SDL2_SEARCH_DIRS}) | ||
| 144 | endif () | ||
| 145 | # On 32bit build find the 32bit libs | ||
| 146 | ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8) | ||
| 147 | FIND_LIBRARY(SDL2_LIBRARY_TEMP SDL2 | ||
| 148 | HINTS | ||
| 149 | ${SDL2_SEARCH_DIRS} | ||
| 150 | $ENV{SDL2} | ||
| 151 | PATH_SUFFIXES lib | ||
| 152 | lib/x86 | ||
| 153 | i686-w64-mingw32/lib | ||
| 154 | PATHS | ||
| 155 | /sw | ||
| 156 | /opt/local | ||
| 157 | /opt/csw | ||
| 158 | /opt | ||
| 159 | ) | ||
| 160 | |||
| 161 | if (WIN32) | ||
| 162 | find_path(SDL2_DLL_PATH SDL2.dll PATH_SUFFIXES lib/x86 HINTS ${SDL2_SEARCH_DIRS}) | ||
| 163 | endif () | ||
| 164 | ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8) | ||
| 165 | |||
| 166 | # SDL2 may require threads on your system. | ||
| 167 | # The Apple build may not need an explicit flag because one of the | ||
| 168 | # frameworks may already provide it. | ||
| 169 | # But for non-OSX systems, I will use the CMake Threads package. | ||
| 170 | IF(NOT APPLE) | ||
| 171 | FIND_PACKAGE(Threads) | ||
| 172 | ENDIF(NOT APPLE) | ||
| 173 | |||
| 174 | # MinGW needs an additional library, mwindows | ||
| 175 | # It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -lmwindows | ||
| 176 | # (Actually on second look, I think it only needs one of the m* libraries.) | ||
| 177 | IF(MINGW) | ||
| 178 | SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW") | ||
| 179 | ENDIF(MINGW) | ||
| 180 | |||
| 181 | SET(SDL2_FOUND "NO") | ||
| 182 | IF(SDL2_LIBRARY_TEMP) | ||
| 183 | # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa. | ||
| 184 | # CMake doesn't display the -framework Cocoa string in the UI even | ||
| 185 | # though it actually is there if I modify a pre-used variable. | ||
| 186 | # I think it has something to do with the CACHE STRING. | ||
| 187 | # So I use a temporary variable until the end so I can set the | ||
| 188 | # "real" variable in one-shot. | ||
| 189 | IF(APPLE) | ||
| 190 | SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa") | ||
| 191 | ENDIF(APPLE) | ||
| 192 | |||
| 193 | # For threads, as mentioned Apple doesn't need this. | ||
| 194 | # In fact, there seems to be a problem if I used the Threads package | ||
| 195 | # and try using this line, so I'm just skipping it entirely for OS X. | ||
| 196 | IF(NOT APPLE) | ||
| 197 | SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT}) | ||
| 198 | ENDIF(NOT APPLE) | ||
| 199 | |||
| 200 | # For MinGW library | ||
| 201 | IF(MINGW) | ||
| 202 | SET(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP}) | ||
| 203 | ENDIF(MINGW) | ||
| 204 | |||
| 205 | # Set the final string here so the GUI reflects the final state. | ||
| 206 | SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL2 Library can be found") | ||
| 207 | # Set the temp variable to INTERNAL so it is not seen in the CMake GUI | ||
| 208 | SET(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "") | ||
| 209 | |||
| 210 | SET(SDL2_FOUND "YES") | ||
| 211 | ENDIF(SDL2_LIBRARY_TEMP) | ||
| 212 | |||
| 213 | INCLUDE(FindPackageHandleStandardArgs) | ||
| 214 | |||
| 215 | set(SDL2_REQUIREMENTS SDL2_LIBRARY SDL2_INCLUDE_DIR) | ||
| 216 | if (WIN32) | ||
| 217 | list(APPEND SDL2_REQUIREMENTS SDL2_DLL_PATH) | ||
| 218 | endif () | ||
| 219 | |||
| 220 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 REQUIRED_VARS ${SDL2_REQUIREMENTS}) | ||
| 221 | |||
| 222 | if (WIN32) | ||
| 223 | add_paths_to_fixup_libs(${SDL2_DLL_PATH}) | ||
| 224 | endif () | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: bullet3 | ||
| 2 | Version: ab8f16961e19a86ee20c6a1d61f662392524cc77 | ||
| 3 | Description: Bullet Physics is a professional collision detection, rigid body, and soft body dynamics library | ||
| @@ -0,0 +1,57 @@ | |||
| 1 | # Common Ambient Variables: | ||
| 2 | # CURRENT_BUILDTREES_DIR = ${VCPKG_ROOT_DIR}\buildtrees\${PORT} | ||
| 3 | # CURRENT_PACKAGES_DIR = ${VCPKG_ROOT_DIR}\packages\${PORT}_${TARGET_TRIPLET} | ||
| 4 | # CURRENT_PORT_DIR = ${VCPKG_ROOT_DIR}\ports\${PORT} | ||
| 5 | # PORT = current port name (zlib, etc) | ||
| 6 | # TARGET_TRIPLET = current triplet (x86-windows, x64-windows-static, etc) | ||
| 7 | # VCPKG_CRT_LINKAGE = C runtime linkage type (static, dynamic) | ||
| 8 | # VCPKG_LIBRARY_LINKAGE = target library linkage type (static, dynamic) | ||
| 9 | # VCPKG_ROOT_DIR = <C:\path\to\current\vcpkg> | ||
| 10 | # VCPKG_TARGET_ARCHITECTURE = target architecture (x64, x86, arm) | ||
| 11 | # | ||
| 12 | include(vcpkg_common_functions) | ||
| 13 | |||
| 14 | if (VCPKG_LIBRARY_LINKAGE STREQUAL dynamic) | ||
| 15 | message(WARNING "Dynamic not supported, building static") | ||
| 16 | set(VCPKG_LIBRARY_LINKAGE static) | ||
| 17 | set(VCPKG_CRT_LINKAGE dynamic) | ||
| 18 | endif() | ||
| 19 | |||
| 20 | vcpkg_from_github( | ||
| 21 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 22 | REPO bulletphysics/bullet3 | ||
| 23 | REF ab8f16961e19a86ee20c6a1d61f662392524cc77 | ||
| 24 | SHA512 927742db29867517283d45e475f0c534a9a57e165cae221f26e08e88057253a1682ac9919b2dc547b9cf388ba0b931b175623461d44f28c9184796ba90b1ed55 | ||
| 25 | HEAD_REF master | ||
| 26 | ) | ||
| 27 | |||
| 28 | |||
| 29 | vcpkg_configure_cmake( | ||
| 30 | SOURCE_PATH ${SOURCE_PATH} | ||
| 31 | OPTIONS | ||
| 32 | -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON | ||
| 33 | -DUSE_MSVC_RUNTIME_LIBRARY_DLL=ON | ||
| 34 | -DUSE_GLUT=0 | ||
| 35 | -DUSE_DX11=0 | ||
| 36 | -DBUILD_DEMOS=OFF | ||
| 37 | -DBUILD_OPENGL3_DEMOS=OFF | ||
| 38 | -DBUILD_BULLET3=OFF | ||
| 39 | -DBUILD_BULLET2_DEMOS=OFF | ||
| 40 | -DBUILD_CPU_DEMOS=OFF | ||
| 41 | -DBUILD_EXTRAS=OFF | ||
| 42 | -DBUILD_UNIT_TESTS=OFF | ||
| 43 | -DBUILD_SHARED_LIBS=ON | ||
| 44 | -DINSTALL_LIBS=ON | ||
| 45 | ) | ||
| 46 | |||
| 47 | vcpkg_install_cmake() | ||
| 48 | |||
| 49 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/lib/cmake) | ||
| 50 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/lib/cmake) | ||
| 51 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) | ||
| 52 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/include/bullet/BulletInverseDynamics/details) | ||
| 53 | |||
| 54 | vcpkg_copy_pdbs() | ||
| 55 | |||
| 56 | # Handle copyright | ||
| 57 | file(INSTALL ${SOURCE_PATH}/LICENSE.txt DESTINATION ${CURRENT_PACKAGES_DIR}/share/bullet3 RENAME copyright) | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | Source: draco | ||
| 2 | Version: 1.3.3 | ||
| 3 | Description: A library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics. | ||
| 4 | Build-Depends: | ||
| @@ -0,0 +1,56 @@ | |||
| 1 | # Common Ambient Variables: | ||
| 2 | # CURRENT_BUILDTREES_DIR = ${VCPKG_ROOT_DIR}\buildtrees\${PORT} | ||
| 3 | # CURRENT_PACKAGES_DIR = ${VCPKG_ROOT_DIR}\packages\${PORT}_${TARGET_TRIPLET} | ||
| 4 | # CURRENT_PORT DIR = ${VCPKG_ROOT_DIR}\ports\${PORT} | ||
| 5 | # PORT = current port name (zlib, etc) | ||
| 6 | # TARGET_TRIPLET = current triplet (x86-windows, x64-windows-static, etc) | ||
| 7 | # VCPKG_CRT_LINKAGE = C runtime linkage type (static, dynamic) | ||
| 8 | # VCPKG_LIBRARY_LINKAGE = target library linkage type (static, dynamic) | ||
| 9 | # VCPKG_ROOT_DIR = <C:\path\to\current\vcpkg> | ||
| 10 | # VCPKG_TARGET_ARCHITECTURE = target architecture (x64, x86, arm) | ||
| 11 | # | ||
| 12 | |||
| 13 | if (VCPKG_LIBRARY_LINKAGE STREQUAL dynamic) | ||
| 14 | message(STATUS "Warning: Dynamic building not supported yet. Building static.") | ||
| 15 | set(VCPKG_LIBRARY_LINKAGE static) | ||
| 16 | endif() | ||
| 17 | |||
| 18 | include(vcpkg_common_functions) | ||
| 19 | |||
| 20 | vcpkg_from_github( | ||
| 21 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 22 | REPO google/draco | ||
| 23 | REF 1.3.3 | ||
| 24 | SHA512 80ed5a623046822f5bb26b2454c8ee8cc93ffe9eb3012e8461cefdfc577b26d69a92ea0f0c5e14f5f48c1ef99f9a7263b01710df376792e74358ae14e49c3897 | ||
| 25 | HEAD_REF master | ||
| 26 | ) | ||
| 27 | |||
| 28 | vcpkg_configure_cmake( | ||
| 29 | SOURCE_PATH ${SOURCE_PATH} | ||
| 30 | PREFER_NINJA | ||
| 31 | ) | ||
| 32 | |||
| 33 | vcpkg_install_cmake() | ||
| 34 | |||
| 35 | vcpkg_fixup_cmake_targets(CONFIG_PATH lib/draco/cmake) | ||
| 36 | |||
| 37 | # Install tools and plugins | ||
| 38 | file(GLOB TOOLS "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/*.exe") | ||
| 39 | if(TOOLS) | ||
| 40 | file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/tools/draco) | ||
| 41 | file(COPY ${TOOLS} DESTINATION ${CURRENT_PACKAGES_DIR}/tools/draco) | ||
| 42 | endif() | ||
| 43 | |||
| 44 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin) | ||
| 45 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/lib/draco) | ||
| 46 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/bin) | ||
| 47 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/lib/draco) | ||
| 48 | |||
| 49 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) | ||
| 50 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share) | ||
| 51 | |||
| 52 | vcpkg_copy_pdbs() | ||
| 53 | |||
| 54 | # Handle copyright | ||
| 55 | file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/draco) | ||
| 56 | file(RENAME ${CURRENT_PACKAGES_DIR}/share/draco/LICENSE ${CURRENT_PACKAGES_DIR}/share/draco/copyright) | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: etc2comp | ||
| 2 | Version: 7f1843bf07825c21cab711360c1ddbad04641036 | ||
| 3 | Description: ETC2 image compression library | ||
| @@ -0,0 +1,39 @@ | |||
| 1 | # Common Ambient Variables: | ||
| 2 | # CURRENT_BUILDTREES_DIR = ${VCPKG_ROOT_DIR}\buildtrees\${PORT} | ||
| 3 | # CURRENT_PACKAGES_DIR = ${VCPKG_ROOT_DIR}\packages\${PORT}_${TARGET_TRIPLET} | ||
| 4 | # CURRENT_PORT_DIR = ${VCPKG_ROOT_DIR}\ports\${PORT} | ||
| 5 | # PORT = current port name (zlib, etc) | ||
| 6 | # TARGET_TRIPLET = current triplet (x86-windows, x64-windows-static, etc) | ||
| 7 | # VCPKG_CRT_LINKAGE = C runtime linkage type (static, dynamic) | ||
| 8 | # VCPKG_LIBRARY_LINKAGE = target library linkage type (static, dynamic) | ||
| 9 | # VCPKG_ROOT_DIR = <C:\path\to\current\vcpkg> | ||
| 10 | # VCPKG_TARGET_ARCHITECTURE = target architecture (x64, x86, arm) | ||
| 11 | # | ||
| 12 | if (VCPKG_LIBRARY_LINKAGE STREQUAL dynamic) | ||
| 13 | message(STATUS "Warning: Dynamic building not supported yet. Building static.") | ||
| 14 | set(VCPKG_LIBRARY_LINKAGE static) | ||
| 15 | set(VCPKG_CRT_LINKAGE dynamic) | ||
| 16 | endif() | ||
| 17 | |||
| 18 | include(vcpkg_common_functions) | ||
| 19 | |||
| 20 | vcpkg_from_github( | ||
| 21 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 22 | REPO highfidelity/etc2comp | ||
| 23 | REF 7f1843bf07825c21cab711360c1ddbad04641036 | ||
| 24 | SHA512 d747076acda8537d39585858c793a35c3dcc9ef283d723619a47f8c81ec1454c95b3340ad35f0655a939eae5b8271c801c48a9a7568311a01903a344c44af25b | ||
| 25 | HEAD_REF master | ||
| 26 | ) | ||
| 27 | |||
| 28 | vcpkg_configure_cmake( | ||
| 29 | SOURCE_PATH ${SOURCE_PATH} | ||
| 30 | ) | ||
| 31 | |||
| 32 | vcpkg_install_cmake() | ||
| 33 | |||
| 34 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) | ||
| 35 | file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/etc2comp) | ||
| 36 | file(RENAME ${CURRENT_PACKAGES_DIR}/share/etc2comp/LICENSE ${CURRENT_PACKAGES_DIR}/share/etc2comp/copyright) | ||
| 37 | |||
| 38 | vcpkg_copy_pdbs() | ||
| 39 | |||
| @@ -0,0 +1,4 @@ | |||
| 1 | Source: gli | ||
| 2 | Version: 0.8.2-1 | ||
| 3 | Build-Depends: glm | ||
| 4 | Description: OpenGL Image (GLI) https://gli.g-truc.net | ||
| @@ -0,0 +1,19 @@ | |||
| 1 | #header-only library | ||
| 2 | include(vcpkg_common_functions) | ||
| 3 | |||
| 4 | vcpkg_from_github( | ||
| 5 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 6 | REPO g-truc/gli | ||
| 7 | REF 0.8.2.0 | ||
| 8 | SHA512 c254a4e1497d0add985e4a882c552db99c512cc0e9cc72145d51a6e7deada817d624d9818099a47136a8a3ef1223a26a34e355e3c713166f0bb062e506059834 | ||
| 9 | HEAD_REF master | ||
| 10 | ) | ||
| 11 | |||
| 12 | # Put the license file where vcpkg expects it | ||
| 13 | # manual.md contains the "licenses" section for the project | ||
| 14 | file(COPY ${SOURCE_PATH}/manual.md DESTINATION ${CURRENT_PACKAGES_DIR}/share/gli/) | ||
| 15 | file(RENAME ${CURRENT_PACKAGES_DIR}/share/gli/manual.md ${CURRENT_PACKAGES_DIR}/share/gli/copyright) | ||
| 16 | |||
| 17 | # Copy the glm header files | ||
| 18 | file(GLOB HEADER_FILES "${SOURCE_PATH}/gli/*.hpp" "${SOURCE_PATH}/gli/core") | ||
| 19 | file(COPY ${HEADER_FILES} DESTINATION ${CURRENT_PACKAGES_DIR}/include/gli) | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: glm | ||
| 2 | Version: 0.9.9.3 | ||
| 3 | Description: OpenGL Mathematics (GLM) https://glm.g-truc.net | ||
| @@ -0,0 +1,13 @@ | |||
| 1 | diff --git a/CMakeLists.txt b/CMakeLists.txt | ||
| 2 | index 756673a3..5fbc8906 100644 | ||
| 3 | --- a/CMakeLists.txt | ||
| 4 | +++ b/CMakeLists.txt | ||
| 5 | @@ -216,7 +216,7 @@ elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") | ||
| 6 | message("GLM: Visual C++ - ${CMAKE_CXX_COMPILER_ID} compiler") | ||
| 7 | endif() | ||
| 8 | |||
| 9 | - add_compile_options(/W4 /WX) | ||
| 10 | + add_compile_options(/W4) | ||
| 11 | add_compile_options(/wd4309 /wd4324 /wd4389 /wd4127 /wd4267 /wd4146 /wd4201 /wd4464 /wd4514 /wd4701 /wd4820 /wd4365) | ||
| 12 | add_definitions(-D_CRT_SECURE_NO_WARNINGS) | ||
| 13 | endif() | ||
| @@ -0,0 +1,32 @@ | |||
| 1 | include(vcpkg_common_functions) | ||
| 2 | |||
| 3 | vcpkg_from_github( | ||
| 4 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 5 | REPO g-truc/glm | ||
| 6 | REF 0.9.9.3 | ||
| 7 | SHA512 44152ea6438763feda3b78813287fd59d3574a9630a41647a157825bf5ce4a18fbbecae5a5ccd94acc118ed3d42cbce53d3a67f25632d0c00ab77e7de2bb4650 | ||
| 8 | HEAD_REF master | ||
| 9 | ) | ||
| 10 | |||
| 11 | vcpkg_apply_patches( | ||
| 12 | SOURCE_PATH ${SOURCE_PATH} | ||
| 13 | PATCHES "${CMAKE_CURRENT_LIST_DIR}/disable_warnings_as_error.patch" | ||
| 14 | ) | ||
| 15 | |||
| 16 | vcpkg_configure_cmake( | ||
| 17 | SOURCE_PATH ${SOURCE_PATH} | ||
| 18 | OPTIONS -DGLM_TEST_ENABLE=OFF | ||
| 19 | ) | ||
| 20 | |||
| 21 | vcpkg_install_cmake() | ||
| 22 | |||
| 23 | vcpkg_fixup_cmake_targets(CONFIG_PATH "lib/cmake/glm") | ||
| 24 | |||
| 25 | vcpkg_copy_pdbs() | ||
| 26 | |||
| 27 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) | ||
| 28 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share) | ||
| 29 | |||
| 30 | # Put the license file where vcpkg expects it | ||
| 31 | file(COPY ${SOURCE_PATH}/manual.md DESTINATION ${CURRENT_PACKAGES_DIR}/share/glm/) | ||
| 32 | file(RENAME ${CURRENT_PACKAGES_DIR}/share/glm/manual.md ${CURRENT_PACKAGES_DIR}/share/glm/copyright) | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: glslang | ||
| 2 | Version: untagged-048c4dbc7f021224a933-1 | ||
| 3 | Description: Khronos reference front-end for GLSL and ESSL, and sample SPIR-V generator | ||
| @@ -0,0 +1,35 @@ | |||
| 1 | // | ||
| 2 | //Copyright (C) 2002-2005 3Dlabs Inc. Ltd. | ||
| 3 | //Copyright (C) 2012-2013 LunarG, Inc. | ||
| 4 | // | ||
| 5 | //All rights reserved. | ||
| 6 | // | ||
| 7 | //Redistribution and use in source and binary forms, with or without | ||
| 8 | //modification, are permitted provided that the following conditions | ||
| 9 | //are met: | ||
| 10 | // | ||
| 11 | // Redistributions of source code must retain the above copyright | ||
| 12 | // notice, this list of conditions and the following disclaimer. | ||
| 13 | // | ||
| 14 | // Redistributions in binary form must reproduce the above | ||
| 15 | // copyright notice, this list of conditions and the following | ||
| 16 | // disclaimer in the documentation and/or other materials provided | ||
| 17 | // with the distribution. | ||
| 18 | // | ||
| 19 | // Neither the name of 3Dlabs Inc. Ltd. nor the names of its | ||
| 20 | // contributors may be used to endorse or promote products derived | ||
| 21 | // from this software without specific prior written permission. | ||
| 22 | // | ||
| 23 | //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 24 | //"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 25 | //LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 26 | //FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 27 | //COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 28 | //INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 29 | //BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 30 | //LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 31 | //CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 32 | //LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 33 | //ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 34 | //POSSIBILITY OF SUCH DAMAGE. | ||
| 35 | // | ||
| @@ -0,0 +1,26 @@ | |||
| 1 | include(vcpkg_common_functions) | ||
| 2 | |||
| 3 | vcpkg_check_linkage(ONLY_STATIC_LIBRARY) | ||
| 4 | |||
| 5 | vcpkg_from_github( | ||
| 6 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 7 | REPO KhronosGroup/glslang | ||
| 8 | REF untagged-048c4dbc7f021224a933 | ||
| 9 | SHA512 e3097dd2db88320982d7da1ddce138839daf3251935909c3998a114aeadd408760b26b2d7c7ee547fb0519895ac1853a45c23df2eecf61135849b080252e9dec | ||
| 10 | HEAD_REF master | ||
| 11 | ) | ||
| 12 | |||
| 13 | vcpkg_configure_cmake( | ||
| 14 | SOURCE_PATH ${SOURCE_PATH} | ||
| 15 | PREFER_NINJA | ||
| 16 | OPTIONS -DCMAKE_DEBUG_POSTFIX=d | ||
| 17 | ) | ||
| 18 | |||
| 19 | vcpkg_install_cmake() | ||
| 20 | |||
| 21 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) | ||
| 22 | file(RENAME "${CURRENT_PACKAGES_DIR}/bin" "${CURRENT_PACKAGES_DIR}/tools") | ||
| 23 | file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/bin") | ||
| 24 | |||
| 25 | # Handle copyright | ||
| 26 | file(COPY ${CMAKE_CURRENT_LIST_DIR}/copyright DESTINATION ${CURRENT_PACKAGES_DIR}/share/glslang) | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | Source: hifi-client-deps | ||
| 2 | Version: 0 | ||
| 3 | Description: Collected dependencies for High Fidelity applications | ||
| 4 | Build-Depends: hifi-deps, glslang, nlohmann-json, openvr (windows), sdl2 (!android), spirv-cross (!android), spirv-tools (!android), vulkanmemoryallocator | ||
| @@ -0,0 +1 @@ | |||
| 1 | set(VCPKG_POLICY_EMPTY_PACKAGE enabled) | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | Source: hifi-deps | ||
| 2 | Version: 0 | ||
| 3 | Description: Collected dependencies for High Fidelity applications | ||
| 4 | Build-Depends: bullet3, draco, etc2comp, glm, nvtt, openssl (windows), tbb (!android&!osx), zlib | ||
| @@ -0,0 +1 @@ | |||
| 1 | set(VCPKG_POLICY_EMPTY_PACKAGE enabled) | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | Source: hifi-host-tools | ||
| 2 | Version: 0 | ||
| 3 | Description: Host build system compatible tools for building High Fidelity applications | ||
| 4 | Build-Depends: hifi-scribe, glslang, spirv-cross, spirv-tools | ||
| @@ -0,0 +1 @@ | |||
| 1 | set(VCPKG_POLICY_EMPTY_PACKAGE enabled) | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: hifi-scribe | ||
| 2 | Version: 1bd638a36ca771e5a68d01985b6389b71835cbd2 | ||
| 3 | Description: Scribe is a language for generating glsl files from templates | ||
| @@ -0,0 +1,19 @@ | |||
| 1 | set(VCPKG_POLICY_EMPTY_PACKAGE enabled) | ||
| 2 | include(vcpkg_common_functions) | ||
| 3 | |||
| 4 | vcpkg_from_github( | ||
| 5 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 6 | REPO highfidelity/scribe | ||
| 7 | REF 1bd638a36ca771e5a68d01985b6389b71835cbd2 | ||
| 8 | SHA512 dbe241d86df3912e544f6b9839873f9875df54efc93822b145e7b13243eaf2e3d690bc8a28b1e52d05bdcd7e68fca6b0b2f5c43ffd0f56a9b7a50d54dcf9e31e | ||
| 9 | HEAD_REF master | ||
| 10 | ) | ||
| 11 | |||
| 12 | vcpkg_configure_cmake(SOURCE_PATH ${SOURCE_PATH}) | ||
| 13 | vcpkg_install_cmake() | ||
| 14 | vcpkg_copy_pdbs() | ||
| 15 | |||
| 16 | # cleanup | ||
| 17 | configure_file(${SOURCE_PATH}/LICENSE ${CURRENT_PACKAGES_DIR}/share/hifi-scribe/copyright COPYONLY) | ||
| 18 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/tools) | ||
| 19 | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: nlohmann-json | ||
| 2 | Version: 3.3.0 | ||
| 3 | Description: JSON for Modern C++ | ||
| @@ -0,0 +1,18 @@ | |||
| 1 | include(vcpkg_common_functions) | ||
| 2 | |||
| 3 | set(SOURCE_VERSION 3.3.0) | ||
| 4 | |||
| 5 | vcpkg_download_distfile(HEADER | ||
| 6 | URLS "https://github.com/nlohmann/json/releases/download/v${SOURCE_VERSION}/json.hpp" | ||
| 7 | FILENAME "nlohmann-json-${SOURCE_VERSION}.hpp" | ||
| 8 | SHA512 c4e4bb84d1488f87a02c4e12409491225e345cc508e6dbbee1a3542fbd4953052c256d0fe78c4d3ce02d44c3a2155fe66f0c8a93a3851ddf94fec4f9f3fd6918 | ||
| 9 | ) | ||
| 10 | |||
| 11 | vcpkg_download_distfile(LICENSE | ||
| 12 | URLS "https://github.com/nlohmann/json/raw/v${SOURCE_VERSION}/LICENSE.MIT" | ||
| 13 | FILENAME "nlohmann-json-LICENSE-${SOURCE_VERSION}.txt" | ||
| 14 | SHA512 0fdb404547467f4523579acde53066badf458504d33edbb6e39df0ae145ed27d48a720189a60c225c0aab05f2aa4ce4050dcb241b56dc693f7ee9f54c8728a75 | ||
| 15 | ) | ||
| 16 | |||
| 17 | file(INSTALL ${HEADER} DESTINATION ${CURRENT_PACKAGES_DIR}/include/nlohmann RENAME json.hpp) | ||
| 18 | file(INSTALL ${LICENSE} DESTINATION ${CURRENT_PACKAGES_DIR}/share/nlohmann-json RENAME copyright) | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: nvtt | ||
| 2 | Version: 8c7e6b40ee5095f227b75880fabd89c99d6f34c0 | ||
| 3 | Description: Texture processing tools with support for Direct3D 10 and 11 formats. | ||
| @@ -0,0 +1,39 @@ | |||
| 1 | # Common Ambient Variables: | ||
| 2 | # VCPKG_ROOT_DIR = <C:\path\to\current\vcpkg> | ||
| 3 | # TARGET_TRIPLET is the current triplet (x86-windows, etc) | ||
| 4 | # PORT is the current port name (zlib, etc) | ||
| 5 | # CURRENT_BUILDTREES_DIR = ${VCPKG_ROOT_DIR}\buildtrees\${PORT} | ||
| 6 | # CURRENT_PACKAGES_DIR = ${VCPKG_ROOT_DIR}\packages\${PORT}_${TARGET_TRIPLET} | ||
| 7 | # | ||
| 8 | include(vcpkg_common_functions) | ||
| 9 | |||
| 10 | vcpkg_from_github( | ||
| 11 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 12 | REPO highfidelity/nvidia-texture-tools | ||
| 13 | REF 8c7e6b40ee5095f227b75880fabd89c99d6f34c0 | ||
| 14 | SHA512 f107d19dbbd6651ef2126b1422a5db8db291bf70311ac4fb1dbacb5ceaa8752fee38becbd32964f57596f0b84e1223bb2c3ff9d9c4fdc65c3e77a47836657cef | ||
| 15 | HEAD_REF master | ||
| 16 | ) | ||
| 17 | |||
| 18 | vcpkg_configure_cmake( | ||
| 19 | SOURCE_PATH ${SOURCE_PATH} | ||
| 20 | OPTIONS | ||
| 21 | -DBUILD_TESTS=OFF | ||
| 22 | -DBUILD_TOOLS=OFF | ||
| 23 | ) | ||
| 24 | |||
| 25 | vcpkg_install_cmake() | ||
| 26 | |||
| 27 | if(VCPKG_LIBRARY_LINKAGE STREQUAL static) | ||
| 28 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin ${CURRENT_PACKAGES_DIR}/debug/bin) | ||
| 29 | endif() | ||
| 30 | |||
| 31 | vcpkg_copy_pdbs() | ||
| 32 | |||
| 33 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) | ||
| 34 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share) | ||
| 35 | |||
| 36 | # Handle copyright | ||
| 37 | file(REMOVE ${CURRENT_PACKAGES_DIR}/share/doc/nvtt/LICENSE) | ||
| 38 | file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/nvtt) | ||
| 39 | file(RENAME ${CURRENT_PACKAGES_DIR}/share/nvtt/LICENSE ${CURRENT_PACKAGES_DIR}/share/nvtt/copyright) | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: openssl-android | ||
| 2 | Version: 1.0.2p | ||
| 3 | Description: OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library. | ||
| @@ -0,0 +1,125 @@ | |||
| 1 | |||
| 2 | LICENSE ISSUES | ||
| 3 | ============== | ||
| 4 | |||
| 5 | The OpenSSL toolkit stays under a double license, i.e. both the conditions of | ||
| 6 | the OpenSSL License and the original SSLeay license apply to the toolkit. | ||
| 7 | See below for the actual license texts. | ||
| 8 | |||
| 9 | OpenSSL License | ||
| 10 | --------------- | ||
| 11 | |||
| 12 | /* ==================================================================== | ||
| 13 | * Copyright (c) 1998-2018 The OpenSSL Project. All rights reserved. | ||
| 14 | * | ||
| 15 | * Redistribution and use in source and binary forms, with or without | ||
| 16 | * modification, are permitted provided that the following conditions | ||
| 17 | * are met: | ||
| 18 | * | ||
| 19 | * 1. Redistributions of source code must retain the above copyright | ||
| 20 | * notice, this list of conditions and the following disclaimer. | ||
| 21 | * | ||
| 22 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 23 | * notice, this list of conditions and the following disclaimer in | ||
| 24 | * the documentation and/or other materials provided with the | ||
| 25 | * distribution. | ||
| 26 | * | ||
| 27 | * 3. All advertising materials mentioning features or use of this | ||
| 28 | * software must display the following acknowledgment: | ||
| 29 | * "This product includes software developed by the OpenSSL Project | ||
| 30 | * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" | ||
| 31 | * | ||
| 32 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | ||
| 33 | * endorse or promote products derived from this software without | ||
| 34 | * prior written permission. For written permission, please contact | ||
| 35 | * openssl-core@openssl.org. | ||
| 36 | * | ||
| 37 | * 5. Products derived from this software may not be called "OpenSSL" | ||
| 38 | * nor may "OpenSSL" appear in their names without prior written | ||
| 39 | * permission of the OpenSSL Project. | ||
| 40 | * | ||
| 41 | * 6. Redistributions of any form whatsoever must retain the following | ||
| 42 | * acknowledgment: | ||
| 43 | * "This product includes software developed by the OpenSSL Project | ||
| 44 | * for use in the OpenSSL Toolkit (http://www.openssl.org/)" | ||
| 45 | * | ||
| 46 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | ||
| 47 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 48 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
| 49 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | ||
| 50 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| 51 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 52 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 53 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 54 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 55 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
| 56 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
| 57 | * OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 58 | * ==================================================================== | ||
| 59 | * | ||
| 60 | * This product includes cryptographic software written by Eric Young | ||
| 61 | * (eay@cryptsoft.com). This product includes software written by Tim | ||
| 62 | * Hudson (tjh@cryptsoft.com). | ||
| 63 | * | ||
| 64 | */ | ||
| 65 | |||
| 66 | Original SSLeay License | ||
| 67 | ----------------------- | ||
| 68 | |||
| 69 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | ||
| 70 | * All rights reserved. | ||
| 71 | * | ||
| 72 | * This package is an SSL implementation written | ||
| 73 | * by Eric Young (eay@cryptsoft.com). | ||
| 74 | * The implementation was written so as to conform with Netscapes SSL. | ||
| 75 | * | ||
| 76 | * This library is free for commercial and non-commercial use as long as | ||
| 77 | * the following conditions are aheared to. The following conditions | ||
| 78 | * apply to all code found in this distribution, be it the RC4, RSA, | ||
| 79 | * lhash, DES, etc., code; not just the SSL code. The SSL documentation | ||
| 80 | * included with this distribution is covered by the same copyright terms | ||
| 81 | * except that the holder is Tim Hudson (tjh@cryptsoft.com). | ||
| 82 | * | ||
| 83 | * Copyright remains Eric Young's, and as such any Copyright notices in | ||
| 84 | * the code are not to be removed. | ||
| 85 | * If this package is used in a product, Eric Young should be given attribution | ||
| 86 | * as the author of the parts of the library used. | ||
| 87 | * This can be in the form of a textual message at program startup or | ||
| 88 | * in documentation (online or textual) provided with the package. | ||
| 89 | * | ||
| 90 | * Redistribution and use in source and binary forms, with or without | ||
| 91 | * modification, are permitted provided that the following conditions | ||
| 92 | * are met: | ||
| 93 | * 1. Redistributions of source code must retain the copyright | ||
| 94 | * notice, this list of conditions and the following disclaimer. | ||
| 95 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 96 | * notice, this list of conditions and the following disclaimer in the | ||
| 97 | * documentation and/or other materials provided with the distribution. | ||
| 98 | * 3. All advertising materials mentioning features or use of this software | ||
| 99 | * must display the following acknowledgement: | ||
| 100 | * "This product includes cryptographic software written by | ||
| 101 | * Eric Young (eay@cryptsoft.com)" | ||
| 102 | * The word 'cryptographic' can be left out if the rouines from the library | ||
| 103 | * being used are not cryptographic related :-). | ||
| 104 | * 4. If you include any Windows specific code (or a derivative thereof) from | ||
| 105 | * the apps directory (application code) you must include an acknowledgement: | ||
| 106 | * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" | ||
| 107 | * | ||
| 108 | * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND | ||
| 109 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 110 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
| 111 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||
| 112 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 113 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
| 114 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 115 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 116 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
| 117 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
| 118 | * SUCH DAMAGE. | ||
| 119 | * | ||
| 120 | * The licence and distribution terms for any publically available version or | ||
| 121 | * derivative of this code cannot be changed. i.e. this code cannot simply be | ||
| 122 | * copied and put under another distribution licence | ||
| 123 | * [including the GNU Public Licence.] | ||
| 124 | */ | ||
| 125 | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | include(vcpkg_common_functions) | ||
| 2 | set(OPENSSL_VERSION 1.1.0g) | ||
| 3 | set(MASTER_COPY_SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src) | ||
| 4 | |||
| 5 | message("MASTER_COPY_SOURCE_PATH ${MASTER_COPY_SOURCE_PATH}") | ||
| 6 | vcpkg_download_distfile( | ||
| 7 | OPENSSL_SOURCE_ARCHIVE | ||
| 8 | URLS https://hifi-public.s3.amazonaws.com/dependencies/android/openssl-1.1.0g_armv8.tgz?versionId=AiiPjmgUZTgNj7YV1EEx2lL47aDvvvAW | ||
| 9 | SHA512 5d7bb6e5d3db2340449e2789bcd72da821f0e57483bac46cf06f735dffb5d73c1ca7cc53dd48f3b3979d0fe22b3ae61997c516fc0c4611af4b4b7f480e42b992 | ||
| 10 | FILENAME openssl-1.1.0g_armv8.tgz | ||
| 11 | ) | ||
| 12 | |||
| 13 | vcpkg_extract_source_archive(${OPENSSL_SOURCE_ARCHIVE}) | ||
| 14 | |||
| 15 | file(COPY ${MASTER_COPY_SOURCE_PATH}/include DESTINATION ${CURRENT_PACKAGES_DIR}) | ||
| 16 | file(GLOB LIBS ${MASTER_COPY_SOURCE_PATH}/lib/*.a) | ||
| 17 | file(COPY ${LIBS} DESTINATION ${CURRENT_PACKAGES_DIR}/libs) | ||
| 18 | file(COPY ${LIBS} DESTINATION ${CURRENT_PACKAGES_DIR}/debug/libs) | ||
| 19 | file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/LICENSE.txt DESTINATION ${CURRENT_PACKAGES_DIR}/share/openssl-android RENAME copyright) | ||
| 20 | |||
| 21 | |||
| 22 | |||
| 23 | |||
| 24 | |||
| @@ -0,0 +1,136 @@ | |||
| 1 | cmake_minimum_required(VERSION 3.9) | ||
| 2 | project(openssl C) | ||
| 3 | |||
| 4 | if(NOT SOURCE_PATH) | ||
| 5 | message(FATAL_ERROR "Requires SOURCE_PATH") | ||
| 6 | endif() | ||
| 7 | |||
| 8 | if(CMAKE_SYSTEM_NAME STREQUAL "Android") | ||
| 9 | set(PLATFORM android) | ||
| 10 | elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") | ||
| 11 | if(CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64") | ||
| 12 | set(PLATFORM linux-generic64) | ||
| 13 | else() | ||
| 14 | set(PLATFORM linux-generic32) | ||
| 15 | endif() | ||
| 16 | elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") | ||
| 17 | set(PLATFORM darwin64-x86_64-cc) | ||
| 18 | elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") | ||
| 19 | set(PLATFORM BSD-generic64) | ||
| 20 | else() | ||
| 21 | message(FATAL_ERROR "Unknown platform") | ||
| 22 | endif() | ||
| 23 | |||
| 24 | get_filename_component(COMPILER_ROOT "${CMAKE_C_COMPILER}" DIRECTORY) | ||
| 25 | |||
| 26 | message("CMAKE_C_COMPILER=${CMAKE_C_COMPILER}") | ||
| 27 | message("COMPILER_ROOT=${COMPILER_ROOT}") | ||
| 28 | message("CMAKE_SYSROOT=${CMAKE_SYSROOT}") | ||
| 29 | message("CMAKE_C_FLAGS=${CMAKE_C_FLAGS}") | ||
| 30 | message("CMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}") | ||
| 31 | message("CMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}") | ||
| 32 | message("CMAKE_INCLUDE_SYSTEM_FLAG_C=${CMAKE_INCLUDE_SYSTEM_FLAG_C}") | ||
| 33 | |||
| 34 | set(CFLAGS "${CMAKE_C_FLAGS}") | ||
| 35 | if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") | ||
| 36 | set(CFLAGS "-Wno-error=unused-command-line-argument ${CMAKE_C_FLAGS}") | ||
| 37 | endif() | ||
| 38 | if(CMAKE_C_COMPILER_TARGET) | ||
| 39 | set(CFLAGS "${CFLAGS} ${CMAKE_C_COMPILE_OPTIONS_TARGET}${CMAKE_C_COMPILER_TARGET}") | ||
| 40 | endif() | ||
| 41 | if(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN) | ||
| 42 | set(CFLAGS "${CFLAGS} ${CMAKE_C_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN}${CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN}") | ||
| 43 | endif() | ||
| 44 | if(CMAKE_SYSROOT AND CMAKE_C_COMPILE_OPTIONS_SYSROOT) | ||
| 45 | set(CFLAGS "${CFLAGS} ${CMAKE_C_COMPILE_OPTIONS_SYSROOT}${CMAKE_SYSROOT}") | ||
| 46 | endif() | ||
| 47 | |||
| 48 | string(REGEX REPLACE "^ " "" CFLAGS "${CFLAGS}") | ||
| 49 | |||
| 50 | if(CMAKE_HOST_WIN32) | ||
| 51 | file(TO_NATIVE_PATH ENV_PATH "${COMPILER_ROOT};$ENV{PATH}") | ||
| 52 | else() | ||
| 53 | file(TO_NATIVE_PATH ENV_PATH "${COMPILER_ROOT}:$ENV{PATH}") | ||
| 54 | endif() | ||
| 55 | set(ENV{ANDROID_DEV} "${CMAKE_SYSROOT}/usr") | ||
| 56 | set(ENV{CC} "${CMAKE_C_COMPILER}") | ||
| 57 | |||
| 58 | message("ENV{ANDROID_DEV}=$ENV{ANDROID_DEV}") | ||
| 59 | |||
| 60 | get_filename_component(SOURCE_PATH_NAME "${SOURCE_PATH}" NAME) | ||
| 61 | set(BUILDDIR "${CMAKE_CURRENT_BINARY_DIR}/${SOURCE_PATH_NAME}") | ||
| 62 | |||
| 63 | if(NOT EXISTS "${BUILDDIR}") | ||
| 64 | file(COPY ${SOURCE_PATH} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) | ||
| 65 | endif() | ||
| 66 | |||
| 67 | get_filename_component(MSYS_BIN_DIR "${MAKE}" DIRECTORY) | ||
| 68 | |||
| 69 | |||
| 70 | file(READ "${BUILDDIR}/Configure" _contents) | ||
| 71 | string(REPLACE "-mandroid" "" _contents "${_contents}") | ||
| 72 | file(WRITE "${BUILDDIR}/Configure" "${_contents}") | ||
| 73 | |||
| 74 | if(BUILD_SHARED_LIBS) | ||
| 75 | set(SHARED shared) | ||
| 76 | else() | ||
| 77 | set(SHARED no-shared) | ||
| 78 | endif() | ||
| 79 | |||
| 80 | if(CMAKE_HOST_WIN32) | ||
| 81 | set(ENV_COMMAND set) | ||
| 82 | set(PATH_VAR ";%PATH%") | ||
| 83 | else() | ||
| 84 | set(ENV_COMMAND export) | ||
| 85 | set(PATH_VAR ":$ENV{PATH}") | ||
| 86 | endif() | ||
| 87 | |||
| 88 | add_custom_command( | ||
| 89 | OUTPUT "${BUILDDIR}/Makefile" | ||
| 90 | COMMAND ${ENV_COMMAND} CC=${CMAKE_C_COMPILER} | ||
| 91 | COMMAND ${ENV_COMMAND} AR=${CMAKE_AR} | ||
| 92 | COMMAND ${ENV_COMMAND} LD=${CMAKE_LINKER} | ||
| 93 | COMMAND ${ENV_COMMAND} RANLIB=${CMAKE_RANLIB} | ||
| 94 | COMMAND ${ENV_COMMAND} MAKE=${MAKE} | ||
| 95 | COMMAND ${ENV_COMMAND} MAKEDEPPROG=${CMAKE_C_COMPILER} | ||
| 96 | COMMAND ${ENV_COMMAND} "PATH=${MSYS_BIN_DIR}${PATH_VAR}" | ||
| 97 | COMMAND "${PERL}" Configure | ||
| 98 | ${SHARED} | ||
| 99 | enable-static-engine | ||
| 100 | no-ssl2 | ||
| 101 | no-krb5 | ||
| 102 | no-idea | ||
| 103 | no-bf | ||
| 104 | no-cast | ||
| 105 | no-seed | ||
| 106 | no-md2 | ||
| 107 | ${PLATFORM} | ||
| 108 | "--prefix=${CMAKE_INSTALL_PREFIX}" | ||
| 109 | "--openssldir=/etc/ssl" | ||
| 110 | ${CFLAGS} | ||
| 111 | COMMAND "${CMAKE_COMMAND}" "-DDIR=${BUILDDIR}" -P "${CMAKE_CURRENT_LIST_DIR}/remove-deps.cmake" | ||
| 112 | VERBATIM | ||
| 113 | WORKING_DIRECTORY "${BUILDDIR}" | ||
| 114 | ) | ||
| 115 | |||
| 116 | add_custom_target(depend | ||
| 117 | COMMAND ${ENV_COMMAND} "PATH=${MSYS_BIN_DIR}${PATH_VAR}" | ||
| 118 | COMMAND "${MAKE}" links # depend MAKEDEPPROG=${CMAKE_C_COMPILER} | ||
| 119 | VERBATIM | ||
| 120 | WORKING_DIRECTORY "${BUILDDIR}" | ||
| 121 | DEPENDS "${BUILDDIR}/Makefile" | ||
| 122 | ) | ||
| 123 | add_custom_target(build_libs ALL | ||
| 124 | COMMAND ${ENV_COMMAND} "PATH=${MSYS_BIN_DIR}${PATH_VAR}" | ||
| 125 | COMMAND "${CMAKE_COMMAND}" -E touch "${BUILDDIR}/krb5.h" | ||
| 126 | COMMAND "${MAKE}" build_libs | ||
| 127 | VERBATIM | ||
| 128 | WORKING_DIRECTORY "${BUILDDIR}" | ||
| 129 | DEPENDS depend | ||
| 130 | BYPRODUCTS "${BUILDDIR}/libssl.a" "${BUILDDIR}/libcrypto.a" | ||
| 131 | ) | ||
| 132 | |||
| 133 | install( | ||
| 134 | FILES "${BUILDDIR}/libssl.a" "${BUILDDIR}/libcrypto.a" | ||
| 135 | DESTINATION lib | ||
| 136 | ) | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: openssl-unix | ||
| 2 | Version: 1.0.2p | ||
| 3 | Description: OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library. | ||
| @@ -0,0 +1,13 @@ | |||
| 1 | diff --git a/Configure b/Configure | ||
| 2 | index c98107a..77ad9d3 100644 | ||
| 3 | --- a/Configure | ||
| 4 | +++ b/Configure | ||
| 5 | @@ -972,7 +972,7 @@ PROCESS_ARGS: | ||
| 6 | } | ||
| 7 | elsif (/^--with-zlib-include=(.*)$/) | ||
| 8 | { | ||
| 9 | - $withargs{"zlib-include"}="-I$1"; | ||
| 10 | + $withargs{"zlib-include"}="-I\"$1\""; | ||
| 11 | } | ||
| 12 | elsif (/^--with-fipsdir=(.*)$/) | ||
| 13 | { | ||
| @@ -0,0 +1,25 @@ | |||
| 1 | diff --git a/util/pl/VC-32.pl b/util/pl/VC-32.pl | ||
| 2 | index dba96cb..5722f6e 100644 | ||
| 3 | --- a/util/pl/VC-32.pl | ||
| 4 | +++ b/util/pl/VC-32.pl | ||
| 5 | @@ -154,9 +154,17 @@ else | ||
| 6 | $cflags=$opt_cflags.$base_cflags; | ||
| 7 | } | ||
| 8 | |||
| 9 | -# generate symbols.pdb unconditionally | ||
| 10 | -$app_cflag.=" /Zi /Fd\$(TMP_D)/app"; | ||
| 11 | -$lib_cflag.=" /Zi /Fd\$(TMP_D)/lib"; | ||
| 12 | +# generate symbols.pdb when building dlls and embed symbols when building static libs | ||
| 13 | +if ($shlib) | ||
| 14 | + { | ||
| 15 | + $app_cflag.=" /Zi /Fd\$(TMP_D)/app.pdb"; | ||
| 16 | + $lib_cflag.=" /Zi /Fd\$(TMP_D)/lib.pdb"; | ||
| 17 | + } | ||
| 18 | +else | ||
| 19 | + { | ||
| 20 | + $app_cflag.=" /Z7"; | ||
| 21 | + $lib_cflag.=" /Z7"; | ||
| 22 | + } | ||
| 23 | $lflags.=" /debug"; | ||
| 24 | |||
| 25 | $obj='.obj'; | ||
| @@ -0,0 +1,23 @@ | |||
| 1 | diff --git a/crypto/cversion.c b/crypto/cversion.c | ||
| 2 | index bfff699..17b7912 100644 | ||
| 3 | --- a/crypto/cversion.c | ||
| 4 | +++ b/crypto/cversion.c | ||
| 5 | @@ -56,6 +56,9 @@ | ||
| 6 | * [including the GNU Public Licence.] | ||
| 7 | */ | ||
| 8 | |||
| 9 | +#define STRINGIFY2(x) #x | ||
| 10 | +#define STRINGIFY(x) STRINGIFY2(x) | ||
| 11 | + | ||
| 12 | #include "cryptlib.h" | ||
| 13 | |||
| 14 | #ifndef NO_WINDOWS_BRAINDEATH | ||
| 15 | @@ -79,7 +82,7 @@ const char *SSLeay_version(int t) | ||
| 16 | } | ||
| 17 | if (t == SSLEAY_CFLAGS) { | ||
| 18 | #ifdef CFLAGS | ||
| 19 | - return (CFLAGS); | ||
| 20 | + return STRINGIFY(CFLAGS); | ||
| 21 | #else | ||
| 22 | return ("compiler: information not available"); | ||
| 23 | #endif | ||
| @@ -0,0 +1,63 @@ | |||
| 1 | if(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore" OR NOT VCPKG_CMAKE_SYSTEM_NAME) | ||
| 2 | message(FATAL_ERROR "This port is only for openssl on Unix-like systems") | ||
| 3 | endif() | ||
| 4 | |||
| 5 | include(vcpkg_common_functions) | ||
| 6 | set(OPENSSL_VERSION 1.0.2p) | ||
| 7 | set(MASTER_COPY_SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src/openssl-${OPENSSL_VERSION}) | ||
| 8 | |||
| 9 | vcpkg_find_acquire_program(PERL) | ||
| 10 | |||
| 11 | vcpkg_download_distfile(OPENSSL_SOURCE_ARCHIVE | ||
| 12 | URLS "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" "https://www.openssl.org/source/old/1.0.2/openssl-${OPENSSL_VERSION}.tar.gz" | ||
| 13 | FILENAME "openssl-${OPENSSL_VERSION}.tar.gz" | ||
| 14 | SHA512 958c5a7c3324bbdc8f07dfb13e11329d9a1b4452c07cf41fbd2d42b5fe29c95679332a3476d24c2dc2b88be16e4a24744aba675a05a388c0905756c77a8a2f16 | ||
| 15 | ) | ||
| 16 | |||
| 17 | vcpkg_extract_source_archive(${OPENSSL_SOURCE_ARCHIVE}) | ||
| 18 | vcpkg_apply_patches( | ||
| 19 | SOURCE_PATH ${MASTER_COPY_SOURCE_PATH} | ||
| 20 | PATCHES ${CMAKE_CURRENT_LIST_DIR}/ConfigureIncludeQuotesFix.patch | ||
| 21 | ${CMAKE_CURRENT_LIST_DIR}/STRINGIFYPatch.patch | ||
| 22 | ${CMAKE_CURRENT_LIST_DIR}/EmbedSymbolsInStaticLibsZ7.patch | ||
| 23 | ) | ||
| 24 | |||
| 25 | if(CMAKE_HOST_WIN32) | ||
| 26 | vcpkg_acquire_msys(MSYS_ROOT PACKAGES make) | ||
| 27 | set(BASH ${MSYS_ROOT}/usr/bin/bash.exe) | ||
| 28 | set(MAKE ${MSYS_ROOT}/usr/bin/make.exe) | ||
| 29 | else() | ||
| 30 | find_program(MAKE make) | ||
| 31 | if(NOT MAKE) | ||
| 32 | message(FATAL_ERROR "Could not find make. Please install it through your package manager.") | ||
| 33 | endif() | ||
| 34 | endif() | ||
| 35 | |||
| 36 | vcpkg_configure_cmake( | ||
| 37 | SOURCE_PATH ${CMAKE_CURRENT_LIST_DIR} | ||
| 38 | PREFER_NINJA | ||
| 39 | OPTIONS | ||
| 40 | -DSOURCE_PATH=${MASTER_COPY_SOURCE_PATH} | ||
| 41 | -DPERL=${PERL} | ||
| 42 | -DMAKE=${MAKE} | ||
| 43 | OPTIONS_RELEASE | ||
| 44 | -DINSTALL_HEADERS=ON | ||
| 45 | ) | ||
| 46 | |||
| 47 | vcpkg_install_cmake() | ||
| 48 | |||
| 49 | file(GLOB HEADERS ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/*/include/openssl/*.h) | ||
| 50 | set(RESOLVED_HEADERS) | ||
| 51 | foreach(HEADER ${HEADERS}) | ||
| 52 | get_filename_component(X "${HEADER}" REALPATH) | ||
| 53 | list(APPEND RESOLVED_HEADERS "${X}") | ||
| 54 | endforeach() | ||
| 55 | |||
| 56 | file(INSTALL ${RESOLVED_HEADERS} DESTINATION ${CURRENT_PACKAGES_DIR}/include/openssl) | ||
| 57 | file(INSTALL ${MASTER_COPY_SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/openssl-unix RENAME copyright) | ||
| 58 | |||
| 59 | if(VCPKG_LIBRARY_LINKAGE STREQUAL "static") | ||
| 60 | file(COPY ${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/openssl) | ||
| 61 | endif() | ||
| 62 | |||
| 63 | vcpkg_test_cmake(PACKAGE_NAME OpenSSL MODULE) | ||
| @@ -0,0 +1,7 @@ | |||
| 1 | file(GLOB_RECURSE MAKEFILES ${DIR}/*/Makefile) | ||
| 2 | foreach(MAKEFILE ${MAKEFILES}) | ||
| 3 | message("removing deps from ${MAKEFILE}") | ||
| 4 | file(READ "${MAKEFILE}" _contents) | ||
| 5 | string(REGEX REPLACE "\n# DO NOT DELETE THIS LINE.*" "" _contents "${_contents}") | ||
| 6 | file(WRITE "${MAKEFILE}" "${_contents}") | ||
| 7 | endforeach() | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | The package openssl is compatible with built-in CMake targets: | ||
| 2 | |||
| 3 | find_package(OpenSSL REQUIRED) | ||
| 4 | target_link_libraries(main PRIVATE OpenSSL::SSL OpenSSL::Crypto) | ||
| @@ -0,0 +1,10 @@ | |||
| 1 | _find_package(${ARGS}) | ||
| 2 | if(OPENSSL_FOUND) | ||
| 3 | find_library(OPENSSL_DL_LIBRARY NAMES dl) | ||
| 4 | if(OPENSSL_DL_LIBRARY) | ||
| 5 | list(APPEND OPENSSL_LIBRARIES "dl") | ||
| 6 | if(TARGET OpenSSL::Crypto) | ||
| 7 | set_property(TARGET OpenSSL::Crypto APPEND PROPERTY INTERFACE_LINK_LIBRARIES "dl") | ||
| 8 | endif() | ||
| 9 | endif() | ||
| 10 | endif() | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: openssl-windows | ||
| 2 | Version: 1.0.2p-1 | ||
| 3 | Description: OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library. | ||
| @@ -0,0 +1,13 @@ | |||
| 1 | diff --git a/Configure b/Configure | ||
| 2 | index c98107a..77ad9d3 100644 | ||
| 3 | --- a/Configure | ||
| 4 | +++ b/Configure | ||
| 5 | @@ -972,7 +972,7 @@ PROCESS_ARGS: | ||
| 6 | } | ||
| 7 | elsif (/^--with-zlib-include=(.*)$/) | ||
| 8 | { | ||
| 9 | - $withargs{"zlib-include"}="-I$1"; | ||
| 10 | + $withargs{"zlib-include"}="-I\"$1\""; | ||
| 11 | } | ||
| 12 | elsif (/^--with-fipsdir=(.*)$/) | ||
| 13 | { | ||
| @@ -0,0 +1,25 @@ | |||
| 1 | diff --git a/util/pl/VC-32.pl b/util/pl/VC-32.pl | ||
| 2 | index dba96cb..5722f6e 100644 | ||
| 3 | --- a/util/pl/VC-32.pl | ||
| 4 | +++ b/util/pl/VC-32.pl | ||
| 5 | @@ -154,9 +154,17 @@ else | ||
| 6 | $cflags=$opt_cflags.$base_cflags; | ||
| 7 | } | ||
| 8 | |||
| 9 | -# generate symbols.pdb unconditionally | ||
| 10 | -$app_cflag.=" /Zi /Fd\$(TMP_D)/app"; | ||
| 11 | -$lib_cflag.=" /Zi /Fd\$(TMP_D)/lib"; | ||
| 12 | +# generate symbols.pdb when building dlls and embed symbols when building static libs | ||
| 13 | +if ($shlib) | ||
| 14 | + { | ||
| 15 | + $app_cflag.=" /Zi /Fd\$(TMP_D)/app.pdb"; | ||
| 16 | + $lib_cflag.=" /Zi /Fd\$(TMP_D)/lib.pdb"; | ||
| 17 | + } | ||
| 18 | +else | ||
| 19 | + { | ||
| 20 | + $app_cflag.=" /Z7"; | ||
| 21 | + $lib_cflag.=" /Z7"; | ||
| 22 | + } | ||
| 23 | $lflags.=" /debug"; | ||
| 24 | |||
| 25 | $obj='.obj'; | ||
| @@ -0,0 +1,23 @@ | |||
| 1 | diff --git a/crypto/cversion.c b/crypto/cversion.c | ||
| 2 | index bfff699..17b7912 100644 | ||
| 3 | --- a/crypto/cversion.c | ||
| 4 | +++ b/crypto/cversion.c | ||
| 5 | @@ -56,6 +56,9 @@ | ||
| 6 | * [including the GNU Public Licence.] | ||
| 7 | */ | ||
| 8 | |||
| 9 | +#define STRINGIFY2(x) #x | ||
| 10 | +#define STRINGIFY(x) STRINGIFY2(x) | ||
| 11 | + | ||
| 12 | #include "cryptlib.h" | ||
| 13 | |||
| 14 | #ifndef NO_WINDOWS_BRAINDEATH | ||
| 15 | @@ -79,7 +82,7 @@ const char *SSLeay_version(int t) | ||
| 16 | } | ||
| 17 | if (t == SSLEAY_CFLAGS) { | ||
| 18 | #ifdef CFLAGS | ||
| 19 | - return (CFLAGS); | ||
| 20 | + return STRINGIFY(CFLAGS); | ||
| 21 | #else | ||
| 22 | return ("compiler: information not available"); | ||
| 23 | #endif | ||
| @@ -0,0 +1,163 @@ | |||
| 1 | if(VCPKG_CMAKE_SYSTEM_NAME) | ||
| 2 | message(FATAL_ERROR "This port is only for building openssl on Windows Desktop") | ||
| 3 | endif() | ||
| 4 | |||
| 5 | include(vcpkg_common_functions) | ||
| 6 | set(OPENSSL_VERSION 1.0.2p) | ||
| 7 | set(MASTER_COPY_SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src/openssl-${OPENSSL_VERSION}) | ||
| 8 | |||
| 9 | vcpkg_find_acquire_program(PERL) | ||
| 10 | |||
| 11 | get_filename_component(PERL_EXE_PATH ${PERL} DIRECTORY) | ||
| 12 | set(ENV{PATH} "$ENV{PATH};${PERL_EXE_PATH}") | ||
| 13 | |||
| 14 | vcpkg_download_distfile(OPENSSL_SOURCE_ARCHIVE | ||
| 15 | URLS "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" "https://www.openssl.org/source/old/1.0.2/openssl-${OPENSSL_VERSION}.tar.gz" | ||
| 16 | FILENAME "openssl-${OPENSSL_VERSION}.tar.gz" | ||
| 17 | SHA512 958c5a7c3324bbdc8f07dfb13e11329d9a1b4452c07cf41fbd2d42b5fe29c95679332a3476d24c2dc2b88be16e4a24744aba675a05a388c0905756c77a8a2f16 | ||
| 18 | ) | ||
| 19 | |||
| 20 | vcpkg_extract_source_archive(${OPENSSL_SOURCE_ARCHIVE}) | ||
| 21 | vcpkg_apply_patches( | ||
| 22 | SOURCE_PATH ${MASTER_COPY_SOURCE_PATH} | ||
| 23 | PATCHES ${CMAKE_CURRENT_LIST_DIR}/ConfigureIncludeQuotesFix.patch | ||
| 24 | ${CMAKE_CURRENT_LIST_DIR}/STRINGIFYPatch.patch | ||
| 25 | ${CMAKE_CURRENT_LIST_DIR}/EmbedSymbolsInStaticLibsZ7.patch | ||
| 26 | ) | ||
| 27 | |||
| 28 | vcpkg_find_acquire_program(NASM) | ||
| 29 | get_filename_component(NASM_EXE_PATH ${NASM} DIRECTORY) | ||
| 30 | set(ENV{PATH} "${NASM_EXE_PATH};$ENV{PATH}") | ||
| 31 | |||
| 32 | vcpkg_find_acquire_program(JOM) | ||
| 33 | |||
| 34 | set(CONFIGURE_COMMAND ${PERL} Configure | ||
| 35 | enable-static-engine | ||
| 36 | enable-capieng | ||
| 37 | no-ssl2 | ||
| 38 | -utf-8 | ||
| 39 | ) | ||
| 40 | |||
| 41 | if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86") | ||
| 42 | set(OPENSSL_ARCH VC-WIN32) | ||
| 43 | set(OPENSSL_DO "ms\\do_nasm.bat") | ||
| 44 | elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64") | ||
| 45 | set(OPENSSL_ARCH VC-WIN64A) | ||
| 46 | set(OPENSSL_DO "ms\\do_win64a.bat") | ||
| 47 | else() | ||
| 48 | message(FATAL_ERROR "Unsupported target architecture: ${VCPKG_TARGET_ARCHITECTURE}") | ||
| 49 | endif() | ||
| 50 | |||
| 51 | if(VCPKG_LIBRARY_LINKAGE STREQUAL dynamic) | ||
| 52 | set(OPENSSL_MAKEFILE "ms\\ntdll.mak") | ||
| 53 | else() | ||
| 54 | set(OPENSSL_MAKEFILE "ms\\nt.mak") | ||
| 55 | endif() | ||
| 56 | |||
| 57 | file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg) | ||
| 58 | |||
| 59 | |||
| 60 | if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") | ||
| 61 | file(COPY ${MASTER_COPY_SOURCE_PATH} DESTINATION ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel) | ||
| 62 | set(SOURCE_PATH_RELEASE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/openssl-${OPENSSL_VERSION}) | ||
| 63 | set(OPENSSLDIR_RELEASE ${CURRENT_PACKAGES_DIR}) | ||
| 64 | |||
| 65 | message(STATUS "Configure ${TARGET_TRIPLET}-rel") | ||
| 66 | vcpkg_execute_required_process( | ||
| 67 | COMMAND ${CONFIGURE_COMMAND} ${OPENSSL_ARCH} "--prefix=${OPENSSLDIR_RELEASE}" "--openssldir=${OPENSSLDIR_RELEASE}" -FS | ||
| 68 | WORKING_DIRECTORY ${SOURCE_PATH_RELEASE} | ||
| 69 | LOGNAME configure-perl-${TARGET_TRIPLET}-${CMAKE_BUILD_TYPE}-rel | ||
| 70 | ) | ||
| 71 | vcpkg_execute_required_process( | ||
| 72 | COMMAND ${OPENSSL_DO} | ||
| 73 | WORKING_DIRECTORY ${SOURCE_PATH_RELEASE} | ||
| 74 | LOGNAME configure-do-${TARGET_TRIPLET}-${CMAKE_BUILD_TYPE}-rel | ||
| 75 | ) | ||
| 76 | message(STATUS "Configure ${TARGET_TRIPLET}-rel done") | ||
| 77 | |||
| 78 | message(STATUS "Build ${TARGET_TRIPLET}-rel") | ||
| 79 | # Openssl's buildsystem has a race condition which will cause JOM to fail at some point. | ||
| 80 | # This is ok; we just do as much work as we can in parallel first, then follow up with a single-threaded build. | ||
| 81 | make_directory(${SOURCE_PATH_RELEASE}/inc32/openssl) | ||
| 82 | execute_process( | ||
| 83 | COMMAND ${JOM} -k -j $ENV{NUMBER_OF_PROCESSORS} -f ${OPENSSL_MAKEFILE} | ||
| 84 | WORKING_DIRECTORY ${SOURCE_PATH_RELEASE} | ||
| 85 | OUTPUT_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-rel-0-out.log | ||
| 86 | ERROR_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-rel-0-err.log | ||
| 87 | ) | ||
| 88 | vcpkg_execute_required_process( | ||
| 89 | COMMAND nmake -f ${OPENSSL_MAKEFILE} install | ||
| 90 | WORKING_DIRECTORY ${SOURCE_PATH_RELEASE} | ||
| 91 | LOGNAME build-${TARGET_TRIPLET}-rel-1) | ||
| 92 | |||
| 93 | message(STATUS "Build ${TARGET_TRIPLET}-rel done") | ||
| 94 | endif() | ||
| 95 | |||
| 96 | |||
| 97 | if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") | ||
| 98 | message(STATUS "Configure ${TARGET_TRIPLET}-dbg") | ||
| 99 | file(COPY ${MASTER_COPY_SOURCE_PATH} DESTINATION ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg) | ||
| 100 | set(SOURCE_PATH_DEBUG ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg/openssl-${OPENSSL_VERSION}) | ||
| 101 | set(OPENSSLDIR_DEBUG ${CURRENT_PACKAGES_DIR}/debug) | ||
| 102 | |||
| 103 | vcpkg_execute_required_process( | ||
| 104 | COMMAND ${CONFIGURE_COMMAND} debug-${OPENSSL_ARCH} "--prefix=${OPENSSLDIR_DEBUG}" "--openssldir=${OPENSSLDIR_DEBUG}" -FS | ||
| 105 | WORKING_DIRECTORY ${SOURCE_PATH_DEBUG} | ||
| 106 | LOGNAME configure-perl-${TARGET_TRIPLET}-${CMAKE_BUILD_TYPE}-dbg | ||
| 107 | ) | ||
| 108 | vcpkg_execute_required_process( | ||
| 109 | COMMAND ${OPENSSL_DO} | ||
| 110 | WORKING_DIRECTORY ${SOURCE_PATH_DEBUG} | ||
| 111 | LOGNAME configure-do-${TARGET_TRIPLET}-${CMAKE_BUILD_TYPE}-dbg | ||
| 112 | ) | ||
| 113 | message(STATUS "Configure ${TARGET_TRIPLET}-dbg done") | ||
| 114 | |||
| 115 | message(STATUS "Build ${TARGET_TRIPLET}-dbg") | ||
| 116 | make_directory(${SOURCE_PATH_DEBUG}/inc32/openssl) | ||
| 117 | execute_process( | ||
| 118 | COMMAND ${JOM} -k -j $ENV{NUMBER_OF_PROCESSORS} -f ${OPENSSL_MAKEFILE} | ||
| 119 | WORKING_DIRECTORY ${SOURCE_PATH_DEBUG} | ||
| 120 | OUTPUT_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-dbg-0-out.log | ||
| 121 | ERROR_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-dbg-0-err.log | ||
| 122 | ) | ||
| 123 | vcpkg_execute_required_process( | ||
| 124 | COMMAND nmake -f ${OPENSSL_MAKEFILE} install | ||
| 125 | WORKING_DIRECTORY ${SOURCE_PATH_DEBUG} | ||
| 126 | LOGNAME build-${TARGET_TRIPLET}-dbg-1) | ||
| 127 | |||
| 128 | message(STATUS "Build ${TARGET_TRIPLET}-dbg done") | ||
| 129 | endif() | ||
| 130 | |||
| 131 | |||
| 132 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) | ||
| 133 | file(REMOVE | ||
| 134 | ${CURRENT_PACKAGES_DIR}/debug/bin/openssl.exe | ||
| 135 | ${CURRENT_PACKAGES_DIR}/debug/openssl.cnf | ||
| 136 | ${CURRENT_PACKAGES_DIR}/openssl.cnf | ||
| 137 | ) | ||
| 138 | |||
| 139 | file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/tools/openssl/) | ||
| 140 | file(RENAME ${CURRENT_PACKAGES_DIR}/bin/openssl.exe ${CURRENT_PACKAGES_DIR}/tools/openssl/openssl.exe) | ||
| 141 | |||
| 142 | vcpkg_copy_tool_dependencies(${CURRENT_PACKAGES_DIR}/tools/openssl) | ||
| 143 | |||
| 144 | if(VCPKG_LIBRARY_LINKAGE STREQUAL static) | ||
| 145 | # They should be empty, only the exes deleted above were in these directories | ||
| 146 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/bin/) | ||
| 147 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin/) | ||
| 148 | endif() | ||
| 149 | |||
| 150 | file(READ "${CURRENT_PACKAGES_DIR}/include/openssl/dtls1.h" _contents) | ||
| 151 | string(REPLACE "<winsock.h>" "<winsock2.h>" _contents "${_contents}") | ||
| 152 | file(WRITE "${CURRENT_PACKAGES_DIR}/include/openssl/dtls1.h" "${_contents}") | ||
| 153 | |||
| 154 | file(READ "${CURRENT_PACKAGES_DIR}/include/openssl/rand.h" _contents) | ||
| 155 | string(REPLACE "# include <windows.h>" "#ifndef _WINSOCKAPI_\n#define _WINSOCKAPI_\n#endif\n# include <windows.h>" _contents "${_contents}") | ||
| 156 | file(WRITE "${CURRENT_PACKAGES_DIR}/include/openssl/rand.h" "${_contents}") | ||
| 157 | |||
| 158 | vcpkg_copy_pdbs() | ||
| 159 | |||
| 160 | file(COPY ${CMAKE_CURRENT_LIST_DIR}/usage DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT}) | ||
| 161 | file(INSTALL ${MASTER_COPY_SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT} RENAME copyright) | ||
| 162 | |||
| 163 | vcpkg_test_cmake(PACKAGE_NAME OpenSSL MODULE) | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | The package openssl is compatible with built-in CMake targets: | ||
| 2 | |||
| 3 | find_package(OpenSSL REQUIRED) | ||
| 4 | target_link_libraries(main PRIVATE OpenSSL::SSL OpenSSL::Crypto) | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | Source: openssl | ||
| 2 | Version: 0 | ||
| 3 | Description: OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library. | ||
| 4 | Build-Depends: openssl-windows (windows), openssl-android (android), openssl-unix (!android&!windows) | ||
| @@ -0,0 +1,2 @@ | |||
| 1 | set(VCPKG_POLICY_EMPTY_PACKAGE enabled) | ||
| 2 | file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/usage DESTINATION ${CURRENT_PACKAGES_DIR}/share/openssl/) | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | The package openssl is compatible with built-in CMake targets: | ||
| 2 | |||
| 3 | find_package(OpenSSL REQUIRED) | ||
| 4 | target_link_libraries(main PRIVATE OpenSSL::SSL OpenSSL::Crypto) | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: openvr | ||
| 2 | Version: 1.0.16 | ||
| 3 | Description: an API and runtime that allows access to VR hardware from multiple vendors without requiring that applications have specific knowledge of the hardware they are targeting. | ||
| @@ -0,0 +1,47 @@ | |||
| 1 | include(vcpkg_common_functions) | ||
| 2 | |||
| 3 | vcpkg_from_github( | ||
| 4 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 5 | REPO ValveSoftware/openvr | ||
| 6 | REF v1.0.16 | ||
| 7 | SHA512 967356563ba4232da5361510c7519d3058e09eced4571aadc00d8a75ab1f299a0aebda2b0b10b0ffb6c6a443fd718634d0c0103964e289961449c93e8d7b9d02 | ||
| 8 | HEAD_REF master | ||
| 9 | ) | ||
| 10 | |||
| 11 | set(VCPKG_LIBRARY_LINKAGE dynamic) | ||
| 12 | |||
| 13 | if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64") | ||
| 14 | set(ARCH_PATH "win64") | ||
| 15 | elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86") | ||
| 16 | set(ARCH_PATH "win32") | ||
| 17 | else() | ||
| 18 | message(FATAL_ERROR "Package only supports x64 and x86 windows.") | ||
| 19 | endif() | ||
| 20 | |||
| 21 | if(VCPKG_CMAKE_SYSTEM_NAME) | ||
| 22 | message(FATAL_ERROR "Package only supports windows desktop.") | ||
| 23 | endif() | ||
| 24 | |||
| 25 | file(MAKE_DIRECTORY | ||
| 26 | ${CURRENT_PACKAGES_DIR}/lib | ||
| 27 | ${CURRENT_PACKAGES_DIR}/bin | ||
| 28 | ${CURRENT_PACKAGES_DIR}/debug/lib | ||
| 29 | ${CURRENT_PACKAGES_DIR}/debug/bin | ||
| 30 | ) | ||
| 31 | file(COPY ${SOURCE_PATH}/lib/${ARCH_PATH}/openvr_api.lib DESTINATION ${CURRENT_PACKAGES_DIR}/lib) | ||
| 32 | file(COPY ${SOURCE_PATH}/lib/${ARCH_PATH}/openvr_api.lib DESTINATION ${CURRENT_PACKAGES_DIR}/debug/lib) | ||
| 33 | file(COPY | ||
| 34 | ${SOURCE_PATH}/bin/${ARCH_PATH}/openvr_api.dll | ||
| 35 | ${SOURCE_PATH}/bin/${ARCH_PATH}/openvr_api.pdb | ||
| 36 | DESTINATION ${CURRENT_PACKAGES_DIR}/bin | ||
| 37 | ) | ||
| 38 | file(COPY | ||
| 39 | ${SOURCE_PATH}/bin/${ARCH_PATH}/openvr_api.dll | ||
| 40 | ${SOURCE_PATH}/bin/${ARCH_PATH}/openvr_api.pdb | ||
| 41 | DESTINATION ${CURRENT_PACKAGES_DIR}/debug/bin | ||
| 42 | ) | ||
| 43 | file(COPY ${SOURCE_PATH}/headers DESTINATION ${CURRENT_PACKAGES_DIR}) | ||
| 44 | file(RENAME ${CURRENT_PACKAGES_DIR}/headers ${CURRENT_PACKAGES_DIR}/include) | ||
| 45 | |||
| 46 | file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/openvr) | ||
| 47 | file(RENAME ${CURRENT_PACKAGES_DIR}/share/openvr/LICENSE ${CURRENT_PACKAGES_DIR}/share/openvr/copyright) | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: sdl2 | ||
| 2 | Version: 2.0.8-1 | ||
| 3 | Description: Simple DirectMedia Layer is a cross-platform development library designed to provide low level access to audio, keyboard, mouse, joystick, and graphics hardware via OpenGL and Direct3D. | ||
| @@ -0,0 +1,206 @@ | |||
| 1 | diff --git a/CMakeLists.txt b/CMakeLists.txt | ||
| 2 | index 73d9407..082fbc5 100644 | ||
| 3 | --- a/CMakeLists.txt | ||
| 4 | +++ b/CMakeLists.txt | ||
| 5 | @@ -3,7 +3,11 @@ if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) | ||
| 6 | endif() | ||
| 7 | |||
| 8 | cmake_minimum_required(VERSION 2.8.11) | ||
| 9 | -project(SDL2 C) | ||
| 10 | +if(CMAKE_SYSTEM_NAME STREQUAL "WindowsStore") | ||
| 11 | + project(SDL2 C CXX) | ||
| 12 | +else() | ||
| 13 | + project(SDL2 C) | ||
| 14 | +endif() | ||
| 15 | |||
| 16 | # !!! FIXME: this should probably do "MACOSX_RPATH ON" as a target property | ||
| 17 | # !!! FIXME: for the SDL2 shared library (so you get an | ||
| 18 | @@ -358,7 +362,6 @@ file(GLOB SOURCE_FILES | ||
| 19 | ${SDL2_SOURCE_DIR}/src/timer/*.c | ||
| 20 | ${SDL2_SOURCE_DIR}/src/video/*.c) | ||
| 21 | |||
| 22 | - | ||
| 23 | if(ASSERTIONS STREQUAL "auto") | ||
| 24 | # Do nada - use optimization settings to determine the assertion level | ||
| 25 | elseif(ASSERTIONS STREQUAL "disabled") | ||
| 26 | @@ -1132,6 +1135,22 @@ elseif(WINDOWS) | ||
| 27 | file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c) | ||
| 28 | set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES}) | ||
| 29 | |||
| 30 | + if(WINDOWS_STORE) | ||
| 31 | + cmake_minimum_required(VERSION 3.0) | ||
| 32 | + add_definitions(-DSDL_BUILDING_WINRT=1 -ZW) | ||
| 33 | + link_libraries( | ||
| 34 | + -nodefaultlib:vccorlib$<$<CONFIG:Debug>:d> | ||
| 35 | + -nodefaultlib:msvcrt$<$<CONFIG:Debug>:d> | ||
| 36 | + vccorlib$<$<CONFIG:Debug>:d>.lib | ||
| 37 | + msvcrt$<$<CONFIG:Debug>:d>.lib | ||
| 38 | + ) | ||
| 39 | + endif() | ||
| 40 | + | ||
| 41 | + if(WINDOWS_STORE) | ||
| 42 | + file(GLOB WINRT_SOURCE_FILES ${SDL2_SOURCE_DIR}/src/core/winrt/*.c ${SDL2_SOURCE_DIR}/src/core/winrt/*.cpp) | ||
| 43 | + set(SOURCE_FILES ${SOURCE_FILES} ${WINRT_SOURCE_FILES}) | ||
| 44 | + endif() | ||
| 45 | + | ||
| 46 | if(MSVC) | ||
| 47 | # Prevent codegen that would use the VC runtime libraries. | ||
| 48 | set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-") | ||
| 49 | @@ -1176,7 +1195,11 @@ elseif(WINDOWS) | ||
| 50 | check_include_file(d3d11_1.h HAVE_D3D11_H) | ||
| 51 | check_include_file(ddraw.h HAVE_DDRAW_H) | ||
| 52 | check_include_file(dsound.h HAVE_DSOUND_H) | ||
| 53 | - check_include_file(dinput.h HAVE_DINPUT_H) | ||
| 54 | + if(WINDOWS_STORE) | ||
| 55 | + set(HAVE_DINPUT_H 0) | ||
| 56 | + else() | ||
| 57 | + check_include_file(dinput.h HAVE_DINPUT_H) | ||
| 58 | + endif() | ||
| 59 | check_include_file(xaudio2.h HAVE_XAUDIO2_H) | ||
| 60 | check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H) | ||
| 61 | check_include_file(audioclient.h HAVE_AUDIOCLIENT_H) | ||
| 62 | @@ -1193,12 +1216,14 @@ elseif(WINDOWS) | ||
| 63 | endif() | ||
| 64 | |||
| 65 | if(SDL_AUDIO) | ||
| 66 | - set(SDL_AUDIO_DRIVER_WINMM 1) | ||
| 67 | - file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c) | ||
| 68 | - set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES}) | ||
| 69 | - set(HAVE_SDL_AUDIO TRUE) | ||
| 70 | + if(NOT WINDOWS_STORE) | ||
| 71 | + set(SDL_AUDIO_DRIVER_WINMM 1) | ||
| 72 | + file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c) | ||
| 73 | + set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES}) | ||
| 74 | + set(HAVE_SDL_AUDIO TRUE) | ||
| 75 | + endif() | ||
| 76 | |||
| 77 | - if(HAVE_DSOUND_H) | ||
| 78 | + if(HAVE_DSOUND_H AND NOT WINDOWS_STORE) | ||
| 79 | set(SDL_AUDIO_DRIVER_DSOUND 1) | ||
| 80 | file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c) | ||
| 81 | set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES}) | ||
| 82 | @@ -1208,9 +1233,10 @@ elseif(WINDOWS) | ||
| 83 | set(SDL_AUDIO_DRIVER_XAUDIO2 1) | ||
| 84 | file(GLOB XAUDIO2_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/xaudio2/*.c) | ||
| 85 | set(SOURCE_FILES ${SOURCE_FILES} ${XAUDIO2_AUDIO_SOURCES}) | ||
| 86 | + set(HAVE_SDL_AUDIO TRUE) | ||
| 87 | endif() | ||
| 88 | |||
| 89 | - if(HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H) | ||
| 90 | + if(HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H AND NOT WINDOWS_STORE) | ||
| 91 | set(SDL_AUDIO_DRIVER_WASAPI 1) | ||
| 92 | file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c) | ||
| 93 | set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES}) | ||
| 94 | @@ -1222,11 +1248,20 @@ elseif(WINDOWS) | ||
| 95 | if(NOT SDL_LOADSO) | ||
| 96 | message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled") | ||
| 97 | endif() | ||
| 98 | - set(SDL_VIDEO_DRIVER_WINDOWS 1) | ||
| 99 | - file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c) | ||
| 100 | + if(WINDOWS_STORE) | ||
| 101 | + set(SDL_VIDEO_DRIVER_WINRT 1) | ||
| 102 | + file(GLOB WIN_VIDEO_SOURCES | ||
| 103 | + ${SDL2_SOURCE_DIR}/src/video/winrt/*.c | ||
| 104 | + ${SDL2_SOURCE_DIR}/src/video/winrt/*.cpp | ||
| 105 | + ${SDL2_SOURCE_DIR}/src/render/direct3d11/*.cpp | ||
| 106 | + ) | ||
| 107 | + else() | ||
| 108 | + set(SDL_VIDEO_DRIVER_WINDOWS 1) | ||
| 109 | + file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c) | ||
| 110 | + endif() | ||
| 111 | set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES}) | ||
| 112 | |||
| 113 | - if(RENDER_D3D AND HAVE_D3D_H) | ||
| 114 | + if(RENDER_D3D AND HAVE_D3D_H AND NOT WINDOWS_STORE) | ||
| 115 | set(SDL_VIDEO_RENDER_D3D 1) | ||
| 116 | set(HAVE_RENDER_D3D TRUE) | ||
| 117 | endif() | ||
| 118 | @@ -1249,20 +1284,31 @@ elseif(WINDOWS) | ||
| 119 | endif() | ||
| 120 | |||
| 121 | if(SDL_POWER) | ||
| 122 | - set(SDL_POWER_WINDOWS 1) | ||
| 123 | - set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c) | ||
| 124 | + if(WINDOWS_STORE) | ||
| 125 | + set(SDL_POWER_WINRT 1) | ||
| 126 | + set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/winrt/SDL_syspower.cpp) | ||
| 127 | + else() | ||
| 128 | + set(SDL_POWER_WINDOWS 1) | ||
| 129 | + set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c) | ||
| 130 | + endif() | ||
| 131 | set(HAVE_SDL_POWER TRUE) | ||
| 132 | endif() | ||
| 133 | |||
| 134 | if(SDL_FILESYSTEM) | ||
| 135 | set(SDL_FILESYSTEM_WINDOWS 1) | ||
| 136 | - file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c) | ||
| 137 | + if(WINDOWS_STORE) | ||
| 138 | + file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/winrt/*.cpp) | ||
| 139 | + else() | ||
| 140 | + file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c) | ||
| 141 | + endif() | ||
| 142 | set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES}) | ||
| 143 | set(HAVE_SDL_FILESYSTEM TRUE) | ||
| 144 | endif() | ||
| 145 | |||
| 146 | # Libraries for Win32 native and MinGW | ||
| 147 | - list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid) | ||
| 148 | + if(NOT WINDOWS_STORE) | ||
| 149 | + list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid) | ||
| 150 | + endif() | ||
| 151 | |||
| 152 | # TODO: in configure.in the check for timers is set on | ||
| 153 | # cygwin | mingw32* - does this include mingw32CE? | ||
| 154 | @@ -1284,7 +1330,7 @@ elseif(WINDOWS) | ||
| 155 | set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES}) | ||
| 156 | |||
| 157 | if(SDL_VIDEO) | ||
| 158 | - if(VIDEO_OPENGL) | ||
| 159 | + if(VIDEO_OPENGL AND NOT WINDOWS_STORE) | ||
| 160 | set(SDL_VIDEO_OPENGL 1) | ||
| 161 | set(SDL_VIDEO_OPENGL_WGL 1) | ||
| 162 | set(SDL_VIDEO_RENDER_OGL 1) | ||
| 163 | @@ -1688,9 +1734,11 @@ endif() | ||
| 164 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") | ||
| 165 | |||
| 166 | # Always build SDLmain | ||
| 167 | -add_library(SDL2main STATIC ${SDLMAIN_SOURCES}) | ||
| 168 | -target_include_directories(SDL2main PUBLIC $<INSTALL_INTERFACE:include>) | ||
| 169 | -set(_INSTALL_LIBS "SDL2main") | ||
| 170 | +if(NOT WINDOWS_STORE) | ||
| 171 | + add_library(SDL2main STATIC ${SDLMAIN_SOURCES}) | ||
| 172 | + target_include_directories(SDL2main PUBLIC $<INSTALL_INTERFACE:include>) | ||
| 173 | + set(_INSTALL_LIBS "SDL2main") | ||
| 174 | +endif() | ||
| 175 | |||
| 176 | if(SDL_SHARED) | ||
| 177 | add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES}) | ||
| 178 | diff --git a/include/SDL_config.h.cmake b/include/SDL_config.h.cmake | ||
| 179 | index 9b20398..7ae6e35 100644 | ||
| 180 | --- a/include/SDL_config.h.cmake | ||
| 181 | +++ b/include/SDL_config.h.cmake | ||
| 182 | @@ -298,6 +298,7 @@ | ||
| 183 | #cmakedefine SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC @SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC@ | ||
| 184 | #cmakedefine SDL_VIDEO_DRIVER_DUMMY @SDL_VIDEO_DRIVER_DUMMY@ | ||
| 185 | #cmakedefine SDL_VIDEO_DRIVER_WINDOWS @SDL_VIDEO_DRIVER_WINDOWS@ | ||
| 186 | +#cmakedefine SDL_VIDEO_DRIVER_WINRT @SDL_VIDEO_DRIVER_WINRT@ | ||
| 187 | #cmakedefine SDL_VIDEO_DRIVER_WAYLAND @SDL_VIDEO_DRIVER_WAYLAND@ | ||
| 188 | #cmakedefine SDL_VIDEO_DRIVER_RPI @SDL_VIDEO_DRIVER_RPI@ | ||
| 189 | #cmakedefine SDL_VIDEO_DRIVER_VIVANTE @SDL_VIDEO_DRIVER_VIVANTE@ | ||
| 190 | @@ -365,6 +366,7 @@ | ||
| 191 | #cmakedefine SDL_POWER_ANDROID @SDL_POWER_ANDROID@ | ||
| 192 | #cmakedefine SDL_POWER_LINUX @SDL_POWER_LINUX@ | ||
| 193 | #cmakedefine SDL_POWER_WINDOWS @SDL_POWER_WINDOWS@ | ||
| 194 | +#cmakedefine SDL_POWER_WINRT @SDL_POWER_WINRT@ | ||
| 195 | #cmakedefine SDL_POWER_MACOSX @SDL_POWER_MACOSX@ | ||
| 196 | #cmakedefine SDL_POWER_HAIKU @SDL_POWER_HAIKU@ | ||
| 197 | #cmakedefine SDL_POWER_EMSCRIPTEN @SDL_POWER_EMSCRIPTEN@ | ||
| 198 | @@ -387,7 +389,7 @@ | ||
| 199 | #cmakedefine SDL_LIBSAMPLERATE_DYNAMIC @SDL_LIBSAMPLERATE_DYNAMIC@ | ||
| 200 | |||
| 201 | /* Platform specific definitions */ | ||
| 202 | -#if !defined(__WIN32__) | ||
| 203 | +#if !defined(__WIN32__) && !defined(__WINRT__) | ||
| 204 | # if !defined(_STDINT_H_) && !defined(_STDINT_H) && !defined(HAVE_STDINT_H) && !defined(_HAVE_STDINT_H) | ||
| 205 | typedef unsigned int size_t; | ||
| 206 | typedef signed char int8_t; | ||
| @@ -0,0 +1,24 @@ | |||
| 1 | # HG changeset patch | ||
| 2 | # User Mikhail Paulyshka <me@mixaill.tk> | ||
| 3 | # Date 1506252750 -10800 | ||
| 4 | # Sun Sep 24 14:32:30 2017 +0300 | ||
| 5 | # Branch SDL2-WIN-SYMBOLS_LEACKAGE | ||
| 6 | # Node ID 46ec9baae30cd4e0c584de125cae4a3cce2864ad | ||
| 7 | # Parent 8df7a59b55283aa09889522369a2b32674c048de | ||
| 8 | win32: fix symbols leakage for static libraries | ||
| 9 | |||
| 10 | diff -r 8df7a59b5528 -r 46ec9baae30c include/begin_code.h | ||
| 11 | --- a/include/begin_code.h Fri Sep 22 11:25:52 2017 -0700 | ||
| 12 | +++ b/include/begin_code.h Sun Sep 24 14:32:30 2017 +0300 | ||
| 13 | @@ -58,8 +58,10 @@ | ||
| 14 | # else | ||
| 15 | # define DECLSPEC __declspec(dllimport) | ||
| 16 | # endif | ||
| 17 | +# elif defined(_DLL) | ||
| 18 | +# define DECLSPEC __declspec(dllexport) | ||
| 19 | # else | ||
| 20 | -# define DECLSPEC __declspec(dllexport) | ||
| 21 | +# define DECLSPEC | ||
| 22 | # endif | ||
| 23 | # elif defined(__OS2__) | ||
| 24 | # ifdef BUILD_SDL | ||
| @@ -0,0 +1,79 @@ | |||
| 1 | include(vcpkg_common_functions) | ||
| 2 | |||
| 3 | vcpkg_from_github( | ||
| 4 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 5 | REPO SDL-Mirror/SDL | ||
| 6 | REF release-2.0.8 | ||
| 7 | SHA512 5922dbeb14bb22991160251664b417d3f846867c18b5ecc1bd19c328ffd69b16252b7d45b9a317bafd1207fdb66d93a022dfb239e02447db9babd941956b6b37 | ||
| 8 | HEAD_REF master | ||
| 9 | ) | ||
| 10 | |||
| 11 | vcpkg_apply_patches( | ||
| 12 | SOURCE_PATH ${SOURCE_PATH} | ||
| 13 | PATCHES | ||
| 14 | ${CMAKE_CURRENT_LIST_DIR}/export-symbols-only-in-shared-build.patch | ||
| 15 | ${CMAKE_CURRENT_LIST_DIR}/enable-winrt-cmake.patch | ||
| 16 | ) | ||
| 17 | |||
| 18 | string(COMPARE EQUAL "${VCPKG_LIBRARY_LINKAGE}" "static" SDL_STATIC) | ||
| 19 | string(COMPARE EQUAL "${VCPKG_LIBRARY_LINKAGE}" "dynamic" SDL_SHARED) | ||
| 20 | string(COMPARE EQUAL "${VCPKG_CRT_LINKAGE}" "static" FORCE_STATIC_VCRT) | ||
| 21 | |||
| 22 | vcpkg_configure_cmake( | ||
| 23 | SOURCE_PATH ${SOURCE_PATH} | ||
| 24 | PREFER_NINJA | ||
| 25 | OPTIONS | ||
| 26 | -DSDL_STATIC=${SDL_STATIC} | ||
| 27 | -DSDL_SHARED=${SDL_SHARED} | ||
| 28 | -DVIDEO_VULKAN=OFF | ||
| 29 | -DFORCE_STATIC_VCRT=${FORCE_STATIC_VCRT} | ||
| 30 | -DLIBC=ON | ||
| 31 | ) | ||
| 32 | |||
| 33 | vcpkg_install_cmake() | ||
| 34 | |||
| 35 | if(EXISTS "${CURRENT_PACKAGES_DIR}/cmake") | ||
| 36 | vcpkg_fixup_cmake_targets(CONFIG_PATH "cmake") | ||
| 37 | elseif(EXISTS "${CURRENT_PACKAGES_DIR}/lib/cmake/SDL2") | ||
| 38 | vcpkg_fixup_cmake_targets(CONFIG_PATH "lib/cmake/SDL2") | ||
| 39 | elseif(EXISTS "${CURRENT_PACKAGES_DIR}/SDL2.framework/Resources") | ||
| 40 | vcpkg_fixup_cmake_targets(CONFIG_PATH "SDL2.framework/Resources") | ||
| 41 | endif() | ||
| 42 | |||
| 43 | file(REMOVE_RECURSE | ||
| 44 | ${CURRENT_PACKAGES_DIR}/debug/include | ||
| 45 | ${CURRENT_PACKAGES_DIR}/debug/share | ||
| 46 | ${CURRENT_PACKAGES_DIR}/bin/sdl2-config | ||
| 47 | ${CURRENT_PACKAGES_DIR}/debug/bin/sdl2-config | ||
| 48 | ${CURRENT_PACKAGES_DIR}/SDL2.framework | ||
| 49 | ${CURRENT_PACKAGES_DIR}/debug/SDL2.framework | ||
| 50 | ) | ||
| 51 | |||
| 52 | file(GLOB BINS ${CURRENT_PACKAGES_DIR}/debug/bin/* ${CURRENT_PACKAGES_DIR}/bin/*) | ||
| 53 | if(NOT BINS) | ||
| 54 | file(REMOVE_RECURSE | ||
| 55 | ${CURRENT_PACKAGES_DIR}/bin | ||
| 56 | ${CURRENT_PACKAGES_DIR}/debug/bin | ||
| 57 | ) | ||
| 58 | endif() | ||
| 59 | |||
| 60 | if(NOT VCPKG_CMAKE_SYSTEM_NAME) | ||
| 61 | if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") | ||
| 62 | file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/lib/manual-link) | ||
| 63 | file(RENAME ${CURRENT_PACKAGES_DIR}/lib/SDL2main.lib ${CURRENT_PACKAGES_DIR}/lib/manual-link/SDL2main.lib) | ||
| 64 | endif() | ||
| 65 | if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") | ||
| 66 | file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/debug/lib/manual-link) | ||
| 67 | file(RENAME ${CURRENT_PACKAGES_DIR}/debug/lib/SDL2maind.lib ${CURRENT_PACKAGES_DIR}/debug/lib/manual-link/SDL2maind.lib) | ||
| 68 | endif() | ||
| 69 | |||
| 70 | file(GLOB SHARE_FILES ${CURRENT_PACKAGES_DIR}/share/sdl2/*.cmake) | ||
| 71 | foreach(SHARE_FILE ${SHARE_FILES}) | ||
| 72 | file(READ "${SHARE_FILE}" _contents) | ||
| 73 | string(REPLACE "lib/SDL2main" "lib/manual-link/SDL2main" _contents "${_contents}") | ||
| 74 | file(WRITE "${SHARE_FILE}" "${_contents}") | ||
| 75 | endforeach() | ||
| 76 | endif() | ||
| 77 | |||
| 78 | file(INSTALL ${SOURCE_PATH}/COPYING.txt DESTINATION ${CURRENT_PACKAGES_DIR}/share/sdl2 RENAME copyright) | ||
| 79 | vcpkg_copy_pdbs() | ||
| @@ -0,0 +1,30 @@ | |||
| 1 | From e8e12e856cbc41f9bdcc83bc87eb5013df199ee1 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: vlj <vljn.ovi@gmail.com> | ||
| 3 | Date: Fri, 2 Dec 2016 16:36:25 +0100 | ||
| 4 | Subject: [PATCH] Do not generate build-version.inc | ||
| 5 | |||
| 6 | --- | ||
| 7 | CMakeLists.txt | 10 +++++----- | ||
| 8 | 1 file changed, 5 insertions(+), 5 deletions(-) | ||
| 9 | |||
| 10 | diff --git a/CMakeLists.txt b/CMakeLists.txt | ||
| 11 | index a4c2fac..5544a2d 100644 | ||
| 12 | --- a/CMakeLists.txt | ||
| 13 | +++ b/CMakeLists.txt | ||
| 14 | @@ -53,8 +53,8 @@ add_subdirectory(libshaderc) | ||
| 15 | add_subdirectory(glslc) | ||
| 16 | add_subdirectory(examples) | ||
| 17 | |||
| 18 | -add_custom_target(build-version | ||
| 19 | - ${PYTHON_EXE} | ||
| 20 | - ${CMAKE_CURRENT_SOURCE_DIR}/utils/update_build_version.py | ||
| 21 | - ${shaderc_SOURCE_DIR} ${spirv-tools_SOURCE_DIR} ${glslang_SOURCE_DIR} | ||
| 22 | - COMMENT "Update build-version.inc in the Shaderc build directory (if necessary).") | ||
| 23 | +#add_custom_target(build-version | ||
| 24 | +# ${PYTHON_EXE} | ||
| 25 | +# ${CMAKE_CURRENT_SOURCE_DIR}/utils/update_build_version.py | ||
| 26 | +# ${shaderc_SOURCE_DIR} ${spirv-tools_SOURCE_DIR} ${glslang_SOURCE_DIR} | ||
| 27 | +# COMMENT "Update build-version.inc in the Shaderc build directory (if necessary).") | ||
| 28 | -- | ||
| 29 | 2.10.2.windows.1 | ||
| 30 | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | option(SUFFIX_D "Add d Suffix to lib" ${SUFFIX_D}) | ||
| 2 | if(NOT SUFFIX_D) | ||
| 3 | find_library(GLSLANG glslang) | ||
| 4 | find_library(OSDEPENDENT OSDependent) | ||
| 5 | find_library(OGLCOMPILER OGLCompiler) | ||
| 6 | find_library(HLSLLIB HLSL) | ||
| 7 | find_library(SPIRVLIB SPIRV) | ||
| 8 | ELSE() | ||
| 9 | find_library(GLSLANG glslangd) | ||
| 10 | find_library(OSDEPENDENT OSDependentd) | ||
| 11 | find_library(OGLCOMPILER OGLCompilerd) | ||
| 12 | find_library(HLSLLIB HLSLd) | ||
| 13 | find_library(SPIRVLIB SPIRVd) | ||
| 14 | ENDIF() | ||
| 15 | |||
| 16 | add_library(glslang STATIC IMPORTED GLOBAL) | ||
| 17 | set_property(TARGET glslang PROPERTY IMPORTED_LOCATION "${GLSLANG}") | ||
| 18 | find_path(glslang_SOURCE_DIR glslang/Include/Common) | ||
| 19 | set_property(TARGET glslang APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${glslang_SOURCE_DIR}") | ||
| 20 | |||
| 21 | add_library(OSDependent STATIC IMPORTED GLOBAL) | ||
| 22 | set_property(TARGET OSDependent PROPERTY IMPORTED_LOCATION "${OSDEPENDENT}") | ||
| 23 | |||
| 24 | add_library(OGLCompiler STATIC IMPORTED GLOBAL) | ||
| 25 | set_property(TARGET OGLCompiler PROPERTY IMPORTED_LOCATION "${OGLCOMPILER}") | ||
| 26 | |||
| 27 | add_library(HLSL STATIC IMPORTED GLOBAL) | ||
| 28 | set_property(TARGET HLSL PROPERTY IMPORTED_LOCATION "${HLSLLIB}") | ||
| 29 | |||
| 30 | add_library(SPIRV STATIC IMPORTED GLOBAL) | ||
| 31 | set_property(TARGET SPIRV PROPERTY IMPORTED_LOCATION "${SPIRVLIB}") | ||
| @@ -0,0 +1,8 @@ | |||
| 1 | find_library(SPIRVTOOLSOPT SPIRV-Tools-opt) | ||
| 2 | find_library(SPIRVTOOLS SPIRV-Tools) | ||
| 3 | |||
| 4 | add_library(SPIRV-Tools-opt STATIC IMPORTED GLOBAL) | ||
| 5 | set_property(TARGET SPIRV-Tools-opt PROPERTY IMPORTED_LOCATION "${SPIRVTOOLSOPT}") | ||
| 6 | |||
| 7 | add_library(SPIRV-Tools STATIC IMPORTED GLOBAL) | ||
| 8 | set_property(TARGET SPIRV-Tools PROPERTY IMPORTED_LOCATION "${SPIRVTOOLS}") | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | Source: shaderc | ||
| 2 | Version: 2018.0-1 | ||
| 3 | Description: A collection of tools, libraries and tests for shader compilation. | ||
| 4 | Build-Depends: glslang, spirv-tools | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | "shaderc v2016.2-dev unknown hash, 2016-12-02\n" | ||
| 2 | "spirv-tools v2016.6-dev unknown hash, 2016-12-02\n" | ||
| 3 | "glslang unknown hash, 2016-12-02\n" | ||
| @@ -0,0 +1,49 @@ | |||
| 1 | include(vcpkg_common_functions) | ||
| 2 | |||
| 3 | vcpkg_from_github( | ||
| 4 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 5 | REPO google/shaderc | ||
| 6 | REF v2018.0 | ||
| 7 | SHA512 7a420fde73c9f2aae3f13558d538a1f4ae43bba19e2b4d2da8fbbd017e9e4f328ece5f330f1bbcb9fe84c91b7eb84b9158dc2e3d144c82939090a0fa6f5b4ef0 | ||
| 8 | HEAD_REF master | ||
| 9 | PATCHES | ||
| 10 | 0001-Do-not-generate-build-version.inc.patch | ||
| 11 | ) | ||
| 12 | |||
| 13 | file(COPY ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt DESTINATION ${SOURCE_PATH}/third_party/glslang) | ||
| 14 | file(COPY ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_spirv.txt DESTINATION ${SOURCE_PATH}/third_party/spirv-tools) | ||
| 15 | file(RENAME ${SOURCE_PATH}/third_party/spirv-tools/CMakeLists_spirv.txt ${SOURCE_PATH}/third_party/spirv-tools/CMakeLists.txt) | ||
| 16 | file(COPY ${CMAKE_CURRENT_LIST_DIR}/build-version.inc DESTINATION ${SOURCE_PATH}/glslc/src) | ||
| 17 | |||
| 18 | #Note: glslang and spir tools doesn't export symbol and need to be build as static lib for cmake to work | ||
| 19 | set(VCPKG_LIBRARY_LINKAGE "static") | ||
| 20 | set(OPTIONS) | ||
| 21 | if(VCPKG_CRT_LINKAGE STREQUAL "dynamic") | ||
| 22 | list(APPEND OPTIONS -DSHADERC_ENABLE_SHARED_CRT=ON) | ||
| 23 | endif() | ||
| 24 | |||
| 25 | # shaderc uses python to manipulate copyright information | ||
| 26 | vcpkg_find_acquire_program(PYTHON3) | ||
| 27 | get_filename_component(PYTHON3_EXE_PATH ${PYTHON3} DIRECTORY) | ||
| 28 | vcpkg_add_to_path(PREPEND "${PYTHON3_EXE_PATH}") | ||
| 29 | |||
| 30 | vcpkg_configure_cmake( | ||
| 31 | SOURCE_PATH ${SOURCE_PATH} | ||
| 32 | OPTIONS -DSHADERC_SKIP_TESTS=true ${OPTIONS} -Dglslang_SOURCE_DIR=${CURRENT_INSTALLED_DIR}/include | ||
| 33 | OPTIONS_DEBUG -DSUFFIX_D=true | ||
| 34 | OPTIONS_RELEASE -DSUFFIX_D=false | ||
| 35 | ) | ||
| 36 | |||
| 37 | vcpkg_install_cmake() | ||
| 38 | |||
| 39 | file(GLOB EXES "${CURRENT_PACKAGES_DIR}/bin/*.exe") | ||
| 40 | file(COPY ${EXES} DESTINATION ${CURRENT_PACKAGES_DIR}/tools) | ||
| 41 | |||
| 42 | #Safe to remove as libs are static | ||
| 43 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin) | ||
| 44 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/bin) | ||
| 45 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) | ||
| 46 | |||
| 47 | # Handle copyright | ||
| 48 | file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/shaderc) | ||
| 49 | file(RENAME ${CURRENT_PACKAGES_DIR}/share/shaderc/LICENSE ${CURRENT_PACKAGES_DIR}/share/shaderc/copyright) | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: spirv-cross | ||
| 2 | Version: 2018-08-07-1 | ||
| 3 | Description: SPIRV-Cross is a practical tool and library for performing reflection on SPIR-V and disassembling SPIR-V back to high level languages. | ||
| @@ -0,0 +1,33 @@ | |||
| 1 | include(vcpkg_common_functions) | ||
| 2 | |||
| 3 | vcpkg_check_linkage(ONLY_STATIC_LIBRARY) | ||
| 4 | |||
| 5 | vcpkg_from_github( | ||
| 6 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 7 | REPO KhronosGroup/SPIRV-Cross | ||
| 8 | REF 2018-08-07 | ||
| 9 | SHA512 1ac6ee6b2864d950199d4e856ae1576f9435827501baa5d53821a973cd68aaa03ec428094bf74c570784997baac5b2e3802ddc7f02844e2ee546741fa726bf91 | ||
| 10 | HEAD_REF master | ||
| 11 | ) | ||
| 12 | |||
| 13 | vcpkg_configure_cmake( | ||
| 14 | SOURCE_PATH ${SOURCE_PATH} | ||
| 15 | PREFER_NINJA | ||
| 16 | OPTIONS -DSPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS=OFF | ||
| 17 | ) | ||
| 18 | |||
| 19 | vcpkg_install_cmake() | ||
| 20 | vcpkg_copy_pdbs() | ||
| 21 | |||
| 22 | foreach(COMPONENT core cpp glsl hlsl msl reflect util) | ||
| 23 | vcpkg_fixup_cmake_targets(CONFIG_PATH share/spirv_cross_${COMPONENT}/cmake TARGET_PATH share/spirv_cross_${COMPONENT}) | ||
| 24 | endforeach() | ||
| 25 | |||
| 26 | file(GLOB EXES "${CURRENT_PACKAGES_DIR}/bin/*") | ||
| 27 | file(COPY ${EXES} DESTINATION ${CURRENT_PACKAGES_DIR}/tools) | ||
| 28 | |||
| 29 | # cleanup | ||
| 30 | configure_file(${SOURCE_PATH}/LICENSE ${CURRENT_PACKAGES_DIR}/share/spirv-cross/copyright COPYONLY) | ||
| 31 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) | ||
| 32 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share) | ||
| 33 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin ${CURRENT_PACKAGES_DIR}/debug/bin) | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: spirv-tools | ||
| 2 | Version: 2018.5-1 | ||
| 3 | Description: API and commands for processing SPIR-V modules | ||
| @@ -0,0 +1,43 @@ | |||
| 1 | include(vcpkg_common_functions) | ||
| 2 | |||
| 3 | vcpkg_check_linkage(ONLY_STATIC_LIBRARY) | ||
| 4 | |||
| 5 | vcpkg_from_github( | ||
| 6 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 7 | REPO KhronosGroup/SPIRV-Tools | ||
| 8 | REF v2018.5 | ||
| 9 | SHA512 068a39e15111f24ad2a6b27e7ada786b3124b239aa8b13e187a4d512044db57a8e6a0fccadd0451155e1f57c96c8dec91a2338996c59fc883007cf7be07f2cad | ||
| 10 | HEAD_REF master | ||
| 11 | ) | ||
| 12 | |||
| 13 | vcpkg_from_github( | ||
| 14 | OUT_SOURCE_PATH SPIRV_HEADERS_PATH | ||
| 15 | REPO KhronosGroup/SPIRV-Headers | ||
| 16 | REF 801cca8104245c07e8cc53292da87ee1b76946fe | ||
| 17 | SHA512 2bfc37beec1f6afb565fa7dad08eb838c8fe4bacda7f80a3a6c75d80c7eb1caea7e7716dc1da11b337b723a0870700d524c6617c5b7cab8b28048fa8c0785ba9 | ||
| 18 | HEAD_REF master | ||
| 19 | ) | ||
| 20 | |||
| 21 | vcpkg_find_acquire_program(PYTHON3) | ||
| 22 | get_filename_component(PYTHON3_DIR "${PYTHON3}" DIRECTORY) | ||
| 23 | vcpkg_add_to_path("${PYTHON3_DIR}") | ||
| 24 | |||
| 25 | vcpkg_configure_cmake( | ||
| 26 | SOURCE_PATH ${SOURCE_PATH} | ||
| 27 | PREFER_NINJA | ||
| 28 | OPTIONS | ||
| 29 | -DSPIRV-Headers_SOURCE_DIR=${SPIRV_HEADERS_PATH} | ||
| 30 | -DSPIRV_WERROR=OFF | ||
| 31 | ) | ||
| 32 | |||
| 33 | vcpkg_install_cmake() | ||
| 34 | |||
| 35 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) | ||
| 36 | file(GLOB EXES "${CURRENT_PACKAGES_DIR}/bin/*") | ||
| 37 | file(COPY ${EXES} DESTINATION ${CURRENT_PACKAGES_DIR}/tools) | ||
| 38 | file(REMOVE ${EXES}) | ||
| 39 | file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin ${CURRENT_PACKAGES_DIR}/debug/bin) | ||
| 40 | |||
| 41 | # Handle copyright | ||
| 42 | file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/spirv-tools) | ||
| 43 | file(RENAME ${CURRENT_PACKAGES_DIR}/share/spirv-tools/LICENSE ${CURRENT_PACKAGES_DIR}/share/spirv-tools/copyright) | ||
| @@ -0,0 +1,18 @@ | |||
| 1 | project(tbb CXX) | ||
| 2 | |||
| 3 | file(GLOB SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*) | ||
| 4 | file(COPY ${SOURCES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/src) | ||
| 5 | |||
| 6 | include(${CMAKE_CURRENT_BINARY_DIR}/src/cmake/TBBBuild.cmake REQUIRED) | ||
| 7 | tbb_build(TBB_ROOT ${CMAKE_CURRENT_BINARY_DIR}/src MAKE_ARGS extra_inc=big_iron.inc) | ||
| 8 | |||
| 9 | set(SUBDIR ${CMAKE_CURRENT_BINARY_DIR}/tbb_cmake_build/tbb_cmake_build_subdir) | ||
| 10 | if(CMAKE_BUILD_TYPE STREQUAL "Release") | ||
| 11 | set(SUBDIR "${SUBDIR}_release") | ||
| 12 | else() | ||
| 13 | set(SUBDIR "${SUBDIR}_debug") | ||
| 14 | endif() | ||
| 15 | |||
| 16 | file(GLOB OUTPUTS ${SUBDIR}/*.so.* ${SUBDIR}/*.so ${SUBDIR}/*.a ${SUBDIR}/*.dylib ${SUBDIR}/*.dylib.*) | ||
| 17 | |||
| 18 | install(FILES ${OUTPUTS} DESTINATION lib) | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: tbb | ||
| 2 | Version: 2018_U5-4 | ||
| 3 | Description: Intel's Threading Building Blocks. | ||
| @@ -0,0 +1,86 @@ | |||
| 1 | include(vcpkg_common_functions) | ||
| 2 | |||
| 3 | if(NOT VCPKG_CMAKE_SYSTEM_NAME OR VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore") | ||
| 4 | vcpkg_check_linkage(ONLY_DYNAMIC_LIBRARY) | ||
| 5 | endif() | ||
| 6 | |||
| 7 | vcpkg_from_github( | ||
| 8 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 9 | REPO 01org/tbb | ||
| 10 | REF 2018_U5 | ||
| 11 | SHA512 3e8d20276ccb1b50099f96b6cf968e3d0ada53caea1fa836ecb8652f1dca236fbbbf2c783e64ea2f761f7f21725064d19b72d176e35e4dc29706b8a30965153b | ||
| 12 | HEAD_REF tbb_2018 | ||
| 13 | ) | ||
| 14 | |||
| 15 | file(COPY ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt DESTINATION ${SOURCE_PATH}) | ||
| 16 | |||
| 17 | if(VCPKG_CMAKE_SYSTEM_NAME AND NOT VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore") | ||
| 18 | vcpkg_configure_cmake( | ||
| 19 | SOURCE_PATH ${SOURCE_PATH} | ||
| 20 | PREFER_NINJA | ||
| 21 | ) | ||
| 22 | |||
| 23 | vcpkg_install_cmake() | ||
| 24 | |||
| 25 | # Settings for TBBConfigForSource.cmake.in | ||
| 26 | set(TBB_LIB_EXT a) | ||
| 27 | set(TBB_LIB_PREFIX lib) | ||
| 28 | else() | ||
| 29 | if (VCPKG_CRT_LINKAGE STREQUAL static) | ||
| 30 | set(RELEASE_CONFIGURATION Release-MT) | ||
| 31 | set(DEBUG_CONFIGURATION Debug-MT) | ||
| 32 | else() | ||
| 33 | set(RELEASE_CONFIGURATION Release) | ||
| 34 | set(DEBUG_CONFIGURATION Debug) | ||
| 35 | endif() | ||
| 36 | |||
| 37 | vcpkg_install_msbuild( | ||
| 38 | SOURCE_PATH ${SOURCE_PATH} | ||
| 39 | PROJECT_SUBPATH build/vs2013/makefile.sln | ||
| 40 | RELEASE_CONFIGURATION ${RELEASE_CONFIGURATION} | ||
| 41 | DEBUG_CONFIGURATION ${DEBUG_CONFIGURATION} | ||
| 42 | ) | ||
| 43 | # Settings for TBBConfigForSource.cmake.in | ||
| 44 | set(TBB_LIB_EXT lib) | ||
| 45 | set(TBB_LIB_PREFIX) | ||
| 46 | endif() | ||
| 47 | |||
| 48 | file(COPY | ||
| 49 | ${SOURCE_PATH}/include/tbb | ||
| 50 | ${SOURCE_PATH}/include/serial | ||
| 51 | DESTINATION ${CURRENT_PACKAGES_DIR}/include) | ||
| 52 | |||
| 53 | # Settings for TBBConfigForSource.cmake.in | ||
| 54 | if(VCPKG_LIBRARY_LINKAGE STREQUAL "static") | ||
| 55 | set(TBB_DEFAULT_COMPONENTS tbb tbbmalloc) | ||
| 56 | else() | ||
| 57 | set(TBB_DEFAULT_COMPONENTS tbb tbbmalloc tbbmalloc_proxy) | ||
| 58 | endif() | ||
| 59 | file(READ "${SOURCE_PATH}/include/tbb/tbb_stddef.h" _tbb_stddef) | ||
| 60 | string(REGEX REPLACE ".*#define TBB_VERSION_MAJOR ([0-9]+).*" "\\1" _tbb_ver_major "${_tbb_stddef}") | ||
| 61 | string(REGEX REPLACE ".*#define TBB_VERSION_MINOR ([0-9]+).*" "\\1" _tbb_ver_minor "${_tbb_stddef}") | ||
| 62 | string(REGEX REPLACE ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1" TBB_INTERFACE_VERSION "${_tbb_stddef}") | ||
| 63 | set(TBB_VERSION "${_tbb_ver_major}.${_tbb_ver_minor}") | ||
| 64 | set(TBB_RELEASE_DIR "\${_tbb_root}/lib") | ||
| 65 | set(TBB_DEBUG_DIR "\${_tbb_root}/debug/lib") | ||
| 66 | |||
| 67 | configure_file( | ||
| 68 | ${SOURCE_PATH}/cmake/templates/TBBConfigForSource.cmake.in | ||
| 69 | ${CURRENT_PACKAGES_DIR}/share/tbb/TBBConfig.cmake | ||
| 70 | @ONLY | ||
| 71 | ) | ||
| 72 | file(READ ${CURRENT_PACKAGES_DIR}/share/tbb/TBBConfig.cmake _contents) | ||
| 73 | string(REPLACE | ||
| 74 | "get_filename_component(_tbb_root \"\${_tbb_root}\" PATH)" | ||
| 75 | "get_filename_component(_tbb_root \"\${_tbb_root}\" PATH)\nget_filename_component(_tbb_root \"\${_tbb_root}\" PATH)" | ||
| 76 | _contents | ||
| 77 | "${_contents}" | ||
| 78 | ) | ||
| 79 | string(REPLACE "SHARED IMPORTED)" "UNKNOWN IMPORTED)" _contents "${_contents}") | ||
| 80 | file(WRITE ${CURRENT_PACKAGES_DIR}/share/tbb/TBBConfig.cmake "${_contents}") | ||
| 81 | |||
| 82 | # Handle copyright | ||
| 83 | file(COPY ${SOURCE_PATH}/LICENSE ${CMAKE_CURRENT_LIST_DIR}/usage DESTINATION ${CURRENT_PACKAGES_DIR}/share/tbb) | ||
| 84 | file(RENAME ${CURRENT_PACKAGES_DIR}/share/tbb/LICENSE ${CURRENT_PACKAGES_DIR}/share/tbb/copyright) | ||
| 85 | |||
| 86 | vcpkg_test_cmake(PACKAGE_NAME TBB) | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | The package tbb provides CMake targets: | ||
| 2 | |||
| 3 | find_package(TBB CONFIG REQUIRED) | ||
| 4 | target_link_libraries(main PRIVATE TBB::tbb) | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: vulkanmemoryallocator | ||
| 2 | Version: 3a7249f313b047417fbb1d36a3fbe6c3bf1505b5 | ||
| 3 | Description: Vulkan Memory Allocator | ||
| @@ -0,0 +1,14 @@ | |||
| 1 | include(vcpkg_common_functions) | ||
| 2 | |||
| 3 | set(SOURCE_VERSION 3.3.0) | ||
| 4 | |||
| 5 | vcpkg_from_github( | ||
| 6 | OUT_SOURCE_PATH SOURCE_PATH | ||
| 7 | REPO GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator | ||
| 8 | REF 3a7249f313b047417fbb1d36a3fbe6c3bf1505b5 | ||
| 9 | SHA512 ddeac01a25bfe47d4e749d150aeaea43760c9732db78bf6d15231b9de1b7fb5218f1ced07710cb1929175ddcb05848239edaf0f6cc47be48896211293ffd236c | ||
| 10 | HEAD_REF master | ||
| 11 | ) | ||
| 12 | |||
| 13 | file(INSTALL ${SOURCE_PATH}/src/vk_mem_alloc.h DESTINATION ${CURRENT_PACKAGES_DIR}/include/vma) | ||
| 14 | file(INSTALL ${SOURCE_PATH}/LICENSE.txt DESTINATION ${CURRENT_PACKAGES_DIR}/share/vulkanmemoryallocator RENAME copyright) | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | Source: zlib | ||
| 2 | Version: 1.2.11-3 | ||
| 3 | Description: A compression library | ||
| @@ -0,0 +1,20 @@ | |||
| 1 | Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler | ||
| 2 | |||
| 3 | This software is provided 'as-is', without any express or implied | ||
| 4 | warranty. In no event will the authors be held liable for any damages | ||
| 5 | arising from the use of this software. | ||
| 6 | |||
| 7 | Permission is granted to anyone to use this software for any purpose, | ||
| 8 | including commercial applications, and to alter it and redistribute it | ||
| 9 | freely, subject to the following restrictions: | ||
| 10 | |||
| 11 | 1. The origin of this software must not be misrepresented; you must not | ||
| 12 | claim that you wrote the original software. If you use this software | ||
| 13 | in a product, an acknowledgment in the product documentation would be | ||
| 14 | appreciated but is not required. | ||
| 15 | 2. Altered source versions must be plainly marked as such, and must not be | ||
| 16 | misrepresented as being the original software. | ||
| 17 | 3. This notice may not be removed or altered from any source distribution. | ||
| 18 | |||
| 19 | Jean-loup Gailly Mark Adler | ||
| 20 | jloup@gzip.org madler@alumni.caltech.edu | ||
| @@ -0,0 +1,42 @@ | |||
| 1 | diff --git a/CMakeLists.txt b/CMakeLists.txt | ||
| 2 | index 0fe939d..8d2f5f1 100644 | ||
| 3 | --- a/CMakeLists.txt | ||
| 4 | +++ b/CMakeLists.txt | ||
| 5 | @@ -7,6 +7,7 @@ set(VERSION "1.2.11") | ||
| 6 | |||
| 7 | option(ASM686 "Enable building i686 assembly implementation") | ||
| 8 | option(AMD64 "Enable building amd64 assembly implementation") | ||
| 9 | +option(SKIP_BUILD_EXAMPLES "Skip build of the examples" OFF) | ||
| 10 | |||
| 11 | set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") | ||
| 12 | set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") | ||
| 13 | @@ -211,7 +212,15 @@ elseif(BUILD_SHARED_LIBS AND WIN32) | ||
| 14 | endif() | ||
| 15 | |||
| 16 | if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL ) | ||
| 17 | - install(TARGETS zlib zlibstatic | ||
| 18 | + if (BUILD_SHARED_LIBS) | ||
| 19 | + set(ZLIB_TARGETS zlib) | ||
| 20 | + set_target_properties(zlibstatic PROPERTIES EXCLUDE_FROM_ALL ON) | ||
| 21 | + else() | ||
| 22 | + set(ZLIB_TARGETS zlibstatic) | ||
| 23 | + set_target_properties(zlib PROPERTIES EXCLUDE_FROM_ALL ON) | ||
| 24 | + endif() | ||
| 25 | + | ||
| 26 | + install(TARGETS ${ZLIB_TARGETS} | ||
| 27 | RUNTIME DESTINATION "${INSTALL_BIN_DIR}" | ||
| 28 | ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" | ||
| 29 | LIBRARY DESTINATION "${INSTALL_LIB_DIR}" ) | ||
| 30 | @@ -230,6 +239,7 @@ endif() | ||
| 31 | # Example binaries | ||
| 32 | #============================================================================ | ||
| 33 | |||
| 34 | +if (NOT SKIP_BUILD_EXAMPLES) | ||
| 35 | add_executable(example test/example.c) | ||
| 36 | target_link_libraries(example zlib) | ||
| 37 | add_test(example example) | ||
| 38 | @@ -247,3 +257,4 @@ if(HAVE_OFF64_T) | ||
| 39 | target_link_libraries(minigzip64 zlib) | ||
| 40 | set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") | ||
| 41 | endif() | ||
| 42 | +endif() | ||
| @@ -0,0 +1,47 @@ | |||
| 1 | include(vcpkg_common_functions) | ||
| 2 | set(SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src/zlib-1.2.11) | ||
| 3 | vcpkg_download_distfile(ARCHIVE_FILE | ||
| 4 | URLS "http://www.zlib.net/zlib-1.2.11.tar.gz" "https://downloads.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz" | ||
| 5 | FILENAME "zlib1211.tar.gz" | ||
| 6 | SHA512 73fd3fff4adeccd4894084c15ddac89890cd10ef105dd5e1835e1e9bbb6a49ff229713bd197d203edfa17c2727700fce65a2a235f07568212d820dca88b528ae | ||
| 7 | ) | ||
| 8 | vcpkg_extract_source_archive(${ARCHIVE_FILE}) | ||
| 9 | |||
| 10 | vcpkg_apply_patches( | ||
| 11 | SOURCE_PATH ${SOURCE_PATH} | ||
| 12 | PATCHES | ||
| 13 | ${CMAKE_CURRENT_LIST_DIR}/cmake_dont_build_more_than_needed.patch | ||
| 14 | ) | ||
| 15 | |||
| 16 | # This is generated during the cmake build | ||
| 17 | file(REMOVE ${SOURCE_PATH}/zconf.h) | ||
| 18 | |||
| 19 | vcpkg_configure_cmake( | ||
| 20 | SOURCE_PATH ${SOURCE_PATH} | ||
| 21 | PREFER_NINJA | ||
| 22 | OPTIONS | ||
| 23 | -DSKIP_INSTALL_FILES=ON | ||
| 24 | -DSKIP_BUILD_EXAMPLES=ON | ||
| 25 | OPTIONS_DEBUG | ||
| 26 | -DSKIP_INSTALL_HEADERS=ON | ||
| 27 | ) | ||
| 28 | |||
| 29 | vcpkg_install_cmake() | ||
| 30 | |||
| 31 | # Both dynamic and static are built, so keep only the one needed | ||
| 32 | if(VCPKG_LIBRARY_LINKAGE STREQUAL static) | ||
| 33 | if(EXISTS ${CURRENT_PACKAGES_DIR}/lib/zlibstatic.lib) | ||
| 34 | file(RENAME ${CURRENT_PACKAGES_DIR}/lib/zlibstatic.lib ${CURRENT_PACKAGES_DIR}/lib/zlib.lib) | ||
| 35 | endif() | ||
| 36 | if(EXISTS ${CURRENT_PACKAGES_DIR}/debug/lib/zlibstaticd.lib) | ||
| 37 | file(RENAME ${CURRENT_PACKAGES_DIR}/debug/lib/zlibstaticd.lib ${CURRENT_PACKAGES_DIR}/debug/lib/zlibd.lib) | ||
| 38 | endif() | ||
| 39 | endif() | ||
| 40 | |||
| 41 | file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/zlib RENAME copyright) | ||
| 42 | |||
| 43 | vcpkg_copy_pdbs() | ||
| 44 | |||
| 45 | file(COPY ${CMAKE_CURRENT_LIST_DIR}/usage DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT}) | ||
| 46 | |||
| 47 | #vcpkg_test_cmake(PACKAGE_NAME ZLIB MODULE) | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | The package zlib is compatible with built-in CMake targets: | ||
| 2 | |||
| 3 | find_package(ZLIB REQUIRED) | ||
| 4 | target_link_libraries(main PRIVATE ZLIB::ZLIB) | ||
| @@ -28,6 +28,78 @@ · 27 unmodified lines | |||
| 28 | 28 | ||
| 29 | !include "WinVer.nsh" | 29 | !include "WinVer.nsh" |
| 30 | 30 | ||
| 31 | ;-------------------------------- | ||
| 32 | ;Include Installer Logging | ||
| 33 | ; taken from http://nsis.sourceforge.net/Logging:_Simple_Text_File_Logging_Functions_and_Macros | ||
| 34 | ; TextLog.nsh v1.1 - 2005-12-26 | ||
| 35 | ; Written by Mike Schinkel [http://www.mikeschinkel.com/blog/] | ||
| 36 | |||
| 37 | Var /GLOBAL __TextLog_FileHandle | ||
| 38 | Var /GLOBAL __TextLog_FileName | ||
| 39 | Var /GLOBAL __TextLog_State | ||
| 40 | |||
| 41 | !define LogMsg '!insertmacro LogMsgCall' | ||
| 42 | !macro LogMsgCall _text | ||
| 43 | Call LogSetOn | ||
| 44 | Push "${_text}" | ||
| 45 | Call LogText | ||
| 46 | Call LogSetOff | ||
| 47 | !macroend | ||
| 48 | |||
| 49 | |||
| 50 | !define LogText '!insertmacro LogTextCall' | ||
| 51 | !macro LogTextCall _text | ||
| 52 | Push "${_text}" | ||
| 53 | Call LogText | ||
| 54 | !macroend | ||
| 55 | |||
| 56 | Function LogText | ||
| 57 | Exch $0 ; pABC -> 0ABC | ||
| 58 | FileWrite $__TextLog_FileHandle "$0$\r$\n" | ||
| 59 | Pop $0 ; 0ABC -> ABC | ||
| 60 | FunctionEnd | ||
| 61 | |||
| 62 | !define LogSetFileName '!insertmacro LogSetFileNameCall' | ||
| 63 | !macro LogSetFileNameCall _filename | ||
| 64 | Push "${_filename}" | ||
| 65 | Call LogSetFileName | ||
| 66 | !macroend | ||
| 67 | |||
| 68 | Function LogSetFileName | ||
| 69 | Exch $0 ; pABC -> 0ABC | ||
| 70 | StrCpy $__TextLog_FileName "$0" | ||
| 71 | StrCmp $__TextLog_State "open" +1 +3 | ||
| 72 | Call LogSetOff | ||
| 73 | Call LogSetOn | ||
| 74 | Pop $0 ; 0ABC -> ABC | ||
| 75 | FunctionEnd | ||
| 76 | |||
| 77 | !define LogSetOn '!insertmacro LogSetOnCall' | ||
| 78 | !macro LogSetOnCall | ||
| 79 | Call LogSetOn | ||
| 80 | !macroend | ||
| 81 | |||
| 82 | Function LogSetOn | ||
| 83 | StrCmp $__TextLog_FileName "" +1 AlreadySet | ||
| 84 | StrCpy $__TextLog_FileName "$INSTDIR\install.log" | ||
| 85 | AlreadySet: | ||
| 86 | StrCmp $__TextLog_State "open" +2 | ||
| 87 | FileOpen $__TextLog_FileHandle "$__TextLog_FileName" a | ||
| 88 | FileSeek $__TextLog_FileHandle 0 END | ||
| 89 | StrCpy $__TextLog_State "open" | ||
| 90 | FunctionEnd | ||
| 91 | |||
| 92 | !define LogSetOff '!insertmacro LogSetOffCall' | ||
| 93 | !macro LogSetOffCall | ||
| 94 | Call LogSetOff | ||
| 95 | !macroend | ||
| 96 | |||
| 97 | Function LogSetOff | ||
| 98 | StrCmp $__TextLog_State "open" +1 +2 | ||
| 99 | FileClose $__TextLog_FileHandle | ||
| 100 | StrCpy $__TextLog_State "" | ||
| 101 | FunctionEnd | ||
| 102 | |||
| 31 | ;-------------------------------- | 103 | ;-------------------------------- |
| 32 | ; Utilities and Functions | 104 | ; Utilities and Functions |
| 33 | ;-------------------------------- | 105 | ;-------------------------------- |
| @@ -375,6 +447,10 @@ Var GAClientID · 341 unmodified lines | |||
| 375 | !insertmacro CreateGUID $GAClientID | 447 | !insertmacro CreateGUID $GAClientID |
| 376 | !macroend | 448 | !macroend |
| 377 | 449 | ||
| 450 | !macro LogStep Category Action Label Value | ||
| 451 | ${LogText} "Step: ${Category} ${Action} ${Label} ${Value}" | ||
| 452 | !macroend | ||
| 453 | |||
| 378 | !macro GoogleAnalytics Category Action Label Value | 454 | !macro GoogleAnalytics Category Action Label Value |
| 379 | ${If} "@GA_TRACKING_ID@" != "" | 455 | ${If} "@GA_TRACKING_ID@" != "" |
| 380 | Push $0 | 456 | Push $0 |
| @@ -557,11 +633,13 @@ Var Express · 176 unmodified lines | |||
| 557 | !macro MaybeSkipPage | 633 | !macro MaybeSkipPage |
| 558 | ; Check if Express is set, if so, abort the post install options page | 634 | ; Check if Express is set, if so, abort the post install options page |
| 559 | ${If} $Express == "1" | 635 | ${If} $Express == "1" |
| 636 | ${LogText} "Express Install: Skipping Post Install Options Page" | ||
| 560 | Abort | 637 | Abort |
| 561 | ${EndIf} | 638 | ${EndIf} |
| 562 | !macroend | 639 | !macroend |
| 563 | 640 | ||
| 564 | !macro DownloadSlideshowImages | 641 | !macro DownloadSlideshowImages |
| 642 | ${LogText} "Download Slideshow Images" | ||
| 565 | InitPluginsDir | 643 | InitPluginsDir |
| 566 | 644 | ||
| 567 | Push $0 | 645 | Push $0 |
| @@ -583,32 +661,40 @@ Var Express · 15 unmodified lines | |||
| 583 | !macroend | 661 | !macroend |
| 584 | 662 | ||
| 585 | Function OnUserAbort | 663 | Function OnUserAbort |
| 664 | !insertmacro LogStep "Installer" "Abort" "User Abort" "" | ||
| 586 | !insertmacro GoogleAnalytics "Installer" "Abort" "User Abort" "" | 665 | !insertmacro GoogleAnalytics "Installer" "Abort" "User Abort" "" |
| 587 | FunctionEnd | 666 | FunctionEnd |
| 588 | Function PageWelcomePre | 667 | Function PageWelcomePre |
| 668 | !insertmacro LogStep "Installer" "Welcome" "" "" | ||
| 589 | !insertmacro GoogleAnalytics "Installer" "Welcome" "" "" | 669 | !insertmacro GoogleAnalytics "Installer" "Welcome" "" "" |
| 590 | !insertmacro DownloadSlideshowImages | 670 | !insertmacro DownloadSlideshowImages |
| 591 | FunctionEnd | 671 | FunctionEnd |
| 592 | Function PageLicensePre | 672 | Function PageLicensePre |
| 673 | !insertmacro LogStep "Installer" "License" "" "" | ||
| 593 | !insertmacro GoogleAnalytics "Installer" "License" "" "" | 674 | !insertmacro GoogleAnalytics "Installer" "License" "" "" |
| 594 | FunctionEnd | 675 | FunctionEnd |
| 595 | Function PageDirectoryPre | 676 | Function PageDirectoryPre |
| 596 | !insertmacro MaybeSkipPage | 677 | !insertmacro MaybeSkipPage |
| 678 | !insertmacro LogStep "Installer" "Directory" "" "" | ||
| 597 | !insertmacro GoogleAnalytics "Installer" "Directory" "" "" | 679 | !insertmacro GoogleAnalytics "Installer" "Directory" "" "" |
| 598 | FunctionEnd | 680 | FunctionEnd |
| 599 | Function PageStartMenuPre | 681 | Function PageStartMenuPre |
| 600 | !insertmacro MaybeSkipPage | 682 | !insertmacro MaybeSkipPage |
| 683 | !insertmacro LogStep "Installer" "StartMenu" "" "" | ||
| 601 | !insertmacro GoogleAnalytics "Installer" "StartMenu" "" "" | 684 | !insertmacro GoogleAnalytics "Installer" "StartMenu" "" "" |
| 602 | FunctionEnd | 685 | FunctionEnd |
| 603 | Function PageComponentsPre | 686 | Function PageComponentsPre |
| 604 | !insertmacro MaybeSkipPage | 687 | !insertmacro MaybeSkipPage |
| 688 | !insertmacro LogStep "Installer" "Components" "" "" | ||
| 605 | !insertmacro GoogleAnalytics "Installer" "Components" "" "" | 689 | !insertmacro GoogleAnalytics "Installer" "Components" "" "" |
| 606 | FunctionEnd | 690 | FunctionEnd |
| 607 | Function PageInstallFilesPre | 691 | Function PageInstallFilesPre |
| 692 | !insertmacro LogStep "Installer" "Install" "" "" | ||
| 608 | !insertmacro GoogleAnalytics "Installer" "Install" "" "" | 693 | !insertmacro GoogleAnalytics "Installer" "Install" "" "" |
| 609 | FunctionEnd | 694 | FunctionEnd |
| 610 | 695 | ||
| 611 | !macro SetInstallOption Checkbox OptionName Default | 696 | !macro SetInstallOption Checkbox OptionName Default |
| 697 | ${LogText} "SetInstallOption ${OptionName} ${Default}" | ||
| 612 | ; reads the value for the given install option to the registry | 698 | ; reads the value for the given install option to the registry |
| 613 | ReadRegStr $0 HKLM "@REGISTRY_HKLM_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\@POST_INSTALL_OPTIONS_REG_GROUP@" "${OptionName}" | 699 | ReadRegStr $0 HKLM "@REGISTRY_HKLM_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\@POST_INSTALL_OPTIONS_REG_GROUP@" "${OptionName}" |
| 614 | 700 | ||
| @@ -625,6 +711,7 @@ FunctionEnd · 10 unmodified lines | |||
| 625 | !macroend | 711 | !macroend |
| 626 | 712 | ||
| 627 | Function InstallTypesPage | 713 | Function InstallTypesPage |
| 714 | !insertmacro LogStep "Installer" "Install Types" "" "" | ||
| 628 | !insertmacro GoogleAnalytics "Installer" "Install Types" "" "" | 715 | !insertmacro GoogleAnalytics "Installer" "Install Types" "" "" |
| 629 | 716 | ||
| 630 | !insertmacro MUI_HEADER_TEXT "Choose Installation Type" "Express or Custom Install" | 717 | !insertmacro MUI_HEADER_TEXT "Choose Installation Type" "Express or Custom Install" |
| @@ -688,6 +775,7 @@ FunctionEnd · 57 unmodified lines | |||
| 688 | 775 | ||
| 689 | Function StartInstallSlideshow | 776 | Function StartInstallSlideshow |
| 690 | ; create a slideshow file based on what files we have available | 777 | ; create a slideshow file based on what files we have available |
| 778 | ${LogText} "Start Installs Slideshow" | ||
| 691 | 779 | ||
| 692 | ; stash $0 and $1 | 780 | ; stash $0 and $1 |
| 693 | Push $0 | 781 | Push $0 |
| @@ -730,7 +818,11 @@ Function StartInstallSlideshow · 36 unmodified lines | |||
| 730 | FunctionEnd | 818 | FunctionEnd |
| 731 | 819 | ||
| 732 | Function PostInstallOptionsPage | 820 | Function PostInstallOptionsPage |
| 821 | |||
| 822 | ${LogText} "Install Directory: $INSTDIR" | ||
| 823 | |||
| 733 | !insertmacro MaybeSkipPage | 824 | !insertmacro MaybeSkipPage |
| 825 | !insertmacro LogStep "Installer" "Post Install Options" "" "" | ||
| 734 | !insertmacro GoogleAnalytics "Installer" "Post Install Options" "" "" | 826 | !insertmacro GoogleAnalytics "Installer" "Post Install Options" "" "" |
| 735 | 827 | ||
| 736 | !insertmacro MUI_HEADER_TEXT "Setup Options" "" | 828 | !insertmacro MUI_HEADER_TEXT "Setup Options" "" |
| @@ -876,30 +968,43 @@ Function ReadPostInstallOptions · 139 unmodified lines | |||
| 876 | 968 | ||
| 877 | ; check if the user asked for a desktop shortcut to console | 969 | ; check if the user asked for a desktop shortcut to console |
| 878 | ${NSD_GetState} $DesktopConsoleCheckbox $DesktopConsoleState | 970 | ${NSD_GetState} $DesktopConsoleCheckbox $DesktopConsoleState |
| 879 | 971 | ${LogText} "Option: Start Desktop Console: $DesktopConsoleState" | |
| 972 | |||
| 880 | ; check if the user asked to have console launched every startup | 973 | ; check if the user asked to have console launched every startup |
| 881 | ${NSD_GetState} $ConsoleStartupCheckbox $ConsoleStartupState | 974 | ${NSD_GetState} $ConsoleStartupCheckbox $ConsoleStartupState |
| 975 | ${LogText} "Option: Start Desktop Console On Startup: $ConsoleStartupState" | ||
| 882 | 976 | ||
| 977 | ${If} @SERVER_COMPONENT_CONDITIONAL@ | ||
| 978 | ${LogText} "Option: Install Server" | ||
| 979 | ${EndIf} | ||
| 980 | |||
| 883 | ${If} @CLIENT_COMPONENT_CONDITIONAL@ | 981 | ${If} @CLIENT_COMPONENT_CONDITIONAL@ |
| 982 | ${LogText} "Option: Install Client" | ||
| 884 | ; check if the user asked for a desktop shortcut to High Fidelity | 983 | ; check if the user asked for a desktop shortcut to High Fidelity |
| 885 | ${NSD_GetState} $DesktopClientCheckbox $DesktopClientState | 984 | ${NSD_GetState} $DesktopClientCheckbox $DesktopClientState |
| 985 | ${LogText} "Option: Create Client Desktop Shortcut: $DesktopClientState" | ||
| 886 | ${EndIf} | 986 | ${EndIf} |
| 887 | 987 | ||
| 888 | ${If} @PR_BUILD@ == 1 | 988 | ${If} @PR_BUILD@ == 1 |
| 989 | ${LogText} "Option: PR Build" | ||
| 889 | ; check if we need to copy settings/content from production for this PR build | 990 | ; check if we need to copy settings/content from production for this PR build |
| 890 | ${NSD_GetState} $CopyFromProductionCheckbox $CopyFromProductionState | 991 | ${NSD_GetState} $CopyFromProductionCheckbox $CopyFromProductionState |
| 992 | ${LogText} "Option: Copy Settings From Production: $CopyFromProductionState" | ||
| 891 | ${EndIf} | 993 | ${EndIf} |
| 892 | 994 | ||
| 893 | ; check if we need to launch the console post-install | 995 | ; check if we need to launch the console post-install |
| 894 | ${NSD_GetState} $LaunchConsoleNowCheckbox $LaunchConsoleNowState | 996 | ${NSD_GetState} $LaunchConsoleNowCheckbox $LaunchConsoleNowState |
| 997 | ${LogText} "Option: Launch Console Now: $LaunchConsoleNowState" | ||
| 895 | 998 | ||
| 896 | ${If} @CLIENT_COMPONENT_CONDITIONAL@ | 999 | ${If} @CLIENT_COMPONENT_CONDITIONAL@ |
| 897 | ; check if we need to launch the client post-install | 1000 | ; check if we need to launch the client post-install |
| 898 | ${NSD_GetState} $LaunchClientNowCheckbox $LaunchClientNowState | 1001 | ${NSD_GetState} $LaunchClientNowCheckbox $LaunchClientNowState |
| 1002 | ${LogText} "Option: Launch Client Now: $LaunchClientNowState" | ||
| 899 | ${EndIf} | 1003 | ${EndIf} |
| 900 | 1004 | ||
| 901 | ; check if the user asked for a clean install | 1005 | ; check if the user asked for a clean install |
| 902 | ${NSD_GetState} $CleanInstallCheckbox $CleanInstallState | 1006 | ${NSD_GetState} $CleanInstallCheckbox $CleanInstallState |
| 1007 | ${LogText} "Option: Clean Install: $CleanInstallState" | ||
| 903 | FunctionEnd | 1008 | FunctionEnd |
| 904 | 1009 | ||
| 905 | Function HandlePostInstallOptions | 1010 | Function HandlePostInstallOptions |
| @@ -1225,6 +1330,7 @@ Section "-Core installation" · 319 unmodified lines | |||
| 1225 | ; Handle whichever post install options were set | 1330 | ; Handle whichever post install options were set |
| 1226 | Call HandlePostInstallOptions | 1331 | Call HandlePostInstallOptions |
| 1227 | 1332 | ||
| 1333 | !insertmacro LogStep "Installer" "Done" "" "" | ||
| 1228 | !insertmacro GoogleAnalytics "Installer" "Done" "" "" | 1334 | !insertmacro GoogleAnalytics "Installer" "Done" "" "" |
| 1229 | SectionEnd | 1335 | SectionEnd |
| 1230 | 1336 | ||
| @@ -1232,7 +1338,6 @@ SectionEnd · 1 unmodified line | |||
| 1232 | 1338 | ||
| 1233 | !macro PromptForRunningApplication applicationName displayName action prompter | 1339 | !macro PromptForRunningApplication applicationName displayName action prompter |
| 1234 | !define UniqueID ${__LINE__} | 1340 | !define UniqueID ${__LINE__} |
| 1235 | |||
| 1236 | Prompt_${UniqueID}: | 1341 | Prompt_${UniqueID}: |
| 1237 | 1342 | ||
| 1238 | ${nsProcess::FindProcess} ${applicationName} $R0 | 1343 | ${nsProcess::FindProcess} ${applicationName} $R0 |
| @@ -1478,6 +1583,11 @@ InstallDirRegKey HKLM "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_RE · 239 unmodified lines | |||
| 1478 | 1583 | ||
| 1479 | Function .onInit | 1584 | Function .onInit |
| 1480 | 1585 | ||
| 1586 | Delete "$TEMP\hifi_install.log" | ||
| 1587 | ${LogSetFileName} "$TEMP\hifi_install.log" | ||
| 1588 | ${LogSetOn} | ||
| 1589 | ${LogText} "In .onInit" | ||
| 1590 | |||
| 1481 | !ifdef INNER | 1591 | !ifdef INNER |
| 1482 | ; If INNER is defined, then we aren't supposed to do anything except write out | 1592 | ; If INNER is defined, then we aren't supposed to do anything except write out |
| 1483 | ; the installer. This is better than processing a command line option as it means | 1593 | ; the installer. This is better than processing a command line option as it means |
| @@ -1495,6 +1605,7 @@ Function .onInit · 11 unmodified lines | |||
| 1495 | !insertmacro GoogleAnalytics "Installer" "Start" "$CampaignName" "" | 1605 | !insertmacro GoogleAnalytics "Installer" "Start" "$CampaignName" "" |
| 1496 | 1606 | ||
| 1497 | ; make sure none of the installed applications are still running | 1607 | ; make sure none of the installed applications are still running |
| 1608 | ${LogText} "Checking For Running Applications" | ||
| 1498 | !insertmacro CheckForRunningApplications "installed" "Installer" | 1609 | !insertmacro CheckForRunningApplications "installed" "Installer" |
| 1499 | ${nsProcess::Unload} | 1610 | ${nsProcess::Unload} |
| 1500 | 1611 | ||
| @@ -27,30 +27,8 @@ include_hifi_library_headers(graphics) · 26 unmodified lines | |||
| 27 | link_hifi_libraries(embedded-webserver networking shared avatars octree) | 27 | link_hifi_libraries(embedded-webserver networking shared avatars octree) |
| 28 | 28 | ||
| 29 | target_zlib() | 29 | target_zlib() |
| 30 | 30 | target_quazip() | |
| 31 | add_dependency_external_projects(quazip) | 31 | target_openssl() |
| 32 | |||
| 33 | find_package(QuaZip REQUIRED) | ||
| 34 | target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${QUAZIP_INCLUDE_DIRS}) | ||
| 35 | target_link_libraries(${TARGET_NAME} ${QUAZIP_LIBRARIES}) | ||
| 36 | |||
| 37 | if (WIN32) | ||
| 38 | add_paths_to_fixup_libs(${QUAZIP_DLL_PATH}) | ||
| 39 | endif () | ||
| 40 | |||
| 41 | # find OpenSSL | ||
| 42 | find_package(OpenSSL REQUIRED) | ||
| 43 | |||
| 44 | if (APPLE AND ${OPENSSL_INCLUDE_DIR} STREQUAL "/usr/include") | ||
| 45 | # this is a user on OS X using system OpenSSL, which is going to throw warnings since they're deprecating for their common crypto | ||
| 46 | message(WARNING "The found version of OpenSSL is the OS X system version. This will produce deprecation warnings." | ||
| 47 | "\nWe recommend you install a newer version (at least 1.0.1h) in a different directory and set OPENSSL_ROOT_DIR in your env so Cmake can find it.") | ||
| 48 | endif () | ||
| 49 | |||
| 50 | include_directories(SYSTEM "${OPENSSL_INCLUDE_DIR}") | ||
| 51 | |||
| 52 | # append OpenSSL to our list of libraries to link | ||
| 53 | target_link_libraries(${TARGET_NAME} ${OPENSSL_LIBRARIES}) | ||
| 54 | 32 | ||
| 55 | # libcrypto uses dlopen in libdl | 33 | # libcrypto uses dlopen in libdl |
| 56 | if (UNIX) | 34 | if (UNIX) |
| @@ -15,9 +15,18 @@ · 14 unmodified lines | |||
| 15 | #include <QDate> | 15 | #include <QDate> |
| 16 | #include <QtCore/QLoggingCategory> | 16 | #include <QtCore/QLoggingCategory> |
| 17 | 17 | ||
| 18 | #if !defined(__clang__) && defined(__GNUC__) | ||
| 19 | #pragma GCC diagnostic push | ||
| 20 | #pragma GCC diagnostic ignored "-Wsuggest-override" | ||
| 21 | #endif | ||
| 22 | |||
| 18 | #include <quazip5/quazipfile.h> | 23 | #include <quazip5/quazipfile.h> |
| 19 | #include <quazip5/quazipdir.h> | 24 | #include <quazip5/quazipdir.h> |
| 20 | 25 | ||
| 26 | #if !defined(__clang__) && defined(__GNUC__) | ||
| 27 | #pragma GCC diagnostic pop | ||
| 28 | #endif | ||
| 29 | |||
| 21 | #include <AssetClient.h> | 30 | #include <AssetClient.h> |
| 22 | #include <AssetRequest.h> | 31 | #include <AssetRequest.h> |
| 23 | #include <AssetUpload.h> | 32 | #include <AssetUpload.h> |
| @@ -11,8 +11,19 @@ · 10 unmodified lines | |||
| 11 | 11 | ||
| 12 | #include "ContentSettingsBackupHandler.h" | 12 | #include "ContentSettingsBackupHandler.h" |
| 13 | 13 | ||
| 14 | #if !defined(__clang__) && defined(__GNUC__) | ||
| 15 | #pragma GCC diagnostic push | ||
| 16 | #pragma GCC diagnostic ignored "-Wsuggest-override" | ||
| 17 | #endif | ||
| 18 | |||
| 14 | #include <quazip5/quazip.h> | 19 | #include <quazip5/quazip.h> |
| 15 | #include <quazip5/quazipfile.h> | 20 | #include <quazip5/quazipfile.h> |
| 21 | #include <quazip5/quazipdir.h> | ||
| 22 | |||
| 23 | #if !defined(__clang__) && defined(__GNUC__) | ||
| 24 | #pragma GCC diagnostic pop | ||
| 25 | #endif | ||
| 26 | |||
| 16 | 27 | ||
| 17 | ContentSettingsBackupHandler::ContentSettingsBackupHandler(DomainServerSettingsManager& domainServerSettingsManager) : | 28 | ContentSettingsBackupHandler::ContentSettingsBackupHandler(DomainServerSettingsManager& domainServerSettingsManager) : |
| 18 | _settingsManager(domainServerSettingsManager) | 29 | _settingsManager(domainServerSettingsManager) |
| @@ -13,9 +13,18 @@ · 12 unmodified lines | |||
| 13 | 13 | ||
| 14 | #include <QDebug> | 14 | #include <QDebug> |
| 15 | 15 | ||
| 16 | #if !defined(__clang__) && defined(__GNUC__) | ||
| 17 | #pragma GCC diagnostic push | ||
| 18 | #pragma GCC diagnostic ignored "-Wsuggest-override" | ||
| 19 | #endif | ||
| 20 | |||
| 16 | #include <quazip5/quazip.h> | 21 | #include <quazip5/quazip.h> |
| 17 | #include <quazip5/quazipfile.h> | 22 | #include <quazip5/quazipfile.h> |
| 18 | 23 | ||
| 24 | #if !defined(__clang__) && defined(__GNUC__) | ||
| 25 | #pragma GCC diagnostic pop | ||
| 26 | #endif | ||
| 27 | |||
| 19 | #include <OctreeDataUtils.h> | 28 | #include <OctreeDataUtils.h> |
| 20 | 29 | ||
| 21 | EntitiesBackupHandler::EntitiesBackupHandler(QString entitiesFilePath, QString entitiesReplacementFilePath) : | 30 | EntitiesBackupHandler::EntitiesBackupHandler(QString entitiesFilePath, QString entitiesReplacementFilePath) : |
| @@ -190,8 +190,6 @@ if (WIN32) · 189 unmodified lines | |||
| 190 | add_dependency_external_projects(sixense) | 190 | add_dependency_external_projects(sixense) |
| 191 | endif () | 191 | endif () |
| 192 | 192 | ||
| 193 | add_dependency_external_projects(sdl2) | ||
| 194 | add_dependency_external_projects(OpenVR) | ||
| 195 | add_dependency_external_projects(neuron) | 193 | add_dependency_external_projects(neuron) |
| 196 | add_dependency_external_projects(wasapi) | 194 | add_dependency_external_projects(wasapi) |
| 197 | add_dependency_external_projects(steamworks) | 195 | add_dependency_external_projects(steamworks) |
| @@ -1,7 +1,7 @@ | |||
| 1 | import QtQuick 2.5 | 1 | import QtQuick 2.5 |
| 2 | 2 | ||
| 3 | import "../../qml/controls-uit" | 3 | import controlsUit 1.0 |
| 4 | import "../../qml/styles-uit" | 4 | import stylesUit 1.0 |
| 5 | 5 | ||
| 6 | Item { | 6 | Item { |
| 7 | id: menu | 7 | id: menu |
| @@ -1,7 +1,7 @@ | |||
| 1 | import QtQuick 2.5 | 1 | import QtQuick 2.5 |
| 2 | 2 | ||
| 3 | import "../../qml/controls-uit" | 3 | import controlsUit 1.0 |
| 4 | import "../../qml/styles-uit" | 4 | import stylesUit 1.0 |
| 5 | 5 | ||
| 6 | Item { | 6 | Item { |
| 7 | id: root | 7 | id: root |
| @@ -1,7 +1,7 @@ | |||
| 1 | import QtQuick 2.5 | 1 | import QtQuick 2.5 |
| 2 | 2 | ||
| 3 | import "../../qml/controls-uit" | 3 | import controlsUit 1.0 |
| 4 | import "../../qml/styles-uit" | 4 | import stylesUit 1.0 |
| 5 | import "../../qml/dialogs" | 5 | import "../../qml/dialogs" |
| 6 | 6 | ||
| 7 | QtObject { | 7 | QtObject { |
Binary file not shown.
| @@ -0,0 +1,160 @@ | |||
| 1 | { | ||
| 2 | "version": "1.1", | ||
| 3 | "root": { | ||
| 4 | "id": "networkAnimStateMachine", | ||
| 5 | "type": "stateMachine", | ||
| 6 | "data": { | ||
| 7 | "currentState": "transitAnimStateMachine", | ||
| 8 | "states": [ | ||
| 9 | { | ||
| 10 | "id": "transitAnimStateMachine", | ||
| 11 | "interpTarget": 6, | ||
| 12 | "interpDuration": 6, | ||
| 13 | "transitions": [ | ||
| 14 | { "var": "userNetworkAnimA", "state": "userNetworkAnimA" }, | ||
| 15 | { "var": "userNetworkAnimB", "state": "userNetworkAnimB" } | ||
| 16 | ] | ||
| 17 | }, | ||
| 18 | { | ||
| 19 | "id": "userNetworkAnimA", | ||
| 20 | "interpTarget": 6, | ||
| 21 | "interpDuration": 6, | ||
| 22 | "transitions": [ | ||
| 23 | { "var": "transitAnimStateMachine", "state": "transitAnimStateMachine" }, | ||
| 24 | { "var": "userNetworkAnimB", "state": "userNetworkAnimB" } | ||
| 25 | ] | ||
| 26 | }, | ||
| 27 | { | ||
| 28 | "id": "userNetworkAnimB", | ||
| 29 | "interpTarget": 6, | ||
| 30 | "interpDuration": 6, | ||
| 31 | "transitions": [ | ||
| 32 | { "var": "transitAnimStateMachine", "state": "transitAnimStateMachine" }, | ||
| 33 | { "var": "userNetworkAnimA", "state": "userNetworkAnimA" } | ||
| 34 | ] | ||
| 35 | } | ||
| 36 | ] | ||
| 37 | }, | ||
| 38 | "children": [ | ||
| 39 | { | ||
| 40 | "id": "transitAnimStateMachine", | ||
| 41 | "type": "stateMachine", | ||
| 42 | "data": { | ||
| 43 | "currentState": "idleAnim", | ||
| 44 | "states": [ | ||
| 45 | { | ||
| 46 | "id": "idleAnim", | ||
| 47 | "interpTarget": 6, | ||
| 48 | "interpDuration": 6, | ||
| 49 | "transitions": [ | ||
| 50 | { "var": "postTransitAnim", "state": "postTransitAnim" }, | ||
| 51 | { "var": "preTransitAnim", "state": "preTransitAnim" } | ||
| 52 | ] | ||
| 53 | }, | ||
| 54 | { | ||
| 55 | "id": "preTransitAnim", | ||
| 56 | "interpTarget": 4, | ||
| 57 | "interpDuration": 4, | ||
| 58 | "transitions": [ | ||
| 59 | { "var": "idleAnim", "state": "idleAnim" }, | ||
| 60 | { "var": "transitAnim", "state": "transitAnim" } | ||
| 61 | ] | ||
| 62 | }, | ||
| 63 | { | ||
| 64 | "id": "transitAnim", | ||
| 65 | "interpTarget": 2, | ||
| 66 | "interpDuration": 2, | ||
| 67 | "transitions": [ | ||
| 68 | { "var": "preTransitAnim", "state": "preTransitAnim" }, | ||
| 69 | { "var": "postTransitAnim", "state": "postTransitAnim" } | ||
| 70 | ] | ||
| 71 | }, | ||
| 72 | { | ||
| 73 | "id": "postTransitAnim", | ||
| 74 | "interpTarget": 4, | ||
| 75 | "interpDuration": 4, | ||
| 76 | "transitions": [ | ||
| 77 | { "var": "transitAnim", "state": "transitAnim" }, | ||
| 78 | { "var": "idleAnim", "state": "idleAnim" } | ||
| 79 | ] | ||
| 80 | } | ||
| 81 | ] | ||
| 82 | }, | ||
| 83 | "children" : [ | ||
| 84 | { | ||
| 85 | "id": "idleAnim", | ||
| 86 | "type": "clip", | ||
| 87 | "data": { | ||
| 88 | "url": "qrc:///avatar/animations/idle.fbx", | ||
| 89 | "startFrame": 0.0, | ||
| 90 | "endFrame": 90.0, | ||
| 91 | "timeScale": 1.0, | ||
| 92 | "loopFlag": true | ||
| 93 | }, | ||
| 94 | "children": [] | ||
| 95 | }, | ||
| 96 | { | ||
| 97 | "id": "preTransitAnim", | ||
| 98 | "type": "clip", | ||
| 99 | "data": { | ||
| 100 | "url": "qrc:///avatar/animations/teleport.fbx", | ||
| 101 | "startFrame": 0.0, | ||
| 102 | "endFrame": 10.0, | ||
| 103 | "timeScale": 1.0, | ||
| 104 | "loopFlag": false | ||
| 105 | }, | ||
| 106 | "children": [] | ||
| 107 | }, | ||
| 108 | { | ||
| 109 | "id": "transitAnim", | ||
| 110 | "type": "clip", | ||
| 111 | "data": { | ||
| 112 | "url": "qrc:///avatar/animations/teleport.fbx", | ||
| 113 | "startFrame": 11.0, | ||
| 114 | "endFrame": 18.0, | ||
| 115 | "timeScale": 1.0, | ||
| 116 | "loopFlag": false | ||
| 117 | }, | ||
| 118 | "children": [] | ||
| 119 | }, | ||
| 120 | { | ||
| 121 | "id": "postTransitAnim", | ||
| 122 | "type": "clip", | ||
| 123 | "data": { | ||
| 124 | "url": "qrc:///avatar/animations/teleport.fbx", | ||
| 125 | "startFrame": 19.0, | ||
| 126 | "endFrame": 44.0, | ||
| 127 | "timeScale": 1.0, | ||
| 128 | "loopFlag": false | ||
| 129 | }, | ||
| 130 | "children": [] | ||
| 131 | } | ||
| 132 | ] | ||
| 133 | }, | ||
| 134 | { | ||
| 135 | "id": "userNetworkAnimA", | ||
| 136 | "type": "clip", | ||
| 137 | "data": { | ||
| 138 | "url": "qrc:///avatar/animations/idle.fbx", | ||
| 139 | "startFrame": 0.0, | ||
| 140 | "endFrame": 90.0, | ||
| 141 | "timeScale": 1.0, | ||
| 142 | "loopFlag": true | ||
| 143 | }, | ||
| 144 | "children": [] | ||
| 145 | }, | ||
| 146 | { | ||
| 147 | "id": "userNetworkAnimB", | ||
| 148 | "type": "clip", | ||
| 149 | "data": { | ||
| 150 | "url": "qrc:///avatar/animations/idle.fbx", | ||
| 151 | "startFrame": 0.0, | ||
| 152 | "endFrame": 90.0, | ||
| 153 | "timeScale": 1.0, | ||
| 154 | "loopFlag": true | ||
| 155 | }, | ||
| 156 | "children": [] | ||
| 157 | } | ||
| 158 | ] | ||
| 159 | } | ||
| 160 | } | ||
| @@ -0,0 +1,2476 @@ | |||
| 1 | { | ||
| 2 | "anchor": { | ||
| 3 | "dimensions": { | ||
| 4 | "x": 0.023600000888109207, | ||
| 5 | "y": 0.022600000724196434, | ||
| 6 | "z": 0.1274999976158142 | ||
| 7 | }, | ||
| 8 | "position": { | ||
| 9 | "x": 0.006292800903320312, | ||
| 10 | "y": 0.004300000742077827, | ||
| 11 | "z": 0.005427663803100586 | ||
| 12 | }, | ||
| 13 | "rotation": { | ||
| 14 | "w": 1.000, | ||
| 15 | "x": 0.000, | ||
| 16 | "y": 0.000, | ||
| 17 | "z": 0.000 | ||
| 18 | } | ||
| 19 | }, | ||
| 20 | "textDisplay": { | ||
| 21 | "dimensions": { | ||
| 22 | "x": 0.15, | ||
| 23 | "y": 0.045, | ||
| 24 | "z": 0.1 | ||
| 25 | }, | ||
| 26 | "localPosition": { | ||
| 27 | "x": -0.3032040786743164, | ||
| 28 | "y": 0.059300000742077827, | ||
| 29 | "z": 0.06454843521118164 | ||
| 30 | }, | ||
| 31 | "localOrientation": { | ||
| 32 | "w": 0.000, | ||
| 33 | "x": 0.000, | ||
| 34 | "y": 0.906, | ||
| 35 | "z": 0.423 | ||
| 36 | }, | ||
| 37 | "leftMargin": 0.0, | ||
| 38 | "rightMargin": 0.0, | ||
| 39 | "topMargin": 0.0, | ||
| 40 | "bottomMargin": 0.0, | ||
| 41 | "lineHeight": 0.05 | ||
| 42 | }, | ||
| 43 | "useResourcesPath": true, | ||
| 44 | "layers": [ | ||
| 45 | [ | ||
| 46 | { | ||
| 47 | "dimensions": { | ||
| 48 | "x": 0.04787999764084816, | ||
| 49 | "z": 0.02051999792456627, | ||
| 50 | "y": 0.04787999764084816 | ||
| 51 | }, | ||
| 52 | "position": { | ||
| 53 | "x": -0.5332040786743164, | ||
| 54 | "y": 0.019300000742077827, | ||
| 55 | "z": 0.03745675086975098 | ||
| 56 | }, | ||
| 57 | "key": "p", | ||
| 58 | "texture": { | ||
| 59 | "file9": "meshes/keyboard/key_p.png", | ||
| 60 | "file10": "meshes/keyboard/key_p.png" | ||
| 61 | }, | ||
| 62 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 63 | "localOrientation": { | ||
| 64 | "w": 0.000, | ||
| 65 | "x": 0.000, | ||
| 66 | "y": 0.707, | ||
| 67 | "z": 0.707 | ||
| 68 | } | ||
| 69 | }, | ||
| 70 | { | ||
| 71 | "dimensions": { | ||
| 72 | "x": 0.04787999764084816, | ||
| 73 | "z": 0.02051999792456627, | ||
| 74 | "y": 0.04787999764084816 | ||
| 75 | }, | ||
| 76 | "position": { | ||
| 77 | "x": -0.42067813873291016, | ||
| 78 | "y": 0.019300000742077827, | ||
| 79 | "z": 0.03744244575500488 | ||
| 80 | }, | ||
| 81 | "key": "i", | ||
| 82 | "texture": { | ||
| 83 | "file9": "meshes/keyboard/key_i.png", | ||
| 84 | "file10": "meshes/keyboard/key_i.png" | ||
| 85 | }, | ||
| 86 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 87 | "localOrientation": { | ||
| 88 | "w": 0.000, | ||
| 89 | "x": 0.000, | ||
| 90 | "y": 0.707, | ||
| 91 | "z": 0.707 | ||
| 92 | } | ||
| 93 | }, | ||
| 94 | { | ||
| 95 | "key": "o", | ||
| 96 | "dimensions": { | ||
| 97 | "x": 0.04787999764084816, | ||
| 98 | "z": 0.02051999792456627, | ||
| 99 | "y": 0.04787999764084816 | ||
| 100 | }, | ||
| 101 | "position": { | ||
| 102 | "x": -0.47769832611083984, | ||
| 103 | "y": 0.019300000742077827, | ||
| 104 | "z": 0.03745675086975098 | ||
| 105 | }, | ||
| 106 | "texture": { | ||
| 107 | "file9": "meshes/keyboard/key_o.png", | ||
| 108 | "file10": "meshes/keyboard/key_o.png" | ||
| 109 | }, | ||
| 110 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 111 | "localOrientation": { | ||
| 112 | "w": 0.000, | ||
| 113 | "x": 0.000, | ||
| 114 | "y": 0.707, | ||
| 115 | "z": 0.707 | ||
| 116 | } | ||
| 117 | }, | ||
| 118 | { | ||
| 119 | "dimensions": { | ||
| 120 | "x": 0.04787999764084816, | ||
| 121 | "z": 0.02051999792456627, | ||
| 122 | "y": 0.04787999764084816 | ||
| 123 | }, | ||
| 124 | "position": { | ||
| 125 | "x": -0.49904823303222656, | ||
| 126 | "y": 0.019300000742077827, | ||
| 127 | "z": -0.01745915412902832 | ||
| 128 | }, | ||
| 129 | "key": "l", | ||
| 130 | "texture": { | ||
| 131 | "file9": "meshes/keyboard/key_l.png", | ||
| 132 | "file10": "meshes/keyboard/key_l.png" | ||
| 133 | }, | ||
| 134 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 135 | "localOrientation": { | ||
| 136 | "w": 0.000, | ||
| 137 | "x": 0.000, | ||
| 138 | "y": 0.707, | ||
| 139 | "z": 0.707 | ||
| 140 | } | ||
| 141 | }, | ||
| 142 | { | ||
| 143 | "dimensions": { | ||
| 144 | "x": 0.04787999764084816, | ||
| 145 | "z": 0.02051999792456627, | ||
| 146 | "y": 0.04787999764084816 | ||
| 147 | }, | ||
| 148 | "position": { | ||
| 149 | "x": -0.4439973831176758, | ||
| 150 | "y": 0.019300000742077827, | ||
| 151 | "z": -0.01745915412902832 | ||
| 152 | }, | ||
| 153 | "key": "k", | ||
| 154 | "texture": { | ||
| 155 | "file9": "meshes/keyboard/key_k.png", | ||
| 156 | "file10": "meshes/keyboard/key_k.png" | ||
| 157 | }, | ||
| 158 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 159 | "localOrientation": { | ||
| 160 | "w": 0.000, | ||
| 161 | "x": 0.000, | ||
| 162 | "y": 0.707, | ||
| 163 | "z": 0.707 | ||
| 164 | } | ||
| 165 | }, | ||
| 166 | { | ||
| 167 | "key": "y", | ||
| 168 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 169 | "texture": { | ||
| 170 | "file9": "meshes/keyboard/key_y.png", | ||
| 171 | "file10": "meshes/keyboard/key_y.png" | ||
| 172 | }, | ||
| 173 | "dimensions": { | ||
| 174 | "x": 0.04787999764084816, | ||
| 175 | "z": 0.02051999792456627, | ||
| 176 | "y": 0.04787999764084816 | ||
| 177 | }, | ||
| 178 | "position": { | ||
| 179 | "x": -0.30902957916259766, | ||
| 180 | "y": 0.019300000742077827, | ||
| 181 | "z": 0.0374448299407959 | ||
| 182 | }, | ||
| 183 | "localOrientation": { | ||
| 184 | "w": 0.000, | ||
| 185 | "x": 0.000, | ||
| 186 | "y": 0.707, | ||
| 187 | "z": 0.707 | ||
| 188 | } | ||
| 189 | }, | ||
| 190 | { | ||
| 191 | "key": "r", | ||
| 192 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 193 | "texture": { | ||
| 194 | "file9": "meshes/keyboard/key_r.png", | ||
| 195 | "file10": "meshes/keyboard/key_r.png" | ||
| 196 | }, | ||
| 197 | "dimensions": { | ||
| 198 | "x": 0.04787999764084816, | ||
| 199 | "z": 0.020519999787211418, | ||
| 200 | "y": 0.04787999764084816 | ||
| 201 | }, | ||
| 202 | "position": { | ||
| 203 | "x": -0.19474029541015625, | ||
| 204 | "y": 0.019300000742077827, | ||
| 205 | "z": 0.03745102882385254 | ||
| 206 | }, | ||
| 207 | "localOrientation": { | ||
| 208 | "w": 0.000, | ||
| 209 | "x": 0.000, | ||
| 210 | "y": 0.707, | ||
| 211 | "z": 0.707 | ||
| 212 | } | ||
| 213 | }, | ||
| 214 | { | ||
| 215 | "key": "d", | ||
| 216 | "texture": { | ||
| 217 | "file9": "meshes/keyboard/key_d.png", | ||
| 218 | "file10": "meshes/keyboard/key_d.png" | ||
| 219 | }, | ||
| 220 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 221 | "dimensions": { | ||
| 222 | "x": 0.04787999764084816, | ||
| 223 | "z": 0.02051999792456627, | ||
| 224 | "y": 0.04787999764084816 | ||
| 225 | }, | ||
| 226 | "position": { | ||
| 227 | "x": -0.16272640228271484, | ||
| 228 | "y": 0.019300000742077827, | ||
| 229 | "z": -0.01747274398803711 | ||
| 230 | }, | ||
| 231 | "localOrientation": { | ||
| 232 | "w": 0.000, | ||
| 233 | "x": 0.000, | ||
| 234 | "y": 0.707, | ||
| 235 | "z": 0.707 | ||
| 236 | } | ||
| 237 | }, | ||
| 238 | { | ||
| 239 | "key": "t", | ||
| 240 | "texture": { | ||
| 241 | "file9": "meshes/keyboard/key_t.png", | ||
| 242 | "file10": "meshes/keyboard/key_t.png" | ||
| 243 | }, | ||
| 244 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 245 | "dimensions": { | ||
| 246 | "x": 0.04787999764084816, | ||
| 247 | "z": 0.02051999792456627, | ||
| 248 | "y": 0.04787999764084816 | ||
| 249 | }, | ||
| 250 | "position": { | ||
| 251 | "x": -0.2517843246459961, | ||
| 252 | "y": 0.019300000742077827, | ||
| 253 | "z": 0.03744622692465782 | ||
| 254 | }, | ||
| 255 | "localOrientation": { | ||
| 256 | "w": 0.000, | ||
| 257 | "x": 0.000, | ||
| 258 | "y": 0.707, | ||
| 259 | "z": 0.707 | ||
| 260 | } | ||
| 261 | }, | ||
| 262 | { | ||
| 263 | "key": "f", | ||
| 264 | "texture": { | ||
| 265 | "file9": "meshes/keyboard/key_f.png", | ||
| 266 | "file10": "meshes/keyboard/key_f.png" | ||
| 267 | }, | ||
| 268 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 269 | "dimensions": { | ||
| 270 | "x": 0.04787999764084816, | ||
| 271 | "z": 0.02051999792456627, | ||
| 272 | "y": 0.04787999764084816 | ||
| 273 | }, | ||
| 274 | "position": { | ||
| 275 | "x": -0.2200756072998047, | ||
| 276 | "y": 0.019300000742077827, | ||
| 277 | "z": -0.01746511459350586 | ||
| 278 | }, | ||
| 279 | "localOrientation": { | ||
| 280 | "w": 0.000, | ||
| 281 | "x": 0.000, | ||
| 282 | "y": 0.707, | ||
| 283 | "z": 0.707 | ||
| 284 | } | ||
| 285 | }, | ||
| 286 | { | ||
| 287 | "key": "g", | ||
| 288 | "texture": { | ||
| 289 | "file9": "meshes/keyboard/key_g.png", | ||
| 290 | "file10": "meshes/keyboard/key_g.png" | ||
| 291 | }, | ||
| 292 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 293 | "dimensions": { | ||
| 294 | "x": 0.04787999764084816, | ||
| 295 | "z": 0.02051999792456627, | ||
| 296 | "y": 0.04787999764084816 | ||
| 297 | }, | ||
| 298 | "position": { | ||
| 299 | "x": -0.27622222900390625, | ||
| 300 | "y": 0.019300000742077827, | ||
| 301 | "z": -0.017457084730267525 | ||
| 302 | }, | ||
| 303 | "localOrientation": { | ||
| 304 | "w": 0.000, | ||
| 305 | "x": 0.000, | ||
| 306 | "y": 0.707, | ||
| 307 | "z": 0.707 | ||
| 308 | } | ||
| 309 | }, | ||
| 310 | { | ||
| 311 | "key": "w", | ||
| 312 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 313 | "texture": { | ||
| 314 | "file9": "meshes/keyboard/key_w.png", | ||
| 315 | "file10": "meshes/keyboard/key_w.png" | ||
| 316 | }, | ||
| 317 | "dimensions": { | ||
| 318 | "x": 0.04787999764084816, | ||
| 319 | "z": 0.02051999792456627, | ||
| 320 | "y": 0.04787999764084816 | ||
| 321 | }, | ||
| 322 | "position": { | ||
| 323 | "x": -0.08203601837158203, | ||
| 324 | "y": 0.019300000742077827, | ||
| 325 | "z": 0.03743100166320801 | ||
| 326 | }, | ||
| 327 | "localOrientation": { | ||
| 328 | "w": 0.000, | ||
| 329 | "x": 0.000, | ||
| 330 | "y": 0.707, | ||
| 331 | "z": 0.707 | ||
| 332 | } | ||
| 333 | }, | ||
| 334 | { | ||
| 335 | "key": "q", | ||
| 336 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 337 | "texture": { | ||
| 338 | "file9": "meshes/keyboard/key_q.png", | ||
| 339 | "file10": "meshes/keyboard/key_q.png" | ||
| 340 | }, | ||
| 341 | "dimensions": { | ||
| 342 | "x": 0.04787999764084816, | ||
| 343 | "z": 0.02051999792456627, | ||
| 344 | "y": 0.04787999764084816 | ||
| 345 | }, | ||
| 346 | "position": { | ||
| 347 | "x": -0.026292800903320312, | ||
| 348 | "y": 0.019300000742077827, | ||
| 349 | "z": 0.037427663803100586 | ||
| 350 | }, | ||
| 351 | "localOrientation": { | ||
| 352 | "w": 0.000, | ||
| 353 | "x": 0.000, | ||
| 354 | "y": 0.707, | ||
| 355 | "z": 0.707 | ||
| 356 | } | ||
| 357 | }, | ||
| 358 | { | ||
| 359 | "key": "a", | ||
| 360 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 361 | "texture": { | ||
| 362 | "file9": "meshes/keyboard/key_a.png", | ||
| 363 | "file10": "meshes/keyboard/key_a.png" | ||
| 364 | }, | ||
| 365 | "dimensions": { | ||
| 366 | "x": 0.04787999764084816, | ||
| 367 | "z": 0.02051999792456627, | ||
| 368 | "y": 0.04787999764084816 | ||
| 369 | }, | ||
| 370 | "position": { | ||
| 371 | "x": -0.050909996032714844, | ||
| 372 | "y": 0.019300000742077827, | ||
| 373 | "z": -0.017487764358520508 | ||
| 374 | }, | ||
| 375 | "localOrientation": { | ||
| 376 | "w": 0.000, | ||
| 377 | "x": 0.000, | ||
| 378 | "y": 0.707, | ||
| 379 | "z": 0.707 | ||
| 380 | } | ||
| 381 | }, | ||
| 382 | { | ||
| 383 | "key": "e", | ||
| 384 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 385 | "texture": { | ||
| 386 | "file9": "meshes/keyboard/key_e.png", | ||
| 387 | "file10": "meshes/keyboard/key_e.png" | ||
| 388 | }, | ||
| 389 | "dimensions": { | ||
| 390 | "x": 0.04787999764084816, | ||
| 391 | "z": 0.02051999792456627, | ||
| 392 | "y": 0.04787999764084816 | ||
| 393 | }, | ||
| 394 | "position": { | ||
| 395 | "x": -0.13773441314697266, | ||
| 396 | "y": 0.019300000742077827, | ||
| 397 | "z": 0.03745269775390625 | ||
| 398 | }, | ||
| 399 | "localOrientation": { | ||
| 400 | "w": 0.000, | ||
| 401 | "x": 0.000, | ||
| 402 | "y": 0.707, | ||
| 403 | "z": 0.707 | ||
| 404 | } | ||
| 405 | }, | ||
| 406 | { | ||
| 407 | "key": "s", | ||
| 408 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 409 | "texture": { | ||
| 410 | "file9": "meshes/keyboard/key_s.png", | ||
| 411 | "file10": "meshes/keyboard/key_s.png" | ||
| 412 | }, | ||
| 413 | "dimensions": { | ||
| 414 | "x": 0.04787999764084816, | ||
| 415 | "z": 0.02051999792456627, | ||
| 416 | "y": 0.04787999764084816 | ||
| 417 | }, | ||
| 418 | "position": { | ||
| 419 | "x": -0.10659980773925781, | ||
| 420 | "y": 0.019300000742077827, | ||
| 421 | "z": -0.017481565475463867 | ||
| 422 | }, | ||
| 423 | "localOrientation": { | ||
| 424 | "w": 0.000, | ||
| 425 | "x": 0.000, | ||
| 426 | "y": 0.707, | ||
| 427 | "z": 0.707 | ||
| 428 | } | ||
| 429 | }, | ||
| 430 | { | ||
| 431 | "key": "u", | ||
| 432 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 433 | "texture": { | ||
| 434 | "file9": "meshes/keyboard/key_u.png", | ||
| 435 | "file10": "meshes/keyboard/key_u.png" | ||
| 436 | }, | ||
| 437 | "dimensions": { | ||
| 438 | "x": 0.04787999764084816, | ||
| 439 | "z": 0.02051999792456627, | ||
| 440 | "y": 0.04787999764084816 | ||
| 441 | }, | ||
| 442 | "position": { | ||
| 443 | "x": -0.36423587799072266, | ||
| 444 | "y": 0.019300000742077827, | ||
| 445 | "z": 0.03743577003479004 | ||
| 446 | }, | ||
| 447 | "localOrientation": { | ||
| 448 | "w": 0.000, | ||
| 449 | "x": 0.000, | ||
| 450 | "y": 0.707, | ||
| 451 | "z": 0.707 | ||
| 452 | } | ||
| 453 | }, | ||
| 454 | { | ||
| 455 | "key": "h", | ||
| 456 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 457 | "texture": { | ||
| 458 | "file9": "meshes/keyboard/key_h.png", | ||
| 459 | "file10": "meshes/keyboard/key_h.png" | ||
| 460 | }, | ||
| 461 | "dimensions": { | ||
| 462 | "x": 0.04787999764084816, | ||
| 463 | "z": 0.02051999792456627, | ||
| 464 | "y": 0.04787999764084816 | ||
| 465 | }, | ||
| 466 | "position": { | ||
| 467 | "x": -0.3321561813354492, | ||
| 468 | "y": 0.019300000742077827, | ||
| 469 | "z": -0.017461776733398438 | ||
| 470 | }, | ||
| 471 | "localOrientation": { | ||
| 472 | "w": 0.000, | ||
| 473 | "x": 0.000, | ||
| 474 | "y": 0.707, | ||
| 475 | "z": 0.707 | ||
| 476 | } | ||
| 477 | }, | ||
| 478 | { | ||
| 479 | "key": "j", | ||
| 480 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 481 | "texture": { | ||
| 482 | "file9": "meshes/keyboard/key_j.png", | ||
| 483 | "file10": "meshes/keyboard/key_j.png" | ||
| 484 | }, | ||
| 485 | "dimensions": { | ||
| 486 | "x": 0.04787999764084816, | ||
| 487 | "z": 0.020519999787211418, | ||
| 488 | "y": 0.04787999764084816 | ||
| 489 | }, | ||
| 490 | "position": { | ||
| 491 | "x": -0.38753604888916016, | ||
| 492 | "y": 0.019300000742077827, | ||
| 493 | "z": -0.01746058464050293 | ||
| 494 | }, | ||
| 495 | "localOrientation": { | ||
| 496 | "w": 0.000, | ||
| 497 | "x": 0.000, | ||
| 498 | "y": 0.707, | ||
| 499 | "z": 0.707 | ||
| 500 | } | ||
| 501 | }, | ||
| 502 | { | ||
| 503 | "key": "c", | ||
| 504 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 505 | "texture": { | ||
| 506 | "file9": "meshes/keyboard/key_c.png", | ||
| 507 | "file10": "meshes/keyboard/key_c.png" | ||
| 508 | }, | ||
| 509 | "dimensions": { | ||
| 510 | "x": 0.04787999764084816, | ||
| 511 | "z": 0.02051999792456627, | ||
| 512 | "y": 0.04787999764084816 | ||
| 513 | }, | ||
| 514 | "position": { | ||
| 515 | "x": -0.22023773193359375, | ||
| 516 | "y": 0.019300000742077827, | ||
| 517 | "z": -0.07282757759094238 | ||
| 518 | }, | ||
| 519 | "localOrientation": { | ||
| 520 | "w": 0.000, | ||
| 521 | "x": 0.000, | ||
| 522 | "y": 0.707, | ||
| 523 | "z": 0.707 | ||
| 524 | } | ||
| 525 | }, | ||
| 526 | { | ||
| 527 | "key": "v", | ||
| 528 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 529 | "texture": { | ||
| 530 | "file9": "meshes/keyboard/key_v.png", | ||
| 531 | "file10": "meshes/keyboard/key_v.png" | ||
| 532 | }, | ||
| 533 | "dimensions": { | ||
| 534 | "x": 0.04787999764084816, | ||
| 535 | "z": 0.02051999792456627, | ||
| 536 | "y": 0.04787999764084816 | ||
| 537 | }, | ||
| 538 | "position": { | ||
| 539 | "x": -0.2767200469970703, | ||
| 540 | "y": 0.019300000742077827, | ||
| 541 | "z": -0.07291850447654724 | ||
| 542 | }, | ||
| 543 | "localOrientation": { | ||
| 544 | "w": 0.000, | ||
| 545 | "x": 0.000, | ||
| 546 | "y": 0.707, | ||
| 547 | "z": 0.707 | ||
| 548 | } | ||
| 549 | }, | ||
| 550 | { | ||
| 551 | "key": "b", | ||
| 552 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 553 | "texture": { | ||
| 554 | "file9": "meshes/keyboard/key_b.png", | ||
| 555 | "file10": "meshes/keyboard/key_b.png" | ||
| 556 | }, | ||
| 557 | "dimensions": { | ||
| 558 | "x": 0.04787999764084816, | ||
| 559 | "z": 0.020519999787211418, | ||
| 560 | "y": 0.04787999764084816 | ||
| 561 | }, | ||
| 562 | "position": { | ||
| 563 | "x": -0.33254528045654297, | ||
| 564 | "y": 0.019300000742077827, | ||
| 565 | "z": -0.07283258438110352 | ||
| 566 | }, | ||
| 567 | "localOrientation": { | ||
| 568 | "w": 0.000, | ||
| 569 | "x": 0.000, | ||
| 570 | "y": 0.707, | ||
| 571 | "z": 0.707 | ||
| 572 | } | ||
| 573 | }, | ||
| 574 | { | ||
| 575 | "key": " ", | ||
| 576 | "name": "space", | ||
| 577 | "dimensions": { | ||
| 578 | "x": 0.14597539603710175, | ||
| 579 | "z": 0.02051999792456627, | ||
| 580 | "y": 0.04787999764084816 | ||
| 581 | }, | ||
| 582 | "position": { | ||
| 583 | "x": -0.27660465240478516, | ||
| 584 | "y": 0.019300000742077827, | ||
| 585 | "z": -0.12705934047698975 | ||
| 586 | }, | ||
| 587 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 588 | "texture": { | ||
| 589 | "file9": "meshes/keyboard/white.png", | ||
| 590 | "file10": "meshes/keyboard/white.png" | ||
| 591 | }, | ||
| 592 | "localOrientation": { | ||
| 593 | "w": 0.000, | ||
| 594 | "x": 0.000, | ||
| 595 | "y": 0.707, | ||
| 596 | "z": 0.707 | ||
| 597 | } | ||
| 598 | }, | ||
| 599 | { | ||
| 600 | "key": "z", | ||
| 601 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 602 | "texture": { | ||
| 603 | "file9": "meshes/keyboard/key_z.png", | ||
| 604 | "file10": "meshes/keyboard/key_z.png" | ||
| 605 | }, | ||
| 606 | "dimensions": { | ||
| 607 | "x": 0.04787999764084816, | ||
| 608 | "z": 0.02051999792456627, | ||
| 609 | "y": 0.04787999764084816 | ||
| 610 | }, | ||
| 611 | "position": { | ||
| 612 | "x": -0.10669422149658203, | ||
| 613 | "y": 0.019300000742077827, | ||
| 614 | "z": -0.07285571098327637 | ||
| 615 | }, | ||
| 616 | "localOrientation": { | ||
| 617 | "w": 0.000, | ||
| 618 | "x": 0.000, | ||
| 619 | "y": 0.707, | ||
| 620 | "z": 0.707 | ||
| 621 | } | ||
| 622 | }, | ||
| 623 | { | ||
| 624 | "key": "n", | ||
| 625 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 626 | "texture": { | ||
| 627 | "file9": "meshes/keyboard/key_n.png", | ||
| 628 | "file10": "meshes/keyboard/key_n.png" | ||
| 629 | }, | ||
| 630 | "dimensions": { | ||
| 631 | "x": 0.04787999764084816, | ||
| 632 | "z": 0.020292000845074654, | ||
| 633 | "y": 0.04787999764084816 | ||
| 634 | }, | ||
| 635 | "position": { | ||
| 636 | "x": -0.38794422149658203, | ||
| 637 | "y": 0.019300000742077827, | ||
| 638 | "z": -0.0728309154510498 | ||
| 639 | }, | ||
| 640 | "localOrientation": { | ||
| 641 | "w": 0.000, | ||
| 642 | "x": 0.000, | ||
| 643 | "y": 0.707, | ||
| 644 | "z": 0.707 | ||
| 645 | } | ||
| 646 | }, | ||
| 647 | { | ||
| 648 | "key": "m", | ||
| 649 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 650 | "texture": { | ||
| 651 | "file9": "meshes/keyboard/key_m.png", | ||
| 652 | "file10": "meshes/keyboard/key_m.png" | ||
| 653 | }, | ||
| 654 | "dimensions": { | ||
| 655 | "x": 0.04787999764084816, | ||
| 656 | "z": 0.01846799999475479, | ||
| 657 | "y": 0.04787999764084816 | ||
| 658 | }, | ||
| 659 | "position": { | ||
| 660 | "x": -0.44464683532714844, | ||
| 661 | "y": 0.019300000742077827, | ||
| 662 | "z": -0.07282185554504395 | ||
| 663 | }, | ||
| 664 | "localOrientation": { | ||
| 665 | "w": 0.000, | ||
| 666 | "x": 0.000, | ||
| 667 | "y": 0.707, | ||
| 668 | "z": 0.707 | ||
| 669 | } | ||
| 670 | }, | ||
| 671 | { | ||
| 672 | "key": "x", | ||
| 673 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 674 | "texture": { | ||
| 675 | "file9": "meshes/keyboard/key_x.png", | ||
| 676 | "file10": "meshes/keyboard/key_x.png" | ||
| 677 | }, | ||
| 678 | "dimensions": { | ||
| 679 | "x": 0.04787999764084816, | ||
| 680 | "z": 0.02051999792456627, | ||
| 681 | "y": 0.04787999764084816 | ||
| 682 | }, | ||
| 683 | "position": { | ||
| 684 | "x": -0.1630725860595703, | ||
| 685 | "y": 0.019300000742077827, | ||
| 686 | "z": -0.07284045219421387 | ||
| 687 | }, | ||
| 688 | "localOrientation": { | ||
| 689 | "w": 0.000, | ||
| 690 | "x": 0.000, | ||
| 691 | "y": 0.707, | ||
| 692 | "z": 0.707 | ||
| 693 | } | ||
| 694 | }, | ||
| 695 | { | ||
| 696 | "key": "DEL", | ||
| 697 | "type": "backspace", | ||
| 698 | "dimensions": { | ||
| 699 | "x": 0.04787999764084816, | ||
| 700 | "z": 0.020519999787211418, | ||
| 701 | "y": 0.04787999764084816 | ||
| 702 | }, | ||
| 703 | "position": { | ||
| 704 | "x": -0.53203323516845703, | ||
| 705 | "y": 0.019300000742077827, | ||
| 706 | "z": -0.07286686894893646 | ||
| 707 | }, | ||
| 708 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 709 | "texture": { | ||
| 710 | "file9": "meshes/keyboard/key_backspace.png", | ||
| 711 | "file10": "meshes/keyboard/key_backspace.png" | ||
| 712 | }, | ||
| 713 | "localOrientation": { | ||
| 714 | "w": 0.000, | ||
| 715 | "x": 0.000, | ||
| 716 | "y": 0.707, | ||
| 717 | "z": 0.707 | ||
| 718 | } | ||
| 719 | }, | ||
| 720 | { | ||
| 721 | "key": "Caps", | ||
| 722 | "type": "caps", | ||
| 723 | "switchToLayer": 1, | ||
| 724 | "dimensions": { | ||
| 725 | "x": 0.04787999764084816, | ||
| 726 | "z": 0.020519999787211418, | ||
| 727 | "y": 0.04787999764084816 | ||
| 728 | }, | ||
| 729 | "position": { | ||
| 730 | "x": -0.02603323516845703, | ||
| 731 | "y": 0.019300000742077827, | ||
| 732 | "z": -0.07285571098327637 | ||
| 733 | }, | ||
| 734 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 735 | "texture": { | ||
| 736 | "file9": "meshes/keyboard/key_cap.png", | ||
| 737 | "file10": "meshes/keyboard/key_cap.png" | ||
| 738 | }, | ||
| 739 | "localOrientation": { | ||
| 740 | "w": 0.000, | ||
| 741 | "x": 0.000, | ||
| 742 | "y": 0.707, | ||
| 743 | "z": 0.707 | ||
| 744 | } | ||
| 745 | }, | ||
| 746 | { | ||
| 747 | "key": "Close", | ||
| 748 | "type": "close", | ||
| 749 | "dimensions": { | ||
| 750 | "x": 0.04787999764084816, | ||
| 751 | "z": 0.020519999787211418, | ||
| 752 | "y": 0.04787999764084816 | ||
| 753 | }, | ||
| 754 | "position": { | ||
| 755 | "x": -0.59333323516845703, | ||
| 756 | "y": 0.019300000742077827, | ||
| 757 | "z": 0.037454843521118164 | ||
| 758 | }, | ||
| 759 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 760 | "texture": { | ||
| 761 | "file9": "meshes/keyboard/key_exit.png", | ||
| 762 | "file10": "meshes/keyboard/key_exit.png" | ||
| 763 | }, | ||
| 764 | "localOrientation": { | ||
| 765 | "w": 0.000, | ||
| 766 | "x": 0.000, | ||
| 767 | "y": 0.707, | ||
| 768 | "z": 0.707 | ||
| 769 | } | ||
| 770 | }, | ||
| 771 | { | ||
| 772 | "key": "Enter", | ||
| 773 | "type": "enter", | ||
| 774 | "dimensions": { | ||
| 775 | "x": 0.08787999764084816, | ||
| 776 | "z": 0.020519999787211418, | ||
| 777 | "y": 0.04787999764084816 | ||
| 778 | }, | ||
| 779 | "position": { | ||
| 780 | "x": -0.5103323516845703, | ||
| 781 | "y": 0.019300000742077827, | ||
| 782 | "z": -0.127054843521118164 | ||
| 783 | }, | ||
| 784 | "modelURL": "meshes/keyboard/SM_enter.fbx", | ||
| 785 | "texture": { | ||
| 786 | "file10": "meshes/keyboard/key_enter.png", | ||
| 787 | "file11": "meshes/keyboard/key_enter.png" | ||
| 788 | }, | ||
| 789 | "localOrientation": { | ||
| 790 | "w": 0.000, | ||
| 791 | "x": 0.000, | ||
| 792 | "y": 0.707, | ||
| 793 | "z": 0.707 | ||
| 794 | } | ||
| 795 | }, | ||
| 796 | { | ||
| 797 | "key": "numbers", | ||
| 798 | "type": "layer", | ||
| 799 | "switchToLayer": 2, | ||
| 800 | "dimensions": { | ||
| 801 | "x": 0.07787999764084816, | ||
| 802 | "z": 0.020519999787211418, | ||
| 803 | "y": 0.04787999764084816 | ||
| 804 | }, | ||
| 805 | "position": { | ||
| 806 | "x": -0.026323516845703, | ||
| 807 | "y": 0.019300000742077827, | ||
| 808 | "z": -0.127054843521118164 | ||
| 809 | }, | ||
| 810 | "modelURL": "meshes/keyboard/SM_enter.fbx", | ||
| 811 | "texture": { | ||
| 812 | "file10": "meshes/keyboard/key_123.png", | ||
| 813 | "file11": "meshes/keyboard/key_123.png" | ||
| 814 | }, | ||
| 815 | "localOrientation": { | ||
| 816 | "w": 0.000, | ||
| 817 | "x": 0.000, | ||
| 818 | "y": 0.707, | ||
| 819 | "z": 0.707 | ||
| 820 | } | ||
| 821 | } | ||
| 822 | ], | ||
| 823 | [ | ||
| 824 | { | ||
| 825 | "dimensions": { | ||
| 826 | "x": 0.04787999764084816, | ||
| 827 | "z": 0.02051999792456627, | ||
| 828 | "y": 0.04787999764084816 | ||
| 829 | }, | ||
| 830 | "position": { | ||
| 831 | "x": -0.5332040786743164, | ||
| 832 | "y": 0.019300000742077827, | ||
| 833 | "z": 0.037454843521118164 | ||
| 834 | }, | ||
| 835 | "key": "p", | ||
| 836 | "texture": { | ||
| 837 | "file9": "meshes/keyboard/keyCap_p.png", | ||
| 838 | "file10": "meshes/keyboard/keyCap_p.png" | ||
| 839 | }, | ||
| 840 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 841 | "localOrientation": { | ||
| 842 | "w": 0.000, | ||
| 843 | "x": 0.000, | ||
| 844 | "y": 0.707, | ||
| 845 | "z": 0.707 | ||
| 846 | } | ||
| 847 | }, | ||
| 848 | { | ||
| 849 | "dimensions": { | ||
| 850 | "x": 0.04787999764084816, | ||
| 851 | "z": 0.02051999792456627, | ||
| 852 | "y": 0.04787999764084816 | ||
| 853 | }, | ||
| 854 | "position": { | ||
| 855 | "x": -0.42067813873291016, | ||
| 856 | "y": 0.019300000742077827, | ||
| 857 | "z": 0.03744244575500488 | ||
| 858 | }, | ||
| 859 | "key": "i", | ||
| 860 | "texture": { | ||
| 861 | "file9": "meshes/keyboard/keyCap_i.png", | ||
| 862 | "file10": "meshes/keyboard/keyCap_i.png" | ||
| 863 | }, | ||
| 864 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 865 | "localOrientation": { | ||
| 866 | "w": 0.000, | ||
| 867 | "x": 0.000, | ||
| 868 | "y": 0.707, | ||
| 869 | "z": 0.707 | ||
| 870 | } | ||
| 871 | }, | ||
| 872 | { | ||
| 873 | "key": "o", | ||
| 874 | "dimensions": { | ||
| 875 | "x": 0.04787999764084816, | ||
| 876 | "z": 0.02051999792456627, | ||
| 877 | "y": 0.04787999764084816 | ||
| 878 | }, | ||
| 879 | "position": { | ||
| 880 | "x": -0.47769832611083984, | ||
| 881 | "y": 0.019300000742077827, | ||
| 882 | "z": 0.03745675086975098 | ||
| 883 | }, | ||
| 884 | "texture": { | ||
| 885 | "file9": "meshes/keyboard/keyCap_o.png", | ||
| 886 | "file10": "meshes/keyboard/keyCap_o.png" | ||
| 887 | }, | ||
| 888 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 889 | "localOrientation": { | ||
| 890 | "w": 0.000, | ||
| 891 | "x": 0.000, | ||
| 892 | "y": 0.707, | ||
| 893 | "z": 0.707 | ||
| 894 | } | ||
| 895 | }, | ||
| 896 | { | ||
| 897 | "dimensions": { | ||
| 898 | "x": 0.04787999764084816, | ||
| 899 | "z": 0.02051999792456627, | ||
| 900 | "y": 0.04787999764084816 | ||
| 901 | }, | ||
| 902 | "position": { | ||
| 903 | "x": -0.49904823303222656, | ||
| 904 | "y": 0.019300000742077827, | ||
| 905 | "z": -0.01745915412902832 | ||
| 906 | }, | ||
| 907 | "key": "l", | ||
| 908 | "texture": { | ||
| 909 | "file9": "meshes/keyboard/keyCap_l.png", | ||
| 910 | "file10": "meshes/keyboard/keyCap_l.png" | ||
| 911 | }, | ||
| 912 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 913 | "localOrientation": { | ||
| 914 | "w": 0.000, | ||
| 915 | "x": 0.000, | ||
| 916 | "y": 0.707, | ||
| 917 | "z": 0.707 | ||
| 918 | } | ||
| 919 | }, | ||
| 920 | { | ||
| 921 | "dimensions": { | ||
| 922 | "x": 0.04787999764084816, | ||
| 923 | "z": 0.02051999792456627, | ||
| 924 | "y": 0.04787999764084816 | ||
| 925 | }, | ||
| 926 | "position": { | ||
| 927 | "x": -0.4439973831176758, | ||
| 928 | "y": 0.019300000742077827, | ||
| 929 | "z": -0.01745915412902832 | ||
| 930 | }, | ||
| 931 | "key": "k", | ||
| 932 | "texture": { | ||
| 933 | "file9": "meshes/keyboard/keyCap_k.png", | ||
| 934 | "file10": "meshes/keyboard/keyCap_k.png" | ||
| 935 | }, | ||
| 936 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 937 | "localOrientation": { | ||
| 938 | "w": 0.000, | ||
| 939 | "x": 0.000, | ||
| 940 | "y": 0.707, | ||
| 941 | "z": 0.707 | ||
| 942 | } | ||
| 943 | }, | ||
| 944 | { | ||
| 945 | "key": "y", | ||
| 946 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 947 | "texture": { | ||
| 948 | "file9": "meshes/keyboard/keyCap_y.png", | ||
| 949 | "file10": "meshes/keyboard/keyCap_y.png" | ||
| 950 | }, | ||
| 951 | "dimensions": { | ||
| 952 | "x": 0.04787999764084816, | ||
| 953 | "z": 0.02051999792456627, | ||
| 954 | "y": 0.04787999764084816 | ||
| 955 | }, | ||
| 956 | "position": { | ||
| 957 | "x": -0.30902957916259766, | ||
| 958 | "y": 0.019300000742077827, | ||
| 959 | "z": 0.0374448299407959 | ||
| 960 | }, | ||
| 961 | "localOrientation": { | ||
| 962 | "w": 0.000, | ||
| 963 | "x": 0.000, | ||
| 964 | "y": 0.707, | ||
| 965 | "z": 0.707 | ||
| 966 | } | ||
| 967 | }, | ||
| 968 | { | ||
| 969 | "key": "r", | ||
| 970 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 971 | "texture": { | ||
| 972 | "file9": "meshes/keyboard/keyCap_r.png", | ||
| 973 | "file10": "meshes/keyboard/keyCap_r.png" | ||
| 974 | }, | ||
| 975 | "dimensions": { | ||
| 976 | "x": 0.04787999764084816, | ||
| 977 | "z": 0.020519999787211418, | ||
| 978 | "y": 0.04787999764084816 | ||
| 979 | }, | ||
| 980 | "position": { | ||
| 981 | "x": -0.19474029541015625, | ||
| 982 | "y": 0.019300000742077827, | ||
| 983 | "z": 0.03745102882385254 | ||
| 984 | }, | ||
| 985 | "localOrientation": { | ||
| 986 | "w": 0.000, | ||
| 987 | "x": 0.000, | ||
| 988 | "y": 0.707, | ||
| 989 | "z": 0.707 | ||
| 990 | } | ||
| 991 | }, | ||
| 992 | { | ||
| 993 | "key": "d", | ||
| 994 | "texture": { | ||
| 995 | "file9": "meshes/keyboard/keyCap_d.png", | ||
| 996 | "file10": "meshes/keyboard/keyCap_d.png" | ||
| 997 | }, | ||
| 998 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 999 | "dimensions": { | ||
| 1000 | "x": 0.04787999764084816, | ||
| 1001 | "z": 0.02051999792456627, | ||
| 1002 | "y": 0.04787999764084816 | ||
| 1003 | }, | ||
| 1004 | "position": { | ||
| 1005 | "x": -0.16272640228271484, | ||
| 1006 | "y": 0.019300000742077827, | ||
| 1007 | "z": -0.01747274398803711 | ||
| 1008 | }, | ||
| 1009 | "localOrientation": { | ||
| 1010 | "w": 0.000, | ||
| 1011 | "x": 0.000, | ||
| 1012 | "y": 0.707, | ||
| 1013 | "z": 0.707 | ||
| 1014 | } | ||
| 1015 | }, | ||
| 1016 | { | ||
| 1017 | "key": "t", | ||
| 1018 | "texture": { | ||
| 1019 | "file9": "meshes/keyboard/keyCap_t.png", | ||
| 1020 | "file10": "meshes/keyboard/keyCap_t.png" | ||
| 1021 | }, | ||
| 1022 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1023 | "dimensions": { | ||
| 1024 | "x": 0.04787999764084816, | ||
| 1025 | "z": 0.02051999792456627, | ||
| 1026 | "y": 0.04787999764084816 | ||
| 1027 | }, | ||
| 1028 | "position": { | ||
| 1029 | "x": -0.2517843246459961, | ||
| 1030 | "y": 0.019300000742077827, | ||
| 1031 | "z": 0.03744622692465782 | ||
| 1032 | }, | ||
| 1033 | "localOrientation": { | ||
| 1034 | "w": 0.000, | ||
| 1035 | "x": 0.000, | ||
| 1036 | "y": 0.707, | ||
| 1037 | "z": 0.707 | ||
| 1038 | } | ||
| 1039 | }, | ||
| 1040 | { | ||
| 1041 | "key": "f", | ||
| 1042 | "texture": { | ||
| 1043 | "file9": "meshes/keyboard/keyCap_F.png", | ||
| 1044 | "file10": "meshes/keyboard/keyCap_F.png" | ||
| 1045 | }, | ||
| 1046 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1047 | "dimensions": { | ||
| 1048 | "x": 0.04787999764084816, | ||
| 1049 | "z": 0.02051999792456627, | ||
| 1050 | "y": 0.04787999764084816 | ||
| 1051 | }, | ||
| 1052 | "position": { | ||
| 1053 | "x": -0.2200756072998047, | ||
| 1054 | "y": 0.019300000742077827, | ||
| 1055 | "z": -0.01746511459350586 | ||
| 1056 | }, | ||
| 1057 | "localOrientation": { | ||
| 1058 | "w": 0.000, | ||
| 1059 | "x": 0.000, | ||
| 1060 | "y": 0.707, | ||
| 1061 | "z": 0.707 | ||
| 1062 | } | ||
| 1063 | }, | ||
| 1064 | { | ||
| 1065 | "key": "g", | ||
| 1066 | "texture": { | ||
| 1067 | "file9": "meshes/keyboard/keyCap_g.png", | ||
| 1068 | "file10": "meshes/keyboard/keyCap_g.png" | ||
| 1069 | }, | ||
| 1070 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1071 | "dimensions": { | ||
| 1072 | "x": 0.04787999764084816, | ||
| 1073 | "z": 0.02051999792456627, | ||
| 1074 | "y": 0.04787999764084816 | ||
| 1075 | }, | ||
| 1076 | "position": { | ||
| 1077 | "x": -0.27622222900390625, | ||
| 1078 | "y": 0.019300000742077827, | ||
| 1079 | "z": -0.017457084730267525 | ||
| 1080 | }, | ||
| 1081 | "localOrientation": { | ||
| 1082 | "w": 0.000, | ||
| 1083 | "x": 0.000, | ||
| 1084 | "y": 0.707, | ||
| 1085 | "z": 0.707 | ||
| 1086 | } | ||
| 1087 | }, | ||
| 1088 | { | ||
| 1089 | "key": "w", | ||
| 1090 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1091 | "texture": { | ||
| 1092 | "file9": "meshes/keyboard/keyCap_w.png", | ||
| 1093 | "file10": "meshes/keyboard/keyCap_w.png" | ||
| 1094 | }, | ||
| 1095 | "dimensions": { | ||
| 1096 | "x": 0.04787999764084816, | ||
| 1097 | "z": 0.02051999792456627, | ||
| 1098 | "y": 0.04787999764084816 | ||
| 1099 | }, | ||
| 1100 | "position": { | ||
| 1101 | "x": -0.08203601837158203, | ||
| 1102 | "y": 0.019300000742077827, | ||
| 1103 | "z": 0.03743100166320801 | ||
| 1104 | }, | ||
| 1105 | "localOrientation": { | ||
| 1106 | "w": 0.000, | ||
| 1107 | "x": 0.000, | ||
| 1108 | "y": 0.707, | ||
| 1109 | "z": 0.707 | ||
| 1110 | } | ||
| 1111 | }, | ||
| 1112 | { | ||
| 1113 | "key": "q", | ||
| 1114 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1115 | "texture": { | ||
| 1116 | "file9": "meshes/keyboard/keyCap_q.png", | ||
| 1117 | "file10": "meshes/keyboard/keyCap_q.png" | ||
| 1118 | }, | ||
| 1119 | "dimensions": { | ||
| 1120 | "x": 0.04787999764084816, | ||
| 1121 | "z": 0.02051999792456627, | ||
| 1122 | "y": 0.04787999764084816 | ||
| 1123 | }, | ||
| 1124 | "position": { | ||
| 1125 | "x": -0.026292800903320312, | ||
| 1126 | "y": 0.019300000742077827, | ||
| 1127 | "z": 0.037427663803100586 | ||
| 1128 | }, | ||
| 1129 | "localOrientation": { | ||
| 1130 | "w": 0.000, | ||
| 1131 | "x": 0.000, | ||
| 1132 | "y": 0.707, | ||
| 1133 | "z": 0.707 | ||
| 1134 | } | ||
| 1135 | }, | ||
| 1136 | { | ||
| 1137 | "key": "a", | ||
| 1138 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1139 | "texture": { | ||
| 1140 | "file9": "meshes/keyboard/keyCap_a.png", | ||
| 1141 | "file10": "meshes/keyboard/keyCap_a.png" | ||
| 1142 | }, | ||
| 1143 | "dimensions": { | ||
| 1144 | "x": 0.04787999764084816, | ||
| 1145 | "z": 0.02051999792456627, | ||
| 1146 | "y": 0.04787999764084816 | ||
| 1147 | }, | ||
| 1148 | "position": { | ||
| 1149 | "x": -0.050909996032714844, | ||
| 1150 | "y": 0.019300000742077827, | ||
| 1151 | "z": -0.017487764358520508 | ||
| 1152 | }, | ||
| 1153 | "localOrientation": { | ||
| 1154 | "w": 0.000, | ||
| 1155 | "x": 0.000, | ||
| 1156 | "y": 0.707, | ||
| 1157 | "z": 0.707 | ||
| 1158 | } | ||
| 1159 | }, | ||
| 1160 | { | ||
| 1161 | "key": "e", | ||
| 1162 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1163 | "texture": { | ||
| 1164 | "file9": "meshes/keyboard/keyCap_e.png", | ||
| 1165 | "file10": "meshes/keyboard/keyCap_e.png" | ||
| 1166 | }, | ||
| 1167 | "dimensions": { | ||
| 1168 | "x": 0.04787999764084816, | ||
| 1169 | "z": 0.02051999792456627, | ||
| 1170 | "y": 0.04787999764084816 | ||
| 1171 | }, | ||
| 1172 | "position": { | ||
| 1173 | "x": -0.13773441314697266, | ||
| 1174 | "y": 0.019300000742077827, | ||
| 1175 | "z": 0.03745269775390625 | ||
| 1176 | }, | ||
| 1177 | "localOrientation": { | ||
| 1178 | "w": 0.000, | ||
| 1179 | "x": 0.000, | ||
| 1180 | "y": 0.707, | ||
| 1181 | "z": 0.707 | ||
| 1182 | } | ||
| 1183 | }, | ||
| 1184 | { | ||
| 1185 | "key": "s", | ||
| 1186 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1187 | "texture": { | ||
| 1188 | "file9": "meshes/keyboard/keyCap_s.png", | ||
| 1189 | "file10": "meshes/keyboard/keyCap_s.png" | ||
| 1190 | }, | ||
| 1191 | "dimensions": { | ||
| 1192 | "x": 0.04787999764084816, | ||
| 1193 | "z": 0.02051999792456627, | ||
| 1194 | "y": 0.04787999764084816 | ||
| 1195 | }, | ||
| 1196 | "position": { | ||
| 1197 | "x": -0.10659980773925781, | ||
| 1198 | "y": 0.019300000742077827, | ||
| 1199 | "z": -0.017481565475463867 | ||
| 1200 | }, | ||
| 1201 | "localOrientation": { | ||
| 1202 | "w": 0.000, | ||
| 1203 | "x": 0.000, | ||
| 1204 | "y": 0.707, | ||
| 1205 | "z": 0.707 | ||
| 1206 | } | ||
| 1207 | }, | ||
| 1208 | { | ||
| 1209 | "key": "u", | ||
| 1210 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1211 | "texture": { | ||
| 1212 | "file9": "meshes/keyboard/keyCap_u.png", | ||
| 1213 | "file10": "meshes/keyboard/keyCap_u.png" | ||
| 1214 | }, | ||
| 1215 | "dimensions": { | ||
| 1216 | "x": 0.04787999764084816, | ||
| 1217 | "z": 0.02051999792456627, | ||
| 1218 | "y": 0.04787999764084816 | ||
| 1219 | }, | ||
| 1220 | "position": { | ||
| 1221 | "x": -0.36423587799072266, | ||
| 1222 | "y": 0.019300000742077827, | ||
| 1223 | "z": 0.03743577003479004 | ||
| 1224 | }, | ||
| 1225 | "localOrientation": { | ||
| 1226 | "w": 0.000, | ||
| 1227 | "x": 0.000, | ||
| 1228 | "y": 0.707, | ||
| 1229 | "z": 0.707 | ||
| 1230 | } | ||
| 1231 | }, | ||
| 1232 | { | ||
| 1233 | "key": "h", | ||
| 1234 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1235 | "texture": { | ||
| 1236 | "file9": "meshes/keyboard/keyCap_h.png", | ||
| 1237 | "file10": "meshes/keyboard/keyCap_h.png" | ||
| 1238 | }, | ||
| 1239 | "dimensions": { | ||
| 1240 | "x": 0.04787999764084816, | ||
| 1241 | "z": 0.02051999792456627, | ||
| 1242 | "y": 0.04787999764084816 | ||
| 1243 | }, | ||
| 1244 | "position": { | ||
| 1245 | "x": -0.3321561813354492, | ||
| 1246 | "y": 0.019300000742077827, | ||
| 1247 | "z": -0.017461776733398438 | ||
| 1248 | }, | ||
| 1249 | "localOrientation": { | ||
| 1250 | "w": 0.000, | ||
| 1251 | "x": 0.000, | ||
| 1252 | "y": 0.707, | ||
| 1253 | "z": 0.707 | ||
| 1254 | } | ||
| 1255 | }, | ||
| 1256 | { | ||
| 1257 | "key": "j", | ||
| 1258 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1259 | "texture": { | ||
| 1260 | "file9": "meshes/keyboard/keyCap_j.png", | ||
| 1261 | "file10": "meshes/keyboard/keyCap_j.png" | ||
| 1262 | }, | ||
| 1263 | "dimensions": { | ||
| 1264 | "x": 0.04787999764084816, | ||
| 1265 | "z": 0.020519999787211418, | ||
| 1266 | "y": 0.04787999764084816 | ||
| 1267 | }, | ||
| 1268 | "position": { | ||
| 1269 | "x": -0.38753604888916016, | ||
| 1270 | "y": 0.019300000742077827, | ||
| 1271 | "z": -0.01746058464050293 | ||
| 1272 | }, | ||
| 1273 | "localOrientation": { | ||
| 1274 | "w": 0.000, | ||
| 1275 | "x": 0.000, | ||
| 1276 | "y": 0.707, | ||
| 1277 | "z": 0.707 | ||
| 1278 | } | ||
| 1279 | }, | ||
| 1280 | { | ||
| 1281 | "key": "c", | ||
| 1282 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1283 | "texture": { | ||
| 1284 | "file9": "meshes/keyboard/keyCap_c.png", | ||
| 1285 | "file10": "meshes/keyboard/keyCap_c.png" | ||
| 1286 | }, | ||
| 1287 | "dimensions": { | ||
| 1288 | "x": 0.04787999764084816, | ||
| 1289 | "z": 0.02051999792456627, | ||
| 1290 | "y": 0.04787999764084816 | ||
| 1291 | }, | ||
| 1292 | "position": { | ||
| 1293 | "x": -0.22023773193359375, | ||
| 1294 | "y": 0.019300000742077827, | ||
| 1295 | "z": -0.07282757759094238 | ||
| 1296 | }, | ||
| 1297 | "localOrientation": { | ||
| 1298 | "w": 0.000, | ||
| 1299 | "x": 0.000, | ||
| 1300 | "y": 0.707, | ||
| 1301 | "z": 0.707 | ||
| 1302 | } | ||
| 1303 | }, | ||
| 1304 | { | ||
| 1305 | "key": "v", | ||
| 1306 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1307 | "texture": { | ||
| 1308 | "file9": "meshes/keyboard/keyCap_v.png", | ||
| 1309 | "file10": "meshes/keyboard/keyCap_v.png" | ||
| 1310 | }, | ||
| 1311 | "dimensions": { | ||
| 1312 | "x": 0.04787999764084816, | ||
| 1313 | "z": 0.02051999792456627, | ||
| 1314 | "y": 0.04787999764084816 | ||
| 1315 | }, | ||
| 1316 | "position": { | ||
| 1317 | "x": -0.2767200469970703, | ||
| 1318 | "y": 0.019300000742077827, | ||
| 1319 | "z": -0.07291850447654724 | ||
| 1320 | }, | ||
| 1321 | "localOrientation": { | ||
| 1322 | "w": 0.000, | ||
| 1323 | "x": 0.000, | ||
| 1324 | "y": 0.707, | ||
| 1325 | "z": 0.707 | ||
| 1326 | } | ||
| 1327 | }, | ||
| 1328 | { | ||
| 1329 | "key": "b", | ||
| 1330 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1331 | "texture": { | ||
| 1332 | "file9": "meshes/keyboard/keyCap_b.png", | ||
| 1333 | "file10": "meshes/keyboard/keyCap_b.png" | ||
| 1334 | }, | ||
| 1335 | "dimensions": { | ||
| 1336 | "x": 0.04787999764084816, | ||
| 1337 | "z": 0.020519999787211418, | ||
| 1338 | "y": 0.04787999764084816 | ||
| 1339 | }, | ||
| 1340 | "position": { | ||
| 1341 | "x": -0.33254528045654297, | ||
| 1342 | "y": 0.019300000742077827, | ||
| 1343 | "z": -0.07283258438110352 | ||
| 1344 | }, | ||
| 1345 | "localOrientation": { | ||
| 1346 | "w": 0.000, | ||
| 1347 | "x": 0.000, | ||
| 1348 | "y": 0.707, | ||
| 1349 | "z": 0.707 | ||
| 1350 | } | ||
| 1351 | }, | ||
| 1352 | { | ||
| 1353 | "key": " ", | ||
| 1354 | "name": "space", | ||
| 1355 | "dimensions": { | ||
| 1356 | "x": 0.14597539603710175, | ||
| 1357 | "z": 0.02051999792456627, | ||
| 1358 | "y": 0.04787999764084816 | ||
| 1359 | }, | ||
| 1360 | "position": { | ||
| 1361 | "x": -0.27660465240478516, | ||
| 1362 | "y": 0.019300000742077827, | ||
| 1363 | "z": -0.12705934047698975 | ||
| 1364 | }, | ||
| 1365 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1366 | "texture": { | ||
| 1367 | "file9": "meshes/keyboard/white.png", | ||
| 1368 | "file10": "meshes/keyboard/white.png" | ||
| 1369 | }, | ||
| 1370 | "localOrientation": { | ||
| 1371 | "w": 0.000, | ||
| 1372 | "x": 0.000, | ||
| 1373 | "y": 0.707, | ||
| 1374 | "z": 0.707 | ||
| 1375 | } | ||
| 1376 | }, | ||
| 1377 | { | ||
| 1378 | "key": "z", | ||
| 1379 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1380 | "texture": { | ||
| 1381 | "file9": "meshes/keyboard/keyCap_z.png", | ||
| 1382 | "file10": "meshes/keyboard/keyCap_z.png" | ||
| 1383 | }, | ||
| 1384 | "dimensions": { | ||
| 1385 | "x": 0.04787999764084816, | ||
| 1386 | "z": 0.02051999792456627, | ||
| 1387 | "y": 0.04787999764084816 | ||
| 1388 | }, | ||
| 1389 | "position": { | ||
| 1390 | "x": -0.10669422149658203, | ||
| 1391 | "y": 0.019300000742077827, | ||
| 1392 | "z": -0.07285571098327637 | ||
| 1393 | }, | ||
| 1394 | "localOrientation": { | ||
| 1395 | "w": 0.000, | ||
| 1396 | "x": 0.000, | ||
| 1397 | "y": 0.707, | ||
| 1398 | "z": 0.707 | ||
| 1399 | } | ||
| 1400 | }, | ||
| 1401 | { | ||
| 1402 | "key": "n", | ||
| 1403 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1404 | "texture": { | ||
| 1405 | "file9": "meshes/keyboard/keyCap_n.png", | ||
| 1406 | "file10": "meshes/keyboard/keyCap_n.png" | ||
| 1407 | }, | ||
| 1408 | "dimensions": { | ||
| 1409 | "x": 0.04787999764084816, | ||
| 1410 | "z": 0.020292000845074654, | ||
| 1411 | "y": 0.04787999764084816 | ||
| 1412 | }, | ||
| 1413 | "position": { | ||
| 1414 | "x": -0.38794422149658203, | ||
| 1415 | "y": 0.019300000742077827, | ||
| 1416 | "z": -0.0728309154510498 | ||
| 1417 | }, | ||
| 1418 | "localOrientation": { | ||
| 1419 | "w": 0.000, | ||
| 1420 | "x": 0.000, | ||
| 1421 | "y": 0.707, | ||
| 1422 | "z": 0.707 | ||
| 1423 | } | ||
| 1424 | }, | ||
| 1425 | { | ||
| 1426 | "key": "m", | ||
| 1427 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1428 | "texture": { | ||
| 1429 | "file9": "meshes/keyboard/keyCap_m.png", | ||
| 1430 | "file10": "meshes/keyboard/keyCap_m.png" | ||
| 1431 | }, | ||
| 1432 | "dimensions": { | ||
| 1433 | "x": 0.04787999764084816, | ||
| 1434 | "z": 0.01846799999475479, | ||
| 1435 | "y": 0.04787999764084816 | ||
| 1436 | }, | ||
| 1437 | "position": { | ||
| 1438 | "x": -0.44464683532714844, | ||
| 1439 | "y": 0.019300000742077827, | ||
| 1440 | "z": -0.07282185554504395 | ||
| 1441 | }, | ||
| 1442 | "localOrientation": { | ||
| 1443 | "w": 0.000, | ||
| 1444 | "x": 0.000, | ||
| 1445 | "y": 0.707, | ||
| 1446 | "z": 0.707 | ||
| 1447 | } | ||
| 1448 | }, | ||
| 1449 | { | ||
| 1450 | "key": "x", | ||
| 1451 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1452 | "texture": { | ||
| 1453 | "file9": "meshes/keyboard/keyCap_x.png", | ||
| 1454 | "file10": "meshes/keyboard/keyCap_x.png" | ||
| 1455 | }, | ||
| 1456 | "dimensions": { | ||
| 1457 | "x": 0.04787999764084816, | ||
| 1458 | "z": 0.02051999792456627, | ||
| 1459 | "y": 0.04787999764084816 | ||
| 1460 | }, | ||
| 1461 | "position": { | ||
| 1462 | "x": -0.1630725860595703, | ||
| 1463 | "y": 0.019300000742077827, | ||
| 1464 | "z": -0.07284045219421387 | ||
| 1465 | }, | ||
| 1466 | "localOrientation": { | ||
| 1467 | "w": 0.000, | ||
| 1468 | "x": 0.000, | ||
| 1469 | "y": 0.707, | ||
| 1470 | "z": 0.707 | ||
| 1471 | } | ||
| 1472 | }, | ||
| 1473 | { | ||
| 1474 | "key": "DEL", | ||
| 1475 | "type": "backspace", | ||
| 1476 | "dimensions": { | ||
| 1477 | "x": 0.04787999764084816, | ||
| 1478 | "z": 0.020519999787211418, | ||
| 1479 | "y": 0.04787999764084816 | ||
| 1480 | }, | ||
| 1481 | "position": { | ||
| 1482 | "x": -0.53203323516845703, | ||
| 1483 | "y": 0.019300000742077827, | ||
| 1484 | "z": -0.07286686894893646 | ||
| 1485 | }, | ||
| 1486 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1487 | "texture": { | ||
| 1488 | "file9": "meshes/keyboard/key_backspace.png", | ||
| 1489 | "file10": "meshes/keyboard/key_backspace.png" | ||
| 1490 | }, | ||
| 1491 | "localOrientation": { | ||
| 1492 | "w": 0.000, | ||
| 1493 | "x": 0.000, | ||
| 1494 | "y": 0.707, | ||
| 1495 | "z": 0.707 | ||
| 1496 | } | ||
| 1497 | }, | ||
| 1498 | { | ||
| 1499 | "key": "Caps", | ||
| 1500 | "type": "caps", | ||
| 1501 | "switchToLayer": 0, | ||
| 1502 | "dimensions": { | ||
| 1503 | "x": 0.04787999764084816, | ||
| 1504 | "z": 0.020519999787211418, | ||
| 1505 | "y": 0.04787999764084816 | ||
| 1506 | }, | ||
| 1507 | "position": { | ||
| 1508 | "x": -0.02603323516845703, | ||
| 1509 | "y": 0.019300000742077827, | ||
| 1510 | "z": -0.07285571098327637 | ||
| 1511 | }, | ||
| 1512 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1513 | "texture": { | ||
| 1514 | "file9": "meshes/keyboard/key_cap.png", | ||
| 1515 | "file10": "meshes/keyboard/key_cap.png" | ||
| 1516 | }, | ||
| 1517 | "localOrientation": { | ||
| 1518 | "w": 0.000, | ||
| 1519 | "x": 0.000, | ||
| 1520 | "y": 0.707, | ||
| 1521 | "z": 0.707 | ||
| 1522 | } | ||
| 1523 | }, | ||
| 1524 | { | ||
| 1525 | "key": "Close", | ||
| 1526 | "type": "close", | ||
| 1527 | "dimensions": { | ||
| 1528 | "x": 0.04787999764084816, | ||
| 1529 | "z": 0.020519999787211418, | ||
| 1530 | "y": 0.04787999764084816 | ||
| 1531 | }, | ||
| 1532 | "position": { | ||
| 1533 | "x": -0.59333323516845703, | ||
| 1534 | "y": 0.019300000742077827, | ||
| 1535 | "z": 0.037454843521118164 | ||
| 1536 | }, | ||
| 1537 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1538 | "texture": { | ||
| 1539 | "file9": "meshes/keyboard/key_exit.png", | ||
| 1540 | "file10": "meshes/keyboard/key_exit.png" | ||
| 1541 | }, | ||
| 1542 | "localOrientation": { | ||
| 1543 | "w": 0.000, | ||
| 1544 | "x": 0.000, | ||
| 1545 | "y": 0.707, | ||
| 1546 | "z": 0.707 | ||
| 1547 | } | ||
| 1548 | }, | ||
| 1549 | { | ||
| 1550 | "key": "Enter", | ||
| 1551 | "type": "enter", | ||
| 1552 | "dimensions": { | ||
| 1553 | "x": 0.08787999764084816, | ||
| 1554 | "z": 0.020519999787211418, | ||
| 1555 | "y": 0.04787999764084816 | ||
| 1556 | }, | ||
| 1557 | "position": { | ||
| 1558 | "x": -0.5103323516845703, | ||
| 1559 | "y": 0.019300000742077827, | ||
| 1560 | "z": -0.127054843521118164 | ||
| 1561 | }, | ||
| 1562 | "modelURL": "meshes/keyboard/SM_enter.fbx", | ||
| 1563 | "texture": { | ||
| 1564 | "file10": "meshes/keyboard/key_enter.png", | ||
| 1565 | "file11": "meshes/keyboard/key_enter.png" | ||
| 1566 | }, | ||
| 1567 | "localOrientation": { | ||
| 1568 | "w": 0.000, | ||
| 1569 | "x": 0.000, | ||
| 1570 | "y": 0.707, | ||
| 1571 | "z": 0.707 | ||
| 1572 | } | ||
| 1573 | }, | ||
| 1574 | { | ||
| 1575 | "key": "numbers", | ||
| 1576 | "type": "layer", | ||
| 1577 | "switchToLayer": 2, | ||
| 1578 | "dimensions": { | ||
| 1579 | "x": 0.07787999764084816, | ||
| 1580 | "z": 0.020519999787211418, | ||
| 1581 | "y": 0.04787999764084816 | ||
| 1582 | }, | ||
| 1583 | "position": { | ||
| 1584 | "x": -0.026323516845703, | ||
| 1585 | "y": 0.019300000742077827, | ||
| 1586 | "z": -0.127054843521118164 | ||
| 1587 | }, | ||
| 1588 | "modelURL": "meshes/keyboard/SM_enter.fbx", | ||
| 1589 | "texture": { | ||
| 1590 | "file10": "meshes/keyboard/key_123.png", | ||
| 1591 | "file11": "meshes/keyboard/key_123.png" | ||
| 1592 | }, | ||
| 1593 | "localOrientation": { | ||
| 1594 | "w": 0.000, | ||
| 1595 | "x": 0.000, | ||
| 1596 | "y": 0.707, | ||
| 1597 | "z": 0.707 | ||
| 1598 | } | ||
| 1599 | } | ||
| 1600 | ], | ||
| 1601 | [ | ||
| 1602 | { | ||
| 1603 | "dimensions": { | ||
| 1604 | "x": 0.04787999764084816, | ||
| 1605 | "z": 0.02051999792456627, | ||
| 1606 | "y": 0.04787999764084816 | ||
| 1607 | }, | ||
| 1608 | "position": { | ||
| 1609 | "x": -0.5332040786743164, | ||
| 1610 | "y": 0.019300000742077827, | ||
| 1611 | "z": 0.037454843521118164 | ||
| 1612 | }, | ||
| 1613 | "key": "0", | ||
| 1614 | "texture": { | ||
| 1615 | "file9": "meshes/keyboard/key_0.png", | ||
| 1616 | "file10": "meshes/keyboard/key_0.png" | ||
| 1617 | }, | ||
| 1618 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1619 | "localOrientation": { | ||
| 1620 | "w": 0.000, | ||
| 1621 | "x": 0.000, | ||
| 1622 | "y": 0.707, | ||
| 1623 | "z": 0.707 | ||
| 1624 | } | ||
| 1625 | }, | ||
| 1626 | { | ||
| 1627 | "dimensions": { | ||
| 1628 | "x": 0.04787999764084816, | ||
| 1629 | "z": 0.02051999792456627, | ||
| 1630 | "y": 0.04787999764084816 | ||
| 1631 | }, | ||
| 1632 | "position": { | ||
| 1633 | "x": -0.42067813873291016, | ||
| 1634 | "y": 0.019300000742077827, | ||
| 1635 | "z": 0.03744244575500488 | ||
| 1636 | }, | ||
| 1637 | "key": "8", | ||
| 1638 | "texture": { | ||
| 1639 | "file9": "meshes/keyboard/key_8.png", | ||
| 1640 | "file10": "meshes/keyboard/key_8.png" | ||
| 1641 | }, | ||
| 1642 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1643 | "localOrientation": { | ||
| 1644 | "w": 0.000, | ||
| 1645 | "x": 0.000, | ||
| 1646 | "y": 0.707, | ||
| 1647 | "z": 0.707 | ||
| 1648 | } | ||
| 1649 | }, | ||
| 1650 | { | ||
| 1651 | "key": "9", | ||
| 1652 | "dimensions": { | ||
| 1653 | "x": 0.04787999764084816, | ||
| 1654 | "z": 0.02051999792456627, | ||
| 1655 | "y": 0.04787999764084816 | ||
| 1656 | }, | ||
| 1657 | "position": { | ||
| 1658 | "x": -0.47769832611083984, | ||
| 1659 | "y": 0.019300000742077827, | ||
| 1660 | "z": 0.03745675086975098 | ||
| 1661 | }, | ||
| 1662 | "texture": { | ||
| 1663 | "file9": "meshes/keyboard/key_9.png", | ||
| 1664 | "file10": "meshes/keyboard/key_9.png" | ||
| 1665 | }, | ||
| 1666 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1667 | "localOrientation": { | ||
| 1668 | "w": 0.000, | ||
| 1669 | "x": 0.000, | ||
| 1670 | "y": 0.707, | ||
| 1671 | "z": 0.707 | ||
| 1672 | } | ||
| 1673 | }, | ||
| 1674 | { | ||
| 1675 | "dimensions": { | ||
| 1676 | "x": 0.04787999764084816, | ||
| 1677 | "z": 0.02051999792456627, | ||
| 1678 | "y": 0.04787999764084816 | ||
| 1679 | }, | ||
| 1680 | "position": { | ||
| 1681 | "x": -0.47764823303222656, | ||
| 1682 | "y": 0.019300000742077827, | ||
| 1683 | "z": -0.01745915412902832 | ||
| 1684 | }, | ||
| 1685 | "key": "(", | ||
| 1686 | "texture": { | ||
| 1687 | "file9": "meshes/keyboard/key_open_paren.png", | ||
| 1688 | "file10": "meshes/keyboard/key_open_paren.png" | ||
| 1689 | }, | ||
| 1690 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1691 | "localOrientation": { | ||
| 1692 | "w": 0.000, | ||
| 1693 | "x": 0.000, | ||
| 1694 | "y": 0.707, | ||
| 1695 | "z": 0.707 | ||
| 1696 | } | ||
| 1697 | }, | ||
| 1698 | { | ||
| 1699 | "dimensions": { | ||
| 1700 | "x": 0.04787999764084816, | ||
| 1701 | "z": 0.02051999792456627, | ||
| 1702 | "y": 0.04787999764084816 | ||
| 1703 | }, | ||
| 1704 | "position": { | ||
| 1705 | "x": -0.53364823303222656, | ||
| 1706 | "y": 0.019300000742077827, | ||
| 1707 | "z": -0.01745915412902832 | ||
| 1708 | }, | ||
| 1709 | "key": ")", | ||
| 1710 | "texture": { | ||
| 1711 | "file9": "meshes/keyboard/key_close_paren.png", | ||
| 1712 | "file10": "meshes/keyboard/key_close_paren.png" | ||
| 1713 | }, | ||
| 1714 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1715 | "localOrientation": { | ||
| 1716 | "w": 0.000, | ||
| 1717 | "x": 0.000, | ||
| 1718 | "y": 0.707, | ||
| 1719 | "z": 0.707 | ||
| 1720 | } | ||
| 1721 | }, | ||
| 1722 | { | ||
| 1723 | "dimensions": { | ||
| 1724 | "x": 0.04787999764084816, | ||
| 1725 | "z": 0.02051999792456627, | ||
| 1726 | "y": 0.04787999764084816 | ||
| 1727 | }, | ||
| 1728 | "position": { | ||
| 1729 | "x": -0.59634823303222656, | ||
| 1730 | "y": 0.019300000742077827, | ||
| 1731 | "z": -0.01745915412902832 | ||
| 1732 | }, | ||
| 1733 | "key": "/", | ||
| 1734 | "texture": { | ||
| 1735 | "file9": "meshes/keyboard/key_slash.png", | ||
| 1736 | "file10": "meshes/keyboard/key_slash.png" | ||
| 1737 | }, | ||
| 1738 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1739 | "localOrientation": { | ||
| 1740 | "w": 0.000, | ||
| 1741 | "x": 0.000, | ||
| 1742 | "y": 0.707, | ||
| 1743 | "z": 0.707 | ||
| 1744 | } | ||
| 1745 | }, | ||
| 1746 | { | ||
| 1747 | "dimensions": { | ||
| 1748 | "x": 0.04787999764084816, | ||
| 1749 | "z": 0.02051999792456627, | ||
| 1750 | "y": 0.04787999764084816 | ||
| 1751 | }, | ||
| 1752 | "position": { | ||
| 1753 | "x": -0.4206973831176758, | ||
| 1754 | "y": 0.019300000742077827, | ||
| 1755 | "z": -0.01745915412902832 | ||
| 1756 | }, | ||
| 1757 | "key": "+", | ||
| 1758 | "texture": { | ||
| 1759 | "file9": "meshes/keyboard/key_plus.png", | ||
| 1760 | "file10": "meshes/keyboard/key_plus.png" | ||
| 1761 | }, | ||
| 1762 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1763 | "localOrientation": { | ||
| 1764 | "w": 0.000, | ||
| 1765 | "x": 0.000, | ||
| 1766 | "y": 0.707, | ||
| 1767 | "z": 0.707 | ||
| 1768 | } | ||
| 1769 | }, | ||
| 1770 | { | ||
| 1771 | "key": "6", | ||
| 1772 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1773 | "texture": { | ||
| 1774 | "file9": "meshes/keyboard/key_6.png", | ||
| 1775 | "file10": "meshes/keyboard/key_6.png" | ||
| 1776 | }, | ||
| 1777 | "dimensions": { | ||
| 1778 | "x": 0.04787999764084816, | ||
| 1779 | "z": 0.02051999792456627, | ||
| 1780 | "y": 0.04787999764084816 | ||
| 1781 | }, | ||
| 1782 | "position": { | ||
| 1783 | "x": -0.30902957916259766, | ||
| 1784 | "y": 0.019300000742077827, | ||
| 1785 | "z": 0.0374448299407959 | ||
| 1786 | }, | ||
| 1787 | "localOrientation": { | ||
| 1788 | "w": 0.000, | ||
| 1789 | "x": 0.000, | ||
| 1790 | "y": 0.707, | ||
| 1791 | "z": 0.707 | ||
| 1792 | } | ||
| 1793 | }, | ||
| 1794 | { | ||
| 1795 | "key": "4", | ||
| 1796 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1797 | "texture": { | ||
| 1798 | "file9": "meshes/keyboard/key_4.png", | ||
| 1799 | "file10": "meshes/keyboard/key_4.png" | ||
| 1800 | }, | ||
| 1801 | "dimensions": { | ||
| 1802 | "x": 0.04787999764084816, | ||
| 1803 | "z": 0.020519999787211418, | ||
| 1804 | "y": 0.04787999764084816 | ||
| 1805 | }, | ||
| 1806 | "position": { | ||
| 1807 | "x": -0.19474029541015625, | ||
| 1808 | "y": 0.019300000742077827, | ||
| 1809 | "z": 0.03745102882385254 | ||
| 1810 | }, | ||
| 1811 | "localOrientation": { | ||
| 1812 | "w": 0.000, | ||
| 1813 | "x": 0.000, | ||
| 1814 | "y": 0.707, | ||
| 1815 | "z": 0.707 | ||
| 1816 | } | ||
| 1817 | }, | ||
| 1818 | { | ||
| 1819 | "key": "$", | ||
| 1820 | "texture": { | ||
| 1821 | "file9": "meshes/keyboard/key_dollar.png", | ||
| 1822 | "file10": "meshes/keyboard/key_dollar.png" | ||
| 1823 | }, | ||
| 1824 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1825 | "dimensions": { | ||
| 1826 | "x": 0.04787999764084816, | ||
| 1827 | "z": 0.02051999792456627, | ||
| 1828 | "y": 0.04787999764084816 | ||
| 1829 | }, | ||
| 1830 | "position": { | ||
| 1831 | "x": -0.13772640228271484, | ||
| 1832 | "y": 0.019300000742077827, | ||
| 1833 | "z": -0.01747274398803711 | ||
| 1834 | }, | ||
| 1835 | "localOrientation": { | ||
| 1836 | "w": 0.000, | ||
| 1837 | "x": 0.000, | ||
| 1838 | "y": 0.707, | ||
| 1839 | "z": 0.707 | ||
| 1840 | } | ||
| 1841 | }, | ||
| 1842 | { | ||
| 1843 | "key": "5", | ||
| 1844 | "texture": { | ||
| 1845 | "file9": "meshes/keyboard/key_5.png", | ||
| 1846 | "file10": "meshes/keyboard/key_5.png" | ||
| 1847 | }, | ||
| 1848 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1849 | "dimensions": { | ||
| 1850 | "x": 0.04787999764084816, | ||
| 1851 | "z": 0.02051999792456627, | ||
| 1852 | "y": 0.04787999764084816 | ||
| 1853 | }, | ||
| 1854 | "position": { | ||
| 1855 | "x": -0.2517843246459961, | ||
| 1856 | "y": 0.019300000742077827, | ||
| 1857 | "z": 0.03744622692465782 | ||
| 1858 | }, | ||
| 1859 | "localOrientation": { | ||
| 1860 | "w": 0.000, | ||
| 1861 | "x": 0.000, | ||
| 1862 | "y": 0.707, | ||
| 1863 | "z": 0.707 | ||
| 1864 | } | ||
| 1865 | }, | ||
| 1866 | { | ||
| 1867 | "key": "%", | ||
| 1868 | "texture": { | ||
| 1869 | "file9": "meshes/keyboard/key_percentage.png", | ||
| 1870 | "file10": "meshes/keyboard/key_percentage.png" | ||
| 1871 | }, | ||
| 1872 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1873 | "dimensions": { | ||
| 1874 | "x": 0.04787999764084816, | ||
| 1875 | "z": 0.02051999792456627, | ||
| 1876 | "y": 0.04787999764084816 | ||
| 1877 | }, | ||
| 1878 | "position": { | ||
| 1879 | "x": -0.1947756072998047, | ||
| 1880 | "y": 0.019300000742077827, | ||
| 1881 | "z": -0.01746511459350586 | ||
| 1882 | }, | ||
| 1883 | "localOrientation": { | ||
| 1884 | "w": 0.000, | ||
| 1885 | "x": 0.000, | ||
| 1886 | "y": 0.707, | ||
| 1887 | "z": 0.707 | ||
| 1888 | } | ||
| 1889 | }, | ||
| 1890 | { | ||
| 1891 | "key": "_", | ||
| 1892 | "texture": { | ||
| 1893 | "file9": "meshes/keyboard/key_under.png", | ||
| 1894 | "file10": "meshes/keyboard/key_under.png" | ||
| 1895 | }, | ||
| 1896 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1897 | "dimensions": { | ||
| 1898 | "x": 0.04787999764084816, | ||
| 1899 | "z": 0.02051999792456627, | ||
| 1900 | "y": 0.04787999764084816 | ||
| 1901 | }, | ||
| 1902 | "position": { | ||
| 1903 | "x": -0.25172222900390625, | ||
| 1904 | "y": 0.019300000742077827, | ||
| 1905 | "z": -0.017457084730267525 | ||
| 1906 | }, | ||
| 1907 | "localOrientation": { | ||
| 1908 | "w": 0.000, | ||
| 1909 | "x": 0.000, | ||
| 1910 | "y": 0.707, | ||
| 1911 | "z": 0.707 | ||
| 1912 | } | ||
| 1913 | }, | ||
| 1914 | { | ||
| 1915 | "key": "2", | ||
| 1916 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1917 | "texture": { | ||
| 1918 | "file9": "meshes/keyboard/key_2.png", | ||
| 1919 | "file10": "meshes/keyboard/key_2.png" | ||
| 1920 | }, | ||
| 1921 | "dimensions": { | ||
| 1922 | "x": 0.04787999764084816, | ||
| 1923 | "z": 0.02051999792456627, | ||
| 1924 | "y": 0.04787999764084816 | ||
| 1925 | }, | ||
| 1926 | "position": { | ||
| 1927 | "x": -0.08203601837158203, | ||
| 1928 | "y": 0.019300000742077827, | ||
| 1929 | "z": 0.03743100166320801 | ||
| 1930 | }, | ||
| 1931 | "localOrientation": { | ||
| 1932 | "w": 0.000, | ||
| 1933 | "x": 0.000, | ||
| 1934 | "y": 0.707, | ||
| 1935 | "z": 0.707 | ||
| 1936 | } | ||
| 1937 | }, | ||
| 1938 | { | ||
| 1939 | "key": "1", | ||
| 1940 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1941 | "texture": { | ||
| 1942 | "file9": "meshes/keyboard/key_1.png", | ||
| 1943 | "file10": "meshes/keyboard/key_1.png" | ||
| 1944 | }, | ||
| 1945 | "dimensions": { | ||
| 1946 | "x": 0.04787999764084816, | ||
| 1947 | "z": 0.02051999792456627, | ||
| 1948 | "y": 0.04787999764084816 | ||
| 1949 | }, | ||
| 1950 | "position": { | ||
| 1951 | "x": -0.026292800903320312, | ||
| 1952 | "y": 0.019300000742077827, | ||
| 1953 | "z": 0.037427663803100586 | ||
| 1954 | }, | ||
| 1955 | "localOrientation": { | ||
| 1956 | "w": 0.000, | ||
| 1957 | "x": 0.000, | ||
| 1958 | "y": 0.707, | ||
| 1959 | "z": 0.707 | ||
| 1960 | } | ||
| 1961 | }, | ||
| 1962 | { | ||
| 1963 | "key": "@", | ||
| 1964 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1965 | "texture": { | ||
| 1966 | "file9": "meshes/keyboard/key_at.png", | ||
| 1967 | "file10": "meshes/keyboard/key_at.png" | ||
| 1968 | }, | ||
| 1969 | "dimensions": { | ||
| 1970 | "x": 0.04787999764084816, | ||
| 1971 | "z": 0.02051999792456627, | ||
| 1972 | "y": 0.04787999764084816 | ||
| 1973 | }, | ||
| 1974 | "position": { | ||
| 1975 | "x": -0.026209996032714844, | ||
| 1976 | "y": 0.019300000742077827, | ||
| 1977 | "z": -0.017487764358520508 | ||
| 1978 | }, | ||
| 1979 | "localOrientation": { | ||
| 1980 | "w": 0.000, | ||
| 1981 | "x": 0.000, | ||
| 1982 | "y": 0.707, | ||
| 1983 | "z": 0.707 | ||
| 1984 | } | ||
| 1985 | }, | ||
| 1986 | { | ||
| 1987 | "key": "3", | ||
| 1988 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 1989 | "texture": { | ||
| 1990 | "file9": "meshes/keyboard/key_3.png", | ||
| 1991 | "file10": "meshes/keyboard/key_3.png" | ||
| 1992 | }, | ||
| 1993 | "dimensions": { | ||
| 1994 | "x": 0.04787999764084816, | ||
| 1995 | "z": 0.02051999792456627, | ||
| 1996 | "y": 0.04787999764084816 | ||
| 1997 | }, | ||
| 1998 | "position": { | ||
| 1999 | "x": -0.13773441314697266, | ||
| 2000 | "y": 0.019300000742077827, | ||
| 2001 | "z": 0.03745269775390625 | ||
| 2002 | }, | ||
| 2003 | "localOrientation": { | ||
| 2004 | "w": 0.000, | ||
| 2005 | "x": 0.000, | ||
| 2006 | "y": 0.707, | ||
| 2007 | "z": 0.707 | ||
| 2008 | } | ||
| 2009 | }, | ||
| 2010 | { | ||
| 2011 | "key": "#", | ||
| 2012 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2013 | "texture": { | ||
| 2014 | "file9": "meshes/keyboard/key_hashtag.png", | ||
| 2015 | "file10": "meshes/keyboard/key_hashtag.png" | ||
| 2016 | }, | ||
| 2017 | "dimensions": { | ||
| 2018 | "x": 0.04787999764084816, | ||
| 2019 | "z": 0.02051999792456627, | ||
| 2020 | "y": 0.04787999764084816 | ||
| 2021 | }, | ||
| 2022 | "position": { | ||
| 2023 | "x": -0.08209980773925781, | ||
| 2024 | "y": 0.019300000742077827, | ||
| 2025 | "z": -0.017481565475463867 | ||
| 2026 | }, | ||
| 2027 | "localOrientation": { | ||
| 2028 | "w": 0.000, | ||
| 2029 | "x": 0.000, | ||
| 2030 | "y": 0.707, | ||
| 2031 | "z": 0.707 | ||
| 2032 | } | ||
| 2033 | }, | ||
| 2034 | { | ||
| 2035 | "key": "7", | ||
| 2036 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2037 | "texture": { | ||
| 2038 | "file9": "meshes/keyboard/key_7.png", | ||
| 2039 | "file10": "meshes/keyboard/key_7.png" | ||
| 2040 | }, | ||
| 2041 | "dimensions": { | ||
| 2042 | "x": 0.04787999764084816, | ||
| 2043 | "z": 0.02051999792456627, | ||
| 2044 | "y": 0.04787999764084816 | ||
| 2045 | }, | ||
| 2046 | "position": { | ||
| 2047 | "x": -0.36423587799072266, | ||
| 2048 | "y": 0.019300000742077827, | ||
| 2049 | "z": 0.03743577003479004 | ||
| 2050 | }, | ||
| 2051 | "localOrientation": { | ||
| 2052 | "w": 0.000, | ||
| 2053 | "x": 0.000, | ||
| 2054 | "y": 0.707, | ||
| 2055 | "z": 0.707 | ||
| 2056 | } | ||
| 2057 | }, | ||
| 2058 | { | ||
| 2059 | "key": "&", | ||
| 2060 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2061 | "texture": { | ||
| 2062 | "file9": "meshes/keyboard/key_ampersand.png", | ||
| 2063 | "file10": "meshes/keyboard/key_ampersand.png" | ||
| 2064 | }, | ||
| 2065 | "dimensions": { | ||
| 2066 | "x": 0.04787999764084816, | ||
| 2067 | "z": 0.02051999792456627, | ||
| 2068 | "y": 0.04787999764084816 | ||
| 2069 | }, | ||
| 2070 | "position": { | ||
| 2071 | "x": -0.3090561813354492, | ||
| 2072 | "y": 0.019300000742077827, | ||
| 2073 | "z": -0.017461776733398438 | ||
| 2074 | }, | ||
| 2075 | "localOrientation": { | ||
| 2076 | "w": 0.000, | ||
| 2077 | "x": 0.000, | ||
| 2078 | "y": 0.707, | ||
| 2079 | "z": 0.707 | ||
| 2080 | } | ||
| 2081 | }, | ||
| 2082 | { | ||
| 2083 | "key": "-", | ||
| 2084 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2085 | "texture": { | ||
| 2086 | "file9": "meshes/keyboard/key_min.png", | ||
| 2087 | "file10": "meshes/keyboard/key_min.png" | ||
| 2088 | }, | ||
| 2089 | "dimensions": { | ||
| 2090 | "x": 0.04787999764084816, | ||
| 2091 | "z": 0.020519999787211418, | ||
| 2092 | "y": 0.04787999764084816 | ||
| 2093 | }, | ||
| 2094 | "position": { | ||
| 2095 | "x": -0.36433604888916016, | ||
| 2096 | "y": 0.019300000742077827, | ||
| 2097 | "z": -0.01746058464050293 | ||
| 2098 | }, | ||
| 2099 | "localOrientation": { | ||
| 2100 | "w": 0.000, | ||
| 2101 | "x": 0.000, | ||
| 2102 | "y": 0.707, | ||
| 2103 | "z": 0.707 | ||
| 2104 | } | ||
| 2105 | }, | ||
| 2106 | { | ||
| 2107 | "key": "'", | ||
| 2108 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2109 | "texture": { | ||
| 2110 | "file9": "meshes/keyboard/key_squote.png", | ||
| 2111 | "file10": "meshes/keyboard/key_squote.png" | ||
| 2112 | }, | ||
| 2113 | "dimensions": { | ||
| 2114 | "x": 0.04787999764084816, | ||
| 2115 | "z": 0.02051999792456627, | ||
| 2116 | "y": 0.04787999764084816 | ||
| 2117 | }, | ||
| 2118 | "position": { | ||
| 2119 | "x": -0.22023773193359375, | ||
| 2120 | "y": 0.019300000742077827, | ||
| 2121 | "z": -0.07282757759094238 | ||
| 2122 | }, | ||
| 2123 | "localOrientation": { | ||
| 2124 | "w": 0.000, | ||
| 2125 | "x": 0.000, | ||
| 2126 | "y": 0.707, | ||
| 2127 | "z": 0.707 | ||
| 2128 | } | ||
| 2129 | }, | ||
| 2130 | { | ||
| 2131 | "key": ":", | ||
| 2132 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2133 | "texture": { | ||
| 2134 | "file9": "meshes/keyboard/key_colon.png", | ||
| 2135 | "file10": "meshes/keyboard/key_colon.png" | ||
| 2136 | }, | ||
| 2137 | "dimensions": { | ||
| 2138 | "x": 0.04787999764084816, | ||
| 2139 | "z": 0.02051999792456627, | ||
| 2140 | "y": 0.04787999764084816 | ||
| 2141 | }, | ||
| 2142 | "position": { | ||
| 2143 | "x": -0.2767200469970703, | ||
| 2144 | "y": 0.019300000742077827, | ||
| 2145 | "z": -0.07291850447654724 | ||
| 2146 | }, | ||
| 2147 | "localOrientation": { | ||
| 2148 | "w": 0.000, | ||
| 2149 | "x": 0.000, | ||
| 2150 | "y": 0.707, | ||
| 2151 | "z": 0.707 | ||
| 2152 | } | ||
| 2153 | }, | ||
| 2154 | { | ||
| 2155 | "key": ";", | ||
| 2156 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2157 | "texture": { | ||
| 2158 | "file9": "meshes/keyboard/key_semi.png", | ||
| 2159 | "file10": "meshes/keyboard/key_semi.png" | ||
| 2160 | }, | ||
| 2161 | "dimensions": { | ||
| 2162 | "x": 0.04787999764084816, | ||
| 2163 | "z": 0.020519999787211418, | ||
| 2164 | "y": 0.04787999764084816 | ||
| 2165 | }, | ||
| 2166 | "position": { | ||
| 2167 | "x": -0.33254528045654297, | ||
| 2168 | "y": 0.019300000742077827, | ||
| 2169 | "z": -0.07283258438110352 | ||
| 2170 | }, | ||
| 2171 | "localOrientation": { | ||
| 2172 | "w": 0.000, | ||
| 2173 | "x": 0.000, | ||
| 2174 | "y": 0.707, | ||
| 2175 | "z": 0.707 | ||
| 2176 | } | ||
| 2177 | }, | ||
| 2178 | { | ||
| 2179 | "key": " ", | ||
| 2180 | "name": "space", | ||
| 2181 | "dimensions": { | ||
| 2182 | "x": 0.14597539603710175, | ||
| 2183 | "z": 0.02051999792456627, | ||
| 2184 | "y": 0.04787999764084816 | ||
| 2185 | }, | ||
| 2186 | "position": { | ||
| 2187 | "x": -0.27660465240478516, | ||
| 2188 | "y": 0.019300000742077827, | ||
| 2189 | "z": -0.12705934047698975 | ||
| 2190 | }, | ||
| 2191 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2192 | "texture": { | ||
| 2193 | "file9": "meshes/keyboard/white.png", | ||
| 2194 | "file10": "meshes/keyboard/white.png" | ||
| 2195 | }, | ||
| 2196 | "localOrientation": { | ||
| 2197 | "w": 0.000, | ||
| 2198 | "x": 0.000, | ||
| 2199 | "y": 0.707, | ||
| 2200 | "z": 0.707 | ||
| 2201 | } | ||
| 2202 | }, | ||
| 2203 | { | ||
| 2204 | "key": "*", | ||
| 2205 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2206 | "texture": { | ||
| 2207 | "file9": "meshes/keyboard/key_ast.png", | ||
| 2208 | "file10": "meshes/keyboard/key_ast.png" | ||
| 2209 | }, | ||
| 2210 | "dimensions": { | ||
| 2211 | "x": 0.04787999764084816, | ||
| 2212 | "z": 0.02051999792456627, | ||
| 2213 | "y": 0.04787999764084816 | ||
| 2214 | }, | ||
| 2215 | "position": { | ||
| 2216 | "x": -0.10669422149658203, | ||
| 2217 | "y": 0.019300000742077827, | ||
| 2218 | "z": -0.07285571098327637 | ||
| 2219 | }, | ||
| 2220 | "localOrientation": { | ||
| 2221 | "w": 0.000, | ||
| 2222 | "x": 0.000, | ||
| 2223 | "y": 0.707, | ||
| 2224 | "z": 0.707 | ||
| 2225 | } | ||
| 2226 | }, | ||
| 2227 | { | ||
| 2228 | "key": "!", | ||
| 2229 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2230 | "texture": { | ||
| 2231 | "file9": "meshes/keyboard/key_exclam.png", | ||
| 2232 | "file10": "meshes/keyboard/key_exclam.png" | ||
| 2233 | }, | ||
| 2234 | "dimensions": { | ||
| 2235 | "x": 0.04787999764084816, | ||
| 2236 | "z": 0.020292000845074654, | ||
| 2237 | "y": 0.04787999764084816 | ||
| 2238 | }, | ||
| 2239 | "position": { | ||
| 2240 | "x": -0.38794422149658203, | ||
| 2241 | "y": 0.019300000742077827, | ||
| 2242 | "z": -0.0728309154510498 | ||
| 2243 | }, | ||
| 2244 | "localOrientation": { | ||
| 2245 | "w": 0.000, | ||
| 2246 | "x": 0.000, | ||
| 2247 | "y": 0.707, | ||
| 2248 | "z": 0.707 | ||
| 2249 | } | ||
| 2250 | }, | ||
| 2251 | { | ||
| 2252 | "key": "?", | ||
| 2253 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2254 | "texture": { | ||
| 2255 | "file9": "meshes/keyboard/key_question.png", | ||
| 2256 | "file10": "meshes/keyboard/key_question.png" | ||
| 2257 | }, | ||
| 2258 | "dimensions": { | ||
| 2259 | "x": 0.04787999764084816, | ||
| 2260 | "z": 0.01846799999475479, | ||
| 2261 | "y": 0.04787999764084816 | ||
| 2262 | }, | ||
| 2263 | "position": { | ||
| 2264 | "x": -0.44464683532714844, | ||
| 2265 | "y": 0.019300000742077827, | ||
| 2266 | "z": -0.07282185554504395 | ||
| 2267 | }, | ||
| 2268 | "localOrientation": { | ||
| 2269 | "w": 0.000, | ||
| 2270 | "x": 0.000, | ||
| 2271 | "y": 0.707, | ||
| 2272 | "z": 0.707 | ||
| 2273 | } | ||
| 2274 | }, | ||
| 2275 | { | ||
| 2276 | "key": "\"", | ||
| 2277 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2278 | "texture": { | ||
| 2279 | "file9": "meshes/keyboard/key_dquote.png", | ||
| 2280 | "file10": "meshes/keyboard/key_dquote.png" | ||
| 2281 | }, | ||
| 2282 | "dimensions": { | ||
| 2283 | "x": 0.04787999764084816, | ||
| 2284 | "z": 0.02051999792456627, | ||
| 2285 | "y": 0.04787999764084816 | ||
| 2286 | }, | ||
| 2287 | "position": { | ||
| 2288 | "x": -0.1630725860595703, | ||
| 2289 | "y": 0.019300000742077827, | ||
| 2290 | "z": -0.07284045219421387 | ||
| 2291 | }, | ||
| 2292 | "localOrientation": { | ||
| 2293 | "w": 0.000, | ||
| 2294 | "x": 0.000, | ||
| 2295 | "y": 0.707, | ||
| 2296 | "z": 0.707 | ||
| 2297 | } | ||
| 2298 | }, | ||
| 2299 | { | ||
| 2300 | "key": "DEL", | ||
| 2301 | "type": "backspace", | ||
| 2302 | "dimensions": { | ||
| 2303 | "x": 0.04787999764084816, | ||
| 2304 | "z": 0.020519999787211418, | ||
| 2305 | "y": 0.04787999764084816 | ||
| 2306 | }, | ||
| 2307 | "position": { | ||
| 2308 | "x": -0.53203323516845703, | ||
| 2309 | "y": 0.019300000742077827, | ||
| 2310 | "z": -0.07286686894893646 | ||
| 2311 | }, | ||
| 2312 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2313 | "texture": { | ||
| 2314 | "file9": "meshes/keyboard/key_backspace.png", | ||
| 2315 | "file10": "meshes/keyboard/key_backspace.png" | ||
| 2316 | }, | ||
| 2317 | "localOrientation": { | ||
| 2318 | "w": 0.000, | ||
| 2319 | "x": 0.000, | ||
| 2320 | "y": 0.707, | ||
| 2321 | "z": 0.707 | ||
| 2322 | } | ||
| 2323 | }, | ||
| 2324 | { | ||
| 2325 | "key": "Caps", | ||
| 2326 | "type": "caps", | ||
| 2327 | "switchToLayer": 1, | ||
| 2328 | "dimensions": { | ||
| 2329 | "x": 0.04787999764084816, | ||
| 2330 | "z": 0.020519999787211418, | ||
| 2331 | "y": 0.04787999764084816 | ||
| 2332 | }, | ||
| 2333 | "position": { | ||
| 2334 | "x": -0.02603323516845703, | ||
| 2335 | "y": 0.019300000742077827, | ||
| 2336 | "z": -0.07285571098327637 | ||
| 2337 | }, | ||
| 2338 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2339 | "texture": { | ||
| 2340 | "file9": "meshes/keyboard/key_cap.png", | ||
| 2341 | "file10": "meshes/keyboard/key_cap.png" | ||
| 2342 | }, | ||
| 2343 | "localOrientation": { | ||
| 2344 | "w": 0.000, | ||
| 2345 | "x": 0.000, | ||
| 2346 | "y": 0.707, | ||
| 2347 | "z": 0.707 | ||
| 2348 | } | ||
| 2349 | }, | ||
| 2350 | { | ||
| 2351 | "key": "Close", | ||
| 2352 | "type": "close", | ||
| 2353 | "dimensions": { | ||
| 2354 | "x": 0.04787999764084816, | ||
| 2355 | "z": 0.020519999787211418, | ||
| 2356 | "y": 0.04787999764084816 | ||
| 2357 | }, | ||
| 2358 | "position": { | ||
| 2359 | "x": -0.59333323516845703, | ||
| 2360 | "y": 0.019300000742077827, | ||
| 2361 | "z": 0.037454843521118164 | ||
| 2362 | }, | ||
| 2363 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2364 | "texture": { | ||
| 2365 | "file9": "meshes/keyboard/key_exit.png", | ||
| 2366 | "file10": "meshes/keyboard/key_exit.png" | ||
| 2367 | }, | ||
| 2368 | "localOrientation": { | ||
| 2369 | "w": 0.000, | ||
| 2370 | "x": 0.000, | ||
| 2371 | "y": 0.707, | ||
| 2372 | "z": 0.707 | ||
| 2373 | } | ||
| 2374 | }, | ||
| 2375 | { | ||
| 2376 | "key": "Enter", | ||
| 2377 | "type": "enter", | ||
| 2378 | "dimensions": { | ||
| 2379 | "x": 0.08787999764084816, | ||
| 2380 | "z": 0.020519999787211418, | ||
| 2381 | "y": 0.04787999764084816 | ||
| 2382 | }, | ||
| 2383 | "position": { | ||
| 2384 | "x": -0.5103323516845703, | ||
| 2385 | "y": 0.019300000742077827, | ||
| 2386 | "z": -0.127054843521118164 | ||
| 2387 | }, | ||
| 2388 | "modelURL": "meshes/keyboard/SM_enter.fbx", | ||
| 2389 | "texture": { | ||
| 2390 | "file10": "meshes/keyboard/key_enter.png", | ||
| 2391 | "file11": "meshes/keyboard/key_enter.png" | ||
| 2392 | }, | ||
| 2393 | "localOrientation": { | ||
| 2394 | "w": 0.000, | ||
| 2395 | "x": 0.000, | ||
| 2396 | "y": 0.707, | ||
| 2397 | "z": 0.707 | ||
| 2398 | } | ||
| 2399 | }, | ||
| 2400 | { | ||
| 2401 | "key": "numbers", | ||
| 2402 | "type": "layer", | ||
| 2403 | "switchToLayer": 0, | ||
| 2404 | "dimensions": { | ||
| 2405 | "x": 0.07787999764084816, | ||
| 2406 | "z": 0.020519999787211418, | ||
| 2407 | "y": 0.04787999764084816 | ||
| 2408 | }, | ||
| 2409 | "position": { | ||
| 2410 | "x": -0.026323516845703, | ||
| 2411 | "y": 0.019300000742077827, | ||
| 2412 | "z": -0.127054843521118164 | ||
| 2413 | }, | ||
| 2414 | "modelURL": "meshes/keyboard/SM_enter.fbx", | ||
| 2415 | "texture": { | ||
| 2416 | "file10": "meshes/keyboard/key_abc.png", | ||
| 2417 | "file11": "meshes/keyboard/key_abc.png" | ||
| 2418 | }, | ||
| 2419 | "localOrientation": { | ||
| 2420 | "w": 0.000, | ||
| 2421 | "x": 0.000, | ||
| 2422 | "y": 0.707, | ||
| 2423 | "z": 0.707 | ||
| 2424 | } | ||
| 2425 | }, | ||
| 2426 | { | ||
| 2427 | "key": ".", | ||
| 2428 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2429 | "texture": { | ||
| 2430 | "file9": "meshes/keyboard/key_period.png", | ||
| 2431 | "file10": "meshes/keyboard/key_period.png" | ||
| 2432 | }, | ||
| 2433 | "dimensions": { | ||
| 2434 | "x": 0.04787999764084816, | ||
| 2435 | "z": 0.02051999792456627, | ||
| 2436 | "y": 0.04787999764084816 | ||
| 2437 | }, | ||
| 2438 | "position": { | ||
| 2439 | "x": -0.38794422149658203, | ||
| 2440 | "y": 0.019300000742077827, | ||
| 2441 | "z": -0.12705934047698975 | ||
| 2442 | }, | ||
| 2443 | "localOrientation": { | ||
| 2444 | "w": 0.000, | ||
| 2445 | "x": 0.000, | ||
| 2446 | "y": 0.707, | ||
| 2447 | "z": 0.707 | ||
| 2448 | } | ||
| 2449 | }, | ||
| 2450 | { | ||
| 2451 | "key": ",", | ||
| 2452 | "modelURL": "meshes/keyboard/SM_key.fbx", | ||
| 2453 | "texture": { | ||
| 2454 | "file9": "meshes/keyboard/key_comma.png", | ||
| 2455 | "file10": "meshes/keyboard/key_comma.png" | ||
| 2456 | }, | ||
| 2457 | "dimensions": { | ||
| 2458 | "x": 0.04787999764084816, | ||
| 2459 | "z": 0.02051999792456627, | ||
| 2460 | "y": 0.04787999764084816 | ||
| 2461 | }, | ||
| 2462 | "position": { | ||
| 2463 | "x": -0.1630725860595703, | ||
| 2464 | "y": 0.019300000742077827, | ||
| 2465 | "z": -0.12705934047698975 | ||
| 2466 | }, | ||
| 2467 | "localOrientation": { | ||
| 2468 | "w": 0.000, | ||
| 2469 | "x": 0.000, | ||
| 2470 | "y": 0.707, | ||
| 2471 | "z": 0.707 | ||
| 2472 | } | ||
| 2473 | } | ||
| 2474 | ] | ||
| 2475 | ] | ||
| 2476 | } | ||
| @@ -51,32 +51,34 @@ · 50 unmodified lines | |||
| 51 | { "from": "Vive.RSCenter", "to": "Standard.RightPrimaryThumb" }, | 51 | { "from": "Vive.RSCenter", "to": "Standard.RightPrimaryThumb" }, |
| 52 | { "from": "Vive.RightApplicationMenu", "to": "Standard.RightSecondaryThumb" }, | 52 | { "from": "Vive.RightApplicationMenu", "to": "Standard.RightSecondaryThumb" }, |
| 53 | 53 | ||
| 54 | { "from": "Vive.LeftHand", "to": "Standard.LeftHand"}, | 54 | { "from": "Vive.LeftHand", "to": "Standard.LeftHand" }, |
| 55 | { "from": "Vive.RightHand", "to": "Standard.RightHand"}, | 55 | { "from": "Vive.RightHand", "to": "Standard.RightHand" }, |
| 56 | { "from": "Vive.Head", "to" : "Standard.Head" }, | ||
| 56 | 57 | ||
| 57 | { | 58 | { |
| 58 | "from": "Vive.LeftFoot", "to" : "Standard.LeftFoot", | 59 | "from": "Vive.LeftFoot", "to" : "Standard.LeftFoot", |
| 59 | "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.3}] | 60 | "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.15}] |
| 60 | }, | 61 | }, |
| 61 | |||
| 62 | { | 62 | { |
| 63 | "from": "Vive.RightFoot", "to" : "Standard.RightFoot", | 63 | "from": "Vive.RightFoot", "to" : "Standard.RightFoot", |
| 64 | "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.3}] | 64 | "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.15}] |
| 65 | }, | 65 | }, |
| 66 | |||
| 67 | { | 66 | { |
| 68 | "from": "Vive.Hips", "to" : "Standard.Hips", | 67 | "from": "Vive.Hips", "to" : "Standard.Hips", |
| 69 | "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.3}] | 68 | "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.15}] |
| 70 | }, | 69 | }, |
| 71 | |||
| 72 | { | 70 | { |
| 73 | "from": "Vive.Spine2", "to" : "Standard.Spine2", | 71 | "from": "Vive.Spine2", "to" : "Standard.Spine2", |
| 74 | "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.3}] | 72 | "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.15}] |
| 73 | }, | ||
| 74 | { | ||
| 75 | "from": "Vive.RightArm", "to" : "Standard.RightArm", | ||
| 76 | "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.15}] | ||
| 77 | }, | ||
| 78 | { | ||
| 79 | "from": "Vive.LeftArm", "to" : "Standard.LeftArm", | ||
| 80 | "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.15}] | ||
| 75 | }, | 81 | }, |
| 76 | |||
| 77 | { "from": "Vive.Head", "to" : "Standard.Head"}, | ||
| 78 | { "from": "Vive.RightArm", "to" : "Standard.RightArm" }, | ||
| 79 | { "from": "Vive.LeftArm", "to" : "Standard.LeftArm" }, | ||
| 80 | 82 | ||
| 81 | { "from": "Vive.TrackedObject00", "to" : "Standard.TrackedObject00" }, | 83 | { "from": "Vive.TrackedObject00", "to" : "Standard.TrackedObject00" }, |
| 82 | { "from": "Vive.TrackedObject01", "to" : "Standard.TrackedObject01" }, | 84 | { "from": "Vive.TrackedObject01", "to" : "Standard.TrackedObject01" }, |
| @@ -0,0 +1,4 @@ | |||
| 1 | <svg width="22" height="26" fill="none" version="1.1" viewBox="0 0 22 26" xmlns="http://www.w3.org/2000/svg"> | ||
| 2 | <path d="M1 7L11 1L21 7M1 7L11 13M1 7V19L11 25M11 13L21 7M11 13V25M21 7V19L11 25" stroke="#000" stroke-linejoin="round" stroke-width="2"/> | ||
| 3 | <circle class="st1" cx="19.407" cy="2.5881" r="2.5846" fill="#ef3b4e" stroke-width=".24043"/> | ||
| 4 | </svg> | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | <svg width="22" height="26" viewBox="0 0 22 26" fill="none" xmlns="http://www.w3.org/2000/svg"> | ||
| 2 | <path d="M1 7L11 1L21 7M1 7L11 13M1 7V19L11 25M11 13L21 7M11 13V25M21 7V19L11 25" stroke="black" stroke-width="2" stroke-linejoin="round"/> | ||
| 3 | </svg> | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | <svg width="22" height="26" fill="none" version="1.1" viewBox="0 0 22 26" xmlns="http://www.w3.org/2000/svg"> | ||
| 2 | <path d="M1 7L11 1L21 7M1 7L11 13M1 7V19L11 25M11 13L21 7M11 13V25M21 7V19L11 25" stroke="#fff" stroke-linejoin="round" stroke-width="2"/> | ||
| 3 | <circle class="st1" cx="19.41" cy="2.5828" r="2.5846" fill="#ef3b4e" stroke-width=".24043"/> | ||
| 4 | </svg> | ||
| @@ -0,0 +1,3 @@ | |||
| 1 | <svg width="22" height="26" viewBox="0 0 22 26" fill="none" xmlns="http://www.w3.org/2000/svg"> | ||
| 2 | <path d="M1 7L11 1L21 7M1 7L11 13M1 7V19L11 25M11 13L21 7M11 13V25M21 7V19L11 25" stroke="white" stroke-width="2" stroke-linejoin="round"/> | ||
| 3 | </svg> | ||
| @@ -1,6 +0,0 @@ | |||
| 1 | <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve"> | ||
| 2 | <style type="text/css"> | ||
| 3 | .st1{fill:#EF3B4E;} | ||
| 4 | </style> | ||
| 5 | <circle class="st1" cx="84.6" cy="11.5" r="10.75"/> | ||
| 6 | <g><path d="M2.4,70.5c0,6.1,4.9,11,11,11H76c6.1,0,11-4.9,11-11V59.6c3.7-0.7,6.6-3.9,6.6-7.9v-7.5c0-3.9-2.8-7.2-6.6-7.9V25.5 c0-6.1-4.9-11-11-11H13.4c-6.1,0-11,4.9-11,11V70.5z M87.6,51.8c0,1.1-0.9,2-2,2H72.2c-2.8,0-5-2.2-5-5v-1.5c0-2.8,2.2-5,5-5h13.3 c1.1,0,2,0.9,2,2V51.8z M8.4,25.5c0-2.8,2.2-5,5-5H76c2.8,0,5,2.2,5,5v10.7h-8.7c-6.1,0-11,4.9-11,11v1.5c0,6.1,4.9,11,11,11H81 v10.7c0,2.8-2.2,5-5,5H13.4c-2.8,0-5-2.2-5-5V25.5z"></path></g></svg> | ||
| @@ -1 +0,0 @@ | |||
| 1 | <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve"><g><path d="M2.4,70.5c0,6.1,4.9,11,11,11H76c6.1,0,11-4.9,11-11V59.6c3.7-0.7,6.6-3.9,6.6-7.9v-7.5c0-3.9-2.8-7.2-6.6-7.9V25.5 c0-6.1-4.9-11-11-11H13.4c-6.1,0-11,4.9-11,11V70.5z M87.6,51.8c0,1.1-0.9,2-2,2H72.2c-2.8,0-5-2.2-5-5v-1.5c0-2.8,2.2-5,5-5h13.3 c1.1,0,2,0.9,2,2V51.8z M8.4,25.5c0-2.8,2.2-5,5-5H76c2.8,0,5,2.2,5,5v10.7h-8.7c-6.1,0-11,4.9-11,11v1.5c0,6.1,4.9,11,11,11H81 v10.7c0,2.8-2.2,5-5,5H13.4c-2.8,0-5-2.2-5-5V25.5z"></path></g></svg> | ||
| @@ -1,16 +0,0 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> | ||
| 3 | <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | ||
| 4 | viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve"> | ||
| 5 | <style type="text/css"> | ||
| 6 | .st0{fill:#FFFFFF;} | ||
| 7 | .st1{fill:#EF3B4E;} | ||
| 8 | </style> | ||
| 9 | <circle class="st1" cx="84.6" cy="11.5" r="10.75"/> | ||
| 10 | <g> | ||
| 11 | <path class="st0" d="M2.4,70.5c0,6.1,4.9,11,11,11H76c6.1,0,11-4.9,11-11V59.6c3.7-0.7,6.6-3.9,6.6-7.9v-7.5c0-3.9-2.8-7.2-6.6-7.9 | ||
| 12 | V25.5c0-6.1-4.9-11-11-11H13.4c-6.1,0-11,4.9-11,11C2.4,25.5,2.4,70.5,2.4,70.5z M87.6,51.8c0,1.1-0.9,2-2,2H72.2c-2.8,0-5-2.2-5-5 | ||
| 13 | v-1.5c0-2.8,2.2-5,5-5h13.3c1.1,0,2,0.9,2,2L87.6,51.8L87.6,51.8z M8.4,25.5c0-2.8,2.2-5,5-5H76c2.8,0,5,2.2,5,5v10.7h-8.7 | ||
| 14 | c-6.1,0-11,4.9-11,11v1.5c0,6.1,4.9,11,11,11H81v10.7c0,2.8-2.2,5-5,5H13.4c-2.8,0-5-2.2-5-5V25.5z"/> | ||
| 15 | </g> | ||
| 16 | </svg> | ||
| @@ -1,14 +0,0 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> | ||
| 3 | <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | ||
| 4 | viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve"> | ||
| 5 | <style type="text/css"> | ||
| 6 | .st0{fill:#FFFFFF;} | ||
| 7 | </style> | ||
| 8 | <g> | ||
| 9 | <path class="st0" d="M2.4,70.5c0,6.1,4.9,11,11,11H76c6.1,0,11-4.9,11-11V59.6c3.7-0.7,6.6-3.9,6.6-7.9v-7.5c0-3.9-2.8-7.2-6.6-7.9 | ||
| 10 | V25.5c0-6.1-4.9-11-11-11H13.4c-6.1,0-11,4.9-11,11C2.4,25.5,2.4,70.5,2.4,70.5z M87.6,51.8c0,1.1-0.9,2-2,2H72.2c-2.8,0-5-2.2-5-5 | ||
| 11 | v-1.5c0-2.8,2.2-5,5-5h13.3c1.1,0,2,0.9,2,2L87.6,51.8L87.6,51.8z M8.4,25.5c0-2.8,2.2-5,5-5H76c2.8,0,5,2.2,5,5v10.7h-8.7 | ||
| 12 | c-6.1,0-11,4.9-11,11v1.5c0,6.1,4.9,11,11,11H81v10.7c0,2.8-2.2,5-5,5H13.4c-2.8,0-5-2.2-5-5V25.5z"/> | ||
| 13 | </g> | ||
| 14 | </svg> | ||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,8 @@ | |||
| 1 | { | ||
| 2 | "compressed": { | ||
| 3 | "COMPRESSED_SRGB8_ALPHA8_ETC2_EAC": "../Eyes_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.ktx", | ||
| 4 | "COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT": "../Eyes_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT.ktx" | ||
| 5 | }, | ||
| 6 | "original": "../Eyes.png", | ||
| 7 | "uncompressed": "" | ||
| 8 | } | ||
Binary file not shown.
File renamed without changes.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,8 @@ | |||
| 1 | { | ||
| 2 | "compressed": { | ||
| 3 | "COMPRESSED_SRGB8_ALPHA8_ETC2_EAC": "../lambert1_Base_Color_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.ktx", | ||
| 4 | "COMPRESSED_SRGB_S3TC_DXT1_EXT": "../lambert1_Base_Color_COMPRESSED_SRGB_S3TC_DXT1_EXT.ktx" | ||
| 5 | }, | ||
| 6 | "original": "../lambert1_Base_Color.png", | ||
| 7 | "uncompressed": "" | ||
| 8 | } | ||
Binary file not shown.
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,8 @@ | |||
| 1 | { | ||
| 2 | "compressed": { | ||
| 3 | "COMPRESSED_RG11_EAC": "../lambert1_Normal_OpenGL_COMPRESSED_RG11_EAC.ktx", | ||
| 4 | "COMPRESSED_RG_RGTC2": "../lambert1_Normal_OpenGL_COMPRESSED_RG_RGTC2.ktx" | ||
| 5 | }, | ||
| 6 | "original": "../lambert1_Normal_OpenGL.png", | ||
| 7 | "uncompressed": "" | ||
| 8 | } | ||
Binary file not shown.
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,8 @@ | |||
| 1 | { | ||
| 2 | "compressed": { | ||
| 3 | "COMPRESSED_R11_EAC": "../lambert1_Roughness_COMPRESSED_R11_EAC.ktx", | ||
| 4 | "COMPRESSED_RED_RGTC1": "../lambert1_Roughness_COMPRESSED_RED_RGTC1.ktx" | ||
| 5 | }, | ||
| 6 | "original": "../lambert1_Roughness.png", | ||
| 7 | "uncompressed": "" | ||
| 8 | } | ||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
| @@ -10,6 +10,7 @@ Item { · 9 unmodified lines | |||
| 10 | property int modality: Qt.NonModal | 10 | property int modality: Qt.NonModal |
| 11 | implicitHeight: row.height | 11 | implicitHeight: row.height |
| 12 | implicitWidth: row.width | 12 | implicitWidth: row.width |
| 13 | visible: false | ||
| 13 | 14 | ||
| 14 | Component.onCompleted: { | 15 | Component.onCompleted: { |
| 15 | stats.parentChanged.connect(fill); | 16 | stats.parentChanged.connect(fill); |
| @@ -10,8 +10,8 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import QtQuick.Controls 1.4 | 12 | import QtQuick.Controls 1.4 |
| 13 | import "styles-uit" | 13 | import stylesUit 1.0 |
| 14 | import "controls-uit" as HifiControlsUit | 14 | import controlsUit 1.0 as HifiControlsUit |
| 15 | 15 | ||
| 16 | Item { | 16 | Item { |
| 17 | id: root | 17 | id: root |
| @@ -2,9 +2,9 @@ import QtQuick 2.5 · 1 unmodified line | |||
| 2 | import QtWebChannel 1.0 | 2 | import QtWebChannel 1.0 |
| 3 | import QtWebEngine 1.5 | 3 | import QtWebEngine 1.5 |
| 4 | 4 | ||
| 5 | import "controls-uit" | 5 | import controlsUit 1.0 |
| 6 | import "styles" as HifiStyles | 6 | import "styles" as HifiStyles |
| 7 | import "styles-uit" | 7 | import stylesUit 1.0 |
| 8 | import "windows" | 8 | import "windows" |
| 9 | 9 | ||
| 10 | ScrollingWindow { | 10 | ScrollingWindow { |
| @@ -10,8 +10,8 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import QtQuick.Controls 1.4 | 12 | import QtQuick.Controls 1.4 |
| 13 | import "styles-uit" | 13 | import stylesUit 1.0 |
| 14 | import "controls-uit" as HifiControls | 14 | import controlsUit 1.0 as HifiControls |
| 15 | 15 | ||
| 16 | Item { | 16 | Item { |
| 17 | id: root | 17 | id: root |
| @@ -11,7 +11,7 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import Hifi 1.0 as Hifi | 12 | import Hifi 1.0 as Hifi |
| 13 | 13 | ||
| 14 | import "controls-uit" | 14 | import controlsUit 1.0 |
| 15 | import "windows" as Windows | 15 | import "windows" as Windows |
| 16 | 16 | ||
| 17 | Windows.ScrollingWindow { | 17 | Windows.ScrollingWindow { |
| @@ -12,9 +12,9 @@ import QtQuick 2.3 · 11 unmodified lines | |||
| 12 | 12 | ||
| 13 | import "windows" as Windows | 13 | import "windows" as Windows |
| 14 | import "controls" | 14 | import "controls" |
| 15 | import "controls-uit" as Controls | 15 | import controlsUit 1.0 as Controls |
| 16 | import "styles" | 16 | import "styles" |
| 17 | import "styles-uit" | 17 | import stylesUit 1.0 |
| 18 | 18 | ||
| 19 | Windows.Window { | 19 | Windows.Window { |
| 20 | id: root; | 20 | id: root; |
| @@ -11,8 +11,8 @@ · 10 unmodified lines | |||
| 11 | import Hifi 1.0 | 11 | import Hifi 1.0 |
| 12 | import QtQuick 2.4 | 12 | import QtQuick 2.4 |
| 13 | 13 | ||
| 14 | import "controls-uit" | 14 | import controlsUit 1.0 |
| 15 | import "styles-uit" | 15 | import stylesUit 1.0 |
| 16 | import "windows" | 16 | import "windows" |
| 17 | 17 | ||
| 18 | import "LoginDialog" | 18 | import "LoginDialog" |
| @@ -13,8 +13,8 @@ import QtQuick 2.4 · 12 unmodified lines | |||
| 13 | import QtQuick.Controls 1.4 | 13 | import QtQuick.Controls 1.4 |
| 14 | import QtQuick.Controls.Styles 1.4 as OriginalStyles | 14 | import QtQuick.Controls.Styles 1.4 as OriginalStyles |
| 15 | 15 | ||
| 16 | import "../../controls-uit" | 16 | import controlsUit 1.0 |
| 17 | import "../../styles-uit" | 17 | import stylesUit 1.0 |
| 18 | 18 | ||
| 19 | Item { | 19 | Item { |
| 20 | id: linkAccountBody | 20 | id: linkAccountBody |
| @@ -13,8 +13,8 @@ import QtQuick 2.4 · 12 unmodified lines | |||
| 13 | import QtQuick.Controls 1.4 | 13 | import QtQuick.Controls 1.4 |
| 14 | import QtQuick.Controls.Styles 1.4 as OriginalStyles | 14 | import QtQuick.Controls.Styles 1.4 as OriginalStyles |
| 15 | 15 | ||
| 16 | import "../../controls-uit" | 16 | import controlsUit 1.0 |
| 17 | import "../../styles-uit" | 17 | import stylesUit 1.0 |
| 18 | 18 | ||
| 19 | Item { | 19 | Item { |
| 20 | id: signupBody | 20 | id: signupBody |
| @@ -12,8 +12,8 @@ import Hifi 1.0 · 11 unmodified lines | |||
| 12 | import QtQuick 2.4 | 12 | import QtQuick 2.4 |
| 13 | import QtQuick.Controls.Styles 1.4 as OriginalStyles | 13 | import QtQuick.Controls.Styles 1.4 as OriginalStyles |
| 14 | 14 | ||
| 15 | import "../controls-uit" | 15 | import controlsUit 1.0 |
| 16 | import "../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | 17 | ||
| 18 | Item { | 18 | Item { |
| 19 | id: completeProfileBody | 19 | id: completeProfileBody |
| @@ -13,8 +13,9 @@ import QtQuick 2.7 · 12 unmodified lines | |||
| 13 | import QtQuick.Controls 1.4 | 13 | import QtQuick.Controls 1.4 |
| 14 | import QtQuick.Controls.Styles 1.4 as OriginalStyles | 14 | import QtQuick.Controls.Styles 1.4 as OriginalStyles |
| 15 | 15 | ||
| 16 | import "../controls-uit" | 16 | import controlsUit 1.0 |
| 17 | import "../styles-uit" | 17 | import stylesUit 1.0 |
| 18 | |||
| 18 | Item { | 19 | Item { |
| 19 | id: linkAccountBody | 20 | id: linkAccountBody |
| 20 | clip: true | 21 | clip: true |
| @@ -96,7 +97,7 @@ Item { · 75 unmodified lines | |||
| 96 | topMargin: hifi.dimensions.contentSpacing.y | 97 | topMargin: hifi.dimensions.contentSpacing.y |
| 97 | } | 98 | } |
| 98 | 99 | ||
| 99 | text: qsTr("Sign in to High Fidelity to make friends, get HFC, and buy interesting things on the Marketplace!") | 100 | text: qsTr("Sign in to High Fidelity to make friends, get HFC, and get interesting things on the Marketplace!") |
| 100 | width: parent.width | 101 | width: parent.width |
| 101 | wrapMode: Text.WordWrap | 102 | wrapMode: Text.WordWrap |
| 102 | lineHeight: 1 | 103 | lineHeight: 1 |
| @@ -136,7 +137,7 @@ Item { · 33 unmodified lines | |||
| 136 | 137 | ||
| 137 | TextField { | 138 | TextField { |
| 138 | id: usernameField | 139 | id: usernameField |
| 139 | text: Settings.getValue("wallet/savedUsername", ""); | 140 | text: Settings.getValue("keepMeLoggedIn/savedUsername", ""); |
| 140 | width: parent.width | 141 | width: parent.width |
| 141 | focus: true | 142 | focus: true |
| 142 | placeholderText: "Username or Email" | 143 | placeholderText: "Username or Email" |
| @@ -165,7 +166,7 @@ Item { · 22 unmodified lines | |||
| 165 | root.text = ""; | 166 | root.text = ""; |
| 166 | } | 167 | } |
| 167 | Component.onCompleted: { | 168 | Component.onCompleted: { |
| 168 | var savedUsername = Settings.getValue("wallet/savedUsername", ""); | 169 | var savedUsername = Settings.getValue("keepMeLoggedIn/savedUsername", ""); |
| 169 | usernameField.text = savedUsername === "Unknown user" ? "" : savedUsername; | 170 | usernameField.text = savedUsername === "Unknown user" ? "" : savedUsername; |
| 170 | } | 171 | } |
| 171 | } | 172 | } |
| @@ -239,7 +240,10 @@ Item { · 67 unmodified lines | |||
| 239 | 240 | ||
| 240 | } | 241 | } |
| 241 | 242 | ||
| 242 | Keys.onReturnPressed: linkAccountBody.login() | 243 | Keys.onReturnPressed: { |
| 244 | Settings.setValue("keepMeLoggedIn/savedUsername", usernameField.text); | ||
| 245 | linkAccountBody.login(); | ||
| 246 | } | ||
| 243 | } | 247 | } |
| 244 | 248 | ||
| 245 | InfoItem { | 249 | InfoItem { |
| @@ -263,21 +267,21 @@ Item { · 17 unmodified lines | |||
| 263 | 267 | ||
| 264 | CheckBox { | 268 | CheckBox { |
| 265 | id: autoLogoutCheckbox | 269 | id: autoLogoutCheckbox |
| 266 | checked: !Settings.getValue("wallet/autoLogout", true) | 270 | checked: Settings.getValue("keepMeLoggedIn", false) |
| 267 | text: "Keep me signed in" | 271 | text: "Keep me logged in" |
| 268 | boxSize: 20; | 272 | boxSize: 20; |
| 269 | labelFontSize: 15 | 273 | labelFontSize: 15 |
| 270 | color: hifi.colors.black | 274 | color: hifi.colors.black |
| 271 | onCheckedChanged: { | 275 | onCheckedChanged: { |
| 272 | Settings.setValue("wallet/autoLogout", !checked); | 276 | Settings.setValue("keepMeLoggedIn", checked); |
| 273 | if (checked) { | 277 | if (checked) { |
| 274 | Settings.setValue("wallet/savedUsername", Account.username); | 278 | Settings.setValue("keepMeLoggedIn/savedUsername", usernameField.text); |
| 275 | } else { | 279 | } else { |
| 276 | Settings.setValue("wallet/savedUsername", ""); | 280 | Settings.setValue("keepMeLoggedIn/savedUsername", ""); |
| 277 | } | 281 | } |
| 278 | } | 282 | } |
| 279 | Component.onDestruction: { | 283 | Component.onDestruction: { |
| 280 | Settings.setValue("wallet/autoLogout", !checked); | 284 | Settings.setValue("keepMeLoggedIn", checked); |
| 281 | } | 285 | } |
| 282 | } | 286 | } |
| 283 | 287 | ||
| @@ -289,7 +293,10 @@ Item { · 5 unmodified lines | |||
| 289 | text: qsTr(loginDialog.isSteamRunning() ? "Link Account" : "Log in") | 293 | text: qsTr(loginDialog.isSteamRunning() ? "Link Account" : "Log in") |
| 290 | color: hifi.buttons.blue | 294 | color: hifi.buttons.blue |
| 291 | 295 | ||
| 292 | onClicked: linkAccountBody.login() | 296 | onClicked: { |
| 297 | Settings.setValue("keepMeLoggedIn/savedUsername", usernameField.text); | ||
| 298 | linkAccountBody.login(); | ||
| 299 | } | ||
| 293 | } | 300 | } |
| 294 | } | 301 | } |
| 295 | 302 | ||
| @@ -403,6 +410,7 @@ Item { · 107 unmodified lines | |||
| 403 | case Qt.Key_Enter: | 410 | case Qt.Key_Enter: |
| 404 | case Qt.Key_Return: | 411 | case Qt.Key_Return: |
| 405 | event.accepted = true | 412 | event.accepted = true |
| 413 | Settings.setValue("keepMeLoggedIn/savedUsername", usernameField.text); | ||
| 406 | linkAccountBody.login() | 414 | linkAccountBody.login() |
| 407 | break | 415 | break |
| 408 | } | 416 | } |
| @@ -12,8 +12,8 @@ import Hifi 1.0 · 11 unmodified lines | |||
| 12 | import QtQuick 2.7 | 12 | import QtQuick 2.7 |
| 13 | import QtQuick.Controls.Styles 1.4 as OriginalStyles | 13 | import QtQuick.Controls.Styles 1.4 as OriginalStyles |
| 14 | 14 | ||
| 15 | import "../controls-uit" | 15 | import controlsUit 1.0 |
| 16 | import "../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | 17 | ||
| 18 | Item { | 18 | Item { |
| 19 | id: signInBody | 19 | id: signInBody |
| @@ -12,8 +12,8 @@ import Hifi 1.0 · 11 unmodified lines | |||
| 12 | import QtQuick 2.7 | 12 | import QtQuick 2.7 |
| 13 | import QtQuick.Controls 1.4 | 13 | import QtQuick.Controls 1.4 |
| 14 | 14 | ||
| 15 | import "../controls-uit" | 15 | import controlsUit 1.0 |
| 16 | import "../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | 17 | ||
| 18 | Item { | 18 | Item { |
| 19 | id: signupBody | 19 | id: signupBody |
| @@ -12,8 +12,8 @@ import Hifi 1.0 · 11 unmodified lines | |||
| 12 | import QtQuick 2.4 | 12 | import QtQuick 2.4 |
| 13 | import QtQuick.Controls 1.4 | 13 | import QtQuick.Controls 1.4 |
| 14 | 14 | ||
| 15 | import "../controls-uit" | 15 | import controlsUit 1.0 |
| 16 | import "../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | 17 | ||
| 18 | Item { | 18 | Item { |
| 19 | id: usernameCollisionBody | 19 | id: usernameCollisionBody |
| @@ -11,8 +11,8 @@ · 10 unmodified lines | |||
| 11 | import Hifi 1.0 | 11 | import Hifi 1.0 |
| 12 | import QtQuick 2.4 | 12 | import QtQuick 2.4 |
| 13 | 13 | ||
| 14 | import "../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | import "../styles-uit" | 15 | import stylesUit 1.0 |
| 16 | 16 | ||
| 17 | Item { | 17 | Item { |
| 18 | id: welcomeBody | 18 | id: welcomeBody |
| @@ -13,8 +13,8 @@ import QtWebEngine 1.1 · 12 unmodified lines | |||
| 13 | import QtWebChannel 1.0 | 13 | import QtWebChannel 1.0 |
| 14 | 14 | ||
| 15 | import "windows" as Windows | 15 | import "windows" as Windows |
| 16 | import "controls-uit" as Controls | 16 | import controlsUit 1.0 as Controls |
| 17 | import "styles-uit" | 17 | import stylesUit 1.0 |
| 18 | 18 | ||
| 19 | Windows.ScrollingWindow { | 19 | Windows.ScrollingWindow { |
| 20 | id: root | 20 | id: root |
| @@ -2,9 +2,9 @@ import QtQuick 2.3 · 1 unmodified line | |||
| 2 | 2 | ||
| 3 | import "windows" as Windows | 3 | import "windows" as Windows |
| 4 | import "controls" | 4 | import "controls" |
| 5 | import "controls-uit" as Controls | 5 | import controlsUit 1.0 as Controls |
| 6 | import "styles" | 6 | import "styles" |
| 7 | import "styles-uit" | 7 | import stylesUit 1.0 |
| 8 | 8 | ||
| 9 | Windows.Window { | 9 | Windows.Window { |
| 10 | id: root | 10 | id: root |
| @@ -3,9 +3,9 @@ import QtWebChannel 1.0 · 2 unmodified lines | |||
| 3 | import QtWebEngine 1.5 | 3 | import QtWebEngine 1.5 |
| 4 | 4 | ||
| 5 | import "controls" | 5 | import "controls" |
| 6 | import "controls-uit" as HifiControls | 6 | import controlsUit 1.0 as HifiControls |
| 7 | import "styles" as HifiStyles | 7 | import "styles" as HifiStyles |
| 8 | import "styles-uit" | 8 | import stylesUit 1.0 |
| 9 | import "windows" | 9 | import "windows" |
| 10 | 10 | ||
| 11 | Item { | 11 | Item { |
| @@ -4,9 +4,9 @@ import QtQuick.Controls 1.3 · 3 unmodified lines | |||
| 4 | import QtQuick.Controls.Styles 1.3 | 4 | import QtQuick.Controls.Styles 1.3 |
| 5 | import QtGraphicalEffects 1.0 | 5 | import QtGraphicalEffects 1.0 |
| 6 | 6 | ||
| 7 | import "controls-uit" | 7 | import controlsUit 1.0 |
| 8 | import "styles" as HifiStyles | 8 | import "styles" as HifiStyles |
| 9 | import "styles-uit" | 9 | import stylesUit 1.0 |
| 10 | import "windows" | 10 | import "windows" |
| 11 | 11 | ||
| 12 | ScrollingWindow { | 12 | ScrollingWindow { |
| @@ -1,170 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // AttachmentsTable.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 18 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | AttachmentsTable { |
| 12 | import QtQuick.Controls 1.4 | 4 | } |
| 13 | import QtQuick.Controls.Styles 1.4 | ||
| 14 | import QtQuick.XmlListModel 2.0 | ||
| 15 | |||
| 16 | import "../styles-uit" | ||
| 17 | import "../controls-uit" as HifiControls | ||
| 18 | import "../windows" | ||
| 19 | import "../hifi/models" | ||
| 20 | |||
| 21 | TableView { | ||
| 22 | id: tableView | ||
| 23 | |||
| 24 | property int colorScheme: hifi.colorSchemes.light | ||
| 25 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 26 | |||
| 27 | model: S3Model{} | ||
| 28 | |||
| 29 | Rectangle { | ||
| 30 | anchors.fill: parent | ||
| 31 | visible: tableView.model.status !== XmlListModel.Ready | ||
| 32 | color: hifi.colors.darkGray0 | ||
| 33 | BusyIndicator { | ||
| 34 | anchors.centerIn: parent | ||
| 35 | width: 48; height: 48 | ||
| 36 | running: true | ||
| 37 | } | ||
| 38 | } | ||
| 39 | |||
| 40 | headerDelegate: Rectangle { | ||
| 41 | height: hifi.dimensions.tableHeaderHeight | ||
| 42 | color: hifi.colors.darkGray | ||
| 43 | border.width: 0.5 | ||
| 44 | border.color: hifi.colors.baseGrayHighlight | ||
| 45 | |||
| 46 | RalewayRegular { | ||
| 47 | id: textHeader | ||
| 48 | size: hifi.fontSizes.tableHeading | ||
| 49 | color: hifi.colors.lightGrayText | ||
| 50 | text: styleData.value | ||
| 51 | anchors { | ||
| 52 | horizontalCenter: parent.horizontalCenter | ||
| 53 | verticalCenter: parent.verticalCenter | ||
| 54 | } | ||
| 55 | } | ||
| 56 | } | ||
| 57 | |||
| 58 | // Use rectangle to draw border with rounded corners. | ||
| 59 | Rectangle { | ||
| 60 | color: "#00000000" | ||
| 61 | anchors { fill: parent; margins: -2 } | ||
| 62 | radius: hifi.dimensions.borderRadius | ||
| 63 | border.color: hifi.colors.baseGrayHighlight | ||
| 64 | border.width: 3 | ||
| 65 | } | ||
| 66 | anchors.margins: 2 // Shrink TableView to lie within border. | ||
| 67 | backgroundVisible: true | ||
| 68 | |||
| 69 | horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff | ||
| 70 | verticalScrollBarPolicy: Qt.ScrollBarAsNeeded | ||
| 71 | |||
| 72 | style: TableViewStyle { | ||
| 73 | // Needed in order for rows to keep displaying rows after end of table entries. | ||
| 74 | backgroundColor: parent.isLightColorScheme ? hifi.colors.tableRowLightEven : hifi.colors.tableRowDarkEven | ||
| 75 | alternateBackgroundColor: parent.isLightColorScheme ? hifi.colors.tableRowLightOdd : hifi.colors.tableRowDarkOdd | ||
| 76 | |||
| 77 | handle: Item { | ||
| 78 | id: scrollbarHandle | ||
| 79 | implicitWidth: 6 | ||
| 80 | Rectangle { | ||
| 81 | anchors { | ||
| 82 | fill: parent | ||
| 83 | leftMargin: 2 // Move it right | ||
| 84 | rightMargin: -2 // "" | ||
| 85 | topMargin: 3 // Shrink vertically | ||
| 86 | bottomMargin: 3 // "" | ||
| 87 | } | ||
| 88 | radius: 3 | ||
| 89 | color: hifi.colors.tableScrollHandleDark | ||
| 90 | } | ||
| 91 | } | ||
| 92 | |||
| 93 | scrollBarBackground: Item { | ||
| 94 | implicitWidth: 10 | ||
| 95 | Rectangle { | ||
| 96 | anchors { | ||
| 97 | fill: parent | ||
| 98 | margins: -1 // Expand | ||
| 99 | } | ||
| 100 | color: hifi.colors.baseGrayHighlight | ||
| 101 | } | ||
| 102 | |||
| 103 | Rectangle { | ||
| 104 | anchors { | ||
| 105 | fill: parent | ||
| 106 | margins: 1 // Shrink | ||
| 107 | } | ||
| 108 | radius: 4 | ||
| 109 | color: hifi.colors.tableScrollBackgroundDark | ||
| 110 | } | ||
| 111 | } | ||
| 112 | |||
| 113 | incrementControl: Item { | ||
| 114 | visible: false | ||
| 115 | } | ||
| 116 | |||
| 117 | decrementControl: Item { | ||
| 118 | visible: false | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | rowDelegate: Rectangle { | ||
| 123 | height: hifi.dimensions.tableRowHeight | ||
| 124 | color: styleData.selected | ||
| 125 | ? hifi.colors.primaryHighlight | ||
| 126 | : tableView.isLightColorScheme | ||
| 127 | ? (styleData.alternate ? hifi.colors.tableRowLightEven : hifi.colors.tableRowLightOdd) | ||
| 128 | : (styleData.alternate ? hifi.colors.tableRowDarkEven : hifi.colors.tableRowDarkOdd) | ||
| 129 | } | ||
| 130 | |||
| 131 | itemDelegate: Item { | ||
| 132 | anchors { | ||
| 133 | left: parent ? parent.left : undefined | ||
| 134 | leftMargin: hifi.dimensions.tablePadding | ||
| 135 | right: parent ? parent.right : undefined | ||
| 136 | rightMargin: hifi.dimensions.tablePadding | ||
| 137 | } | ||
| 138 | FiraSansSemiBold { | ||
| 139 | id: textItem | ||
| 140 | text: styleData.value | ||
| 141 | size: hifi.fontSizes.tableText | ||
| 142 | color: colorScheme == hifi.colorSchemes.light | ||
| 143 | ? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight) | ||
| 144 | : (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText) | ||
| 145 | anchors { | ||
| 146 | horizontalCenter: parent.horizontalCenter | ||
| 147 | verticalCenter: parent.verticalCenter | ||
| 148 | } | ||
| 149 | } | ||
| 150 | } | ||
| 151 | |||
| 152 | TableViewColumn { | ||
| 153 | role: "name" | ||
| 154 | title: "NAME" | ||
| 155 | width: parent.width *0.3 | ||
| 156 | horizontalAlignment: Text.AlignHCenter | ||
| 157 | } | ||
| 158 | TableViewColumn { | ||
| 159 | role: "size" | ||
| 160 | title: "SIZE" | ||
| 161 | width: parent.width *0.2 | ||
| 162 | horizontalAlignment: Text.AlignHCenter | ||
| 163 | } | ||
| 164 | TableViewColumn { | ||
| 165 | role: "modified" | ||
| 166 | title: "LAST MODIFIED" | ||
| 167 | width: parent.width *0.5 | ||
| 168 | horizontalAlignment: Text.AlignHCenter | ||
| 169 | } | ||
| 170 | } | ||
| @@ -1,38 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // WebView.qml | ||
| 3 | // | ||
| 4 | // Created by Bradley Austin Davis on 12 Jan 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.7 | 3 | BaseWebView { |
| 12 | import QtWebEngine 1.5 | 4 | } |
| 13 | |||
| 14 | WebEngineView { | ||
| 15 | id: root | ||
| 16 | |||
| 17 | Component.onCompleted: { | ||
| 18 | console.log("Connecting JS messaging to Hifi Logging") | ||
| 19 | // Ensure the JS from the web-engine makes it to our logging | ||
| 20 | root.javaScriptConsoleMessage.connect(function(level, message, lineNumber, sourceID) { | ||
| 21 | console.log("Web Window JS message: " + sourceID + " " + lineNumber + " " + message); | ||
| 22 | }); | ||
| 23 | } | ||
| 24 | |||
| 25 | onLoadingChanged: { | ||
| 26 | // Required to support clicking on "hifi://" links | ||
| 27 | if (WebEngineView.LoadStartedStatus == loadRequest.status) { | ||
| 28 | var url = loadRequest.url.toString(); | ||
| 29 | if (urlHandler.canHandleUrl(url)) { | ||
| 30 | if (urlHandler.handleUrl(url)) { | ||
| 31 | root.stop(); | ||
| 32 | } | ||
| 33 | } | ||
| 34 | } | ||
| 35 | } | ||
| 36 | |||
| 37 | WebSpinner { } | ||
| 38 | } | ||
| @@ -1,122 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // Button.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 16 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.7 | 3 | Button { |
| 12 | import QtQuick.Controls 2.3 as Original | ||
| 13 | import TabletScriptingInterface 1.0 | ||
| 14 | |||
| 15 | import "../styles-uit" | ||
| 16 | |||
| 17 | Original.Button { | ||
| 18 | id: control; | ||
| 19 | |||
| 20 | property int color: 0 | ||
| 21 | property int colorScheme: hifi.colorSchemes.light | ||
| 22 | property int fontSize: hifi.fontSizes.buttonLabel | ||
| 23 | property int radius: hifi.buttons.radius | ||
| 24 | property alias implicitTextWidth: buttonText.implicitWidth | ||
| 25 | property string buttonGlyph: ""; | ||
| 26 | property int fontCapitalization: Font.AllUppercase | ||
| 27 | |||
| 28 | width: hifi.dimensions.buttonWidth | ||
| 29 | height: hifi.dimensions.controlLineHeight | ||
| 30 | |||
| 31 | HifiConstants { id: hifi } | ||
| 32 | |||
| 33 | onHoveredChanged: { | ||
| 34 | if (hovered) { | ||
| 35 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 36 | } | ||
| 37 | } | ||
| 38 | |||
| 39 | onFocusChanged: { | ||
| 40 | if (focus) { | ||
| 41 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 42 | } | ||
| 43 | } | ||
| 44 | |||
| 45 | onClicked: { | ||
| 46 | Tablet.playSound(TabletEnums.ButtonClick); | ||
| 47 | } | ||
| 48 | |||
| 49 | background: Rectangle { | ||
| 50 | radius: control.radius | ||
| 51 | |||
| 52 | border.width: (control.color === hifi.buttons.none || | ||
| 53 | (control.color === hifi.buttons.noneBorderless && control.hovered) || | ||
| 54 | (control.color === hifi.buttons.noneBorderlessWhite && control.hovered) || | ||
| 55 | (control.color === hifi.buttons.noneBorderlessGray && control.hovered)) ? 1 : 0; | ||
| 56 | border.color: control.color === hifi.buttons.noneBorderless ? hifi.colors.blueHighlight : | ||
| 57 | (control.color === hifi.buttons.noneBorderlessGray ? hifi.colors.baseGray : hifi.colors.white); | ||
| 58 | |||
| 59 | gradient: Gradient { | ||
| 60 | GradientStop { | ||
| 61 | position: 0.2 | ||
| 62 | color: { | ||
| 63 | if (!control.enabled) { | ||
| 64 | hifi.buttons.disabledColorStart[control.colorScheme] | ||
| 65 | } else if (control.pressed) { | ||
| 66 | hifi.buttons.pressedColor[control.color] | ||
| 67 | } else if (control.hovered) { | ||
| 68 | hifi.buttons.hoveredColor[control.color] | ||
| 69 | } else { | ||
| 70 | hifi.buttons.colorStart[control.color] | ||
| 71 | } | ||
| 72 | } | ||
| 73 | } | ||
| 74 | GradientStop { | ||
| 75 | position: 1.0 | ||
| 76 | color: { | ||
| 77 | if (!control.enabled) { | ||
| 78 | hifi.buttons.disabledColorFinish[control.colorScheme] | ||
| 79 | } else if (control.pressed) { | ||
| 80 | hifi.buttons.pressedColor[control.color] | ||
| 81 | } else if (control.hovered) { | ||
| 82 | hifi.buttons.hoveredColor[control.color] | ||
| 83 | } else { | ||
| 84 | hifi.buttons.colorFinish[control.color] | ||
| 85 | } | ||
| 86 | } | ||
| 87 | } | ||
| 88 | } | ||
| 89 | } | ||
| 90 | |||
| 91 | contentItem: Item { | ||
| 92 | HiFiGlyphs { | ||
| 93 | id: buttonGlyph; | ||
| 94 | visible: control.buttonGlyph !== ""; | ||
| 95 | text: control.buttonGlyph === "" ? hifi.glyphs.question : control.buttonGlyph; | ||
| 96 | // Size | ||
| 97 | size: 34; | ||
| 98 | // Anchors | ||
| 99 | anchors.right: buttonText.left; | ||
| 100 | anchors.top: parent.top; | ||
| 101 | anchors.bottom: parent.bottom; | ||
| 102 | // Style | ||
| 103 | color: enabled ? hifi.buttons.textColor[control.color] | ||
| 104 | : hifi.buttons.disabledTextColor[control.colorScheme]; | ||
| 105 | // Alignment | ||
| 106 | horizontalAlignment: Text.AlignHCenter; | ||
| 107 | verticalAlignment: Text.AlignVCenter; | ||
| 108 | } | ||
| 109 | RalewayBold { | ||
| 110 | id: buttonText; | ||
| 111 | anchors.centerIn: parent; | ||
| 112 | font.capitalization: control.fontCapitalization | ||
| 113 | color: enabled ? hifi.buttons.textColor[control.color] | ||
| 114 | : hifi.buttons.disabledTextColor[control.colorScheme] | ||
| 115 | size: control.fontSize | ||
| 116 | verticalAlignment: Text.AlignVCenter | ||
| 117 | horizontalAlignment: Text.AlignHCenter | ||
| 118 | text: control.text | ||
| 119 | } | ||
| 120 | } | ||
| 121 | } | 4 | } |
| 122 | |||
| @@ -1,121 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // CheckBox.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 26 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.2 | 3 | CheckBox { |
| 12 | import QtQuick.Controls 2.2 as Original | ||
| 13 | |||
| 14 | import "../styles-uit" | ||
| 15 | |||
| 16 | import TabletScriptingInterface 1.0 | ||
| 17 | |||
| 18 | Original.CheckBox { | ||
| 19 | id: checkBox | ||
| 20 | |||
| 21 | property int colorScheme: hifi.colorSchemes.light | ||
| 22 | property string color: hifi.colors.lightGrayText | ||
| 23 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 24 | property bool isRedCheck: false | ||
| 25 | property int boxSize: 14 | ||
| 26 | property int boxRadius: 3 | ||
| 27 | property bool wrap: true; | ||
| 28 | readonly property int checkSize: Math.max(boxSize - 8, 10) | ||
| 29 | readonly property int checkRadius: 2 | ||
| 30 | property string labelFontFamily: "Raleway" | ||
| 31 | property int labelFontSize: 14; | ||
| 32 | property int labelFontWeight: Font.DemiBold; | ||
| 33 | focusPolicy: Qt.ClickFocus | ||
| 34 | hoverEnabled: true | ||
| 35 | |||
| 36 | onClicked: { | ||
| 37 | Tablet.playSound(TabletEnums.ButtonClick); | ||
| 38 | } | ||
| 39 | |||
| 40 | onHoveredChanged: { | ||
| 41 | if (hovered) { | ||
| 42 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 43 | } | ||
| 44 | } | ||
| 45 | |||
| 46 | |||
| 47 | indicator: Rectangle { | ||
| 48 | id: box | ||
| 49 | implicitWidth: boxSize | ||
| 50 | implicitHeight: boxSize | ||
| 51 | radius: boxRadius | ||
| 52 | y: parent.height / 2 - height / 2 | ||
| 53 | border.width: 1 | ||
| 54 | border.color: pressed || hovered | ||
| 55 | ? hifi.colors.checkboxCheckedBorder | ||
| 56 | : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish) | ||
| 57 | |||
| 58 | gradient: Gradient { | ||
| 59 | GradientStop { | ||
| 60 | position: 0.2 | ||
| 61 | color: pressed || hovered | ||
| 62 | ? (checkBox.isLightColorScheme ? hifi.colors.checkboxChecked : hifi.colors.checkboxLightStart) | ||
| 63 | : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightStart : hifi.colors.checkboxDarkStart) | ||
| 64 | } | ||
| 65 | GradientStop { | ||
| 66 | position: 1.0 | ||
| 67 | color: pressed || hovered | ||
| 68 | ? (checkBox.isLightColorScheme ? hifi.colors.checkboxChecked : hifi.colors.checkboxLightFinish) | ||
| 69 | : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish) | ||
| 70 | } | ||
| 71 | } | ||
| 72 | |||
| 73 | Rectangle { | ||
| 74 | visible: pressed || hovered | ||
| 75 | anchors.centerIn: parent | ||
| 76 | id: innerBox | ||
| 77 | width: checkSize - 4 | ||
| 78 | height: width | ||
| 79 | radius: checkRadius | ||
| 80 | color: hifi.colors.checkboxCheckedBorder | ||
| 81 | } | ||
| 82 | |||
| 83 | Rectangle { | ||
| 84 | id: check | ||
| 85 | width: checkSize | ||
| 86 | height: checkSize | ||
| 87 | radius: checkRadius | ||
| 88 | anchors.centerIn: parent | ||
| 89 | color: isRedCheck ? hifi.colors.checkboxCheckedRed : hifi.colors.checkboxChecked | ||
| 90 | border.width: 2 | ||
| 91 | border.color: isRedCheck? hifi.colors.checkboxCheckedBorderRed : hifi.colors.checkboxCheckedBorder | ||
| 92 | visible: checked && !pressed || !checked && pressed | ||
| 93 | } | ||
| 94 | |||
| 95 | Rectangle { | ||
| 96 | id: disabledOverlay | ||
| 97 | visible: !enabled | ||
| 98 | width: boxSize | ||
| 99 | height: boxSize | ||
| 100 | radius: boxRadius | ||
| 101 | border.width: 1 | ||
| 102 | border.color: hifi.colors.baseGrayHighlight | ||
| 103 | color: hifi.colors.baseGrayHighlight | ||
| 104 | opacity: 0.5 | ||
| 105 | } | ||
| 106 | } | ||
| 107 | |||
| 108 | contentItem: Label { | ||
| 109 | text: checkBox.text | ||
| 110 | color: checkBox.color | ||
| 111 | font.family: checkBox.labelFontFamily; | ||
| 112 | font.pixelSize: checkBox.labelFontSize; | ||
| 113 | font.weight: checkBox.labelFontWeight; | ||
| 114 | x: 2 | ||
| 115 | verticalAlignment: Text.AlignVCenter | ||
| 116 | wrapMode: checkBox.wrap ? Text.Wrap : Text.NoWrap | ||
| 117 | elide: checkBox.wrap ? Text.ElideNone : Text.ElideRight | ||
| 118 | enabled: checkBox.enabled | ||
| 119 | leftPadding: checkBox.indicator.width + checkBox.spacing | ||
| 120 | } | ||
| 121 | } | 4 | } |
| @@ -1,125 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // CheckBox2.qml | ||
| 3 | // | ||
| 4 | // Created by Vlad Stelmahovsky on 10 Aug 2017 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | import QtQuick.Controls 2.2 | ||
| 13 | |||
| 14 | import "../styles-uit" | ||
| 15 | import "../controls-uit" as HiFiControls | ||
| 16 | import TabletScriptingInterface 1.0 | ||
| 17 | |||
| 18 | CheckBox { | ||
| 19 | id: checkBox | ||
| 20 | |||
| 21 | HifiConstants { id: hifi; } | ||
| 22 | |||
| 23 | padding: 0 | ||
| 24 | leftPadding: 0 | ||
| 25 | property int colorScheme: hifi.colorSchemes.light | ||
| 26 | property string color: hifi.colors.lightGrayText | ||
| 27 | readonly property bool isLightColorScheme: colorScheme === hifi.colorSchemes.light | ||
| 28 | property bool isRedCheck: false | ||
| 29 | property bool isRound: false | ||
| 30 | property int boxSize: 14 | ||
| 31 | property int boxRadius: isRound ? boxSize : 3 | ||
| 32 | property bool wrap: true; | ||
| 33 | readonly property int checkSize: Math.max(boxSize - 8, 10) | ||
| 34 | readonly property int checkRadius: isRound ? checkSize / 2 : 2 | ||
| 35 | focusPolicy: Qt.ClickFocus | ||
| 36 | hoverEnabled: true | ||
| 37 | |||
| 38 | onClicked: { | ||
| 39 | Tablet.playSound(TabletEnums.ButtonClick); | ||
| 40 | } | ||
| 41 | |||
| 42 | onHoveredChanged: { | ||
| 43 | if (hovered) { | ||
| 44 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 45 | } | ||
| 46 | } | ||
| 47 | |||
| 48 | indicator: Rectangle { | ||
| 49 | id: box | ||
| 50 | implicitWidth: boxSize | ||
| 51 | implicitHeight: boxSize | ||
| 52 | radius: boxRadius | ||
| 53 | x: checkBox.leftPadding | ||
| 54 | y: parent.height / 2 - height / 2 | ||
| 55 | border.width: 1 | ||
| 56 | border.color: pressed || hovered | ||
| 57 | ? hifi.colors.checkboxCheckedBorder | ||
| 58 | : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish) | ||
| 59 | |||
| 60 | gradient: Gradient { | ||
| 61 | GradientStop { | ||
| 62 | position: 0.2 | ||
| 63 | color: pressed || hovered | ||
| 64 | ? (checkBox.isLightColorScheme ? hifi.colors.checkboxChecked : hifi.colors.checkboxLightStart) | ||
| 65 | : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightStart : hifi.colors.checkboxDarkStart) | ||
| 66 | } | ||
| 67 | GradientStop { | ||
| 68 | position: 1.0 | ||
| 69 | color: pressed || hovered | ||
| 70 | ? (checkBox.isLightColorScheme ? hifi.colors.checkboxChecked : hifi.colors.checkboxLightFinish) | ||
| 71 | : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish) | ||
| 72 | } | ||
| 73 | } | ||
| 74 | |||
| 75 | Rectangle { | ||
| 76 | visible: pressed || hovered | ||
| 77 | anchors.centerIn: parent | ||
| 78 | id: innerBox | ||
| 79 | width: checkSize - 4 | ||
| 80 | height: width | ||
| 81 | radius: checkRadius | ||
| 82 | color: hifi.colors.checkboxCheckedBorder | ||
| 83 | } | ||
| 84 | |||
| 85 | Rectangle { | ||
| 86 | id: check | ||
| 87 | width: checkSize | ||
| 88 | height: checkSize | ||
| 89 | radius: checkRadius | ||
| 90 | anchors.centerIn: parent | ||
| 91 | color: isRedCheck ? hifi.colors.checkboxCheckedRed : hifi.colors.checkboxChecked | ||
| 92 | border.width: 2 | ||
| 93 | border.color: isRedCheck? hifi.colors.checkboxCheckedBorderRed : hifi.colors.checkboxCheckedBorder | ||
| 94 | visible: checked && !pressed || !checked && pressed | ||
| 95 | } | ||
| 96 | |||
| 97 | Rectangle { | ||
| 98 | id: disabledOverlay | ||
| 99 | visible: !enabled | ||
| 100 | width: boxSize | ||
| 101 | height: boxSize | ||
| 102 | radius: boxRadius | ||
| 103 | border.width: 1 | ||
| 104 | border.color: hifi.colors.baseGrayHighlight | ||
| 105 | color: hifi.colors.baseGrayHighlight | ||
| 106 | opacity: 0.5 | ||
| 107 | } | ||
| 108 | } | ||
| 109 | |||
| 110 | contentItem: Text { | ||
| 111 | id: root | ||
| 112 | font.pixelSize: hifi.fontSizes.inputLabel | ||
| 113 | font.family: "Raleway" | ||
| 114 | font.weight: Font.DemiBold | ||
| 115 | text: checkBox.text | ||
| 116 | color: checkBox.color | ||
| 117 | x: 2 | ||
| 118 | wrapMode: checkBox.wrap ? Text.Wrap : Text.NoWrap | ||
| 119 | elide: checkBox.wrap ? Text.ElideNone : Text.ElideRight | ||
| 120 | enabled: checkBox.enabled | ||
| 121 | verticalAlignment: Text.AlignVCenter | ||
| 122 | leftPadding: checkBox.indicator.width + checkBox.spacing | ||
| 123 | } | ||
| 124 | } | ||
| 125 | 2 | ||
| 3 | CheckBoxQQC2 { | ||
| 4 | } | ||
| @@ -1,191 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // ComboBox.qml | ||
| 3 | // | ||
| 4 | // Created by Bradley Austin David on 27 Jan 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.7 | 3 | ComboBox { |
| 12 | import QtQuick.Controls 2.2 | ||
| 13 | |||
| 14 | import "../styles-uit" | ||
| 15 | import "../controls-uit" as HifiControls | ||
| 16 | |||
| 17 | FocusScope { | ||
| 18 | id: root | ||
| 19 | HifiConstants { id: hifi } | ||
| 20 | |||
| 21 | property alias model: comboBox.model; | ||
| 22 | property alias editable: comboBox.editable | ||
| 23 | property alias comboBox: comboBox | ||
| 24 | readonly property alias currentText: comboBox.currentText; | ||
| 25 | property alias currentIndex: comboBox.currentIndex; | ||
| 26 | property int currentHighLightedIndex: comboBox.currentIndex; | ||
| 27 | |||
| 28 | property int dropdownHeight: 480 | ||
| 29 | property int colorScheme: hifi.colorSchemes.light | ||
| 30 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 31 | property string label: "" | ||
| 32 | property real controlHeight: height + (comboBoxLabel.visible ? comboBoxLabel.height + comboBoxLabel.anchors.bottomMargin : 0) | ||
| 33 | |||
| 34 | readonly property ComboBox control: comboBox | ||
| 35 | |||
| 36 | property bool isDesktop: true | ||
| 37 | |||
| 38 | signal accepted(); | ||
| 39 | |||
| 40 | implicitHeight: comboBox.height; | ||
| 41 | focus: true | ||
| 42 | |||
| 43 | ComboBox { | ||
| 44 | id: comboBox | ||
| 45 | anchors.fill: parent | ||
| 46 | hoverEnabled: true | ||
| 47 | visible: true | ||
| 48 | height: hifi.fontSizes.textFieldInput + 13 // Match height of TextField control. | ||
| 49 | |||
| 50 | function previousItem() { root.currentHighLightedIndex = (root.currentHighLightedIndex + comboBox.count - 1) % comboBox.count; } | ||
| 51 | function nextItem() { root.currentHighLightedIndex = (root.currentHighLightedIndex + comboBox.count + 1) % comboBox.count; } | ||
| 52 | function selectCurrentItem() { root.currentIndex = root.currentHighLightedIndex; close(); /*hideList();*/ } | ||
| 53 | function selectSpecificItem(index) { root.currentIndex = index; close();/*hideList();*/ } | ||
| 54 | |||
| 55 | Keys.onUpPressed: previousItem(); | ||
| 56 | Keys.onDownPressed: nextItem(); | ||
| 57 | Keys.onSpacePressed: selectCurrentItem(); | ||
| 58 | Keys.onRightPressed: selectCurrentItem(); | ||
| 59 | Keys.onReturnPressed: selectCurrentItem(); | ||
| 60 | |||
| 61 | background: Rectangle { | ||
| 62 | gradient: Gradient { | ||
| 63 | GradientStop { | ||
| 64 | position: 0.2 | ||
| 65 | color: comboBox.popup.visible | ||
| 66 | ? (isLightColorScheme ? hifi.colors.dropDownPressedLight : hifi.colors.dropDownPressedDark) | ||
| 67 | : (isLightColorScheme ? hifi.colors.dropDownLightStart : hifi.colors.dropDownDarkStart) | ||
| 68 | } | ||
| 69 | GradientStop { | ||
| 70 | position: 1.0 | ||
| 71 | color: comboBox.popup.visible | ||
| 72 | ? (isLightColorScheme ? hifi.colors.dropDownPressedLight : hifi.colors.dropDownPressedDark) | ||
| 73 | : (isLightColorScheme ? hifi.colors.dropDownLightFinish : hifi.colors.dropDownDarkFinish) | ||
| 74 | } | ||
| 75 | } | ||
| 76 | } | ||
| 77 | |||
| 78 | indicator: Item { | ||
| 79 | id: dropIcon | ||
| 80 | anchors { right: parent.right; verticalCenter: parent.verticalCenter } | ||
| 81 | height: root.height | ||
| 82 | width: height | ||
| 83 | Rectangle { | ||
| 84 | width: 1 | ||
| 85 | height: parent.height | ||
| 86 | anchors.top: parent.top | ||
| 87 | anchors.left: parent.left | ||
| 88 | color: isLightColorScheme ? hifi.colors.faintGray : hifi.colors.baseGray | ||
| 89 | } | ||
| 90 | HiFiGlyphs { | ||
| 91 | anchors { top: parent.top; topMargin: -11; horizontalCenter: parent.horizontalCenter } | ||
| 92 | size: hifi.dimensions.spinnerSize | ||
| 93 | text: hifi.glyphs.caratDn | ||
| 94 | color: comboBox.hovered || comboBox.popup.visible ? hifi.colors.baseGray : (isLightColorScheme ? hifi.colors.lightGray : hifi.colors.lightGrayText) | ||
| 95 | } | ||
| 96 | } | ||
| 97 | |||
| 98 | contentItem: FiraSansSemiBold { | ||
| 99 | id: textField | ||
| 100 | anchors { | ||
| 101 | left: parent.left | ||
| 102 | leftMargin: hifi.dimensions.textPadding | ||
| 103 | verticalCenter: parent.verticalCenter | ||
| 104 | } | ||
| 105 | size: hifi.fontSizes.textFieldInput | ||
| 106 | text: comboBox.displayText ? comboBox.displayText : comboBox.currentText | ||
| 107 | elide: Text.ElideRight | ||
| 108 | color: comboBox.hovered || comboBox.popup.visible ? hifi.colors.baseGray : (isLightColorScheme ? hifi.colors.lightGray : hifi.colors.lightGrayText ) | ||
| 109 | } | ||
| 110 | |||
| 111 | delegate: ItemDelegate { | ||
| 112 | id: itemDelegate | ||
| 113 | hoverEnabled: true | ||
| 114 | width: root.width + 4 | ||
| 115 | height: popupText.implicitHeight * 1.4 | ||
| 116 | highlighted: root.currentHighLightedIndex == index | ||
| 117 | |||
| 118 | onHoveredChanged: { | ||
| 119 | if (hovered) { | ||
| 120 | root.currentHighLightedIndex = index | ||
| 121 | } | ||
| 122 | } | ||
| 123 | |||
| 124 | background: Rectangle { | ||
| 125 | color: itemDelegate.highlighted ? hifi.colors.primaryHighlight | ||
| 126 | : (isLightColorScheme ? hifi.colors.dropDownPressedLight | ||
| 127 | : hifi.colors.dropDownPressedDark) | ||
| 128 | } | ||
| 129 | |||
| 130 | contentItem: FiraSansSemiBold { | ||
| 131 | id: popupText | ||
| 132 | anchors.left: parent.left | ||
| 133 | anchors.leftMargin: hifi.dimensions.textPadding | ||
| 134 | anchors.verticalCenter: parent.verticalCenter | ||
| 135 | text: comboBox.model[index] ? comboBox.model[index] | ||
| 136 | : (comboBox.model.get && comboBox.model.get(index).text ? | ||
| 137 | comboBox.model.get(index).text : "") | ||
| 138 | size: hifi.fontSizes.textFieldInput | ||
| 139 | color: hifi.colors.baseGray | ||
| 140 | } | ||
| 141 | } | ||
| 142 | popup: Popup { | ||
| 143 | y: comboBox.height - 1 | ||
| 144 | width: comboBox.width | ||
| 145 | implicitHeight: listView.contentHeight > dropdownHeight ? dropdownHeight | ||
| 146 | : listView.contentHeight | ||
| 147 | padding: 0 | ||
| 148 | topPadding: 1 | ||
| 149 | |||
| 150 | onClosed: { | ||
| 151 | root.accepted() | ||
| 152 | } | ||
| 153 | |||
| 154 | contentItem: ListView { | ||
| 155 | id: listView | ||
| 156 | clip: true | ||
| 157 | model: comboBox.popup.visible ? comboBox.delegateModel : null | ||
| 158 | currentIndex: root.currentHighLightedIndex | ||
| 159 | delegate: comboBox.delegate | ||
| 160 | ScrollBar.vertical: HifiControls.ScrollBar { | ||
| 161 | id: scrollbar | ||
| 162 | parent: listView | ||
| 163 | policy: ScrollBar.AsNeeded | ||
| 164 | visible: size < 1.0 | ||
| 165 | } | ||
| 166 | } | ||
| 167 | |||
| 168 | background: Rectangle { | ||
| 169 | color: hifi.colors.baseGray | ||
| 170 | } | ||
| 171 | } | ||
| 172 | } | ||
| 173 | |||
| 174 | function textAt(index) { | ||
| 175 | return comboBox.textAt(index); | ||
| 176 | } | ||
| 177 | |||
| 178 | HifiControls.Label { | ||
| 179 | id: comboBoxLabel | ||
| 180 | text: root.label | ||
| 181 | colorScheme: root.colorScheme | ||
| 182 | anchors.left: parent.left | ||
| 183 | anchors.bottom: parent.top | ||
| 184 | anchors.bottomMargin: 4 | ||
| 185 | visible: label != "" | ||
| 186 | } | ||
| 187 | |||
| 188 | Component.onCompleted: { | ||
| 189 | isDesktop = (typeof desktop !== "undefined"); | ||
| 190 | } | ||
| 191 | } | 4 | } |
| @@ -1,138 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // ContentSection.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 16 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | ContentSection { |
| 12 | import QtGraphicalEffects 1.0 | ||
| 13 | |||
| 14 | import "../styles-uit" | ||
| 15 | |||
| 16 | Column { | ||
| 17 | property string name: "Content Section" | ||
| 18 | property bool isFirst: false | ||
| 19 | property bool isCollapsible: false // Set at creation. | ||
| 20 | property bool isCollapsed: false | ||
| 21 | |||
| 22 | spacing: 0 // Defer spacing decisions to individual controls. | ||
| 23 | |||
| 24 | anchors { | ||
| 25 | left: parent.left | ||
| 26 | leftMargin: hifi.dimensions.contentMargin.x | ||
| 27 | right: parent.right | ||
| 28 | rightMargin: hifi.dimensions.contentMargin.x | ||
| 29 | } | ||
| 30 | |||
| 31 | function toggleCollapsed() { | ||
| 32 | if (isCollapsible) { | ||
| 33 | isCollapsed = !isCollapsed; | ||
| 34 | for (var i = 1; i < children.length; i++) { | ||
| 35 | children[i].visible = !isCollapsed; | ||
| 36 | } | ||
| 37 | } | ||
| 38 | } | ||
| 39 | |||
| 40 | Item { | ||
| 41 | id: sectionName | ||
| 42 | anchors.left: parent.left | ||
| 43 | anchors.right: parent.right | ||
| 44 | height: leadingSpace.height + topBar.height + heading.height + bottomBar.height | ||
| 45 | |||
| 46 | Item { | ||
| 47 | id: leadingSpace | ||
| 48 | width: 1 | ||
| 49 | height: isFirst ? 7 : 0 | ||
| 50 | anchors.top: parent.top | ||
| 51 | } | ||
| 52 | |||
| 53 | Item { | ||
| 54 | id: topBar | ||
| 55 | visible: !isFirst | ||
| 56 | height: visible ? 2 : 0 | ||
| 57 | anchors.top: leadingSpace.bottom | ||
| 58 | |||
| 59 | Rectangle { | ||
| 60 | id: shadow | ||
| 61 | width: frame.width | ||
| 62 | height: 1 | ||
| 63 | color: hifi.colors.baseGrayShadow | ||
| 64 | x: -hifi.dimensions.contentMargin.x | ||
| 65 | } | ||
| 66 | |||
| 67 | Rectangle { | ||
| 68 | width: frame.width | ||
| 69 | height: 1 | ||
| 70 | color: hifi.colors.baseGrayHighlight | ||
| 71 | x: -hifi.dimensions.contentMargin.x | ||
| 72 | anchors.top: shadow.bottom | ||
| 73 | } | ||
| 74 | } | ||
| 75 | |||
| 76 | Item { | ||
| 77 | id: heading | ||
| 78 | anchors { | ||
| 79 | left: parent.left | ||
| 80 | right: parent.right | ||
| 81 | top: topBar.bottom | ||
| 82 | } | ||
| 83 | height: isCollapsible ? 36 : 28 | ||
| 84 | |||
| 85 | RalewayRegular { | ||
| 86 | id: title | ||
| 87 | anchors { | ||
| 88 | left: parent.left | ||
| 89 | top: parent.top | ||
| 90 | topMargin: 12 | ||
| 91 | } | ||
| 92 | size: hifi.fontSizes.sectionName | ||
| 93 | font.capitalization: Font.AllUppercase | ||
| 94 | text: name | ||
| 95 | color: hifi.colors.lightGrayText | ||
| 96 | } | ||
| 97 | |||
| 98 | HiFiGlyphs { | ||
| 99 | anchors { | ||
| 100 | top: title.top | ||
| 101 | topMargin: -9 | ||
| 102 | right: parent.right | ||
| 103 | rightMargin: -4 | ||
| 104 | } | ||
| 105 | size: hifi.fontSizes.disclosureButton | ||
| 106 | text: isCollapsed ? hifi.glyphs.disclosureButtonExpand : hifi.glyphs.disclosureButtonCollapse | ||
| 107 | color: hifi.colors.lightGrayText | ||
| 108 | visible: isCollapsible | ||
| 109 | } | ||
| 110 | |||
| 111 | MouseArea { | ||
| 112 | // Events are propogated so that any active control is defocused. | ||
| 113 | anchors.fill: parent | ||
| 114 | propagateComposedEvents: true | ||
| 115 | onPressed: { | ||
| 116 | toggleCollapsed(); | ||
| 117 | mouse.accepted = false; | ||
| 118 | } | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | LinearGradient { | ||
| 123 | id: bottomBar | ||
| 124 | visible: desktop.gradientsSupported && isCollapsible | ||
| 125 | width: frame.width | ||
| 126 | height: visible ? 4 : 0 | ||
| 127 | x: -hifi.dimensions.contentMargin.x | ||
| 128 | anchors.top: heading.bottom | ||
| 129 | start: Qt.point(0, 0) | ||
| 130 | end: Qt.point(0, 4) | ||
| 131 | gradient: Gradient { | ||
| 132 | GradientStop { position: 0.0; color: hifi.colors.darkGray } | ||
| 133 | GradientStop { position: 1.0; color: hifi.colors.baseGray } // Equivalent of darkGray0 over baseGray background. | ||
| 134 | } | ||
| 135 | cached: true | ||
| 136 | } | ||
| 137 | } | ||
| 138 | } | 4 | } |
| @@ -1,321 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // FilterBar.qml | ||
| 3 | // | ||
| 4 | // Created by Zach Fox on 17 Feb 2018-03-12 | ||
| 5 | // Copyright 2018 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.9 | 3 | FilterBar { |
| 12 | import QtQuick.Controls 2.2 | ||
| 13 | import QtGraphicalEffects 1.0 | ||
| 14 | |||
| 15 | import "../styles-uit" | ||
| 16 | import "../controls-uit" as HifiControls | ||
| 17 | |||
| 18 | Item { | ||
| 19 | id: root; | ||
| 20 | |||
| 21 | property int colorScheme: hifi.colorSchemes.light | ||
| 22 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 23 | readonly property bool isFaintGrayColorScheme: colorScheme == hifi.colorSchemes.faintGray | ||
| 24 | property bool error: false; | ||
| 25 | property alias textFieldHeight: textField.height; | ||
| 26 | property string placeholderText; | ||
| 27 | property alias dropdownHeight: dropdownContainer.height; | ||
| 28 | property alias text: textField.text; | ||
| 29 | property alias primaryFilterChoices: filterBarModel; | ||
| 30 | property int primaryFilter_index: -1; | ||
| 31 | property string primaryFilter_filterName: ""; | ||
| 32 | property string primaryFilter_displayName: ""; | ||
| 33 | signal accepted; | ||
| 34 | |||
| 35 | onPrimaryFilter_indexChanged: { | ||
| 36 | if (primaryFilter_index === -1) { | ||
| 37 | primaryFilter_filterName = ""; | ||
| 38 | primaryFilter_displayName = ""; | ||
| 39 | } else { | ||
| 40 | primaryFilter_filterName = filterBarModel.get(primaryFilter_index).filterName; | ||
| 41 | primaryFilter_displayName = filterBarModel.get(primaryFilter_index).displayName; | ||
| 42 | } | ||
| 43 | } | ||
| 44 | |||
| 45 | TextField { | ||
| 46 | id: textField; | ||
| 47 | |||
| 48 | anchors.top: parent.top; | ||
| 49 | anchors.right: parent.right; | ||
| 50 | anchors.left: parent.left; | ||
| 51 | |||
| 52 | font.family: "Fira Sans" | ||
| 53 | font.pixelSize: hifi.fontSizes.textFieldInput; | ||
| 54 | |||
| 55 | placeholderText: root.primaryFilter_index === -1 ? root.placeholderText : ""; | ||
| 56 | |||
| 57 | TextMetrics { | ||
| 58 | id: primaryFilterTextMetrics; | ||
| 59 | font.family: "FiraSans Regular"; | ||
| 60 | font.pixelSize: hifi.fontSizes.textFieldInput; | ||
| 61 | font.capitalization: Font.AllUppercase; | ||
| 62 | text: root.primaryFilter_displayName; | ||
| 63 | } | ||
| 64 | |||
| 65 | // workaround for https://bugreports.qt.io/browse/QTBUG-49297 | ||
| 66 | Keys.onPressed: { | ||
| 67 | switch (event.key) { | ||
| 68 | case Qt.Key_Return: | ||
| 69 | case Qt.Key_Enter: | ||
| 70 | event.accepted = true; | ||
| 71 | |||
| 72 | // emit accepted signal manually | ||
| 73 | if (acceptableInput) { | ||
| 74 | root.accepted(); | ||
| 75 | root.forceActiveFocus(); | ||
| 76 | } | ||
| 77 | break; | ||
| 78 | case Qt.Key_Backspace: | ||
| 79 | if (textField.text === "") { | ||
| 80 | primaryFilter_index = -1; | ||
| 81 | } | ||
| 82 | break; | ||
| 83 | } | ||
| 84 | } | ||
| 85 | |||
| 86 | onAccepted: { | ||
| 87 | root.forceActiveFocus(); | ||
| 88 | } | ||
| 89 | |||
| 90 | onActiveFocusChanged: { | ||
| 91 | if (!activeFocus) { | ||
| 92 | dropdownContainer.visible = false; | ||
| 93 | } | ||
| 94 | } | ||
| 95 | |||
| 96 | color: { | ||
| 97 | if (isLightColorScheme) { | ||
| 98 | if (textField.activeFocus) { | ||
| 99 | hifi.colors.black | ||
| 100 | } else { | ||
| 101 | hifi.colors.lightGray | ||
| 102 | } | ||
| 103 | } else if (isFaintGrayColorScheme) { | ||
| 104 | if (textField.activeFocus) { | ||
| 105 | hifi.colors.black | ||
| 106 | } else { | ||
| 107 | hifi.colors.lightGray | ||
| 108 | } | ||
| 109 | } else { | ||
| 110 | if (textField.activeFocus) { | ||
| 111 | hifi.colors.white | ||
| 112 | } else { | ||
| 113 | hifi.colors.lightGrayText | ||
| 114 | } | ||
| 115 | } | ||
| 116 | } | ||
| 117 | |||
| 118 | background: Rectangle { | ||
| 119 | id: mainFilterBarRectangle; | ||
| 120 | |||
| 121 | color: { | ||
| 122 | if (isLightColorScheme) { | ||
| 123 | if (textField.activeFocus) { | ||
| 124 | hifi.colors.white | ||
| 125 | } else { | ||
| 126 | hifi.colors.textFieldLightBackground | ||
| 127 | } | ||
| 128 | } else if (isFaintGrayColorScheme) { | ||
| 129 | if (textField.activeFocus) { | ||
| 130 | hifi.colors.white | ||
| 131 | } else { | ||
| 132 | hifi.colors.faintGray50 | ||
| 133 | } | ||
| 134 | } else { | ||
| 135 | if (textField.activeFocus) { | ||
| 136 | hifi.colors.black | ||
| 137 | } else { | ||
| 138 | hifi.colors.baseGrayShadow | ||
| 139 | } | ||
| 140 | } | ||
| 141 | } | ||
| 142 | |||
| 143 | border.color: textField.error ? hifi.colors.redHighlight : | ||
| 144 | (textField.activeFocus ? hifi.colors.primaryHighlight : (isFaintGrayColorScheme ? hifi.colors.lightGrayText : hifi.colors.lightGray)) | ||
| 145 | border.width: 1 | ||
| 146 | radius: 4 | ||
| 147 | |||
| 148 | Item { | ||
| 149 | id: searchButtonContainer; | ||
| 150 | anchors.left: parent.left; | ||
| 151 | anchors.verticalCenter: parent.verticalCenter; | ||
| 152 | height: parent.height; | ||
| 153 | width: 42; | ||
| 154 | |||
| 155 | // Search icon | ||
| 156 | HiFiGlyphs { | ||
| 157 | id: searchIcon; | ||
| 158 | text: hifi.glyphs.search | ||
| 159 | color: textField.color | ||
| 160 | size: 40; | ||
| 161 | anchors.left: parent.left | ||
| 162 | anchors.verticalCenter: parent.verticalCenter | ||
| 163 | width: paintedWidth; | ||
| 164 | } | ||
| 165 | |||
| 166 | // Carat | ||
| 167 | HiFiGlyphs { | ||
| 168 | text: hifi.glyphs.caratDn; | ||
| 169 | color: textField.color; | ||
| 170 | size: 40; | ||
| 171 | anchors.left: parent.left; | ||
| 172 | anchors.leftMargin: 15; | ||
| 173 | width: paintedWidth; | ||
| 174 | } | ||
| 175 | |||
| 176 | MouseArea { | ||
| 177 | anchors.fill: parent; | ||
| 178 | onClicked: { | ||
| 179 | textField.forceActiveFocus(); | ||
| 180 | dropdownContainer.visible = !dropdownContainer.visible; | ||
| 181 | } | ||
| 182 | } | ||
| 183 | } | ||
| 184 | |||
| 185 | Rectangle { | ||
| 186 | z: 999; | ||
| 187 | id: primaryFilterContainer; | ||
| 188 | color: textField.activeFocus ? hifi.colors.faintGray : hifi.colors.white; | ||
| 189 | width: primaryFilterTextMetrics.tightBoundingRect.width + 14; | ||
| 190 | height: parent.height - 8; | ||
| 191 | anchors.verticalCenter: parent.verticalCenter; | ||
| 192 | anchors.left: searchButtonContainer.right; | ||
| 193 | anchors.leftMargin: 4; | ||
| 194 | visible: primaryFilterText.text !== ""; | ||
| 195 | radius: height/2; | ||
| 196 | |||
| 197 | FiraSansRegular { | ||
| 198 | id: primaryFilterText; | ||
| 199 | text: root.primaryFilter_displayName; | ||
| 200 | anchors.fill: parent; | ||
| 201 | color: textField.activeFocus ? hifi.colors.black : hifi.colors.lightGray; | ||
| 202 | horizontalAlignment: Text.AlignHCenter; | ||
| 203 | verticalAlignment: Text.AlignVCenter; | ||
| 204 | size: hifi.fontSizes.textFieldInput; | ||
| 205 | font.capitalization: Font.AllUppercase; | ||
| 206 | } | ||
| 207 | |||
| 208 | MouseArea { | ||
| 209 | anchors.fill: parent; | ||
| 210 | onClicked: { | ||
| 211 | textField.forceActiveFocus(); | ||
| 212 | } | ||
| 213 | } | ||
| 214 | } | ||
| 215 | |||
| 216 | // "Clear" button | ||
| 217 | HiFiGlyphs { | ||
| 218 | text: hifi.glyphs.error | ||
| 219 | color: textField.color | ||
| 220 | size: 40 | ||
| 221 | anchors.right: parent.right | ||
| 222 | anchors.rightMargin: hifi.dimensions.textPadding - 2 | ||
| 223 | anchors.verticalCenter: parent.verticalCenter | ||
| 224 | visible: root.text !== "" || root.primaryFilter_index !== -1; | ||
| 225 | |||
| 226 | MouseArea { | ||
| 227 | anchors.fill: parent; | ||
| 228 | onClicked: { | ||
| 229 | root.text = ""; | ||
| 230 | root.primaryFilter_index = -1; | ||
| 231 | dropdownContainer.visible = false; | ||
| 232 | textField.forceActiveFocus(); | ||
| 233 | } | ||
| 234 | } | ||
| 235 | } | ||
| 236 | } | ||
| 237 | |||
| 238 | selectedTextColor: hifi.colors.black | ||
| 239 | selectionColor: hifi.colors.primaryHighlight | ||
| 240 | leftPadding: 44 + (root.primaryFilter_index === -1 ? 0 : primaryFilterTextMetrics.tightBoundingRect.width + 20); | ||
| 241 | rightPadding: 44; | ||
| 242 | } | ||
| 243 | |||
| 244 | Rectangle { | ||
| 245 | id: dropdownContainer; | ||
| 246 | visible: false; | ||
| 247 | height: 50 * filterBarModel.count; | ||
| 248 | width: parent.width; | ||
| 249 | anchors.top: textField.bottom; | ||
| 250 | anchors.left: parent.left; | ||
| 251 | anchors.right: parent.right; | ||
| 252 | color: hifi.colors.white; | ||
| 253 | |||
| 254 | ListModel { | ||
| 255 | id: filterBarModel; | ||
| 256 | } | ||
| 257 | |||
| 258 | ListView { | ||
| 259 | id: dropdownListView; | ||
| 260 | interactive: false; | ||
| 261 | anchors.fill: parent; | ||
| 262 | model: filterBarModel; | ||
| 263 | delegate: Rectangle { | ||
| 264 | id: dropDownButton; | ||
| 265 | color: hifi.colors.white; | ||
| 266 | width: parent.width; | ||
| 267 | height: 50; | ||
| 268 | |||
| 269 | RalewaySemiBold { | ||
| 270 | id: dropDownButtonText; | ||
| 271 | text: model.displayName; | ||
| 272 | anchors.fill: parent; | ||
| 273 | anchors.leftMargin: 12; | ||
| 274 | color: hifi.colors.baseGray; | ||
| 275 | horizontalAlignment: Text.AlignLeft; | ||
| 276 | verticalAlignment: Text.AlignVCenter; | ||
| 277 | size: 18; | ||
| 278 | } | ||
| 279 | |||
| 280 | MouseArea { | ||
| 281 | anchors.fill: parent; | ||
| 282 | hoverEnabled: true; | ||
| 283 | propagateComposedEvents: false; | ||
| 284 | onEntered: { | ||
| 285 | dropDownButton.color = hifi.colors.blueHighlight; | ||
| 286 | } | ||
| 287 | onExited: { | ||
| 288 | dropDownButton.color = hifi.colors.white; | ||
| 289 | } | ||
| 290 | onClicked: { | ||
| 291 | textField.forceActiveFocus(); | ||
| 292 | root.primaryFilter_index = index; | ||
| 293 | dropdownContainer.visible = false; | ||
| 294 | } | ||
| 295 | } | ||
| 296 | } | ||
| 297 | } | ||
| 298 | } | ||
| 299 | |||
| 300 | DropShadow { | ||
| 301 | anchors.fill: dropdownContainer; | ||
| 302 | horizontalOffset: 0; | ||
| 303 | verticalOffset: 4; | ||
| 304 | radius: 4.0; | ||
| 305 | samples: 9 | ||
| 306 | color: Qt.rgba(0, 0, 0, 0.25); | ||
| 307 | source: dropdownContainer; | ||
| 308 | visible: dropdownContainer.visible; | ||
| 309 | } | ||
| 310 | |||
| 311 | function changeFilterByDisplayName(name) { | ||
| 312 | for (var i = 0; i < filterBarModel.count; i++) { | ||
| 313 | if (filterBarModel.get(i).displayName === name) { | ||
| 314 | root.primaryFilter_index = i; | ||
| 315 | return; | ||
| 316 | } | ||
| 317 | } | ||
| 318 | |||
| 319 | console.log("Passed displayName not found in filterBarModel! primaryFilter unchanged."); | ||
| 320 | } | ||
| 321 | } | 4 | } |
| @@ -1,91 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // GlyphButton.qml | ||
| 3 | // | ||
| 4 | // Created by Clement on 3/7/16 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.7 | 3 | GlyphButton { |
| 12 | import QtQuick.Controls 2.2 as Original | ||
| 13 | import TabletScriptingInterface 1.0 | ||
| 14 | |||
| 15 | import "../styles-uit" | ||
| 16 | |||
| 17 | Original.Button { | ||
| 18 | id: control | ||
| 19 | property int color: 0 | ||
| 20 | property int colorScheme: hifi.colorSchemes.light | ||
| 21 | property string glyph: "" | ||
| 22 | property int size: 32 | ||
| 23 | |||
| 24 | width: 120 | ||
| 25 | height: 28 | ||
| 26 | |||
| 27 | onHoveredChanged: { | ||
| 28 | if (hovered) { | ||
| 29 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 30 | } | ||
| 31 | } | ||
| 32 | |||
| 33 | onFocusChanged: { | ||
| 34 | if (focus) { | ||
| 35 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 36 | } | ||
| 37 | } | ||
| 38 | |||
| 39 | onClicked: { | ||
| 40 | Tablet.playSound(TabletEnums.ButtonClick); | ||
| 41 | } | ||
| 42 | |||
| 43 | background: Rectangle { | ||
| 44 | radius: hifi.buttons.radius | ||
| 45 | |||
| 46 | gradient: Gradient { | ||
| 47 | GradientStop { | ||
| 48 | position: 0.2 | ||
| 49 | color: { | ||
| 50 | if (!control.enabled) { | ||
| 51 | hifi.buttons.disabledColorStart[control.colorScheme] | ||
| 52 | } else if (control.pressed) { | ||
| 53 | hifi.buttons.pressedColor[control.color] | ||
| 54 | } else if (control.hovered) { | ||
| 55 | hifi.buttons.hoveredColor[control.color] | ||
| 56 | } else if (!control.hovered && control.focus) { | ||
| 57 | hifi.buttons.focusedColor[control.color] | ||
| 58 | } else { | ||
| 59 | hifi.buttons.colorStart[control.color] | ||
| 60 | } | ||
| 61 | } | ||
| 62 | } | ||
| 63 | GradientStop { | ||
| 64 | position: 1.0 | ||
| 65 | color: { | ||
| 66 | if (!control.enabled) { | ||
| 67 | hifi.buttons.disabledColorFinish[control.colorScheme] | ||
| 68 | } else if (control.pressed) { | ||
| 69 | hifi.buttons.pressedColor[control.color] | ||
| 70 | } else if (control.hovered) { | ||
| 71 | hifi.buttons.hoveredColor[control.color] | ||
| 72 | } else if (!control.hovered && control.focus) { | ||
| 73 | hifi.buttons.focusedColor[control.color] | ||
| 74 | } else { | ||
| 75 | hifi.buttons.colorFinish[control.color] | ||
| 76 | } | ||
| 77 | } | ||
| 78 | } | ||
| 79 | } | ||
| 80 | } | ||
| 81 | |||
| 82 | contentItem: HiFiGlyphs { | ||
| 83 | color: enabled ? hifi.buttons.textColor[control.color] | ||
| 84 | : hifi.buttons.disabledTextColor[control.colorScheme] | ||
| 85 | verticalAlignment: Text.AlignVCenter | ||
| 86 | horizontalAlignment: Text.AlignHCenter | ||
| 87 | text: control.glyph | ||
| 88 | size: control.size | ||
| 89 | } | ||
| 90 | } | 4 | } |
| 91 | |||
| @@ -1,18 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // HorizontalRule.qml | ||
| 3 | // | ||
| 4 | // Created by Clement on 7/18/16 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | HorizontalRule { |
| 12 | |||
| 13 | Rectangle { | ||
| 14 | anchors.left: parent.left | ||
| 15 | anchors.right: parent.right | ||
| 16 | height: 1 | ||
| 17 | color: hifi.colors.lightGray | ||
| 18 | } | 4 | } |
| @@ -1,21 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // HorizontalSpacer.qml | ||
| 3 | // | ||
| 4 | // Created by Clement on 7/18/16 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | HorizontalSpacer { |
| 12 | |||
| 13 | import "../styles-uit" | ||
| 14 | |||
| 15 | Item { | ||
| 16 | id: root | ||
| 17 | property alias size: root.width | ||
| 18 | |||
| 19 | width: hifi.dimensions.controlInterlineHeight | ||
| 20 | height: 1 // Must be non-zero | ||
| 21 | } | 4 | } |
| @@ -1,63 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // ImageMessageBox.qml | ||
| 3 | // | ||
| 4 | // Created by Dante Ruiz on 7/5/2017 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import "../styles-uit" | ||
| 13 | |||
| 14 | Item { | ||
| 15 | id: imageBox | ||
| 16 | visible: false | ||
| 17 | anchors.fill: parent | ||
| 18 | property alias source: image.source | ||
| 19 | property alias imageWidth: image.width | ||
| 20 | property alias imageHeight: image.height | ||
| 21 | |||
| 22 | Rectangle { | ||
| 23 | anchors.fill: parent | ||
| 24 | color: "black" | ||
| 25 | opacity: 0.3 | ||
| 26 | } | ||
| 27 | |||
| 28 | Image { | ||
| 29 | id: image | ||
| 30 | anchors.centerIn: parent | ||
| 31 | |||
| 32 | HiFiGlyphs { | ||
| 33 | id: closeGlyphButton | ||
| 34 | text: hifi.glyphs.close | ||
| 35 | size: 25 | ||
| 36 | |||
| 37 | anchors { | ||
| 38 | top: parent.top | ||
| 39 | topMargin: 15 | ||
| 40 | right: parent.right | ||
| 41 | rightMargin: 15 | ||
| 42 | } | ||
| 43 | |||
| 44 | MouseArea { | ||
| 45 | anchors.fill: parent | ||
| 46 | hoverEnabled: true | ||
| 47 | |||
| 48 | onEntered: { | ||
| 49 | parent.text = hifi.glyphs.closeInverted; | ||
| 50 | } | ||
| 51 | |||
| 52 | onExited: { | ||
| 53 | parent.text = hifi.glyphs.close; | ||
| 54 | } | ||
| 55 | |||
| 56 | onClicked: { | ||
| 57 | imageBox.visible = false; | ||
| 58 | } | ||
| 59 | } | ||
| 60 | } | ||
| 61 | } | ||
| 62 | 2 | ||
| 3 | ImageMessageBox { | ||
| 63 | } | 4 | } |
| @@ -1,185 +1,4 @@ | |||
| 1 | import QtQuick 2.0 | 1 | import controlsUit 1.0 |
| 2 | import TabletScriptingInterface 1.0 | ||
| 3 | 2 | ||
| 4 | Item { | 3 | Key { |
| 5 | id: keyItem | ||
| 6 | width: 45 | ||
| 7 | height: 50 | ||
| 8 | |||
| 9 | property int contentPadding: 4 | ||
| 10 | property string glyph: "a" | ||
| 11 | property bool toggle: false // does this button have the toggle behaivor? | ||
| 12 | property bool toggled: false // is this button currently toggled? | ||
| 13 | property alias mouseArea: mouseArea1 | ||
| 14 | property alias fontFamily: letter.font.family; | ||
| 15 | property alias fontPixelSize: letter.font.pixelSize | ||
| 16 | property alias verticalAlignment: letter.verticalAlignment | ||
| 17 | property alias letterAnchors: letter.anchors | ||
| 18 | |||
| 19 | function resetToggledMode(mode) { | ||
| 20 | toggled = mode; | ||
| 21 | if (toggled) { | ||
| 22 | state = "mouseDepressed"; | ||
| 23 | } else { | ||
| 24 | state = ""; | ||
| 25 | } | ||
| 26 | } | ||
| 27 | |||
| 28 | MouseArea { | ||
| 29 | id: mouseArea1 | ||
| 30 | width: 36 | ||
| 31 | anchors.fill: parent | ||
| 32 | hoverEnabled: true | ||
| 33 | |||
| 34 | onCanceled: { | ||
| 35 | if (toggled) { | ||
| 36 | keyItem.state = "mouseDepressed"; | ||
| 37 | } else { | ||
| 38 | keyItem.state = ""; | ||
| 39 | } | ||
| 40 | } | ||
| 41 | |||
| 42 | onContainsMouseChanged: { | ||
| 43 | if (containsMouse) { | ||
| 44 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 45 | } | ||
| 46 | } | ||
| 47 | |||
| 48 | onDoubleClicked: { | ||
| 49 | mouse.accepted = true; | ||
| 50 | } | ||
| 51 | |||
| 52 | property var _HAPTIC_STRENGTH: 0.1; | ||
| 53 | property var _HAPTIC_DURATION: 3.0; | ||
| 54 | property var leftHand: 0; | ||
| 55 | property var rightHand: 1; | ||
| 56 | |||
| 57 | onEntered: { | ||
| 58 | keyItem.state = "mouseOver"; | ||
| 59 | |||
| 60 | var globalPosition = keyItem.mapToGlobal(mouseArea1.mouseX, mouseArea1.mouseY); | ||
| 61 | var pointerID = Web3DOverlay.deviceIdByTouchPoint(globalPosition.x, globalPosition.y); | ||
| 62 | |||
| 63 | if (Pointers.isLeftHand(pointerID)) { | ||
| 64 | Controller.triggerHapticPulse(_HAPTIC_STRENGTH, _HAPTIC_DURATION, leftHand); | ||
| 65 | } else if (Pointers.isRightHand(pointerID)) { | ||
| 66 | Controller.triggerHapticPulse(_HAPTIC_STRENGTH, _HAPTIC_DURATION, rightHand); | ||
| 67 | } | ||
| 68 | } | ||
| 69 | |||
| 70 | onExited: { | ||
| 71 | if (toggled) { | ||
| 72 | keyItem.state = "mouseDepressed"; | ||
| 73 | } else { | ||
| 74 | keyItem.state = ""; | ||
| 75 | } | ||
| 76 | } | ||
| 77 | |||
| 78 | onPressed: { | ||
| 79 | keyItem.state = "mouseClicked"; | ||
| 80 | mouse.accepted = true; | ||
| 81 | } | ||
| 82 | |||
| 83 | onReleased: { | ||
| 84 | if (containsMouse) { | ||
| 85 | Tablet.playSound(TabletEnums.ButtonClick); | ||
| 86 | |||
| 87 | webEntity.synthesizeKeyPress(glyph); | ||
| 88 | webEntity.synthesizeKeyPress(glyph, mirrorText); | ||
| 89 | |||
| 90 | if (toggle) { | ||
| 91 | toggled = !toggled; | ||
| 92 | } | ||
| 93 | keyItem.state = "mouseOver"; | ||
| 94 | } else { | ||
| 95 | if (toggled) { | ||
| 96 | keyItem.state = "mouseDepressed"; | ||
| 97 | } else { | ||
| 98 | keyItem.state = ""; | ||
| 99 | } | ||
| 100 | } | ||
| 101 | mouse.accepted = true; | ||
| 102 | } | ||
| 103 | } | ||
| 104 | |||
| 105 | Rectangle { | ||
| 106 | id: roundedRect | ||
| 107 | width: 30 | ||
| 108 | color: "#121212" | ||
| 109 | radius: 2 | ||
| 110 | border.color: "#00000000" | ||
| 111 | anchors.fill: parent | ||
| 112 | anchors.margins: contentPadding | ||
| 113 | } | ||
| 114 | |||
| 115 | Text { | ||
| 116 | id: letter | ||
| 117 | y: 6 | ||
| 118 | width: 50 | ||
| 119 | color: "#ffffff" | ||
| 120 | text: glyph | ||
| 121 | style: Text.Normal | ||
| 122 | font.family: "Tahoma" | ||
| 123 | anchors.right: parent.right | ||
| 124 | anchors.rightMargin: 0 | ||
| 125 | anchors.left: parent.left | ||
| 126 | anchors.leftMargin: 0 | ||
| 127 | anchors.bottom: parent.bottom | ||
| 128 | anchors.bottomMargin: 0 | ||
| 129 | anchors.top: parent.top | ||
| 130 | anchors.topMargin: 8 | ||
| 131 | horizontalAlignment: Text.AlignHCenter | ||
| 132 | font.pixelSize: 28 | ||
| 133 | } | ||
| 134 | |||
| 135 | states: [ | ||
| 136 | State { | ||
| 137 | name: "mouseOver" | ||
| 138 | |||
| 139 | PropertyChanges { | ||
| 140 | target: roundedRect | ||
| 141 | color: "#121212" | ||
| 142 | radius: 3 | ||
| 143 | border.width: 2 | ||
| 144 | border.color: "#00b4ef" | ||
| 145 | } | ||
| 146 | |||
| 147 | PropertyChanges { | ||
| 148 | target: letter | ||
| 149 | color: "#00b4ef" | ||
| 150 | style: Text.Normal | ||
| 151 | } | ||
| 152 | }, | ||
| 153 | State { | ||
| 154 | name: "mouseClicked" | ||
| 155 | PropertyChanges { | ||
| 156 | target: roundedRect | ||
| 157 | color: "#1080b8" | ||
| 158 | border.width: 2 | ||
| 159 | border.color: "#00b4ef" | ||
| 160 | } | ||
| 161 | |||
| 162 | PropertyChanges { | ||
| 163 | target: letter | ||
| 164 | color: "#121212" | ||
| 165 | styleColor: "#00000000" | ||
| 166 | style: Text.Normal | ||
| 167 | } | ||
| 168 | }, | ||
| 169 | State { | ||
| 170 | name: "mouseDepressed" | ||
| 171 | PropertyChanges { | ||
| 172 | target: roundedRect | ||
| 173 | color: "#0578b1" | ||
| 174 | border.width: 0 | ||
| 175 | } | ||
| 176 | |||
| 177 | PropertyChanges { | ||
| 178 | target: letter | ||
| 179 | color: "#121212" | ||
| 180 | styleColor: "#00000000" | ||
| 181 | style: Text.Normal | ||
| 182 | } | ||
| 183 | } | ||
| 184 | ] | ||
| 185 | } | 4 | } |
| @@ -1,354 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // FileDialog.qml | ||
| 3 | // | ||
| 4 | // Created by Anthony Thibault on 31 Oct 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.7 | 3 | Keyboard { |
| 12 | import QtGraphicalEffects 1.0 | ||
| 13 | import "." | ||
| 14 | |||
| 15 | Rectangle { | ||
| 16 | id: keyboardBase | ||
| 17 | objectName: "keyboard" | ||
| 18 | |||
| 19 | anchors.left: parent.left | ||
| 20 | anchors.right: parent.right | ||
| 21 | |||
| 22 | color: "#252525" | ||
| 23 | |||
| 24 | property bool raised: false | ||
| 25 | property bool numeric: false | ||
| 26 | |||
| 27 | readonly property int keyboardRowHeight: 50 | ||
| 28 | readonly property int keyboardWidth: 480 | ||
| 29 | readonly property int keyboardHeight: 200 | ||
| 30 | |||
| 31 | readonly property int mirrorTextHeight: keyboardRowHeight | ||
| 32 | |||
| 33 | property bool password: false | ||
| 34 | property alias mirroredText: mirrorText.text | ||
| 35 | property bool showMirrorText: true | ||
| 36 | |||
| 37 | readonly property int raisedHeight: keyboardHeight + (showMirrorText ? keyboardRowHeight : 0) | ||
| 38 | |||
| 39 | height: enabled && raised ? raisedHeight : 0 | ||
| 40 | visible: enabled && raised | ||
| 41 | |||
| 42 | property bool shiftMode: false | ||
| 43 | property bool numericShiftMode: false | ||
| 44 | |||
| 45 | onRaisedChanged: { | ||
| 46 | mirroredText = ""; | ||
| 47 | } | ||
| 48 | |||
| 49 | function resetShiftMode(mode) { | ||
| 50 | shiftMode = mode; | ||
| 51 | shiftKey.resetToggledMode(mode); | ||
| 52 | } | ||
| 53 | |||
| 54 | function toUpper(str) { | ||
| 55 | if (str === ",") { | ||
| 56 | return "<"; | ||
| 57 | } else if (str === ".") { | ||
| 58 | return ">"; | ||
| 59 | } else if (str === "/") { | ||
| 60 | return "?"; | ||
| 61 | } else if (str === "-") { | ||
| 62 | return "_"; | ||
| 63 | } else { | ||
| 64 | return str.toUpperCase(str); | ||
| 65 | } | ||
| 66 | } | ||
| 67 | |||
| 68 | function toLower(str) { | ||
| 69 | if (str === "<") { | ||
| 70 | return ","; | ||
| 71 | } else if (str === ">") { | ||
| 72 | return "."; | ||
| 73 | } else if (str === "?") { | ||
| 74 | return "/"; | ||
| 75 | } else if (str === "_") { | ||
| 76 | return "-"; | ||
| 77 | } else { | ||
| 78 | return str.toLowerCase(str); | ||
| 79 | } | ||
| 80 | } | ||
| 81 | |||
| 82 | function forEachKey(func) { | ||
| 83 | var i, j; | ||
| 84 | for (i = 0; i < columnAlpha.children.length; i++) { | ||
| 85 | var row = columnAlpha.children[i]; | ||
| 86 | for (j = 0; j < row.children.length; j++) { | ||
| 87 | var key = row.children[j]; | ||
| 88 | func(key); | ||
| 89 | } | ||
| 90 | } | ||
| 91 | } | ||
| 92 | |||
| 93 | onShiftModeChanged: { | ||
| 94 | forEachKey(function (key) { | ||
| 95 | if (/[a-z-_]/i.test(key.glyph)) { | ||
| 96 | if (shiftMode) { | ||
| 97 | key.glyph = keyboardBase.toUpper(key.glyph); | ||
| 98 | } else { | ||
| 99 | key.glyph = keyboardBase.toLower(key.glyph); | ||
| 100 | } | ||
| 101 | } | ||
| 102 | }); | ||
| 103 | } | ||
| 104 | |||
| 105 | function alphaKeyClickedHandler(mouseArea) { | ||
| 106 | // reset shift mode to false after first keypress | ||
| 107 | if (shiftMode) { | ||
| 108 | resetShiftMode(false); | ||
| 109 | } | ||
| 110 | } | ||
| 111 | |||
| 112 | Component.onCompleted: { | ||
| 113 | // hook up callbacks to every ascii key | ||
| 114 | forEachKey(function (key) { | ||
| 115 | if (/^[a-z]+$/i.test(key.glyph)) { | ||
| 116 | key.mouseArea.onClicked.connect(alphaKeyClickedHandler); | ||
| 117 | } | ||
| 118 | }); | ||
| 119 | } | ||
| 120 | |||
| 121 | Rectangle { | ||
| 122 | height: showMirrorText ? mirrorTextHeight : 0 | ||
| 123 | width: keyboardWidth | ||
| 124 | color: "#252525" | ||
| 125 | anchors.horizontalCenter: parent.horizontalCenter | ||
| 126 | |||
| 127 | TextInput { | ||
| 128 | id: mirrorText | ||
| 129 | visible: showMirrorText | ||
| 130 | font.family: "Fira Sans" | ||
| 131 | font.pixelSize: 20 | ||
| 132 | verticalAlignment: Text.AlignVCenter | ||
| 133 | horizontalAlignment: Text.AlignHCenter | ||
| 134 | color: "#00B4EF"; | ||
| 135 | anchors.left: parent.left | ||
| 136 | anchors.leftMargin: 10 | ||
| 137 | anchors.right: parent.right | ||
| 138 | anchors.top: parent.top | ||
| 139 | anchors.bottom: parent.bottom | ||
| 140 | |||
| 141 | wrapMode: Text.WordWrap | ||
| 142 | readOnly: false // we need this to allow control to accept QKeyEvent | ||
| 143 | selectByMouse: false | ||
| 144 | echoMode: password ? TextInput.Password : TextInput.Normal | ||
| 145 | |||
| 146 | Keys.onPressed: { | ||
| 147 | if (event.key == Qt.Key_Return || event.key == Qt.Key_Space) { | ||
| 148 | mirrorText.text = ""; | ||
| 149 | event.accepted = true; | ||
| 150 | } | ||
| 151 | } | ||
| 152 | |||
| 153 | MouseArea { // ... and we need this mouse area to prevent mirrorText from getting mouse events to ensure it will never get focus | ||
| 154 | anchors.fill: parent | ||
| 155 | } | ||
| 156 | } | ||
| 157 | } | ||
| 158 | |||
| 159 | Rectangle { | ||
| 160 | id: keyboardRect | ||
| 161 | y: showMirrorText ? mirrorTextHeight : 0 | ||
| 162 | width: keyboardWidth | ||
| 163 | height: keyboardHeight | ||
| 164 | color: "#252525" | ||
| 165 | anchors.horizontalCenter: parent.horizontalCenter | ||
| 166 | anchors.bottom: parent.bottom | ||
| 167 | anchors.bottomMargin: 0 | ||
| 168 | |||
| 169 | Column { | ||
| 170 | id: columnAlpha | ||
| 171 | width: keyboardWidth | ||
| 172 | height: keyboardHeight | ||
| 173 | visible: !numeric | ||
| 174 | |||
| 175 | Row { | ||
| 176 | width: keyboardWidth | ||
| 177 | height: keyboardRowHeight | ||
| 178 | anchors.left: parent.left | ||
| 179 | anchors.leftMargin: 4 | ||
| 180 | |||
| 181 | Key { width: 43; glyph: "q"; } | ||
| 182 | Key { width: 43; glyph: "w"; } | ||
| 183 | Key { width: 43; glyph: "e"; } | ||
| 184 | Key { width: 43; glyph: "r"; } | ||
| 185 | Key { width: 43; glyph: "t"; } | ||
| 186 | Key { width: 43; glyph: "y"; } | ||
| 187 | Key { width: 43; glyph: "u"; } | ||
| 188 | Key { width: 43; glyph: "i"; } | ||
| 189 | Key { width: 43; glyph: "o"; } | ||
| 190 | Key { width: 43; glyph: "p"; } | ||
| 191 | Key { width: 43; glyph: "←"; } | ||
| 192 | } | ||
| 193 | |||
| 194 | Row { | ||
| 195 | width: keyboardWidth | ||
| 196 | height: keyboardRowHeight | ||
| 197 | anchors.left: parent.left | ||
| 198 | anchors.leftMargin: 20 | ||
| 199 | |||
| 200 | Key { width: 43; glyph: "a"; } | ||
| 201 | Key { width: 43; glyph: "s"; } | ||
| 202 | Key { width: 43; glyph: "d"; } | ||
| 203 | Key { width: 43; glyph: "f"; } | ||
| 204 | Key { width: 43; glyph: "g"; } | ||
| 205 | Key { width: 43; glyph: "h"; } | ||
| 206 | Key { width: 43; glyph: "j"; } | ||
| 207 | Key { width: 43; glyph: "k"; } | ||
| 208 | Key { width: 43; glyph: "l"; } | ||
| 209 | Key { width: 70; glyph: "⏎"; } | ||
| 210 | } | ||
| 211 | |||
| 212 | Row { | ||
| 213 | width: keyboardWidth | ||
| 214 | height: keyboardRowHeight | ||
| 215 | anchors.left: parent.left | ||
| 216 | anchors.leftMargin: 4 | ||
| 217 | |||
| 218 | Key { | ||
| 219 | id: shiftKey | ||
| 220 | width: 43 | ||
| 221 | glyph: "⇪" | ||
| 222 | toggle: true | ||
| 223 | onToggledChanged: shiftMode = toggled | ||
| 224 | } | ||
| 225 | Key { width: 43; glyph: "z"; } | ||
| 226 | Key { width: 43; glyph: "x"; } | ||
| 227 | Key { width: 43; glyph: "c"; } | ||
| 228 | Key { width: 43; glyph: "v"; } | ||
| 229 | Key { width: 43; glyph: "b"; } | ||
| 230 | Key { width: 43; glyph: "n"; } | ||
| 231 | Key { width: 43; glyph: "m"; } | ||
| 232 | Key { width: 43; glyph: "-"; } | ||
| 233 | Key { width: 43; glyph: "/"; } | ||
| 234 | Key { width: 43; glyph: "?"; } | ||
| 235 | } | ||
| 236 | |||
| 237 | Row { | ||
| 238 | width: keyboardWidth | ||
| 239 | height: keyboardRowHeight | ||
| 240 | anchors.left: parent.left | ||
| 241 | anchors.leftMargin: 4 | ||
| 242 | |||
| 243 | Key { | ||
| 244 | width: 70 | ||
| 245 | glyph: "123" | ||
| 246 | mouseArea.onClicked: keyboardBase.parent.punctuationMode = true | ||
| 247 | } | ||
| 248 | Key { width: 231; glyph: " "; } | ||
| 249 | Key { width: 43; glyph: ","; } | ||
| 250 | Key { width: 43; glyph: "."; } | ||
| 251 | Key { | ||
| 252 | fontFamily: "hifi-glyphs"; | ||
| 253 | fontPixelSize: 48; | ||
| 254 | letterAnchors.topMargin: -4; | ||
| 255 | verticalAlignment: Text.AlignVCenter; | ||
| 256 | width: 86; glyph: "\ue02b"; | ||
| 257 | } | ||
| 258 | } | ||
| 259 | } | ||
| 260 | |||
| 261 | Column { | ||
| 262 | id: columnNumeric | ||
| 263 | width: keyboardWidth | ||
| 264 | height: keyboardHeight | ||
| 265 | visible: numeric | ||
| 266 | |||
| 267 | Row { | ||
| 268 | width: keyboardWidth | ||
| 269 | height: keyboardRowHeight | ||
| 270 | anchors.left: parent.left | ||
| 271 | anchors.leftMargin: 4 | ||
| 272 | |||
| 273 | Key { width: 43; glyph: "1"; } | ||
| 274 | Key { width: 43; glyph: "2"; } | ||
| 275 | Key { width: 43; glyph: "3"; } | ||
| 276 | Key { width: 43; glyph: "4"; } | ||
| 277 | Key { width: 43; glyph: "5"; } | ||
| 278 | Key { width: 43; glyph: "6"; } | ||
| 279 | Key { width: 43; glyph: "7"; } | ||
| 280 | Key { width: 43; glyph: "8"; } | ||
| 281 | Key { width: 43; glyph: "9"; } | ||
| 282 | Key { width: 43; glyph: "0"; } | ||
| 283 | Key { width: 43; glyph: "←"; } | ||
| 284 | } | ||
| 285 | |||
| 286 | Row { | ||
| 287 | width: keyboardWidth | ||
| 288 | height: keyboardRowHeight | ||
| 289 | anchors.left: parent.left | ||
| 290 | anchors.leftMargin: 4 | ||
| 291 | |||
| 292 | Key { width: 43; glyph: "!"; } | ||
| 293 | Key { width: 43; glyph: "@"; } | ||
| 294 | Key { width: 43; glyph: "#"; } | ||
| 295 | Key { width: 43; glyph: "$"; } | ||
| 296 | Key { width: 43; glyph: "%"; } | ||
| 297 | Key { width: 43; glyph: "^"; } | ||
| 298 | Key { width: 43; glyph: "&"; } | ||
| 299 | Key { width: 43; glyph: "*"; } | ||
| 300 | Key { width: 43; glyph: "("; } | ||
| 301 | Key { width: 43; glyph: ")"; } | ||
| 302 | Key { width: 43; glyph: "⏎"; } | ||
| 303 | } | ||
| 304 | |||
| 305 | Row { | ||
| 306 | width: keyboardWidth | ||
| 307 | height: keyboardRowHeight | ||
| 308 | anchors.left: parent.left | ||
| 309 | anchors.leftMargin: 4 | ||
| 310 | |||
| 311 | Key { | ||
| 312 | id: numericShiftKey | ||
| 313 | width: 43 | ||
| 314 | glyph: "\u21E8" | ||
| 315 | toggle: true | ||
| 316 | onToggledChanged: numericShiftMode = toggled | ||
| 317 | } | ||
| 318 | Key { width: 43; glyph: numericShiftMode ? "`" : "+"; } | ||
| 319 | Key { width: 43; glyph: numericShiftMode ? "~" : "-"; } | ||
| 320 | Key { width: 43; glyph: numericShiftMode ? "\u00A3" : "="; } | ||
| 321 | Key { width: 43; glyph: numericShiftMode ? "\u20AC" : ";"; } | ||
| 322 | Key { width: 43; glyph: numericShiftMode ? "\u00A5" : ":"; } | ||
| 323 | Key { width: 43; glyph: numericShiftMode ? "<" : "'"; } | ||
| 324 | Key { width: 43; glyph: numericShiftMode ? ">" : "\""; } | ||
| 325 | Key { width: 43; glyph: numericShiftMode ? "[" : "{"; } | ||
| 326 | Key { width: 43; glyph: numericShiftMode ? "]" : "}"; } | ||
| 327 | Key { width: 43; glyph: numericShiftMode ? "\\" : "|"; } | ||
| 328 | } | ||
| 329 | |||
| 330 | Row { | ||
| 331 | width: keyboardWidth | ||
| 332 | height: keyboardRowHeight | ||
| 333 | anchors.left: parent.left | ||
| 334 | anchors.leftMargin: 4 | ||
| 335 | |||
| 336 | Key { | ||
| 337 | width: 70 | ||
| 338 | glyph: "abc" | ||
| 339 | mouseArea.onClicked: keyboardBase.parent.punctuationMode = false | ||
| 340 | } | ||
| 341 | Key { width: 231; glyph: " "; } | ||
| 342 | Key { width: 43; glyph: ","; } | ||
| 343 | Key { width: 43; glyph: "."; } | ||
| 344 | Key { | ||
| 345 | fontFamily: "hifi-glyphs"; | ||
| 346 | fontPixelSize: 48; | ||
| 347 | letterAnchors.topMargin: -4; | ||
| 348 | verticalAlignment: Text.AlignVCenter; | ||
| 349 | width: 86; glyph: "\ue02b"; | ||
| 350 | } | ||
| 351 | } | ||
| 352 | } | ||
| 353 | } | ||
| 354 | } | 4 | } |
| @@ -1,35 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // Label.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 26 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.7 | 3 | Label { |
| 12 | |||
| 13 | import "../styles-uit" | ||
| 14 | |||
| 15 | RalewaySemiBold { | ||
| 16 | HifiConstants { id: hifi } | ||
| 17 | property int colorScheme: hifi.colorSchemes.light | ||
| 18 | |||
| 19 | size: hifi.fontSizes.inputLabel | ||
| 20 | color: { | ||
| 21 | if (colorScheme === hifi.colorSchemes.dark) { | ||
| 22 | if (enabled) { | ||
| 23 | hifi.colors.lightGrayText | ||
| 24 | } else { | ||
| 25 | hifi.colors.baseGrayHighlight | ||
| 26 | } | ||
| 27 | } else { | ||
| 28 | if (enabled) { | ||
| 29 | hifi.colors.lightGray | ||
| 30 | } else { | ||
| 31 | hifi.colors.lightGrayText | ||
| 32 | } | ||
| 33 | } | ||
| 34 | } | ||
| 35 | } | 4 | } |
| @@ -1,41 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // QueuedButton.qml | ||
| 3 | // -- original Button.qml + signal timer workaround --ht | ||
| 4 | // Created by David Rowe on 16 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | QueuedButton { |
| 12 | |||
| 13 | import "../styles-uit" | ||
| 14 | import "." as HifiControls | ||
| 15 | |||
| 16 | HifiControls.Button { | ||
| 17 | // FIXME: THIS WORKAROUND MIGRATED/CONSOLIDATED FROM RUNNINGSCRIPTS.QML | ||
| 18 | |||
| 19 | // For some reason trigginer an API that enters | ||
| 20 | // an internal event loop directly from the button clicked | ||
| 21 | // trigger below causes the appliction to behave oddly. | ||
| 22 | // Most likely because the button onClicked handling is never | ||
| 23 | // completed until the function returns. | ||
| 24 | // FIXME find a better way of handling the input dialogs that | ||
| 25 | // doesn't trigger this. | ||
| 26 | |||
| 27 | // NOTE: dialogs that need to use this workaround can connect via | ||
| 28 | // onQueuedClicked: ... | ||
| 29 | // instead of: | ||
| 30 | // onClicked: ... | ||
| 31 | |||
| 32 | signal clickedQueued() | ||
| 33 | Timer { | ||
| 34 | id: fromTimer | ||
| 35 | interval: 5 | ||
| 36 | repeat: false | ||
| 37 | running: false | ||
| 38 | onTriggered: clickedQueued() | ||
| 39 | } | ||
| 40 | onClicked: fromTimer.running = true | ||
| 41 | } | 4 | } |
| @@ -1,93 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // RadioButton.qml | ||
| 3 | // | ||
| 4 | // Created by Cain Kilgore on 20th July 2017 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | RadioButton { |
| 12 | import QtQuick.Controls 2.2 as Original | ||
| 13 | |||
| 14 | import "../styles-uit" | ||
| 15 | import "../controls-uit" as HifiControls | ||
| 16 | |||
| 17 | import TabletScriptingInterface 1.0 | ||
| 18 | |||
| 19 | Original.RadioButton { | ||
| 20 | id: radioButton | ||
| 21 | HifiConstants { id: hifi } | ||
| 22 | |||
| 23 | hoverEnabled: true | ||
| 24 | |||
| 25 | property int colorScheme: hifi.colorSchemes.light | ||
| 26 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 27 | |||
| 28 | property real letterSpacing: 1 | ||
| 29 | property int fontSize: hifi.fontSizes.inputLabel | ||
| 30 | property int boxSize: defaultBoxSize | ||
| 31 | property real scaleFactor: boxSize / defaultBoxSize | ||
| 32 | |||
| 33 | readonly property int defaultBoxSize: 14 | ||
| 34 | readonly property int boxRadius: 3 * scaleFactor | ||
| 35 | readonly property int checkSize: 10 * scaleFactor | ||
| 36 | readonly property int checkRadius: 2 * scaleFactor | ||
| 37 | readonly property int indicatorRadius: 7 * scaleFactor | ||
| 38 | |||
| 39 | onClicked: { | ||
| 40 | Tablet.playSound(TabletEnums.ButtonClick); | ||
| 41 | } | ||
| 42 | |||
| 43 | onHoveredChanged: { | ||
| 44 | if (hovered) { | ||
| 45 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 46 | } | ||
| 47 | } | ||
| 48 | |||
| 49 | indicator: Rectangle { | ||
| 50 | id: box | ||
| 51 | width: boxSize | ||
| 52 | height: boxSize | ||
| 53 | radius: indicatorRadius | ||
| 54 | x: radioButton.leftPadding | ||
| 55 | y: parent.height / 2 - height / 2 | ||
| 56 | gradient: Gradient { | ||
| 57 | GradientStop { | ||
| 58 | position: 0.2 | ||
| 59 | color: pressed || hovered | ||
| 60 | ? (radioButton.isLightColorScheme ? hifi.colors.checkboxDarkStart : hifi.colors.checkboxLightStart) | ||
| 61 | : (radioButton.isLightColorScheme ? hifi.colors.checkboxLightStart : hifi.colors.checkboxDarkStart) | ||
| 62 | } | ||
| 63 | GradientStop { | ||
| 64 | position: 1.0 | ||
| 65 | color: pressed || hovered | ||
| 66 | ? (radioButton.isLightColorScheme ? hifi.colors.checkboxDarkFinish : hifi.colors.checkboxLightFinish) | ||
| 67 | : (radioButton.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish) | ||
| 68 | } | ||
| 69 | } | ||
| 70 | |||
| 71 | Rectangle { | ||
| 72 | id: check | ||
| 73 | width: checkSize | ||
| 74 | height: checkSize | ||
| 75 | radius: indicatorRadius | ||
| 76 | anchors.centerIn: parent | ||
| 77 | color: "#00B4EF" | ||
| 78 | border.width: 1 | ||
| 79 | border.color: "#36CDFF" | ||
| 80 | visible: checked && !pressed || !checked && pressed | ||
| 81 | } | ||
| 82 | } | ||
| 83 | |||
| 84 | contentItem: RalewaySemiBold { | ||
| 85 | text: radioButton.text | ||
| 86 | size: radioButton.fontSize | ||
| 87 | font.letterSpacing: letterSpacing | ||
| 88 | color: isLightColorScheme ? hifi.colors.lightGray : hifi.colors.lightGrayText | ||
| 89 | horizontalAlignment: Text.AlignHCenter | ||
| 90 | verticalAlignment: Text.AlignVCenter | ||
| 91 | leftPadding: radioButton.indicator.width + radioButton.spacing | ||
| 92 | } | ||
| 93 | } | 4 | } |
| @@ -1,41 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // ScrollBar.qml | ||
| 3 | // | ||
| 4 | // Created by Vlad Stelmahovsky on 27 Nov 2017 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | import QtQuick.Controls 2.2 | ||
| 13 | |||
| 14 | import "../styles-uit" | ||
| 15 | 2 | ||
| 16 | ScrollBar { | 3 | ScrollBar { |
| 17 | visible: size < 1.0 | ||
| 18 | |||
| 19 | HifiConstants { id: hifi } | ||
| 20 | property int colorScheme: hifi.colorSchemes.light | ||
| 21 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 22 | |||
| 23 | background: Item { | ||
| 24 | implicitWidth: hifi.dimensions.scrollbarBackgroundWidth | ||
| 25 | Rectangle { | ||
| 26 | anchors { fill: parent; topMargin: 3; bottomMargin: 3 } | ||
| 27 | radius: hifi.dimensions.scrollbarHandleWidth/2 | ||
| 28 | color: isLightColorScheme ? hifi.colors.tableScrollBackgroundLight | ||
| 29 | : hifi.colors.tableScrollBackgroundDark | ||
| 30 | } | ||
| 31 | } | ||
| 32 | |||
| 33 | contentItem: Item { | ||
| 34 | implicitWidth: hifi.dimensions.scrollbarHandleWidth | ||
| 35 | Rectangle { | ||
| 36 | anchors { fill: parent; topMargin: 1; bottomMargin: 1 } | ||
| 37 | radius: hifi.dimensions.scrollbarHandleWidth/2 | ||
| 38 | color: isLightColorScheme ? hifi.colors.tableScrollHandleLight : hifi.colors.tableScrollHandleDark | ||
| 39 | } | ||
| 40 | } | ||
| 41 | } | 4 | } |
| @@ -1,44 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // Separator.qml | ||
| 3 | // | ||
| 4 | // Created by Zach Fox on 2017-06-06 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | Separator { |
| 12 | import "../styles-uit" | ||
| 13 | |||
| 14 | Item { | ||
| 15 | property int colorScheme: 0; | ||
| 16 | |||
| 17 | readonly property var topColor: [ hifi.colors.baseGrayShadow, hifi.colors.faintGray, "#89858C" ]; | ||
| 18 | readonly property var bottomColor: [ hifi.colors.baseGrayHighlight, hifi.colors.faintGray, "#89858C" ]; | ||
| 19 | |||
| 20 | // Size | ||
| 21 | height: colorScheme === 0 ? 2 : 1; | ||
| 22 | Rectangle { | ||
| 23 | // Size | ||
| 24 | width: parent.width; | ||
| 25 | height: 1; | ||
| 26 | // Anchors | ||
| 27 | anchors.left: parent.left; | ||
| 28 | anchors.bottom: parent.bottom; | ||
| 29 | // Style | ||
| 30 | color: topColor[colorScheme]; | ||
| 31 | } | ||
| 32 | Rectangle { | ||
| 33 | visible: colorScheme === 0; | ||
| 34 | // Size | ||
| 35 | width: parent.width; | ||
| 36 | height: 1; | ||
| 37 | // Anchors | ||
| 38 | anchors.left: parent.left; | ||
| 39 | anchors.bottom: parent.bottom; | ||
| 40 | anchors.bottomMargin: -height; | ||
| 41 | // Style | ||
| 42 | color: bottomColor[colorScheme]; | ||
| 43 | } | ||
| 44 | } | 4 | } |
| @@ -1,98 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // Slider.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 27 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | import QtQuick.Controls 2.2 | ||
| 13 | |||
| 14 | import "../styles-uit" | ||
| 15 | import "../controls-uit" as HifiControls | ||
| 16 | 2 | ||
| 17 | Slider { | 3 | Slider { |
| 18 | id: slider | 4 | } |
| 19 | |||
| 20 | property int colorScheme: hifi.colorSchemes.light | ||
| 21 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 22 | property string label: "" | ||
| 23 | property real controlHeight: height + (sliderLabel.visible ? sliderLabel.height + sliderLabel.anchors.bottomMargin : 0) | ||
| 24 | |||
| 25 | property alias minimumValue: slider.from | ||
| 26 | property alias maximumValue: slider.to | ||
| 27 | property alias step: slider.stepSize | ||
| 28 | property bool tickmarksEnabled: false | ||
| 29 | |||
| 30 | height: hifi.fontSizes.textFieldInput + 14 // Match height of TextField control. | ||
| 31 | y: sliderLabel.visible ? sliderLabel.height + sliderLabel.anchors.bottomMargin : 0 | ||
| 32 | |||
| 33 | background: Rectangle { | ||
| 34 | x: slider.leftPadding | ||
| 35 | y: slider.topPadding + slider.availableHeight / 2 - height / 2 | ||
| 36 | |||
| 37 | implicitWidth: 50 | ||
| 38 | implicitHeight: hifi.dimensions.sliderGrooveHeight | ||
| 39 | width: slider.availableWidth | ||
| 40 | height: implicitHeight | ||
| 41 | radius: height / 2 | ||
| 42 | color: isLightColorScheme ? hifi.colors.sliderGutterLight : hifi.colors.sliderGutterDark | ||
| 43 | |||
| 44 | Rectangle { | ||
| 45 | width: slider.visualPosition * parent.width | ||
| 46 | height: parent.height | ||
| 47 | radius: height / 2 | ||
| 48 | gradient: Gradient { | ||
| 49 | GradientStop { position: 0.0; color: hifi.colors.blueAccent } | ||
| 50 | GradientStop { position: 1.0; color: hifi.colors.primaryHighlight } | ||
| 51 | } | ||
| 52 | } | ||
| 53 | } | ||
| 54 | |||
| 55 | handle: Rectangle { | ||
| 56 | x: slider.leftPadding + slider.visualPosition * (slider.availableWidth - width) | ||
| 57 | y: slider.topPadding + slider.availableHeight / 2 - height / 2 | ||
| 58 | implicitWidth: hifi.dimensions.sliderHandleSize | ||
| 59 | implicitHeight: hifi.dimensions.sliderHandleSize | ||
| 60 | radius: height / 2 | ||
| 61 | border.width: 1 | ||
| 62 | border.color: isLightColorScheme ? hifi.colors.sliderBorderLight : hifi.colors.sliderBorderDark | ||
| 63 | gradient: Gradient { | ||
| 64 | GradientStop { | ||
| 65 | position: 0.0 | ||
| 66 | color: pressed || hovered | ||
| 67 | ? (isLightColorScheme ? hifi.colors.sliderDarkStart : hifi.colors.sliderLightStart ) | ||
| 68 | : (isLightColorScheme ? hifi.colors.sliderLightStart : hifi.colors.sliderDarkStart ) | ||
| 69 | } | ||
| 70 | GradientStop { | ||
| 71 | position: 1.0 | ||
| 72 | color: pressed || hovered | ||
| 73 | ? (isLightColorScheme ? hifi.colors.sliderDarkFinish : hifi.colors.sliderLightFinish ) | ||
| 74 | : (isLightColorScheme ? hifi.colors.sliderLightFinish : hifi.colors.sliderDarkFinish ) | ||
| 75 | } | ||
| 76 | } | ||
| 77 | |||
| 78 | Rectangle { | ||
| 79 | height: parent.height - 2 | ||
| 80 | width: height | ||
| 81 | radius: height / 2 | ||
| 82 | anchors.centerIn: parent | ||
| 83 | color: hifi.colors.transparent | ||
| 84 | border.width: 1 | ||
| 85 | border.color: hifi.colors.black | ||
| 86 | } | ||
| 87 | } | ||
| 88 | |||
| 89 | HifiControls.Label { | ||
| 90 | id: sliderLabel | ||
| 91 | text: slider.label | ||
| 92 | colorScheme: slider.colorScheme | ||
| 93 | anchors.left: parent.left | ||
| 94 | anchors.bottom: parent.top | ||
| 95 | anchors.bottomMargin: 2 | ||
| 96 | visible: label != "" | ||
| 97 | } | ||
| 98 | } | ||
| @@ -1,185 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // SpinBox.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 26 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | import QtQuick.Controls 2.2 | ||
| 13 | |||
| 14 | import "../styles-uit" | ||
| 15 | import "../controls-uit" as HifiControls | ||
| 16 | 2 | ||
| 17 | SpinBox { | 3 | SpinBox { |
| 18 | id: spinBox | ||
| 19 | |||
| 20 | HifiConstants { | ||
| 21 | id: hifi | ||
| 22 | } | ||
| 23 | |||
| 24 | inputMethodHints: Qt.ImhFormattedNumbersOnly | ||
| 25 | property int colorScheme: hifi.colorSchemes.light | ||
| 26 | readonly property bool isLightColorScheme: colorScheme === hifi.colorSchemes.light | ||
| 27 | property string label: "" | ||
| 28 | property string suffix: "" | ||
| 29 | property string labelInside: "" | ||
| 30 | property color colorLabelInside: hifi.colors.white | ||
| 31 | property color backgroundColor: isLightColorScheme | ||
| 32 | ? (spinBox.activeFocus ? hifi.colors.white : hifi.colors.lightGray) | ||
| 33 | : (spinBox.activeFocus ? hifi.colors.black : hifi.colors.baseGrayShadow) | ||
| 34 | property real controlHeight: height + (spinBoxLabel.visible ? spinBoxLabel.height + spinBoxLabel.anchors.bottomMargin : 0) | ||
| 35 | property int decimals: 2; | ||
| 36 | property real factor: Math.pow(10, decimals) | ||
| 37 | |||
| 38 | property real minimumValue: 0.0 | ||
| 39 | property real maximumValue: 0.0 | ||
| 40 | |||
| 41 | property real realValue: 0.0 | ||
| 42 | property real realFrom: minimumValue | ||
| 43 | property real realTo: maximumValue | ||
| 44 | property real realStepSize: 1.0 | ||
| 45 | |||
| 46 | signal editingFinished() | ||
| 47 | |||
| 48 | implicitHeight: height | ||
| 49 | implicitWidth: width | ||
| 50 | editable: true | ||
| 51 | |||
| 52 | padding: 0 | ||
| 53 | leftPadding: 0 | ||
| 54 | rightPadding: padding + (up.indicator ? up.indicator.width : 0) | ||
| 55 | topPadding: 0 | ||
| 56 | bottomPadding: 0 | ||
| 57 | |||
| 58 | locale: Qt.locale("en_US") | ||
| 59 | |||
| 60 | onValueModified: realValue = value/factor | ||
| 61 | onValueChanged: realValue = value/factor | ||
| 62 | onRealValueChanged: { | ||
| 63 | var newValue = Math.round(realValue*factor); | ||
| 64 | if(value != newValue) { | ||
| 65 | value = newValue; | ||
| 66 | } | ||
| 67 | } | ||
| 68 | |||
| 69 | stepSize: realStepSize*factor | ||
| 70 | to : realTo*factor | ||
| 71 | from : realFrom*factor | ||
| 72 | |||
| 73 | font.family: "Fira Sans SemiBold" | ||
| 74 | font.pixelSize: hifi.fontSizes.textFieldInput | ||
| 75 | height: hifi.fontSizes.textFieldInput + 13 // Match height of TextField control. | ||
| 76 | |||
| 77 | y: spinBoxLabel.visible ? spinBoxLabel.height + spinBoxLabel.anchors.bottomMargin : 0 | ||
| 78 | |||
| 79 | background: Rectangle { | ||
| 80 | color: backgroundColor | ||
| 81 | border.color: spinBoxLabelInside.visible ? spinBoxLabelInside.color : hifi.colors.primaryHighlight | ||
| 82 | border.width: spinBox.activeFocus ? spinBoxLabelInside.visible ? 2 : 1 : 0 | ||
| 83 | } | ||
| 84 | |||
| 85 | validator: DoubleValidator { | ||
| 86 | bottom: Math.min(spinBox.from, spinBox.to) | ||
| 87 | top: Math.max(spinBox.from, spinBox.to) | ||
| 88 | } | ||
| 89 | |||
| 90 | textFromValue: function(value, locale) { | ||
| 91 | return parseFloat(value/factor).toFixed(decimals); | ||
| 92 | } | ||
| 93 | |||
| 94 | valueFromText: function(text, locale) { | ||
| 95 | return Number.fromLocaleString(locale, text)*factor; | ||
| 96 | } | ||
| 97 | |||
| 98 | |||
| 99 | contentItem: TextInput { | ||
| 100 | z: 2 | ||
| 101 | color: isLightColorScheme | ||
| 102 | ? (spinBox.activeFocus ? hifi.colors.black : hifi.colors.lightGray) | ||
| 103 | : (spinBox.activeFocus ? hifi.colors.white : hifi.colors.lightGrayText) | ||
| 104 | selectedTextColor: hifi.colors.black | ||
| 105 | selectionColor: hifi.colors.primaryHighlight | ||
| 106 | text: spinBox.textFromValue(spinBox.value, spinBox.locale) + suffix | ||
| 107 | inputMethodHints: spinBox.inputMethodHints | ||
| 108 | validator: spinBox.validator | ||
| 109 | verticalAlignment: Qt.AlignVCenter | ||
| 110 | leftPadding: spinBoxLabelInside.visible ? 30 : hifi.dimensions.textPadding | ||
| 111 | //rightPadding: hifi.dimensions.spinnerSize | ||
| 112 | width: spinBox.width - hifi.dimensions.spinnerSize | ||
| 113 | onEditingFinished: spinBox.editingFinished() | ||
| 114 | } | ||
| 115 | |||
| 116 | up.indicator: Item { | ||
| 117 | x: spinBox.width - implicitWidth - 5 | ||
| 118 | y: 1 | ||
| 119 | clip: true | ||
| 120 | implicitHeight: spinBox.implicitHeight/2 | ||
| 121 | implicitWidth: spinBox.implicitHeight/2 | ||
| 122 | HiFiGlyphs { | ||
| 123 | anchors.centerIn: parent | ||
| 124 | text: hifi.glyphs.caratUp | ||
| 125 | size: hifi.dimensions.spinnerSize | ||
| 126 | color: spinBox.up.pressed || spinBox.up.hovered ? (isLightColorScheme ? hifi.colors.black : hifi.colors.white) : hifi.colors.gray | ||
| 127 | } | ||
| 128 | } | ||
| 129 | up.onPressedChanged: { | ||
| 130 | if(value) { | ||
| 131 | spinBox.forceActiveFocus(); | ||
| 132 | } | ||
| 133 | } | ||
| 134 | |||
| 135 | down.indicator: Item { | ||
| 136 | x: spinBox.width - implicitWidth - 5 | ||
| 137 | y: spinBox.implicitHeight/2 | ||
| 138 | clip: true | ||
| 139 | implicitHeight: spinBox.implicitHeight/2 | ||
| 140 | implicitWidth: spinBox.implicitHeight/2 | ||
| 141 | HiFiGlyphs { | ||
| 142 | anchors.centerIn: parent | ||
| 143 | text: hifi.glyphs.caratDn | ||
| 144 | size: hifi.dimensions.spinnerSize | ||
| 145 | color: spinBox.down.pressed || spinBox.down.hovered ? (isLightColorScheme ? hifi.colors.black : hifi.colors.white) : hifi.colors.gray | ||
| 146 | } | ||
| 147 | } | ||
| 148 | down.onPressedChanged: { | ||
| 149 | if(value) { | ||
| 150 | spinBox.forceActiveFocus(); | ||
| 151 | } | ||
| 152 | } | ||
| 153 | |||
| 154 | HifiControls.Label { | ||
| 155 | id: spinBoxLabel | ||
| 156 | text: spinBox.label | ||
| 157 | colorScheme: spinBox.colorScheme | ||
| 158 | anchors.left: parent.left | ||
| 159 | anchors.bottom: parent.top | ||
| 160 | anchors.bottomMargin: 4 | ||
| 161 | visible: label != "" | ||
| 162 | } | ||
| 163 | |||
| 164 | HifiControls.Label { | ||
| 165 | id: spinBoxLabelInside | ||
| 166 | text: spinBox.labelInside | ||
| 167 | anchors.left: parent.left | ||
| 168 | anchors.leftMargin: 10 | ||
| 169 | font.bold: true | ||
| 170 | anchors.verticalCenter: parent.verticalCenter | ||
| 171 | color: spinBox.colorLabelInside | ||
| 172 | visible: spinBox.labelInside != "" | ||
| 173 | } | ||
| 174 | |||
| 175 | MouseArea { | ||
| 176 | anchors.fill: parent | ||
| 177 | acceptedButtons: Qt.NoButton | ||
| 178 | onWheel: { | ||
| 179 | if (wheel.angleDelta.y > 0) | ||
| 180 | value += stepSize | ||
| 181 | else | ||
| 182 | value -= stepSize | ||
| 183 | } | ||
| 184 | } | ||
| 185 | } | 4 | } |
| @@ -1,160 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // Switch.qml | ||
| 3 | // | ||
| 4 | // Created by Zach Fox on 2017-06-06 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.7 | 3 | Switch { |
| 12 | import QtQuick.Controls 2.2 as Original | ||
| 13 | |||
| 14 | import "../styles-uit" | ||
| 15 | |||
| 16 | Item { | ||
| 17 | id: rootSwitch; | ||
| 18 | |||
| 19 | property int colorScheme: hifi.colorSchemes.light; | ||
| 20 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light; | ||
| 21 | property int switchWidth: 70; | ||
| 22 | readonly property int switchRadius: height/2; | ||
| 23 | property string labelTextOff: ""; | ||
| 24 | property string labelGlyphOffText: ""; | ||
| 25 | property int labelGlyphOffSize: 32; | ||
| 26 | property string labelTextOn: ""; | ||
| 27 | property string labelGlyphOnText: ""; | ||
| 28 | property int labelGlyphOnSize: 32; | ||
| 29 | property alias checked: originalSwitch.checked; | ||
| 30 | signal onCheckedChanged; | ||
| 31 | signal clicked; | ||
| 32 | |||
| 33 | Original.Switch { | ||
| 34 | id: originalSwitch; | ||
| 35 | focusPolicy: Qt.ClickFocus | ||
| 36 | anchors.top: rootSwitch.top; | ||
| 37 | anchors.left: rootSwitch.left; | ||
| 38 | anchors.leftMargin: rootSwitch.width/2 - rootSwitch.switchWidth/2; | ||
| 39 | onCheckedChanged: rootSwitch.onCheckedChanged(); | ||
| 40 | onClicked: rootSwitch.clicked(); | ||
| 41 | hoverEnabled: true | ||
| 42 | |||
| 43 | topPadding: 3; | ||
| 44 | leftPadding: 3; | ||
| 45 | rightPadding: 3; | ||
| 46 | bottomPadding: 3; | ||
| 47 | |||
| 48 | onHoveredChanged: { | ||
| 49 | if (hovered) { | ||
| 50 | switchHandle.color = hifi.colors.blueHighlight; | ||
| 51 | } else { | ||
| 52 | switchHandle.color = hifi.colors.lightGray; | ||
| 53 | } | ||
| 54 | } | ||
| 55 | |||
| 56 | background: Rectangle { | ||
| 57 | color: "#252525"; | ||
| 58 | implicitWidth: rootSwitch.switchWidth; | ||
| 59 | implicitHeight: rootSwitch.height; | ||
| 60 | radius: rootSwitch.switchRadius; | ||
| 61 | } | ||
| 62 | |||
| 63 | indicator: Rectangle { | ||
| 64 | id: switchHandle; | ||
| 65 | implicitWidth: rootSwitch.height - originalSwitch.topPadding - originalSwitch.bottomPadding; | ||
| 66 | implicitHeight: implicitWidth; | ||
| 67 | radius: implicitWidth/2; | ||
| 68 | border.color: hifi.colors.lightGrayText; | ||
| 69 | color: hifi.colors.lightGray; | ||
| 70 | //x: originalSwitch.leftPadding | ||
| 71 | x: Math.max(0, Math.min(parent.width - width, originalSwitch.visualPosition * parent.width - (width / 2))) | ||
| 72 | y: parent.height / 2 - height / 2 | ||
| 73 | Behavior on x { | ||
| 74 | enabled: !originalSwitch.down | ||
| 75 | SmoothedAnimation { velocity: 200 } | ||
| 76 | } | ||
| 77 | |||
| 78 | } | ||
| 79 | } | ||
| 80 | |||
| 81 | // OFF Label | ||
| 82 | Item { | ||
| 83 | anchors.right: originalSwitch.left; | ||
| 84 | anchors.rightMargin: 10; | ||
| 85 | anchors.top: rootSwitch.top; | ||
| 86 | height: rootSwitch.height; | ||
| 87 | |||
| 88 | RalewaySemiBold { | ||
| 89 | id: labelOff; | ||
| 90 | text: labelTextOff; | ||
| 91 | size: hifi.fontSizes.inputLabel; | ||
| 92 | color: originalSwitch.checked ? hifi.colors.lightGrayText : "#FFFFFF"; | ||
| 93 | anchors.top: parent.top; | ||
| 94 | anchors.right: parent.right; | ||
| 95 | width: paintedWidth; | ||
| 96 | height: parent.height; | ||
| 97 | verticalAlignment: Text.AlignVCenter; | ||
| 98 | } | ||
| 99 | |||
| 100 | HiFiGlyphs { | ||
| 101 | id: labelGlyphOff; | ||
| 102 | text: labelGlyphOffText; | ||
| 103 | size: labelGlyphOffSize; | ||
| 104 | color: labelOff.color; | ||
| 105 | anchors.top: parent.top; | ||
| 106 | anchors.topMargin: 2; | ||
| 107 | anchors.right: labelOff.left; | ||
| 108 | anchors.rightMargin: 4; | ||
| 109 | } | ||
| 110 | |||
| 111 | MouseArea { | ||
| 112 | anchors.top: parent.top; | ||
| 113 | anchors.bottom: parent.bottom; | ||
| 114 | anchors.left: labelGlyphOff.left; | ||
| 115 | anchors.right: labelOff.right; | ||
| 116 | onClicked: { | ||
| 117 | originalSwitch.checked = false; | ||
| 118 | } | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | // ON Label | ||
| 123 | Item { | ||
| 124 | anchors.left: originalSwitch.right; | ||
| 125 | anchors.leftMargin: 10; | ||
| 126 | anchors.top: rootSwitch.top; | ||
| 127 | height: rootSwitch.height; | ||
| 128 | |||
| 129 | RalewaySemiBold { | ||
| 130 | id: labelOn; | ||
| 131 | text: labelTextOn; | ||
| 132 | size: hifi.fontSizes.inputLabel; | ||
| 133 | color: originalSwitch.checked ? "#FFFFFF" : hifi.colors.lightGrayText; | ||
| 134 | anchors.top: parent.top; | ||
| 135 | anchors.left: parent.left; | ||
| 136 | width: paintedWidth; | ||
| 137 | height: parent.height; | ||
| 138 | verticalAlignment: Text.AlignVCenter; | ||
| 139 | } | ||
| 140 | |||
| 141 | HiFiGlyphs { | ||
| 142 | id: labelGlyphOn; | ||
| 143 | text: labelGlyphOnText; | ||
| 144 | size: labelGlyphOnSize; | ||
| 145 | color: labelOn.color; | ||
| 146 | anchors.top: parent.top; | ||
| 147 | anchors.left: labelOn.right; | ||
| 148 | } | ||
| 149 | |||
| 150 | MouseArea { | ||
| 151 | anchors.top: parent.top; | ||
| 152 | anchors.bottom: parent.bottom; | ||
| 153 | anchors.left: labelOn.left; | ||
| 154 | anchors.right: labelGlyphOn.right; | ||
| 155 | onClicked: { | ||
| 156 | originalSwitch.checked = true; | ||
| 157 | } | ||
| 158 | } | ||
| 159 | } | ||
| 160 | } | 4 | } |
| @@ -1,165 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // Table.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 18 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | Table { |
| 12 | import QtQuick.Controls 1.4 | ||
| 13 | import QtQuick.Controls.Styles 1.4 | ||
| 14 | import QtQuick.Controls 2.3 as QQC2 | ||
| 15 | |||
| 16 | import "../styles-uit" | ||
| 17 | |||
| 18 | TableView { | ||
| 19 | id: tableView | ||
| 20 | |||
| 21 | property int colorScheme: hifi.colorSchemes.light | ||
| 22 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 23 | property bool expandSelectedRow: false | ||
| 24 | property bool centerHeaderText: false | ||
| 25 | readonly property real headerSpacing: 3 //spacing between sort indicator and table header title | ||
| 26 | property var titlePaintedPos: [] // storing extra data position behind painted | ||
| 27 | // title text and sort indicatorin table's header | ||
| 28 | signal titlePaintedPosSignal(int column) //signal that extradata position gets changed | ||
| 29 | |||
| 30 | model: ListModel { } | ||
| 31 | |||
| 32 | Component.onCompleted: { | ||
| 33 | if (flickableItem !== null && flickableItem !== undefined) { | ||
| 34 | tableView.flickableItem.QQC2.ScrollBar.vertical = scrollbar | ||
| 35 | } | ||
| 36 | } | ||
| 37 | |||
| 38 | QQC2.ScrollBar { | ||
| 39 | id: scrollbar | ||
| 40 | parent: tableView.flickableItem | ||
| 41 | policy: QQC2.ScrollBar.AsNeeded | ||
| 42 | orientation: Qt.Vertical | ||
| 43 | visible: size < 1.0 | ||
| 44 | topPadding: tableView.headerVisible ? hifi.dimensions.tableHeaderHeight + 1 : 1 | ||
| 45 | anchors.top: tableView.top | ||
| 46 | anchors.left: tableView.right | ||
| 47 | anchors.bottom: tableView.bottom | ||
| 48 | |||
| 49 | background: Item { | ||
| 50 | implicitWidth: hifi.dimensions.scrollbarBackgroundWidth | ||
| 51 | Rectangle { | ||
| 52 | anchors { | ||
| 53 | fill: parent; | ||
| 54 | topMargin: tableView.headerVisible ? hifi.dimensions.tableHeaderHeight : 0 | ||
| 55 | } | ||
| 56 | color: isLightColorScheme ? hifi.colors.tableScrollBackgroundLight | ||
| 57 | : hifi.colors.tableScrollBackgroundDark | ||
| 58 | } | ||
| 59 | } | ||
| 60 | |||
| 61 | contentItem: Item { | ||
| 62 | implicitWidth: hifi.dimensions.scrollbarHandleWidth | ||
| 63 | Rectangle { | ||
| 64 | anchors.fill: parent | ||
| 65 | radius: (width - 4)/2 | ||
| 66 | color: isLightColorScheme ? hifi.colors.tableScrollHandleLight : hifi.colors.tableScrollHandleDark | ||
| 67 | } | ||
| 68 | } | ||
| 69 | } | ||
| 70 | |||
| 71 | headerVisible: false | ||
| 72 | headerDelegate: Rectangle { | ||
| 73 | height: hifi.dimensions.tableHeaderHeight | ||
| 74 | color: isLightColorScheme ? hifi.colors.tableBackgroundLight : hifi.colors.tableBackgroundDark | ||
| 75 | |||
| 76 | |||
| 77 | RalewayRegular { | ||
| 78 | id: titleText | ||
| 79 | x: centerHeaderText ? (parent.width - paintedWidth - | ||
| 80 | ((sortIndicatorVisible && | ||
| 81 | sortIndicatorColumn === styleData.column) ? | ||
| 82 | (titleSort.paintedWidth / 5 + tableView.headerSpacing) : 0)) / 2 : | ||
| 83 | hifi.dimensions.tablePadding | ||
| 84 | text: styleData.value | ||
| 85 | size: hifi.fontSizes.tableHeading | ||
| 86 | font.capitalization: Font.AllUppercase | ||
| 87 | color: hifi.colors.baseGrayHighlight | ||
| 88 | horizontalAlignment: (centerHeaderText ? Text.AlignHCenter : Text.AlignLeft) | ||
| 89 | anchors.verticalCenter: parent.verticalCenter | ||
| 90 | } | ||
| 91 | |||
| 92 | //actual image of sort indicator in glyph font only 20% of real font size | ||
| 93 | //i.e. if the charachter size set to 60 pixels, actual image is 12 pixels | ||
| 94 | HiFiGlyphs { | ||
| 95 | id: titleSort | ||
| 96 | text: sortIndicatorOrder == Qt.AscendingOrder ? hifi.glyphs.caratUp : hifi.glyphs.caratDn | ||
| 97 | color: hifi.colors.darkGray | ||
| 98 | opacity: 0.6; | ||
| 99 | size: hifi.fontSizes.tableHeadingIcon | ||
| 100 | anchors.verticalCenter: titleText.verticalCenter | ||
| 101 | anchors.left: titleText.right | ||
| 102 | anchors.leftMargin: -(hifi.fontSizes.tableHeadingIcon / 2.5) + tableView.headerSpacing | ||
| 103 | visible: sortIndicatorVisible && sortIndicatorColumn === styleData.column | ||
| 104 | onXChanged: { | ||
| 105 | titlePaintedPos[styleData.column] = titleText.x + titleText.paintedWidth + | ||
| 106 | paintedWidth / 5 + tableView.headerSpacing*2 | ||
| 107 | titlePaintedPosSignal(styleData.column) | ||
| 108 | } | ||
| 109 | } | ||
| 110 | |||
| 111 | Rectangle { | ||
| 112 | width: 1 | ||
| 113 | anchors { | ||
| 114 | left: parent.left | ||
| 115 | top: parent.top | ||
| 116 | topMargin: 1 | ||
| 117 | bottom: parent.bottom | ||
| 118 | bottomMargin: 2 | ||
| 119 | } | ||
| 120 | color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight | ||
| 121 | visible: styleData.column > 0 | ||
| 122 | } | ||
| 123 | |||
| 124 | Rectangle { | ||
| 125 | height: 1 | ||
| 126 | anchors { | ||
| 127 | left: parent.left | ||
| 128 | right: parent.right | ||
| 129 | bottom: parent.bottom | ||
| 130 | } | ||
| 131 | color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight | ||
| 132 | } | ||
| 133 | } | ||
| 134 | |||
| 135 | // Use rectangle to draw border with rounded corners. | ||
| 136 | frameVisible: false | ||
| 137 | Rectangle { | ||
| 138 | color: "#00000000" | ||
| 139 | anchors { fill: parent; margins: -2 } | ||
| 140 | border.color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight | ||
| 141 | border.width: 2 | ||
| 142 | } | ||
| 143 | anchors.margins: 2 // Shrink TableView to lie within border. | ||
| 144 | |||
| 145 | backgroundVisible: true | ||
| 146 | |||
| 147 | horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff | ||
| 148 | verticalScrollBarPolicy: Qt.ScrollBarAlwaysOff | ||
| 149 | |||
| 150 | style: TableViewStyle { | ||
| 151 | // Needed in order for rows to keep displaying rows after end of table entries. | ||
| 152 | backgroundColor: tableView.isLightColorScheme ? hifi.colors.tableBackgroundLight : hifi.colors.tableBackgroundDark | ||
| 153 | alternateBackgroundColor: tableView.isLightColorScheme ? hifi.colors.tableRowLightOdd : hifi.colors.tableRowDarkOdd | ||
| 154 | padding.top: headerVisible ? hifi.dimensions.tableHeaderHeight: 0 | ||
| 155 | } | ||
| 156 | |||
| 157 | rowDelegate: Rectangle { | ||
| 158 | height: (styleData.selected && expandSelectedRow ? 1.8 : 1) * hifi.dimensions.tableRowHeight | ||
| 159 | color: styleData.selected | ||
| 160 | ? hifi.colors.primaryHighlight | ||
| 161 | : tableView.isLightColorScheme | ||
| 162 | ? (styleData.alternate ? hifi.colors.tableRowLightEven : hifi.colors.tableRowLightOdd) | ||
| 163 | : (styleData.alternate ? hifi.colors.tableRowDarkEven : hifi.colors.tableRowDarkOdd) | ||
| 164 | } | ||
| 165 | } | 4 | } |
| @@ -1,138 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // ContentSection.qml | ||
| 3 | // | ||
| 4 | // Created by Dante Ruiz on 13 Feb 2017 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | TabletContentSection { |
| 12 | import QtGraphicalEffects 1.0 | ||
| 13 | |||
| 14 | import "../styles-uit" | ||
| 15 | |||
| 16 | Column { | ||
| 17 | property string name: "Content Section" | ||
| 18 | property bool isFirst: false | ||
| 19 | property bool isCollapsible: false // Set at creation. | ||
| 20 | property bool isCollapsed: false | ||
| 21 | |||
| 22 | spacing: 0 // Defer spacing decisions to individual controls. | ||
| 23 | |||
| 24 | anchors { | ||
| 25 | left: parent.left | ||
| 26 | leftMargin: hifi.dimensions.contentMargin.x | ||
| 27 | right: parent.right | ||
| 28 | rightMargin: hifi.dimensions.contentMargin.x | ||
| 29 | } | ||
| 30 | |||
| 31 | function toggleCollapsed() { | ||
| 32 | if (isCollapsible) { | ||
| 33 | isCollapsed = !isCollapsed; | ||
| 34 | for (var i = 1; i < children.length; i++) { | ||
| 35 | children[i].visible = !isCollapsed; | ||
| 36 | } | ||
| 37 | } | ||
| 38 | } | ||
| 39 | |||
| 40 | Item { | ||
| 41 | id: sectionName | ||
| 42 | anchors.left: parent.left | ||
| 43 | anchors.right: parent.right | ||
| 44 | height: leadingSpace.height + topBar.height + heading.height + bottomBar.height | ||
| 45 | |||
| 46 | Item { | ||
| 47 | id: leadingSpace | ||
| 48 | width: 1 | ||
| 49 | height: isFirst ? 7 : 0 | ||
| 50 | anchors.top: parent.top | ||
| 51 | } | ||
| 52 | |||
| 53 | Item { | ||
| 54 | id: topBar | ||
| 55 | visible: !isFirst | ||
| 56 | height: visible ? 2 : 0 | ||
| 57 | anchors.top: leadingSpace.bottom | ||
| 58 | |||
| 59 | Rectangle { | ||
| 60 | id: shadow | ||
| 61 | width: 480 | ||
| 62 | height: 1 | ||
| 63 | color: hifi.colors.baseGrayShadow | ||
| 64 | x: -hifi.dimensions.contentMargin.x | ||
| 65 | } | ||
| 66 | |||
| 67 | Rectangle { | ||
| 68 | width: 480 | ||
| 69 | height: 1 | ||
| 70 | color: hifi.colors.baseGrayHighlight | ||
| 71 | x: -hifi.dimensions.contentMargin.x | ||
| 72 | anchors.top: shadow.bottom | ||
| 73 | } | ||
| 74 | } | ||
| 75 | |||
| 76 | Item { | ||
| 77 | id: heading | ||
| 78 | anchors { | ||
| 79 | left: parent.left | ||
| 80 | right: parent.right | ||
| 81 | top: topBar.bottom | ||
| 82 | } | ||
| 83 | height: isCollapsible ? 36 : 28 | ||
| 84 | |||
| 85 | RalewayRegular { | ||
| 86 | id: title | ||
| 87 | anchors { | ||
| 88 | left: parent.left | ||
| 89 | top: parent.top | ||
| 90 | topMargin: 12 | ||
| 91 | } | ||
| 92 | size: hifi.fontSizes.sectionName | ||
| 93 | font.capitalization: Font.AllUppercase | ||
| 94 | text: name | ||
| 95 | color: hifi.colors.lightGrayText | ||
| 96 | } | ||
| 97 | |||
| 98 | HiFiGlyphs { | ||
| 99 | anchors { | ||
| 100 | top: title.top | ||
| 101 | topMargin: -9 | ||
| 102 | right: parent.right | ||
| 103 | rightMargin: -4 | ||
| 104 | } | ||
| 105 | size: hifi.fontSizes.disclosureButton | ||
| 106 | text: isCollapsed ? hifi.glyphs.disclosureButtonExpand : hifi.glyphs.disclosureButtonCollapse | ||
| 107 | color: hifi.colors.lightGrayText | ||
| 108 | visible: isCollapsible | ||
| 109 | } | ||
| 110 | |||
| 111 | MouseArea { | ||
| 112 | // Events are propogated so that any active control is defocused. | ||
| 113 | anchors.fill: parent | ||
| 114 | propagateComposedEvents: true | ||
| 115 | onPressed: { | ||
| 116 | toggleCollapsed(); | ||
| 117 | mouse.accepted = false; | ||
| 118 | } | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | LinearGradient { | ||
| 123 | id: bottomBar | ||
| 124 | visible: false | ||
| 125 | width: 480 | ||
| 126 | height: visible ? 4 : 0 | ||
| 127 | x: -hifi.dimensions.contentMargin.x | ||
| 128 | anchors.top: heading.bottom | ||
| 129 | start: Qt.point(0, 0) | ||
| 130 | end: Qt.point(0, 4) | ||
| 131 | gradient: Gradient { | ||
| 132 | GradientStop { position: 0.0; color: hifi.colors.darkGray } | ||
| 133 | GradientStop { position: 1.0; color: hifi.colors.baseGray } // Equivalent of darkGray0 over baseGray background. | ||
| 134 | } | ||
| 135 | cached: true | ||
| 136 | } | ||
| 137 | } | ||
| 138 | } | 4 | } |
| @@ -1,34 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // TabletHeader.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 11 Mar 2017. | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | TabletHeader { |
| 12 | |||
| 13 | import "../styles-uit" | ||
| 14 | |||
| 15 | Rectangle { | ||
| 16 | |||
| 17 | property string title: "" | ||
| 18 | |||
| 19 | HifiConstants { id: hifi } | ||
| 20 | |||
| 21 | height: hifi.dimensions.tabletMenuHeader | ||
| 22 | z: 100 | ||
| 23 | |||
| 24 | color: hifi.colors.darkGray | ||
| 25 | |||
| 26 | RalewayBold { | ||
| 27 | text: title | ||
| 28 | size: 26 | ||
| 29 | color: hifi.colors.white | ||
| 30 | anchors.verticalCenter: parent.verticalCenter | ||
| 31 | anchors.left: parent.left | ||
| 32 | anchors.leftMargin: hifi.dimensions.contentMargin.x | ||
| 33 | } | ||
| 34 | } | 4 | } |
| @@ -1,65 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // TextField.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 21 Apr 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | TextAction { |
| 12 | |||
| 13 | import "../styles-uit" | ||
| 14 | import "../controls-uit" as HifiControls | ||
| 15 | |||
| 16 | Item { | ||
| 17 | property string icon: "" | ||
| 18 | property int iconSize: 30 | ||
| 19 | property string text: "" | ||
| 20 | |||
| 21 | property int colorScheme: hifi.colorSchemes.light | ||
| 22 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 23 | |||
| 24 | signal clicked() | ||
| 25 | |||
| 26 | height: Math.max(glyph.visible ? glyph.height - 4 : 0, string.visible ? string.height : 0) | ||
| 27 | width: glyph.width + string.anchors.leftMargin + string.width | ||
| 28 | |||
| 29 | HiFiGlyphs { | ||
| 30 | id: glyph | ||
| 31 | anchors.left: parent.left | ||
| 32 | anchors.top: parent.top | ||
| 33 | anchors.topMargin: -2 | ||
| 34 | text: parent.icon | ||
| 35 | size: parent.iconSize | ||
| 36 | color: isLightColorScheme | ||
| 37 | ? (mouseArea.containsMouse ? hifi.colors.baseGrayHighlight : hifi.colors.lightGray) | ||
| 38 | : (mouseArea.containsMouse ? hifi.colors.faintGray : hifi.colors.lightGrayText) | ||
| 39 | visible: text !== "" | ||
| 40 | width: visible ? implicitWidth : 0 | ||
| 41 | } | ||
| 42 | |||
| 43 | RalewaySemiBold { | ||
| 44 | id: string | ||
| 45 | anchors { | ||
| 46 | left: glyph.visible ? glyph.right : parent.left | ||
| 47 | leftMargin: visible && glyph.visible ? hifi.dimensions.contentSpacing.x : 0 | ||
| 48 | verticalCenter: glyph.visible ? glyph.verticalCenter : undefined | ||
| 49 | } | ||
| 50 | text: parent.text | ||
| 51 | size: hifi.fontSizes.inputLabel | ||
| 52 | color: isLightColorScheme | ||
| 53 | ? (mouseArea.containsMouse ? hifi.colors.baseGrayHighlight : hifi.colors.lightGray) | ||
| 54 | : (mouseArea.containsMouse ? hifi.colors.faintGray : hifi.colors.lightGrayText) | ||
| 55 | font.underline: true; | ||
| 56 | visible: text !== "" | ||
| 57 | } | ||
| 58 | |||
| 59 | MouseArea { | ||
| 60 | id: mouseArea | ||
| 61 | anchors.fill: parent | ||
| 62 | hoverEnabled: true | ||
| 63 | onClicked: parent.clicked() | ||
| 64 | } | ||
| 65 | } | 4 | } |
| @@ -1,23 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // TextEdit.qml | ||
| 3 | // | ||
| 4 | // Created by Bradley Austin Davis on 24 Apr 2015 | ||
| 5 | // Copyright 2015 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import "../styles-uit" | ||
| 13 | 2 | ||
| 14 | TextEdit { | 3 | TextEdit { |
| 15 | |||
| 16 | property real size: 32 | ||
| 17 | |||
| 18 | font.family: "Raleway" | ||
| 19 | font.weight: Font.DemiBold | ||
| 20 | font.pointSize: size | ||
| 21 | verticalAlignment: Text.AlignVCenter | ||
| 22 | horizontalAlignment: Text.AlignLeft | ||
| 23 | } | 4 | } |
| @@ -1,180 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // TextField.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 17 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import QtQuick.Controls 1.4 | ||
| 13 | import QtQuick.Controls.Styles 1.4 | ||
| 14 | |||
| 15 | import "../styles-uit" | ||
| 16 | import "../controls-uit" as HifiControls | ||
| 17 | 2 | ||
| 18 | TextField { | 3 | TextField { |
| 19 | id: textField | ||
| 20 | |||
| 21 | property int colorScheme: hifi.colorSchemes.light | ||
| 22 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 23 | readonly property bool isFaintGrayColorScheme: colorScheme == hifi.colorSchemes.faintGray | ||
| 24 | property bool isSearchField: false | ||
| 25 | property string label: "" | ||
| 26 | property real controlHeight: height + (textFieldLabel.visible ? textFieldLabel.height + 1 : 0) | ||
| 27 | property bool hasDefocusedBorder: true; | ||
| 28 | property bool hasRoundedBorder: false | ||
| 29 | property int roundedBorderRadius: 4 | ||
| 30 | property bool error: false; | ||
| 31 | property bool hasClearButton: false; | ||
| 32 | property string leftPermanentGlyph: ""; | ||
| 33 | property string centerPlaceholderGlyph: ""; | ||
| 34 | |||
| 35 | placeholderText: textField.placeholderText | ||
| 36 | |||
| 37 | font.family: "Fira Sans" | ||
| 38 | font.pixelSize: hifi.fontSizes.textFieldInput | ||
| 39 | height: implicitHeight + 3 // Make surrounding box higher so that highlight is vertically centered. | ||
| 40 | property alias textFieldLabel: textFieldLabel | ||
| 41 | |||
| 42 | y: textFieldLabel.visible ? textFieldLabel.height + textFieldLabel.anchors.bottomMargin : 0 | ||
| 43 | |||
| 44 | // workaround for https://bugreports.qt.io/browse/QTBUG-49297 | ||
| 45 | Keys.onPressed: { | ||
| 46 | switch (event.key) { | ||
| 47 | case Qt.Key_Return: | ||
| 48 | case Qt.Key_Enter: | ||
| 49 | event.accepted = true; | ||
| 50 | |||
| 51 | // emit accepted signal manually | ||
| 52 | if (acceptableInput) { | ||
| 53 | accepted(); | ||
| 54 | } | ||
| 55 | } | ||
| 56 | } | ||
| 57 | |||
| 58 | style: TextFieldStyle { | ||
| 59 | id: style; | ||
| 60 | textColor: { | ||
| 61 | if (isLightColorScheme) { | ||
| 62 | if (textField.activeFocus) { | ||
| 63 | hifi.colors.black | ||
| 64 | } else { | ||
| 65 | hifi.colors.lightGray | ||
| 66 | } | ||
| 67 | } else if (isFaintGrayColorScheme) { | ||
| 68 | if (textField.activeFocus) { | ||
| 69 | hifi.colors.black | ||
| 70 | } else { | ||
| 71 | hifi.colors.lightGray | ||
| 72 | } | ||
| 73 | } else { | ||
| 74 | if (textField.activeFocus) { | ||
| 75 | hifi.colors.white | ||
| 76 | } else { | ||
| 77 | hifi.colors.lightGrayText | ||
| 78 | } | ||
| 79 | } | ||
| 80 | } | ||
| 81 | background: Rectangle { | ||
| 82 | color: { | ||
| 83 | if (isLightColorScheme) { | ||
| 84 | if (textField.activeFocus) { | ||
| 85 | hifi.colors.white | ||
| 86 | } else { | ||
| 87 | hifi.colors.textFieldLightBackground | ||
| 88 | } | ||
| 89 | } else if (isFaintGrayColorScheme) { | ||
| 90 | if (textField.activeFocus) { | ||
| 91 | hifi.colors.white | ||
| 92 | } else { | ||
| 93 | hifi.colors.faintGray50 | ||
| 94 | } | ||
| 95 | } else { | ||
| 96 | if (textField.activeFocus) { | ||
| 97 | hifi.colors.black | ||
| 98 | } else { | ||
| 99 | hifi.colors.baseGrayShadow | ||
| 100 | } | ||
| 101 | } | ||
| 102 | } | ||
| 103 | border.color: textField.error ? hifi.colors.redHighlight : | ||
| 104 | (textField.activeFocus ? hifi.colors.primaryHighlight : (hasDefocusedBorder ? (isFaintGrayColorScheme ? hifi.colors.lightGrayText : hifi.colors.lightGray) : color)) | ||
| 105 | border.width: textField.activeFocus || hasRoundedBorder || textField.error ? 1 : 0 | ||
| 106 | radius: isSearchField ? textField.height / 2 : (hasRoundedBorder ? roundedBorderRadius : 0) | ||
| 107 | |||
| 108 | HiFiGlyphs { | ||
| 109 | text: textField.leftPermanentGlyph; | ||
| 110 | color: textColor; | ||
| 111 | size: hifi.fontSizes.textFieldSearchIcon; | ||
| 112 | anchors.left: parent.left; | ||
| 113 | anchors.verticalCenter: parent.verticalCenter; | ||
| 114 | anchors.leftMargin: hifi.dimensions.textPadding - 2; | ||
| 115 | visible: text; | ||
| 116 | } | ||
| 117 | |||
| 118 | HiFiGlyphs { | ||
| 119 | text: textField.centerPlaceholderGlyph; | ||
| 120 | color: textColor; | ||
| 121 | size: parent.height; | ||
| 122 | anchors.horizontalCenter: parent.horizontalCenter; | ||
| 123 | anchors.verticalCenter: parent.verticalCenter; | ||
| 124 | visible: text && !textField.focus && textField.text === ""; | ||
| 125 | } | ||
| 126 | |||
| 127 | HiFiGlyphs { | ||
| 128 | text: hifi.glyphs.search | ||
| 129 | color: textColor | ||
| 130 | size: hifi.fontSizes.textFieldSearchIcon | ||
| 131 | anchors.left: parent.left | ||
| 132 | anchors.verticalCenter: parent.verticalCenter | ||
| 133 | anchors.leftMargin: hifi.dimensions.textPadding - 2 | ||
| 134 | visible: isSearchField | ||
| 135 | } | ||
| 136 | |||
| 137 | HiFiGlyphs { | ||
| 138 | text: hifi.glyphs.error | ||
| 139 | color: textColor | ||
| 140 | size: 40 | ||
| 141 | anchors.right: parent.right | ||
| 142 | anchors.rightMargin: hifi.dimensions.textPadding - 2 | ||
| 143 | anchors.verticalCenter: parent.verticalCenter | ||
| 144 | visible: hasClearButton && textField.text !== ""; | ||
| 145 | |||
| 146 | MouseArea { | ||
| 147 | anchors.fill: parent; | ||
| 148 | onClicked: { | ||
| 149 | textField.text = ""; | ||
| 150 | } | ||
| 151 | } | ||
| 152 | } | ||
| 153 | } | ||
| 154 | placeholderTextColor: isFaintGrayColorScheme ? hifi.colors.lightGrayText : hifi.colors.lightGray | ||
| 155 | selectedTextColor: hifi.colors.black | ||
| 156 | selectionColor: hifi.colors.primaryHighlight | ||
| 157 | padding.left: hasRoundedBorder ? textField.height / 2 : ((isSearchField || textField.leftPermanentGlyph !== "") ? textField.height - 2 : 0) + hifi.dimensions.textPadding | ||
| 158 | padding.right: (hasClearButton ? textField.height - 2 : 0) + hifi.dimensions.textPadding | ||
| 159 | } | ||
| 160 | |||
| 161 | HifiControls.Label { | ||
| 162 | id: textFieldLabel | ||
| 163 | text: textField.label | ||
| 164 | colorScheme: textField.colorScheme | ||
| 165 | anchors.left: parent.left | ||
| 166 | |||
| 167 | Binding on anchors.right { | ||
| 168 | when: textField.right | ||
| 169 | value: textField.right | ||
| 170 | } | ||
| 171 | Binding on wrapMode { | ||
| 172 | when: textField.right | ||
| 173 | value: Text.WordWrap | ||
| 174 | } | ||
| 175 | |||
| 176 | anchors.bottom: parent.top | ||
| 177 | anchors.bottomMargin: 3 | ||
| 178 | visible: label != "" | ||
| 179 | } | ||
| 180 | } | 4 | } |
| @@ -1,51 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // ToolTip.qml | ||
| 3 | // | ||
| 4 | // Created by Clement on 9/12/17 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | ToolTip { |
| 12 | 4 | } | |
| 13 | Item { | ||
| 14 | property string toolTip | ||
| 15 | property bool showToolTip: false | ||
| 16 | |||
| 17 | Rectangle { | ||
| 18 | id: toolTipRectangle | ||
| 19 | anchors.right: parent.right | ||
| 20 | |||
| 21 | width: toolTipText.width + 4 | ||
| 22 | height: toolTipText.height + 4 | ||
| 23 | opacity: (toolTip != "" && showToolTip) ? 1 : 0 | ||
| 24 | color: "#ffffaa" | ||
| 25 | border.color: "#0a0a0a" | ||
| 26 | Text { | ||
| 27 | id: toolTipText | ||
| 28 | text: toolTip | ||
| 29 | color: "black" | ||
| 30 | anchors.centerIn: parent | ||
| 31 | } | ||
| 32 | Behavior on opacity { | ||
| 33 | PropertyAnimation { | ||
| 34 | easing.type: Easing.InOutQuad | ||
| 35 | duration: 250 | ||
| 36 | } | ||
| 37 | } | ||
| 38 | } | ||
| 39 | MouseArea { | ||
| 40 | id: mouseArea | ||
| 41 | anchors.fill: parent | ||
| 42 | onEntered: showTimer.start() | ||
| 43 | onExited: { showToolTip = false; showTimer.stop(); } | ||
| 44 | hoverEnabled: true | ||
| 45 | } | ||
| 46 | Timer { | ||
| 47 | id: showTimer | ||
| 48 | interval: 250 | ||
| 49 | onTriggered: { showToolTip = true; } | ||
| 50 | } | ||
| 51 | } | ||
| @@ -1,205 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // Tree.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 17 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQml.Models 2.2 | 3 | Tree { |
| 12 | import QtQuick 2.7 | ||
| 13 | import QtQuick.Controls 1.4 | ||
| 14 | import QtQuick.Controls.Styles 1.4 | ||
| 15 | import QtQuick.Controls 2.2 as QQC2 | ||
| 16 | |||
| 17 | |||
| 18 | import "../styles-uit" | ||
| 19 | |||
| 20 | TreeView { | ||
| 21 | id: treeView | ||
| 22 | |||
| 23 | property var treeModel: ListModel { } | ||
| 24 | property bool centerHeaderText: false | ||
| 25 | property int colorScheme: hifi.colorSchemes.light | ||
| 26 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 27 | |||
| 28 | property var modifyEl: function(index, data) { return false; } | ||
| 29 | |||
| 30 | model: treeModel | ||
| 31 | selection: ItemSelectionModel { | ||
| 32 | id: selectionModel | ||
| 33 | model: treeModel | ||
| 34 | } | ||
| 35 | |||
| 36 | anchors { left: parent.left; right: parent.right } | ||
| 37 | |||
| 38 | headerVisible: false | ||
| 39 | |||
| 40 | Component.onCompleted: { | ||
| 41 | if (flickableItem !== null && flickableItem !== undefined) { | ||
| 42 | treeView.flickableItem.QQC2.ScrollBar.vertical = scrollbar | ||
| 43 | } | ||
| 44 | } | ||
| 45 | |||
| 46 | QQC2.ScrollBar { | ||
| 47 | id: scrollbar | ||
| 48 | parent: treeView.flickableItem | ||
| 49 | policy: QQC2.ScrollBar.AsNeeded | ||
| 50 | orientation: Qt.Vertical | ||
| 51 | visible: size < 1.0 | ||
| 52 | topPadding: treeView.headerVisible ? hifi.dimensions.tableHeaderHeight + 1 : 1 | ||
| 53 | anchors.top: treeView.top | ||
| 54 | anchors.left: treeView.right | ||
| 55 | anchors.bottom: treeView.bottom | ||
| 56 | |||
| 57 | background: Item { | ||
| 58 | implicitWidth: hifi.dimensions.scrollbarBackgroundWidth | ||
| 59 | Rectangle { | ||
| 60 | anchors { | ||
| 61 | fill: parent; | ||
| 62 | topMargin: treeView.headerVisible ? hifi.dimensions.tableHeaderHeight: 0 | ||
| 63 | } | ||
| 64 | color: isLightColorScheme ? hifi.colors.tableScrollBackgroundLight | ||
| 65 | : hifi.colors.tableScrollBackgroundDark | ||
| 66 | } | ||
| 67 | } | ||
| 68 | |||
| 69 | contentItem: Item { | ||
| 70 | implicitWidth: hifi.dimensions.scrollbarHandleWidth | ||
| 71 | Rectangle { | ||
| 72 | anchors.fill: parent | ||
| 73 | radius: (width - 4)/2 | ||
| 74 | color: isLightColorScheme ? hifi.colors.tableScrollHandleLight : hifi.colors.tableScrollHandleDark | ||
| 75 | } | ||
| 76 | } | ||
| 77 | } | ||
| 78 | |||
| 79 | // Use rectangle to draw border with rounded corners. | ||
| 80 | frameVisible: false | ||
| 81 | Rectangle { | ||
| 82 | color: "#00000000" | ||
| 83 | anchors.fill: parent | ||
| 84 | radius: hifi.dimensions.borderRadius | ||
| 85 | border.color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight | ||
| 86 | border.width: 2 | ||
| 87 | anchors.margins: -2 | ||
| 88 | } | ||
| 89 | anchors.margins: 2 // Shrink TreeView to lie within border. | ||
| 90 | |||
| 91 | backgroundVisible: true | ||
| 92 | |||
| 93 | horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff | ||
| 94 | verticalScrollBarPolicy: Qt.ScrollBarAlwaysOff | ||
| 95 | |||
| 96 | style: TreeViewStyle { | ||
| 97 | // Needed in order for rows to keep displaying rows after end of table entries. | ||
| 98 | backgroundColor: parent.isLightColorScheme ? hifi.colors.tableRowLightEven : hifi.colors.tableRowDarkEven | ||
| 99 | alternateBackgroundColor: parent.isLightColorScheme ? hifi.colors.tableRowLightOdd : hifi.colors.tableRowDarkOdd | ||
| 100 | |||
| 101 | headerDelegate: Rectangle { | ||
| 102 | height: hifi.dimensions.tableHeaderHeight | ||
| 103 | color: isLightColorScheme ? hifi.colors.tableBackgroundLight : hifi.colors.tableBackgroundDark | ||
| 104 | |||
| 105 | RalewayRegular { | ||
| 106 | id: titleText | ||
| 107 | text: styleData.value | ||
| 108 | size: hifi.fontSizes.tableHeading | ||
| 109 | font.capitalization: Font.AllUppercase | ||
| 110 | color: hifi.colors.baseGrayHighlight | ||
| 111 | horizontalAlignment: (centerHeaderText ? Text.AlignHCenter : Text.AlignLeft) | ||
| 112 | elide: Text.ElideRight | ||
| 113 | anchors { | ||
| 114 | left: parent.left | ||
| 115 | leftMargin: hifi.dimensions.tablePadding | ||
| 116 | right: sortIndicatorVisible && sortIndicatorColumn === styleData.column ? titleSort.left : parent.right | ||
| 117 | rightMargin: hifi.dimensions.tablePadding | ||
| 118 | verticalCenter: parent.verticalCenter | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | HiFiGlyphs { | ||
| 123 | id: titleSort | ||
| 124 | text: sortIndicatorOrder == Qt.AscendingOrder ? hifi.glyphs.caratUp : hifi.glyphs.caratDn | ||
| 125 | color: isLightColorScheme ? hifi.colors.darkGray : hifi.colors.baseGrayHighlight | ||
| 126 | opacity: 0.6; | ||
| 127 | size: hifi.fontSizes.tableHeadingIcon | ||
| 128 | anchors { | ||
| 129 | right: parent.right | ||
| 130 | verticalCenter: titleText.verticalCenter | ||
| 131 | } | ||
| 132 | visible: sortIndicatorVisible && sortIndicatorColumn === styleData.column | ||
| 133 | } | ||
| 134 | |||
| 135 | Rectangle { | ||
| 136 | width: 1 | ||
| 137 | anchors { | ||
| 138 | left: parent.left | ||
| 139 | top: parent.top | ||
| 140 | topMargin: 1 | ||
| 141 | bottom: parent.bottom | ||
| 142 | bottomMargin: 2 | ||
| 143 | } | ||
| 144 | color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight | ||
| 145 | visible: styleData.column > 0 | ||
| 146 | } | ||
| 147 | |||
| 148 | Rectangle { | ||
| 149 | height: 1 | ||
| 150 | anchors { | ||
| 151 | left: parent.left | ||
| 152 | right: parent.right | ||
| 153 | bottom: parent.bottom | ||
| 154 | } | ||
| 155 | color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight | ||
| 156 | } | ||
| 157 | } | ||
| 158 | |||
| 159 | branchDelegate: HiFiGlyphs { | ||
| 160 | text: styleData.isExpanded ? hifi.glyphs.caratDn : hifi.glyphs.caratR | ||
| 161 | size: hifi.fontSizes.carat | ||
| 162 | color: colorScheme == hifi.colorSchemes.light | ||
| 163 | ? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight) | ||
| 164 | : (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText) | ||
| 165 | anchors { | ||
| 166 | left: parent ? parent.left : undefined | ||
| 167 | leftMargin: hifi.dimensions.tablePadding / 2 | ||
| 168 | } | ||
| 169 | } | ||
| 170 | } | ||
| 171 | |||
| 172 | rowDelegate: Rectangle { | ||
| 173 | height: hifi.dimensions.tableRowHeight | ||
| 174 | color: styleData.selected | ||
| 175 | ? hifi.colors.primaryHighlight | ||
| 176 | : treeView.isLightColorScheme | ||
| 177 | ? (styleData.alternate ? hifi.colors.tableRowLightEven : hifi.colors.tableRowLightOdd) | ||
| 178 | : (styleData.alternate ? hifi.colors.tableRowDarkEven : hifi.colors.tableRowDarkOdd) | ||
| 179 | } | ||
| 180 | |||
| 181 | itemDelegate: FiraSansSemiBold { | ||
| 182 | anchors { | ||
| 183 | left: parent ? parent.left : undefined | ||
| 184 | leftMargin: (2 + styleData.depth) * hifi.dimensions.tablePadding | ||
| 185 | right: parent ? parent.right : undefined | ||
| 186 | rightMargin: hifi.dimensions.tablePadding | ||
| 187 | verticalCenter: parent ? parent.verticalCenter : undefined | ||
| 188 | } | ||
| 189 | |||
| 190 | text: styleData.value | ||
| 191 | size: hifi.fontSizes.tableText | ||
| 192 | color: colorScheme == hifi.colorSchemes.light | ||
| 193 | ? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight) | ||
| 194 | : (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText) | ||
| 195 | |||
| 196 | elide: Text.ElideRight | ||
| 197 | } | ||
| 198 | |||
| 199 | Item { | ||
| 200 | id: unfocusHelper | ||
| 201 | visible: false | ||
| 202 | } | ||
| 203 | |||
| 204 | onDoubleClicked: isExpanded(index) ? collapse(index) : expand(index) | ||
| 205 | } | 4 | } |
| @@ -1,21 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // VerticalSpacer.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 16 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | VerticalSpacer { |
| 12 | |||
| 13 | import "../styles-uit" | ||
| 14 | |||
| 15 | Item { | ||
| 16 | id: root | ||
| 17 | property alias size: root.height | ||
| 18 | |||
| 19 | width: 1 // Must be non-zero | ||
| 20 | height: hifi.dimensions.controlInterlineHeight | ||
| 21 | } | 4 | } |
| @@ -1,40 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // GlyphButton.qml | ||
| 3 | // | ||
| 4 | // Created by Vlad Stelmahovsky on 2017-06-21 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | WebGlyphButton { |
| 12 | import QtQuick.Controls 2.2 as Original | ||
| 13 | |||
| 14 | import "../styles-uit" | ||
| 15 | |||
| 16 | Original.Button { | ||
| 17 | id: control | ||
| 18 | |||
| 19 | property int colorScheme: hifi.colorSchemes.light | ||
| 20 | property string glyph: "" | ||
| 21 | property int size: 32 | ||
| 22 | //colors | ||
| 23 | readonly property color normalColor: "#AFAFAF" | ||
| 24 | readonly property color hoverColor: "#00B4EF" | ||
| 25 | readonly property color clickedColor: "#FFFFFF" | ||
| 26 | readonly property color disabledColor: "#575757" | ||
| 27 | |||
| 28 | background: Item {} | ||
| 29 | |||
| 30 | contentItem: HiFiGlyphs { | ||
| 31 | color: control.enabled ? (control.pressed ? control.clickedColor : | ||
| 32 | (control.hovered ? control.hoverColor : control.normalColor)) : | ||
| 33 | control.disabledColor | ||
| 34 | verticalAlignment: Text.AlignVCenter | ||
| 35 | horizontalAlignment: Text.AlignHCenter | ||
| 36 | text: control.glyph | ||
| 37 | size: control.size | ||
| 38 | } | ||
| 39 | } | 4 | } |
| 40 | |||
| @@ -1,24 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // WebSpinner.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 23 May 2017 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | WebSpinner { |
| 12 | import QtWebEngine 1.5 | ||
| 13 | |||
| 14 | AnimatedImage { | ||
| 15 | property WebEngineView webview: parent | ||
| 16 | source: "../../icons/loader-snake-64-w.gif" | ||
| 17 | visible: webview.loading && /^(http.*|)$/i.test(webview.url.toString()) | ||
| 18 | playing: visible | ||
| 19 | z: 10000 | ||
| 20 | anchors { | ||
| 21 | horizontalCenter: parent.horizontalCenter | ||
| 22 | verticalCenter: parent.verticalCenter | ||
| 23 | } | ||
| 24 | } | 4 | } |
| @@ -1,21 +1,4 @@ | |||
| 1 | // | 1 | import controlsUit 1.0 |
| 2 | // WebView.qml | ||
| 3 | // | ||
| 4 | // Created by Bradley Austin Davis on 12 Jan 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | 2 | ||
| 11 | import QtQuick 2.5 | 3 | WebView { |
| 12 | import "." | ||
| 13 | |||
| 14 | BaseWebView { | ||
| 15 | onNewViewRequested: { | ||
| 16 | // Load dialog via OffscreenUi so that JavaScript EventBridge is available. | ||
| 17 | var browser = OffscreenUi.load("Browser.qml"); | ||
| 18 | request.openIn(browser.webView); | ||
| 19 | browser.webView.forceActiveFocus(); | ||
| 20 | } | ||
| 21 | } | 4 | } |
| @@ -0,0 +1 @@ | |||
| 1 | this folder exists purely for compatibility reasons and might be deleted in future! please consider using 'import controlsUit 1.0' instead of including this folder | ||
| @@ -3,7 +3,6 @@ import QtQuick.Controls 2.2 as Original · 2 unmodified lines | |||
| 3 | 3 | ||
| 4 | import "." | 4 | import "." |
| 5 | import "../styles" | 5 | import "../styles" |
| 6 | import "../controls-uit" | ||
| 7 | 6 | ||
| 8 | Original.Button { | 7 | Original.Button { |
| 9 | id: control | 8 | id: control |
| @@ -4,7 +4,7 @@ import QtWebChannel 1.0 · 3 unmodified lines | |||
| 4 | 4 | ||
| 5 | import QtQuick.Controls 2.2 | 5 | import QtQuick.Controls 2.2 |
| 6 | 6 | ||
| 7 | import "../styles-uit" as StylesUIt | 7 | import stylesUit 1.0 as StylesUIt |
| 8 | 8 | ||
| 9 | Item { | 9 | Item { |
| 10 | id: flick | 10 | id: flick |
| @@ -10,7 +10,7 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import Hifi 1.0 | 11 | import Hifi 1.0 |
| 12 | import QtQuick 2.4 | 12 | import QtQuick 2.4 |
| 13 | import "../styles-uit" | 13 | import stylesUit 1.0 |
| 14 | 14 | ||
| 15 | Rectangle { | 15 | Rectangle { |
| 16 | property alias text: label.text | 16 | property alias text: label.text |
| @@ -1,5 +1,5 @@ | |||
| 1 | import QtQuick 2.7 | 1 | import QtQuick 2.7 |
| 2 | import "../controls-uit" as HiFiControls | 2 | import controlsUit 1.0 as HiFiControls |
| 3 | 3 | ||
| 4 | Item { | 4 | Item { |
| 5 | id: root | 5 | id: root |
| @@ -1,8 +1,8 @@ | |||
| 1 | import QtQuick 2.7 | 1 | import QtQuick 2.7 |
| 2 | import QtWebEngine 1.5 | 2 | import QtWebEngine 1.5 |
| 3 | import "../controls-uit" as HiFiControls | 3 | import controlsUit 1.0 as HiFiControls |
| 4 | import "../styles" as HifiStyles | 4 | import "../styles" as HifiStyles |
| 5 | import "../styles-uit" | 5 | import stylesUit 1.0 |
| 6 | 6 | ||
| 7 | Item { | 7 | Item { |
| 8 | id: root | 8 | id: root |
| @@ -195,6 +195,10 @@ Item { · 186 unmodified lines | |||
| 195 | keyboardEnabled = HMD.active; | 195 | keyboardEnabled = HMD.active; |
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | Component.onDestruction: { | ||
| 199 | keyboardRaised = false; | ||
| 200 | } | ||
| 201 | |||
| 198 | Keys.onPressed: { | 202 | Keys.onPressed: { |
| 199 | switch(event.key) { | 203 | switch(event.key) { |
| 200 | case Qt.Key_L: | 204 | case Qt.Key_L: |
| @@ -1,5 +1,5 @@ | |||
| 1 | import QtQuick 2.7 | 1 | import QtQuick 2.7 |
| 2 | import "../controls-uit" as HiFiControls | 2 | import controlsUit 1.0 as HiFiControls |
| 3 | 3 | ||
| 4 | Item { | 4 | Item { |
| 5 | width: parent !== null ? parent.width : undefined | 5 | width: parent !== null ? parent.width : undefined |
| @@ -1,6 +1,6 @@ | |||
| 1 | // | 1 | // |
| 2 | // ImageButton.qml | 2 | // ImageButton.qml |
| 3 | // interface/resources/qml/controls-uit | 3 | // interface/resources/qml/controlsUit |
| 4 | // | 4 | // |
| 5 | // Created by Gabriel Calero & Cristian Duarte on 12 Oct 2017 | 5 | // Created by Gabriel Calero & Cristian Duarte on 12 Oct 2017 |
| 6 | // Copyright 2017 High Fidelity, Inc. | 6 | // Copyright 2017 High Fidelity, Inc. |
| @@ -11,7 +11,7 @@ · 4 unmodified lines | |||
| 11 | 11 | ||
| 12 | import QtQuick 2.5 | 12 | import QtQuick 2.5 |
| 13 | import QtQuick.Layouts 1.3 | 13 | import QtQuick.Layouts 1.3 |
| 14 | import "../styles-uit" as HifiStyles | 14 | import "../stylesUit" as HifiStyles |
| 15 | 15 | ||
| 16 | Item { | 16 | Item { |
| 17 | id: button | 17 | id: button |
| @@ -79,4 +79,4 @@ Item { · 61 unmodified lines | |||
| 79 | } | 79 | } |
| 80 | } | 80 | } |
| 81 | ] | 81 | ] |
| 82 | } | 82 | } |
| @@ -0,0 +1,170 @@ | |||
| 1 | // | ||
| 2 | // AttachmentsTable.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 18 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import QtQuick.Controls 1.4 | ||
| 13 | import QtQuick.Controls.Styles 1.4 | ||
| 14 | import QtQuick.XmlListModel 2.0 | ||
| 15 | |||
| 16 | import "../stylesUit" | ||
| 17 | import "." as HifiControls | ||
| 18 | import "../windows" | ||
| 19 | import "../hifi/models" | ||
| 20 | |||
| 21 | TableView { | ||
| 22 | id: tableView | ||
| 23 | |||
| 24 | property int colorScheme: hifi.colorSchemes.light | ||
| 25 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 26 | |||
| 27 | model: S3Model{} | ||
| 28 | |||
| 29 | Rectangle { | ||
| 30 | anchors.fill: parent | ||
| 31 | visible: tableView.model.status !== XmlListModel.Ready | ||
| 32 | color: hifi.colors.darkGray0 | ||
| 33 | BusyIndicator { | ||
| 34 | anchors.centerIn: parent | ||
| 35 | width: 48; height: 48 | ||
| 36 | running: true | ||
| 37 | } | ||
| 38 | } | ||
| 39 | |||
| 40 | headerDelegate: Rectangle { | ||
| 41 | height: hifi.dimensions.tableHeaderHeight | ||
| 42 | color: hifi.colors.darkGray | ||
| 43 | border.width: 0.5 | ||
| 44 | border.color: hifi.colors.baseGrayHighlight | ||
| 45 | |||
| 46 | RalewayRegular { | ||
| 47 | id: textHeader | ||
| 48 | size: hifi.fontSizes.tableHeading | ||
| 49 | color: hifi.colors.lightGrayText | ||
| 50 | text: styleData.value | ||
| 51 | anchors { | ||
| 52 | horizontalCenter: parent.horizontalCenter | ||
| 53 | verticalCenter: parent.verticalCenter | ||
| 54 | } | ||
| 55 | } | ||
| 56 | } | ||
| 57 | |||
| 58 | // Use rectangle to draw border with rounded corners. | ||
| 59 | Rectangle { | ||
| 60 | color: "#00000000" | ||
| 61 | anchors { fill: parent; margins: -2 } | ||
| 62 | radius: hifi.dimensions.borderRadius | ||
| 63 | border.color: hifi.colors.baseGrayHighlight | ||
| 64 | border.width: 3 | ||
| 65 | } | ||
| 66 | anchors.margins: 2 // Shrink TableView to lie within border. | ||
| 67 | backgroundVisible: true | ||
| 68 | |||
| 69 | horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff | ||
| 70 | verticalScrollBarPolicy: Qt.ScrollBarAsNeeded | ||
| 71 | |||
| 72 | style: TableViewStyle { | ||
| 73 | // Needed in order for rows to keep displaying rows after end of table entries. | ||
| 74 | backgroundColor: parent.isLightColorScheme ? hifi.colors.tableRowLightEven : hifi.colors.tableRowDarkEven | ||
| 75 | alternateBackgroundColor: parent.isLightColorScheme ? hifi.colors.tableRowLightOdd : hifi.colors.tableRowDarkOdd | ||
| 76 | |||
| 77 | handle: Item { | ||
| 78 | id: scrollbarHandle | ||
| 79 | implicitWidth: 6 | ||
| 80 | Rectangle { | ||
| 81 | anchors { | ||
| 82 | fill: parent | ||
| 83 | leftMargin: 2 // Move it right | ||
| 84 | rightMargin: -2 // "" | ||
| 85 | topMargin: 3 // Shrink vertically | ||
| 86 | bottomMargin: 3 // "" | ||
| 87 | } | ||
| 88 | radius: 3 | ||
| 89 | color: hifi.colors.tableScrollHandleDark | ||
| 90 | } | ||
| 91 | } | ||
| 92 | |||
| 93 | scrollBarBackground: Item { | ||
| 94 | implicitWidth: 10 | ||
| 95 | Rectangle { | ||
| 96 | anchors { | ||
| 97 | fill: parent | ||
| 98 | margins: -1 // Expand | ||
| 99 | } | ||
| 100 | color: hifi.colors.baseGrayHighlight | ||
| 101 | } | ||
| 102 | |||
| 103 | Rectangle { | ||
| 104 | anchors { | ||
| 105 | fill: parent | ||
| 106 | margins: 1 // Shrink | ||
| 107 | } | ||
| 108 | radius: 4 | ||
| 109 | color: hifi.colors.tableScrollBackgroundDark | ||
| 110 | } | ||
| 111 | } | ||
| 112 | |||
| 113 | incrementControl: Item { | ||
| 114 | visible: false | ||
| 115 | } | ||
| 116 | |||
| 117 | decrementControl: Item { | ||
| 118 | visible: false | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | rowDelegate: Rectangle { | ||
| 123 | height: hifi.dimensions.tableRowHeight | ||
| 124 | color: styleData.selected | ||
| 125 | ? hifi.colors.primaryHighlight | ||
| 126 | : tableView.isLightColorScheme | ||
| 127 | ? (styleData.alternate ? hifi.colors.tableRowLightEven : hifi.colors.tableRowLightOdd) | ||
| 128 | : (styleData.alternate ? hifi.colors.tableRowDarkEven : hifi.colors.tableRowDarkOdd) | ||
| 129 | } | ||
| 130 | |||
| 131 | itemDelegate: Item { | ||
| 132 | anchors { | ||
| 133 | left: parent ? parent.left : undefined | ||
| 134 | leftMargin: hifi.dimensions.tablePadding | ||
| 135 | right: parent ? parent.right : undefined | ||
| 136 | rightMargin: hifi.dimensions.tablePadding | ||
| 137 | } | ||
| 138 | FiraSansSemiBold { | ||
| 139 | id: textItem | ||
| 140 | text: styleData.value | ||
| 141 | size: hifi.fontSizes.tableText | ||
| 142 | color: colorScheme == hifi.colorSchemes.light | ||
| 143 | ? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight) | ||
| 144 | : (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText) | ||
| 145 | anchors { | ||
| 146 | horizontalCenter: parent.horizontalCenter | ||
| 147 | verticalCenter: parent.verticalCenter | ||
| 148 | } | ||
| 149 | } | ||
| 150 | } | ||
| 151 | |||
| 152 | TableViewColumn { | ||
| 153 | role: "name" | ||
| 154 | title: "NAME" | ||
| 155 | width: parent.width *0.3 | ||
| 156 | horizontalAlignment: Text.AlignHCenter | ||
| 157 | } | ||
| 158 | TableViewColumn { | ||
| 159 | role: "size" | ||
| 160 | title: "SIZE" | ||
| 161 | width: parent.width *0.2 | ||
| 162 | horizontalAlignment: Text.AlignHCenter | ||
| 163 | } | ||
| 164 | TableViewColumn { | ||
| 165 | role: "modified" | ||
| 166 | title: "LAST MODIFIED" | ||
| 167 | width: parent.width *0.5 | ||
| 168 | horizontalAlignment: Text.AlignHCenter | ||
| 169 | } | ||
| 170 | } | ||
| @@ -0,0 +1,38 @@ | |||
| 1 | // | ||
| 2 | // WebView.qml | ||
| 3 | // | ||
| 4 | // Created by Bradley Austin Davis on 12 Jan 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | import QtWebEngine 1.5 | ||
| 13 | |||
| 14 | WebEngineView { | ||
| 15 | id: root | ||
| 16 | |||
| 17 | Component.onCompleted: { | ||
| 18 | console.log("Connecting JS messaging to Hifi Logging") | ||
| 19 | // Ensure the JS from the web-engine makes it to our logging | ||
| 20 | root.javaScriptConsoleMessage.connect(function(level, message, lineNumber, sourceID) { | ||
| 21 | console.log("Web Window JS message: " + sourceID + " " + lineNumber + " " + message); | ||
| 22 | }); | ||
| 23 | } | ||
| 24 | |||
| 25 | onLoadingChanged: { | ||
| 26 | // Required to support clicking on "hifi://" links | ||
| 27 | if (WebEngineView.LoadStartedStatus == loadRequest.status) { | ||
| 28 | var url = loadRequest.url.toString(); | ||
| 29 | if (urlHandler.canHandleUrl(url)) { | ||
| 30 | if (urlHandler.handleUrl(url)) { | ||
| 31 | root.stop(); | ||
| 32 | } | ||
| 33 | } | ||
| 34 | } | ||
| 35 | } | ||
| 36 | |||
| 37 | WebSpinner { } | ||
| 38 | } | ||
| @@ -0,0 +1,122 @@ | |||
| 1 | // | ||
| 2 | // Button.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 16 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | import QtQuick.Controls 2.3 as Original | ||
| 13 | import TabletScriptingInterface 1.0 | ||
| 14 | |||
| 15 | import "../stylesUit" | ||
| 16 | |||
| 17 | Original.Button { | ||
| 18 | id: control; | ||
| 19 | |||
| 20 | property int color: 0 | ||
| 21 | property int colorScheme: hifi.colorSchemes.light | ||
| 22 | property int fontSize: hifi.fontSizes.buttonLabel | ||
| 23 | property int radius: hifi.buttons.radius | ||
| 24 | property alias implicitTextWidth: buttonText.implicitWidth | ||
| 25 | property string buttonGlyph: ""; | ||
| 26 | property int fontCapitalization: Font.AllUppercase | ||
| 27 | |||
| 28 | width: hifi.dimensions.buttonWidth | ||
| 29 | height: hifi.dimensions.controlLineHeight | ||
| 30 | |||
| 31 | HifiConstants { id: hifi } | ||
| 32 | |||
| 33 | onHoveredChanged: { | ||
| 34 | if (hovered) { | ||
| 35 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 36 | } | ||
| 37 | } | ||
| 38 | |||
| 39 | onFocusChanged: { | ||
| 40 | if (focus) { | ||
| 41 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 42 | } | ||
| 43 | } | ||
| 44 | |||
| 45 | onClicked: { | ||
| 46 | Tablet.playSound(TabletEnums.ButtonClick); | ||
| 47 | } | ||
| 48 | |||
| 49 | background: Rectangle { | ||
| 50 | radius: control.radius | ||
| 51 | |||
| 52 | border.width: (control.color === hifi.buttons.none || | ||
| 53 | (control.color === hifi.buttons.noneBorderless && control.hovered) || | ||
| 54 | (control.color === hifi.buttons.noneBorderlessWhite && control.hovered) || | ||
| 55 | (control.color === hifi.buttons.noneBorderlessGray && control.hovered)) ? 1 : 0; | ||
| 56 | border.color: control.color === hifi.buttons.noneBorderless ? hifi.colors.blueHighlight : | ||
| 57 | (control.color === hifi.buttons.noneBorderlessGray ? hifi.colors.baseGray : hifi.colors.white); | ||
| 58 | |||
| 59 | gradient: Gradient { | ||
| 60 | GradientStop { | ||
| 61 | position: 0.2 | ||
| 62 | color: { | ||
| 63 | if (!control.enabled) { | ||
| 64 | hifi.buttons.disabledColorStart[control.colorScheme] | ||
| 65 | } else if (control.pressed) { | ||
| 66 | hifi.buttons.pressedColor[control.color] | ||
| 67 | } else if (control.hovered) { | ||
| 68 | hifi.buttons.hoveredColor[control.color] | ||
| 69 | } else { | ||
| 70 | hifi.buttons.colorStart[control.color] | ||
| 71 | } | ||
| 72 | } | ||
| 73 | } | ||
| 74 | GradientStop { | ||
| 75 | position: 1.0 | ||
| 76 | color: { | ||
| 77 | if (!control.enabled) { | ||
| 78 | hifi.buttons.disabledColorFinish[control.colorScheme] | ||
| 79 | } else if (control.pressed) { | ||
| 80 | hifi.buttons.pressedColor[control.color] | ||
| 81 | } else if (control.hovered) { | ||
| 82 | hifi.buttons.hoveredColor[control.color] | ||
| 83 | } else { | ||
| 84 | hifi.buttons.colorFinish[control.color] | ||
| 85 | } | ||
| 86 | } | ||
| 87 | } | ||
| 88 | } | ||
| 89 | } | ||
| 90 | |||
| 91 | contentItem: Item { | ||
| 92 | HiFiGlyphs { | ||
| 93 | id: buttonGlyph; | ||
| 94 | visible: control.buttonGlyph !== ""; | ||
| 95 | text: control.buttonGlyph === "" ? hifi.glyphs.question : control.buttonGlyph; | ||
| 96 | // Size | ||
| 97 | size: 34; | ||
| 98 | // Anchors | ||
| 99 | anchors.right: buttonText.left; | ||
| 100 | anchors.top: parent.top; | ||
| 101 | anchors.bottom: parent.bottom; | ||
| 102 | // Style | ||
| 103 | color: enabled ? hifi.buttons.textColor[control.color] | ||
| 104 | : hifi.buttons.disabledTextColor[control.colorScheme]; | ||
| 105 | // Alignment | ||
| 106 | horizontalAlignment: Text.AlignHCenter; | ||
| 107 | verticalAlignment: Text.AlignVCenter; | ||
| 108 | } | ||
| 109 | RalewayBold { | ||
| 110 | id: buttonText; | ||
| 111 | anchors.centerIn: parent; | ||
| 112 | font.capitalization: control.fontCapitalization | ||
| 113 | color: enabled ? hifi.buttons.textColor[control.color] | ||
| 114 | : hifi.buttons.disabledTextColor[control.colorScheme] | ||
| 115 | size: control.fontSize | ||
| 116 | verticalAlignment: Text.AlignVCenter | ||
| 117 | horizontalAlignment: Text.AlignHCenter | ||
| 118 | text: control.text | ||
| 119 | } | ||
| 120 | } | ||
| 121 | } | ||
| 122 | |||
| @@ -0,0 +1,121 @@ | |||
| 1 | // | ||
| 2 | // CheckBox.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 26 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.2 | ||
| 12 | import QtQuick.Controls 2.2 as Original | ||
| 13 | |||
| 14 | import "../stylesUit" | ||
| 15 | |||
| 16 | import TabletScriptingInterface 1.0 | ||
| 17 | |||
| 18 | Original.CheckBox { | ||
| 19 | id: checkBox | ||
| 20 | |||
| 21 | property int colorScheme: hifi.colorSchemes.light | ||
| 22 | property string color: hifi.colors.lightGrayText | ||
| 23 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 24 | property bool isRedCheck: false | ||
| 25 | property int boxSize: 14 | ||
| 26 | property int boxRadius: 3 | ||
| 27 | property bool wrap: true; | ||
| 28 | readonly property int checkSize: Math.max(boxSize - 8, 10) | ||
| 29 | readonly property int checkRadius: 2 | ||
| 30 | property string labelFontFamily: "Raleway" | ||
| 31 | property int labelFontSize: 14; | ||
| 32 | property int labelFontWeight: Font.DemiBold; | ||
| 33 | focusPolicy: Qt.ClickFocus | ||
| 34 | hoverEnabled: true | ||
| 35 | |||
| 36 | onClicked: { | ||
| 37 | Tablet.playSound(TabletEnums.ButtonClick); | ||
| 38 | } | ||
| 39 | |||
| 40 | onHoveredChanged: { | ||
| 41 | if (hovered) { | ||
| 42 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 43 | } | ||
| 44 | } | ||
| 45 | |||
| 46 | |||
| 47 | indicator: Rectangle { | ||
| 48 | id: box | ||
| 49 | implicitWidth: boxSize | ||
| 50 | implicitHeight: boxSize | ||
| 51 | radius: boxRadius | ||
| 52 | y: parent.height / 2 - height / 2 | ||
| 53 | border.width: 1 | ||
| 54 | border.color: pressed || hovered | ||
| 55 | ? hifi.colors.checkboxCheckedBorder | ||
| 56 | : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish) | ||
| 57 | |||
| 58 | gradient: Gradient { | ||
| 59 | GradientStop { | ||
| 60 | position: 0.2 | ||
| 61 | color: pressed || hovered | ||
| 62 | ? (checkBox.isLightColorScheme ? hifi.colors.checkboxChecked : hifi.colors.checkboxLightStart) | ||
| 63 | : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightStart : hifi.colors.checkboxDarkStart) | ||
| 64 | } | ||
| 65 | GradientStop { | ||
| 66 | position: 1.0 | ||
| 67 | color: pressed || hovered | ||
| 68 | ? (checkBox.isLightColorScheme ? hifi.colors.checkboxChecked : hifi.colors.checkboxLightFinish) | ||
| 69 | : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish) | ||
| 70 | } | ||
| 71 | } | ||
| 72 | |||
| 73 | Rectangle { | ||
| 74 | visible: pressed || hovered | ||
| 75 | anchors.centerIn: parent | ||
| 76 | id: innerBox | ||
| 77 | width: checkSize - 4 | ||
| 78 | height: width | ||
| 79 | radius: checkRadius | ||
| 80 | color: hifi.colors.checkboxCheckedBorder | ||
| 81 | } | ||
| 82 | |||
| 83 | Rectangle { | ||
| 84 | id: check | ||
| 85 | width: checkSize | ||
| 86 | height: checkSize | ||
| 87 | radius: checkRadius | ||
| 88 | anchors.centerIn: parent | ||
| 89 | color: isRedCheck ? hifi.colors.checkboxCheckedRed : hifi.colors.checkboxChecked | ||
| 90 | border.width: 2 | ||
| 91 | border.color: isRedCheck? hifi.colors.checkboxCheckedBorderRed : hifi.colors.checkboxCheckedBorder | ||
| 92 | visible: checked && !pressed || !checked && pressed | ||
| 93 | } | ||
| 94 | |||
| 95 | Rectangle { | ||
| 96 | id: disabledOverlay | ||
| 97 | visible: !enabled | ||
| 98 | width: boxSize | ||
| 99 | height: boxSize | ||
| 100 | radius: boxRadius | ||
| 101 | border.width: 1 | ||
| 102 | border.color: hifi.colors.baseGrayHighlight | ||
| 103 | color: hifi.colors.baseGrayHighlight | ||
| 104 | opacity: 0.5 | ||
| 105 | } | ||
| 106 | } | ||
| 107 | |||
| 108 | contentItem: Label { | ||
| 109 | text: checkBox.text | ||
| 110 | color: checkBox.color | ||
| 111 | font.family: checkBox.labelFontFamily; | ||
| 112 | font.pixelSize: checkBox.labelFontSize; | ||
| 113 | font.weight: checkBox.labelFontWeight; | ||
| 114 | x: 2 | ||
| 115 | verticalAlignment: Text.AlignVCenter | ||
| 116 | wrapMode: checkBox.wrap ? Text.Wrap : Text.NoWrap | ||
| 117 | elide: checkBox.wrap ? Text.ElideNone : Text.ElideRight | ||
| 118 | enabled: checkBox.enabled | ||
| 119 | leftPadding: checkBox.indicator.width + checkBox.spacing | ||
| 120 | } | ||
| 121 | } | ||
| @@ -0,0 +1,125 @@ | |||
| 1 | // | ||
| 2 | // CheckBox2.qml | ||
| 3 | // | ||
| 4 | // Created by Vlad Stelmahovsky on 10 Aug 2017 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | import QtQuick.Controls 2.2 | ||
| 13 | |||
| 14 | import "../stylesUit" | ||
| 15 | import "." as HiFiControls | ||
| 16 | import TabletScriptingInterface 1.0 | ||
| 17 | |||
| 18 | CheckBox { | ||
| 19 | id: checkBox | ||
| 20 | |||
| 21 | HifiConstants { id: hifi; } | ||
| 22 | |||
| 23 | padding: 0 | ||
| 24 | leftPadding: 0 | ||
| 25 | property int colorScheme: hifi.colorSchemes.light | ||
| 26 | property string color: hifi.colors.lightGrayText | ||
| 27 | readonly property bool isLightColorScheme: colorScheme === hifi.colorSchemes.light | ||
| 28 | property bool isRedCheck: false | ||
| 29 | property bool isRound: false | ||
| 30 | property int boxSize: 14 | ||
| 31 | property int boxRadius: isRound ? boxSize : 3 | ||
| 32 | property bool wrap: true; | ||
| 33 | readonly property int checkSize: Math.max(boxSize - 8, 10) | ||
| 34 | readonly property int checkRadius: isRound ? checkSize / 2 : 2 | ||
| 35 | focusPolicy: Qt.ClickFocus | ||
| 36 | hoverEnabled: true | ||
| 37 | |||
| 38 | onClicked: { | ||
| 39 | Tablet.playSound(TabletEnums.ButtonClick); | ||
| 40 | } | ||
| 41 | |||
| 42 | onHoveredChanged: { | ||
| 43 | if (hovered) { | ||
| 44 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 45 | } | ||
| 46 | } | ||
| 47 | |||
| 48 | indicator: Rectangle { | ||
| 49 | id: box | ||
| 50 | implicitWidth: boxSize | ||
| 51 | implicitHeight: boxSize | ||
| 52 | radius: boxRadius | ||
| 53 | x: checkBox.leftPadding | ||
| 54 | y: parent.height / 2 - height / 2 | ||
| 55 | border.width: 1 | ||
| 56 | border.color: pressed || hovered | ||
| 57 | ? hifi.colors.checkboxCheckedBorder | ||
| 58 | : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish) | ||
| 59 | |||
| 60 | gradient: Gradient { | ||
| 61 | GradientStop { | ||
| 62 | position: 0.2 | ||
| 63 | color: pressed || hovered | ||
| 64 | ? (checkBox.isLightColorScheme ? hifi.colors.checkboxChecked : hifi.colors.checkboxLightStart) | ||
| 65 | : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightStart : hifi.colors.checkboxDarkStart) | ||
| 66 | } | ||
| 67 | GradientStop { | ||
| 68 | position: 1.0 | ||
| 69 | color: pressed || hovered | ||
| 70 | ? (checkBox.isLightColorScheme ? hifi.colors.checkboxChecked : hifi.colors.checkboxLightFinish) | ||
| 71 | : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish) | ||
| 72 | } | ||
| 73 | } | ||
| 74 | |||
| 75 | Rectangle { | ||
| 76 | visible: pressed || hovered | ||
| 77 | anchors.centerIn: parent | ||
| 78 | id: innerBox | ||
| 79 | width: checkSize - 4 | ||
| 80 | height: width | ||
| 81 | radius: checkRadius | ||
| 82 | color: hifi.colors.checkboxCheckedBorder | ||
| 83 | } | ||
| 84 | |||
| 85 | Rectangle { | ||
| 86 | id: check | ||
| 87 | width: checkSize | ||
| 88 | height: checkSize | ||
| 89 | radius: checkRadius | ||
| 90 | anchors.centerIn: parent | ||
| 91 | color: isRedCheck ? hifi.colors.checkboxCheckedRed : hifi.colors.checkboxChecked | ||
| 92 | border.width: 2 | ||
| 93 | border.color: isRedCheck? hifi.colors.checkboxCheckedBorderRed : hifi.colors.checkboxCheckedBorder | ||
| 94 | visible: checked && !pressed || !checked && pressed | ||
| 95 | } | ||
| 96 | |||
| 97 | Rectangle { | ||
| 98 | id: disabledOverlay | ||
| 99 | visible: !enabled | ||
| 100 | width: boxSize | ||
| 101 | height: boxSize | ||
| 102 | radius: boxRadius | ||
| 103 | border.width: 1 | ||
| 104 | border.color: hifi.colors.baseGrayHighlight | ||
| 105 | color: hifi.colors.baseGrayHighlight | ||
| 106 | opacity: 0.5 | ||
| 107 | } | ||
| 108 | } | ||
| 109 | |||
| 110 | contentItem: Text { | ||
| 111 | id: root | ||
| 112 | font.pixelSize: hifi.fontSizes.inputLabel | ||
| 113 | font.family: "Raleway" | ||
| 114 | font.weight: Font.DemiBold | ||
| 115 | text: checkBox.text | ||
| 116 | color: checkBox.color | ||
| 117 | x: 2 | ||
| 118 | wrapMode: checkBox.wrap ? Text.Wrap : Text.NoWrap | ||
| 119 | elide: checkBox.wrap ? Text.ElideNone : Text.ElideRight | ||
| 120 | enabled: checkBox.enabled | ||
| 121 | verticalAlignment: Text.AlignVCenter | ||
| 122 | leftPadding: checkBox.indicator.width + checkBox.spacing | ||
| 123 | } | ||
| 124 | } | ||
| 125 | |||
| @@ -0,0 +1,191 @@ | |||
| 1 | // | ||
| 2 | // ComboBox.qml | ||
| 3 | // | ||
| 4 | // Created by Bradley Austin David on 27 Jan 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | import QtQuick.Controls 2.2 | ||
| 13 | |||
| 14 | import "../stylesUit" | ||
| 15 | import "." as HifiControls | ||
| 16 | |||
| 17 | FocusScope { | ||
| 18 | id: root | ||
| 19 | HifiConstants { id: hifi } | ||
| 20 | |||
| 21 | property alias model: comboBox.model; | ||
| 22 | property alias editable: comboBox.editable | ||
| 23 | property alias comboBox: comboBox | ||
| 24 | readonly property alias currentText: comboBox.currentText; | ||
| 25 | property alias currentIndex: comboBox.currentIndex; | ||
| 26 | property int currentHighLightedIndex: comboBox.currentIndex; | ||
| 27 | |||
| 28 | property int dropdownHeight: 480 | ||
| 29 | property int colorScheme: hifi.colorSchemes.light | ||
| 30 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 31 | property string label: "" | ||
| 32 | property real controlHeight: height + (comboBoxLabel.visible ? comboBoxLabel.height + comboBoxLabel.anchors.bottomMargin : 0) | ||
| 33 | |||
| 34 | readonly property ComboBox control: comboBox | ||
| 35 | |||
| 36 | property bool isDesktop: true | ||
| 37 | |||
| 38 | signal accepted(); | ||
| 39 | |||
| 40 | implicitHeight: comboBox.height; | ||
| 41 | focus: true | ||
| 42 | |||
| 43 | ComboBox { | ||
| 44 | id: comboBox | ||
| 45 | anchors.fill: parent | ||
| 46 | hoverEnabled: true | ||
| 47 | visible: true | ||
| 48 | height: hifi.fontSizes.textFieldInput + 13 // Match height of TextField control. | ||
| 49 | |||
| 50 | function previousItem() { root.currentHighLightedIndex = (root.currentHighLightedIndex + comboBox.count - 1) % comboBox.count; } | ||
| 51 | function nextItem() { root.currentHighLightedIndex = (root.currentHighLightedIndex + comboBox.count + 1) % comboBox.count; } | ||
| 52 | function selectCurrentItem() { root.currentIndex = root.currentHighLightedIndex; close(); /*hideList();*/ } | ||
| 53 | function selectSpecificItem(index) { root.currentIndex = index; close();/*hideList();*/ } | ||
| 54 | |||
| 55 | Keys.onUpPressed: previousItem(); | ||
| 56 | Keys.onDownPressed: nextItem(); | ||
| 57 | Keys.onSpacePressed: selectCurrentItem(); | ||
| 58 | Keys.onRightPressed: selectCurrentItem(); | ||
| 59 | Keys.onReturnPressed: selectCurrentItem(); | ||
| 60 | |||
| 61 | background: Rectangle { | ||
| 62 | gradient: Gradient { | ||
| 63 | GradientStop { | ||
| 64 | position: 0.2 | ||
| 65 | color: comboBox.popup.visible | ||
| 66 | ? (isLightColorScheme ? hifi.colors.dropDownPressedLight : hifi.colors.dropDownPressedDark) | ||
| 67 | : (isLightColorScheme ? hifi.colors.dropDownLightStart : hifi.colors.dropDownDarkStart) | ||
| 68 | } | ||
| 69 | GradientStop { | ||
| 70 | position: 1.0 | ||
| 71 | color: comboBox.popup.visible | ||
| 72 | ? (isLightColorScheme ? hifi.colors.dropDownPressedLight : hifi.colors.dropDownPressedDark) | ||
| 73 | : (isLightColorScheme ? hifi.colors.dropDownLightFinish : hifi.colors.dropDownDarkFinish) | ||
| 74 | } | ||
| 75 | } | ||
| 76 | } | ||
| 77 | |||
| 78 | indicator: Item { | ||
| 79 | id: dropIcon | ||
| 80 | anchors { right: parent.right; verticalCenter: parent.verticalCenter } | ||
| 81 | height: root.height | ||
| 82 | width: height | ||
| 83 | Rectangle { | ||
| 84 | width: 1 | ||
| 85 | height: parent.height | ||
| 86 | anchors.top: parent.top | ||
| 87 | anchors.left: parent.left | ||
| 88 | color: isLightColorScheme ? hifi.colors.faintGray : hifi.colors.baseGray | ||
| 89 | } | ||
| 90 | HiFiGlyphs { | ||
| 91 | anchors { top: parent.top; topMargin: -11; horizontalCenter: parent.horizontalCenter } | ||
| 92 | size: hifi.dimensions.spinnerSize | ||
| 93 | text: hifi.glyphs.caratDn | ||
| 94 | color: comboBox.hovered || comboBox.popup.visible ? hifi.colors.baseGray : (isLightColorScheme ? hifi.colors.lightGray : hifi.colors.lightGrayText) | ||
| 95 | } | ||
| 96 | } | ||
| 97 | |||
| 98 | contentItem: FiraSansSemiBold { | ||
| 99 | id: textField | ||
| 100 | anchors { | ||
| 101 | left: parent.left | ||
| 102 | leftMargin: hifi.dimensions.textPadding | ||
| 103 | verticalCenter: parent.verticalCenter | ||
| 104 | } | ||
| 105 | size: hifi.fontSizes.textFieldInput | ||
| 106 | text: comboBox.displayText ? comboBox.displayText : comboBox.currentText | ||
| 107 | elide: Text.ElideRight | ||
| 108 | color: comboBox.hovered || comboBox.popup.visible ? hifi.colors.baseGray : (isLightColorScheme ? hifi.colors.lightGray : hifi.colors.lightGrayText ) | ||
| 109 | } | ||
| 110 | |||
| 111 | delegate: ItemDelegate { | ||
| 112 | id: itemDelegate | ||
| 113 | hoverEnabled: true | ||
| 114 | width: root.width + 4 | ||
| 115 | height: popupText.implicitHeight * 1.4 | ||
| 116 | highlighted: root.currentHighLightedIndex == index | ||
| 117 | |||
| 118 | onHoveredChanged: { | ||
| 119 | if (hovered) { | ||
| 120 | root.currentHighLightedIndex = index | ||
| 121 | } | ||
| 122 | } | ||
| 123 | |||
| 124 | background: Rectangle { | ||
| 125 | color: itemDelegate.highlighted ? hifi.colors.primaryHighlight | ||
| 126 | : (isLightColorScheme ? hifi.colors.dropDownPressedLight | ||
| 127 | : hifi.colors.dropDownPressedDark) | ||
| 128 | } | ||
| 129 | |||
| 130 | contentItem: FiraSansSemiBold { | ||
| 131 | id: popupText | ||
| 132 | anchors.left: parent.left | ||
| 133 | anchors.leftMargin: hifi.dimensions.textPadding | ||
| 134 | anchors.verticalCenter: parent.verticalCenter | ||
| 135 | text: comboBox.model[index] ? comboBox.model[index] | ||
| 136 | : (comboBox.model.get && comboBox.model.get(index).text ? | ||
| 137 | comboBox.model.get(index).text : "") | ||
| 138 | size: hifi.fontSizes.textFieldInput | ||
| 139 | color: hifi.colors.baseGray | ||
| 140 | } | ||
| 141 | } | ||
| 142 | popup: Popup { | ||
| 143 | y: comboBox.height - 1 | ||
| 144 | width: comboBox.width | ||
| 145 | implicitHeight: listView.contentHeight > dropdownHeight ? dropdownHeight | ||
| 146 | : listView.contentHeight | ||
| 147 | padding: 0 | ||
| 148 | topPadding: 1 | ||
| 149 | |||
| 150 | onClosed: { | ||
| 151 | root.accepted() | ||
| 152 | } | ||
| 153 | |||
| 154 | contentItem: ListView { | ||
| 155 | id: listView | ||
| 156 | clip: true | ||
| 157 | model: comboBox.popup.visible ? comboBox.delegateModel : null | ||
| 158 | currentIndex: root.currentHighLightedIndex | ||
| 159 | delegate: comboBox.delegate | ||
| 160 | ScrollBar.vertical: HifiControls.ScrollBar { | ||
| 161 | id: scrollbar | ||
| 162 | parent: listView | ||
| 163 | policy: ScrollBar.AsNeeded | ||
| 164 | visible: size < 1.0 | ||
| 165 | } | ||
| 166 | } | ||
| 167 | |||
| 168 | background: Rectangle { | ||
| 169 | color: hifi.colors.baseGray | ||
| 170 | } | ||
| 171 | } | ||
| 172 | } | ||
| 173 | |||
| 174 | function textAt(index) { | ||
| 175 | return comboBox.textAt(index); | ||
| 176 | } | ||
| 177 | |||
| 178 | HifiControls.Label { | ||
| 179 | id: comboBoxLabel | ||
| 180 | text: root.label | ||
| 181 | colorScheme: root.colorScheme | ||
| 182 | anchors.left: parent.left | ||
| 183 | anchors.bottom: parent.top | ||
| 184 | anchors.bottomMargin: 4 | ||
| 185 | visible: label != "" | ||
| 186 | } | ||
| 187 | |||
| 188 | Component.onCompleted: { | ||
| 189 | isDesktop = (typeof desktop !== "undefined"); | ||
| 190 | } | ||
| 191 | } | ||
| @@ -0,0 +1,138 @@ | |||
| 1 | // | ||
| 2 | // ContentSection.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 16 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import QtGraphicalEffects 1.0 | ||
| 13 | |||
| 14 | import "../stylesUit" | ||
| 15 | |||
| 16 | Column { | ||
| 17 | property string name: "Content Section" | ||
| 18 | property bool isFirst: false | ||
| 19 | property bool isCollapsible: false // Set at creation. | ||
| 20 | property bool isCollapsed: false | ||
| 21 | |||
| 22 | spacing: 0 // Defer spacing decisions to individual controls. | ||
| 23 | |||
| 24 | anchors { | ||
| 25 | left: parent.left | ||
| 26 | leftMargin: hifi.dimensions.contentMargin.x | ||
| 27 | right: parent.right | ||
| 28 | rightMargin: hifi.dimensions.contentMargin.x | ||
| 29 | } | ||
| 30 | |||
| 31 | function toggleCollapsed() { | ||
| 32 | if (isCollapsible) { | ||
| 33 | isCollapsed = !isCollapsed; | ||
| 34 | for (var i = 1; i < children.length; i++) { | ||
| 35 | children[i].visible = !isCollapsed; | ||
| 36 | } | ||
| 37 | } | ||
| 38 | } | ||
| 39 | |||
| 40 | Item { | ||
| 41 | id: sectionName | ||
| 42 | anchors.left: parent.left | ||
| 43 | anchors.right: parent.right | ||
| 44 | height: leadingSpace.height + topBar.height + heading.height + bottomBar.height | ||
| 45 | |||
| 46 | Item { | ||
| 47 | id: leadingSpace | ||
| 48 | width: 1 | ||
| 49 | height: isFirst ? 7 : 0 | ||
| 50 | anchors.top: parent.top | ||
| 51 | } | ||
| 52 | |||
| 53 | Item { | ||
| 54 | id: topBar | ||
| 55 | visible: !isFirst | ||
| 56 | height: visible ? 2 : 0 | ||
| 57 | anchors.top: leadingSpace.bottom | ||
| 58 | |||
| 59 | Rectangle { | ||
| 60 | id: shadow | ||
| 61 | width: frame.width | ||
| 62 | height: 1 | ||
| 63 | color: hifi.colors.baseGrayShadow | ||
| 64 | x: -hifi.dimensions.contentMargin.x | ||
| 65 | } | ||
| 66 | |||
| 67 | Rectangle { | ||
| 68 | width: frame.width | ||
| 69 | height: 1 | ||
| 70 | color: hifi.colors.baseGrayHighlight | ||
| 71 | x: -hifi.dimensions.contentMargin.x | ||
| 72 | anchors.top: shadow.bottom | ||
| 73 | } | ||
| 74 | } | ||
| 75 | |||
| 76 | Item { | ||
| 77 | id: heading | ||
| 78 | anchors { | ||
| 79 | left: parent.left | ||
| 80 | right: parent.right | ||
| 81 | top: topBar.bottom | ||
| 82 | } | ||
| 83 | height: isCollapsible ? 36 : 28 | ||
| 84 | |||
| 85 | RalewayRegular { | ||
| 86 | id: title | ||
| 87 | anchors { | ||
| 88 | left: parent.left | ||
| 89 | top: parent.top | ||
| 90 | topMargin: 12 | ||
| 91 | } | ||
| 92 | size: hifi.fontSizes.sectionName | ||
| 93 | font.capitalization: Font.AllUppercase | ||
| 94 | text: name | ||
| 95 | color: hifi.colors.lightGrayText | ||
| 96 | } | ||
| 97 | |||
| 98 | HiFiGlyphs { | ||
| 99 | anchors { | ||
| 100 | top: title.top | ||
| 101 | topMargin: -9 | ||
| 102 | right: parent.right | ||
| 103 | rightMargin: -4 | ||
| 104 | } | ||
| 105 | size: hifi.fontSizes.disclosureButton | ||
| 106 | text: isCollapsed ? hifi.glyphs.disclosureButtonExpand : hifi.glyphs.disclosureButtonCollapse | ||
| 107 | color: hifi.colors.lightGrayText | ||
| 108 | visible: isCollapsible | ||
| 109 | } | ||
| 110 | |||
| 111 | MouseArea { | ||
| 112 | // Events are propogated so that any active control is defocused. | ||
| 113 | anchors.fill: parent | ||
| 114 | propagateComposedEvents: true | ||
| 115 | onPressed: { | ||
| 116 | toggleCollapsed(); | ||
| 117 | mouse.accepted = false; | ||
| 118 | } | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | LinearGradient { | ||
| 123 | id: bottomBar | ||
| 124 | visible: desktop.gradientsSupported && isCollapsible | ||
| 125 | width: frame.width | ||
| 126 | height: visible ? 4 : 0 | ||
| 127 | x: -hifi.dimensions.contentMargin.x | ||
| 128 | anchors.top: heading.bottom | ||
| 129 | start: Qt.point(0, 0) | ||
| 130 | end: Qt.point(0, 4) | ||
| 131 | gradient: Gradient { | ||
| 132 | GradientStop { position: 0.0; color: hifi.colors.darkGray } | ||
| 133 | GradientStop { position: 1.0; color: hifi.colors.baseGray } // Equivalent of darkGray0 over baseGray background. | ||
| 134 | } | ||
| 135 | cached: true | ||
| 136 | } | ||
| 137 | } | ||
| 138 | } | ||
| @@ -0,0 +1,333 @@ | |||
| 1 | // | ||
| 2 | // FilterBar.qml | ||
| 3 | // | ||
| 4 | // Created by Zach Fox on 17 Feb 2018-03-12 | ||
| 5 | // Copyright 2018 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.9 | ||
| 12 | import QtQuick.Controls 2.2 | ||
| 13 | import QtGraphicalEffects 1.0 | ||
| 14 | |||
| 15 | import "../stylesUit" | ||
| 16 | import "." as HifiControls | ||
| 17 | |||
| 18 | Item { | ||
| 19 | id: root; | ||
| 20 | |||
| 21 | property int colorScheme: hifi.colorSchemes.light | ||
| 22 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 23 | readonly property bool isFaintGrayColorScheme: colorScheme == hifi.colorSchemes.faintGray | ||
| 24 | property bool error: false; | ||
| 25 | property alias textFieldHeight: textField.height; | ||
| 26 | property string placeholderText; | ||
| 27 | property alias dropdownHeight: dropdownContainer.height; | ||
| 28 | property alias text: textField.text; | ||
| 29 | property alias primaryFilterChoices: filterBarModel; | ||
| 30 | property int primaryFilter_index: -1; | ||
| 31 | property string primaryFilter_filterName: ""; | ||
| 32 | property string primaryFilter_displayName: ""; | ||
| 33 | signal accepted; | ||
| 34 | |||
| 35 | onPrimaryFilter_indexChanged: { | ||
| 36 | if (primaryFilter_index === -1) { | ||
| 37 | primaryFilter_filterName = ""; | ||
| 38 | primaryFilter_displayName = ""; | ||
| 39 | } else { | ||
| 40 | primaryFilter_filterName = filterBarModel.get(primaryFilter_index).filterName; | ||
| 41 | primaryFilter_displayName = filterBarModel.get(primaryFilter_index).displayName; | ||
| 42 | } | ||
| 43 | } | ||
| 44 | |||
| 45 | TextField { | ||
| 46 | id: textField; | ||
| 47 | |||
| 48 | anchors.top: parent.top; | ||
| 49 | anchors.right: parent.right; | ||
| 50 | anchors.left: parent.left; | ||
| 51 | |||
| 52 | font.family: "Fira Sans" | ||
| 53 | font.pixelSize: hifi.fontSizes.textFieldInput; | ||
| 54 | |||
| 55 | placeholderText: root.primaryFilter_index === -1 ? root.placeholderText : ""; | ||
| 56 | |||
| 57 | TextMetrics { | ||
| 58 | id: primaryFilterTextMetrics; | ||
| 59 | font.family: "FiraSans Regular"; | ||
| 60 | font.pixelSize: hifi.fontSizes.textFieldInput; | ||
| 61 | font.capitalization: Font.AllUppercase; | ||
| 62 | text: root.primaryFilter_displayName; | ||
| 63 | } | ||
| 64 | |||
| 65 | // workaround for https://bugreports.qt.io/browse/QTBUG-49297 | ||
| 66 | Keys.onPressed: { | ||
| 67 | switch (event.key) { | ||
| 68 | case Qt.Key_Return: | ||
| 69 | case Qt.Key_Enter: | ||
| 70 | event.accepted = true; | ||
| 71 | |||
| 72 | // emit accepted signal manually | ||
| 73 | if (acceptableInput) { | ||
| 74 | root.accepted(); | ||
| 75 | root.forceActiveFocus(); | ||
| 76 | } | ||
| 77 | break; | ||
| 78 | case Qt.Key_Backspace: | ||
| 79 | if (textField.text === "") { | ||
| 80 | primaryFilter_index = -1; | ||
| 81 | } | ||
| 82 | break; | ||
| 83 | } | ||
| 84 | } | ||
| 85 | |||
| 86 | onAccepted: { | ||
| 87 | root.forceActiveFocus(); | ||
| 88 | } | ||
| 89 | |||
| 90 | onActiveFocusChanged: { | ||
| 91 | if (!activeFocus) { | ||
| 92 | dropdownContainer.visible = false; | ||
| 93 | } | ||
| 94 | } | ||
| 95 | |||
| 96 | color: { | ||
| 97 | if (isLightColorScheme) { | ||
| 98 | if (textField.activeFocus) { | ||
| 99 | hifi.colors.black | ||
| 100 | } else { | ||
| 101 | hifi.colors.lightGray | ||
| 102 | } | ||
| 103 | } else if (isFaintGrayColorScheme) { | ||
| 104 | if (textField.activeFocus) { | ||
| 105 | hifi.colors.black | ||
| 106 | } else { | ||
| 107 | hifi.colors.lightGray | ||
| 108 | } | ||
| 109 | } else { | ||
| 110 | if (textField.activeFocus) { | ||
| 111 | hifi.colors.white | ||
| 112 | } else { | ||
| 113 | hifi.colors.lightGrayText | ||
| 114 | } | ||
| 115 | } | ||
| 116 | } | ||
| 117 | |||
| 118 | background: Rectangle { | ||
| 119 | id: mainFilterBarRectangle; | ||
| 120 | |||
| 121 | color: { | ||
| 122 | if (isLightColorScheme) { | ||
| 123 | if (textField.activeFocus) { | ||
| 124 | hifi.colors.white | ||
| 125 | } else { | ||
| 126 | hifi.colors.textFieldLightBackground | ||
| 127 | } | ||
| 128 | } else if (isFaintGrayColorScheme) { | ||
| 129 | if (textField.activeFocus) { | ||
| 130 | hifi.colors.white | ||
| 131 | } else { | ||
| 132 | hifi.colors.faintGray50 | ||
| 133 | } | ||
| 134 | } else { | ||
| 135 | if (textField.activeFocus) { | ||
| 136 | hifi.colors.black | ||
| 137 | } else { | ||
| 138 | hifi.colors.baseGrayShadow | ||
| 139 | } | ||
| 140 | } | ||
| 141 | } | ||
| 142 | |||
| 143 | border.color: textField.error ? hifi.colors.redHighlight : | ||
| 144 | (textField.activeFocus ? hifi.colors.primaryHighlight : (isFaintGrayColorScheme ? hifi.colors.lightGrayText : hifi.colors.lightGray)) | ||
| 145 | border.width: 1 | ||
| 146 | radius: 4 | ||
| 147 | |||
| 148 | Item { | ||
| 149 | id: searchButtonContainer; | ||
| 150 | anchors.left: parent.left; | ||
| 151 | anchors.verticalCenter: parent.verticalCenter; | ||
| 152 | height: parent.height; | ||
| 153 | width: 42; | ||
| 154 | |||
| 155 | // Search icon | ||
| 156 | HiFiGlyphs { | ||
| 157 | id: searchIcon; | ||
| 158 | text: hifi.glyphs.search | ||
| 159 | color: textField.color | ||
| 160 | size: 40; | ||
| 161 | anchors.left: parent.left | ||
| 162 | anchors.verticalCenter: parent.verticalCenter | ||
| 163 | width: paintedWidth; | ||
| 164 | } | ||
| 165 | |||
| 166 | // Carat | ||
| 167 | HiFiGlyphs { | ||
| 168 | text: hifi.glyphs.caratDn; | ||
| 169 | color: textField.color; | ||
| 170 | size: 40; | ||
| 171 | anchors.left: parent.left; | ||
| 172 | anchors.leftMargin: 15; | ||
| 173 | width: paintedWidth; | ||
| 174 | } | ||
| 175 | |||
| 176 | MouseArea { | ||
| 177 | anchors.fill: parent; | ||
| 178 | onClicked: { | ||
| 179 | textField.forceActiveFocus(); | ||
| 180 | dropdownContainer.visible = !dropdownContainer.visible; | ||
| 181 | } | ||
| 182 | } | ||
| 183 | } | ||
| 184 | |||
| 185 | Rectangle { | ||
| 186 | z: 999; | ||
| 187 | id: primaryFilterContainer; | ||
| 188 | color: textField.activeFocus ? hifi.colors.faintGray : hifi.colors.white; | ||
| 189 | width: primaryFilterTextMetrics.tightBoundingRect.width + 14; | ||
| 190 | height: parent.height - 8; | ||
| 191 | anchors.verticalCenter: parent.verticalCenter; | ||
| 192 | anchors.left: searchButtonContainer.right; | ||
| 193 | anchors.leftMargin: 4; | ||
| 194 | visible: primaryFilterText.text !== ""; | ||
| 195 | radius: height/2; | ||
| 196 | |||
| 197 | FiraSansRegular { | ||
| 198 | id: primaryFilterText; | ||
| 199 | text: root.primaryFilter_displayName; | ||
| 200 | anchors.fill: parent; | ||
| 201 | color: textField.activeFocus ? hifi.colors.black : hifi.colors.lightGray; | ||
| 202 | horizontalAlignment: Text.AlignHCenter; | ||
| 203 | verticalAlignment: Text.AlignVCenter; | ||
| 204 | size: hifi.fontSizes.textFieldInput; | ||
| 205 | font.capitalization: Font.AllUppercase; | ||
| 206 | } | ||
| 207 | |||
| 208 | MouseArea { | ||
| 209 | anchors.fill: parent; | ||
| 210 | onClicked: { | ||
| 211 | textField.forceActiveFocus(); | ||
| 212 | } | ||
| 213 | } | ||
| 214 | } | ||
| 215 | |||
| 216 | // "Clear" button | ||
| 217 | HiFiGlyphs { | ||
| 218 | text: hifi.glyphs.error | ||
| 219 | color: textField.color | ||
| 220 | size: 40 | ||
| 221 | anchors.right: parent.right | ||
| 222 | anchors.rightMargin: hifi.dimensions.textPadding - 2 | ||
| 223 | anchors.verticalCenter: parent.verticalCenter | ||
| 224 | visible: root.text !== "" || root.primaryFilter_index !== -1; | ||
| 225 | |||
| 226 | MouseArea { | ||
| 227 | anchors.fill: parent; | ||
| 228 | onClicked: { | ||
| 229 | root.text = ""; | ||
| 230 | root.primaryFilter_index = -1; | ||
| 231 | dropdownContainer.visible = false; | ||
| 232 | textField.forceActiveFocus(); | ||
| 233 | } | ||
| 234 | } | ||
| 235 | } | ||
| 236 | } | ||
| 237 | |||
| 238 | selectedTextColor: hifi.colors.black | ||
| 239 | selectionColor: hifi.colors.primaryHighlight | ||
| 240 | leftPadding: 44 + (root.primaryFilter_index === -1 ? 0 : primaryFilterTextMetrics.tightBoundingRect.width + 20); | ||
| 241 | rightPadding: 44; | ||
| 242 | } | ||
| 243 | |||
| 244 | Rectangle { | ||
| 245 | id: dropdownContainer; | ||
| 246 | visible: false; | ||
| 247 | height: 50 * filterBarModel.count; | ||
| 248 | width: parent.width; | ||
| 249 | anchors.top: textField.bottom; | ||
| 250 | anchors.left: parent.left; | ||
| 251 | anchors.right: parent.right; | ||
| 252 | color: hifi.colors.white; | ||
| 253 | |||
| 254 | ListModel { | ||
| 255 | id: filterBarModel; | ||
| 256 | } | ||
| 257 | |||
| 258 | ListView { | ||
| 259 | id: dropdownListView; | ||
| 260 | interactive: false; | ||
| 261 | anchors.fill: parent; | ||
| 262 | model: filterBarModel; | ||
| 263 | delegate: Item { | ||
| 264 | width: parent.width; | ||
| 265 | height: 50; | ||
| 266 | Rectangle { | ||
| 267 | id: dropDownButton; | ||
| 268 | color: hifi.colors.white; | ||
| 269 | width: parent.width; | ||
| 270 | height: 50; | ||
| 271 | visible: true; | ||
| 272 | |||
| 273 | RalewaySemiBold { | ||
| 274 | id: dropDownButtonText; | ||
| 275 | text: model.displayName; | ||
| 276 | anchors.fill: parent; | ||
| 277 | anchors.topMargin: 2; | ||
| 278 | anchors.leftMargin: 12; | ||
| 279 | color: hifi.colors.baseGray; | ||
| 280 | horizontalAlignment: Text.AlignLeft; | ||
| 281 | verticalAlignment: Text.AlignVCenter; | ||
| 282 | size: 18; | ||
| 283 | } | ||
| 284 | |||
| 285 | MouseArea { | ||
| 286 | anchors.fill: parent; | ||
| 287 | hoverEnabled: true; | ||
| 288 | propagateComposedEvents: false; | ||
| 289 | onEntered: { | ||
| 290 | dropDownButton.color = hifi.colors.blueHighlight; | ||
| 291 | } | ||
| 292 | onExited: { | ||
| 293 | dropDownButton.color = hifi.colors.white; | ||
| 294 | } | ||
| 295 | onClicked: { | ||
| 296 | textField.forceActiveFocus(); | ||
| 297 | root.primaryFilter_index = index; | ||
| 298 | dropdownContainer.visible = false; | ||
| 299 | } | ||
| 300 | } | ||
| 301 | } | ||
| 302 | Rectangle { | ||
| 303 | height: 2; | ||
| 304 | width: parent.width; | ||
| 305 | color: hifi.colors.lightGray; | ||
| 306 | visible: model.separator | ||
| 307 | } | ||
| 308 | } | ||
| 309 | } | ||
| 310 | } | ||
| 311 | |||
| 312 | DropShadow { | ||
| 313 | anchors.fill: dropdownContainer; | ||
| 314 | horizontalOffset: 0; | ||
| 315 | verticalOffset: 4; | ||
| 316 | radius: 4.0; | ||
| 317 | samples: 9 | ||
| 318 | color: Qt.rgba(0, 0, 0, 0.25); | ||
| 319 | source: dropdownContainer; | ||
| 320 | visible: dropdownContainer.visible; | ||
| 321 | } | ||
| 322 | |||
| 323 | function changeFilterByDisplayName(name) { | ||
| 324 | for (var i = 0; i < filterBarModel.count; i++) { | ||
| 325 | if (filterBarModel.get(i).displayName === name) { | ||
| 326 | root.primaryFilter_index = i; | ||
| 327 | return; | ||
| 328 | } | ||
| 329 | } | ||
| 330 | |||
| 331 | console.log("Passed displayName not found in filterBarModel! primaryFilter unchanged."); | ||
| 332 | } | ||
| 333 | } | ||
| @@ -0,0 +1,91 @@ | |||
| 1 | // | ||
| 2 | // GlyphButton.qml | ||
| 3 | // | ||
| 4 | // Created by Clement on 3/7/16 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | import QtQuick.Controls 2.2 as Original | ||
| 13 | import TabletScriptingInterface 1.0 | ||
| 14 | |||
| 15 | import "../stylesUit" | ||
| 16 | |||
| 17 | Original.Button { | ||
| 18 | id: control | ||
| 19 | property int color: 0 | ||
| 20 | property int colorScheme: hifi.colorSchemes.light | ||
| 21 | property string glyph: "" | ||
| 22 | property int size: 32 | ||
| 23 | |||
| 24 | width: 120 | ||
| 25 | height: 28 | ||
| 26 | |||
| 27 | onHoveredChanged: { | ||
| 28 | if (hovered) { | ||
| 29 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 30 | } | ||
| 31 | } | ||
| 32 | |||
| 33 | onFocusChanged: { | ||
| 34 | if (focus) { | ||
| 35 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 36 | } | ||
| 37 | } | ||
| 38 | |||
| 39 | onClicked: { | ||
| 40 | Tablet.playSound(TabletEnums.ButtonClick); | ||
| 41 | } | ||
| 42 | |||
| 43 | background: Rectangle { | ||
| 44 | radius: hifi.buttons.radius | ||
| 45 | |||
| 46 | gradient: Gradient { | ||
| 47 | GradientStop { | ||
| 48 | position: 0.2 | ||
| 49 | color: { | ||
| 50 | if (!control.enabled) { | ||
| 51 | hifi.buttons.disabledColorStart[control.colorScheme] | ||
| 52 | } else if (control.pressed) { | ||
| 53 | hifi.buttons.pressedColor[control.color] | ||
| 54 | } else if (control.hovered) { | ||
| 55 | hifi.buttons.hoveredColor[control.color] | ||
| 56 | } else if (!control.hovered && control.focus) { | ||
| 57 | hifi.buttons.focusedColor[control.color] | ||
| 58 | } else { | ||
| 59 | hifi.buttons.colorStart[control.color] | ||
| 60 | } | ||
| 61 | } | ||
| 62 | } | ||
| 63 | GradientStop { | ||
| 64 | position: 1.0 | ||
| 65 | color: { | ||
| 66 | if (!control.enabled) { | ||
| 67 | hifi.buttons.disabledColorFinish[control.colorScheme] | ||
| 68 | } else if (control.pressed) { | ||
| 69 | hifi.buttons.pressedColor[control.color] | ||
| 70 | } else if (control.hovered) { | ||
| 71 | hifi.buttons.hoveredColor[control.color] | ||
| 72 | } else if (!control.hovered && control.focus) { | ||
| 73 | hifi.buttons.focusedColor[control.color] | ||
| 74 | } else { | ||
| 75 | hifi.buttons.colorFinish[control.color] | ||
| 76 | } | ||
| 77 | } | ||
| 78 | } | ||
| 79 | } | ||
| 80 | } | ||
| 81 | |||
| 82 | contentItem: HiFiGlyphs { | ||
| 83 | color: enabled ? hifi.buttons.textColor[control.color] | ||
| 84 | : hifi.buttons.disabledTextColor[control.colorScheme] | ||
| 85 | verticalAlignment: Text.AlignVCenter | ||
| 86 | horizontalAlignment: Text.AlignHCenter | ||
| 87 | text: control.glyph | ||
| 88 | size: control.size | ||
| 89 | } | ||
| 90 | } | ||
| 91 | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | // | ||
| 2 | // HorizontalRule.qml | ||
| 3 | // | ||
| 4 | // Created by Clement on 7/18/16 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | |||
| 13 | Rectangle { | ||
| 14 | anchors.left: parent.left | ||
| 15 | anchors.right: parent.right | ||
| 16 | height: 1 | ||
| 17 | color: hifi.colors.lightGray | ||
| 18 | } | ||
| @@ -0,0 +1,21 @@ | |||
| 1 | // | ||
| 2 | // HorizontalSpacer.qml | ||
| 3 | // | ||
| 4 | // Created by Clement on 7/18/16 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | |||
| 13 | import "../stylesUit" | ||
| 14 | |||
| 15 | Item { | ||
| 16 | id: root | ||
| 17 | property alias size: root.width | ||
| 18 | |||
| 19 | width: hifi.dimensions.controlInterlineHeight | ||
| 20 | height: 1 // Must be non-zero | ||
| 21 | } | ||
| @@ -0,0 +1,63 @@ | |||
| 1 | // | ||
| 2 | // ImageMessageBox.qml | ||
| 3 | // | ||
| 4 | // Created by Dante Ruiz on 7/5/2017 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import "../stylesUit" | ||
| 13 | |||
| 14 | Item { | ||
| 15 | id: imageBox | ||
| 16 | visible: false | ||
| 17 | anchors.fill: parent | ||
| 18 | property alias source: image.source | ||
| 19 | property alias imageWidth: image.width | ||
| 20 | property alias imageHeight: image.height | ||
| 21 | |||
| 22 | Rectangle { | ||
| 23 | anchors.fill: parent | ||
| 24 | color: "black" | ||
| 25 | opacity: 0.3 | ||
| 26 | } | ||
| 27 | |||
| 28 | Image { | ||
| 29 | id: image | ||
| 30 | anchors.centerIn: parent | ||
| 31 | |||
| 32 | HiFiGlyphs { | ||
| 33 | id: closeGlyphButton | ||
| 34 | text: hifi.glyphs.close | ||
| 35 | size: 25 | ||
| 36 | |||
| 37 | anchors { | ||
| 38 | top: parent.top | ||
| 39 | topMargin: 15 | ||
| 40 | right: parent.right | ||
| 41 | rightMargin: 15 | ||
| 42 | } | ||
| 43 | |||
| 44 | MouseArea { | ||
| 45 | anchors.fill: parent | ||
| 46 | hoverEnabled: true | ||
| 47 | |||
| 48 | onEntered: { | ||
| 49 | parent.text = hifi.glyphs.closeInverted; | ||
| 50 | } | ||
| 51 | |||
| 52 | onExited: { | ||
| 53 | parent.text = hifi.glyphs.close; | ||
| 54 | } | ||
| 55 | |||
| 56 | onClicked: { | ||
| 57 | imageBox.visible = false; | ||
| 58 | } | ||
| 59 | } | ||
| 60 | } | ||
| 61 | } | ||
| 62 | |||
| 63 | } | ||
| @@ -0,0 +1,185 @@ | |||
| 1 | import QtQuick 2.0 | ||
| 2 | import TabletScriptingInterface 1.0 | ||
| 3 | |||
| 4 | Item { | ||
| 5 | id: keyItem | ||
| 6 | width: 45 | ||
| 7 | height: 50 | ||
| 8 | |||
| 9 | property int contentPadding: 4 | ||
| 10 | property string glyph: "a" | ||
| 11 | property bool toggle: false // does this button have the toggle behaivor? | ||
| 12 | property bool toggled: false // is this button currently toggled? | ||
| 13 | property alias mouseArea: mouseArea1 | ||
| 14 | property alias fontFamily: letter.font.family; | ||
| 15 | property alias fontPixelSize: letter.font.pixelSize | ||
| 16 | property alias verticalAlignment: letter.verticalAlignment | ||
| 17 | property alias letterAnchors: letter.anchors | ||
| 18 | |||
| 19 | function resetToggledMode(mode) { | ||
| 20 | toggled = mode; | ||
| 21 | if (toggled) { | ||
| 22 | state = "mouseDepressed"; | ||
| 23 | } else { | ||
| 24 | state = ""; | ||
| 25 | } | ||
| 26 | } | ||
| 27 | |||
| 28 | MouseArea { | ||
| 29 | id: mouseArea1 | ||
| 30 | width: 36 | ||
| 31 | anchors.fill: parent | ||
| 32 | hoverEnabled: true | ||
| 33 | |||
| 34 | onCanceled: { | ||
| 35 | if (toggled) { | ||
| 36 | keyItem.state = "mouseDepressed"; | ||
| 37 | } else { | ||
| 38 | keyItem.state = ""; | ||
| 39 | } | ||
| 40 | } | ||
| 41 | |||
| 42 | onContainsMouseChanged: { | ||
| 43 | if (containsMouse) { | ||
| 44 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 45 | } | ||
| 46 | } | ||
| 47 | |||
| 48 | onDoubleClicked: { | ||
| 49 | mouse.accepted = true; | ||
| 50 | } | ||
| 51 | |||
| 52 | property var _HAPTIC_STRENGTH: 0.1; | ||
| 53 | property var _HAPTIC_DURATION: 3.0; | ||
| 54 | property var leftHand: 0; | ||
| 55 | property var rightHand: 1; | ||
| 56 | |||
| 57 | onEntered: { | ||
| 58 | keyItem.state = "mouseOver"; | ||
| 59 | |||
| 60 | var globalPosition = keyItem.mapToGlobal(mouseArea1.mouseX, mouseArea1.mouseY); | ||
| 61 | var pointerID = Web3DOverlay.deviceIdByTouchPoint(globalPosition.x, globalPosition.y); | ||
| 62 | |||
| 63 | if (Pointers.isLeftHand(pointerID)) { | ||
| 64 | Controller.triggerHapticPulse(_HAPTIC_STRENGTH, _HAPTIC_DURATION, leftHand); | ||
| 65 | } else if (Pointers.isRightHand(pointerID)) { | ||
| 66 | Controller.triggerHapticPulse(_HAPTIC_STRENGTH, _HAPTIC_DURATION, rightHand); | ||
| 67 | } | ||
| 68 | } | ||
| 69 | |||
| 70 | onExited: { | ||
| 71 | if (toggled) { | ||
| 72 | keyItem.state = "mouseDepressed"; | ||
| 73 | } else { | ||
| 74 | keyItem.state = ""; | ||
| 75 | } | ||
| 76 | } | ||
| 77 | |||
| 78 | onPressed: { | ||
| 79 | keyItem.state = "mouseClicked"; | ||
| 80 | mouse.accepted = true; | ||
| 81 | } | ||
| 82 | |||
| 83 | onReleased: { | ||
| 84 | if (containsMouse) { | ||
| 85 | Tablet.playSound(TabletEnums.ButtonClick); | ||
| 86 | |||
| 87 | webEntity.synthesizeKeyPress(glyph); | ||
| 88 | webEntity.synthesizeKeyPress(glyph, mirrorText); | ||
| 89 | |||
| 90 | if (toggle) { | ||
| 91 | toggled = !toggled; | ||
| 92 | } | ||
| 93 | keyItem.state = "mouseOver"; | ||
| 94 | } else { | ||
| 95 | if (toggled) { | ||
| 96 | keyItem.state = "mouseDepressed"; | ||
| 97 | } else { | ||
| 98 | keyItem.state = ""; | ||
| 99 | } | ||
| 100 | } | ||
| 101 | mouse.accepted = true; | ||
| 102 | } | ||
| 103 | } | ||
| 104 | |||
| 105 | Rectangle { | ||
| 106 | id: roundedRect | ||
| 107 | width: 30 | ||
| 108 | color: "#121212" | ||
| 109 | radius: 2 | ||
| 110 | border.color: "#00000000" | ||
| 111 | anchors.fill: parent | ||
| 112 | anchors.margins: contentPadding | ||
| 113 | } | ||
| 114 | |||
| 115 | Text { | ||
| 116 | id: letter | ||
| 117 | y: 6 | ||
| 118 | width: 50 | ||
| 119 | color: "#ffffff" | ||
| 120 | text: glyph | ||
| 121 | style: Text.Normal | ||
| 122 | font.family: "Tahoma" | ||
| 123 | anchors.right: parent.right | ||
| 124 | anchors.rightMargin: 0 | ||
| 125 | anchors.left: parent.left | ||
| 126 | anchors.leftMargin: 0 | ||
| 127 | anchors.bottom: parent.bottom | ||
| 128 | anchors.bottomMargin: 0 | ||
| 129 | anchors.top: parent.top | ||
| 130 | anchors.topMargin: 8 | ||
| 131 | horizontalAlignment: Text.AlignHCenter | ||
| 132 | font.pixelSize: 28 | ||
| 133 | } | ||
| 134 | |||
| 135 | states: [ | ||
| 136 | State { | ||
| 137 | name: "mouseOver" | ||
| 138 | |||
| 139 | PropertyChanges { | ||
| 140 | target: roundedRect | ||
| 141 | color: "#121212" | ||
| 142 | radius: 3 | ||
| 143 | border.width: 2 | ||
| 144 | border.color: "#00b4ef" | ||
| 145 | } | ||
| 146 | |||
| 147 | PropertyChanges { | ||
| 148 | target: letter | ||
| 149 | color: "#00b4ef" | ||
| 150 | style: Text.Normal | ||
| 151 | } | ||
| 152 | }, | ||
| 153 | State { | ||
| 154 | name: "mouseClicked" | ||
| 155 | PropertyChanges { | ||
| 156 | target: roundedRect | ||
| 157 | color: "#1080b8" | ||
| 158 | border.width: 2 | ||
| 159 | border.color: "#00b4ef" | ||
| 160 | } | ||
| 161 | |||
| 162 | PropertyChanges { | ||
| 163 | target: letter | ||
| 164 | color: "#121212" | ||
| 165 | styleColor: "#00000000" | ||
| 166 | style: Text.Normal | ||
| 167 | } | ||
| 168 | }, | ||
| 169 | State { | ||
| 170 | name: "mouseDepressed" | ||
| 171 | PropertyChanges { | ||
| 172 | target: roundedRect | ||
| 173 | color: "#0578b1" | ||
| 174 | border.width: 0 | ||
| 175 | } | ||
| 176 | |||
| 177 | PropertyChanges { | ||
| 178 | target: letter | ||
| 179 | color: "#121212" | ||
| 180 | styleColor: "#00000000" | ||
| 181 | style: Text.Normal | ||
| 182 | } | ||
| 183 | } | ||
| 184 | ] | ||
| 185 | } | ||
| @@ -0,0 +1,370 @@ | |||
| 1 | // | ||
| 2 | // FileDialog.qml | ||
| 3 | // | ||
| 4 | // Created by Anthony Thibault on 31 Oct 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | import QtGraphicalEffects 1.0 | ||
| 13 | import "." | ||
| 14 | |||
| 15 | Rectangle { | ||
| 16 | id: keyboardBase | ||
| 17 | objectName: "keyboard" | ||
| 18 | |||
| 19 | anchors.left: parent.left | ||
| 20 | anchors.right: parent.right | ||
| 21 | |||
| 22 | color: "#252525" | ||
| 23 | |||
| 24 | property bool raised: false | ||
| 25 | property bool numeric: false | ||
| 26 | |||
| 27 | readonly property int keyboardRowHeight: 50 | ||
| 28 | readonly property int keyboardWidth: 480 | ||
| 29 | readonly property int keyboardHeight: 200 | ||
| 30 | |||
| 31 | readonly property int mirrorTextHeight: keyboardRowHeight | ||
| 32 | |||
| 33 | property bool password: false | ||
| 34 | property alias mirroredText: mirrorText.text | ||
| 35 | property bool showMirrorText: true | ||
| 36 | |||
| 37 | readonly property int raisedHeight: keyboardHeight + (showMirrorText ? keyboardRowHeight : 0) | ||
| 38 | |||
| 39 | height: 0 | ||
| 40 | visible: false | ||
| 41 | |||
| 42 | property bool shiftMode: false | ||
| 43 | property bool numericShiftMode: false | ||
| 44 | |||
| 45 | |||
| 46 | onPasswordChanged: { | ||
| 47 | var use3DKeyboard = (typeof MenuInterface === "undefined") ? false : MenuInterface.isOptionChecked("Use 3D Keyboard"); | ||
| 48 | if (use3DKeyboard) { | ||
| 49 | KeyboardScriptingInterface.password = password; | ||
| 50 | } | ||
| 51 | } | ||
| 52 | |||
| 53 | onRaisedChanged: { | ||
| 54 | var use3DKeyboard = (typeof MenuInterface === "undefined") ? false : MenuInterface.isOptionChecked("Use 3D Keyboard"); | ||
| 55 | if (!use3DKeyboard) { | ||
| 56 | keyboardBase.height = raised ? raisedHeight : 0; | ||
| 57 | keyboardBase.visible = raised; | ||
| 58 | } else { | ||
| 59 | KeyboardScriptingInterface.raised = raised; | ||
| 60 | KeyboardScriptingInterface.password = raised ? password : false; | ||
| 61 | } | ||
| 62 | mirroredText = ""; | ||
| 63 | } | ||
| 64 | |||
| 65 | function resetShiftMode(mode) { | ||
| 66 | shiftMode = mode; | ||
| 67 | shiftKey.resetToggledMode(mode); | ||
| 68 | } | ||
| 69 | |||
| 70 | function toUpper(str) { | ||
| 71 | if (str === ",") { | ||
| 72 | return "<"; | ||
| 73 | } else if (str === ".") { | ||
| 74 | return ">"; | ||
| 75 | } else if (str === "/") { | ||
| 76 | return "?"; | ||
| 77 | } else if (str === "-") { | ||
| 78 | return "_"; | ||
| 79 | } else { | ||
| 80 | return str.toUpperCase(str); | ||
| 81 | } | ||
| 82 | } | ||
| 83 | |||
| 84 | function toLower(str) { | ||
| 85 | if (str === "<") { | ||
| 86 | return ","; | ||
| 87 | } else if (str === ">") { | ||
| 88 | return "."; | ||
| 89 | } else if (str === "?") { | ||
| 90 | return "/"; | ||
| 91 | } else if (str === "_") { | ||
| 92 | return "-"; | ||
| 93 | } else { | ||
| 94 | return str.toLowerCase(str); | ||
| 95 | } | ||
| 96 | } | ||
| 97 | |||
| 98 | function forEachKey(func) { | ||
| 99 | var i, j; | ||
| 100 | for (i = 0; i < columnAlpha.children.length; i++) { | ||
| 101 | var row = columnAlpha.children[i]; | ||
| 102 | for (j = 0; j < row.children.length; j++) { | ||
| 103 | var key = row.children[j]; | ||
| 104 | func(key); | ||
| 105 | } | ||
| 106 | } | ||
| 107 | } | ||
| 108 | |||
| 109 | onShiftModeChanged: { | ||
| 110 | forEachKey(function (key) { | ||
| 111 | if (/[a-z-_]/i.test(key.glyph)) { | ||
| 112 | if (shiftMode) { | ||
| 113 | key.glyph = keyboardBase.toUpper(key.glyph); | ||
| 114 | } else { | ||
| 115 | key.glyph = keyboardBase.toLower(key.glyph); | ||
| 116 | } | ||
| 117 | } | ||
| 118 | }); | ||
| 119 | } | ||
| 120 | |||
| 121 | function alphaKeyClickedHandler(mouseArea) { | ||
| 122 | // reset shift mode to false after first keypress | ||
| 123 | if (shiftMode) { | ||
| 124 | resetShiftMode(false); | ||
| 125 | } | ||
| 126 | } | ||
| 127 | |||
| 128 | Component.onCompleted: { | ||
| 129 | // hook up callbacks to every ascii key | ||
| 130 | forEachKey(function (key) { | ||
| 131 | if (/^[a-z]+$/i.test(key.glyph)) { | ||
| 132 | key.mouseArea.onClicked.connect(alphaKeyClickedHandler); | ||
| 133 | } | ||
| 134 | }); | ||
| 135 | } | ||
| 136 | |||
| 137 | Rectangle { | ||
| 138 | height: showMirrorText ? mirrorTextHeight : 0 | ||
| 139 | width: keyboardWidth | ||
| 140 | color: "#252525" | ||
| 141 | anchors.horizontalCenter: parent.horizontalCenter | ||
| 142 | |||
| 143 | TextInput { | ||
| 144 | id: mirrorText | ||
| 145 | visible: showMirrorText | ||
| 146 | font.family: "Fira Sans" | ||
| 147 | font.pixelSize: 20 | ||
| 148 | verticalAlignment: Text.AlignVCenter | ||
| 149 | horizontalAlignment: Text.AlignHCenter | ||
| 150 | color: "#00B4EF"; | ||
| 151 | anchors.left: parent.left | ||
| 152 | anchors.leftMargin: 10 | ||
| 153 | anchors.right: parent.right | ||
| 154 | anchors.top: parent.top | ||
| 155 | anchors.bottom: parent.bottom | ||
| 156 | |||
| 157 | wrapMode: Text.WordWrap | ||
| 158 | readOnly: false // we need this to allow control to accept QKeyEvent | ||
| 159 | selectByMouse: false | ||
| 160 | echoMode: password ? TextInput.Password : TextInput.Normal | ||
| 161 | |||
| 162 | Keys.onPressed: { | ||
| 163 | if (event.key == Qt.Key_Return || event.key == Qt.Key_Space) { | ||
| 164 | mirrorText.text = ""; | ||
| 165 | event.accepted = true; | ||
| 166 | } | ||
| 167 | } | ||
| 168 | |||
| 169 | MouseArea { // ... and we need this mouse area to prevent mirrorText from getting mouse events to ensure it will never get focus | ||
| 170 | anchors.fill: parent | ||
| 171 | } | ||
| 172 | } | ||
| 173 | } | ||
| 174 | |||
| 175 | Rectangle { | ||
| 176 | id: keyboardRect | ||
| 177 | y: showMirrorText ? mirrorTextHeight : 0 | ||
| 178 | width: keyboardWidth | ||
| 179 | height: keyboardHeight | ||
| 180 | color: "#252525" | ||
| 181 | anchors.horizontalCenter: parent.horizontalCenter | ||
| 182 | anchors.bottom: parent.bottom | ||
| 183 | anchors.bottomMargin: 0 | ||
| 184 | |||
| 185 | Column { | ||
| 186 | id: columnAlpha | ||
| 187 | width: keyboardWidth | ||
| 188 | height: keyboardHeight | ||
| 189 | visible: !numeric | ||
| 190 | |||
| 191 | Row { | ||
| 192 | width: keyboardWidth | ||
| 193 | height: keyboardRowHeight | ||
| 194 | anchors.left: parent.left | ||
| 195 | anchors.leftMargin: 4 | ||
| 196 | |||
| 197 | Key { width: 43; glyph: "q"; } | ||
| 198 | Key { width: 43; glyph: "w"; } | ||
| 199 | Key { width: 43; glyph: "e"; } | ||
| 200 | Key { width: 43; glyph: "r"; } | ||
| 201 | Key { width: 43; glyph: "t"; } | ||
| 202 | Key { width: 43; glyph: "y"; } | ||
| 203 | Key { width: 43; glyph: "u"; } | ||
| 204 | Key { width: 43; glyph: "i"; } | ||
| 205 | Key { width: 43; glyph: "o"; } | ||
| 206 | Key { width: 43; glyph: "p"; } | ||
| 207 | Key { width: 43; glyph: "←"; } | ||
| 208 | } | ||
| 209 | |||
| 210 | Row { | ||
| 211 | width: keyboardWidth | ||
| 212 | height: keyboardRowHeight | ||
| 213 | anchors.left: parent.left | ||
| 214 | anchors.leftMargin: 20 | ||
| 215 | |||
| 216 | Key { width: 43; glyph: "a"; } | ||
| 217 | Key { width: 43; glyph: "s"; } | ||
| 218 | Key { width: 43; glyph: "d"; } | ||
| 219 | Key { width: 43; glyph: "f"; } | ||
| 220 | Key { width: 43; glyph: "g"; } | ||
| 221 | Key { width: 43; glyph: "h"; } | ||
| 222 | Key { width: 43; glyph: "j"; } | ||
| 223 | Key { width: 43; glyph: "k"; } | ||
| 224 | Key { width: 43; glyph: "l"; } | ||
| 225 | Key { width: 70; glyph: "⏎"; } | ||
| 226 | } | ||
| 227 | |||
| 228 | Row { | ||
| 229 | width: keyboardWidth | ||
| 230 | height: keyboardRowHeight | ||
| 231 | anchors.left: parent.left | ||
| 232 | anchors.leftMargin: 4 | ||
| 233 | |||
| 234 | Key { | ||
| 235 | id: shiftKey | ||
| 236 | width: 43 | ||
| 237 | glyph: "⇪" | ||
| 238 | toggle: true | ||
| 239 | onToggledChanged: shiftMode = toggled | ||
| 240 | } | ||
| 241 | Key { width: 43; glyph: "z"; } | ||
| 242 | Key { width: 43; glyph: "x"; } | ||
| 243 | Key { width: 43; glyph: "c"; } | ||
| 244 | Key { width: 43; glyph: "v"; } | ||
| 245 | Key { width: 43; glyph: "b"; } | ||
| 246 | Key { width: 43; glyph: "n"; } | ||
| 247 | Key { width: 43; glyph: "m"; } | ||
| 248 | Key { width: 43; glyph: "-"; } | ||
| 249 | Key { width: 43; glyph: "/"; } | ||
| 250 | Key { width: 43; glyph: "?"; } | ||
| 251 | } | ||
| 252 | |||
| 253 | Row { | ||
| 254 | width: keyboardWidth | ||
| 255 | height: keyboardRowHeight | ||
| 256 | anchors.left: parent.left | ||
| 257 | anchors.leftMargin: 4 | ||
| 258 | |||
| 259 | Key { | ||
| 260 | width: 70 | ||
| 261 | glyph: "123" | ||
| 262 | mouseArea.onClicked: keyboardBase.parent.punctuationMode = true | ||
| 263 | } | ||
| 264 | Key { width: 231; glyph: " "; } | ||
| 265 | Key { width: 43; glyph: ","; } | ||
| 266 | Key { width: 43; glyph: "."; } | ||
| 267 | Key { | ||
| 268 | fontFamily: "hifi-glyphs"; | ||
| 269 | fontPixelSize: 48; | ||
| 270 | letterAnchors.topMargin: -4; | ||
| 271 | verticalAlignment: Text.AlignVCenter; | ||
| 272 | width: 86; glyph: "\ue02b"; | ||
| 273 | } | ||
| 274 | } | ||
| 275 | } | ||
| 276 | |||
| 277 | Column { | ||
| 278 | id: columnNumeric | ||
| 279 | width: keyboardWidth | ||
| 280 | height: keyboardHeight | ||
| 281 | visible: numeric | ||
| 282 | |||
| 283 | Row { | ||
| 284 | width: keyboardWidth | ||
| 285 | height: keyboardRowHeight | ||
| 286 | anchors.left: parent.left | ||
| 287 | anchors.leftMargin: 4 | ||
| 288 | |||
| 289 | Key { width: 43; glyph: "1"; } | ||
| 290 | Key { width: 43; glyph: "2"; } | ||
| 291 | Key { width: 43; glyph: "3"; } | ||
| 292 | Key { width: 43; glyph: "4"; } | ||
| 293 | Key { width: 43; glyph: "5"; } | ||
| 294 | Key { width: 43; glyph: "6"; } | ||
| 295 | Key { width: 43; glyph: "7"; } | ||
| 296 | Key { width: 43; glyph: "8"; } | ||
| 297 | Key { width: 43; glyph: "9"; } | ||
| 298 | Key { width: 43; glyph: "0"; } | ||
| 299 | Key { width: 43; glyph: "←"; } | ||
| 300 | } | ||
| 301 | |||
| 302 | Row { | ||
| 303 | width: keyboardWidth | ||
| 304 | height: keyboardRowHeight | ||
| 305 | anchors.left: parent.left | ||
| 306 | anchors.leftMargin: 4 | ||
| 307 | |||
| 308 | Key { width: 43; glyph: "!"; } | ||
| 309 | Key { width: 43; glyph: "@"; } | ||
| 310 | Key { width: 43; glyph: "#"; } | ||
| 311 | Key { width: 43; glyph: "$"; } | ||
| 312 | Key { width: 43; glyph: "%"; } | ||
| 313 | Key { width: 43; glyph: "^"; } | ||
| 314 | Key { width: 43; glyph: "&"; } | ||
| 315 | Key { width: 43; glyph: "*"; } | ||
| 316 | Key { width: 43; glyph: "("; } | ||
| 317 | Key { width: 43; glyph: ")"; } | ||
| 318 | Key { width: 43; glyph: "⏎"; } | ||
| 319 | } | ||
| 320 | |||
| 321 | Row { | ||
| 322 | width: keyboardWidth | ||
| 323 | height: keyboardRowHeight | ||
| 324 | anchors.left: parent.left | ||
| 325 | anchors.leftMargin: 4 | ||
| 326 | |||
| 327 | Key { | ||
| 328 | id: numericShiftKey | ||
| 329 | width: 43 | ||
| 330 | glyph: "\u21E8" | ||
| 331 | toggle: true | ||
| 332 | onToggledChanged: numericShiftMode = toggled | ||
| 333 | } | ||
| 334 | Key { width: 43; glyph: numericShiftMode ? "`" : "+"; } | ||
| 335 | Key { width: 43; glyph: numericShiftMode ? "~" : "-"; } | ||
| 336 | Key { width: 43; glyph: numericShiftMode ? "\u00A3" : "="; } | ||
| 337 | Key { width: 43; glyph: numericShiftMode ? "\u20AC" : ";"; } | ||
| 338 | Key { width: 43; glyph: numericShiftMode ? "\u00A5" : ":"; } | ||
| 339 | Key { width: 43; glyph: numericShiftMode ? "<" : "'"; } | ||
| 340 | Key { width: 43; glyph: numericShiftMode ? ">" : "\""; } | ||
| 341 | Key { width: 43; glyph: numericShiftMode ? "[" : "{"; } | ||
| 342 | Key { width: 43; glyph: numericShiftMode ? "]" : "}"; } | ||
| 343 | Key { width: 43; glyph: numericShiftMode ? "\\" : "|"; } | ||
| 344 | } | ||
| 345 | |||
| 346 | Row { | ||
| 347 | width: keyboardWidth | ||
| 348 | height: keyboardRowHeight | ||
| 349 | anchors.left: parent.left | ||
| 350 | anchors.leftMargin: 4 | ||
| 351 | |||
| 352 | Key { | ||
| 353 | width: 70 | ||
| 354 | glyph: "abc" | ||
| 355 | mouseArea.onClicked: keyboardBase.parent.punctuationMode = false | ||
| 356 | } | ||
| 357 | Key { width: 231; glyph: " "; } | ||
| 358 | Key { width: 43; glyph: ","; } | ||
| 359 | Key { width: 43; glyph: "."; } | ||
| 360 | Key { | ||
| 361 | fontFamily: "hifi-glyphs"; | ||
| 362 | fontPixelSize: 48; | ||
| 363 | letterAnchors.topMargin: -4; | ||
| 364 | verticalAlignment: Text.AlignVCenter; | ||
| 365 | width: 86; glyph: "\ue02b"; | ||
| 366 | } | ||
| 367 | } | ||
| 368 | } | ||
| 369 | } | ||
| 370 | } | ||
| @@ -0,0 +1,35 @@ | |||
| 1 | // | ||
| 2 | // Label.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 26 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | |||
| 13 | import "../stylesUit" | ||
| 14 | |||
| 15 | RalewaySemiBold { | ||
| 16 | HifiConstants { id: hifi } | ||
| 17 | property int colorScheme: hifi.colorSchemes.light | ||
| 18 | |||
| 19 | size: hifi.fontSizes.inputLabel | ||
| 20 | color: { | ||
| 21 | if (colorScheme === hifi.colorSchemes.dark) { | ||
| 22 | if (enabled) { | ||
| 23 | hifi.colors.lightGrayText | ||
| 24 | } else { | ||
| 25 | hifi.colors.baseGrayHighlight | ||
| 26 | } | ||
| 27 | } else { | ||
| 28 | if (enabled) { | ||
| 29 | hifi.colors.lightGray | ||
| 30 | } else { | ||
| 31 | hifi.colors.lightGrayText | ||
| 32 | } | ||
| 33 | } | ||
| 34 | } | ||
| 35 | } | ||
| @@ -0,0 +1,41 @@ | |||
| 1 | // | ||
| 2 | // QueuedButton.qml | ||
| 3 | // -- original Button.qml + signal timer workaround --ht | ||
| 4 | // Created by David Rowe on 16 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | |||
| 13 | import "../stylesUit" | ||
| 14 | import "." as HifiControls | ||
| 15 | |||
| 16 | HifiControls.Button { | ||
| 17 | // FIXME: THIS WORKAROUND MIGRATED/CONSOLIDATED FROM RUNNINGSCRIPTS.QML | ||
| 18 | |||
| 19 | // For some reason trigginer an API that enters | ||
| 20 | // an internal event loop directly from the button clicked | ||
| 21 | // trigger below causes the appliction to behave oddly. | ||
| 22 | // Most likely because the button onClicked handling is never | ||
| 23 | // completed until the function returns. | ||
| 24 | // FIXME find a better way of handling the input dialogs that | ||
| 25 | // doesn't trigger this. | ||
| 26 | |||
| 27 | // NOTE: dialogs that need to use this workaround can connect via | ||
| 28 | // onQueuedClicked: ... | ||
| 29 | // instead of: | ||
| 30 | // onClicked: ... | ||
| 31 | |||
| 32 | signal clickedQueued() | ||
| 33 | Timer { | ||
| 34 | id: fromTimer | ||
| 35 | interval: 5 | ||
| 36 | repeat: false | ||
| 37 | running: false | ||
| 38 | onTriggered: clickedQueued() | ||
| 39 | } | ||
| 40 | onClicked: fromTimer.running = true | ||
| 41 | } | ||
| @@ -0,0 +1,93 @@ | |||
| 1 | // | ||
| 2 | // RadioButton.qml | ||
| 3 | // | ||
| 4 | // Created by Cain Kilgore on 20th July 2017 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import QtQuick.Controls 2.2 as Original | ||
| 13 | |||
| 14 | import "../stylesUit" | ||
| 15 | import "." as HifiControls | ||
| 16 | |||
| 17 | import TabletScriptingInterface 1.0 | ||
| 18 | |||
| 19 | Original.RadioButton { | ||
| 20 | id: radioButton | ||
| 21 | HifiConstants { id: hifi } | ||
| 22 | |||
| 23 | hoverEnabled: true | ||
| 24 | |||
| 25 | property int colorScheme: hifi.colorSchemes.light | ||
| 26 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 27 | |||
| 28 | property real letterSpacing: 1 | ||
| 29 | property int fontSize: hifi.fontSizes.inputLabel | ||
| 30 | property int boxSize: defaultBoxSize | ||
| 31 | property real scaleFactor: boxSize / defaultBoxSize | ||
| 32 | |||
| 33 | readonly property int defaultBoxSize: 14 | ||
| 34 | readonly property int boxRadius: 3 * scaleFactor | ||
| 35 | readonly property int checkSize: 10 * scaleFactor | ||
| 36 | readonly property int checkRadius: 2 * scaleFactor | ||
| 37 | readonly property int indicatorRadius: 7 * scaleFactor | ||
| 38 | |||
| 39 | onClicked: { | ||
| 40 | Tablet.playSound(TabletEnums.ButtonClick); | ||
| 41 | } | ||
| 42 | |||
| 43 | onHoveredChanged: { | ||
| 44 | if (hovered) { | ||
| 45 | Tablet.playSound(TabletEnums.ButtonHover); | ||
| 46 | } | ||
| 47 | } | ||
| 48 | |||
| 49 | indicator: Rectangle { | ||
| 50 | id: box | ||
| 51 | width: boxSize | ||
| 52 | height: boxSize | ||
| 53 | radius: indicatorRadius | ||
| 54 | x: radioButton.leftPadding | ||
| 55 | y: parent.height / 2 - height / 2 | ||
| 56 | gradient: Gradient { | ||
| 57 | GradientStop { | ||
| 58 | position: 0.2 | ||
| 59 | color: pressed || hovered | ||
| 60 | ? (radioButton.isLightColorScheme ? hifi.colors.checkboxDarkStart : hifi.colors.checkboxLightStart) | ||
| 61 | : (radioButton.isLightColorScheme ? hifi.colors.checkboxLightStart : hifi.colors.checkboxDarkStart) | ||
| 62 | } | ||
| 63 | GradientStop { | ||
| 64 | position: 1.0 | ||
| 65 | color: pressed || hovered | ||
| 66 | ? (radioButton.isLightColorScheme ? hifi.colors.checkboxDarkFinish : hifi.colors.checkboxLightFinish) | ||
| 67 | : (radioButton.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish) | ||
| 68 | } | ||
| 69 | } | ||
| 70 | |||
| 71 | Rectangle { | ||
| 72 | id: check | ||
| 73 | width: checkSize | ||
| 74 | height: checkSize | ||
| 75 | radius: indicatorRadius | ||
| 76 | anchors.centerIn: parent | ||
| 77 | color: "#00B4EF" | ||
| 78 | border.width: 1 | ||
| 79 | border.color: "#36CDFF" | ||
| 80 | visible: checked && !pressed || !checked && pressed | ||
| 81 | } | ||
| 82 | } | ||
| 83 | |||
| 84 | contentItem: RalewaySemiBold { | ||
| 85 | text: radioButton.text | ||
| 86 | size: radioButton.fontSize | ||
| 87 | font.letterSpacing: letterSpacing | ||
| 88 | color: isLightColorScheme ? hifi.colors.lightGray : hifi.colors.lightGrayText | ||
| 89 | horizontalAlignment: Text.AlignHCenter | ||
| 90 | verticalAlignment: Text.AlignVCenter | ||
| 91 | leftPadding: radioButton.indicator.width + radioButton.spacing | ||
| 92 | } | ||
| 93 | } | ||
| @@ -0,0 +1,41 @@ | |||
| 1 | // | ||
| 2 | // ScrollBar.qml | ||
| 3 | // | ||
| 4 | // Created by Vlad Stelmahovsky on 27 Nov 2017 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | import QtQuick.Controls 2.2 | ||
| 13 | |||
| 14 | import "../stylesUit" | ||
| 15 | |||
| 16 | ScrollBar { | ||
| 17 | visible: size < 1.0 | ||
| 18 | |||
| 19 | HifiConstants { id: hifi } | ||
| 20 | property int colorScheme: hifi.colorSchemes.light | ||
| 21 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 22 | |||
| 23 | background: Item { | ||
| 24 | implicitWidth: hifi.dimensions.scrollbarBackgroundWidth | ||
| 25 | Rectangle { | ||
| 26 | anchors { fill: parent; topMargin: 3; bottomMargin: 3 } | ||
| 27 | radius: hifi.dimensions.scrollbarHandleWidth/2 | ||
| 28 | color: isLightColorScheme ? hifi.colors.tableScrollBackgroundLight | ||
| 29 | : hifi.colors.tableScrollBackgroundDark | ||
| 30 | } | ||
| 31 | } | ||
| 32 | |||
| 33 | contentItem: Item { | ||
| 34 | implicitWidth: hifi.dimensions.scrollbarHandleWidth | ||
| 35 | Rectangle { | ||
| 36 | anchors { fill: parent; topMargin: 1; bottomMargin: 1 } | ||
| 37 | radius: hifi.dimensions.scrollbarHandleWidth/2 | ||
| 38 | color: isLightColorScheme ? hifi.colors.tableScrollHandleLight : hifi.colors.tableScrollHandleDark | ||
| 39 | } | ||
| 40 | } | ||
| 41 | } | ||
| @@ -0,0 +1,44 @@ | |||
| 1 | // | ||
| 2 | // Separator.qml | ||
| 3 | // | ||
| 4 | // Created by Zach Fox on 2017-06-06 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import "../stylesUit" | ||
| 13 | |||
| 14 | Item { | ||
| 15 | property int colorScheme: 0; | ||
| 16 | |||
| 17 | readonly property var topColor: [ hifi.colors.baseGrayShadow, hifi.colors.faintGray, "#89858C" ]; | ||
| 18 | readonly property var bottomColor: [ hifi.colors.baseGrayHighlight, hifi.colors.faintGray, "#89858C" ]; | ||
| 19 | |||
| 20 | // Size | ||
| 21 | height: colorScheme === 0 ? 2 : 1; | ||
| 22 | Rectangle { | ||
| 23 | // Size | ||
| 24 | width: parent.width; | ||
| 25 | height: 1; | ||
| 26 | // Anchors | ||
| 27 | anchors.left: parent.left; | ||
| 28 | anchors.bottom: parent.bottom; | ||
| 29 | // Style | ||
| 30 | color: topColor[colorScheme]; | ||
| 31 | } | ||
| 32 | Rectangle { | ||
| 33 | visible: colorScheme === 0; | ||
| 34 | // Size | ||
| 35 | width: parent.width; | ||
| 36 | height: 1; | ||
| 37 | // Anchors | ||
| 38 | anchors.left: parent.left; | ||
| 39 | anchors.bottom: parent.bottom; | ||
| 40 | anchors.bottomMargin: -height; | ||
| 41 | // Style | ||
| 42 | color: bottomColor[colorScheme]; | ||
| 43 | } | ||
| 44 | } | ||
| @@ -0,0 +1,98 @@ | |||
| 1 | // | ||
| 2 | // Slider.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 27 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | import QtQuick.Controls 2.2 | ||
| 13 | |||
| 14 | import "../stylesUit" | ||
| 15 | import "." as HifiControls | ||
| 16 | |||
| 17 | Slider { | ||
| 18 | id: slider | ||
| 19 | |||
| 20 | property int colorScheme: hifi.colorSchemes.light | ||
| 21 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 22 | property string label: "" | ||
| 23 | property real controlHeight: height + (sliderLabel.visible ? sliderLabel.height + sliderLabel.anchors.bottomMargin : 0) | ||
| 24 | |||
| 25 | property alias minimumValue: slider.from | ||
| 26 | property alias maximumValue: slider.to | ||
| 27 | property alias step: slider.stepSize | ||
| 28 | property bool tickmarksEnabled: false | ||
| 29 | |||
| 30 | height: hifi.fontSizes.textFieldInput + 14 // Match height of TextField control. | ||
| 31 | y: sliderLabel.visible ? sliderLabel.height + sliderLabel.anchors.bottomMargin : 0 | ||
| 32 | |||
| 33 | background: Rectangle { | ||
| 34 | x: slider.leftPadding | ||
| 35 | y: slider.topPadding + slider.availableHeight / 2 - height / 2 | ||
| 36 | |||
| 37 | implicitWidth: 50 | ||
| 38 | implicitHeight: hifi.dimensions.sliderGrooveHeight | ||
| 39 | width: slider.availableWidth | ||
| 40 | height: implicitHeight | ||
| 41 | radius: height / 2 | ||
| 42 | color: isLightColorScheme ? hifi.colors.sliderGutterLight : hifi.colors.sliderGutterDark | ||
| 43 | |||
| 44 | Rectangle { | ||
| 45 | width: slider.visualPosition * parent.width | ||
| 46 | height: parent.height | ||
| 47 | radius: height / 2 | ||
| 48 | gradient: Gradient { | ||
| 49 | GradientStop { position: 0.0; color: hifi.colors.blueAccent } | ||
| 50 | GradientStop { position: 1.0; color: hifi.colors.primaryHighlight } | ||
| 51 | } | ||
| 52 | } | ||
| 53 | } | ||
| 54 | |||
| 55 | handle: Rectangle { | ||
| 56 | x: slider.leftPadding + slider.visualPosition * (slider.availableWidth - width) | ||
| 57 | y: slider.topPadding + slider.availableHeight / 2 - height / 2 | ||
| 58 | implicitWidth: hifi.dimensions.sliderHandleSize | ||
| 59 | implicitHeight: hifi.dimensions.sliderHandleSize | ||
| 60 | radius: height / 2 | ||
| 61 | border.width: 1 | ||
| 62 | border.color: isLightColorScheme ? hifi.colors.sliderBorderLight : hifi.colors.sliderBorderDark | ||
| 63 | gradient: Gradient { | ||
| 64 | GradientStop { | ||
| 65 | position: 0.0 | ||
| 66 | color: pressed || hovered | ||
| 67 | ? (isLightColorScheme ? hifi.colors.sliderDarkStart : hifi.colors.sliderLightStart ) | ||
| 68 | : (isLightColorScheme ? hifi.colors.sliderLightStart : hifi.colors.sliderDarkStart ) | ||
| 69 | } | ||
| 70 | GradientStop { | ||
| 71 | position: 1.0 | ||
| 72 | color: pressed || hovered | ||
| 73 | ? (isLightColorScheme ? hifi.colors.sliderDarkFinish : hifi.colors.sliderLightFinish ) | ||
| 74 | : (isLightColorScheme ? hifi.colors.sliderLightFinish : hifi.colors.sliderDarkFinish ) | ||
| 75 | } | ||
| 76 | } | ||
| 77 | |||
| 78 | Rectangle { | ||
| 79 | height: parent.height - 2 | ||
| 80 | width: height | ||
| 81 | radius: height / 2 | ||
| 82 | anchors.centerIn: parent | ||
| 83 | color: hifi.colors.transparent | ||
| 84 | border.width: 1 | ||
| 85 | border.color: hifi.colors.black | ||
| 86 | } | ||
| 87 | } | ||
| 88 | |||
| 89 | HifiControls.Label { | ||
| 90 | id: sliderLabel | ||
| 91 | text: slider.label | ||
| 92 | colorScheme: slider.colorScheme | ||
| 93 | anchors.left: parent.left | ||
| 94 | anchors.bottom: parent.top | ||
| 95 | anchors.bottomMargin: 2 | ||
| 96 | visible: label != "" | ||
| 97 | } | ||
| 98 | } | ||
| @@ -0,0 +1,185 @@ | |||
| 1 | // | ||
| 2 | // SpinBox.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 26 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | import QtQuick.Controls 2.2 | ||
| 13 | |||
| 14 | import "../stylesUit" | ||
| 15 | import "." as HifiControls | ||
| 16 | |||
| 17 | SpinBox { | ||
| 18 | id: spinBox | ||
| 19 | |||
| 20 | HifiConstants { | ||
| 21 | id: hifi | ||
| 22 | } | ||
| 23 | |||
| 24 | inputMethodHints: Qt.ImhFormattedNumbersOnly | ||
| 25 | property int colorScheme: hifi.colorSchemes.light | ||
| 26 | readonly property bool isLightColorScheme: colorScheme === hifi.colorSchemes.light | ||
| 27 | property string label: "" | ||
| 28 | property string suffix: "" | ||
| 29 | property string labelInside: "" | ||
| 30 | property color colorLabelInside: hifi.colors.white | ||
| 31 | property color backgroundColor: isLightColorScheme | ||
| 32 | ? (spinBox.activeFocus ? hifi.colors.white : hifi.colors.lightGray) | ||
| 33 | : (spinBox.activeFocus ? hifi.colors.black : hifi.colors.baseGrayShadow) | ||
| 34 | property real controlHeight: height + (spinBoxLabel.visible ? spinBoxLabel.height + spinBoxLabel.anchors.bottomMargin : 0) | ||
| 35 | property int decimals: 2; | ||
| 36 | property real factor: Math.pow(10, decimals) | ||
| 37 | |||
| 38 | property real minimumValue: 0.0 | ||
| 39 | property real maximumValue: 0.0 | ||
| 40 | |||
| 41 | property real realValue: 0.0 | ||
| 42 | property real realFrom: minimumValue | ||
| 43 | property real realTo: maximumValue | ||
| 44 | property real realStepSize: 1.0 | ||
| 45 | |||
| 46 | signal editingFinished() | ||
| 47 | |||
| 48 | implicitHeight: height | ||
| 49 | implicitWidth: width | ||
| 50 | editable: true | ||
| 51 | |||
| 52 | padding: 0 | ||
| 53 | leftPadding: 0 | ||
| 54 | rightPadding: padding + (up.indicator ? up.indicator.width : 0) | ||
| 55 | topPadding: 0 | ||
| 56 | bottomPadding: 0 | ||
| 57 | |||
| 58 | locale: Qt.locale("en_US") | ||
| 59 | |||
| 60 | onValueModified: realValue = value/factor | ||
| 61 | onValueChanged: realValue = value/factor | ||
| 62 | onRealValueChanged: { | ||
| 63 | var newValue = Math.round(realValue*factor); | ||
| 64 | if(value != newValue) { | ||
| 65 | value = newValue; | ||
| 66 | } | ||
| 67 | } | ||
| 68 | |||
| 69 | stepSize: realStepSize*factor | ||
| 70 | to : realTo*factor | ||
| 71 | from : realFrom*factor | ||
| 72 | |||
| 73 | font.family: "Fira Sans SemiBold" | ||
| 74 | font.pixelSize: hifi.fontSizes.textFieldInput | ||
| 75 | height: hifi.fontSizes.textFieldInput + 13 // Match height of TextField control. | ||
| 76 | |||
| 77 | y: spinBoxLabel.visible ? spinBoxLabel.height + spinBoxLabel.anchors.bottomMargin : 0 | ||
| 78 | |||
| 79 | background: Rectangle { | ||
| 80 | color: backgroundColor | ||
| 81 | border.color: spinBoxLabelInside.visible ? spinBoxLabelInside.color : hifi.colors.primaryHighlight | ||
| 82 | border.width: spinBox.activeFocus ? spinBoxLabelInside.visible ? 2 : 1 : 0 | ||
| 83 | } | ||
| 84 | |||
| 85 | validator: DoubleValidator { | ||
| 86 | bottom: Math.min(spinBox.from, spinBox.to) | ||
| 87 | top: Math.max(spinBox.from, spinBox.to) | ||
| 88 | } | ||
| 89 | |||
| 90 | textFromValue: function(value, locale) { | ||
| 91 | return parseFloat(value/factor).toFixed(decimals); | ||
| 92 | } | ||
| 93 | |||
| 94 | valueFromText: function(text, locale) { | ||
| 95 | return Number.fromLocaleString(locale, text)*factor; | ||
| 96 | } | ||
| 97 | |||
| 98 | |||
| 99 | contentItem: TextInput { | ||
| 100 | z: 2 | ||
| 101 | color: isLightColorScheme | ||
| 102 | ? (spinBox.activeFocus ? hifi.colors.black : hifi.colors.lightGray) | ||
| 103 | : (spinBox.activeFocus ? hifi.colors.white : hifi.colors.lightGrayText) | ||
| 104 | selectedTextColor: hifi.colors.black | ||
| 105 | selectionColor: hifi.colors.primaryHighlight | ||
| 106 | text: spinBox.textFromValue(spinBox.value, spinBox.locale) + suffix | ||
| 107 | inputMethodHints: spinBox.inputMethodHints | ||
| 108 | validator: spinBox.validator | ||
| 109 | verticalAlignment: Qt.AlignVCenter | ||
| 110 | leftPadding: spinBoxLabelInside.visible ? 30 : hifi.dimensions.textPadding | ||
| 111 | //rightPadding: hifi.dimensions.spinnerSize | ||
| 112 | width: spinBox.width - hifi.dimensions.spinnerSize | ||
| 113 | onEditingFinished: spinBox.editingFinished() | ||
| 114 | } | ||
| 115 | |||
| 116 | up.indicator: Item { | ||
| 117 | x: spinBox.width - implicitWidth - 5 | ||
| 118 | y: 1 | ||
| 119 | clip: true | ||
| 120 | implicitHeight: spinBox.implicitHeight/2 | ||
| 121 | implicitWidth: spinBox.implicitHeight/2 | ||
| 122 | HiFiGlyphs { | ||
| 123 | anchors.centerIn: parent | ||
| 124 | text: hifi.glyphs.caratUp | ||
| 125 | size: hifi.dimensions.spinnerSize | ||
| 126 | color: spinBox.up.pressed || spinBox.up.hovered ? (isLightColorScheme ? hifi.colors.black : hifi.colors.white) : hifi.colors.gray | ||
| 127 | } | ||
| 128 | } | ||
| 129 | up.onPressedChanged: { | ||
| 130 | if(value) { | ||
| 131 | spinBox.forceActiveFocus(); | ||
| 132 | } | ||
| 133 | } | ||
| 134 | |||
| 135 | down.indicator: Item { | ||
| 136 | x: spinBox.width - implicitWidth - 5 | ||
| 137 | y: spinBox.implicitHeight/2 | ||
| 138 | clip: true | ||
| 139 | implicitHeight: spinBox.implicitHeight/2 | ||
| 140 | implicitWidth: spinBox.implicitHeight/2 | ||
| 141 | HiFiGlyphs { | ||
| 142 | anchors.centerIn: parent | ||
| 143 | text: hifi.glyphs.caratDn | ||
| 144 | size: hifi.dimensions.spinnerSize | ||
| 145 | color: spinBox.down.pressed || spinBox.down.hovered ? (isLightColorScheme ? hifi.colors.black : hifi.colors.white) : hifi.colors.gray | ||
| 146 | } | ||
| 147 | } | ||
| 148 | down.onPressedChanged: { | ||
| 149 | if(value) { | ||
| 150 | spinBox.forceActiveFocus(); | ||
| 151 | } | ||
| 152 | } | ||
| 153 | |||
| 154 | HifiControls.Label { | ||
| 155 | id: spinBoxLabel | ||
| 156 | text: spinBox.label | ||
| 157 | colorScheme: spinBox.colorScheme | ||
| 158 | anchors.left: parent.left | ||
| 159 | anchors.bottom: parent.top | ||
| 160 | anchors.bottomMargin: 4 | ||
| 161 | visible: label != "" | ||
| 162 | } | ||
| 163 | |||
| 164 | HifiControls.Label { | ||
| 165 | id: spinBoxLabelInside | ||
| 166 | text: spinBox.labelInside | ||
| 167 | anchors.left: parent.left | ||
| 168 | anchors.leftMargin: 10 | ||
| 169 | font.bold: true | ||
| 170 | anchors.verticalCenter: parent.verticalCenter | ||
| 171 | color: spinBox.colorLabelInside | ||
| 172 | visible: spinBox.labelInside != "" | ||
| 173 | } | ||
| 174 | |||
| 175 | MouseArea { | ||
| 176 | anchors.fill: parent | ||
| 177 | acceptedButtons: Qt.NoButton | ||
| 178 | onWheel: { | ||
| 179 | if (wheel.angleDelta.y > 0) | ||
| 180 | value += stepSize | ||
| 181 | else | ||
| 182 | value -= stepSize | ||
| 183 | } | ||
| 184 | } | ||
| 185 | } | ||
| @@ -0,0 +1,160 @@ | |||
| 1 | // | ||
| 2 | // Switch.qml | ||
| 3 | // | ||
| 4 | // Created by Zach Fox on 2017-06-06 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.7 | ||
| 12 | import QtQuick.Controls 2.2 as Original | ||
| 13 | |||
| 14 | import "../stylesUit" | ||
| 15 | |||
| 16 | Item { | ||
| 17 | id: rootSwitch; | ||
| 18 | |||
| 19 | property int colorScheme: hifi.colorSchemes.light; | ||
| 20 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light; | ||
| 21 | property int switchWidth: 70; | ||
| 22 | readonly property int switchRadius: height/2; | ||
| 23 | property string labelTextOff: ""; | ||
| 24 | property string labelGlyphOffText: ""; | ||
| 25 | property int labelGlyphOffSize: 32; | ||
| 26 | property string labelTextOn: ""; | ||
| 27 | property string labelGlyphOnText: ""; | ||
| 28 | property int labelGlyphOnSize: 32; | ||
| 29 | property alias checked: originalSwitch.checked; | ||
| 30 | signal onCheckedChanged; | ||
| 31 | signal clicked; | ||
| 32 | |||
| 33 | Original.Switch { | ||
| 34 | id: originalSwitch; | ||
| 35 | focusPolicy: Qt.ClickFocus | ||
| 36 | anchors.top: rootSwitch.top; | ||
| 37 | anchors.left: rootSwitch.left; | ||
| 38 | anchors.leftMargin: rootSwitch.width/2 - rootSwitch.switchWidth/2; | ||
| 39 | onCheckedChanged: rootSwitch.onCheckedChanged(); | ||
| 40 | onClicked: rootSwitch.clicked(); | ||
| 41 | hoverEnabled: true | ||
| 42 | |||
| 43 | topPadding: 3; | ||
| 44 | leftPadding: 3; | ||
| 45 | rightPadding: 3; | ||
| 46 | bottomPadding: 3; | ||
| 47 | |||
| 48 | onHoveredChanged: { | ||
| 49 | if (hovered) { | ||
| 50 | switchHandle.color = hifi.colors.blueHighlight; | ||
| 51 | } else { | ||
| 52 | switchHandle.color = hifi.colors.lightGray; | ||
| 53 | } | ||
| 54 | } | ||
| 55 | |||
| 56 | background: Rectangle { | ||
| 57 | color: "#252525"; | ||
| 58 | implicitWidth: rootSwitch.switchWidth; | ||
| 59 | implicitHeight: rootSwitch.height; | ||
| 60 | radius: rootSwitch.switchRadius; | ||
| 61 | } | ||
| 62 | |||
| 63 | indicator: Rectangle { | ||
| 64 | id: switchHandle; | ||
| 65 | implicitWidth: rootSwitch.height - originalSwitch.topPadding - originalSwitch.bottomPadding; | ||
| 66 | implicitHeight: implicitWidth; | ||
| 67 | radius: implicitWidth/2; | ||
| 68 | border.color: hifi.colors.lightGrayText; | ||
| 69 | color: hifi.colors.lightGray; | ||
| 70 | //x: originalSwitch.leftPadding | ||
| 71 | x: Math.max(0, Math.min(parent.width - width, originalSwitch.visualPosition * parent.width - (width / 2))) | ||
| 72 | y: parent.height / 2 - height / 2 | ||
| 73 | Behavior on x { | ||
| 74 | enabled: !originalSwitch.down | ||
| 75 | SmoothedAnimation { velocity: 200 } | ||
| 76 | } | ||
| 77 | |||
| 78 | } | ||
| 79 | } | ||
| 80 | |||
| 81 | // OFF Label | ||
| 82 | Item { | ||
| 83 | anchors.right: originalSwitch.left; | ||
| 84 | anchors.rightMargin: 10; | ||
| 85 | anchors.top: rootSwitch.top; | ||
| 86 | height: rootSwitch.height; | ||
| 87 | |||
| 88 | RalewaySemiBold { | ||
| 89 | id: labelOff; | ||
| 90 | text: labelTextOff; | ||
| 91 | size: hifi.fontSizes.inputLabel; | ||
| 92 | color: originalSwitch.checked ? hifi.colors.lightGrayText : "#FFFFFF"; | ||
| 93 | anchors.top: parent.top; | ||
| 94 | anchors.right: parent.right; | ||
| 95 | width: paintedWidth; | ||
| 96 | height: parent.height; | ||
| 97 | verticalAlignment: Text.AlignVCenter; | ||
| 98 | } | ||
| 99 | |||
| 100 | HiFiGlyphs { | ||
| 101 | id: labelGlyphOff; | ||
| 102 | text: labelGlyphOffText; | ||
| 103 | size: labelGlyphOffSize; | ||
| 104 | color: labelOff.color; | ||
| 105 | anchors.top: parent.top; | ||
| 106 | anchors.topMargin: 2; | ||
| 107 | anchors.right: labelOff.left; | ||
| 108 | anchors.rightMargin: 4; | ||
| 109 | } | ||
| 110 | |||
| 111 | MouseArea { | ||
| 112 | anchors.top: parent.top; | ||
| 113 | anchors.bottom: parent.bottom; | ||
| 114 | anchors.left: labelGlyphOff.left; | ||
| 115 | anchors.right: labelOff.right; | ||
| 116 | onClicked: { | ||
| 117 | originalSwitch.checked = false; | ||
| 118 | } | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | // ON Label | ||
| 123 | Item { | ||
| 124 | anchors.left: originalSwitch.right; | ||
| 125 | anchors.leftMargin: 10; | ||
| 126 | anchors.top: rootSwitch.top; | ||
| 127 | height: rootSwitch.height; | ||
| 128 | |||
| 129 | RalewaySemiBold { | ||
| 130 | id: labelOn; | ||
| 131 | text: labelTextOn; | ||
| 132 | size: hifi.fontSizes.inputLabel; | ||
| 133 | color: originalSwitch.checked ? "#FFFFFF" : hifi.colors.lightGrayText; | ||
| 134 | anchors.top: parent.top; | ||
| 135 | anchors.left: parent.left; | ||
| 136 | width: paintedWidth; | ||
| 137 | height: parent.height; | ||
| 138 | verticalAlignment: Text.AlignVCenter; | ||
| 139 | } | ||
| 140 | |||
| 141 | HiFiGlyphs { | ||
| 142 | id: labelGlyphOn; | ||
| 143 | text: labelGlyphOnText; | ||
| 144 | size: labelGlyphOnSize; | ||
| 145 | color: labelOn.color; | ||
| 146 | anchors.top: parent.top; | ||
| 147 | anchors.left: labelOn.right; | ||
| 148 | } | ||
| 149 | |||
| 150 | MouseArea { | ||
| 151 | anchors.top: parent.top; | ||
| 152 | anchors.bottom: parent.bottom; | ||
| 153 | anchors.left: labelOn.left; | ||
| 154 | anchors.right: labelGlyphOn.right; | ||
| 155 | onClicked: { | ||
| 156 | originalSwitch.checked = true; | ||
| 157 | } | ||
| 158 | } | ||
| 159 | } | ||
| 160 | } | ||
| @@ -0,0 +1,165 @@ | |||
| 1 | // | ||
| 2 | // Table.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 18 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import QtQuick.Controls 1.4 | ||
| 13 | import QtQuick.Controls.Styles 1.4 | ||
| 14 | import QtQuick.Controls 2.3 as QQC2 | ||
| 15 | |||
| 16 | import "../stylesUit" | ||
| 17 | |||
| 18 | TableView { | ||
| 19 | id: tableView | ||
| 20 | |||
| 21 | property int colorScheme: hifi.colorSchemes.light | ||
| 22 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 23 | property bool expandSelectedRow: false | ||
| 24 | property bool centerHeaderText: false | ||
| 25 | readonly property real headerSpacing: 3 //spacing between sort indicator and table header title | ||
| 26 | property var titlePaintedPos: [] // storing extra data position behind painted | ||
| 27 | // title text and sort indicatorin table's header | ||
| 28 | signal titlePaintedPosSignal(int column) //signal that extradata position gets changed | ||
| 29 | |||
| 30 | model: ListModel { } | ||
| 31 | |||
| 32 | Component.onCompleted: { | ||
| 33 | if (flickableItem !== null && flickableItem !== undefined) { | ||
| 34 | tableView.flickableItem.QQC2.ScrollBar.vertical = scrollbar | ||
| 35 | } | ||
| 36 | } | ||
| 37 | |||
| 38 | QQC2.ScrollBar { | ||
| 39 | id: scrollbar | ||
| 40 | parent: tableView.flickableItem | ||
| 41 | policy: QQC2.ScrollBar.AsNeeded | ||
| 42 | orientation: Qt.Vertical | ||
| 43 | visible: size < 1.0 | ||
| 44 | topPadding: tableView.headerVisible ? hifi.dimensions.tableHeaderHeight + 1 : 1 | ||
| 45 | anchors.top: tableView.top | ||
| 46 | anchors.left: tableView.right | ||
| 47 | anchors.bottom: tableView.bottom | ||
| 48 | |||
| 49 | background: Item { | ||
| 50 | implicitWidth: hifi.dimensions.scrollbarBackgroundWidth | ||
| 51 | Rectangle { | ||
| 52 | anchors { | ||
| 53 | fill: parent; | ||
| 54 | topMargin: tableView.headerVisible ? hifi.dimensions.tableHeaderHeight : 0 | ||
| 55 | } | ||
| 56 | color: isLightColorScheme ? hifi.colors.tableScrollBackgroundLight | ||
| 57 | : hifi.colors.tableScrollBackgroundDark | ||
| 58 | } | ||
| 59 | } | ||
| 60 | |||
| 61 | contentItem: Item { | ||
| 62 | implicitWidth: hifi.dimensions.scrollbarHandleWidth | ||
| 63 | Rectangle { | ||
| 64 | anchors.fill: parent | ||
| 65 | radius: (width - 4)/2 | ||
| 66 | color: isLightColorScheme ? hifi.colors.tableScrollHandleLight : hifi.colors.tableScrollHandleDark | ||
| 67 | } | ||
| 68 | } | ||
| 69 | } | ||
| 70 | |||
| 71 | headerVisible: false | ||
| 72 | headerDelegate: Rectangle { | ||
| 73 | height: hifi.dimensions.tableHeaderHeight | ||
| 74 | color: isLightColorScheme ? hifi.colors.tableBackgroundLight : hifi.colors.tableBackgroundDark | ||
| 75 | |||
| 76 | |||
| 77 | RalewayRegular { | ||
| 78 | id: titleText | ||
| 79 | x: centerHeaderText ? (parent.width - paintedWidth - | ||
| 80 | ((sortIndicatorVisible && | ||
| 81 | sortIndicatorColumn === styleData.column) ? | ||
| 82 | (titleSort.paintedWidth / 5 + tableView.headerSpacing) : 0)) / 2 : | ||
| 83 | hifi.dimensions.tablePadding | ||
| 84 | text: styleData.value | ||
| 85 | size: hifi.fontSizes.tableHeading | ||
| 86 | font.capitalization: Font.AllUppercase | ||
| 87 | color: hifi.colors.baseGrayHighlight | ||
| 88 | horizontalAlignment: (centerHeaderText ? Text.AlignHCenter : Text.AlignLeft) | ||
| 89 | anchors.verticalCenter: parent.verticalCenter | ||
| 90 | } | ||
| 91 | |||
| 92 | //actual image of sort indicator in glyph font only 20% of real font size | ||
| 93 | //i.e. if the charachter size set to 60 pixels, actual image is 12 pixels | ||
| 94 | HiFiGlyphs { | ||
| 95 | id: titleSort | ||
| 96 | text: sortIndicatorOrder == Qt.AscendingOrder ? hifi.glyphs.caratUp : hifi.glyphs.caratDn | ||
| 97 | color: hifi.colors.darkGray | ||
| 98 | opacity: 0.6; | ||
| 99 | size: hifi.fontSizes.tableHeadingIcon | ||
| 100 | anchors.verticalCenter: titleText.verticalCenter | ||
| 101 | anchors.left: titleText.right | ||
| 102 | anchors.leftMargin: -(hifi.fontSizes.tableHeadingIcon / 2.5) + tableView.headerSpacing | ||
| 103 | visible: sortIndicatorVisible && sortIndicatorColumn === styleData.column | ||
| 104 | onXChanged: { | ||
| 105 | titlePaintedPos[styleData.column] = titleText.x + titleText.paintedWidth + | ||
| 106 | paintedWidth / 5 + tableView.headerSpacing*2 | ||
| 107 | titlePaintedPosSignal(styleData.column) | ||
| 108 | } | ||
| 109 | } | ||
| 110 | |||
| 111 | Rectangle { | ||
| 112 | width: 1 | ||
| 113 | anchors { | ||
| 114 | left: parent.left | ||
| 115 | top: parent.top | ||
| 116 | topMargin: 1 | ||
| 117 | bottom: parent.bottom | ||
| 118 | bottomMargin: 2 | ||
| 119 | } | ||
| 120 | color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight | ||
| 121 | visible: styleData.column > 0 | ||
| 122 | } | ||
| 123 | |||
| 124 | Rectangle { | ||
| 125 | height: 1 | ||
| 126 | anchors { | ||
| 127 | left: parent.left | ||
| 128 | right: parent.right | ||
| 129 | bottom: parent.bottom | ||
| 130 | } | ||
| 131 | color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight | ||
| 132 | } | ||
| 133 | } | ||
| 134 | |||
| 135 | // Use rectangle to draw border with rounded corners. | ||
| 136 | frameVisible: false | ||
| 137 | Rectangle { | ||
| 138 | color: "#00000000" | ||
| 139 | anchors { fill: parent; margins: -2 } | ||
| 140 | border.color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight | ||
| 141 | border.width: 2 | ||
| 142 | } | ||
| 143 | anchors.margins: 2 // Shrink TableView to lie within border. | ||
| 144 | |||
| 145 | backgroundVisible: true | ||
| 146 | |||
| 147 | horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff | ||
| 148 | verticalScrollBarPolicy: Qt.ScrollBarAlwaysOff | ||
| 149 | |||
| 150 | style: TableViewStyle { | ||
| 151 | // Needed in order for rows to keep displaying rows after end of table entries. | ||
| 152 | backgroundColor: tableView.isLightColorScheme ? hifi.colors.tableBackgroundLight : hifi.colors.tableBackgroundDark | ||
| 153 | alternateBackgroundColor: tableView.isLightColorScheme ? hifi.colors.tableRowLightOdd : hifi.colors.tableRowDarkOdd | ||
| 154 | padding.top: headerVisible ? hifi.dimensions.tableHeaderHeight: 0 | ||
| 155 | } | ||
| 156 | |||
| 157 | rowDelegate: Rectangle { | ||
| 158 | height: (styleData.selected && expandSelectedRow ? 1.8 : 1) * hifi.dimensions.tableRowHeight | ||
| 159 | color: styleData.selected | ||
| 160 | ? hifi.colors.primaryHighlight | ||
| 161 | : tableView.isLightColorScheme | ||
| 162 | ? (styleData.alternate ? hifi.colors.tableRowLightEven : hifi.colors.tableRowLightOdd) | ||
| 163 | : (styleData.alternate ? hifi.colors.tableRowDarkEven : hifi.colors.tableRowDarkOdd) | ||
| 164 | } | ||
| 165 | } | ||
| @@ -0,0 +1,138 @@ | |||
| 1 | // | ||
| 2 | // ContentSection.qml | ||
| 3 | // | ||
| 4 | // Created by Dante Ruiz on 13 Feb 2017 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import QtGraphicalEffects 1.0 | ||
| 13 | |||
| 14 | import "../stylesUit" | ||
| 15 | |||
| 16 | Column { | ||
| 17 | property string name: "Content Section" | ||
| 18 | property bool isFirst: false | ||
| 19 | property bool isCollapsible: false // Set at creation. | ||
| 20 | property bool isCollapsed: false | ||
| 21 | |||
| 22 | spacing: 0 // Defer spacing decisions to individual controls. | ||
| 23 | |||
| 24 | anchors { | ||
| 25 | left: parent.left | ||
| 26 | leftMargin: hifi.dimensions.contentMargin.x | ||
| 27 | right: parent.right | ||
| 28 | rightMargin: hifi.dimensions.contentMargin.x | ||
| 29 | } | ||
| 30 | |||
| 31 | function toggleCollapsed() { | ||
| 32 | if (isCollapsible) { | ||
| 33 | isCollapsed = !isCollapsed; | ||
| 34 | for (var i = 1; i < children.length; i++) { | ||
| 35 | children[i].visible = !isCollapsed; | ||
| 36 | } | ||
| 37 | } | ||
| 38 | } | ||
| 39 | |||
| 40 | Item { | ||
| 41 | id: sectionName | ||
| 42 | anchors.left: parent.left | ||
| 43 | anchors.right: parent.right | ||
| 44 | height: leadingSpace.height + topBar.height + heading.height + bottomBar.height | ||
| 45 | |||
| 46 | Item { | ||
| 47 | id: leadingSpace | ||
| 48 | width: 1 | ||
| 49 | height: isFirst ? 7 : 0 | ||
| 50 | anchors.top: parent.top | ||
| 51 | } | ||
| 52 | |||
| 53 | Item { | ||
| 54 | id: topBar | ||
| 55 | visible: !isFirst | ||
| 56 | height: visible ? 2 : 0 | ||
| 57 | anchors.top: leadingSpace.bottom | ||
| 58 | |||
| 59 | Rectangle { | ||
| 60 | id: shadow | ||
| 61 | width: 480 | ||
| 62 | height: 1 | ||
| 63 | color: hifi.colors.baseGrayShadow | ||
| 64 | x: -hifi.dimensions.contentMargin.x | ||
| 65 | } | ||
| 66 | |||
| 67 | Rectangle { | ||
| 68 | width: 480 | ||
| 69 | height: 1 | ||
| 70 | color: hifi.colors.baseGrayHighlight | ||
| 71 | x: -hifi.dimensions.contentMargin.x | ||
| 72 | anchors.top: shadow.bottom | ||
| 73 | } | ||
| 74 | } | ||
| 75 | |||
| 76 | Item { | ||
| 77 | id: heading | ||
| 78 | anchors { | ||
| 79 | left: parent.left | ||
| 80 | right: parent.right | ||
| 81 | top: topBar.bottom | ||
| 82 | } | ||
| 83 | height: isCollapsible ? 36 : 28 | ||
| 84 | |||
| 85 | RalewayRegular { | ||
| 86 | id: title | ||
| 87 | anchors { | ||
| 88 | left: parent.left | ||
| 89 | top: parent.top | ||
| 90 | topMargin: 12 | ||
| 91 | } | ||
| 92 | size: hifi.fontSizes.sectionName | ||
| 93 | font.capitalization: Font.AllUppercase | ||
| 94 | text: name | ||
| 95 | color: hifi.colors.lightGrayText | ||
| 96 | } | ||
| 97 | |||
| 98 | HiFiGlyphs { | ||
| 99 | anchors { | ||
| 100 | top: title.top | ||
| 101 | topMargin: -9 | ||
| 102 | right: parent.right | ||
| 103 | rightMargin: -4 | ||
| 104 | } | ||
| 105 | size: hifi.fontSizes.disclosureButton | ||
| 106 | text: isCollapsed ? hifi.glyphs.disclosureButtonExpand : hifi.glyphs.disclosureButtonCollapse | ||
| 107 | color: hifi.colors.lightGrayText | ||
| 108 | visible: isCollapsible | ||
| 109 | } | ||
| 110 | |||
| 111 | MouseArea { | ||
| 112 | // Events are propogated so that any active control is defocused. | ||
| 113 | anchors.fill: parent | ||
| 114 | propagateComposedEvents: true | ||
| 115 | onPressed: { | ||
| 116 | toggleCollapsed(); | ||
| 117 | mouse.accepted = false; | ||
| 118 | } | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | LinearGradient { | ||
| 123 | id: bottomBar | ||
| 124 | visible: false | ||
| 125 | width: 480 | ||
| 126 | height: visible ? 4 : 0 | ||
| 127 | x: -hifi.dimensions.contentMargin.x | ||
| 128 | anchors.top: heading.bottom | ||
| 129 | start: Qt.point(0, 0) | ||
| 130 | end: Qt.point(0, 4) | ||
| 131 | gradient: Gradient { | ||
| 132 | GradientStop { position: 0.0; color: hifi.colors.darkGray } | ||
| 133 | GradientStop { position: 1.0; color: hifi.colors.baseGray } // Equivalent of darkGray0 over baseGray background. | ||
| 134 | } | ||
| 135 | cached: true | ||
| 136 | } | ||
| 137 | } | ||
| 138 | } | ||
| @@ -0,0 +1,34 @@ | |||
| 1 | // | ||
| 2 | // TabletHeader.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 11 Mar 2017. | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | |||
| 13 | import "../stylesUit" | ||
| 14 | |||
| 15 | Rectangle { | ||
| 16 | |||
| 17 | property string title: "" | ||
| 18 | |||
| 19 | HifiConstants { id: hifi } | ||
| 20 | |||
| 21 | height: hifi.dimensions.tabletMenuHeader | ||
| 22 | z: 100 | ||
| 23 | |||
| 24 | color: hifi.colors.darkGray | ||
| 25 | |||
| 26 | RalewayBold { | ||
| 27 | text: title | ||
| 28 | size: 26 | ||
| 29 | color: hifi.colors.white | ||
| 30 | anchors.verticalCenter: parent.verticalCenter | ||
| 31 | anchors.left: parent.left | ||
| 32 | anchors.leftMargin: hifi.dimensions.contentMargin.x | ||
| 33 | } | ||
| 34 | } | ||
| @@ -0,0 +1,65 @@ | |||
| 1 | // | ||
| 2 | // TextField.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 21 Apr 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | |||
| 13 | import "../stylesUit" | ||
| 14 | import "." as HifiControls | ||
| 15 | |||
| 16 | Item { | ||
| 17 | property string icon: "" | ||
| 18 | property int iconSize: 30 | ||
| 19 | property string text: "" | ||
| 20 | |||
| 21 | property int colorScheme: hifi.colorSchemes.light | ||
| 22 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 23 | |||
| 24 | signal clicked() | ||
| 25 | |||
| 26 | height: Math.max(glyph.visible ? glyph.height - 4 : 0, string.visible ? string.height : 0) | ||
| 27 | width: glyph.width + string.anchors.leftMargin + string.width | ||
| 28 | |||
| 29 | HiFiGlyphs { | ||
| 30 | id: glyph | ||
| 31 | anchors.left: parent.left | ||
| 32 | anchors.top: parent.top | ||
| 33 | anchors.topMargin: -2 | ||
| 34 | text: parent.icon | ||
| 35 | size: parent.iconSize | ||
| 36 | color: isLightColorScheme | ||
| 37 | ? (mouseArea.containsMouse ? hifi.colors.baseGrayHighlight : hifi.colors.lightGray) | ||
| 38 | : (mouseArea.containsMouse ? hifi.colors.faintGray : hifi.colors.lightGrayText) | ||
| 39 | visible: text !== "" | ||
| 40 | width: visible ? implicitWidth : 0 | ||
| 41 | } | ||
| 42 | |||
| 43 | RalewaySemiBold { | ||
| 44 | id: string | ||
| 45 | anchors { | ||
| 46 | left: glyph.visible ? glyph.right : parent.left | ||
| 47 | leftMargin: visible && glyph.visible ? hifi.dimensions.contentSpacing.x : 0 | ||
| 48 | verticalCenter: glyph.visible ? glyph.verticalCenter : undefined | ||
| 49 | } | ||
| 50 | text: parent.text | ||
| 51 | size: hifi.fontSizes.inputLabel | ||
| 52 | color: isLightColorScheme | ||
| 53 | ? (mouseArea.containsMouse ? hifi.colors.baseGrayHighlight : hifi.colors.lightGray) | ||
| 54 | : (mouseArea.containsMouse ? hifi.colors.faintGray : hifi.colors.lightGrayText) | ||
| 55 | font.underline: true; | ||
| 56 | visible: text !== "" | ||
| 57 | } | ||
| 58 | |||
| 59 | MouseArea { | ||
| 60 | id: mouseArea | ||
| 61 | anchors.fill: parent | ||
| 62 | hoverEnabled: true | ||
| 63 | onClicked: parent.clicked() | ||
| 64 | } | ||
| 65 | } | ||
| @@ -0,0 +1,23 @@ | |||
| 1 | // | ||
| 2 | // TextEdit.qml | ||
| 3 | // | ||
| 4 | // Created by Bradley Austin Davis on 24 Apr 2015 | ||
| 5 | // Copyright 2015 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import "../stylesUit" | ||
| 13 | |||
| 14 | TextEdit { | ||
| 15 | |||
| 16 | property real size: 32 | ||
| 17 | |||
| 18 | font.family: "Raleway" | ||
| 19 | font.weight: Font.DemiBold | ||
| 20 | font.pointSize: size | ||
| 21 | verticalAlignment: Text.AlignVCenter | ||
| 22 | horizontalAlignment: Text.AlignLeft | ||
| 23 | } | ||
| @@ -0,0 +1,180 @@ | |||
| 1 | // | ||
| 2 | // TextField.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 17 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import QtQuick.Controls 1.4 | ||
| 13 | import QtQuick.Controls.Styles 1.4 | ||
| 14 | |||
| 15 | import "../stylesUit" | ||
| 16 | import "." as HifiControls | ||
| 17 | |||
| 18 | TextField { | ||
| 19 | id: textField | ||
| 20 | |||
| 21 | property int colorScheme: hifi.colorSchemes.light | ||
| 22 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 23 | readonly property bool isFaintGrayColorScheme: colorScheme == hifi.colorSchemes.faintGray | ||
| 24 | property bool isSearchField: false | ||
| 25 | property string label: "" | ||
| 26 | property real controlHeight: height + (textFieldLabel.visible ? textFieldLabel.height + 1 : 0) | ||
| 27 | property bool hasDefocusedBorder: true; | ||
| 28 | property bool hasRoundedBorder: false | ||
| 29 | property int roundedBorderRadius: 4 | ||
| 30 | property bool error: false; | ||
| 31 | property bool hasClearButton: false; | ||
| 32 | property string leftPermanentGlyph: ""; | ||
| 33 | property string centerPlaceholderGlyph: ""; | ||
| 34 | |||
| 35 | placeholderText: textField.placeholderText | ||
| 36 | |||
| 37 | font.family: "Fira Sans" | ||
| 38 | font.pixelSize: hifi.fontSizes.textFieldInput | ||
| 39 | height: implicitHeight + 3 // Make surrounding box higher so that highlight is vertically centered. | ||
| 40 | property alias textFieldLabel: textFieldLabel | ||
| 41 | |||
| 42 | y: textFieldLabel.visible ? textFieldLabel.height + textFieldLabel.anchors.bottomMargin : 0 | ||
| 43 | |||
| 44 | // workaround for https://bugreports.qt.io/browse/QTBUG-49297 | ||
| 45 | Keys.onPressed: { | ||
| 46 | switch (event.key) { | ||
| 47 | case Qt.Key_Return: | ||
| 48 | case Qt.Key_Enter: | ||
| 49 | event.accepted = true; | ||
| 50 | |||
| 51 | // emit accepted signal manually | ||
| 52 | if (acceptableInput) { | ||
| 53 | accepted(); | ||
| 54 | } | ||
| 55 | } | ||
| 56 | } | ||
| 57 | |||
| 58 | style: TextFieldStyle { | ||
| 59 | id: style; | ||
| 60 | textColor: { | ||
| 61 | if (isLightColorScheme) { | ||
| 62 | if (textField.activeFocus) { | ||
| 63 | hifi.colors.black | ||
| 64 | } else { | ||
| 65 | hifi.colors.lightGray | ||
| 66 | } | ||
| 67 | } else if (isFaintGrayColorScheme) { | ||
| 68 | if (textField.activeFocus) { | ||
| 69 | hifi.colors.black | ||
| 70 | } else { | ||
| 71 | hifi.colors.lightGray | ||
| 72 | } | ||
| 73 | } else { | ||
| 74 | if (textField.activeFocus) { | ||
| 75 | hifi.colors.white | ||
| 76 | } else { | ||
| 77 | hifi.colors.lightGrayText | ||
| 78 | } | ||
| 79 | } | ||
| 80 | } | ||
| 81 | background: Rectangle { | ||
| 82 | color: { | ||
| 83 | if (isLightColorScheme) { | ||
| 84 | if (textField.activeFocus) { | ||
| 85 | hifi.colors.white | ||
| 86 | } else { | ||
| 87 | hifi.colors.textFieldLightBackground | ||
| 88 | } | ||
| 89 | } else if (isFaintGrayColorScheme) { | ||
| 90 | if (textField.activeFocus) { | ||
| 91 | hifi.colors.white | ||
| 92 | } else { | ||
| 93 | hifi.colors.faintGray50 | ||
| 94 | } | ||
| 95 | } else { | ||
| 96 | if (textField.activeFocus) { | ||
| 97 | hifi.colors.black | ||
| 98 | } else { | ||
| 99 | hifi.colors.baseGrayShadow | ||
| 100 | } | ||
| 101 | } | ||
| 102 | } | ||
| 103 | border.color: textField.error ? hifi.colors.redHighlight : | ||
| 104 | (textField.activeFocus ? hifi.colors.primaryHighlight : (hasDefocusedBorder ? (isFaintGrayColorScheme ? hifi.colors.lightGrayText : hifi.colors.lightGray) : color)) | ||
| 105 | border.width: textField.activeFocus || hasRoundedBorder || textField.error ? 1 : 0 | ||
| 106 | radius: isSearchField ? textField.height / 2 : (hasRoundedBorder ? roundedBorderRadius : 0) | ||
| 107 | |||
| 108 | HiFiGlyphs { | ||
| 109 | text: textField.leftPermanentGlyph; | ||
| 110 | color: textColor; | ||
| 111 | size: hifi.fontSizes.textFieldSearchIcon; | ||
| 112 | anchors.left: parent.left; | ||
| 113 | anchors.verticalCenter: parent.verticalCenter; | ||
| 114 | anchors.leftMargin: hifi.dimensions.textPadding - 2; | ||
| 115 | visible: text; | ||
| 116 | } | ||
| 117 | |||
| 118 | HiFiGlyphs { | ||
| 119 | text: textField.centerPlaceholderGlyph; | ||
| 120 | color: textColor; | ||
| 121 | size: parent.height; | ||
| 122 | anchors.horizontalCenter: parent.horizontalCenter; | ||
| 123 | anchors.verticalCenter: parent.verticalCenter; | ||
| 124 | visible: text && !textField.focus && textField.text === ""; | ||
| 125 | } | ||
| 126 | |||
| 127 | HiFiGlyphs { | ||
| 128 | text: hifi.glyphs.search | ||
| 129 | color: textColor | ||
| 130 | size: hifi.fontSizes.textFieldSearchIcon | ||
| 131 | anchors.left: parent.left | ||
| 132 | anchors.verticalCenter: parent.verticalCenter | ||
| 133 | anchors.leftMargin: hifi.dimensions.textPadding - 2 | ||
| 134 | visible: isSearchField | ||
| 135 | } | ||
| 136 | |||
| 137 | HiFiGlyphs { | ||
| 138 | text: hifi.glyphs.error | ||
| 139 | color: textColor | ||
| 140 | size: 40 | ||
| 141 | anchors.right: parent.right | ||
| 142 | anchors.rightMargin: hifi.dimensions.textPadding - 2 | ||
| 143 | anchors.verticalCenter: parent.verticalCenter | ||
| 144 | visible: hasClearButton && textField.text !== ""; | ||
| 145 | |||
| 146 | MouseArea { | ||
| 147 | anchors.fill: parent; | ||
| 148 | onClicked: { | ||
| 149 | textField.text = ""; | ||
| 150 | } | ||
| 151 | } | ||
| 152 | } | ||
| 153 | } | ||
| 154 | placeholderTextColor: isFaintGrayColorScheme ? hifi.colors.lightGrayText : hifi.colors.lightGray | ||
| 155 | selectedTextColor: hifi.colors.black | ||
| 156 | selectionColor: hifi.colors.primaryHighlight | ||
| 157 | padding.left: hasRoundedBorder ? textField.height / 2 : ((isSearchField || textField.leftPermanentGlyph !== "") ? textField.height - 2 : 0) + hifi.dimensions.textPadding | ||
| 158 | padding.right: (hasClearButton ? textField.height - 2 : 0) + hifi.dimensions.textPadding | ||
| 159 | } | ||
| 160 | |||
| 161 | HifiControls.Label { | ||
| 162 | id: textFieldLabel | ||
| 163 | text: textField.label | ||
| 164 | colorScheme: textField.colorScheme | ||
| 165 | anchors.left: parent.left | ||
| 166 | |||
| 167 | Binding on anchors.right { | ||
| 168 | when: textField.right | ||
| 169 | value: textField.right | ||
| 170 | } | ||
| 171 | Binding on wrapMode { | ||
| 172 | when: textField.right | ||
| 173 | value: Text.WordWrap | ||
| 174 | } | ||
| 175 | |||
| 176 | anchors.bottom: parent.top | ||
| 177 | anchors.bottomMargin: 3 | ||
| 178 | visible: label != "" | ||
| 179 | } | ||
| 180 | } | ||
| @@ -0,0 +1,51 @@ | |||
| 1 | // | ||
| 2 | // ToolTip.qml | ||
| 3 | // | ||
| 4 | // Created by Clement on 9/12/17 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | |||
| 13 | Item { | ||
| 14 | property string toolTip | ||
| 15 | property bool showToolTip: false | ||
| 16 | |||
| 17 | Rectangle { | ||
| 18 | id: toolTipRectangle | ||
| 19 | anchors.right: parent.right | ||
| 20 | |||
| 21 | width: toolTipText.width + 4 | ||
| 22 | height: toolTipText.height + 4 | ||
| 23 | opacity: (toolTip != "" && showToolTip) ? 1 : 0 | ||
| 24 | color: "#ffffaa" | ||
| 25 | border.color: "#0a0a0a" | ||
| 26 | Text { | ||
| 27 | id: toolTipText | ||
| 28 | text: toolTip | ||
| 29 | color: "black" | ||
| 30 | anchors.centerIn: parent | ||
| 31 | } | ||
| 32 | Behavior on opacity { | ||
| 33 | PropertyAnimation { | ||
| 34 | easing.type: Easing.InOutQuad | ||
| 35 | duration: 250 | ||
| 36 | } | ||
| 37 | } | ||
| 38 | } | ||
| 39 | MouseArea { | ||
| 40 | id: mouseArea | ||
| 41 | anchors.fill: parent | ||
| 42 | onEntered: showTimer.start() | ||
| 43 | onExited: { showToolTip = false; showTimer.stop(); } | ||
| 44 | hoverEnabled: true | ||
| 45 | } | ||
| 46 | Timer { | ||
| 47 | id: showTimer | ||
| 48 | interval: 250 | ||
| 49 | onTriggered: { showToolTip = true; } | ||
| 50 | } | ||
| 51 | } | ||
| @@ -0,0 +1,205 @@ | |||
| 1 | // | ||
| 2 | // Tree.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 17 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQml.Models 2.2 | ||
| 12 | import QtQuick 2.7 | ||
| 13 | import QtQuick.Controls 1.4 | ||
| 14 | import QtQuick.Controls.Styles 1.4 | ||
| 15 | import QtQuick.Controls 2.2 as QQC2 | ||
| 16 | |||
| 17 | |||
| 18 | import "../stylesUit" | ||
| 19 | |||
| 20 | TreeView { | ||
| 21 | id: treeView | ||
| 22 | |||
| 23 | property var treeModel: ListModel { } | ||
| 24 | property bool centerHeaderText: false | ||
| 25 | property int colorScheme: hifi.colorSchemes.light | ||
| 26 | readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light | ||
| 27 | |||
| 28 | property var modifyEl: function(index, data) { return false; } | ||
| 29 | |||
| 30 | model: treeModel | ||
| 31 | selection: ItemSelectionModel { | ||
| 32 | id: selectionModel | ||
| 33 | model: treeModel | ||
| 34 | } | ||
| 35 | |||
| 36 | anchors { left: parent.left; right: parent.right } | ||
| 37 | |||
| 38 | headerVisible: false | ||
| 39 | |||
| 40 | Component.onCompleted: { | ||
| 41 | if (flickableItem !== null && flickableItem !== undefined) { | ||
| 42 | treeView.flickableItem.QQC2.ScrollBar.vertical = scrollbar | ||
| 43 | } | ||
| 44 | } | ||
| 45 | |||
| 46 | QQC2.ScrollBar { | ||
| 47 | id: scrollbar | ||
| 48 | parent: treeView.flickableItem | ||
| 49 | policy: QQC2.ScrollBar.AsNeeded | ||
| 50 | orientation: Qt.Vertical | ||
| 51 | visible: size < 1.0 | ||
| 52 | topPadding: treeView.headerVisible ? hifi.dimensions.tableHeaderHeight + 1 : 1 | ||
| 53 | anchors.top: treeView.top | ||
| 54 | anchors.left: treeView.right | ||
| 55 | anchors.bottom: treeView.bottom | ||
| 56 | |||
| 57 | background: Item { | ||
| 58 | implicitWidth: hifi.dimensions.scrollbarBackgroundWidth | ||
| 59 | Rectangle { | ||
| 60 | anchors { | ||
| 61 | fill: parent; | ||
| 62 | topMargin: treeView.headerVisible ? hifi.dimensions.tableHeaderHeight: 0 | ||
| 63 | } | ||
| 64 | color: isLightColorScheme ? hifi.colors.tableScrollBackgroundLight | ||
| 65 | : hifi.colors.tableScrollBackgroundDark | ||
| 66 | } | ||
| 67 | } | ||
| 68 | |||
| 69 | contentItem: Item { | ||
| 70 | implicitWidth: hifi.dimensions.scrollbarHandleWidth | ||
| 71 | Rectangle { | ||
| 72 | anchors.fill: parent | ||
| 73 | radius: (width - 4)/2 | ||
| 74 | color: isLightColorScheme ? hifi.colors.tableScrollHandleLight : hifi.colors.tableScrollHandleDark | ||
| 75 | } | ||
| 76 | } | ||
| 77 | } | ||
| 78 | |||
| 79 | // Use rectangle to draw border with rounded corners. | ||
| 80 | frameVisible: false | ||
| 81 | Rectangle { | ||
| 82 | color: "#00000000" | ||
| 83 | anchors.fill: parent | ||
| 84 | radius: hifi.dimensions.borderRadius | ||
| 85 | border.color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight | ||
| 86 | border.width: 2 | ||
| 87 | anchors.margins: -2 | ||
| 88 | } | ||
| 89 | anchors.margins: 2 // Shrink TreeView to lie within border. | ||
| 90 | |||
| 91 | backgroundVisible: true | ||
| 92 | |||
| 93 | horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff | ||
| 94 | verticalScrollBarPolicy: Qt.ScrollBarAlwaysOff | ||
| 95 | |||
| 96 | style: TreeViewStyle { | ||
| 97 | // Needed in order for rows to keep displaying rows after end of table entries. | ||
| 98 | backgroundColor: parent.isLightColorScheme ? hifi.colors.tableRowLightEven : hifi.colors.tableRowDarkEven | ||
| 99 | alternateBackgroundColor: parent.isLightColorScheme ? hifi.colors.tableRowLightOdd : hifi.colors.tableRowDarkOdd | ||
| 100 | |||
| 101 | headerDelegate: Rectangle { | ||
| 102 | height: hifi.dimensions.tableHeaderHeight | ||
| 103 | color: isLightColorScheme ? hifi.colors.tableBackgroundLight : hifi.colors.tableBackgroundDark | ||
| 104 | |||
| 105 | RalewayRegular { | ||
| 106 | id: titleText | ||
| 107 | text: styleData.value | ||
| 108 | size: hifi.fontSizes.tableHeading | ||
| 109 | font.capitalization: Font.AllUppercase | ||
| 110 | color: hifi.colors.baseGrayHighlight | ||
| 111 | horizontalAlignment: (centerHeaderText ? Text.AlignHCenter : Text.AlignLeft) | ||
| 112 | elide: Text.ElideRight | ||
| 113 | anchors { | ||
| 114 | left: parent.left | ||
| 115 | leftMargin: hifi.dimensions.tablePadding | ||
| 116 | right: sortIndicatorVisible && sortIndicatorColumn === styleData.column ? titleSort.left : parent.right | ||
| 117 | rightMargin: hifi.dimensions.tablePadding | ||
| 118 | verticalCenter: parent.verticalCenter | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | HiFiGlyphs { | ||
| 123 | id: titleSort | ||
| 124 | text: sortIndicatorOrder == Qt.AscendingOrder ? hifi.glyphs.caratUp : hifi.glyphs.caratDn | ||
| 125 | color: isLightColorScheme ? hifi.colors.darkGray : hifi.colors.baseGrayHighlight | ||
| 126 | opacity: 0.6; | ||
| 127 | size: hifi.fontSizes.tableHeadingIcon | ||
| 128 | anchors { | ||
| 129 | right: parent.right | ||
| 130 | verticalCenter: titleText.verticalCenter | ||
| 131 | } | ||
| 132 | visible: sortIndicatorVisible && sortIndicatorColumn === styleData.column | ||
| 133 | } | ||
| 134 | |||
| 135 | Rectangle { | ||
| 136 | width: 1 | ||
| 137 | anchors { | ||
| 138 | left: parent.left | ||
| 139 | top: parent.top | ||
| 140 | topMargin: 1 | ||
| 141 | bottom: parent.bottom | ||
| 142 | bottomMargin: 2 | ||
| 143 | } | ||
| 144 | color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight | ||
| 145 | visible: styleData.column > 0 | ||
| 146 | } | ||
| 147 | |||
| 148 | Rectangle { | ||
| 149 | height: 1 | ||
| 150 | anchors { | ||
| 151 | left: parent.left | ||
| 152 | right: parent.right | ||
| 153 | bottom: parent.bottom | ||
| 154 | } | ||
| 155 | color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight | ||
| 156 | } | ||
| 157 | } | ||
| 158 | |||
| 159 | branchDelegate: HiFiGlyphs { | ||
| 160 | text: styleData.isExpanded ? hifi.glyphs.caratDn : hifi.glyphs.caratR | ||
| 161 | size: hifi.fontSizes.carat | ||
| 162 | color: colorScheme == hifi.colorSchemes.light | ||
| 163 | ? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight) | ||
| 164 | : (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText) | ||
| 165 | anchors { | ||
| 166 | left: parent ? parent.left : undefined | ||
| 167 | leftMargin: hifi.dimensions.tablePadding / 2 | ||
| 168 | } | ||
| 169 | } | ||
| 170 | } | ||
| 171 | |||
| 172 | rowDelegate: Rectangle { | ||
| 173 | height: hifi.dimensions.tableRowHeight | ||
| 174 | color: styleData.selected | ||
| 175 | ? hifi.colors.primaryHighlight | ||
| 176 | : treeView.isLightColorScheme | ||
| 177 | ? (styleData.alternate ? hifi.colors.tableRowLightEven : hifi.colors.tableRowLightOdd) | ||
| 178 | : (styleData.alternate ? hifi.colors.tableRowDarkEven : hifi.colors.tableRowDarkOdd) | ||
| 179 | } | ||
| 180 | |||
| 181 | itemDelegate: FiraSansSemiBold { | ||
| 182 | anchors { | ||
| 183 | left: parent ? parent.left : undefined | ||
| 184 | leftMargin: (2 + styleData.depth) * hifi.dimensions.tablePadding | ||
| 185 | right: parent ? parent.right : undefined | ||
| 186 | rightMargin: hifi.dimensions.tablePadding | ||
| 187 | verticalCenter: parent ? parent.verticalCenter : undefined | ||
| 188 | } | ||
| 189 | |||
| 190 | text: styleData.value | ||
| 191 | size: hifi.fontSizes.tableText | ||
| 192 | color: colorScheme == hifi.colorSchemes.light | ||
| 193 | ? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight) | ||
| 194 | : (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText) | ||
| 195 | |||
| 196 | elide: Text.ElideRight | ||
| 197 | } | ||
| 198 | |||
| 199 | Item { | ||
| 200 | id: unfocusHelper | ||
| 201 | visible: false | ||
| 202 | } | ||
| 203 | |||
| 204 | onDoubleClicked: isExpanded(index) ? collapse(index) : expand(index) | ||
| 205 | } | ||
| @@ -0,0 +1,21 @@ | |||
| 1 | // | ||
| 2 | // VerticalSpacer.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 16 Feb 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | |||
| 13 | import "../stylesUit" | ||
| 14 | |||
| 15 | Item { | ||
| 16 | id: root | ||
| 17 | property alias size: root.height | ||
| 18 | |||
| 19 | width: 1 // Must be non-zero | ||
| 20 | height: hifi.dimensions.controlInterlineHeight | ||
| 21 | } | ||
| @@ -0,0 +1,40 @@ | |||
| 1 | // | ||
| 2 | // GlyphButton.qml | ||
| 3 | // | ||
| 4 | // Created by Vlad Stelmahovsky on 2017-06-21 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import QtQuick.Controls 2.2 as Original | ||
| 13 | |||
| 14 | import "../stylesUit" | ||
| 15 | |||
| 16 | Original.Button { | ||
| 17 | id: control | ||
| 18 | |||
| 19 | property int colorScheme: hifi.colorSchemes.light | ||
| 20 | property string glyph: "" | ||
| 21 | property int size: 32 | ||
| 22 | //colors | ||
| 23 | readonly property color normalColor: "#AFAFAF" | ||
| 24 | readonly property color hoverColor: "#00B4EF" | ||
| 25 | readonly property color clickedColor: "#FFFFFF" | ||
| 26 | readonly property color disabledColor: "#575757" | ||
| 27 | |||
| 28 | background: Item {} | ||
| 29 | |||
| 30 | contentItem: HiFiGlyphs { | ||
| 31 | color: control.enabled ? (control.pressed ? control.clickedColor : | ||
| 32 | (control.hovered ? control.hoverColor : control.normalColor)) : | ||
| 33 | control.disabledColor | ||
| 34 | verticalAlignment: Text.AlignVCenter | ||
| 35 | horizontalAlignment: Text.AlignHCenter | ||
| 36 | text: control.glyph | ||
| 37 | size: control.size | ||
| 38 | } | ||
| 39 | } | ||
| 40 | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | // | ||
| 2 | // WebSpinner.qml | ||
| 3 | // | ||
| 4 | // Created by David Rowe on 23 May 2017 | ||
| 5 | // Copyright 2017 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import QtWebEngine 1.5 | ||
| 13 | |||
| 14 | AnimatedImage { | ||
| 15 | property WebEngineView webview: parent | ||
| 16 | source: "../../icons/loader-snake-64-w.gif" | ||
| 17 | visible: webview.loading && /^(http.*|)$/i.test(webview.url.toString()) | ||
| 18 | playing: visible | ||
| 19 | z: 10000 | ||
| 20 | anchors { | ||
| 21 | horizontalCenter: parent.horizontalCenter | ||
| 22 | verticalCenter: parent.verticalCenter | ||
| 23 | } | ||
| 24 | } | ||
| @@ -0,0 +1,21 @@ | |||
| 1 | // | ||
| 2 | // WebView.qml | ||
| 3 | // | ||
| 4 | // Created by Bradley Austin Davis on 12 Jan 2016 | ||
| 5 | // Copyright 2016 High Fidelity, Inc. | ||
| 6 | // | ||
| 7 | // Distributed under the Apache License, Version 2.0. | ||
| 8 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 9 | // | ||
| 10 | |||
| 11 | import QtQuick 2.5 | ||
| 12 | import "." | ||
| 13 | |||
| 14 | BaseWebView { | ||
| 15 | onNewViewRequested: { | ||
| 16 | // Load dialog via OffscreenUi so that JavaScript EventBridge is available. | ||
| 17 | var browser = OffscreenUi.load("Browser.qml"); | ||
| 18 | request.openIn(browser.webView); | ||
| 19 | browser.webView.forceActiveFocus(); | ||
| 20 | } | ||
| 21 | } | ||
| @@ -6,6 +6,7 @@ CheckBox 1.0 CheckBox.qml · 5 unmodified lines | |||
| 6 | CheckBoxQQC2 1.0 CheckBoxQQC2.qml | 6 | CheckBoxQQC2 1.0 CheckBoxQQC2.qml |
| 7 | ComboBox 1.0 ComboBox.qml | 7 | ComboBox 1.0 ComboBox.qml |
| 8 | ContentSection 1.0 ContentSection.qml | 8 | ContentSection 1.0 ContentSection.qml |
| 9 | FilterBar 1.0 FilterBar.qml | ||
| 9 | GlyphButton 1.0 GlyphButton.qml | 10 | GlyphButton 1.0 GlyphButton.qml |
| 10 | HorizontalRule 1.0 HorizontalRule.qml | 11 | HorizontalRule 1.0 HorizontalRule.qml |
| 11 | HorizontalSpacer 1.0 HorizontalSpacer.qml | 12 | HorizontalSpacer 1.0 HorizontalSpacer.qml |
| @@ -15,6 +16,7 @@ Keyboard 1.0 Keyboard.qml · 3 unmodified lines | |||
| 15 | Label 1.0 Label.qml | 16 | Label 1.0 Label.qml |
| 16 | QueuedButton 1.0 QueuedButton.qml | 17 | QueuedButton 1.0 QueuedButton.qml |
| 17 | RadioButton 1.0 RadioButton.qml | 18 | RadioButton 1.0 RadioButton.qml |
| 19 | ScrollBar 1.0 ScrollBar.qml | ||
| 18 | Separator 1.0 Separator.qml | 20 | Separator 1.0 Separator.qml |
| 19 | Slider 1.0 Slider.qml | 21 | Slider 1.0 Slider.qml |
| 20 | SpinBox 1.0 SpinBox.qml | 22 | SpinBox 1.0 SpinBox.qml |
| @@ -11,7 +11,7 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import Qt.labs.settings 1.0 | 12 | import Qt.labs.settings 1.0 |
| 13 | 13 | ||
| 14 | import "../styles-uit" | 14 | import stylesUit 1.0 |
| 15 | import "../windows" | 15 | import "../windows" |
| 16 | 16 | ||
| 17 | import "assetDialog" | 17 | import "assetDialog" |
| @@ -12,8 +12,8 @@ import QtQuick 2.7; · 11 unmodified lines | |||
| 12 | import QtQuick.Dialogs 1.2 as OriginalDialogs; | 12 | import QtQuick.Dialogs 1.2 as OriginalDialogs; |
| 13 | import QtQuick.Controls 2.3 | 13 | import QtQuick.Controls 2.3 |
| 14 | 14 | ||
| 15 | import "../controls-uit"; | 15 | import controlsUit 1.0 |
| 16 | import "../styles-uit"; | 16 | import stylesUit 1.0 |
| 17 | import "../windows"; | 17 | import "../windows"; |
| 18 | 18 | ||
| 19 | ModalWindow { | 19 | ModalWindow { |
| @@ -16,8 +16,8 @@ import QtQuick.Controls 1.4 as QQC1 · 15 unmodified lines | |||
| 16 | import QtQuick.Controls 2.3 | 16 | import QtQuick.Controls 2.3 |
| 17 | 17 | ||
| 18 | import ".." | 18 | import ".." |
| 19 | import "../controls-uit" | 19 | import controlsUit 1.0 |
| 20 | import "../styles-uit" | 20 | import stylesUit 1.0 |
| 21 | import "../windows" | 21 | import "../windows" |
| 22 | 22 | ||
| 23 | import "fileDialog" | 23 | import "fileDialog" |
| @@ -11,8 +11,8 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import QtQuick.Dialogs 1.2 as OriginalDialogs | 12 | import QtQuick.Dialogs 1.2 as OriginalDialogs |
| 13 | 13 | ||
| 14 | import "../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | import "../styles-uit" | 15 | import stylesUit 1.0 |
| 16 | import "../windows" | 16 | import "../windows" |
| 17 | 17 | ||
| 18 | import "messageDialog" | 18 | import "messageDialog" |
| @@ -10,8 +10,8 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../controls-uit" as HifiControls | 13 | import controlsUit 1.0 as HifiControls |
| 14 | import "../styles-uit" | 14 | import stylesUit 1.0 |
| 15 | import "../windows" | 15 | import "../windows" |
| 16 | import "preferences" | 16 | import "preferences" |
| 17 | 17 | ||
| @@ -11,8 +11,8 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.7 | 11 | import QtQuick 2.7 |
| 12 | import QtQuick.Controls 2.3 | 12 | import QtQuick.Controls 2.3 |
| 13 | 13 | ||
| 14 | import "../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | import "../styles-uit" | 15 | import stylesUit 1.0 |
| 16 | import "../windows" | 16 | import "../windows" |
| 17 | 17 | ||
| 18 | ModalWindow { | 18 | ModalWindow { |
| @@ -10,7 +10,7 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../styles-uit" | 13 | import stylesUit 1.0 |
| 14 | import "../windows" | 14 | import "../windows" |
| 15 | 15 | ||
| 16 | import "assetDialog" | 16 | import "assetDialog" |
| @@ -12,8 +12,8 @@ import QtQuick 2.7 · 11 unmodified lines | |||
| 12 | import QtQuick.Dialogs 1.2 as OriginalDialogs | 12 | import QtQuick.Dialogs 1.2 as OriginalDialogs |
| 13 | import QtQuick.Controls 2.3 | 13 | import QtQuick.Controls 2.3 |
| 14 | 14 | ||
| 15 | import "../controls-uit" | 15 | import controlsUit 1.0 |
| 16 | import "../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "../windows" | 17 | import "../windows" |
| 18 | 18 | ||
| 19 | TabletModalWindow { | 19 | TabletModalWindow { |
| @@ -16,8 +16,8 @@ import QtQuick.Controls 1.4 as QQC1 · 15 unmodified lines | |||
| 16 | import QtQuick.Controls 2.3 | 16 | import QtQuick.Controls 2.3 |
| 17 | 17 | ||
| 18 | import ".." | 18 | import ".." |
| 19 | import "../controls-uit" | 19 | import controlsUit 1.0 |
| 20 | import "../styles-uit" | 20 | import stylesUit 1.0 |
| 21 | import "../windows" | 21 | import "../windows" |
| 22 | 22 | ||
| 23 | import "fileDialog" | 23 | import "fileDialog" |
| @@ -11,8 +11,8 @@ · 10 unmodified lines | |||
| 11 | import Hifi 1.0 | 11 | import Hifi 1.0 |
| 12 | import QtQuick 2.5 | 12 | import QtQuick 2.5 |
| 13 | 13 | ||
| 14 | import "../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | import "../styles-uit" | 15 | import stylesUit 1.0 |
| 16 | import "../windows" | 16 | import "../windows" |
| 17 | 17 | ||
| 18 | import "../LoginDialog" | 18 | import "../LoginDialog" |
| @@ -95,6 +95,18 @@ TabletModalWindow { · 76 unmodified lines | |||
| 95 | } | 95 | } |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | Timer { | ||
| 99 | id: keyboardTimer | ||
| 100 | repeat: false | ||
| 101 | interval: 200 | ||
| 102 | |||
| 103 | onTriggered: { | ||
| 104 | if (MenuInterface.isOptionChecked("Use 3D Keyboard")) { | ||
| 105 | KeyboardScriptingInterface.raised = true; | ||
| 106 | } | ||
| 107 | } | ||
| 108 | } | ||
| 109 | |||
| 98 | TabletModalFrame { | 110 | TabletModalFrame { |
| 99 | id: mfRoot | 111 | id: mfRoot |
| 100 | 112 | ||
| @@ -127,6 +139,14 @@ TabletModalWindow { · 26 unmodified lines | |||
| 127 | } | 139 | } |
| 128 | } | 140 | } |
| 129 | 141 | ||
| 142 | Component.onDestruction: { | ||
| 143 | loginKeyboard.raised = false; | ||
| 144 | } | ||
| 145 | |||
| 146 | Component.onCompleted: { | ||
| 147 | keyboardTimer.start(); | ||
| 148 | } | ||
| 149 | |||
| 130 | Keyboard { | 150 | Keyboard { |
| 131 | id: loginKeyboard | 151 | id: loginKeyboard |
| 132 | raised: root.keyboardEnabled && root.keyboardRaised | 152 | raised: root.keyboardEnabled && root.keyboardRaised |
| @@ -11,8 +11,8 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import QtQuick.Dialogs 1.2 as OriginalDialogs | 12 | import QtQuick.Dialogs 1.2 as OriginalDialogs |
| 13 | 13 | ||
| 14 | import "../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | import "../styles-uit" | 15 | import stylesUit 1.0 |
| 16 | import "../windows" | 16 | import "../windows" |
| 17 | 17 | ||
| 18 | import "messageDialog" | 18 | import "messageDialog" |
| @@ -12,8 +12,8 @@ import QtQuick 2.7 · 11 unmodified lines | |||
| 12 | import QtQuick.Dialogs 1.2 as OriginalDialogs | 12 | import QtQuick.Dialogs 1.2 as OriginalDialogs |
| 13 | import QtQuick.Controls 2.3 | 13 | import QtQuick.Controls 2.3 |
| 14 | 14 | ||
| 15 | import "../controls-uit" | 15 | import controlsUit 1.0 |
| 16 | import "../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "../windows" | 17 | import "../windows" |
| 18 | 18 | ||
| 19 | TabletModalWindow { | 19 | TabletModalWindow { |
| @@ -12,8 +12,8 @@ import QtQuick 2.7 · 11 unmodified lines | |||
| 12 | import QtQuick.Controls 2.3 | 12 | import QtQuick.Controls 2.3 |
| 13 | import QtQuick.Controls 1.5 as QQC1 | 13 | import QtQuick.Controls 1.5 as QQC1 |
| 14 | 14 | ||
| 15 | import "../../controls-uit" | 15 | import controlsUit 1.0 |
| 16 | import "../../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | 17 | ||
| 18 | import "../fileDialog" | 18 | import "../fileDialog" |
| 19 | 19 | ||
| @@ -10,7 +10,7 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../../controls-uit" | 13 | import controlsUit 1.0 |
| 14 | 14 | ||
| 15 | ComboBox { | 15 | ComboBox { |
| 16 | id: root | 16 | id: root |
| @@ -11,7 +11,7 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import QtQuick.Dialogs 1.2 | 12 | import QtQuick.Dialogs 1.2 |
| 13 | 13 | ||
| 14 | import "../../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | 15 | ||
| 16 | Button { | 16 | Button { |
| 17 | property var dialog; | 17 | property var dialog; |
| @@ -10,7 +10,7 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../../controls-uit" | 13 | import controlsUit 1.0 |
| 14 | import "../../hifi/tablet/tabletWindows/preferences" | 14 | import "../../hifi/tablet/tabletWindows/preferences" |
| 15 | 15 | ||
| 16 | Preference { | 16 | Preference { |
| @@ -11,7 +11,7 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../../dialogs" | 13 | import "../../dialogs" |
| 14 | import "../../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | 15 | ||
| 16 | Preference { | 16 | Preference { |
| 17 | id: root | 17 | id: root |
| @@ -11,7 +11,7 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import TabletScriptingInterface 1.0 | 12 | import TabletScriptingInterface 1.0 |
| 13 | 13 | ||
| 14 | import "../../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | 15 | ||
| 16 | Preference { | 16 | Preference { |
| 17 | id: root | 17 | id: root |
| @@ -11,7 +11,7 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import TabletScriptingInterface 1.0 | 12 | import TabletScriptingInterface 1.0 |
| 13 | 13 | ||
| 14 | import "../../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | 15 | ||
| 16 | Preference { | 16 | Preference { |
| 17 | id: root | 17 | id: root |
| @@ -10,8 +10,8 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../../controls-uit" as HiFiControls | 13 | import controlsUit 1.0 as HiFiControls |
| 14 | import "../../styles-uit" | 14 | import stylesUit 1.0 |
| 15 | 15 | ||
| 16 | Preference { | 16 | Preference { |
| 17 | id: root | 17 | id: root |
| @@ -11,7 +11,7 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../../dialogs" | 13 | import "../../dialogs" |
| 14 | import "../../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | 15 | ||
| 16 | Preference { | 16 | Preference { |
| 17 | id: root | 17 | id: root |
| @@ -10,7 +10,7 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../../controls-uit" | 13 | import controlsUit 1.0 |
| 14 | 14 | ||
| 15 | Preference { | 15 | Preference { |
| 16 | id: root | 16 | id: root |
| @@ -10,8 +10,8 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../../controls-uit" | 13 | import controlsUit 1.0 |
| 14 | import "../../styles-uit" | 14 | import stylesUit 1.0 |
| 15 | 15 | ||
| 16 | Preference { | 16 | Preference { |
| 17 | id: root | 17 | id: root |
| @@ -12,8 +12,8 @@ import QtQuick 2.5 · 11 unmodified lines | |||
| 12 | import QtQuick.Controls 1.4 | 12 | import QtQuick.Controls 1.4 |
| 13 | import Hifi 1.0 | 13 | import Hifi 1.0 |
| 14 | 14 | ||
| 15 | import "../../controls-uit" as HiFiControls | 15 | import controlsUit 1.0 as HiFiControls |
| 16 | import "../../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "." | 17 | import "." |
| 18 | 18 | ||
| 19 | Preference { | 19 | Preference { |
| @@ -11,7 +11,7 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../../dialogs" | 13 | import "../../dialogs" |
| 14 | import "../../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | 15 | ||
| 16 | Preference { | 16 | Preference { |
| 17 | id: root | 17 | id: root |
| @@ -10,7 +10,7 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../../controls-uit" | 13 | import controlsUit 1.0 |
| 14 | 14 | ||
| 15 | Preference { | 15 | Preference { |
| 16 | id: root | 16 | id: root |
| @@ -11,7 +11,7 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../../dialogs" | 13 | import "../../dialogs" |
| 14 | import "../../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | 15 | ||
| 16 | Preference { | 16 | Preference { |
| 17 | id: root | 17 | id: root |
| @@ -3,8 +3,8 @@ import QtQuick.Controls 1.4 · 2 unmodified lines | |||
| 3 | import QtQuick.Controls.Styles 1.4 | 3 | import QtQuick.Controls.Styles 1.4 |
| 4 | import QtQuick.Layouts 1.3 | 4 | import QtQuick.Layouts 1.3 |
| 5 | import Qt.labs.settings 1.0 | 5 | import Qt.labs.settings 1.0 |
| 6 | import "../../styles-uit" | 6 | import stylesUit 1.0 |
| 7 | import "../../controls-uit" as HifiControlsUit | 7 | import controlsUit 1.0 as HifiControlsUit |
| 8 | import "../../controls" as HifiControls | 8 | import "../../controls" as HifiControls |
| 9 | import ".." | 9 | import ".." |
| 10 | 10 | ||
| @@ -3,8 +3,8 @@ import QtQuick.Controls 1.4 · 2 unmodified lines | |||
| 3 | import QtQuick.Controls.Styles 1.4 | 3 | import QtQuick.Controls.Styles 1.4 |
| 4 | import QtQuick.Layouts 1.3 | 4 | import QtQuick.Layouts 1.3 |
| 5 | import Qt.labs.settings 1.0 | 5 | import Qt.labs.settings 1.0 |
| 6 | import "../../styles-uit" | 6 | import stylesUit 1.0 |
| 7 | import "../../controls-uit" as HifiControlsUit | 7 | import controlsUit 1.0 as HifiControlsUit |
| 8 | import "../../controls" as HifiControls | 8 | import "../../controls" as HifiControls |
| 9 | import ".." | 9 | import ".." |
| 10 | 10 | ||
| @@ -11,7 +11,7 @@ · 10 unmodified lines | |||
| 11 | 11 | ||
| 12 | import QtQuick.Layouts 1.3 | 12 | import QtQuick.Layouts 1.3 |
| 13 | import QtQuick 2.5 | 13 | import QtQuick 2.5 |
| 14 | import "../controls-uit" as HifiControlsUit | 14 | import controlsUit 1.0 as HifiControlsUit |
| 15 | 15 | ||
| 16 | ColumnLayout { | 16 | ColumnLayout { |
| 17 | id: itemRoot | 17 | id: itemRoot |
| @@ -3,8 +3,8 @@ import QtQuick.Controls 1.4 · 2 unmodified lines | |||
| 3 | import QtQuick.Controls.Styles 1.4 | 3 | import QtQuick.Controls.Styles 1.4 |
| 4 | import QtQuick.Layouts 1.3 | 4 | import QtQuick.Layouts 1.3 |
| 5 | import Qt.labs.settings 1.0 | 5 | import Qt.labs.settings 1.0 |
| 6 | import "../../styles-uit" | 6 | import stylesUit 1.0 |
| 7 | import "../../controls-uit" as HifiControlsUit | 7 | import controlsUit 1.0 as HifiControlsUit |
| 8 | import "../../controls" as HifiControls | 8 | import "../../controls" as HifiControls |
| 9 | import ".." | 9 | import ".." |
| 10 | 10 | ||
| @@ -16,8 +16,8 @@ import QtQuick.Layouts 1.3 · 15 unmodified lines | |||
| 16 | import Qt.labs.settings 1.0 | 16 | import Qt.labs.settings 1.0 |
| 17 | import "." | 17 | import "." |
| 18 | import "../styles" as HifiStyles | 18 | import "../styles" as HifiStyles |
| 19 | import "../styles-uit" | 19 | import stylesUit 1.0 |
| 20 | import "../controls-uit" as HifiControlsUit | 20 | import controlsUit 1.0 as HifiControlsUit |
| 21 | import "../controls" as HifiControls | 21 | import "../controls" as HifiControls |
| 22 | import ".." | 22 | import ".." |
| 23 | 23 | ||
| @@ -16,8 +16,8 @@ import QtQuick.Controls.Styles 1.4 · 15 unmodified lines | |||
| 16 | import QtQuick.Layouts 1.3 | 16 | import QtQuick.Layouts 1.3 |
| 17 | import Qt.labs.settings 1.0 | 17 | import Qt.labs.settings 1.0 |
| 18 | import "../../styles" as HifiStyles | 18 | import "../../styles" as HifiStyles |
| 19 | import "../../styles-uit" | 19 | import stylesUit 1.0 |
| 20 | import "../../controls-uit" as HifiControlsUit | 20 | import controlsUit 1.0 as HifiControlsUit |
| 21 | import "../../controls" as HifiControls | 21 | import "../../controls" as HifiControls |
| 22 | import ".." | 22 | import ".." |
| 23 | import "." | 23 | import "." |
| @@ -3,8 +3,8 @@ import QtQuick.Controls 1.4 · 2 unmodified lines | |||
| 3 | import QtQuick.Controls.Styles 1.4 | 3 | import QtQuick.Controls.Styles 1.4 |
| 4 | import QtQuick.Layouts 1.3 | 4 | import QtQuick.Layouts 1.3 |
| 5 | import Qt.labs.settings 1.0 | 5 | import Qt.labs.settings 1.0 |
| 6 | import "../../styles-uit" | 6 | import stylesUit 1.0 |
| 7 | import "../../controls-uit" as HifiControlsUit | 7 | import controlsUit 1.0 as HifiControlsUit |
| 8 | import "../../controls" as HifiControls | 8 | import "../../controls" as HifiControls |
| 9 | import ".." | 9 | import ".." |
| 10 | 10 | ||
| @@ -14,8 +14,8 @@ import QtQuick.Controls.Styles 1.4 · 13 unmodified lines | |||
| 14 | import QtQuick.Dialogs 1.2 as OriginalDialogs | 14 | import QtQuick.Dialogs 1.2 as OriginalDialogs |
| 15 | import Qt.labs.settings 1.0 | 15 | import Qt.labs.settings 1.0 |
| 16 | 16 | ||
| 17 | import "../styles-uit" | 17 | import stylesUit 1.0 |
| 18 | import "../controls-uit" as HifiControls | 18 | import controlsUit 1.0 as HifiControls |
| 19 | import "../windows" as Windows | 19 | import "../windows" as Windows |
| 20 | import "../dialogs" | 20 | import "../dialogs" |
| 21 | 21 | ||
| @@ -3,8 +3,8 @@ import QtQuick.Controls 2.2 · 2 unmodified lines | |||
| 3 | import QtQuick.Layouts 1.3 | 3 | import QtQuick.Layouts 1.3 |
| 4 | import QtQml.Models 2.1 | 4 | import QtQml.Models 2.1 |
| 5 | import QtGraphicalEffects 1.0 | 5 | import QtGraphicalEffects 1.0 |
| 6 | import "../controls-uit" as HifiControls | 6 | import controlsUit 1.0 as HifiControls |
| 7 | import "../styles-uit" | 7 | import stylesUit 1.0 |
| 8 | import "avatarapp" | 8 | import "avatarapp" |
| 9 | 9 | ||
| 10 | Rectangle { | 10 | Rectangle { |
| @@ -19,7 +19,7 @@ Rectangle { · 8 unmodified lines | |||
| 19 | HifiControls.Keyboard { | 19 | HifiControls.Keyboard { |
| 20 | id: keyboard | 20 | id: keyboard |
| 21 | z: 1000 | 21 | z: 1000 |
| 22 | raised: parent.keyboardEnabled && parent.keyboardRaised | 22 | raised: parent.keyboardEnabled && parent.keyboardRaised && HMD.active |
| 23 | numeric: parent.punctuationMode | 23 | numeric: parent.punctuationMode |
| 24 | anchors { | 24 | anchors { |
| 25 | left: parent.left | 25 | left: parent.left |
| @@ -204,7 +204,8 @@ Rectangle { · 178 unmodified lines | |||
| 204 | 204 | ||
| 205 | property bool isInManageState: false | 205 | property bool isInManageState: false |
| 206 | 206 | ||
| 207 | Component.onCompleted: { | 207 | Component.onDestruction: { |
| 208 | keyboard.raised = false; | ||
| 208 | } | 209 | } |
| 209 | 210 | ||
| 210 | AvatarAppStyle { | 211 | AvatarAppStyle { |
| @@ -235,6 +236,8 @@ Rectangle { · 24 unmodified lines | |||
| 235 | avatarIconVisible: mainPageVisible | 236 | avatarIconVisible: mainPageVisible |
| 236 | settingsButtonVisible: mainPageVisible | 237 | settingsButtonVisible: mainPageVisible |
| 237 | onSettingsClicked: { | 238 | onSettingsClicked: { |
| 239 | displayNameInput.focus = false; | ||
| 240 | root.keyboardRaised = false; | ||
| 238 | settings.open(currentAvatarSettings, currentAvatar.avatarScale); | 241 | settings.open(currentAvatarSettings, currentAvatar.avatarScale); |
| 239 | } | 242 | } |
| 240 | } | 243 | } |
| @@ -344,6 +347,10 @@ Rectangle { · 103 unmodified lines | |||
| 344 | emitSendToScript({'method' : 'changeDisplayName', 'displayName' : text}) | 347 | emitSendToScript({'method' : 'changeDisplayName', 'displayName' : text}) |
| 345 | focus = false; | 348 | focus = false; |
| 346 | } | 349 | } |
| 350 | |||
| 351 | onFocusChanged: { | ||
| 352 | root.keyboardRaised = focus; | ||
| 353 | } | ||
| 347 | } | 354 | } |
| 348 | 355 | ||
| 349 | ShadowImage { | 356 | ShadowImage { |
| @@ -17,7 +17,7 @@ import QtGraphicalEffects 1.0 · 16 unmodified lines | |||
| 17 | import TabletScriptingInterface 1.0 | 17 | import TabletScriptingInterface 1.0 |
| 18 | 18 | ||
| 19 | import "toolbars" | 19 | import "toolbars" |
| 20 | import "../styles-uit" | 20 | import stylesUit 1.0 |
| 21 | 21 | ||
| 22 | Item { | 22 | Item { |
| 23 | id: root; | 23 | id: root; |
| @@ -10,8 +10,8 @@ · 9 unmodified lines | |||
| 10 | // | 10 | // |
| 11 | 11 | ||
| 12 | import QtQuick 2.5 | 12 | import QtQuick 2.5 |
| 13 | import "../styles-uit" | 13 | import stylesUit 1.0 |
| 14 | import "../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | 15 | ||
| 16 | Item { | 16 | Item { |
| 17 | property var dialogTitleText : ""; | 17 | property var dialogTitleText : ""; |
| @@ -8,7 +8,7 @@ import "../desktop" as OriginalDesktop · 7 unmodified lines | |||
| 8 | import ".." | 8 | import ".." |
| 9 | import "." | 9 | import "." |
| 10 | import "./toolbars" | 10 | import "./toolbars" |
| 11 | import "../controls-uit" | 11 | import controlsUit 1.0 |
| 12 | 12 | ||
| 13 | OriginalDesktop.Desktop { | 13 | OriginalDesktop.Desktop { |
| 14 | id: desktop | 14 | id: desktop |
| @@ -10,7 +10,7 @@ · 9 unmodified lines | |||
| 10 | // | 10 | // |
| 11 | 11 | ||
| 12 | import QtQuick 2.5 | 12 | import QtQuick 2.5 |
| 13 | import "../styles-uit" | 13 | import stylesUit 1.0 |
| 14 | 14 | ||
| 15 | Item { | 15 | Item { |
| 16 | property alias text: popupText.text | 16 | property alias text: popupText.text |
| @@ -15,7 +15,7 @@ import Hifi 1.0 · 14 unmodified lines | |||
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import QtGraphicalEffects 1.0 | 16 | import QtGraphicalEffects 1.0 |
| 17 | import "toolbars" | 17 | import "toolbars" |
| 18 | import "../styles-uit" | 18 | import stylesUit 1.0 |
| 19 | import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere. | 19 | import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere. |
| 20 | 20 | ||
| 21 | Column { | 21 | Column { |
| @@ -10,7 +10,7 @@ · 9 unmodified lines | |||
| 10 | // | 10 | // |
| 11 | 11 | ||
| 12 | import QtQuick 2.5 | 12 | import QtQuick 2.5 |
| 13 | import "../styles-uit" | 13 | import stylesUit 1.0 |
| 14 | 14 | ||
| 15 | Item { | 15 | Item { |
| 16 | property alias text: popupText.text | 16 | property alias text: popupText.text |
| @@ -13,8 +13,8 @@ import QtQuick 2.5 · 12 unmodified lines | |||
| 13 | import QtQuick.Controls 1.4 | 13 | import QtQuick.Controls 1.4 |
| 14 | import QtQuick.Controls.Styles 1.4 | 14 | import QtQuick.Controls.Styles 1.4 |
| 15 | import QtGraphicalEffects 1.0 | 15 | import QtGraphicalEffects 1.0 |
| 16 | import "../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "../controls-uit" as HifiControls | 17 | import controlsUit 1.0 as HifiControls |
| 18 | import "toolbars" | 18 | import "toolbars" |
| 19 | 19 | ||
| 20 | // references Users, UserActivityLogger, MyAvatar, Vec3, Quat, AddressManager, Account from root context | 20 | // references Users, UserActivityLogger, MyAvatar, Vec3, Quat, AddressManager, Account from root context |
| @@ -15,8 +15,8 @@ import QtQuick 2.5 · 14 unmodified lines | |||
| 15 | import QtQuick.Controls 1.4 | 15 | import QtQuick.Controls 1.4 |
| 16 | import QtGraphicalEffects 1.0 | 16 | import QtGraphicalEffects 1.0 |
| 17 | import Qt.labs.settings 1.0 | 17 | import Qt.labs.settings 1.0 |
| 18 | import "../styles-uit" | 18 | import stylesUit 1.0 |
| 19 | import "../controls-uit" as HifiControlsUit | 19 | import controlsUit 1.0 as HifiControlsUit |
| 20 | import "../controls" as HifiControls | 20 | import "../controls" as HifiControls |
| 21 | import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere. | 21 | import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere. |
| 22 | 22 | ||
| @@ -10,8 +10,8 @@ · 9 unmodified lines | |||
| 10 | // | 10 | // |
| 11 | 11 | ||
| 12 | import QtQuick 2.5 | 12 | import QtQuick 2.5 |
| 13 | import "../styles-uit" | 13 | import stylesUit 1.0 |
| 14 | import "../controls-uit" as HifiControls | 14 | import controlsUit 1.0 as HifiControls |
| 15 | import QtQuick.Controls 2.2 | 15 | import QtQuick.Controls 2.2 |
| 16 | 16 | ||
| 17 | Item { | 17 | Item { |
| @@ -13,8 +13,8 @@ · 12 unmodified lines | |||
| 13 | 13 | ||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.7 | 15 | import QtQuick 2.7 |
| 16 | import "../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "../controls-uit" as HifiControlsUit | 17 | import controlsUit 1.0 as HifiControlsUit |
| 18 | import "../controls" as HifiControls | 18 | import "../controls" as HifiControls |
| 19 | 19 | ||
| 20 | // references HMD, XXX from root context | 20 | // references HMD, XXX from root context |
| @@ -10,7 +10,7 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import Hifi 1.0 | 11 | import Hifi 1.0 |
| 12 | import QtQuick 2.4 | 12 | import QtQuick 2.4 |
| 13 | import "../styles-uit" | 13 | import stylesUit 1.0 |
| 14 | 14 | ||
| 15 | Rectangle { | 15 | Rectangle { |
| 16 | property alias text: label.text | 16 | property alias text: label.text |
| @@ -9,7 +9,7 @@ · 8 unmodified lines | |||
| 9 | // | 9 | // |
| 10 | import Hifi 1.0 | 10 | import Hifi 1.0 |
| 11 | import QtQuick 2.4 | 11 | import QtQuick 2.4 |
| 12 | import "../styles-uit" | 12 | import stylesUit 1.0 |
| 13 | 13 | ||
| 14 | Rectangle { | 14 | Rectangle { |
| 15 | property alias text: label.text; | 15 | property alias text: label.text; |
| @@ -18,8 +18,8 @@ import QtGraphicalEffects 1.0 · 17 unmodified lines | |||
| 18 | import QtWebEngine 1.5 | 18 | import QtWebEngine 1.5 |
| 19 | import QtWebChannel 1.0 | 19 | import QtWebChannel 1.0 |
| 20 | 20 | ||
| 21 | import "../styles-uit" | 21 | import stylesUit 1.0 |
| 22 | import "../controls-uit" as HifiControls | 22 | import controlsUit 1.0 as HifiControls |
| 23 | import "../windows" | 23 | import "../windows" |
| 24 | import "../controls" | 24 | import "../controls" |
| 25 | 25 | ||
| @@ -15,8 +15,8 @@ import QtQuick 2.5 · 14 unmodified lines | |||
| 15 | import QtQuick.Controls 2.2 | 15 | import QtQuick.Controls 2.2 |
| 16 | import QtQuick.Layouts 1.3 | 16 | import QtQuick.Layouts 1.3 |
| 17 | 17 | ||
| 18 | import "../../styles-uit" | 18 | import stylesUit 1.0 |
| 19 | import "../../controls-uit" as HifiControls | 19 | import controlsUit 1.0 as HifiControls |
| 20 | import "../../windows" | 20 | import "../../windows" |
| 21 | import "./" as AudioControls | 21 | import "./" as AudioControls |
| 22 | 22 | ||
| @@ -11,8 +11,8 @@ · 10 unmodified lines | |||
| 11 | 11 | ||
| 12 | import QtQuick 2.7 | 12 | import QtQuick 2.7 |
| 13 | import QtQuick.Controls 2.2 | 13 | import QtQuick.Controls 2.2 |
| 14 | import "../../controls-uit" as HifiControls | 14 | import controlsUit 1.0 as HifiControls |
| 15 | import "../../styles-uit" | 15 | import stylesUit 1.0 |
| 16 | 16 | ||
| 17 | TabButton { | 17 | TabButton { |
| 18 | id: control | 18 | id: control |
| @@ -11,7 +11,7 @@ · 10 unmodified lines | |||
| 11 | 11 | ||
| 12 | import QtQuick 2.7 | 12 | import QtQuick 2.7 |
| 13 | 13 | ||
| 14 | import "../../controls-uit" as HifiControls | 14 | import controlsUit 1.0 as HifiControls |
| 15 | 15 | ||
| 16 | HifiControls.CheckBoxQQC2 { | 16 | HifiControls.CheckBoxQQC2 { |
| 17 | color: "white" | 17 | color: "white" |
| @@ -13,8 +13,8 @@ import QtQuick 2.7 · 12 unmodified lines | |||
| 13 | import QtQuick.Controls 2.2 | 13 | import QtQuick.Controls 2.2 |
| 14 | import QtQuick.Layouts 1.3 | 14 | import QtQuick.Layouts 1.3 |
| 15 | 15 | ||
| 16 | import "../../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "../../controls-uit" as HifiControls | 17 | import controlsUit 1.0 as HifiControls |
| 18 | 18 | ||
| 19 | RowLayout { | 19 | RowLayout { |
| 20 | property var sound: null; | 20 | property var sound: null; |
| @@ -1,9 +1,8 @@ | |||
| 1 | import Hifi 1.0 as Hifi | 1 | import Hifi 1.0 as Hifi |
| 2 | import QtQuick 2.5 | 2 | import QtQuick 2.5 |
| 3 | import QtQuick.Layouts 1.3 | 3 | import QtQuick.Layouts 1.3 |
| 4 | import "../../styles-uit" | 4 | import stylesUit 1.0 |
| 5 | import "../../controls-uit" as HifiControlsUit | 5 | import controlsUit 1.0 as HifiControlsUit |
| 6 | import "../../controls" as HifiControls | ||
| 7 | 6 | ||
| 8 | Rectangle { | 7 | Rectangle { |
| 9 | id: root; | 8 | id: root; |
| @@ -49,16 +48,32 @@ Rectangle { · 39 unmodified lines | |||
| 49 | refresh(avatar); | 48 | refresh(avatar); |
| 50 | } | 49 | } |
| 51 | 50 | ||
| 51 | function extractTitleFromUrl(url) { | ||
| 52 | for (var j = (url.length - 1); j >= 0; --j) { | ||
| 53 | if (url[j] === '/') { | ||
| 54 | return url.substring(j + 1); | ||
| 55 | } | ||
| 56 | } | ||
| 57 | return url; | ||
| 58 | } | ||
| 59 | |||
| 52 | function refresh(avatar) { | 60 | function refresh(avatar) { |
| 53 | wearablesCombobox.model.clear(); | 61 | wearablesCombobox.model.clear(); |
| 54 | wearablesCombobox.currentIndex = -1; | 62 | wearablesCombobox.currentIndex = -1; |
| 55 | 63 | ||
| 56 | for (var i = 0; i < avatar.wearables.count; ++i) { | 64 | for (var i = 0; i < avatar.wearables.count; ++i) { |
| 57 | var wearable = avatar.wearables.get(i).properties; | 65 | var wearable = avatar.wearables.get(i).properties; |
| 58 | for (var j = (wearable.modelURL.length - 1); j >= 0; --j) { | 66 | if (wearable.modelURL) { |
| 59 | if (wearable.modelURL[j] === '/') { | 67 | wearable.text = extractTitleFromUrl(wearable.modelURL); |
| 60 | wearable.text = wearable.modelURL.substring(j + 1); | 68 | } else if (wearable.materialURL) { |
| 61 | break; | 69 | var materialUrlOrJson = ''; |
| 70 | if (!wearable.materialURL.startsWith('materialData')) { | ||
| 71 | materialUrlOrJson = extractTitleFromUrl(wearable.materialURL); | ||
| 72 | } else if (wearable.materialData) { | ||
| 73 | materialUrlOrJson = JSON.stringify(JSON.parse(wearable.materialData)) | ||
| 74 | } | ||
| 75 | if(materialUrlOrJson) { | ||
| 76 | wearable.text = 'Material: ' + materialUrlOrJson; | ||
| 62 | } | 77 | } |
| 63 | } | 78 | } |
| 64 | wearablesCombobox.model.append(wearable); | 79 | wearablesCombobox.model.append(wearable); |
| @@ -1,6 +1,6 @@ | |||
| 1 | import Hifi 1.0 as Hifi | 1 | import Hifi 1.0 as Hifi |
| 2 | import QtQuick 2.5 | 2 | import QtQuick 2.5 |
| 3 | import "../../styles-uit" | 3 | import stylesUit 1.0 |
| 4 | 4 | ||
| 5 | ShadowRectangle { | 5 | ShadowRectangle { |
| 6 | id: header | 6 | id: header |
| @@ -10,7 +10,7 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import QtQuick.Window 2.2 | 12 | import QtQuick.Window 2.2 |
| 13 | import "../../styles-uit" | 13 | import stylesUit 1.0 |
| 14 | 14 | ||
| 15 | QtObject { | 15 | QtObject { |
| 16 | readonly property QtObject colors: QtObject { | 16 | readonly property QtObject colors: QtObject { |
| @@ -1,6 +1,6 @@ | |||
| 1 | import QtQuick 2.9 | 1 | import QtQuick 2.9 |
| 2 | import "../../controls-uit" | 2 | import controlsUit 1.0 |
| 3 | import "../../styles-uit" | 3 | import stylesUit 1.0 |
| 4 | 4 | ||
| 5 | ShadowRectangle { | 5 | ShadowRectangle { |
| 6 | property int wearablesCount: 0 | 6 | property int wearablesCount: 0 |
| @@ -1,6 +1,6 @@ | |||
| 1 | import QtQuick 2.5 | 1 | import QtQuick 2.5 |
| 2 | import "../../styles-uit" | 2 | import stylesUit 1.0 |
| 3 | import "../../controls-uit" as HifiControlsUit | 3 | import controlsUit 1.0 as HifiControlsUit |
| 4 | 4 | ||
| 5 | HifiControlsUit.Button { | 5 | HifiControlsUit.Button { |
| 6 | HifiConstants { | 6 | HifiConstants { |
| @@ -1,7 +1,7 @@ | |||
| 1 | import Hifi 1.0 as Hifi | 1 | import Hifi 1.0 as Hifi |
| 2 | import QtQuick 2.5 | 2 | import QtQuick 2.5 |
| 3 | import "../../styles-uit" | 3 | import stylesUit 1.0 |
| 4 | import "../../controls-uit" as HifiControlsUit | 4 | import controlsUit 1.0 as HifiControlsUit |
| 5 | import "../../controls" as HifiControls | 5 | import "../../controls" as HifiControls |
| 6 | 6 | ||
| 7 | Rectangle { | 7 | Rectangle { |
| @@ -1,7 +1,7 @@ | |||
| 1 | import QtQuick 2.5 | 1 | import QtQuick 2.5 |
| 2 | import QtQuick.Controls 2.2 | 2 | import QtQuick.Controls 2.2 |
| 3 | import "../../styles-uit" | 3 | import stylesUit 1.0 |
| 4 | import "../../controls-uit" as HifiControlsUit | 4 | import controlsUit 1.0 as HifiControlsUit |
| 5 | 5 | ||
| 6 | TextField { | 6 | TextField { |
| 7 | id: textField | 7 | id: textField |
| @@ -1,5 +1,5 @@ | |||
| 1 | import "../../controls-uit" as HifiControlsUit | 1 | import controlsUit 1.0 as HifiControlsUit |
| 2 | import "../../styles-uit" | 2 | import stylesUit 1.0 |
| 3 | 3 | ||
| 4 | import QtQuick 2.0 | 4 | import QtQuick 2.0 |
| 5 | import QtQuick.Controls 2.2 | 5 | import QtQuick.Controls 2.2 |
| @@ -1,7 +1,7 @@ | |||
| 1 | import Hifi 1.0 as Hifi | 1 | import Hifi 1.0 as Hifi |
| 2 | import QtQuick 2.5 | 2 | import QtQuick 2.5 |
| 3 | import "../../styles-uit" | 3 | import stylesUit 1.0 |
| 4 | import "../../controls-uit" as HifiControlsUit | 4 | import controlsUit 1.0 as HifiControlsUit |
| 5 | import "../../controls" as HifiControls | 5 | import "../../controls" as HifiControls |
| 6 | 6 | ||
| 7 | Rectangle { | 7 | Rectangle { |
| @@ -63,8 +63,8 @@ MessageBox { · 62 unmodified lines | |||
| 63 | popup.dialogButtons.yesButton.fontCapitalization = Font.MixedCase; | 63 | popup.dialogButtons.yesButton.fontCapitalization = Font.MixedCase; |
| 64 | popup.button1text = 'CANCEL' | 64 | popup.button1text = 'CANCEL' |
| 65 | popup.titleText = 'Get Wearables' | 65 | popup.titleText = 'Get Wearables' |
| 66 | popup.bodyText = 'Buy wearables from <b><a href="app://marketplace">Marketplace.</a></b>' + '<br/>' + | 66 | popup.bodyText = 'Get wearables from <b><a href="app://marketplace">Marketplace.</a></b>' + '<br/>' + |
| 67 | 'Wear wearable from <b><a href="app://purchases">My Purchases.</a></b>' + '<br/>' + '<br/>' + | 67 | 'Wear wearable from <b><a href="app://purchases">Inventory.</a></b>' + '<br/>' + '<br/>' + |
| 68 | 'Visit “AvatarIsland” to get wearables' | 68 | 'Visit “AvatarIsland” to get wearables' |
| 69 | 69 | ||
| 70 | popup.imageSource = getWearablesUrl; | 70 | popup.imageSource = getWearablesUrl; |
| @@ -89,7 +89,7 @@ MessageBox { · 18 unmodified lines | |||
| 89 | 89 | ||
| 90 | function showDeleteFavorite(favoriteName, callback) { | 90 | function showDeleteFavorite(favoriteName, callback) { |
| 91 | popup.titleText = 'Delete Favorite: {AvatarName}'.replace('{AvatarName}', favoriteName) | 91 | popup.titleText = 'Delete Favorite: {AvatarName}'.replace('{AvatarName}', favoriteName) |
| 92 | popup.bodyText = 'This will delete your favorite. You will retain access to the wearables and avatar that made up the favorite from My Purchases.' | 92 | popup.bodyText = 'This will delete your favorite. You will retain access to the wearables and avatar that made up the favorite from Inventory.' |
| 93 | popup.imageSource = null; | 93 | popup.imageSource = null; |
| 94 | popup.button1text = 'CANCEL' | 94 | popup.button1text = 'CANCEL' |
| 95 | popup.button2text = 'DELETE' | 95 | popup.button2text = 'DELETE' |
| @@ -128,8 +128,8 @@ MessageBox { · 32 unmodified lines | |||
| 128 | popup.button1text = 'CANCEL' | 128 | popup.button1text = 'CANCEL' |
| 129 | popup.titleText = 'Get Avatars' | 129 | popup.titleText = 'Get Avatars' |
| 130 | 130 | ||
| 131 | popup.bodyText = 'Buy avatars from <b><a href="app://marketplace">Marketplace.</a></b>' + '<br/>' + | 131 | popup.bodyText = 'Get avatars from <b><a href="app://marketplace">Marketplace.</a></b>' + '<br/>' + |
| 132 | 'Wear avatars in <b><a href="app://purchases">My Purchases.</a></b>' + '<br/>' + '<br/>' + | 132 | 'Wear avatars in <b><a href="app://purchases">Inventory.</a></b>' + '<br/>' + '<br/>' + |
| 133 | 'Visit “BodyMart” to get free avatars.' | 133 | 'Visit “BodyMart” to get free avatars.' |
| 134 | 134 | ||
| 135 | popup.imageSource = getAvatarsUrl; | 135 | popup.imageSource = getAvatarsUrl; |
| @@ -2,8 +2,8 @@ import Hifi 1.0 as Hifi · 1 unmodified line | |||
| 2 | import QtQuick 2.5 | 2 | import QtQuick 2.5 |
| 3 | import QtQuick.Controls 2.2 | 3 | import QtQuick.Controls 2.2 |
| 4 | import QtQuick.Layouts 1.3 | 4 | import QtQuick.Layouts 1.3 |
| 5 | import "../../styles-uit" | 5 | import stylesUit 1.0 |
| 6 | import "../../controls-uit" as HifiControlsUit | 6 | import controlsUit 1.0 as HifiControlsUit |
| 7 | import "../../controls" as HifiControls | 7 | import "../../controls" as HifiControls |
| 8 | 8 | ||
| 9 | Rectangle { | 9 | Rectangle { |
| @@ -14,6 +14,22 @@ Rectangle { · 4 unmodified lines | |||
| 14 | 14 | ||
| 15 | signal scaleChanged(real scale); | 15 | signal scaleChanged(real scale); |
| 16 | 16 | ||
| 17 | property bool keyboardEnabled: true | ||
| 18 | property bool keyboardRaised: false | ||
| 19 | property bool punctuationMode: false | ||
| 20 | |||
| 21 | HifiControlsUit.Keyboard { | ||
| 22 | id: keyboard | ||
| 23 | z: 1000 | ||
| 24 | raised: parent.keyboardEnabled && parent.keyboardRaised | ||
| 25 | numeric: parent.punctuationMode | ||
| 26 | anchors { | ||
| 27 | left: parent.left | ||
| 28 | right: parent.right | ||
| 29 | bottom: parent.bottom | ||
| 30 | } | ||
| 31 | } | ||
| 32 | |||
| 17 | property alias onSaveClicked: dialogButtons.onYesClicked | 33 | property alias onSaveClicked: dialogButtons.onYesClicked |
| 18 | property alias onCancelClicked: dialogButtons.onNoClicked | 34 | property alias onCancelClicked: dialogButtons.onNoClicked |
| 19 | 35 | ||
| @@ -314,6 +330,10 @@ Rectangle { · 294 unmodified lines | |||
| 314 | anchors.left: parent.left | 330 | anchors.left: parent.left |
| 315 | anchors.right: parent.right | 331 | anchors.right: parent.right |
| 316 | placeholderText: 'user\\file\\dir' | 332 | placeholderText: 'user\\file\\dir' |
| 333 | |||
| 334 | onFocusChanged: { | ||
| 335 | keyboardRaised = (avatarAnimationUrlInputText.focus || avatarCollisionSoundUrlInputText.focus); | ||
| 336 | } | ||
| 317 | } | 337 | } |
| 318 | } | 338 | } |
| 319 | 339 | ||
| @@ -340,6 +360,10 @@ Rectangle { · 20 unmodified lines | |||
| 340 | anchors.left: parent.left | 360 | anchors.left: parent.left |
| 341 | anchors.right: parent.right | 361 | anchors.right: parent.right |
| 342 | placeholderText: 'https://hifi-public.s3.amazonaws.com/sounds/Collisions-' | 362 | placeholderText: 'https://hifi-public.s3.amazonaws.com/sounds/Collisions-' |
| 363 | |||
| 364 | onFocusChanged: { | ||
| 365 | keyboardRaised = (avatarAnimationUrlInputText.focus || avatarCollisionSoundUrlInputText.focus); | ||
| 366 | } | ||
| 343 | } | 367 | } |
| 344 | } | 368 | } |
| 345 | 369 | ||
| @@ -1,4 +1,4 @@ | |||
| 1 | import "../../styles-uit" | 1 | import stylesUit 1.0 |
| 2 | import QtQuick 2.9 | 2 | import QtQuick 2.9 |
| 3 | import QtGraphicalEffects 1.0 | 3 | import QtGraphicalEffects 1.0 |
| 4 | 4 | ||
| @@ -1,4 +1,4 @@ | |||
| 1 | import "../../styles-uit" | 1 | import stylesUit 1.0 |
| 2 | import QtQuick 2.9 | 2 | import QtQuick 2.9 |
| 3 | import QtGraphicalEffects 1.0 | 3 | import QtGraphicalEffects 1.0 |
| 4 | 4 | ||
| @@ -1,4 +1,4 @@ | |||
| 1 | import "../../styles-uit" | 1 | import stylesUit 1.0 |
| 2 | import QtQuick 2.9 | 2 | import QtQuick 2.9 |
| 3 | import QtGraphicalEffects 1.0 | 3 | import QtGraphicalEffects 1.0 |
| 4 | 4 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | import "../../styles-uit" | 1 | import stylesUit 1.0 |
| 2 | import "../../controls-uit" as HifiControlsUit | 2 | import controlsUit 1.0 as HifiControlsUit |
| 3 | import QtQuick 2.9 | 3 | import QtQuick 2.9 |
| 4 | import QtGraphicalEffects 1.0 | 4 | import QtGraphicalEffects 1.0 |
| 5 | 5 | ||
| @@ -1,7 +1,7 @@ | |||
| 1 | import Hifi 1.0 as Hifi | 1 | import Hifi 1.0 as Hifi |
| 2 | import QtQuick 2.5 | 2 | import QtQuick 2.5 |
| 3 | import "../../styles-uit" | 3 | import stylesUit 1.0 |
| 4 | import "../../controls-uit" as HifiControlsUit | 4 | import controlsUit 1.0 as HifiControlsUit |
| 5 | import "../../controls" as HifiControls | 5 | import "../../controls" as HifiControls |
| 6 | 6 | ||
| 7 | Row { | 7 | Row { |
| @@ -1,6 +1,6 @@ | |||
| 1 | import QtQuick 2.5 | 1 | import QtQuick 2.5 |
| 2 | import "../../styles-uit" | 2 | import stylesUit 1.0 |
| 3 | import "../../controls-uit" as HifiControlsUit | 3 | import controlsUit 1.0 as HifiControlsUit |
| 4 | 4 | ||
| 5 | HifiControlsUit.Button { | 5 | HifiControlsUit.Button { |
| 6 | HifiConstants { | 6 | HifiConstants { |
| @@ -14,8 +14,8 @@ · 13 unmodified lines | |||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import QtQuick.Controls 1.4 | 16 | import QtQuick.Controls 1.4 |
| 17 | import "../../../styles-uit" | 17 | import stylesUit 1.0 |
| 18 | import "../../../controls-uit" as HifiControlsUit | 18 | import controlsUit 1.0 as HifiControlsUit |
| 19 | import "../../../controls" as HifiControls | 19 | import "../../../controls" as HifiControls |
| 20 | import "../wallet" as HifiWallet | 20 | import "../wallet" as HifiWallet |
| 21 | import "../common" as HifiCommerceCommon | 21 | import "../common" as HifiCommerceCommon |
| @@ -55,6 +55,7 @@ Rectangle { · 33 unmodified lines | |||
| 55 | property bool isInstalled; | 55 | property bool isInstalled; |
| 56 | property bool isUpdating; | 56 | property bool isUpdating; |
| 57 | property string baseAppURL; | 57 | property string baseAppURL; |
| 58 | property int currentUpdatesPage: 1; | ||
| 58 | // Style | 59 | // Style |
| 59 | color: hifi.colors.white; | 60 | color: hifi.colors.white; |
| 60 | Connections { | 61 | Connections { |
| @@ -156,8 +157,14 @@ Rectangle { · 95 unmodified lines | |||
| 156 | break; | 157 | break; |
| 157 | } | 158 | } |
| 158 | } | 159 | } |
| 159 | root.availableUpdatesReceived = true; | 160 | |
| 160 | refreshBuyUI(); | 161 | if (result.data.updates.length === 0 || root.isUpdating) { |
| 162 | root.availableUpdatesReceived = true; | ||
| 163 | refreshBuyUI(); | ||
| 164 | } else { | ||
| 165 | root.currentUpdatesPage++; | ||
| 166 | Commerce.getAvailableUpdates(root.itemId, currentUpdatesPage) | ||
| 167 | } | ||
| 161 | } | 168 | } |
| 162 | } | 169 | } |
| 163 | 170 | ||
| @@ -176,6 +183,7 @@ Rectangle { · 12 unmodified lines | |||
| 176 | root.ownershipStatusReceived = false; | 183 | root.ownershipStatusReceived = false; |
| 177 | Commerce.alreadyOwned(root.itemId); | 184 | Commerce.alreadyOwned(root.itemId); |
| 178 | root.availableUpdatesReceived = false; | 185 | root.availableUpdatesReceived = false; |
| 186 | root.currentUpdatesPage = 1; | ||
| 179 | Commerce.getAvailableUpdates(root.itemId); | 187 | Commerce.getAvailableUpdates(root.itemId); |
| 180 | itemPreviewImage.source = "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/" + itemId + "/thumbnail/hifi-mp-" + itemId + ".jpg"; | 188 | itemPreviewImage.source = "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/" + itemId + "/thumbnail/hifi-mp-" + itemId + ".jpg"; |
| 181 | } | 189 | } |
| @@ -240,11 +248,6 @@ Rectangle { · 58 unmodified lines | |||
| 240 | lightboxPopup.button1method = function() { | 248 | lightboxPopup.button1method = function() { |
| 241 | lightboxPopup.visible = false; | 249 | lightboxPopup.visible = false; |
| 242 | } | 250 | } |
| 243 | lightboxPopup.button2text = "GO TO WALLET"; | ||
| 244 | lightboxPopup.button2method = function() { | ||
| 245 | lightboxPopup.visible = false; | ||
| 246 | sendToScript({method: 'checkout_openWallet'}); | ||
| 247 | }; | ||
| 248 | lightboxPopup.visible = true; | 251 | lightboxPopup.visible = true; |
| 249 | } else { | 252 | } else { |
| 250 | sendToScript(msg); | 253 | sendToScript(msg); |
| @@ -383,7 +386,7 @@ Rectangle { · 132 unmodified lines | |||
| 383 | anchors.leftMargin: 16; | 386 | anchors.leftMargin: 16; |
| 384 | width: paintedWidth; | 387 | width: paintedWidth; |
| 385 | height: paintedHeight; | 388 | height: paintedHeight; |
| 386 | text: "Review Purchase:"; | 389 | text: "Review:"; |
| 387 | color: hifi.colors.black; | 390 | color: hifi.colors.black; |
| 388 | size: 28; | 391 | size: 28; |
| 389 | } | 392 | } |
| @@ -448,7 +451,7 @@ Rectangle { · 58 unmodified lines | |||
| 448 | // "HFC" balance label | 451 | // "HFC" balance label |
| 449 | HiFiGlyphs { | 452 | HiFiGlyphs { |
| 450 | id: itemPriceTextLabel; | 453 | id: itemPriceTextLabel; |
| 451 | visible: !(root.isUpdating && root.itemEdition > 0); | 454 | visible: !(root.isUpdating && root.itemEdition > 0) && (root.itemPrice > 0); |
| 452 | text: hifi.glyphs.hfc; | 455 | text: hifi.glyphs.hfc; |
| 453 | // Size | 456 | // Size |
| 454 | size: 30; | 457 | size: 30; |
| @@ -464,7 +467,7 @@ Rectangle { · 9 unmodified lines | |||
| 464 | } | 467 | } |
| 465 | FiraSansSemiBold { | 468 | FiraSansSemiBold { |
| 466 | id: itemPriceText; | 469 | id: itemPriceText; |
| 467 | text: (root.isUpdating && root.itemEdition > 0) ? "FREE\nUPDATE" : ((root.itemPrice === -1) ? "--" : root.itemPrice); | 470 | text: (root.isUpdating && root.itemEdition > 0) ? "FREE\nUPDATE" : ((root.itemPrice === -1) ? "--" : ((root.itemPrice > 0) ? root.itemPrice : "FREE")); |
| 468 | // Text size | 471 | // Text size |
| 469 | size: (root.isUpdating && root.itemEdition > 0) ? 20 : 26; | 472 | size: (root.isUpdating && root.itemEdition > 0) ? 20 : 26; |
| 470 | // Anchors | 473 | // Anchors |
| @@ -559,7 +562,7 @@ Rectangle { · 88 unmodified lines | |||
| 559 | } | 562 | } |
| 560 | } | 563 | } |
| 561 | 564 | ||
| 562 | // "View in My Purchases" button | 565 | // "View in Inventory" button |
| 563 | HifiControlsUit.Button { | 566 | HifiControlsUit.Button { |
| 564 | id: viewInMyPurchasesButton; | 567 | id: viewInMyPurchasesButton; |
| 565 | visible: false; | 568 | visible: false; |
| @@ -570,7 +573,7 @@ Rectangle { · 4 unmodified lines | |||
| 570 | height: 50; | 573 | height: 50; |
| 571 | anchors.left: parent.left; | 574 | anchors.left: parent.left; |
| 572 | anchors.right: parent.right; | 575 | anchors.right: parent.right; |
| 573 | text: root.isUpdating ? "UPDATE TO THIS ITEM FOR FREE" : "VIEW THIS ITEM IN MY PURCHASES"; | 576 | text: root.isUpdating ? "UPDATE TO THIS ITEM FOR FREE" : "VIEW THIS ITEM IN YOUR INVENTORY"; |
| 574 | onClicked: { | 577 | onClicked: { |
| 575 | if (root.isUpdating) { | 578 | if (root.isUpdating) { |
| 576 | sendToScript({method: 'checkout_goToPurchases', filterText: root.baseItemName}); | 579 | sendToScript({method: 'checkout_goToPurchases', filterText: root.baseItemName}); |
| @@ -594,7 +597,7 @@ Rectangle { · 17 unmodified lines | |||
| 594 | anchors.left: parent.left; | 597 | anchors.left: parent.left; |
| 595 | anchors.right: parent.right; | 598 | anchors.right: parent.right; |
| 596 | text: (root.isUpdating && root.itemEdition > 0) ? "CONFIRM UPDATE" : (((root.isCertified) ? ((ownershipStatusReceived && balanceReceived && availableUpdatesReceived) ? | 599 | text: (root.isUpdating && root.itemEdition > 0) ? "CONFIRM UPDATE" : (((root.isCertified) ? ((ownershipStatusReceived && balanceReceived && availableUpdatesReceived) ? |
| 597 | ((viewInMyPurchasesButton.visible && !root.isUpdating) ? "Buy It Again" : "Confirm Purchase") : "--") : "Get Item")); | 600 | ((viewInMyPurchasesButton.visible && !root.isUpdating) ? "Get It Again" : "Confirm") : "--") : "Get Item")); |
| 598 | onClicked: { | 601 | onClicked: { |
| 599 | if (root.isUpdating && root.itemEdition > 0) { | 602 | if (root.isUpdating && root.itemEdition > 0) { |
| 600 | // If we're updating an app, the existing app needs to be uninstalled. | 603 | // If we're updating an app, the existing app needs to be uninstalled. |
| @@ -608,9 +611,9 @@ Rectangle { · 7 unmodified lines | |||
| 608 | } else if (root.isCertified) { | 611 | } else if (root.isCertified) { |
| 609 | if (!root.shouldBuyWithControlledFailure) { | 612 | if (!root.shouldBuyWithControlledFailure) { |
| 610 | if (root.itemType === "contentSet" && !Entities.canReplaceContent()) { | 613 | if (root.itemType === "contentSet" && !Entities.canReplaceContent()) { |
| 611 | lightboxPopup.titleText = "Purchase Content Set"; | 614 | lightboxPopup.titleText = "Get Content Set"; |
| 612 | lightboxPopup.bodyText = "You will not be able to replace this domain's content with <b>" + root.itemName + | 615 | lightboxPopup.bodyText = "You will not be able to replace this domain's content with <b>" + root.itemName + |
| 613 | " </b>until the server owner gives you 'Replace Content' permissions.<br><br>Are you sure you want to purchase this content set?"; | 616 | " </b>until the server owner gives you 'Replace Content' permissions.<br><br>Are you sure you want to get this content set?"; |
| 614 | lightboxPopup.button1text = "CANCEL"; | 617 | lightboxPopup.button1text = "CANCEL"; |
| 615 | lightboxPopup.button1method = function() { | 618 | lightboxPopup.button1method = function() { |
| 616 | lightboxPopup.visible = false; | 619 | lightboxPopup.visible = false; |
| @@ -694,7 +697,7 @@ Rectangle { · 77 unmodified lines | |||
| 694 | id: completeText2; | 697 | id: completeText2; |
| 695 | text: "The " + (root.itemTypesText)[itemTypesArray.indexOf(root.itemType)] + | 698 | text: "The " + (root.itemTypesText)[itemTypesArray.indexOf(root.itemType)] + |
| 696 | ' <font color="' + hifi.colors.blueAccent + '"><a href="#">' + root.itemName + '</a></font>' + | 699 | ' <font color="' + hifi.colors.blueAccent + '"><a href="#">' + root.itemName + '</a></font>' + |
| 697 | " has been added to your Purchases and a receipt will appear in your Wallet's transaction history."; | 700 | " has been added to your Inventory."; |
| 698 | // Text size | 701 | // Text size |
| 699 | size: 18; | 702 | size: 18; |
| 700 | // Anchors | 703 | // Anchors |
| @@ -833,7 +836,7 @@ Rectangle { · 132 unmodified lines | |||
| 833 | } | 836 | } |
| 834 | lightboxPopup.button2text = "OPEN GOTO"; | 837 | lightboxPopup.button2text = "OPEN GOTO"; |
| 835 | lightboxPopup.button2method = function() { | 838 | lightboxPopup.button2method = function() { |
| 836 | sendToScript({method: 'purchases_openGoTo'}); | 839 | sendToScript({method: 'checkout_openGoTo'}); |
| 837 | lightboxPopup.visible = false; | 840 | lightboxPopup.visible = false; |
| 838 | }; | 841 | }; |
| 839 | lightboxPopup.visible = true; | 842 | lightboxPopup.visible = true; |
| @@ -864,7 +867,7 @@ Rectangle { · 24 unmodified lines | |||
| 864 | 867 | ||
| 865 | RalewaySemiBold { | 868 | RalewaySemiBold { |
| 866 | id: myPurchasesLink; | 869 | id: myPurchasesLink; |
| 867 | text: '<font color="' + hifi.colors.primaryHighlight + '"><a href="#">View this item in My Purchases</a></font>'; | 870 | text: '<font color="' + hifi.colors.primaryHighlight + '"><a href="#">View this item in your Inventory</a></font>'; |
| 868 | // Text size | 871 | // Text size |
| 869 | size: 18; | 872 | size: 18; |
| 870 | // Anchors | 873 | // Anchors |
| @@ -886,7 +889,8 @@ Rectangle { · 15 unmodified lines | |||
| 886 | 889 | ||
| 887 | RalewaySemiBold { | 890 | RalewaySemiBold { |
| 888 | id: walletLink; | 891 | id: walletLink; |
| 889 | text: '<font color="' + hifi.colors.primaryHighlight + '"><a href="#">View receipt in Wallet</a></font>'; | 892 | visible: !WalletScriptingInterface.limitedCommerce; |
| 893 | text: '<font color="' + hifi.colors.primaryHighlight + '"><a href="#">View receipt in Recent Activity</a></font>'; | ||
| 890 | // Text size | 894 | // Text size |
| 891 | size: 18; | 895 | size: 18; |
| 892 | // Anchors | 896 | // Anchors |
| @@ -902,18 +906,18 @@ Rectangle { · 9 unmodified lines | |||
| 902 | horizontalAlignment: Text.AlignLeft; | 906 | horizontalAlignment: Text.AlignLeft; |
| 903 | verticalAlignment: Text.AlignVCenter; | 907 | verticalAlignment: Text.AlignVCenter; |
| 904 | onLinkActivated: { | 908 | onLinkActivated: { |
| 905 | sendToScript({method: 'purchases_openWallet'}); | 909 | sendToScript({method: 'checkout_openRecentActivity'}); |
| 906 | } | 910 | } |
| 907 | } | 911 | } |
| 908 | 912 | ||
| 909 | RalewayRegular { | 913 | RalewayRegular { |
| 910 | id: pendingText; | 914 | id: pendingText; |
| 911 | text: 'Your item is marked "pending" while your purchase is being confirmed. ' + | 915 | text: 'Your item is marked "pending" while the transfer is being confirmed. ' + |
| 912 | '<b><font color="' + hifi.colors.primaryHighlight + '"><a href="#">Learn More</a></font></b>'; | 916 | '<b><font color="' + hifi.colors.primaryHighlight + '"><a href="#">Learn More</a></font></b>'; |
| 913 | // Text size | 917 | // Text size |
| 914 | size: 18; | 918 | size: 18; |
| 915 | // Anchors | 919 | // Anchors |
| 916 | anchors.top: walletLink.bottom; | 920 | anchors.top: walletLink.visible ? walletLink.bottom : myPurchasesLink.bottom; |
| 917 | anchors.topMargin: 32; | 921 | anchors.topMargin: 32; |
| 918 | height: paintedHeight; | 922 | height: paintedHeight; |
| 919 | anchors.left: parent.left; | 923 | anchors.left: parent.left; |
| @@ -925,8 +929,8 @@ Rectangle { · 5 unmodified lines | |||
| 925 | horizontalAlignment: Text.AlignLeft; | 929 | horizontalAlignment: Text.AlignLeft; |
| 926 | verticalAlignment: Text.AlignVCenter; | 930 | verticalAlignment: Text.AlignVCenter; |
| 927 | onLinkActivated: { | 931 | onLinkActivated: { |
| 928 | lightboxPopup.titleText = "Purchase Confirmations"; | 932 | lightboxPopup.titleText = "Confirmations"; |
| 929 | lightboxPopup.bodyText = 'Your item is marked "pending" while your purchase is being confirmed.<br><br>' + | 933 | lightboxPopup.bodyText = 'Your item is marked "pending" while the transfer is being confirmed.<br><br>' + |
| 930 | 'Confirmations usually take about 90 seconds.'; | 934 | 'Confirmations usually take about 90 seconds.'; |
| 931 | lightboxPopup.button1text = "CLOSE"; | 935 | lightboxPopup.button1text = "CLOSE"; |
| 932 | lightboxPopup.button1method = function() { | 936 | lightboxPopup.button1method = function() { |
| @@ -936,9 +940,9 @@ Rectangle { · 3 unmodified lines | |||
| 936 | } | 940 | } |
| 937 | } | 941 | } |
| 938 | 942 | ||
| 939 | // "Continue Shopping" button | 943 | // "Continue" button |
| 940 | HifiControlsUit.Button { | 944 | HifiControlsUit.Button { |
| 941 | id: continueShoppingButton; | 945 | id: continueButton; |
| 942 | color: hifi.buttons.noneBorderlessGray; | 946 | color: hifi.buttons.noneBorderlessGray; |
| 943 | colorScheme: hifi.colorSchemes.light; | 947 | colorScheme: hifi.colorSchemes.light; |
| 944 | anchors.bottom: parent.bottom; | 948 | anchors.bottom: parent.bottom; |
| @@ -946,9 +950,9 @@ Rectangle { · 1 unmodified line | |||
| 946 | anchors.right: parent.right; | 950 | anchors.right: parent.right; |
| 947 | width: 193; | 951 | width: 193; |
| 948 | height: 44; | 952 | height: 44; |
| 949 | text: "Continue Shopping"; | 953 | text: "Continue"; |
| 950 | onClicked: { | 954 | onClicked: { |
| 951 | sendToScript({method: 'checkout_continueShopping', itemId: itemId}); | 955 | sendToScript({method: 'checkout_continue', itemId: itemId}); |
| 952 | } | 956 | } |
| 953 | } | 957 | } |
| 954 | } | 958 | } |
| @@ -971,7 +975,7 @@ Rectangle { · 16 unmodified lines | |||
| 971 | 975 | ||
| 972 | RalewayRegular { | 976 | RalewayRegular { |
| 973 | id: failureHeaderText; | 977 | id: failureHeaderText; |
| 974 | text: "<b>Purchase Failed.</b><br>Your Purchases and HFC balance haven't changed."; | 978 | text: "<b>Purchase Failed.</b><br>Your Inventory and HFC balance haven't changed."; |
| 975 | // Text size | 979 | // Text size |
| 976 | size: 24; | 980 | size: 24; |
| 977 | // Anchors | 981 | // Anchors |
| @@ -1037,7 +1041,7 @@ Rectangle { · 59 unmodified lines | |||
| 1037 | width: parent.width/2 - anchors.leftMargin*2; | 1041 | width: parent.width/2 - anchors.leftMargin*2; |
| 1038 | text: "Back to Marketplace"; | 1042 | text: "Back to Marketplace"; |
| 1039 | onClicked: { | 1043 | onClicked: { |
| 1040 | sendToScript({method: 'checkout_continueShopping', itemId: itemId}); | 1044 | sendToScript({method: 'checkout_continue', itemId: itemId}); |
| 1041 | } | 1045 | } |
| 1042 | } | 1046 | } |
| 1043 | } | 1047 | } |
| @@ -1122,10 +1126,10 @@ Rectangle { · 78 unmodified lines | |||
| 1122 | if (root.balanceAfterPurchase < 0) { | 1126 | if (root.balanceAfterPurchase < 0) { |
| 1123 | // If you already own the item... | 1127 | // If you already own the item... |
| 1124 | if (!root.alreadyOwned) { | 1128 | if (!root.alreadyOwned) { |
| 1125 | buyText.text = "<b>Your Wallet does not have sufficient funds to purchase this item.</b>"; | 1129 | buyText.text = "<b>You do not have sufficient funds to purchase this item.</b>"; |
| 1126 | // Else if you don't already own the item... | 1130 | // Else if you don't already own the item... |
| 1127 | } else if (canBuyAgain()) { | 1131 | } else if (canBuyAgain()) { |
| 1128 | buyText.text = "<b>Your Wallet does not have sufficient funds to purchase this item again.</b>"; | 1132 | buyText.text = "<b>You do not have sufficient funds to purchase this item again.</b>"; |
| 1129 | } else { | 1133 | } else { |
| 1130 | buyText.text = "<b>While you do not have sufficient funds to buy this, you already have this item.</b>" | 1134 | buyText.text = "<b>While you do not have sufficient funds to buy this, you already have this item.</b>" |
| 1131 | } | 1135 | } |
| @@ -1171,7 +1175,7 @@ Rectangle { · 39 unmodified lines | |||
| 1171 | buyText.text = ""; | 1175 | buyText.text = ""; |
| 1172 | } | 1176 | } |
| 1173 | } else { | 1177 | } else { |
| 1174 | buyText.text = '<i>This type of item cannot currently be certified, so it will not show up in "My Purchases". You can access it again for free from the Marketplace.</i>'; | 1178 | buyText.text = '<i>This type of item cannot currently be certified, so it will not show up in "Inventory". You can access it again for free from the Marketplace.</i>'; |
| 1175 | buyTextContainer.color = hifi.colors.white; | 1179 | buyTextContainer.color = hifi.colors.white; |
| 1176 | buyTextContainer.border.color = hifi.colors.white; | 1180 | buyTextContainer.border.color = hifi.colors.white; |
| 1177 | buyGlyph.text = ""; | 1181 | buyGlyph.text = ""; |
| @@ -1185,6 +1189,7 @@ Rectangle { · 7 unmodified lines | |||
| 1185 | root.ownershipStatusReceived = false; | 1189 | root.ownershipStatusReceived = false; |
| 1186 | Commerce.alreadyOwned(root.itemId); | 1190 | Commerce.alreadyOwned(root.itemId); |
| 1187 | root.availableUpdatesReceived = false; | 1191 | root.availableUpdatesReceived = false; |
| 1192 | root.currentUpdatesPage = 1; | ||
| 1188 | Commerce.getAvailableUpdates(root.itemId); | 1193 | Commerce.getAvailableUpdates(root.itemId); |
| 1189 | root.balanceReceived = false; | 1194 | root.balanceReceived = false; |
| 1190 | Commerce.balance(); | 1195 | Commerce.balance(); |
| @@ -14,9 +14,9 @@ · 13 unmodified lines | |||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import QtGraphicalEffects 1.0 | 16 | import QtGraphicalEffects 1.0 |
| 17 | import "../../../styles-uit" | 17 | import stylesUit 1.0 |
| 18 | import "../../../controls-uit" as HifiControlsUit | 18 | import controlsUit 1.0 as HifiControlsUit |
| 19 | import "../../../controls" as HifiControls | 19 | import "qrc:////qml//controls" as HifiControls |
| 20 | 20 | ||
| 21 | // references XXX from root context | 21 | // references XXX from root context |
| 22 | 22 | ||
| @@ -33,13 +33,15 @@ Rectangle { · 10 unmodified lines | |||
| 33 | property string buttonLayout: "leftright"; | 33 | property string buttonLayout: "leftright"; |
| 34 | 34 | ||
| 35 | readonly property string securityPicBodyText: "When you see your Security Pic, your actions and data are securely making use of your " + | 35 | readonly property string securityPicBodyText: "When you see your Security Pic, your actions and data are securely making use of your " + |
| 36 | "Wallet's private keys.<br><br>You can change your Security Pic in your Wallet."; | 36 | "private keys.<br><br>You can change your Security Pic via Settings > Security..."; |
| 37 | 37 | ||
| 38 | id: root; | 38 | id: root; |
| 39 | visible: false; | 39 | visible: false; |
| 40 | anchors.fill: parent; | 40 | anchors.fill: parent; |
| 41 | color: Qt.rgba(0, 0, 0, 0.5); | 41 | color: Qt.rgba(0, 0, 0, 0.5); |
| 42 | z: 999; | 42 | z: 999; |
| 43 | |||
| 44 | HifiConstants { id: hifi; } | ||
| 43 | 45 | ||
| 44 | onVisibleChanged: { | 46 | onVisibleChanged: { |
| 45 | if (!visible) { | 47 | if (!visible) { |
| @@ -14,8 +14,8 @@ · 13 unmodified lines | |||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.7 | 15 | import QtQuick 2.7 |
| 16 | import QtGraphicalEffects 1.0 | 16 | import QtGraphicalEffects 1.0 |
| 17 | import "../../../styles-uit" | 17 | import stylesUit 1.0 |
| 18 | import "../../../controls-uit" as HifiControlsUit | 18 | import controlsUit 1.0 as HifiControlsUit |
| 19 | import "../../../controls" as HifiControls | 19 | import "../../../controls" as HifiControls |
| 20 | 20 | ||
| 21 | // references XXX from root context | 21 | // references XXX from root context |
| @@ -27,7 +27,6 @@ Item { · 5 unmodified lines | |||
| 27 | property string referrerURL: (Account.metaverseServerURL + "/marketplace?"); | 27 | property string referrerURL: (Account.metaverseServerURL + "/marketplace?"); |
| 28 | readonly property int additionalDropdownHeight: usernameDropdown.height - myUsernameButton.anchors.bottomMargin; | 28 | readonly property int additionalDropdownHeight: usernameDropdown.height - myUsernameButton.anchors.bottomMargin; |
| 29 | property alias usernameDropdownVisible: usernameDropdown.visible; | 29 | property alias usernameDropdownVisible: usernameDropdown.visible; |
| 30 | property bool messagesWaiting: false; | ||
| 31 | 30 | ||
| 32 | height: mainContainer.height + additionalDropdownHeight; | 31 | height: mainContainer.height + additionalDropdownHeight; |
| 33 | 32 | ||
| @@ -38,7 +37,6 @@ Item { · 4 unmodified lines | |||
| 38 | if (walletStatus === 0) { | 37 | if (walletStatus === 0) { |
| 39 | sendToParent({method: "needsLogIn"}); | 38 | sendToParent({method: "needsLogIn"}); |
| 40 | } else if (walletStatus === 5) { | 39 | } else if (walletStatus === 5) { |
| 41 | Commerce.getAvailableUpdates(); | ||
| 42 | Commerce.getSecurityImage(); | 40 | Commerce.getSecurityImage(); |
| 43 | } else if (walletStatus > 5) { | 41 | } else if (walletStatus > 5) { |
| 44 | console.log("ERROR in EmulatedMarketplaceHeader.qml: Unknown wallet status: " + walletStatus); | 42 | console.log("ERROR in EmulatedMarketplaceHeader.qml: Unknown wallet status: " + walletStatus); |
| @@ -59,14 +57,6 @@ Item { · 14 unmodified lines | |||
| 59 | securityImage.source = "image://security/securityImage"; | 57 | securityImage.source = "image://security/securityImage"; |
| 60 | } | 58 | } |
| 61 | } | 59 | } |
| 62 | |||
| 63 | onAvailableUpdatesResult: { | ||
| 64 | if (result.status !== 'success') { | ||
| 65 | console.log("Failed to get Available Updates", result.data.message); | ||
| 66 | } else { | ||
| 67 | root.messagesWaiting = result.data.updates.length > 0; | ||
| 68 | } | ||
| 69 | } | ||
| 70 | } | 60 | } |
| 71 | 61 | ||
| 72 | Component.onCompleted: { | 62 | Component.onCompleted: { |
| @@ -118,50 +108,6 @@ Item { · 45 unmodified lines | |||
| 118 | anchors.right: securityImage.left; | 108 | anchors.right: securityImage.left; |
| 119 | anchors.rightMargin: 6; | 109 | anchors.rightMargin: 6; |
| 120 | 110 | ||
| 121 | Rectangle { | ||
| 122 | id: myPurchasesLink; | ||
| 123 | anchors.right: myUsernameButton.left; | ||
| 124 | anchors.rightMargin: 8; | ||
| 125 | anchors.verticalCenter: parent.verticalCenter; | ||
| 126 | height: 40; | ||
| 127 | width: myPurchasesText.paintedWidth + 10; | ||
| 128 | |||
| 129 | RalewaySemiBold { | ||
| 130 | id: myPurchasesText; | ||
| 131 | text: "My Purchases"; | ||
| 132 | // Text size | ||
| 133 | size: 18; | ||
| 134 | // Style | ||
| 135 | color: hifi.colors.blueAccent; | ||
| 136 | horizontalAlignment: Text.AlignHCenter; | ||
| 137 | verticalAlignment: Text.AlignVCenter; | ||
| 138 | // Anchors | ||
| 139 | anchors.centerIn: parent; | ||
| 140 | } | ||
| 141 | |||
| 142 | MouseArea { | ||
| 143 | anchors.fill: parent; | ||
| 144 | hoverEnabled: enabled; | ||
| 145 | onClicked: { | ||
| 146 | sendToParent({ method: 'header_goToPurchases', hasUpdates: root.messagesWaiting }); | ||
| 147 | } | ||
| 148 | onEntered: myPurchasesText.color = hifi.colors.blueHighlight; | ||
| 149 | onExited: myPurchasesText.color = hifi.colors.blueAccent; | ||
| 150 | } | ||
| 151 | } | ||
| 152 | |||
| 153 | Rectangle { | ||
| 154 | id: messagesWaitingLight; | ||
| 155 | visible: root.messagesWaiting; | ||
| 156 | anchors.right: myPurchasesLink.left; | ||
| 157 | anchors.rightMargin: -2; | ||
| 158 | anchors.verticalCenter: parent.verticalCenter; | ||
| 159 | height: 10; | ||
| 160 | width: height; | ||
| 161 | radius: height/2; | ||
| 162 | color: "red"; | ||
| 163 | } | ||
| 164 | |||
| 165 | TextMetrics { | 111 | TextMetrics { |
| 166 | id: textMetrics; | 112 | id: textMetrics; |
| 167 | font.family: "Raleway" | 113 | font.family: "Raleway" |
| @@ -267,7 +213,7 @@ Item { · 99 unmodified lines | |||
| 267 | anchors.topMargin: -buttonAndUsernameContainer.anchors.bottomMargin; | 213 | anchors.topMargin: -buttonAndUsernameContainer.anchors.bottomMargin; |
| 268 | anchors.right: buttonAndUsernameContainer.right; | 214 | anchors.right: buttonAndUsernameContainer.right; |
| 269 | height: childrenRect.height; | 215 | height: childrenRect.height; |
| 270 | width: 100; | 216 | width: 150; |
| 271 | 217 | ||
| 272 | Rectangle { | 218 | Rectangle { |
| 273 | id: myItemsButton; | 219 | id: myItemsButton; |
| @@ -279,7 +225,7 @@ Item { · 5 unmodified lines | |||
| 279 | 225 | ||
| 280 | RalewaySemiBold { | 226 | RalewaySemiBold { |
| 281 | anchors.fill: parent; | 227 | anchors.fill: parent; |
| 282 | text: "My Items" | 228 | text: "My Submissions" |
| 283 | color: hifi.colors.baseGray; | 229 | color: hifi.colors.baseGray; |
| 284 | horizontalAlignment: Text.AlignHCenter; | 230 | horizontalAlignment: Text.AlignHCenter; |
| 285 | verticalAlignment: Text.AlignVCenter; | 231 | verticalAlignment: Text.AlignVCenter; |
| @@ -14,8 +14,8 @@ · 13 unmodified lines | |||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import QtGraphicalEffects 1.0 | 16 | import QtGraphicalEffects 1.0 |
| 17 | import "../../../styles-uit" | 17 | import stylesUit 1.0 |
| 18 | import "../../../controls-uit" as HifiControlsUit | 18 | import controlsUit 1.0 as HifiControlsUit |
| 19 | import "../../../controls" as HifiControls | 19 | import "../../../controls" as HifiControls |
| 20 | 20 | ||
| 21 | // references XXX from root context | 21 | // references XXX from root context |
| @@ -87,7 +87,7 @@ Rectangle { · 65 unmodified lines | |||
| 87 | } | 87 | } |
| 88 | RalewayRegular { | 88 | RalewayRegular { |
| 89 | id: introText2; | 89 | id: introText2; |
| 90 | text: "My Purchases"; | 90 | text: "Inventory"; |
| 91 | // Text size | 91 | // Text size |
| 92 | size: 22; | 92 | size: 22; |
| 93 | // Anchors | 93 | // Anchors |
| @@ -116,7 +116,7 @@ Rectangle { · 22 unmodified lines | |||
| 116 | 116 | ||
| 117 | RalewayRegular { | 117 | RalewayRegular { |
| 118 | id: step1text; | 118 | id: step1text; |
| 119 | text: "The <b>'REZ IT'</b> button makes your purchase appear in front of you."; | 119 | text: "The <b>'REZ IT'</b> button makes your item appear in front of you."; |
| 120 | // Text size | 120 | // Text size |
| 121 | size: 20; | 121 | size: 20; |
| 122 | // Anchors | 122 | // Anchors |
| @@ -16,8 +16,8 @@ import QtQuick 2.5 · 15 unmodified lines | |||
| 16 | import QtGraphicalEffects 1.0 | 16 | import QtGraphicalEffects 1.0 |
| 17 | import QtQuick.Controls 1.4 | 17 | import QtQuick.Controls 1.4 |
| 18 | import QtQuick.Controls.Styles 1.4 | 18 | import QtQuick.Controls.Styles 1.4 |
| 19 | import "../../../../styles-uit" | 19 | import stylesUit 1.0 |
| 20 | import "../../../../controls-uit" as HifiControlsUit | 20 | import controlsUit 1.0 as HifiControlsUit |
| 21 | import "../../../../controls" as HifiControls | 21 | import "../../../../controls" as HifiControls |
| 22 | import "../../wallet" as HifiWallet | 22 | import "../../wallet" as HifiWallet |
| 23 | 23 | ||
| @@ -15,8 +15,8 @@ import Hifi 1.0 as Hifi · 14 unmodified lines | |||
| 15 | import QtQuick 2.6 | 15 | import QtQuick 2.6 |
| 16 | import QtQuick.Controls 2.2 | 16 | import QtQuick.Controls 2.2 |
| 17 | import QtGraphicalEffects 1.0 | 17 | import QtGraphicalEffects 1.0 |
| 18 | import "../../../../styles-uit" | 18 | import stylesUit 1.0 |
| 19 | import "../../../../controls-uit" as HifiControlsUit | 19 | import controlsUit 1.0 as HifiControlsUit |
| 20 | import "../../../../controls" as HifiControls | 20 | import "../../../../controls" as HifiControls |
| 21 | import "../" as HifiCommerceCommon | 21 | import "../" as HifiCommerceCommon |
| 22 | 22 | ||
| @@ -15,8 +15,8 @@ import Hifi 1.0 as Hifi · 14 unmodified lines | |||
| 15 | import QtQuick 2.6 | 15 | import QtQuick 2.6 |
| 16 | import QtQuick.Controls 2.2 | 16 | import QtQuick.Controls 2.2 |
| 17 | import QtGraphicalEffects 1.0 | 17 | import QtGraphicalEffects 1.0 |
| 18 | import "../../../../styles-uit" | 18 | import stylesUit 1.0 |
| 19 | import "../../../../controls-uit" as HifiControlsUit | 19 | import controlsUit 1.0 as HifiControlsUit |
| 20 | import "../../../../controls" as HifiControls | 20 | import "../../../../controls" as HifiControls |
| 21 | import "../" as HifiCommerceCommon | 21 | import "../" as HifiCommerceCommon |
| 22 | import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere. | 22 | import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere. |
| @@ -73,6 +73,10 @@ Item { · 50 unmodified lines | |||
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | onTransferAssetToNodeResult: { | 75 | onTransferAssetToNodeResult: { |
| 76 | if (!root.visible) { | ||
| 77 | return; | ||
| 78 | } | ||
| 79 | |||
| 76 | root.isCurrentlySendingAsset = false; | 80 | root.isCurrentlySendingAsset = false; |
| 77 | 81 | ||
| 78 | if (result.status === 'success') { | 82 | if (result.status === 'success') { |
| @@ -92,6 +96,10 @@ Item { · 13 unmodified lines | |||
| 92 | } | 96 | } |
| 93 | 97 | ||
| 94 | onTransferAssetToUsernameResult: { | 98 | onTransferAssetToUsernameResult: { |
| 99 | if (!root.visible) { | ||
| 100 | return; | ||
| 101 | } | ||
| 102 | |||
| 95 | root.isCurrentlySendingAsset = false; | 103 | root.isCurrentlySendingAsset = false; |
| 96 | 104 | ||
| 97 | if (result.status === 'success') { | 105 | if (result.status === 'success') { |
| @@ -1309,13 +1317,13 @@ Item { · 1211 unmodified lines | |||
| 1309 | 1317 | ||
| 1310 | Rectangle { | 1318 | Rectangle { |
| 1311 | anchors.top: parent.top; | 1319 | anchors.top: parent.top; |
| 1312 | anchors.topMargin: root.assetName === "" ? 15 : 150; | 1320 | anchors.topMargin: root.assetName === "" ? 15 : 125; |
| 1313 | anchors.left: parent.left; | 1321 | anchors.left: parent.left; |
| 1314 | anchors.leftMargin: root.assetName === "" ? 15 : 50; | 1322 | anchors.leftMargin: root.assetName === "" ? 15 : 50; |
| 1315 | anchors.right: parent.right; | 1323 | anchors.right: parent.right; |
| 1316 | anchors.rightMargin: root.assetName === "" ? 15 : 50; | 1324 | anchors.rightMargin: root.assetName === "" ? 15 : 50; |
| 1317 | anchors.bottom: parent.bottom; | 1325 | anchors.bottom: parent.bottom; |
| 1318 | anchors.bottomMargin: root.assetName === "" ? 15 : 240; | 1326 | anchors.bottomMargin: root.assetName === "" ? 15 : 125; |
| 1319 | color: "#FFFFFF"; | 1327 | color: "#FFFFFF"; |
| 1320 | 1328 | ||
| 1321 | RalewaySemiBold { | 1329 | RalewaySemiBold { |
| @@ -13,8 +13,8 @@ · 12 unmodified lines | |||
| 13 | 13 | ||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import "../../../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "../../../controls-uit" as HifiControlsUit | 17 | import controlsUit 1.0 as HifiControlsUit |
| 18 | import "../../../controls" as HifiControls | 18 | import "../../../controls" as HifiControls |
| 19 | import "../wallet" as HifiWallet | 19 | import "../wallet" as HifiWallet |
| 20 | 20 | ||
| @@ -28,7 +28,7 @@ Rectangle { · 7 unmodified lines | |||
| 28 | property string itemName: "--"; | 28 | property string itemName: "--"; |
| 29 | property string itemOwner: "--"; | 29 | property string itemOwner: "--"; |
| 30 | property string itemEdition: "--"; | 30 | property string itemEdition: "--"; |
| 31 | property string dateOfPurchase: "--"; | 31 | property string dateAcquired: "--"; |
| 32 | property string itemCost: "--"; | 32 | property string itemCost: "--"; |
| 33 | property string certTitleTextColor: hifi.colors.darkGray; | 33 | property string certTitleTextColor: hifi.colors.darkGray; |
| 34 | property string certTextColor: hifi.colors.white; | 34 | property string certTextColor: hifi.colors.white; |
| @@ -64,7 +64,7 @@ Rectangle { · 29 unmodified lines | |||
| 64 | root.itemName = ""; | 64 | root.itemName = ""; |
| 65 | root.itemEdition = ""; | 65 | root.itemEdition = ""; |
| 66 | root.itemOwner = ""; | 66 | root.itemOwner = ""; |
| 67 | root.dateOfPurchase = ""; | 67 | root.dateAcquired = ""; |
| 68 | root.itemCost = ""; | 68 | root.itemCost = ""; |
| 69 | errorText.text = "Information about this certificate is currently unavailable. Please try again later."; | 69 | errorText.text = "Information about this certificate is currently unavailable. Please try again later."; |
| 70 | } | 70 | } |
| @@ -77,8 +77,9 @@ Rectangle { · 6 unmodified lines | |||
| 77 | // "\u2022" is the Unicode character 'BULLET' - it's what's used in password fields on the web, etc | 77 | // "\u2022" is the Unicode character 'BULLET' - it's what's used in password fields on the web, etc |
| 78 | root.itemOwner = root.isMyCert ? Account.username : | 78 | root.itemOwner = root.isMyCert ? Account.username : |
| 79 | "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"; | 79 | "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"; |
| 80 | root.dateOfPurchase = root.isMyCert ? getFormattedDate(result.data.transfer_created_at * 1000) : "Undisclosed"; | 80 | root.dateAcquired = root.isMyCert ? getFormattedDate(result.data.transfer_created_at * 1000) : "Undisclosed"; |
| 81 | root.itemCost = (root.isMyCert && result.data.cost !== undefined) ? result.data.cost : "Undisclosed"; | 81 | root.itemCost = (root.isMyCert && result.data.cost !== undefined) ? |
| 82 | (parseInt(result.data.cost) > 0 ? result.data.cost : "Free") : "Undisclosed"; | ||
| 82 | } | 83 | } |
| 83 | if (root.certInfoReplaceMode > 4) { | 84 | if (root.certInfoReplaceMode > 4) { |
| 84 | root.itemEdition = result.data.edition_number + "/" + (result.data.limited_run === -1 ? "\u221e" : result.data.limited_run); | 85 | root.itemEdition = result.data.edition_number + "/" + (result.data.limited_run === -1 ? "\u221e" : result.data.limited_run); |
| @@ -86,7 +87,7 @@ Rectangle { · 1 unmodified line | |||
| 86 | 87 | ||
| 87 | if (root.certificateStatus === 4) { // CERTIFICATE_STATUS_OWNER_VERIFICATION_FAILED | 88 | if (root.certificateStatus === 4) { // CERTIFICATE_STATUS_OWNER_VERIFICATION_FAILED |
| 88 | if (root.isMyCert) { | 89 | if (root.isMyCert) { |
| 89 | errorText.text = "This item is an uncertified copy of an item you purchased."; | 90 | errorText.text = "This item is an uncertified copy of an item you acquired."; |
| 90 | } else { | 91 | } else { |
| 91 | errorText.text = "The person who placed this item doesn't own it."; | 92 | errorText.text = "The person who placed this item doesn't own it."; |
| 92 | } | 93 | } |
| @@ -102,8 +103,8 @@ Rectangle { · 9 unmodified lines | |||
| 102 | showInMarketplaceButton.visible = false; | 103 | showInMarketplaceButton.visible = false; |
| 103 | // "Edition" text previously set above in this function | 104 | // "Edition" text previously set above in this function |
| 104 | // "Owner" text previously set above in this function | 105 | // "Owner" text previously set above in this function |
| 105 | // "Purchase Date" text previously set above in this function | 106 | // "Acquisition Date" text previously set above in this function |
| 106 | // "Purchase Price" text previously set above in this function | 107 | // "Acquisition Price" text previously set above in this function |
| 107 | if (result.data.invalid_reason) { | 108 | if (result.data.invalid_reason) { |
| 108 | errorText.text = result.data.invalid_reason; | 109 | errorText.text = result.data.invalid_reason; |
| 109 | } | 110 | } |
| @@ -117,8 +118,8 @@ Rectangle { · 7 unmodified lines | |||
| 117 | showInMarketplaceButton.visible = true; | 118 | showInMarketplaceButton.visible = true; |
| 118 | // "Edition" text previously set above in this function | 119 | // "Edition" text previously set above in this function |
| 119 | // "Owner" text previously set above in this function | 120 | // "Owner" text previously set above in this function |
| 120 | // "Purchase Date" text previously set above in this function | 121 | // "Acquisition Date" text previously set above in this function |
| 121 | // "Purchase Price" text previously set above in this function | 122 | // "Acquisition Price" text previously set above in this function |
| 122 | errorText.text = "The status of this item is still pending confirmation. If the purchase is not confirmed, " + | 123 | errorText.text = "The status of this item is still pending confirmation. If the purchase is not confirmed, " + |
| 123 | "this entity will be cleaned up by the domain."; | 124 | "this entity will be cleaned up by the domain."; |
| 124 | } | 125 | } |
| @@ -145,8 +146,8 @@ Rectangle { · 20 unmodified lines | |||
| 145 | // "Item Name" text will be set in "onCertificateInfoResult()" | 146 | // "Item Name" text will be set in "onCertificateInfoResult()" |
| 146 | // "Edition" text will be set in "onCertificateInfoResult()" | 147 | // "Edition" text will be set in "onCertificateInfoResult()" |
| 147 | // "Owner" text will be set in "onCertificateInfoResult()" | 148 | // "Owner" text will be set in "onCertificateInfoResult()" |
| 148 | // "Purchase Date" text will be set in "onCertificateInfoResult()" | 149 | // "Acquisition Date" text will be set in "onCertificateInfoResult()" |
| 149 | // "Purchase Price" text will be set in "onCertificateInfoResult()" | 150 | // "Acquisition Price" text will be set in "onCertificateInfoResult()" |
| 150 | errorText.text = ""; | 151 | errorText.text = ""; |
| 151 | } else if (root.certificateStatus === 2) { // CERTIFICATE_STATUS_VERIFICATION_TIMEOUT | 152 | } else if (root.certificateStatus === 2) { // CERTIFICATE_STATUS_VERIFICATION_TIMEOUT |
| 152 | root.useGoldCert = false; | 153 | root.useGoldCert = false; |
| @@ -160,7 +161,7 @@ Rectangle { · 7 unmodified lines | |||
| 160 | root.itemName = ""; | 161 | root.itemName = ""; |
| 161 | root.itemEdition = ""; | 162 | root.itemEdition = ""; |
| 162 | root.itemOwner = ""; | 163 | root.itemOwner = ""; |
| 163 | root.dateOfPurchase = ""; | 164 | root.dateAcquired = ""; |
| 164 | root.itemCost = ""; | 165 | root.itemCost = ""; |
| 165 | errorText.text = "Your request to inspect this item timed out. Please try again later."; | 166 | errorText.text = "Your request to inspect this item timed out. Please try again later."; |
| 166 | } else if (root.certificateStatus === 3) { // CERTIFICATE_STATUS_STATIC_VERIFICATION_FAILED | 167 | } else if (root.certificateStatus === 3) { // CERTIFICATE_STATUS_STATIC_VERIFICATION_FAILED |
| @@ -175,8 +176,8 @@ Rectangle { · 8 unmodified lines | |||
| 175 | // "Item Name" text will be set in "onCertificateInfoResult()" | 176 | // "Item Name" text will be set in "onCertificateInfoResult()" |
| 176 | // "Edition" text will be set in "onCertificateInfoResult()" | 177 | // "Edition" text will be set in "onCertificateInfoResult()" |
| 177 | // "Owner" text will be set in "onCertificateInfoResult()" | 178 | // "Owner" text will be set in "onCertificateInfoResult()" |
| 178 | // "Purchase Date" text will be set in "onCertificateInfoResult()" | 179 | // "Acquisition Date" text will be set in "onCertificateInfoResult()" |
| 179 | // "Purchase Price" text will be set in "onCertificateInfoResult()" | 180 | // "Acquisition Price" text will be set in "onCertificateInfoResult()" |
| 180 | errorText.text = "The information associated with this item has been modified and it no longer matches the original certified item."; | 181 | errorText.text = "The information associated with this item has been modified and it no longer matches the original certified item."; |
| 181 | } else if (root.certificateStatus === 4) { // CERTIFICATE_STATUS_OWNER_VERIFICATION_FAILED | 182 | } else if (root.certificateStatus === 4) { // CERTIFICATE_STATUS_OWNER_VERIFICATION_FAILED |
| 182 | root.useGoldCert = false; | 183 | root.useGoldCert = false; |
| @@ -190,8 +191,8 @@ Rectangle { · 7 unmodified lines | |||
| 190 | // "Item Name" text will be set in "onCertificateInfoResult()" | 191 | // "Item Name" text will be set in "onCertificateInfoResult()" |
| 191 | root.itemEdition = "Uncertified Copy" | 192 | root.itemEdition = "Uncertified Copy" |
| 192 | // "Owner" text will be set in "onCertificateInfoResult()" | 193 | // "Owner" text will be set in "onCertificateInfoResult()" |
| 193 | // "Purchase Date" text will be set in "onCertificateInfoResult()" | 194 | // "Acquisition Date" text will be set in "onCertificateInfoResult()" |
| 194 | // "Purchase Price" text will be set in "onCertificateInfoResult()" | 195 | // "Acquisition Price" text will be set in "onCertificateInfoResult()" |
| 195 | // "Error Text" text will be set in "onCertificateInfoResult()" | 196 | // "Error Text" text will be set in "onCertificateInfoResult()" |
| 196 | } else { | 197 | } else { |
| 197 | console.log("Unknown certificate status received from ledger signal!"); | 198 | console.log("Unknown certificate status received from ledger signal!"); |
| @@ -485,8 +486,8 @@ Rectangle { · 287 unmodified lines | |||
| 485 | } | 486 | } |
| 486 | 487 | ||
| 487 | RalewayRegular { | 488 | RalewayRegular { |
| 488 | id: dateOfPurchaseHeader; | 489 | id: dateAcquiredHeader; |
| 489 | text: "PURCHASE DATE"; | 490 | text: "ACQUISITION DATE"; |
| 490 | // Text size | 491 | // Text size |
| 491 | size: 16; | 492 | size: 16; |
| 492 | // Anchors | 493 | // Anchors |
| @@ -500,15 +501,15 @@ Rectangle { · 7 unmodified lines | |||
| 500 | color: hifi.colors.darkGray; | 501 | color: hifi.colors.darkGray; |
| 501 | } | 502 | } |
| 502 | AnonymousProRegular { | 503 | AnonymousProRegular { |
| 503 | id: dateOfPurchase; | 504 | id: dateAcquired; |
| 504 | text: root.dateOfPurchase; | 505 | text: root.dateAcquired; |
| 505 | // Text size | 506 | // Text size |
| 506 | size: 18; | 507 | size: 18; |
| 507 | // Anchors | 508 | // Anchors |
| 508 | anchors.top: dateOfPurchaseHeader.bottom; | 509 | anchors.top: dateAcquiredHeader.bottom; |
| 509 | anchors.topMargin: 8; | 510 | anchors.topMargin: 8; |
| 510 | anchors.left: dateOfPurchaseHeader.left; | 511 | anchors.left: dateAcquiredHeader.left; |
| 511 | anchors.right: dateOfPurchaseHeader.right; | 512 | anchors.right: dateAcquiredHeader.right; |
| 512 | height: paintedHeight; | 513 | height: paintedHeight; |
| 513 | // Style | 514 | // Style |
| 514 | color: root.infoTextColor; | 515 | color: root.infoTextColor; |
| @@ -516,7 +517,7 @@ Rectangle { · 1 unmodified line | |||
| 516 | 517 | ||
| 517 | RalewayRegular { | 518 | RalewayRegular { |
| 518 | id: priceHeader; | 519 | id: priceHeader; |
| 519 | text: "PURCHASE PRICE"; | 520 | text: "ACQUISITION PRICE"; |
| 520 | // Text size | 521 | // Text size |
| 521 | size: 16; | 522 | size: 16; |
| 522 | // Anchors | 523 | // Anchors |
| @@ -530,7 +531,7 @@ Rectangle { · 7 unmodified lines | |||
| 530 | } | 531 | } |
| 531 | HiFiGlyphs { | 532 | HiFiGlyphs { |
| 532 | id: hfcGlyph; | 533 | id: hfcGlyph; |
| 533 | visible: priceText.text !== "Undisclosed" && priceText.text !== ""; | 534 | visible: priceText.text !== "Undisclosed" && priceText.text !== "" && priceText.text !== "Free"; |
| 534 | text: hifi.glyphs.hfc; | 535 | text: hifi.glyphs.hfc; |
| 535 | // Size | 536 | // Size |
| 536 | size: 24; | 537 | size: 24; |
| @@ -618,7 +619,7 @@ Rectangle { · 81 unmodified lines | |||
| 618 | root.itemName = "--"; | 619 | root.itemName = "--"; |
| 619 | root.itemOwner = "--"; | 620 | root.itemOwner = "--"; |
| 620 | root.itemEdition = "--"; | 621 | root.itemEdition = "--"; |
| 621 | root.dateOfPurchase = "--"; | 622 | root.dateAcquired = "--"; |
| 622 | root.marketplaceUrl = ""; | 623 | root.marketplaceUrl = ""; |
| 623 | root.itemCost = "--"; | 624 | root.itemCost = "--"; |
| 624 | root.isMyCert = false; | 625 | root.isMyCert = false; |
| @@ -14,8 +14,8 @@ · 13 unmodified lines | |||
| 14 | import QtQuick 2.10 | 14 | import QtQuick 2.10 |
| 15 | import QtQuick.Controls 2.3 | 15 | import QtQuick.Controls 2.3 |
| 16 | import Hifi 1.0 as Hifi | 16 | import Hifi 1.0 as Hifi |
| 17 | import "qrc:////qml//styles-uit" as HifiStylesUit | 17 | import stylesUit 1.0 as HifiStylesUit |
| 18 | import "qrc:////qml//controls-uit" as HifiControlsUit | 18 | import controlsUit 1.0 as HifiControlsUit |
| 19 | 19 | ||
| 20 | Rectangle { | 20 | Rectangle { |
| 21 | id: root; | 21 | id: root; |
| @@ -15,8 +15,9 @@ import QtQuick 2.10 · 14 unmodified lines | |||
| 15 | import QtQuick.Layouts 1.1 | 15 | import QtQuick.Layouts 1.1 |
| 16 | import QtQuick.Controls 2.3 | 16 | import QtQuick.Controls 2.3 |
| 17 | import Hifi 1.0 as Hifi | 17 | import Hifi 1.0 as Hifi |
| 18 | import "qrc:////qml//styles-uit" as HifiStylesUit | 18 | import stylesUit 1.0 as HifiStylesUit |
| 19 | import "qrc:////qml//controls-uit" as HifiControlsUit | 19 | import controlsUit 1.0 as HifiControlsUit |
| 20 | |||
| 20 | 21 | ||
| 21 | 22 | ||
| 22 | 23 | ||
| @@ -15,8 +15,8 @@ import Hifi 1.0 as Hifi · 14 unmodified lines | |||
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import QtQuick.Controls 1.4 | 16 | import QtQuick.Controls 1.4 |
| 17 | import QtQuick.Controls.Styles 1.4 | 17 | import QtQuick.Controls.Styles 1.4 |
| 18 | import "../../../styles-uit" | 18 | import stylesUit 1.0 |
| 19 | import "../../../controls-uit" as HifiControlsUit | 19 | import controlsUit 1.0 as HifiControlsUit |
| 20 | import "../../../controls" as HifiControls | 20 | import "../../../controls" as HifiControls |
| 21 | import "../wallet" as HifiWallet | 21 | import "../wallet" as HifiWallet |
| 22 | import TabletScriptingInterface 1.0 | 22 | import TabletScriptingInterface 1.0 |
| @@ -47,8 +47,7 @@ Item { · 24 unmodified lines | |||
| 47 | property string wornEntityID; | 47 | property string wornEntityID; |
| 48 | property string upgradeUrl; | 48 | property string upgradeUrl; |
| 49 | property string upgradeTitle; | 49 | property string upgradeTitle; |
| 50 | property bool updateAvailable: root.upgradeUrl !== "" && !root.isShowingMyItems; | 50 | property bool updateAvailable: root.upgradeUrl !== ""; |
| 51 | property bool isShowingMyItems; | ||
| 52 | property bool valid; | 51 | property bool valid; |
| 53 | 52 | ||
| 54 | property string originalStatusText; | 53 | property string originalStatusText; |
| @@ -231,7 +230,7 @@ Item { · 176 unmodified lines | |||
| 231 | 230 | ||
| 232 | Loader { | 231 | Loader { |
| 233 | id: giftButton; | 232 | id: giftButton; |
| 234 | visible: !root.isShowingMyItems; | 233 | visible: root.itemEdition > 0; |
| 235 | sourceComponent: contextCardButton; | 234 | sourceComponent: contextCardButton; |
| 236 | anchors.right: parent.right; | 235 | anchors.right: parent.right; |
| 237 | anchors.top: parent.top; | 236 | anchors.top: parent.top; |
| @@ -345,6 +344,7 @@ Item { · 107 unmodified lines | |||
| 345 | 344 | ||
| 346 | Rectangle { | 345 | Rectangle { |
| 347 | id: permissionExplanationCard; | 346 | id: permissionExplanationCard; |
| 347 | visible: false; | ||
| 348 | anchors.left: parent.left; | 348 | anchors.left: parent.left; |
| 349 | anchors.leftMargin: 30; | 349 | anchors.leftMargin: 30; |
| 350 | anchors.top: parent.top; | 350 | anchors.top: parent.top; |
| @@ -13,13 +13,12 @@ · 12 unmodified lines | |||
| 13 | 13 | ||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import "../../../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "../../../controls-uit" as HifiControlsUit | 17 | import controlsUit 1.0 as HifiControlsUit |
| 18 | import "../../../controls" as HifiControls | 18 | import "../../../controls" as HifiControls |
| 19 | import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere. | 19 | import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere. |
| 20 | import "../wallet" as HifiWallet | 20 | import "../wallet" as HifiWallet |
| 21 | import "../common" as HifiCommerceCommon | 21 | import "../common" as HifiCommerceCommon |
| 22 | import "../inspectionCertificate" as HifiInspectionCertificate | ||
| 23 | import "../common/sendAsset" as HifiSendAsset | 22 | import "../common/sendAsset" as HifiSendAsset |
| 24 | import "../.." as HifiCommon | 23 | import "../.." as HifiCommon |
| 25 | 24 | ||
| @@ -34,7 +33,6 @@ Rectangle { · 8 unmodified lines | |||
| 34 | property bool securityImageResultReceived: false; | 33 | property bool securityImageResultReceived: false; |
| 35 | property bool purchasesReceived: false; | 34 | property bool purchasesReceived: false; |
| 36 | property bool punctuationMode: false; | 35 | property bool punctuationMode: false; |
| 37 | property bool isShowingMyItems: false; | ||
| 38 | property bool isDebuggingFirstUseTutorial: false; | 36 | property bool isDebuggingFirstUseTutorial: false; |
| 39 | property string installedApps; | 37 | property string installedApps; |
| 40 | property bool keyboardRaised: false; | 38 | property bool keyboardRaised: false; |
| @@ -92,7 +90,6 @@ Rectangle { · 51 unmodified lines | |||
| 92 | if (result.status !== 'success') { | 90 | if (result.status !== 'success') { |
| 93 | console.log("Failed to get Available Updates", result.data.message); | 91 | console.log("Failed to get Available Updates", result.data.message); |
| 94 | } else { | 92 | } else { |
| 95 | sendToScript({method: 'purchases_availableUpdatesReceived', numUpdates: result.data.updates.length }); | ||
| 96 | root.numUpdatesAvailable = result.total_entries; | 93 | root.numUpdatesAvailable = result.total_entries; |
| 97 | } | 94 | } |
| 98 | } | 95 | } |
| @@ -106,10 +103,6 @@ Rectangle { · 7 unmodified lines | |||
| 106 | } | 103 | } |
| 107 | } | 104 | } |
| 108 | 105 | ||
| 109 | onIsShowingMyItemsChanged: { | ||
| 110 | getPurchases(); | ||
| 111 | } | ||
| 112 | |||
| 113 | Timer { | 106 | Timer { |
| 114 | id: notSetUpTimer; | 107 | id: notSetUpTimer; |
| 115 | interval: 200; | 108 | interval: 200; |
| @@ -118,19 +111,6 @@ Rectangle { · 2 unmodified lines | |||
| 118 | } | 111 | } |
| 119 | } | 112 | } |
| 120 | 113 | ||
| 121 | HifiInspectionCertificate.InspectionCertificate { | ||
| 122 | id: inspectionCertificate; | ||
| 123 | z: 998; | ||
| 124 | visible: false; | ||
| 125 | anchors.fill: parent; | ||
| 126 | |||
| 127 | Connections { | ||
| 128 | onSendToScript: { | ||
| 129 | sendToScript(message); | ||
| 130 | } | ||
| 131 | } | ||
| 132 | } | ||
| 133 | |||
| 134 | HifiCommerceCommon.CommerceLightbox { | 114 | HifiCommerceCommon.CommerceLightbox { |
| 135 | id: lightboxPopup; | 115 | id: lightboxPopup; |
| 136 | z: 999; | 116 | z: 999; |
| @@ -180,7 +160,8 @@ Rectangle { · 43 unmodified lines | |||
| 180 | HifiCommerceCommon.EmulatedMarketplaceHeader { | 160 | HifiCommerceCommon.EmulatedMarketplaceHeader { |
| 181 | id: titleBarContainer; | 161 | id: titleBarContainer; |
| 182 | z: 997; | 162 | z: 997; |
| 183 | visible: !needsLogIn.visible; | 163 | visible: false; |
| 164 | height: 100; | ||
| 184 | // Size | 165 | // Size |
| 185 | width: parent.width; | 166 | width: parent.width; |
| 186 | // Anchors | 167 | // Anchors |
| @@ -199,11 +180,6 @@ Rectangle { · 12 unmodified lines | |||
| 199 | lightboxPopup.button1method = function() { | 180 | lightboxPopup.button1method = function() { |
| 200 | lightboxPopup.visible = false; | 181 | lightboxPopup.visible = false; |
| 201 | } | 182 | } |
| 202 | lightboxPopup.button2text = "GO TO WALLET"; | ||
| 203 | lightboxPopup.button2method = function() { | ||
| 204 | sendToScript({method: 'purchases_openWallet'}); | ||
| 205 | lightboxPopup.visible = false; | ||
| 206 | }; | ||
| 207 | lightboxPopup.visible = true; | 183 | lightboxPopup.visible = true; |
| 208 | } else { | 184 | } else { |
| 209 | sendToScript(msg); | 185 | sendToScript(msg); |
| @@ -475,7 +451,7 @@ Rectangle { · 265 unmodified lines | |||
| 475 | anchors.left: parent.left; | 451 | anchors.left: parent.left; |
| 476 | anchors.leftMargin: 16; | 452 | anchors.leftMargin: 16; |
| 477 | width: paintedWidth; | 453 | width: paintedWidth; |
| 478 | text: isShowingMyItems ? "My Items" : "My Purchases"; | 454 | text: "Items"; |
| 479 | color: hifi.colors.black; | 455 | color: hifi.colors.black; |
| 480 | size: 22; | 456 | size: 22; |
| 481 | } | 457 | } |
| @@ -517,8 +493,13 @@ Rectangle { · 35 unmodified lines | |||
| 517 | "filterName": "wearable" | 493 | "filterName": "wearable" |
| 518 | }, | 494 | }, |
| 519 | { | 495 | { |
| 496 | "separator" : true, | ||
| 520 | "displayName": "Updatable", | 497 | "displayName": "Updatable", |
| 521 | "filterName": "updated" | 498 | "filterName": "updated" |
| 499 | }, | ||
| 500 | { | ||
| 501 | "displayName": "My Submissions", | ||
| 502 | "filterName": "proofs" | ||
| 522 | } | 503 | } |
| 523 | ] | 504 | ] |
| 524 | filterBar.primaryFilterChoices.clear(); | 505 | filterBar.primaryFilterChoices.clear(); |
| @@ -533,6 +514,7 @@ Rectangle { · 8 unmodified lines | |||
| 533 | onTextChanged: { | 514 | onTextChanged: { |
| 534 | purchasesModel.searchFilter = filterBar.text; | 515 | purchasesModel.searchFilter = filterBar.text; |
| 535 | filterBar.previousText = filterBar.text; | 516 | filterBar.previousText = filterBar.text; |
| 517 | |||
| 536 | } | 518 | } |
| 537 | } | 519 | } |
| 538 | } | 520 | } |
| @@ -556,10 +538,18 @@ Rectangle { · 17 unmodified lines | |||
| 556 | listModelName: 'purchases'; | 538 | listModelName: 'purchases'; |
| 557 | listView: purchasesContentsList; | 539 | listView: purchasesContentsList; |
| 558 | getPage: function () { | 540 | getPage: function () { |
| 559 | console.debug('getPage', purchasesModel.listModelName, root.isShowingMyItems, filterBar.primaryFilter_filterName, purchasesModel.currentPageToRetrieve, purchasesModel.itemsPerPage); | 541 | console.debug('getPage', purchasesModel.listModelName, filterBar.primaryFilter_filterName, purchasesModel.currentPageToRetrieve, purchasesModel.itemsPerPage); |
| 542 | var editionFilter = ""; | ||
| 543 | var primaryFilter = ""; | ||
| 544 | |||
| 545 | if (filterBar.primaryFilter_filterName === "proofs") { | ||
| 546 | editionFilter = "proofs"; | ||
| 547 | } else { | ||
| 548 | primaryFilter = filterBar.primaryFilter_filterName; | ||
| 549 | } | ||
| 560 | Commerce.inventory( | 550 | Commerce.inventory( |
| 561 | root.isShowingMyItems ? "proofs" : "purchased", | 551 | editionFilter, |
| 562 | filterBar.primaryFilter_filterName, | 552 | primaryFilter, |
| 563 | filterBar.text, | 553 | filterBar.text, |
| 564 | purchasesModel.currentPageToRetrieve, | 554 | purchasesModel.currentPageToRetrieve, |
| 565 | purchasesModel.itemsPerPage | 555 | purchasesModel.itemsPerPage |
| @@ -609,7 +599,6 @@ Rectangle { · 43 unmodified lines | |||
| 609 | upgradeUrl: model.upgrade_url; | 599 | upgradeUrl: model.upgrade_url; |
| 610 | upgradeTitle: model.upgrade_title; | 600 | upgradeTitle: model.upgrade_title; |
| 611 | itemType: model.item_type; | 601 | itemType: model.item_type; |
| 612 | isShowingMyItems: root.isShowingMyItems; | ||
| 613 | valid: model.valid; | 602 | valid: model.valid; |
| 614 | anchors.topMargin: 10; | 603 | anchors.topMargin: 10; |
| 615 | anchors.bottomMargin: 10; | 604 | anchors.bottomMargin: 10; |
| @@ -626,8 +615,6 @@ Rectangle { · 10 unmodified lines | |||
| 626 | sendToScript({ method: 'purchases_updateWearables' }); | 615 | sendToScript({ method: 'purchases_updateWearables' }); |
| 627 | } | 616 | } |
| 628 | } else if (msg.method === 'purchases_itemCertificateClicked') { | 617 | } else if (msg.method === 'purchases_itemCertificateClicked') { |
| 629 | inspectionCertificate.visible = true; | ||
| 630 | inspectionCertificate.isLightbox = true; | ||
| 631 | sendToScript(msg); | 618 | sendToScript(msg); |
| 632 | } else if (msg.method === "showInvalidatedLightbox") { | 619 | } else if (msg.method === "showInvalidatedLightbox") { |
| 633 | lightboxPopup.titleText = "Item Invalidated"; | 620 | lightboxPopup.titleText = "Item Invalidated"; |
| @@ -640,7 +627,7 @@ Rectangle { · 6 unmodified lines | |||
| 640 | lightboxPopup.visible = true; | 627 | lightboxPopup.visible = true; |
| 641 | } else if (msg.method === "showPendingLightbox") { | 628 | } else if (msg.method === "showPendingLightbox") { |
| 642 | lightboxPopup.titleText = "Item Pending"; | 629 | lightboxPopup.titleText = "Item Pending"; |
| 643 | lightboxPopup.bodyText = 'Your item is marked "pending" while your purchase is being confirmed. ' + | 630 | lightboxPopup.bodyText = 'Your item is marked "pending" while the transfer is being confirmed. ' + |
| 644 | "Usually, purchases take about 90 seconds to confirm."; | 631 | "Usually, purchases take about 90 seconds to confirm."; |
| 645 | lightboxPopup.button1text = "CLOSE"; | 632 | lightboxPopup.button1text = "CLOSE"; |
| 646 | lightboxPopup.button1method = function() { | 633 | lightboxPopup.button1method = function() { |
| @@ -822,7 +809,8 @@ Rectangle { · 175 unmodified lines | |||
| 822 | 809 | ||
| 823 | Rectangle { | 810 | Rectangle { |
| 824 | id: updatesAvailableBanner; | 811 | id: updatesAvailableBanner; |
| 825 | visible: root.numUpdatesAvailable > 0 && !root.isShowingMyItems; | 812 | visible: root.numUpdatesAvailable > 0 && |
| 813 | filterBar.primaryFilter_filterName !== "proofs"; | ||
| 826 | anchors.bottom: parent.bottom; | 814 | anchors.bottom: parent.bottom; |
| 827 | anchors.left: parent.left; | 815 | anchors.left: parent.left; |
| 828 | anchors.right: parent.right; | 816 | anchors.right: parent.right; |
| @@ -883,9 +871,8 @@ Rectangle { · 54 unmodified lines | |||
| 883 | id: noItemsAlertContainer; | 871 | id: noItemsAlertContainer; |
| 884 | visible: !purchasesContentsList.visible && | 872 | visible: !purchasesContentsList.visible && |
| 885 | root.purchasesReceived && | 873 | root.purchasesReceived && |
| 886 | root.isShowingMyItems && | ||
| 887 | filterBar.text === "" && | 874 | filterBar.text === "" && |
| 888 | filterBar.primaryFilter_displayName === ""; | 875 | filterBar.primaryFilter_filterName === "proofs"; |
| 889 | anchors.top: filterBarContainer.bottom; | 876 | anchors.top: filterBarContainer.bottom; |
| 890 | anchors.topMargin: 12; | 877 | anchors.topMargin: 12; |
| 891 | anchors.left: parent.left; | 878 | anchors.left: parent.left; |
| @@ -895,7 +882,7 @@ Rectangle { · 3 unmodified lines | |||
| 895 | // Explanitory text | 882 | // Explanitory text |
| 896 | RalewayRegular { | 883 | RalewayRegular { |
| 897 | id: noItemsYet; | 884 | id: noItemsYet; |
| 898 | text: "<b>You haven't submitted anything to the Marketplace yet!</b><br><br>Submit an item to the Marketplace to add it to My Items."; | 885 | text: "<b>You haven't submitted anything to the Marketplace yet!</b><br><br>Submit an item to the Marketplace to add it to My Submissions."; |
| 899 | // Text size | 886 | // Text size |
| 900 | size: 22; | 887 | size: 22; |
| 901 | // Anchors | 888 | // Anchors |
| @@ -933,7 +920,6 @@ Rectangle { · 31 unmodified lines | |||
| 933 | id: noPurchasesAlertContainer; | 920 | id: noPurchasesAlertContainer; |
| 934 | visible: !purchasesContentsList.visible && | 921 | visible: !purchasesContentsList.visible && |
| 935 | root.purchasesReceived && | 922 | root.purchasesReceived && |
| 936 | !root.isShowingMyItems && | ||
| 937 | filterBar.text === "" && | 923 | filterBar.text === "" && |
| 938 | filterBar.primaryFilter_displayName === ""; | 924 | filterBar.primaryFilter_displayName === ""; |
| 939 | anchors.top: filterBarContainer.bottom; | 925 | anchors.top: filterBarContainer.bottom; |
| @@ -945,7 +931,7 @@ Rectangle { · 5 unmodified lines | |||
| 945 | // Explanitory text | 931 | // Explanitory text |
| 946 | RalewayRegular { | 932 | RalewayRegular { |
| 947 | id: haventPurchasedYet; | 933 | id: haventPurchasedYet; |
| 948 | text: "<b>You haven't purchased anything yet!</b><br><br>Get an item from <b>Marketplace</b> to add it to My Purchases."; | 934 | text: "<b>You haven't gotten anything yet!</b><br><br>Get an item from <b>Marketplace</b> to add it to your Inventory."; |
| 949 | // Text size | 935 | // Text size |
| 950 | size: 22; | 936 | size: 22; |
| 951 | // Anchors | 937 | // Anchors |
| @@ -1065,11 +1051,10 @@ Rectangle { · 113 unmodified lines | |||
| 1065 | titleBarContainer.referrerURL = message.referrerURL || ""; | 1051 | titleBarContainer.referrerURL = message.referrerURL || ""; |
| 1066 | filterBar.text = message.filterText ? message.filterText : ""; | 1052 | filterBar.text = message.filterText ? message.filterText : ""; |
| 1067 | break; | 1053 | break; |
| 1068 | case 'inspectionCertificate_setCertificateId': | ||
| 1069 | inspectionCertificate.fromScript(message); | ||
| 1070 | break; | ||
| 1071 | case 'purchases_showMyItems': | 1054 | case 'purchases_showMyItems': |
| 1072 | root.isShowingMyItems = true; | 1055 | filterBar.primaryFilter_filterName = "proofs"; |
| 1056 | filterBar.primaryFilter_displayName = "Proofs"; | ||
| 1057 | filterBar.primaryFilter_index = 6; | ||
| 1073 | break; | 1058 | break; |
| 1074 | case 'updateConnections': | 1059 | case 'updateConnections': |
| 1075 | sendAsset.updateConnections(message.connections); | 1060 | sendAsset.updateConnections(message.connections); |
| @@ -14,8 +14,8 @@ · 13 unmodified lines | |||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.7 | 15 | import QtQuick 2.7 |
| 16 | import QtQuick.Controls 2.2 | 16 | import QtQuick.Controls 2.2 |
| 17 | import "../../../styles-uit" | 17 | import stylesUit 1.0 |
| 18 | import "../../../controls-uit" as HifiControlsUit | 18 | import controlsUit 1.0 as HifiControlsUit |
| 19 | import "../../../controls" as HifiControls | 19 | import "../../../controls" as HifiControls |
| 20 | 20 | ||
| 21 | // references XXX from root context | 21 | // references XXX from root context |
| @@ -62,7 +62,7 @@ Item { · 40 unmodified lines | |||
| 62 | isExpanded: false; | 62 | isExpanded: false; |
| 63 | question: "How can I get HFC?"; | 63 | question: "How can I get HFC?"; |
| 64 | answer: "High Fidelity commerce is in open beta right now. Want more HFC? \ | 64 | answer: "High Fidelity commerce is in open beta right now. Want more HFC? \ |
| 65 | Get it by going to <br><br><b><font color='#0093C5'><a href='#bank'>BankOfHighFidelity.</a></font></b> and meeting with the banker!"; | 65 | Get it by going to <b><font color='#0093C5'><a href='#bank'>BankOfHighFidelity</a></font></b> and meeting with the banker!"; |
| 66 | } | 66 | } |
| 67 | ListElement { | 67 | ListElement { |
| 68 | isExpanded: false; | 68 | isExpanded: false; |
| @@ -74,8 +74,7 @@ In your Wallet's Send Money tab, choose from your list of connections, or choose · 5 unmodified lines | |||
| 74 | isExpanded: false; | 74 | isExpanded: false; |
| 75 | question: "What is a Security Pic?" | 75 | question: "What is a Security Pic?" |
| 76 | answer: "Your Security Pic acts as an extra layer of Wallet security. \ | 76 | answer: "Your Security Pic acts as an extra layer of Wallet security. \ |
| 77 | When you see your Security Pic, you know that your actions and data are securely making use of your account. \ | 77 | When you see your Security Pic, you know that your actions and data are securely making use of your account."; |
| 78 | <br><br><b><font color='#0093C5'><a href='#securitypic'>Tap here to change your Security Pic.</a></font></b>"; | ||
| 79 | } | 78 | } |
| 80 | ListElement { | 79 | ListElement { |
| 81 | isExpanded: false; | 80 | isExpanded: false; |
| @@ -137,7 +136,7 @@ At the moment, there is currently no way to convert HFC to other currencies. Sta · 55 unmodified lines | |||
| 137 | anchors.left: parent.left; | 136 | anchors.left: parent.left; |
| 138 | width: parent.width; | 137 | width: parent.width; |
| 139 | height: questionText.paintedHeight + 50; | 138 | height: questionText.paintedHeight + 50; |
| 140 | 139 | ||
| 141 | RalewaySemiBold { | 140 | RalewaySemiBold { |
| 142 | id: plusMinusButton; | 141 | id: plusMinusButton; |
| 143 | text: model.isExpanded ? "-" : "+"; | 142 | text: model.isExpanded ? "-" : "+"; |
| @@ -217,8 +216,6 @@ At the moment, there is currently no way to convert HFC to other currencies. Sta · 73 unmodified lines | |||
| 217 | } | 216 | } |
| 218 | } else if (link === "#support") { | 217 | } else if (link === "#support") { |
| 219 | Qt.openUrlExternally("mailto:support@highfidelity.com"); | 218 | Qt.openUrlExternally("mailto:support@highfidelity.com"); |
| 220 | } else if (link === "#securitypic") { | ||
| 221 | sendSignalToWallet({method: 'walletSecurity_changeSecurityImage'}); | ||
| 222 | } | 219 | } |
| 223 | } | 220 | } |
| 224 | } | 221 | } |
| @@ -13,8 +13,8 @@ · 12 unmodified lines | |||
| 13 | 13 | ||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import "../../../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "../../../controls-uit" as HifiControlsUit | 17 | import controlsUit 1.0 as HifiControlsUit |
| 18 | import "../../../controls" as HifiControls | 18 | import "../../../controls" as HifiControls |
| 19 | 19 | ||
| 20 | // references XXX from root context | 20 | // references XXX from root context |
| @@ -93,7 +93,7 @@ Item { · 72 unmodified lines | |||
| 93 | // Text below helper text | 93 | // Text below helper text |
| 94 | RalewayRegular { | 94 | RalewayRegular { |
| 95 | id: loginDetailText; | 95 | id: loginDetailText; |
| 96 | text: "To buy/sell items on the <b>Marketplace</b>, or to use your <b>Wallet</b>, you must first log in to High Fidelity."; | 96 | text: "To get items on the <b>Marketplace</b>, or to use your <b>Assets</b>, you must first log in to High Fidelity."; |
| 97 | // Text size | 97 | // Text size |
| 98 | size: 18; | 98 | size: 18; |
| 99 | // Anchors | 99 | // Anchors |
| @@ -13,8 +13,8 @@ · 12 unmodified lines | |||
| 13 | 13 | ||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import "../../../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "../../../controls-uit" as HifiControlsUit | 17 | import controlsUit 1.0 as HifiControlsUit |
| 18 | import "../../../controls" as HifiControls | 18 | import "../../../controls" as HifiControls |
| 19 | 19 | ||
| 20 | // references XXX from root context | 20 | // references XXX from root context |
| @@ -13,8 +13,8 @@ · 12 unmodified lines | |||
| 13 | 13 | ||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import "../../../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "../../../controls-uit" as HifiControlsUit | 17 | import controlsUit 1.0 as HifiControlsUit |
| 18 | import "../../../controls" as HifiControls | 18 | import "../../../controls" as HifiControls |
| 19 | import "../common" as HifiCommerceCommon | 19 | import "../common" as HifiCommerceCommon |
| 20 | 20 | ||
| @@ -13,8 +13,8 @@ · 12 unmodified lines | |||
| 13 | 13 | ||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import "../../../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "../../../controls-uit" as HifiControlsUit | 17 | import controlsUit 1.0 as HifiControlsUit |
| 18 | import "../../../controls" as HifiControls | 18 | import "../../../controls" as HifiControls |
| 19 | 19 | ||
| 20 | // references XXX from root context | 20 | // references XXX from root context |
| @@ -1,246 +0,0 @@ | |||
| 1 | // | ||
| 2 | // Security.qml | ||
| 3 | // qml/hifi/commerce/wallet | ||
| 4 | // | ||
| 5 | // Security | ||
| 6 | // | ||
| 7 | // Created by Zach Fox on 2017-08-18 | ||
| 8 | // Copyright 2017 High Fidelity, Inc. | ||
| 9 | // | ||
| 10 | // Distributed under the Apache License, Version 2.0. | ||
| 11 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 12 | // | ||
| 13 | |||
| 14 | import Hifi 1.0 as Hifi | ||
| 15 | import QtQuick 2.5 | ||
| 16 | import QtGraphicalEffects 1.0 | ||
| 17 | import "../../../styles-uit" | ||
| 18 | import "../../../controls-uit" as HifiControlsUit | ||
| 19 | import "../../../controls" as HifiControls | ||
| 20 | |||
| 21 | // references XXX from root context | ||
| 22 | |||
| 23 | Item { | ||
| 24 | HifiConstants { id: hifi; } | ||
| 25 | |||
| 26 | id: root; | ||
| 27 | property string keyFilePath; | ||
| 28 | |||
| 29 | Connections { | ||
| 30 | target: Commerce; | ||
| 31 | |||
| 32 | onKeyFilePathIfExistsResult: { | ||
| 33 | root.keyFilePath = path; | ||
| 34 | } | ||
| 35 | } | ||
| 36 | |||
| 37 | // Username Text | ||
| 38 | RalewayRegular { | ||
| 39 | id: usernameText; | ||
| 40 | text: Account.username; | ||
| 41 | // Text size | ||
| 42 | size: 24; | ||
| 43 | // Style | ||
| 44 | color: hifi.colors.white; | ||
| 45 | elide: Text.ElideRight; | ||
| 46 | // Anchors | ||
| 47 | anchors.top: parent.top; | ||
| 48 | anchors.left: parent.left; | ||
| 49 | anchors.leftMargin: 20; | ||
| 50 | width: parent.width/2; | ||
| 51 | height: 80; | ||
| 52 | } | ||
| 53 | |||
| 54 | Item { | ||
| 55 | id: securityContainer; | ||
| 56 | anchors.top: usernameText.bottom; | ||
| 57 | anchors.topMargin: 20; | ||
| 58 | anchors.left: parent.left; | ||
| 59 | anchors.right: parent.right; | ||
| 60 | anchors.bottom: parent.bottom; | ||
| 61 | |||
| 62 | RalewaySemiBold { | ||
| 63 | id: securityText; | ||
| 64 | text: "Security"; | ||
| 65 | // Anchors | ||
| 66 | anchors.top: parent.top; | ||
| 67 | anchors.left: parent.left; | ||
| 68 | anchors.leftMargin: 20; | ||
| 69 | anchors.right: parent.right; | ||
| 70 | height: 30; | ||
| 71 | // Text size | ||
| 72 | size: 18; | ||
| 73 | // Style | ||
| 74 | color: hifi.colors.blueHighlight; | ||
| 75 | } | ||
| 76 | |||
| 77 | Rectangle { | ||
| 78 | id: securityTextSeparator; | ||
| 79 | // Size | ||
| 80 | width: parent.width; | ||
| 81 | height: 1; | ||
| 82 | // Anchors | ||
| 83 | anchors.left: parent.left; | ||
| 84 | anchors.right: parent.right; | ||
| 85 | anchors.top: securityText.bottom; | ||
| 86 | anchors.topMargin: 8; | ||
| 87 | // Style | ||
| 88 | color: hifi.colors.faintGray; | ||
| 89 | } | ||
| 90 | |||
| 91 | Item { | ||
| 92 | id: changeSecurityImageContainer; | ||
| 93 | anchors.top: securityTextSeparator.bottom; | ||
| 94 | anchors.topMargin: 8; | ||
| 95 | anchors.left: parent.left; | ||
| 96 | anchors.leftMargin: 40; | ||
| 97 | anchors.right: parent.right; | ||
| 98 | anchors.rightMargin: 55; | ||
| 99 | height: 75; | ||
| 100 | |||
| 101 | HiFiGlyphs { | ||
| 102 | id: changeSecurityImageImage; | ||
| 103 | text: hifi.glyphs.securityImage; | ||
| 104 | // Size | ||
| 105 | size: 80; | ||
| 106 | // Anchors | ||
| 107 | anchors.top: parent.top; | ||
| 108 | anchors.bottom: parent.bottom; | ||
| 109 | anchors.left: parent.left; | ||
| 110 | // Style | ||
| 111 | color: hifi.colors.white; | ||
| 112 | } | ||
| 113 | |||
| 114 | RalewaySemiBold { | ||
| 115 | text: "Security Pic"; | ||
| 116 | // Anchors | ||
| 117 | anchors.top: parent.top; | ||
| 118 | anchors.bottom: parent.bottom; | ||
| 119 | anchors.left: changeSecurityImageImage.right; | ||
| 120 | anchors.leftMargin: 30; | ||
| 121 | width: 50; | ||
| 122 | // Text size | ||
| 123 | size: 18; | ||
| 124 | // Style | ||
| 125 | color: hifi.colors.white; | ||
| 126 | } | ||
| 127 | |||
| 128 | // "Change Security Pic" button | ||
| 129 | HifiControlsUit.Button { | ||
| 130 | id: changeSecurityImageButton; | ||
| 131 | color: hifi.buttons.blue; | ||
| 132 | colorScheme: hifi.colorSchemes.dark; | ||
| 133 | anchors.right: parent.right; | ||
| 134 | anchors.verticalCenter: parent.verticalCenter; | ||
| 135 | width: 140; | ||
| 136 | height: 40; | ||
| 137 | text: "Change"; | ||
| 138 | onClicked: { | ||
| 139 | sendSignalToWallet({method: 'walletSecurity_changeSecurityImage'}); | ||
| 140 | } | ||
| 141 | } | ||
| 142 | } | ||
| 143 | |||
| 144 | Item { | ||
| 145 | id: autoLogoutContainer; | ||
| 146 | anchors.top: changeSecurityImageContainer.bottom; | ||
| 147 | anchors.topMargin: 8; | ||
| 148 | anchors.left: parent.left; | ||
| 149 | anchors.leftMargin: 40; | ||
| 150 | anchors.right: parent.right; | ||
| 151 | anchors.rightMargin: 55; | ||
| 152 | height: 75; | ||
| 153 | |||
| 154 | HiFiGlyphs { | ||
| 155 | id: autoLogoutImage; | ||
| 156 | text: hifi.glyphs.walletKey; | ||
| 157 | // Size | ||
| 158 | size: 80; | ||
| 159 | // Anchors | ||
| 160 | anchors.top: parent.top; | ||
| 161 | anchors.topMargin: 20; | ||
| 162 | anchors.left: parent.left; | ||
| 163 | // Style | ||
| 164 | color: hifi.colors.white; | ||
| 165 | } | ||
| 166 | |||
| 167 | HifiControlsUit.CheckBox { | ||
| 168 | id: autoLogoutCheckbox; | ||
| 169 | checked: Settings.getValue("wallet/autoLogout", false); | ||
| 170 | text: "Automatically Log Out when Exiting Interface" | ||
| 171 | // Anchors | ||
| 172 | anchors.verticalCenter: autoLogoutImage.verticalCenter; | ||
| 173 | anchors.left: autoLogoutImage.right; | ||
| 174 | anchors.leftMargin: 20; | ||
| 175 | anchors.right: autoLogoutHelp.left; | ||
| 176 | anchors.rightMargin: 12; | ||
| 177 | boxSize: 28; | ||
| 178 | labelFontSize: 18; | ||
| 179 | color: hifi.colors.white; | ||
| 180 | onCheckedChanged: { | ||
| 181 | Settings.setValue("wallet/autoLogout", checked); | ||
| 182 | if (checked) { | ||
| 183 | Settings.setValue("wallet/savedUsername", Account.username); | ||
| 184 | } else { | ||
| 185 | Settings.setValue("wallet/savedUsername", ""); | ||
| 186 | } | ||
| 187 | } | ||
| 188 | } | ||
| 189 | |||
| 190 | RalewaySemiBold { | ||
| 191 | id: autoLogoutHelp; | ||
| 192 | text: '[?]'; | ||
| 193 | // Anchors | ||
| 194 | anchors.verticalCenter: autoLogoutImage.verticalCenter; | ||
| 195 | anchors.right: parent.right; | ||
| 196 | width: 30; | ||
| 197 | height: 30; | ||
| 198 | // Text size | ||
| 199 | size: 18; | ||
| 200 | // Style | ||
| 201 | color: hifi.colors.blueHighlight; | ||
| 202 | |||
| 203 | MouseArea { | ||
| 204 | anchors.fill: parent; | ||
| 205 | hoverEnabled: true; | ||
| 206 | onEntered: { | ||
| 207 | parent.color = hifi.colors.blueAccent; | ||
| 208 | } | ||
| 209 | onExited: { | ||
| 210 | parent.color = hifi.colors.blueHighlight; | ||
| 211 | } | ||
| 212 | onClicked: { | ||
| 213 | sendSignalToWallet({method: 'walletSecurity_autoLogoutHelp'}); | ||
| 214 | } | ||
| 215 | } | ||
| 216 | } | ||
| 217 | } | ||
| 218 | } | ||
| 219 | |||
| 220 | // | ||
| 221 | // FUNCTION DEFINITIONS START | ||
| 222 | // | ||
| 223 | // | ||
| 224 | // Function Name: fromScript() | ||
| 225 | // | ||
| 226 | // Relevant Variables: | ||
| 227 | // None | ||
| 228 | // | ||
| 229 | // Arguments: | ||
| 230 | // message: The message sent from the JavaScript. | ||
| 231 | // Messages are in format "{method, params}", like json-rpc. | ||
| 232 | // | ||
| 233 | // Description: | ||
| 234 | // Called when a message is received from a script. | ||
| 235 | // | ||
| 236 | function fromScript(message) { | ||
| 237 | switch (message.method) { | ||
| 238 | default: | ||
| 239 | console.log('Unrecognized message from wallet.js:', JSON.stringify(message)); | ||
| 240 | } | ||
| 241 | } | ||
| 242 | signal sendSignalToWallet(var msg); | ||
| 243 | // | ||
| 244 | // FUNCTION DEFINITIONS END | ||
| 245 | // | ||
| 246 | } | ||
| @@ -14,12 +14,14 @@ · 13 unmodified lines | |||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import QtGraphicalEffects 1.0 | 16 | import QtGraphicalEffects 1.0 |
| 17 | import "../../../styles-uit" | 17 | import stylesUit 1.0 |
| 18 | import "../../../controls-uit" as HifiControlsUit | 18 | import controlsUit 1.0 as HifiControlsUit |
| 19 | import "../../../controls" as HifiControls | 19 | import "../../../controls" as HifiControls |
| 20 | import "../common" as HifiCommerceCommon | 20 | import "../common" as HifiCommerceCommon |
| 21 | import "../common/sendAsset" | 21 | import "../common/sendAsset" |
| 22 | import "../.." as HifiCommon | 22 | import "../.." as HifiCommon |
| 23 | import "../purchases" as HifiPurchases | ||
| 24 | import "../inspectionCertificate" as HifiInspectionCertificate | ||
| 23 | 25 | ||
| 24 | Rectangle { | 26 | Rectangle { |
| 25 | HifiConstants { id: hifi; } | 27 | HifiConstants { id: hifi; } |
| @@ -27,6 +29,7 @@ Rectangle { · 1 unmodified line | |||
| 27 | id: root; | 29 | id: root; |
| 28 | 30 | ||
| 29 | property string activeView: "initialize"; | 31 | property string activeView: "initialize"; |
| 32 | property string initialActiveViewAfterStatus5: "walletInventory"; | ||
| 30 | property bool keyboardRaised: false; | 33 | property bool keyboardRaised: false; |
| 31 | property bool isPassword: false; | 34 | property bool isPassword: false; |
| 32 | 35 | ||
| @@ -37,6 +40,10 @@ Rectangle { · 4 unmodified lines | |||
| 37 | source: "images/wallet-bg.jpg"; | 40 | source: "images/wallet-bg.jpg"; |
| 38 | } | 41 | } |
| 39 | 42 | ||
| 43 | Component.onDestruction: { | ||
| 44 | KeyboardScriptingInterface.raised = false; | ||
| 45 | } | ||
| 46 | |||
| 40 | Connections { | 47 | Connections { |
| 41 | target: Commerce; | 48 | target: Commerce; |
| 42 | 49 | ||
| @@ -64,7 +71,8 @@ Rectangle { · 21 unmodified lines | |||
| 64 | } | 71 | } |
| 65 | } else if (walletStatus === 5) { | 72 | } else if (walletStatus === 5) { |
| 66 | if (root.activeView !== "walletSetup") { | 73 | if (root.activeView !== "walletSetup") { |
| 67 | root.activeView = "walletHome"; | 74 | root.activeView = root.initialActiveViewAfterStatus5; |
| 75 | Commerce.getAvailableUpdates(); | ||
| 68 | Commerce.getSecurityImage(); | 76 | Commerce.getSecurityImage(); |
| 69 | } | 77 | } |
| 70 | } else { | 78 | } else { |
| @@ -86,6 +94,21 @@ Rectangle { · 15 unmodified lines | |||
| 86 | titleBarSecurityImage.source = "image://security/securityImage"; | 94 | titleBarSecurityImage.source = "image://security/securityImage"; |
| 87 | } | 95 | } |
| 88 | } | 96 | } |
| 97 | |||
| 98 | onAvailableUpdatesResult: { | ||
| 99 | if (result.status !== 'success') { | ||
| 100 | console.log("Failed to get Available Updates", result.data.message); | ||
| 101 | } else { | ||
| 102 | exchangeMoneyButtonContainer.messagesWaiting = result.data.updates.length > 0; | ||
| 103 | } | ||
| 104 | } | ||
| 105 | } | ||
| 106 | |||
| 107 | onActiveViewChanged: { | ||
| 108 | if (activeView === "walletHome") { | ||
| 109 | walletHomeButtonContainer.messagesWaiting = false; | ||
| 110 | sendToScript({method: 'clearShouldShowDotHistory'}); | ||
| 111 | } | ||
| 89 | } | 112 | } |
| 90 | 113 | ||
| 91 | HifiCommerceCommon.CommerceLightbox { | 114 | HifiCommerceCommon.CommerceLightbox { |
| @@ -108,29 +131,32 @@ Rectangle { · 16 unmodified lines | |||
| 108 | anchors.top: parent.top; | 131 | anchors.top: parent.top; |
| 109 | 132 | ||
| 110 | // Wallet icon | 133 | // Wallet icon |
| 111 | HiFiGlyphs { | 134 | Image { |
| 112 | id: walletIcon; | 135 | id: walletIcon; |
| 113 | text: hifi.glyphs.wallet; | 136 | source: "../../../../icons/tablet-icons/inventory-a.svg"; |
| 114 | // Size | 137 | height: parent.height * 0.5; |
| 115 | size: parent.height * 0.8; | 138 | width: walletIcon.height; |
| 116 | // Anchors | ||
| 117 | anchors.left: parent.left; | 139 | anchors.left: parent.left; |
| 118 | anchors.leftMargin: 8; | 140 | anchors.leftMargin: 8; |
| 119 | anchors.verticalCenter: parent.verticalCenter; | 141 | anchors.verticalCenter: parent.verticalCenter; |
| 120 | // Style | 142 | visible: false; // When we use a white .svg instead of a glyph with color property, we set to invisible and use the following ColorOverlay. |
| 143 | } | ||
| 144 | ColorOverlay { | ||
| 145 | anchors.fill: walletIcon; | ||
| 146 | source: walletIcon; | ||
| 121 | color: hifi.colors.blueHighlight; | 147 | color: hifi.colors.blueHighlight; |
| 122 | } | 148 | } |
| 123 | 149 | ||
| 124 | // Title Bar text | 150 | // Title Bar text |
| 125 | RalewaySemiBold { | 151 | RalewaySemiBold { |
| 126 | id: titleBarText; | 152 | id: titleBarText; |
| 127 | text: "WALLET"; | 153 | text: "INVENTORY"; |
| 128 | // Text size | 154 | // Text size |
| 129 | size: hifi.fontSizes.overlayTitle; | 155 | size: hifi.fontSizes.overlayTitle; |
| 130 | // Anchors | 156 | // Anchors |
| 131 | anchors.top: parent.top; | 157 | anchors.top: parent.top; |
| 132 | anchors.left: walletIcon.right; | 158 | anchors.left: walletIcon.right; |
| 133 | anchors.leftMargin: 4; | 159 | anchors.leftMargin: 6; |
| 134 | anchors.bottom: parent.bottom; | 160 | anchors.bottom: parent.bottom; |
| 135 | width: paintedWidth; | 161 | width: paintedWidth; |
| 136 | // Style | 162 | // Style |
| @@ -142,7 +168,7 @@ Rectangle { · 5 unmodified lines | |||
| 142 | Image { | 168 | Image { |
| 143 | id: titleBarSecurityImage; | 169 | id: titleBarSecurityImage; |
| 144 | source: ""; | 170 | source: ""; |
| 145 | visible: titleBarSecurityImage.source !== "" && !securityImageChange.visible; | 171 | visible: titleBarSecurityImage.source !== ""; |
| 146 | anchors.right: parent.right; | 172 | anchors.right: parent.right; |
| 147 | anchors.rightMargin: 6; | 173 | anchors.rightMargin: 6; |
| 148 | anchors.top: parent.top; | 174 | anchors.top: parent.top; |
| @@ -232,10 +258,6 @@ Rectangle { · 83 unmodified lines | |||
| 232 | root.isPassword = msg.isPasswordField; | 258 | root.isPassword = msg.isPasswordField; |
| 233 | } else if (msg.method === 'walletSetup_lowerKeyboard') { | 259 | } else if (msg.method === 'walletSetup_lowerKeyboard') { |
| 234 | root.keyboardRaised = false; | 260 | root.keyboardRaised = false; |
| 235 | } else if (msg.method === 'walletSecurity_changePassphraseCancelled') { | ||
| 236 | root.activeView = "security"; | ||
| 237 | } else if (msg.method === 'walletSecurity_changePassphraseSuccess') { | ||
| 238 | root.activeView = "security"; | ||
| 239 | } else { | 261 | } else { |
| 240 | sendToScript(msg); | 262 | sendToScript(msg); |
| 241 | } | 263 | } |
| @@ -245,27 +267,6 @@ Rectangle { · 3 unmodified lines | |||
| 245 | } | 267 | } |
| 246 | } | 268 | } |
| 247 | } | 269 | } |
| 248 | SecurityImageChange { | ||
| 249 | id: securityImageChange; | ||
| 250 | visible: root.activeView === "securityImageChange"; | ||
| 251 | z: 997; | ||
| 252 | anchors.top: titleBarContainer.bottom; | ||
| 253 | anchors.left: parent.left; | ||
| 254 | anchors.right: parent.right; | ||
| 255 | anchors.bottom: parent.bottom; | ||
| 256 | |||
| 257 | Connections { | ||
| 258 | onSendSignalToWallet: { | ||
| 259 | if (msg.method === 'walletSecurity_changeSecurityImageCancelled') { | ||
| 260 | root.activeView = "security"; | ||
| 261 | } else if (msg.method === 'walletSecurity_changeSecurityImageSuccess') { | ||
| 262 | root.activeView = "security"; | ||
| 263 | } else { | ||
| 264 | sendToScript(msg); | ||
| 265 | } | ||
| 266 | } | ||
| 267 | } | ||
| 268 | } | ||
| 269 | 270 | ||
| 270 | // | 271 | // |
| 271 | // TAB CONTENTS START | 272 | // TAB CONTENTS START |
| @@ -344,6 +345,39 @@ Rectangle { · 72 unmodified lines | |||
| 344 | } | 345 | } |
| 345 | } | 346 | } |
| 346 | 347 | ||
| 348 | HifiInspectionCertificate.InspectionCertificate { | ||
| 349 | id: inspectionCertificate; | ||
| 350 | z: 998; | ||
| 351 | visible: false; | ||
| 352 | anchors.fill: parent; | ||
| 353 | |||
| 354 | Connections { | ||
| 355 | onSendToScript: { | ||
| 356 | sendToScript(message); | ||
| 357 | } | ||
| 358 | } | ||
| 359 | } | ||
| 360 | |||
| 361 | HifiPurchases.Purchases { | ||
| 362 | id: walletInventory; | ||
| 363 | visible: root.activeView === "walletInventory"; | ||
| 364 | anchors.top: titleBarContainer.bottom; | ||
| 365 | anchors.bottom: !WalletScriptingInterface.limitedCommerce ? tabButtonsContainer.top : parent.bottom; | ||
| 366 | anchors.left: parent.left; | ||
| 367 | anchors.right: parent.right; | ||
| 368 | Connections { | ||
| 369 | onSendToScript: { | ||
| 370 | if (message.method === 'purchases_itemCertificateClicked') { | ||
| 371 | inspectionCertificate.visible = true; | ||
| 372 | inspectionCertificate.isLightbox = true; | ||
| 373 | sendToScript(message); | ||
| 374 | } else { | ||
| 375 | sendToScript(message); | ||
| 376 | } | ||
| 377 | } | ||
| 378 | } | ||
| 379 | } | ||
| 380 | |||
| 347 | HifiCommon.RootHttpRequest { | 381 | HifiCommon.RootHttpRequest { |
| 348 | id: http; | 382 | id: http; |
| 349 | } | 383 | } |
| @@ -366,39 +400,6 @@ Rectangle { · 16 unmodified lines | |||
| 366 | } | 400 | } |
| 367 | } | 401 | } |
| 368 | 402 | ||
| 369 | Security { | ||
| 370 | id: security; | ||
| 371 | visible: root.activeView === "security"; | ||
| 372 | anchors.top: titleBarContainer.bottom; | ||
| 373 | anchors.bottom: tabButtonsContainer.top; | ||
| 374 | anchors.left: parent.left; | ||
| 375 | anchors.right: parent.right; | ||
| 376 | |||
| 377 | Connections { | ||
| 378 | onSendSignalToWallet: { | ||
| 379 | if (msg.method === 'walletSecurity_changePassphrase') { | ||
| 380 | root.activeView = "passphraseChange"; | ||
| 381 | passphraseChange.clearPassphraseFields(); | ||
| 382 | passphraseChange.resetSubmitButton(); | ||
| 383 | } else if (msg.method === 'walletSecurity_changeSecurityImage') { | ||
| 384 | securityImageChange.initModel(); | ||
| 385 | root.activeView = "securityImageChange"; | ||
| 386 | } else if (msg.method === 'walletSecurity_autoLogoutHelp') { | ||
| 387 | lightboxPopup.titleText = "Automatically Log Out"; | ||
| 388 | lightboxPopup.bodyText = "By default, after you log in to High Fidelity, you will stay logged in to your High Fidelity " + | ||
| 389 | "account even after you close and re-open Interface. This means anyone who opens Interface on your computer " + | ||
| 390 | "could make purchases with your Wallet.\n\n" + | ||
| 391 | "If you do not want to stay logged in across Interface sessions, check this box."; | ||
| 392 | lightboxPopup.button1text = "CLOSE"; | ||
| 393 | lightboxPopup.button1method = function() { | ||
| 394 | lightboxPopup.visible = false; | ||
| 395 | } | ||
| 396 | lightboxPopup.visible = true; | ||
| 397 | } | ||
| 398 | } | ||
| 399 | } | ||
| 400 | } | ||
| 401 | |||
| 402 | Help { | 403 | Help { |
| 403 | id: help; | 404 | id: help; |
| 404 | visible: root.activeView === "help"; | 405 | visible: root.activeView === "help"; |
| @@ -407,14 +408,6 @@ Rectangle { · 2 unmodified lines | |||
| 407 | anchors.left: parent.left; | 408 | anchors.left: parent.left; |
| 408 | anchors.right: parent.right; | 409 | anchors.right: parent.right; |
| 409 | 410 | ||
| 410 | Connections { | ||
| 411 | onSendSignalToWallet: { | ||
| 412 | if (msg.method === 'walletSecurity_changeSecurityImage') { | ||
| 413 | securityImageChange.initModel(); | ||
| 414 | root.activeView = "securityImageChange"; | ||
| 415 | } | ||
| 416 | } | ||
| 417 | } | ||
| 418 | } | 411 | } |
| 419 | 412 | ||
| 420 | 413 | ||
| @@ -427,8 +420,8 @@ Rectangle { · 6 unmodified lines | |||
| 427 | // | 420 | // |
| 428 | Item { | 421 | Item { |
| 429 | id: tabButtonsContainer; | 422 | id: tabButtonsContainer; |
| 430 | visible: !needsLogIn.visible && root.activeView !== "passphraseChange" && root.activeView !== "securityImageChange" && sendMoney.currentActiveView !== "sendAssetStep"; | 423 | visible: !needsLogIn.visible && root.activeView !== "passphraseChange" && sendMoney.currentActiveView !== "sendAssetStep" && !WalletScriptingInterface.limitedCommerce; |
| 431 | property int numTabs: 5; | 424 | property int numTabs: 4; |
| 432 | // Size | 425 | // Size |
| 433 | width: root.width; | 426 | width: root.width; |
| 434 | height: 90; | 427 | height: 90; |
| @@ -446,16 +439,17 @@ Rectangle { · 11 unmodified lines | |||
| 446 | // "WALLET HOME" tab button | 439 | // "WALLET HOME" tab button |
| 447 | Rectangle { | 440 | Rectangle { |
| 448 | id: walletHomeButtonContainer; | 441 | id: walletHomeButtonContainer; |
| 442 | property bool messagesWaiting: false; | ||
| 449 | visible: !walletSetup.visible; | 443 | visible: !walletSetup.visible; |
| 450 | color: root.activeView === "walletHome" ? hifi.colors.blueAccent : hifi.colors.black; | 444 | color: root.activeView === "walletHome" ? hifi.colors.blueAccent : hifi.colors.black; |
| 451 | anchors.top: parent.top; | 445 | anchors.top: parent.top; |
| 452 | anchors.left: parent.left; | 446 | anchors.left: exchangeMoneyButtonContainer.right; |
| 453 | anchors.bottom: parent.bottom; | 447 | anchors.bottom: parent.bottom; |
| 454 | width: parent.width / tabButtonsContainer.numTabs; | 448 | width: parent.width / tabButtonsContainer.numTabs; |
| 455 | 449 | ||
| 456 | HiFiGlyphs { | 450 | HiFiGlyphs { |
| 457 | id: homeTabIcon; | 451 | id: homeTabIcon; |
| 458 | text: hifi.glyphs.home2; | 452 | text: hifi.glyphs.leftRightArrows; |
| 459 | // Size | 453 | // Size |
| 460 | size: 50; | 454 | size: 50; |
| 461 | // Anchors | 455 | // Anchors |
| @@ -463,11 +457,24 @@ Rectangle { · 1 unmodified line | |||
| 463 | anchors.top: parent.top; | 457 | anchors.top: parent.top; |
| 464 | anchors.topMargin: -2; | 458 | anchors.topMargin: -2; |
| 465 | // Style | 459 | // Style |
| 466 | color: root.activeView === "walletHome" || walletHomeTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight; | 460 | color: WalletScriptingInterface.limitedCommerce ? hifi.colors.lightGray50 : ((root.activeView === "walletHome" || walletHomeTabMouseArea.containsMouse) ? hifi.colors.white : hifi.colors.blueHighlight); |
| 461 | } | ||
| 462 | |||
| 463 | Rectangle { | ||
| 464 | id: recentActivityMessagesWaitingLight; | ||
| 465 | visible: parent.messagesWaiting; | ||
| 466 | anchors.right: homeTabIcon.left; | ||
| 467 | anchors.rightMargin: -4; | ||
| 468 | anchors.top: homeTabIcon.top; | ||
| 469 | anchors.topMargin: 16; | ||
| 470 | height: 10; | ||
| 471 | width: height; | ||
| 472 | radius: height/2; | ||
| 473 | color: "red"; | ||
| 467 | } | 474 | } |
| 468 | 475 | ||
| 469 | RalewaySemiBold { | 476 | RalewaySemiBold { |
| 470 | text: "WALLET HOME"; | 477 | text: "RECENT ACTIVITY"; |
| 471 | // Text size | 478 | // Text size |
| 472 | size: 16; | 479 | size: 16; |
| 473 | // Anchors | 480 | // Anchors |
| @@ -478,7 +485,7 @@ Rectangle { · 4 unmodified lines | |||
| 478 | anchors.right: parent.right; | 485 | anchors.right: parent.right; |
| 479 | anchors.rightMargin: 4; | 486 | anchors.rightMargin: 4; |
| 480 | // Style | 487 | // Style |
| 481 | color: root.activeView === "walletHome" || walletHomeTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight; | 488 | color: WalletScriptingInterface.limitedCommerce ? hifi.colors.lightGray50 : ((root.activeView === "walletHome" || walletHomeTabMouseArea.containsMouse) ? hifi.colors.white : hifi.colors.blueHighlight); |
| 482 | wrapMode: Text.WordWrap; | 489 | wrapMode: Text.WordWrap; |
| 483 | // Alignment | 490 | // Alignment |
| 484 | horizontalAlignment: Text.AlignHCenter; | 491 | horizontalAlignment: Text.AlignHCenter; |
| @@ -487,6 +494,7 @@ Rectangle { · 2 unmodified lines | |||
| 487 | MouseArea { | 494 | MouseArea { |
| 488 | id: walletHomeTabMouseArea; | 495 | id: walletHomeTabMouseArea; |
| 489 | anchors.fill: parent; | 496 | anchors.fill: parent; |
| 497 | enabled: !WalletScriptingInterface.limitedCommerce; | ||
| 490 | hoverEnabled: enabled; | 498 | hoverEnabled: enabled; |
| 491 | onClicked: { | 499 | onClicked: { |
| 492 | root.activeView = "walletHome"; | 500 | root.activeView = "walletHome"; |
| @@ -500,28 +508,46 @@ Rectangle { · 7 unmodified lines | |||
| 500 | // "EXCHANGE MONEY" tab button | 508 | // "EXCHANGE MONEY" tab button |
| 501 | Rectangle { | 509 | Rectangle { |
| 502 | id: exchangeMoneyButtonContainer; | 510 | id: exchangeMoneyButtonContainer; |
| 511 | property bool messagesWaiting: false; | ||
| 512 | |||
| 503 | visible: !walletSetup.visible; | 513 | visible: !walletSetup.visible; |
| 504 | color: hifi.colors.black; | 514 | color: root.activeView === "walletInventory" ? hifi.colors.blueAccent : hifi.colors.black; |
| 505 | anchors.top: parent.top; | 515 | anchors.top: parent.top; |
| 506 | anchors.left: walletHomeButtonContainer.right; | 516 | anchors.left: parent.left; |
| 507 | anchors.bottom: parent.bottom; | 517 | anchors.bottom: parent.bottom; |
| 508 | width: parent.width / tabButtonsContainer.numTabs; | 518 | width: parent.width / tabButtonsContainer.numTabs; |
| 509 | 519 | ||
| 510 | HiFiGlyphs { | 520 | Image { |
| 511 | id: exchangeMoneyTabIcon; | 521 | id: exchangeMoneyTabIcon; |
| 512 | text: hifi.glyphs.leftRightArrows; | 522 | source: "images/items-tab-a.svg"; |
| 513 | // Size | 523 | height: 25; |
| 514 | size: 50; | 524 | width: exchangeMoneyTabIcon.height; |
| 515 | // Anchors | ||
| 516 | anchors.horizontalCenter: parent.horizontalCenter; | 525 | anchors.horizontalCenter: parent.horizontalCenter; |
| 517 | anchors.top: parent.top; | 526 | anchors.top: parent.top; |
| 518 | anchors.topMargin: -2; | 527 | anchors.topMargin: 10; |
| 519 | // Style | 528 | visible: false; // When we use a white .svg instead of a glyph with color property, we set to invisible and use the following ColorOverlay. |
| 520 | color: hifi.colors.lightGray50; | 529 | } |
| 530 | ColorOverlay { | ||
| 531 | anchors.fill: exchangeMoneyTabIcon; | ||
| 532 | source: exchangeMoneyTabIcon; | ||
| 533 | color: root.activeView === "walletInventory" || inventoryTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight; | ||
| 534 | } | ||
| 535 | |||
| 536 | Rectangle { | ||
| 537 | id: exchangeMoneyMessagesWaitingLight; | ||
| 538 | visible: parent.messagesWaiting; | ||
| 539 | anchors.right: exchangeMoneyTabIcon.left; | ||
| 540 | anchors.rightMargin: 9; | ||
| 541 | anchors.top: exchangeMoneyTabIcon.top; | ||
| 542 | anchors.topMargin: 4; | ||
| 543 | height: 10; | ||
| 544 | width: height; | ||
| 545 | radius: height/2; | ||
| 546 | color: "red"; | ||
| 521 | } | 547 | } |
| 522 | 548 | ||
| 523 | RalewaySemiBold { | 549 | RalewaySemiBold { |
| 524 | text: "EXCHANGE MONEY"; | 550 | text: "ITEMS"; |
| 525 | // Text size | 551 | // Text size |
| 526 | size: 16; | 552 | size: 16; |
| 527 | // Anchors | 553 | // Anchors |
| @@ -532,12 +558,24 @@ Rectangle { · 4 unmodified lines | |||
| 532 | anchors.right: parent.right; | 558 | anchors.right: parent.right; |
| 533 | anchors.rightMargin: 4; | 559 | anchors.rightMargin: 4; |
| 534 | // Style | 560 | // Style |
| 535 | color: hifi.colors.lightGray50; | 561 | color: root.activeView === "walletInventory" || inventoryTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight; |
| 536 | wrapMode: Text.WordWrap; | 562 | wrapMode: Text.WordWrap; |
| 537 | // Alignment | 563 | // Alignment |
| 538 | horizontalAlignment: Text.AlignHCenter; | 564 | horizontalAlignment: Text.AlignHCenter; |
| 539 | verticalAlignment: Text.AlignTop; | 565 | verticalAlignment: Text.AlignTop; |
| 540 | } | 566 | } |
| 567 | |||
| 568 | MouseArea { | ||
| 569 | id: inventoryTabMouseArea; | ||
| 570 | anchors.fill: parent; | ||
| 571 | hoverEnabled: enabled; | ||
| 572 | onClicked: { | ||
| 573 | root.activeView = "walletInventory"; | ||
| 574 | tabButtonsContainer.resetTabButtonColors(); | ||
| 575 | } | ||
| 576 | onEntered: parent.color = hifi.colors.blueHighlight; | ||
| 577 | onExited: parent.color = root.activeView === "walletInventory" ? hifi.colors.blueAccent : hifi.colors.black; | ||
| 578 | } | ||
| 541 | } | 579 | } |
| 542 | 580 | ||
| 543 | 581 | ||
| @@ -547,7 +585,7 @@ Rectangle { · 3 unmodified lines | |||
| 547 | visible: !walletSetup.visible; | 585 | visible: !walletSetup.visible; |
| 548 | color: root.activeView === "sendMoney" ? hifi.colors.blueAccent : hifi.colors.black; | 586 | color: root.activeView === "sendMoney" ? hifi.colors.blueAccent : hifi.colors.black; |
| 549 | anchors.top: parent.top; | 587 | anchors.top: parent.top; |
| 550 | anchors.left: exchangeMoneyButtonContainer.right; | 588 | anchors.left: walletHomeButtonContainer.right; |
| 551 | anchors.bottom: parent.bottom; | 589 | anchors.bottom: parent.bottom; |
| 552 | width: parent.width / tabButtonsContainer.numTabs; | 590 | width: parent.width / tabButtonsContainer.numTabs; |
| 553 | 591 | ||
| @@ -561,7 +599,7 @@ Rectangle { · 7 unmodified lines | |||
| 561 | anchors.top: parent.top; | 599 | anchors.top: parent.top; |
| 562 | anchors.topMargin: -2; | 600 | anchors.topMargin: -2; |
| 563 | // Style | 601 | // Style |
| 564 | color: root.activeView === "sendMoney" || sendMoneyTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight; | 602 | color: WalletScriptingInterface.limitedCommerce ? hifi.colors.lightGray50 : ((root.activeView === "sendMoney" || sendMoneyTabMouseArea.containsMouse) ? hifi.colors.white : hifi.colors.blueHighlight); |
| 565 | } | 603 | } |
| 566 | 604 | ||
| 567 | RalewaySemiBold { | 605 | RalewaySemiBold { |
| @@ -576,7 +614,7 @@ Rectangle { · 8 unmodified lines | |||
| 576 | anchors.right: parent.right; | 614 | anchors.right: parent.right; |
| 577 | anchors.rightMargin: 4; | 615 | anchors.rightMargin: 4; |
| 578 | // Style | 616 | // Style |
| 579 | color: root.activeView === "sendMoney" || sendMoneyTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight; | 617 | color: WalletScriptingInterface.limitedCommerce ? hifi.colors.lightGray50 : ((root.activeView === "sendMoney" || sendMoneyTabMouseArea.containsMouse) ? hifi.colors.white : hifi.colors.blueHighlight); |
| 580 | wrapMode: Text.WordWrap; | 618 | wrapMode: Text.WordWrap; |
| 581 | // Alignment | 619 | // Alignment |
| 582 | horizontalAlignment: Text.AlignHCenter; | 620 | horizontalAlignment: Text.AlignHCenter; |
| @@ -586,6 +624,7 @@ Rectangle { · 3 unmodified lines | |||
| 586 | MouseArea { | 624 | MouseArea { |
| 587 | id: sendMoneyTabMouseArea; | 625 | id: sendMoneyTabMouseArea; |
| 588 | anchors.fill: parent; | 626 | anchors.fill: parent; |
| 627 | enabled: !WalletScriptingInterface.limitedCommerce; | ||
| 589 | hoverEnabled: enabled; | 628 | hoverEnabled: enabled; |
| 590 | onClicked: { | 629 | onClicked: { |
| 591 | root.activeView = "sendMoney"; | 630 | root.activeView = "sendMoney"; |
| @@ -596,67 +635,13 @@ Rectangle { · 4 unmodified lines | |||
| 596 | } | 635 | } |
| 597 | } | 636 | } |
| 598 | 637 | ||
| 599 | // "SECURITY" tab button | ||
| 600 | Rectangle { | ||
| 601 | id: securityButtonContainer; | ||
| 602 | visible: !walletSetup.visible; | ||
| 603 | color: root.activeView === "security" ? hifi.colors.blueAccent : hifi.colors.black; | ||
| 604 | anchors.top: parent.top; | ||
| 605 | anchors.left: sendMoneyButtonContainer.right; | ||
| 606 | anchors.bottom: parent.bottom; | ||
| 607 | width: parent.width / tabButtonsContainer.numTabs; | ||
| 608 | |||
| 609 | HiFiGlyphs { | ||
| 610 | id: securityTabIcon; | ||
| 611 | text: hifi.glyphs.lock; | ||
| 612 | // Size | ||
| 613 | size: 38; | ||
| 614 | // Anchors | ||
| 615 | anchors.horizontalCenter: parent.horizontalCenter; | ||
| 616 | anchors.top: parent.top; | ||
| 617 | anchors.topMargin: 2; | ||
| 618 | // Style | ||
| 619 | color: root.activeView === "security" || securityTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight; | ||
| 620 | } | ||
| 621 | |||
| 622 | RalewaySemiBold { | ||
| 623 | text: "SECURITY"; | ||
| 624 | // Text size | ||
| 625 | size: 16; | ||
| 626 | // Anchors | ||
| 627 | anchors.bottom: parent.bottom; | ||
| 628 | height: parent.height/2; | ||
| 629 | anchors.left: parent.left; | ||
| 630 | anchors.leftMargin: 4; | ||
| 631 | anchors.right: parent.right; | ||
| 632 | anchors.rightMargin: 4; | ||
| 633 | // Style | ||
| 634 | color: root.activeView === "security" || securityTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight; | ||
| 635 | wrapMode: Text.WordWrap; | ||
| 636 | // Alignment | ||
| 637 | horizontalAlignment: Text.AlignHCenter; | ||
| 638 | verticalAlignment: Text.AlignTop; | ||
| 639 | } | ||
| 640 | MouseArea { | ||
| 641 | id: securityTabMouseArea; | ||
| 642 | anchors.fill: parent; | ||
| 643 | hoverEnabled: enabled; | ||
| 644 | onClicked: { | ||
| 645 | root.activeView = "security"; | ||
| 646 | tabButtonsContainer.resetTabButtonColors(); | ||
| 647 | } | ||
| 648 | onEntered: parent.color = hifi.colors.blueHighlight; | ||
| 649 | onExited: parent.color = root.activeView === "security" ? hifi.colors.blueAccent : hifi.colors.black; | ||
| 650 | } | ||
| 651 | } | ||
| 652 | |||
| 653 | // "HELP" tab button | 638 | // "HELP" tab button |
| 654 | Rectangle { | 639 | Rectangle { |
| 655 | id: helpButtonContainer; | 640 | id: helpButtonContainer; |
| 656 | visible: !walletSetup.visible; | 641 | visible: !walletSetup.visible; |
| 657 | color: root.activeView === "help" ? hifi.colors.blueAccent : hifi.colors.black; | 642 | color: root.activeView === "help" ? hifi.colors.blueAccent : hifi.colors.black; |
| 658 | anchors.top: parent.top; | 643 | anchors.top: parent.top; |
| 659 | anchors.left: securityButtonContainer.right; | 644 | anchors.left: sendMoneyButtonContainer.right; |
| 660 | anchors.bottom: parent.bottom; | 645 | anchors.bottom: parent.bottom; |
| 661 | width: parent.width / tabButtonsContainer.numTabs; | 646 | width: parent.width / tabButtonsContainer.numTabs; |
| 662 | 647 | ||
| @@ -708,16 +693,16 @@ Rectangle { · 45 unmodified lines | |||
| 708 | function resetTabButtonColors() { | 693 | function resetTabButtonColors() { |
| 709 | walletHomeButtonContainer.color = hifi.colors.black; | 694 | walletHomeButtonContainer.color = hifi.colors.black; |
| 710 | sendMoneyButtonContainer.color = hifi.colors.black; | 695 | sendMoneyButtonContainer.color = hifi.colors.black; |
| 711 | securityButtonContainer.color = hifi.colors.black; | ||
| 712 | helpButtonContainer.color = hifi.colors.black; | 696 | helpButtonContainer.color = hifi.colors.black; |
| 697 | exchangeMoneyButtonContainer.color = hifi.colors.black; | ||
| 713 | if (root.activeView === "walletHome") { | 698 | if (root.activeView === "walletHome") { |
| 714 | walletHomeButtonContainer.color = hifi.colors.blueAccent; | 699 | walletHomeButtonContainer.color = hifi.colors.blueAccent; |
| 715 | } else if (root.activeView === "sendMoney") { | 700 | } else if (root.activeView === "sendMoney") { |
| 716 | sendMoneyButtonContainer.color = hifi.colors.blueAccent; | 701 | sendMoneyButtonContainer.color = hifi.colors.blueAccent; |
| 717 | } else if (root.activeView === "security") { | ||
| 718 | securityButtonContainer.color = hifi.colors.blueAccent; | ||
| 719 | } else if (root.activeView === "help") { | 702 | } else if (root.activeView === "help") { |
| 720 | helpButtonContainer.color = hifi.colors.blueAccent; | 703 | helpButtonContainer.color = hifi.colors.blueAccent; |
| 704 | } else if (root.activeView == "walletInventory") { | ||
| 705 | exchangeMoneyButtonContainer.color = hifi.colors.blueAccent; | ||
| 721 | } | 706 | } |
| 722 | } | 707 | } |
| 723 | } | 708 | } |
| @@ -783,18 +768,40 @@ Rectangle { · 59 unmodified lines | |||
| 783 | break; | 768 | break; |
| 784 | case 'updateConnections': | 769 | case 'updateConnections': |
| 785 | sendMoney.updateConnections(message.connections); | 770 | sendMoney.updateConnections(message.connections); |
| 771 | walletInventory.fromScript(message); | ||
| 786 | break; | 772 | break; |
| 787 | case 'selectRecipient': | 773 | case 'selectRecipient': |
| 788 | case 'updateSelectedRecipientUsername': | 774 | case 'updateSelectedRecipientUsername': |
| 789 | sendMoney.fromScript(message); | 775 | sendMoney.fromScript(message); |
| 776 | walletInventory.fromScript(message); | ||
| 790 | break; | 777 | break; |
| 791 | case 'http.response': | 778 | case 'http.response': |
| 792 | http.handleHttpResponse(message); | 779 | http.handleHttpResponse(message); |
| 780 | // Duplicate handler is required because we don't track referrer for `http` | ||
| 781 | walletInventory.fromScript(message); | ||
| 793 | break; | 782 | break; |
| 794 | case 'palIsStale': | 783 | case 'palIsStale': |
| 795 | case 'avatarDisconnected': | 784 | case 'avatarDisconnected': |
| 796 | // Because we don't have "channels" for sending messages to a specific QML object, the messages are broadcast to all QML Items. If an Item of yours happens to be visible when some script sends a message with a method you don't expect, you'll get "Unrecognized message..." logs. | 785 | // Because we don't have "channels" for sending messages to a specific QML object, the messages are broadcast to all QML Items. If an Item of yours happens to be visible when some script sends a message with a method you don't expect, you'll get "Unrecognized message..." logs. |
| 797 | break; | 786 | break; |
| 787 | case 'inspectionCertificate_setCertificateId': | ||
| 788 | inspectionCertificate.fromScript(message); | ||
| 789 | break; | ||
| 790 | case 'updatePurchases': | ||
| 791 | case 'purchases_showMyItems': | ||
| 792 | case 'updateWearables': | ||
| 793 | walletInventory.fromScript(message); | ||
| 794 | break; | ||
| 795 | case 'updateRecentActivityMessageLight': | ||
| 796 | walletHomeButtonContainer.messagesWaiting = message.messagesWaiting; | ||
| 797 | break; | ||
| 798 | case 'checkout_openRecentActivity': | ||
| 799 | if (root.activeView === "initialize") { | ||
| 800 | root.initialActiveViewAfterStatus5 = "walletHome"; | ||
| 801 | } else { | ||
| 802 | root.activeView = "walletHome"; | ||
| 803 | } | ||
| 804 | break; | ||
| 798 | default: | 805 | default: |
| 799 | console.log('Unrecognized message from wallet.js:', JSON.stringify(message)); | 806 | console.log('Unrecognized message from wallet.js:', JSON.stringify(message)); |
| 800 | } | 807 | } |
| @@ -842,7 +849,8 @@ Rectangle { · 41 unmodified lines | |||
| 842 | root.activeView = "initialize"; | 849 | root.activeView = "initialize"; |
| 843 | Commerce.getWalletStatus(); | 850 | Commerce.getWalletStatus(); |
| 844 | } else if (msg.referrer === 'purchases') { | 851 | } else if (msg.referrer === 'purchases') { |
| 845 | sendToScript({method: 'goToPurchases'}); | 852 | root.activeView = "walletInventory"; |
| 853 | tabButtonsContainer.resetTabButtonColors(); | ||
| 846 | } else if (msg.referrer === 'marketplace cta' || msg.referrer === 'mainPage') { | 854 | } else if (msg.referrer === 'marketplace cta' || msg.referrer === 'mainPage') { |
| 847 | sendToScript({method: 'goToMarketplaceMainPage', itemId: msg.referrer}); | 855 | sendToScript({method: 'goToMarketplaceMainPage', itemId: msg.referrer}); |
| 848 | } else { | 856 | } else { |
| @@ -14,8 +14,8 @@ · 13 unmodified lines | |||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import "../common" as HifiCommerceCommon | 16 | import "../common" as HifiCommerceCommon |
| 17 | import "../../../styles-uit" | 17 | import stylesUit 1.0 |
| 18 | import "../../../controls-uit" as HifiControlsUit | 18 | import controlsUit 1.0 as HifiControlsUit |
| 19 | 19 | ||
| 20 | 20 | ||
| 21 | Item { | 21 | Item { |
| @@ -15,8 +15,8 @@ import Hifi 1.0 as Hifi · 14 unmodified lines | |||
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import QtGraphicalEffects 1.0 | 16 | import QtGraphicalEffects 1.0 |
| 17 | import QtQuick.Controls 2.2 | 17 | import QtQuick.Controls 2.2 |
| 18 | import "../../../styles-uit" | 18 | import stylesUit 1.0 |
| 19 | import "../../../controls-uit" as HifiControlsUit | 19 | import controlsUit 1.0 as HifiControlsUit |
| 20 | import "../../../controls" as HifiControls | 20 | import "../../../controls" as HifiControls |
| 21 | import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere. | 21 | import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere. |
| 22 | 22 | ||
| @@ -29,7 +29,6 @@ Item { · 6 unmodified lines | |||
| 29 | if (visible) { | 29 | if (visible) { |
| 30 | Commerce.balance(); | 30 | Commerce.balance(); |
| 31 | transactionHistoryModel.getFirstPage(); | 31 | transactionHistoryModel.getFirstPage(); |
| 32 | Commerce.getAvailableUpdates(); | ||
| 33 | } else { | 32 | } else { |
| 34 | refreshTimer.stop(); | 33 | refreshTimer.stop(); |
| 35 | } | 34 | } |
| @@ -179,28 +178,6 @@ Item { · 143 unmodified lines | |||
| 179 | color: hifi.colors.baseGrayHighlight; | 178 | color: hifi.colors.baseGrayHighlight; |
| 180 | } | 179 | } |
| 181 | 180 | ||
| 182 | RalewaySemiBold { | ||
| 183 | id: myPurchasesLink; | ||
| 184 | text: '<font color="#0093C5"><a href="#myPurchases">My Purchases</a></font>'; | ||
| 185 | // Anchors | ||
| 186 | anchors.top: parent.top; | ||
| 187 | anchors.topMargin: 26; | ||
| 188 | anchors.right: parent.right; | ||
| 189 | anchors.rightMargin: 20; | ||
| 190 | width: paintedWidth; | ||
| 191 | height: 30; | ||
| 192 | y: 4; | ||
| 193 | // Text size | ||
| 194 | size: 18; | ||
| 195 | // Style | ||
| 196 | color: hifi.colors.baseGrayHighlight; | ||
| 197 | horizontalAlignment: Text.AlignRight; | ||
| 198 | |||
| 199 | onLinkActivated: { | ||
| 200 | sendSignalToWallet({method: 'goToPurchases_fromWalletHome'}); | ||
| 201 | } | ||
| 202 | } | ||
| 203 | |||
| 204 | HifiModels.PSFListModel { | 181 | HifiModels.PSFListModel { |
| 205 | id: transactionHistoryModel; | 182 | id: transactionHistoryModel; |
| 206 | property int lastPendingCount: 0; | 183 | property int lastPendingCount: 0; |
| @@ -14,8 +14,8 @@ · 13 unmodified lines | |||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import QtGraphicalEffects 1.0 | 16 | import QtGraphicalEffects 1.0 |
| 17 | import "../../../styles-uit" | 17 | import stylesUit 1.0 |
| 18 | import "../../../controls-uit" as HifiControlsUit | 18 | import controlsUit 1.0 as HifiControlsUit |
| 19 | import "../../../controls" as HifiControls | 19 | import "../../../controls" as HifiControls |
| 20 | import "../common" as HifiCommerceCommon | 20 | import "../common" as HifiCommerceCommon |
| 21 | 21 | ||
| @@ -243,7 +243,6 @@ Item { · 221 unmodified lines | |||
| 243 | height: 50; | 243 | height: 50; |
| 244 | text: "Set Up Wallet"; | 244 | text: "Set Up Wallet"; |
| 245 | onClicked: { | 245 | onClicked: { |
| 246 | securityImageSelection.initModel(); | ||
| 247 | root.activeView = "step_2"; | 246 | root.activeView = "step_2"; |
| 248 | } | 247 | } |
| 249 | } | 248 | } |
| @@ -267,124 +266,6 @@ Item { · 17 unmodified lines | |||
| 267 | // FIRST PAGE END | 266 | // FIRST PAGE END |
| 268 | // | 267 | // |
| 269 | 268 | ||
| 270 | // | ||
| 271 | // SECURITY IMAGE SELECTION START | ||
| 272 | // | ||
| 273 | Item { | ||
| 274 | id: securityImageContainer; | ||
| 275 | visible: root.activeView === "step_2"; | ||
| 276 | // Anchors | ||
| 277 | anchors.top: titleBarContainer.bottom; | ||
| 278 | anchors.topMargin: 30; | ||
| 279 | anchors.bottom: parent.bottom; | ||
| 280 | anchors.left: parent.left; | ||
| 281 | anchors.leftMargin: 16; | ||
| 282 | anchors.right: parent.right; | ||
| 283 | anchors.rightMargin: 16; | ||
| 284 | |||
| 285 | // Text below title bar | ||
| 286 | RalewayRegular { | ||
| 287 | id: securityImageTitleHelper; | ||
| 288 | text: "Choose a Security Pic:"; | ||
| 289 | // Text size | ||
| 290 | size: 24; | ||
| 291 | // Anchors | ||
| 292 | anchors.top: parent.top; | ||
| 293 | anchors.left: parent.left; | ||
| 294 | height: 50; | ||
| 295 | width: paintedWidth; | ||
| 296 | // Style | ||
| 297 | color: hifi.colors.white; | ||
| 298 | // Alignment | ||
| 299 | horizontalAlignment: Text.AlignHLeft; | ||
| 300 | verticalAlignment: Text.AlignVCenter; | ||
| 301 | } | ||
| 302 | |||
| 303 | SecurityImageSelection { | ||
| 304 | id: securityImageSelection; | ||
| 305 | // Anchors | ||
| 306 | anchors.top: securityImageTitleHelper.bottom; | ||
| 307 | anchors.left: parent.left; | ||
| 308 | anchors.right: parent.right; | ||
| 309 | height: 300; | ||
| 310 | |||
| 311 | Connections { | ||
| 312 | onSendSignalToWallet: { | ||
| 313 | sendSignalToWallet(msg); | ||
| 314 | } | ||
| 315 | } | ||
| 316 | } | ||
| 317 | |||
| 318 | // Text below security images | ||
| 319 | RalewayRegular { | ||
| 320 | text: "<b>Your security picture shows you that the service asking for your passphrase is authorized.</b> You can change your secure picture at any time."; | ||
| 321 | // Text size | ||
| 322 | size: 18; | ||
| 323 | // Anchors | ||
| 324 | anchors.top: securityImageSelection.bottom; | ||
| 325 | anchors.topMargin: 40; | ||
| 326 | anchors.left: parent.left; | ||
| 327 | anchors.right: parent.right; | ||
| 328 | height: paintedHeight; | ||
| 329 | // Style | ||
| 330 | color: hifi.colors.white; | ||
| 331 | wrapMode: Text.WordWrap; | ||
| 332 | // Alignment | ||
| 333 | horizontalAlignment: Text.AlignHLeft; | ||
| 334 | verticalAlignment: Text.AlignVCenter; | ||
| 335 | } | ||
| 336 | |||
| 337 | // Navigation Bar | ||
| 338 | Item { | ||
| 339 | // Size | ||
| 340 | width: parent.width; | ||
| 341 | height: 50; | ||
| 342 | // Anchors: | ||
| 343 | anchors.left: parent.left; | ||
| 344 | anchors.bottom: parent.bottom; | ||
| 345 | anchors.bottomMargin: 50; | ||
| 346 | |||
| 347 | // "Back" button | ||
| 348 | HifiControlsUit.Button { | ||
| 349 | color: hifi.buttons.noneBorderlessWhite; | ||
| 350 | colorScheme: hifi.colorSchemes.dark; | ||
| 351 | anchors.top: parent.top; | ||
| 352 | anchors.bottom: parent.bottom; | ||
| 353 | anchors.left: parent.left; | ||
| 354 | anchors.leftMargin: 20; | ||
| 355 | width: 200; | ||
| 356 | text: "Back" | ||
| 357 | onClicked: { | ||
| 358 | securityImageSelection.resetSelection(); | ||
| 359 | root.activeView = "step_1"; | ||
| 360 | } | ||
| 361 | } | ||
| 362 | |||
| 363 | // "Next" button | ||
| 364 | HifiControlsUit.Button { | ||
| 365 | enabled: securityImageSelection.currentIndex !== -1; | ||
| 366 | color: hifi.buttons.blue; | ||
| 367 | colorScheme: hifi.colorSchemes.dark; | ||
| 368 | anchors.top: parent.top; | ||
| 369 | anchors.bottom: parent.bottom; | ||
| 370 | anchors.right: parent.right; | ||
| 371 | anchors.rightMargin: 20; | ||
| 372 | width: 200; | ||
| 373 | text: "Next"; | ||
| 374 | onClicked: { | ||
| 375 | root.lastPage = "step_2"; | ||
| 376 | var securityImagePath = securityImageSelection.getImagePathFromImageID(securityImageSelection.getSelectedImageIndex()) | ||
| 377 | Commerce.chooseSecurityImage(securityImagePath); | ||
| 378 | root.activeView = "step_3"; | ||
| 379 | passphraseSelection.clearPassphraseFields(); | ||
| 380 | } | ||
| 381 | } | ||
| 382 | } | ||
| 383 | } | ||
| 384 | // | ||
| 385 | // SECURITY IMAGE SELECTION END | ||
| 386 | // | ||
| 387 | |||
| 388 | // | 269 | // |
| 389 | // SECURE PASSPHRASE SELECTION START | 270 | // SECURE PASSPHRASE SELECTION START |
| 390 | // | 271 | // |
| @@ -525,7 +406,6 @@ Item { · 134 unmodified lines | |||
| 525 | width: 200; | 406 | width: 200; |
| 526 | text: "Back" | 407 | text: "Back" |
| 527 | onClicked: { | 408 | onClicked: { |
| 528 | securityImageSelection.resetSelection(); | ||
| 529 | root.lastPage = "step_3"; | 409 | root.lastPage = "step_3"; |
| 530 | root.activeView = "step_2"; | 410 | root.activeView = "step_2"; |
| 531 | } | 411 | } |
| @@ -0,0 +1,8 @@ | |||
| 1 | <svg width="26" height="24" viewBox="0 0 26 24" fill="none" xmlns="http://www.w3.org/2000/svg"> | ||
| 2 | <line x1="6" y1="2" x2="26" y2="2" stroke="white" stroke-width="4"/> | ||
| 3 | <line x1="1.74846e-07" y1="2" x2="4" y2="2" stroke="white" stroke-width="4"/> | ||
| 4 | <line x1="6" y1="12" x2="26" y2="12" stroke="white" stroke-width="4"/> | ||
| 5 | <line x1="1.74846e-07" y1="12" x2="4" y2="12" stroke="white" stroke-width="4"/> | ||
| 6 | <line x1="6" y1="22" x2="26" y2="22" stroke="white" stroke-width="4"/> | ||
| 7 | <line x1="1.74846e-07" y1="22" x2="4" y2="22" stroke="white" stroke-width="4"/> | ||
| 8 | </svg> | ||
| @@ -10,7 +10,7 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.8 | 11 | import QtQuick 2.8 |
| 12 | 12 | ||
| 13 | import "../../styles-uit" | 13 | import stylesUit 1.0 |
| 14 | import "../../windows" | 14 | import "../../windows" |
| 15 | 15 | ||
| 16 | ScrollingWindow { | 16 | ScrollingWindow { |
| @@ -13,8 +13,8 @@ import QtQuick.Controls 1.4 · 12 unmodified lines | |||
| 13 | import QtQuick.Dialogs 1.2 as OriginalDialogs | 13 | import QtQuick.Dialogs 1.2 as OriginalDialogs |
| 14 | import Qt.labs.settings 1.0 | 14 | import Qt.labs.settings 1.0 |
| 15 | 15 | ||
| 16 | import "../../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "../../controls-uit" as HifiControls | 17 | import controlsUit 1.0 as HifiControls |
| 18 | import "../../windows" | 18 | import "../../windows" |
| 19 | import "../" | 19 | import "../" |
| 20 | 20 | ||
| @@ -9,7 +9,7 @@ · 8 unmodified lines | |||
| 9 | // | 9 | // |
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import "../../styles-uit" | 12 | import stylesUit 1.0 |
| 13 | 13 | ||
| 14 | Rectangle { | 14 | Rectangle { |
| 15 | width: 480 | 15 | width: 480 |
| @@ -14,8 +14,8 @@ import QtQuick.Controls.Styles 1.4 · 13 unmodified lines | |||
| 14 | import QtQuick.Dialogs 1.2 as OriginalDialogs | 14 | import QtQuick.Dialogs 1.2 as OriginalDialogs |
| 15 | import Qt.labs.settings 1.0 | 15 | import Qt.labs.settings 1.0 |
| 16 | 16 | ||
| 17 | import "../../styles-uit" | 17 | import stylesUit 1.0 |
| 18 | import "../../controls-uit" as HifiControls | 18 | import controlsUit 1.0 as HifiControls |
| 19 | import "../../windows" | 19 | import "../../windows" |
| 20 | import ".." | 20 | import ".." |
| 21 | 21 | ||
| @@ -11,8 +11,8 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import Qt.labs.settings 1.0 | 12 | import Qt.labs.settings 1.0 |
| 13 | 13 | ||
| 14 | import "../../styles-uit" | 14 | import stylesUit 1.0 |
| 15 | import "../../controls-uit" as HifiControls | 15 | import controlsUit 1.0 as HifiControls |
| 16 | import "../../windows" | 16 | import "../../windows" |
| 17 | 17 | ||
| 18 | Rectangle { | 18 | Rectangle { |
| @@ -12,8 +12,8 @@ import QtQuick 2.7 · 11 unmodified lines | |||
| 12 | import QtQuick.Controls 2.2 | 12 | import QtQuick.Controls 2.2 |
| 13 | import Hifi 1.0 as Hifi | 13 | import Hifi 1.0 as Hifi |
| 14 | 14 | ||
| 15 | import "../../styles-uit" | 15 | import stylesUit 1.0 |
| 16 | import "../../controls-uit" as HifiControls | 16 | import controlsUit 1.0 as HifiControls |
| 17 | 17 | ||
| 18 | Rectangle { | 18 | Rectangle { |
| 19 | id: root | 19 | id: root |
| @@ -11,8 +11,8 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import Qt.labs.settings 1.0 | 12 | import Qt.labs.settings 1.0 |
| 13 | 13 | ||
| 14 | import "../../styles-uit" | 14 | import stylesUit 1.0 |
| 15 | import "../../controls-uit" as HifiControls | 15 | import controlsUit 1.0 as HifiControls |
| 16 | import "../../windows" | 16 | import "../../windows" |
| 17 | 17 | ||
| 18 | Rectangle { | 18 | Rectangle { |
| @@ -10,8 +10,8 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../../styles-uit" | 13 | import stylesUit 1.0 |
| 14 | import "../../controls-uit" as HifiControls | 14 | import controlsUit 1.0 as HifiControls |
| 15 | 15 | ||
| 16 | Column { | 16 | Column { |
| 17 | id: root | 17 | id: root |
| @@ -10,8 +10,8 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../../styles-uit" | 13 | import stylesUit 1.0 |
| 14 | import "../../controls-uit" as HifiControls | 14 | import controlsUit 1.0 as HifiControls |
| 15 | import "../../windows" | 15 | import "../../windows" |
| 16 | 16 | ||
| 17 | Rectangle { | 17 | Rectangle { |
| @@ -13,8 +13,8 @@ import QtQuick.Controls 1.4 · 12 unmodified lines | |||
| 13 | import QtQuick.Dialogs 1.2 as OriginalDialogs | 13 | import QtQuick.Dialogs 1.2 as OriginalDialogs |
| 14 | import Qt.labs.settings 1.0 | 14 | import Qt.labs.settings 1.0 |
| 15 | 15 | ||
| 16 | import "../../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "../../controls-uit" as HifiControls | 17 | import controlsUit 1.0 as HifiControls |
| 18 | import "../../windows" | 18 | import "../../windows" |
| 19 | import "../" | 19 | import "../" |
| 20 | 20 | ||
| @@ -88,6 +88,10 @@ Rectangle { · 67 unmodified lines | |||
| 88 | checkMenu.restart(); | 88 | checkMenu.restart(); |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | Component.onDestruction: { | ||
| 92 | keyboard.raised = false; | ||
| 93 | } | ||
| 94 | |||
| 91 | function updateRunningScripts() { | 95 | function updateRunningScripts() { |
| 92 | function simplify(path) { | 96 | function simplify(path) { |
| 93 | // trim URI querystring/fragment | 97 | // trim URI querystring/fragment |
| @@ -1,7 +1,7 @@ | |||
| 1 | import QtQuick 2.7 | 1 | import QtQuick 2.7 |
| 2 | import QtQuick.Controls 2.3 | 2 | import QtQuick.Controls 2.3 |
| 3 | 3 | ||
| 4 | import "../../../controls-uit" as HifiControls | 4 | import controlsUit 1.0 as HifiControls |
| 5 | 5 | ||
| 6 | Column { | 6 | Column { |
| 7 | width: pane.contentWidth | 7 | width: pane.contentWidth |
| @@ -0,0 +1,344 @@ | |||
| 1 | // | ||
| 2 | // Security.qml | ||
| 3 | // qml\hifi\dialogs\security | ||
| 4 | // | ||
| 5 | // Security | ||
| 6 | // | ||
| 7 | // Created by Zach Fox on 2018-10-31 | ||
| 8 | // Copyright 2018 High Fidelity, Inc. | ||
| 9 | // | ||
| 10 | // Distributed under the Apache License, Version 2.0. | ||
| 11 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 12 | // | ||
| 13 | |||
| 14 | import Hifi 1.0 as Hifi | ||
| 15 | import QtQuick 2.5 | ||
| 16 | import QtGraphicalEffects 1.0 | ||
| 17 | import stylesUit 1.0 as HifiStylesUit | ||
| 18 | import controlsUit 1.0 as HifiControlsUit | ||
| 19 | import "qrc:////qml//controls" as HifiControls | ||
| 20 | import "qrc:////qml//hifi//commerce//common" as HifiCommerceCommon | ||
| 21 | |||
| 22 | Rectangle { | ||
| 23 | HifiStylesUit.HifiConstants { id: hifi; } | ||
| 24 | |||
| 25 | id: root; | ||
| 26 | color: hifi.colors.baseGray; | ||
| 27 | |||
| 28 | property string title: "Security Settings"; | ||
| 29 | property bool walletSetUp; | ||
| 30 | |||
| 31 | QtObject { | ||
| 32 | id: margins | ||
| 33 | property real paddings: root.width / 20.25 | ||
| 34 | |||
| 35 | property real sizeCheckBox: root.width / 13.5 | ||
| 36 | property real sizeText: root.width / 2.5 | ||
| 37 | property real sizeLevel: root.width / 5.8 | ||
| 38 | property real sizeDesktop: root.width / 5.8 | ||
| 39 | property real sizeVR: root.width / 13.5 | ||
| 40 | } | ||
| 41 | |||
| 42 | Connections { | ||
| 43 | target: Commerce; | ||
| 44 | |||
| 45 | onWalletStatusResult: { | ||
| 46 | if (walletStatus === 5) { | ||
| 47 | Commerce.getSecurityImage(); | ||
| 48 | root.walletSetUp = true; | ||
| 49 | } else { | ||
| 50 | root.walletSetUp = false; | ||
| 51 | } | ||
| 52 | } | ||
| 53 | |||
| 54 | onSecurityImageResult: { | ||
| 55 | if (exists) { | ||
| 56 | currentSecurityPicture.source = ""; | ||
| 57 | currentSecurityPicture.source = "image://security/securityImage"; | ||
| 58 | } | ||
| 59 | } | ||
| 60 | } | ||
| 61 | |||
| 62 | Component.onCompleted: { | ||
| 63 | Commerce.getWalletStatus(); | ||
| 64 | } | ||
| 65 | |||
| 66 | HifiCommerceCommon.CommerceLightbox { | ||
| 67 | z: 996; | ||
| 68 | id: lightboxPopup; | ||
| 69 | visible: false; | ||
| 70 | anchors.fill: parent; | ||
| 71 | } | ||
| 72 | |||
| 73 | SecurityImageChange { | ||
| 74 | id: securityImageChange; | ||
| 75 | visible: false; | ||
| 76 | z: 997; | ||
| 77 | anchors.top: usernameText.bottom; | ||
| 78 | anchors.left: parent.left; | ||
| 79 | anchors.right: parent.right; | ||
| 80 | anchors.bottom: parent.bottom; | ||
| 81 | |||
| 82 | Connections { | ||
| 83 | onSendSignalToParent: { | ||
| 84 | securityImageChange.visible = false; | ||
| 85 | } | ||
| 86 | } | ||
| 87 | } | ||
| 88 | |||
| 89 | // Username Text | ||
| 90 | HifiStylesUit.RalewayRegular { | ||
| 91 | id: usernameText; | ||
| 92 | text: Account.username === "Unknown user" ? "Please Log In" : Account.username; | ||
| 93 | // Text size | ||
| 94 | size: 24; | ||
| 95 | // Style | ||
| 96 | color: hifi.colors.white; | ||
| 97 | elide: Text.ElideRight; | ||
| 98 | // Anchors | ||
| 99 | anchors.top: parent.top; | ||
| 100 | anchors.left: parent.left; | ||
| 101 | anchors.leftMargin: 20; | ||
| 102 | anchors.right: parent.right; | ||
| 103 | anchors.rightMargin: 20; | ||
| 104 | height: 60; | ||
| 105 | } | ||
| 106 | |||
| 107 | Item { | ||
| 108 | id: pleaseLogInContainer; | ||
| 109 | visible: Account.username === "Unknown user"; | ||
| 110 | anchors.top: usernameText.bottom; | ||
| 111 | anchors.left: parent.left; | ||
| 112 | anchors.right: parent.right; | ||
| 113 | anchors.bottom: parent.bottom; | ||
| 114 | |||
| 115 | HifiStylesUit.RalewayRegular { | ||
| 116 | text: "Please log in for security settings." | ||
| 117 | // Text size | ||
| 118 | size: 24; | ||
| 119 | // Style | ||
| 120 | color: hifi.colors.white; | ||
| 121 | // Anchors | ||
| 122 | anchors.bottom: openLoginButton.top; | ||
| 123 | anchors.left: parent.left; | ||
| 124 | anchors.right: parent.right; | ||
| 125 | horizontalAlignment: Text.AlignHCenter; | ||
| 126 | verticalAlignment: Text.AlignVCenter; | ||
| 127 | height: 60; | ||
| 128 | } | ||
| 129 | |||
| 130 | HifiControlsUit.Button { | ||
| 131 | id: openLoginButton; | ||
| 132 | color: hifi.buttons.white; | ||
| 133 | colorScheme: hifi.colorSchemes.dark; | ||
| 134 | anchors.centerIn: parent; | ||
| 135 | width: 140; | ||
| 136 | height: 40; | ||
| 137 | text: "Log In"; | ||
| 138 | onClicked: { | ||
| 139 | DialogsManager.showLoginDialog(); | ||
| 140 | } | ||
| 141 | } | ||
| 142 | } | ||
| 143 | |||
| 144 | Item { | ||
| 145 | id: securitySettingsContainer; | ||
| 146 | visible: !pleaseLogInContainer.visible; | ||
| 147 | anchors.top: usernameText.bottom; | ||
| 148 | anchors.left: parent.left; | ||
| 149 | anchors.right: parent.right; | ||
| 150 | anchors.bottom: parent.bottom; | ||
| 151 | |||
| 152 | Item { | ||
| 153 | id: accountContainer; | ||
| 154 | anchors.top: securitySettingsContainer.top; | ||
| 155 | anchors.left: parent.left; | ||
| 156 | anchors.right: parent.right; | ||
| 157 | height: childrenRect.height; | ||
| 158 | |||
| 159 | Rectangle { | ||
| 160 | id: accountHeaderContainer; | ||
| 161 | anchors.top: parent.top; | ||
| 162 | anchors.left: parent.left; | ||
| 163 | anchors.right: parent.right; | ||
| 164 | height: 55; | ||
| 165 | color: hifi.colors.baseGrayHighlight; | ||
| 166 | |||
| 167 | HifiStylesUit.RalewaySemiBold { | ||
| 168 | text: "Account"; | ||
| 169 | anchors.fill: parent; | ||
| 170 | anchors.leftMargin: 20; | ||
| 171 | color: hifi.colors.white; | ||
| 172 | size: 18; | ||
| 173 | } | ||
| 174 | } | ||
| 175 | |||
| 176 | Item { | ||
| 177 | id: keepMeLoggedInContainer; | ||
| 178 | anchors.top: accountHeaderContainer.bottom; | ||
| 179 | anchors.left: parent.left; | ||
| 180 | anchors.right: parent.right; | ||
| 181 | height: 80; | ||
| 182 | |||
| 183 | HifiControlsUit.CheckBox { | ||
| 184 | id: autoLogoutCheckbox; | ||
| 185 | checked: Settings.getValue("keepMeLoggedIn", false); | ||
| 186 | text: "Keep Me Logged In" | ||
| 187 | // Anchors | ||
| 188 | anchors.verticalCenter: parent.verticalCenter; | ||
| 189 | anchors.left: parent.left; | ||
| 190 | anchors.leftMargin: 20; | ||
| 191 | boxSize: 24; | ||
| 192 | labelFontSize: 18; | ||
| 193 | colorScheme: hifi.colorSchemes.dark | ||
| 194 | color: hifi.colors.white; | ||
| 195 | width: 240; | ||
| 196 | onCheckedChanged: { | ||
| 197 | Settings.setValue("keepMeLoggedIn", checked); | ||
| 198 | if (checked) { | ||
| 199 | Settings.setValue("keepMeLoggedIn/savedUsername", Account.username); | ||
| 200 | } else { | ||
| 201 | Settings.setValue("keepMeLoggedIn/savedUsername", ""); | ||
| 202 | } | ||
| 203 | } | ||
| 204 | } | ||
| 205 | |||
| 206 | HifiStylesUit.RalewaySemiBold { | ||
| 207 | id: autoLogoutHelp; | ||
| 208 | text: '[?]'; | ||
| 209 | // Anchors | ||
| 210 | anchors.verticalCenter: parent.verticalCenter; | ||
| 211 | anchors.right: autoLogoutCheckbox.right; | ||
| 212 | width: 30; | ||
| 213 | height: 30; | ||
| 214 | // Text size | ||
| 215 | size: 18; | ||
| 216 | // Style | ||
| 217 | color: hifi.colors.blueHighlight; | ||
| 218 | |||
| 219 | MouseArea { | ||
| 220 | anchors.fill: parent; | ||
| 221 | hoverEnabled: true; | ||
| 222 | onEntered: { | ||
| 223 | parent.color = hifi.colors.blueAccent; | ||
| 224 | } | ||
| 225 | onExited: { | ||
| 226 | parent.color = hifi.colors.blueHighlight; | ||
| 227 | } | ||
| 228 | onClicked: { | ||
| 229 | lightboxPopup.titleText = "Keep Me Logged In"; | ||
| 230 | lightboxPopup.bodyText = "If you choose to stay logged in, ensure that this is a trusted device.\n\n" + | ||
| 231 | "Also, remember that logging out may not disconnect you from a domain."; | ||
| 232 | lightboxPopup.button1text = "OK"; | ||
| 233 | lightboxPopup.button1method = function() { | ||
| 234 | lightboxPopup.visible = false; | ||
| 235 | } | ||
| 236 | lightboxPopup.visible = true; | ||
| 237 | } | ||
| 238 | } | ||
| 239 | } | ||
| 240 | } | ||
| 241 | } | ||
| 242 | |||
| 243 | Item { | ||
| 244 | id: walletContainer; | ||
| 245 | anchors.top: accountContainer.bottom; | ||
| 246 | anchors.left: parent.left; | ||
| 247 | anchors.right: parent.right; | ||
| 248 | height: childrenRect.height; | ||
| 249 | |||
| 250 | Rectangle { | ||
| 251 | id: walletHeaderContainer; | ||
| 252 | anchors.top: parent.top; | ||
| 253 | anchors.left: parent.left; | ||
| 254 | anchors.right: parent.right; | ||
| 255 | height: 55; | ||
| 256 | color: hifi.colors.baseGrayHighlight; | ||
| 257 | |||
| 258 | HifiStylesUit.RalewaySemiBold { | ||
| 259 | text: "Wallet"; | ||
| 260 | anchors.fill: parent; | ||
| 261 | anchors.leftMargin: 20; | ||
| 262 | color: hifi.colors.white; | ||
| 263 | size: 18; | ||
| 264 | } | ||
| 265 | } | ||
| 266 | |||
| 267 | Item { | ||
| 268 | id: walletSecurityPictureContainer; | ||
| 269 | visible: root.walletSetUp; | ||
| 270 | anchors.top: walletHeaderContainer.bottom; | ||
| 271 | anchors.left: parent.left; | ||
| 272 | anchors.right: parent.right; | ||
| 273 | height: 80; | ||
| 274 | |||
| 275 | Image { | ||
| 276 | id: currentSecurityPicture; | ||
| 277 | source: ""; | ||
| 278 | visible: true; | ||
| 279 | anchors.left: parent.left; | ||
| 280 | anchors.leftMargin: 20; | ||
| 281 | anchors.verticalCenter: parent.verticalCenter; | ||
| 282 | height: 40; | ||
| 283 | width: height; | ||
| 284 | mipmap: true; | ||
| 285 | cache: false; | ||
| 286 | } | ||
| 287 | |||
| 288 | HifiStylesUit.RalewaySemiBold { | ||
| 289 | id: securityPictureText; | ||
| 290 | text: "Wallet Security Picture"; | ||
| 291 | // Anchors | ||
| 292 | anchors.top: parent.top; | ||
| 293 | anchors.bottom: parent.bottom; | ||
| 294 | anchors.left: currentSecurityPicture.right; | ||
| 295 | anchors.leftMargin: 12; | ||
| 296 | width: paintedWidth; | ||
| 297 | // Text size | ||
| 298 | size: 18; | ||
| 299 | // Style | ||
| 300 | color: hifi.colors.white; | ||
| 301 | } | ||
| 302 | |||
| 303 | // "Change Security Pic" button | ||
| 304 | HifiControlsUit.Button { | ||
| 305 | id: changeSecurityImageButton; | ||
| 306 | color: hifi.buttons.white; | ||
| 307 | colorScheme: hifi.colorSchemes.dark; | ||
| 308 | anchors.left: securityPictureText.right; | ||
| 309 | anchors.leftMargin: 12; | ||
| 310 | anchors.verticalCenter: parent.verticalCenter; | ||
| 311 | width: 140; | ||
| 312 | height: 40; | ||
| 313 | text: "Change"; | ||
| 314 | onClicked: { | ||
| 315 | securityImageChange.visible = true; | ||
| 316 | securityImageChange.initModel(); | ||
| 317 | } | ||
| 318 | } | ||
| 319 | } | ||
| 320 | |||
| 321 | Item { | ||
| 322 | id: walletNotSetUpContainer; | ||
| 323 | visible: !root.walletSetUp; | ||
| 324 | anchors.top: walletHeaderContainer.bottom; | ||
| 325 | anchors.left: parent.left; | ||
| 326 | anchors.right: parent.right; | ||
| 327 | height: 60; | ||
| 328 | |||
| 329 | HifiStylesUit.RalewayRegular { | ||
| 330 | text: "Your wallet is not set up.\n" + | ||
| 331 | "Open the ASSETS app to get started."; | ||
| 332 | // Anchors | ||
| 333 | anchors.fill: parent; | ||
| 334 | // Text size | ||
| 335 | size: 18; | ||
| 336 | // Style | ||
| 337 | color: hifi.colors.white; | ||
| 338 | horizontalAlignment: Text.AlignHCenter; | ||
| 339 | verticalAlignment: Text.AlignVCenter; | ||
| 340 | } | ||
| 341 | } | ||
| 342 | } | ||
| 343 | } | ||
| 344 | } | ||
| @@ -1,11 +1,11 @@ | |||
| 1 | // | 1 | // |
| 2 | // SecurityImageChange.qml | 2 | // SecurityImageChange.qml |
| 3 | // qml/hifi/commerce/wallet | 3 | // qml\hifi\dialogs\security |
| 4 | // | 4 | // |
| 5 | // SecurityImageChange | 5 | // Security |
| 6 | // | 6 | // |
| 7 | // Created by Zach Fox on 2017-08-18 | 7 | // Created by Zach Fox on 2018-10-31 |
| 8 | // Copyright 2017 High Fidelity, Inc. | 8 | // Copyright 2018 High Fidelity, Inc. |
| 9 | // | 9 | // |
| 10 | // Distributed under the Apache License, Version 2.0. | 10 | // Distributed under the Apache License, Version 2.0. |
| 11 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | 11 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html |
| @@ -13,16 +13,17 @@ · 1 unmodified line | |||
| 13 | 13 | ||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import "../../../styles-uit" | 16 | import stylesUit 1.0 as HifiStylesUit |
| 17 | import "../../../controls-uit" as HifiControlsUit | 17 | import controlsUit 1.0 as HifiControlsUit |
| 18 | import "../../../controls" as HifiControls | 18 | import "qrc:////qml//controls" as HifiControls |
| 19 | 19 | ||
| 20 | // references XXX from root context | 20 | // references XXX from root context |
| 21 | 21 | ||
| 22 | Item { | 22 | Rectangle { |
| 23 | HifiConstants { id: hifi; } | 23 | HifiStylesUit.HifiConstants { id: hifi; } |
| 24 | 24 | ||
| 25 | id: root; | 25 | id: root; |
| 26 | color: hifi.colors.baseGray; | ||
| 26 | property bool justSubmitted: false; | 27 | property bool justSubmitted: false; |
| 27 | 28 | ||
| 28 | Connections { | 29 | Connections { |
| @@ -33,7 +34,7 @@ Item { · 4 unmodified lines | |||
| 33 | securityImageChangePageSecurityImage.source = "image://security/securityImage"; | 34 | securityImageChangePageSecurityImage.source = "image://security/securityImage"; |
| 34 | if (exists) { // Success submitting new security image | 35 | if (exists) { // Success submitting new security image |
| 35 | if (root.justSubmitted) { | 36 | if (root.justSubmitted) { |
| 36 | sendSignalToWallet({method: "walletSecurity_changeSecurityImageSuccess"}); | 37 | sendSignalToParent({method: "walletSecurity_changeSecurityImageSuccess"}); |
| 37 | root.justSubmitted = false; | 38 | root.justSubmitted = false; |
| 38 | } | 39 | } |
| 39 | } else if (root.justSubmitted) { | 40 | } else if (root.justSubmitted) { |
| @@ -72,7 +73,7 @@ Item { · 32 unmodified lines | |||
| 72 | anchors.bottom: parent.bottom; | 73 | anchors.bottom: parent.bottom; |
| 73 | height: 22; | 74 | height: 22; |
| 74 | // Lock icon | 75 | // Lock icon |
| 75 | HiFiGlyphs { | 76 | HifiStylesUit.HiFiGlyphs { |
| 76 | id: lockIcon; | 77 | id: lockIcon; |
| 77 | text: hifi.glyphs.lock; | 78 | text: hifi.glyphs.lock; |
| 78 | anchors.bottom: parent.bottom; | 79 | anchors.bottom: parent.bottom; |
| @@ -83,8 +84,8 @@ Item { · 4 unmodified lines | |||
| 83 | verticalAlignment: Text.AlignBottom; | 84 | verticalAlignment: Text.AlignBottom; |
| 84 | color: hifi.colors.white; | 85 | color: hifi.colors.white; |
| 85 | } | 86 | } |
| 86 | // "Security image" text below pic | 87 | // "Security image" text below image |
| 87 | RalewayRegular { | 88 | HifiStylesUit.RalewayRegular { |
| 88 | id: securityImageText; | 89 | id: securityImageText; |
| 89 | text: "SECURITY PIC"; | 90 | text: "SECURITY PIC"; |
| 90 | // Text size | 91 | // Text size |
| @@ -116,9 +117,9 @@ Item { · 25 unmodified lines | |||
| 116 | anchors.bottom: parent.bottom; | 117 | anchors.bottom: parent.bottom; |
| 117 | 118 | ||
| 118 | // "Change Security Image" text | 119 | // "Change Security Image" text |
| 119 | RalewaySemiBold { | 120 | HifiStylesUit.RalewaySemiBold { |
| 120 | id: securityImageTitle; | 121 | id: securityImageTitle; |
| 121 | text: "Change Security Pic:"; | 122 | text: "Change Security Image:"; |
| 122 | // Text size | 123 | // Text size |
| 123 | size: 18; | 124 | size: 18; |
| 124 | anchors.top: parent.top; | 125 | anchors.top: parent.top; |
| @@ -139,12 +140,6 @@ Item { · 14 unmodified lines | |||
| 139 | anchors.right: parent.right; | 140 | anchors.right: parent.right; |
| 140 | anchors.rightMargin: 16; | 141 | anchors.rightMargin: 16; |
| 141 | height: 300; | 142 | height: 300; |
| 142 | |||
| 143 | Connections { | ||
| 144 | onSendSignalToWallet: { | ||
| 145 | sendSignalToWallet(msg); | ||
| 146 | } | ||
| 147 | } | ||
| 148 | } | 143 | } |
| 149 | 144 | ||
| 150 | // Navigation Bar | 145 | // Navigation Bar |
| @@ -169,7 +164,7 @@ Item { · 18 unmodified lines | |||
| 169 | width: 150; | 164 | width: 150; |
| 170 | text: "Cancel" | 165 | text: "Cancel" |
| 171 | onClicked: { | 166 | onClicked: { |
| 172 | sendSignalToWallet({method: "walletSecurity_changeSecurityImageCancelled"}); | 167 | sendSignalToParent({method: "walletSecurity_changeSecurityImageCancelled"}); |
| 173 | } | 168 | } |
| 174 | } | 169 | } |
| 175 | 170 | ||
| @@ -197,7 +192,7 @@ Item { · 21 unmodified lines | |||
| 197 | // SECURITY IMAGE SELECTION END | 192 | // SECURITY IMAGE SELECTION END |
| 198 | // | 193 | // |
| 199 | 194 | ||
| 200 | signal sendSignalToWallet(var msg); | 195 | signal sendSignalToParent(var msg); |
| 201 | 196 | ||
| 202 | function initModel() { | 197 | function initModel() { |
| 203 | securityImageSelection.initModel(); | 198 | securityImageSelection.initModel(); |
| @@ -1,11 +1,11 @@ | |||
| 1 | // | 1 | // |
| 2 | // SecurityImageModel.qml | 2 | // SecurityImageModel.qml |
| 3 | // qml/hifi/commerce | 3 | // qml\hifi\dialogs\security |
| 4 | // | 4 | // |
| 5 | // SecurityImageModel | 5 | // Security |
| 6 | // | 6 | // |
| 7 | // Created by Zach Fox on 2017-08-17 | 7 | // Created by Zach Fox on 2018-10-31 |
| 8 | // Copyright 2017 High Fidelity, Inc. | 8 | // Copyright 2018 High Fidelity, Inc. |
| 9 | // | 9 | // |
| 10 | // Distributed under the Apache License, Version 2.0. | 10 | // Distributed under the Apache License, Version 2.0. |
| 11 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | 11 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html |
| @@ -1,11 +1,11 @@ | |||
| 1 | // | 1 | // |
| 2 | // SecurityImageSelection.qml | 2 | // SecurityImageSelection.qml |
| 3 | // qml/hifi/commerce/wallet | 3 | // qml\hifi\dialogs\security |
| 4 | // | 4 | // |
| 5 | // SecurityImageSelection | 5 | // Security |
| 6 | // | 6 | // |
| 7 | // Created by Zach Fox on 2017-08-17 | 7 | // Created by Zach Fox on 2018-10-31 |
| 8 | // Copyright 2017 High Fidelity, Inc. | 8 | // Copyright 2018 High Fidelity, Inc. |
| 9 | // | 9 | // |
| 10 | // Distributed under the Apache License, Version 2.0. | 10 | // Distributed under the Apache License, Version 2.0. |
| 11 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | 11 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html |
| @@ -13,14 +13,14 @@ · 1 unmodified line | |||
| 13 | 13 | ||
| 14 | import Hifi 1.0 as Hifi | 14 | import Hifi 1.0 as Hifi |
| 15 | import QtQuick 2.5 | 15 | import QtQuick 2.5 |
| 16 | import "../../../styles-uit" | 16 | import stylesUit 1.0 as HifiStylesUit |
| 17 | import "../../../controls-uit" as HifiControlsUit | 17 | import controlsUit 1.0 as HifiControlsUit |
| 18 | import "../../../controls" as HifiControls | 18 | import "qrc:////qml//controls" as HifiControls |
| 19 | 19 | ||
| 20 | // references XXX from root context | 20 | // references XXX from root context |
| 21 | 21 | ||
| 22 | Item { | 22 | Item { |
| 23 | HifiConstants { id: hifi; } | 23 | HifiStylesUit.HifiConstants { id: hifi; } |
| 24 | 24 | ||
| 25 | id: root; | 25 | id: root; |
| 26 | property alias currentIndex: securityImageGrid.currentIndex; | 26 | property alias currentIndex: securityImageGrid.currentIndex; |
| @@ -64,17 +64,15 @@ Item { · 37 unmodified lines | |||
| 64 | } | 64 | } |
| 65 | } | 65 | } |
| 66 | highlight: Rectangle { | 66 | highlight: Rectangle { |
| 67 | width: securityImageGrid.cellWidth; | 67 | width: securityImageGrid.cellWidth; |
| 68 | height: securityImageGrid.cellHeight; | 68 | height: securityImageGrid.cellHeight; |
| 69 | color: hifi.colors.blueHighlight; | 69 | color: hifi.colors.blueHighlight; |
| 70 | } | 70 | } |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | // | 73 | // |
| 74 | // FUNCTION DEFINITIONS START | 74 | // FUNCTION DEFINITIONS START |
| 75 | // | 75 | // |
| 76 | signal sendSignalToWallet(var msg); | ||
| 77 | |||
| 78 | function getImagePathFromImageID(imageID) { | 76 | function getImagePathFromImageID(imageID) { |
| 79 | return (imageID ? gridModel.getImagePathFromImageID(imageID) : ""); | 77 | return (imageID ? gridModel.getImagePathFromImageID(imageID) : ""); |
| 80 | } | 78 | } |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
| @@ -10,9 +10,9 @@ · 9 unmodified lines | |||
| 10 | import QtQuick 2.5 | 10 | import QtQuick 2.5 |
| 11 | import QtGraphicalEffects 1.0 | 11 | import QtGraphicalEffects 1.0 |
| 12 | 12 | ||
| 13 | import "../../styles-uit" | 13 | import stylesUit 1.0 |
| 14 | import "../../controls" | 14 | import "../../controls" |
| 15 | import "../../controls-uit" as HifiControls | 15 | import controlsUit 1.0 as HifiControls |
| 16 | 16 | ||
| 17 | 17 | ||
| 18 | Rectangle { | 18 | Rectangle { |
| @@ -11,9 +11,9 @@ import QtQuick.Controls 2.2 · 10 unmodified lines | |||
| 11 | import QtQuick.Layouts 1.3 | 11 | import QtQuick.Layouts 1.3 |
| 12 | import QtGraphicalEffects 1.0 | 12 | import QtGraphicalEffects 1.0 |
| 13 | import Qt.labs.settings 1.0 | 13 | import Qt.labs.settings 1.0 |
| 14 | import "../../styles-uit" | 14 | import stylesUit 1.0 |
| 15 | import "../../controls" | 15 | import "../../controls" |
| 16 | import "../../controls-uit" as HifiControls | 16 | import controlsUit 1.0 as HifiControls |
| 17 | import "../../dialogs" | 17 | import "../../dialogs" |
| 18 | import "../../dialogs/preferences" | 18 | import "../../dialogs/preferences" |
| 19 | import "tabletWindows" | 19 | import "tabletWindows" |
| @@ -49,5 +49,11 @@ StackView { · 48 unmodified lines | |||
| 49 | if (currentItem && currentItem.fromScript) | 49 | if (currentItem && currentItem.fromScript) |
| 50 | currentItem.fromScript(message); | 50 | currentItem.fromScript(message); |
| 51 | } | 51 | } |
| 52 | |||
| 53 | Component.onDestruction: { | ||
| 54 | if (KeyboardScriptingInterface.raised) { | ||
| 55 | KeyboardScriptingInterface.raised = false; | ||
| 56 | } | ||
| 57 | } | ||
| 52 | } | 58 | } |
| 53 | 59 | ||
| @@ -4,8 +4,8 @@ import QtWebChannel 1.0 · 3 unmodified lines | |||
| 4 | import "../../controls" | 4 | import "../../controls" |
| 5 | import "../toolbars" | 5 | import "../toolbars" |
| 6 | import QtGraphicalEffects 1.0 | 6 | import QtGraphicalEffects 1.0 |
| 7 | import "../../controls-uit" as HifiControls | 7 | import controlsUit 1.0 as HifiControls |
| 8 | import "../../styles-uit" | 8 | import stylesUit 1.0 |
| 9 | 9 | ||
| 10 | 10 | ||
| 11 | WebView { | 11 | WebView { |
| @@ -11,8 +11,8 @@ · 10 unmodified lines | |||
| 11 | 11 | ||
| 12 | import QtQuick 2.7 | 12 | import QtQuick 2.7 |
| 13 | import QtQuick.Controls 2.2 | 13 | import QtQuick.Controls 2.2 |
| 14 | import "../../controls-uit" as HifiControls | 14 | import controlsUit 1.0 as HifiControls |
| 15 | import "../../styles-uit" | 15 | import stylesUit 1.0 |
| 16 | 16 | ||
| 17 | TabButton { | 17 | TabButton { |
| 18 | id: control | 18 | id: control |
| @@ -4,8 +4,8 @@ import QtWebChannel 1.0 · 3 unmodified lines | |||
| 4 | import "../../controls" | 4 | import "../../controls" |
| 5 | import "../toolbars" | 5 | import "../toolbars" |
| 6 | import QtGraphicalEffects 1.0 | 6 | import QtGraphicalEffects 1.0 |
| 7 | import "../../controls-uit" as HifiControls | 7 | import controlsUit 1.0 as HifiControls |
| 8 | import "../../styles-uit" | 8 | import stylesUit 1.0 |
| 9 | 9 | ||
| 10 | TabBar { | 10 | TabBar { |
| 11 | id: editTabView | 11 | id: editTabView |
| @@ -175,7 +175,7 @@ TabBar { · 163 unmodified lines | |||
| 175 | method: "newEntityButtonClicked", | 175 | method: "newEntityButtonClicked", |
| 176 | params: { buttonName: "newParticleButton" } | 176 | params: { buttonName: "newParticleButton" } |
| 177 | }); | 177 | }); |
| 178 | editTabView.currentIndex = 4 | 178 | editTabView.currentIndex = 2 |
| 179 | } | 179 | } |
| 180 | } | 180 | } |
| 181 | 181 | ||
| @@ -279,21 +279,6 @@ TabBar { · 97 unmodified lines | |||
| 279 | } | 279 | } |
| 280 | } | 280 | } |
| 281 | 281 | ||
| 282 | EditTabButton { | ||
| 283 | title: "P" | ||
| 284 | active: true | ||
| 285 | enabled: true | ||
| 286 | property string originalUrl: "" | ||
| 287 | |||
| 288 | property Component visualItem: Component { | ||
| 289 | WebView { | ||
| 290 | id: particleExplorerWebView | ||
| 291 | url: Paths.defaultScripts + "/system/particle_explorer/particleExplorer.html" | ||
| 292 | enabled: true | ||
| 293 | } | ||
| 294 | } | ||
| 295 | } | ||
| 296 | |||
| 297 | function fromScript(message) { | 282 | function fromScript(message) { |
| 298 | switch (message.method) { | 283 | switch (message.method) { |
| 299 | case 'selectTab': | 284 | case 'selectTab': |
| @@ -326,9 +311,6 @@ TabBar { · 26 unmodified lines | |||
| 326 | case 'grid': | 311 | case 'grid': |
| 327 | editTabView.currentIndex = 3; | 312 | editTabView.currentIndex = 3; |
| 328 | break; | 313 | break; |
| 329 | case 'particle': | ||
| 330 | editTabView.currentIndex = 4; | ||
| 331 | break; | ||
| 332 | default: | 314 | default: |
| 333 | console.warn('Attempt to switch to invalid tab:', id); | 315 | console.warn('Attempt to switch to invalid tab:', id); |
| 334 | } | 316 | } |
| @@ -4,8 +4,8 @@ import QtWebChannel 1.0 · 3 unmodified lines | |||
| 4 | import "../../controls" | 4 | import "../../controls" |
| 5 | import "../toolbars" | 5 | import "../toolbars" |
| 6 | import QtGraphicalEffects 1.0 | 6 | import QtGraphicalEffects 1.0 |
| 7 | import "../../controls-uit" as HifiControls | 7 | import controlsUit 1.0 as HifiControls |
| 8 | import "../../styles-uit" | 8 | import stylesUit 1.0 |
| 9 | 9 | ||
| 10 | TabBar { | 10 | TabBar { |
| 11 | id: editTabView | 11 | id: editTabView |
| @@ -18,7 +18,6 @@ TabBar { · 6 unmodified lines | |||
| 18 | readonly property int create: 0 | 18 | readonly property int create: 0 |
| 19 | readonly property int properties: 1 | 19 | readonly property int properties: 1 |
| 20 | readonly property int grid: 2 | 20 | readonly property int grid: 2 |
| 21 | readonly property int particle: 3 | ||
| 22 | } | 21 | } |
| 23 | 22 | ||
| 24 | readonly property HifiConstants hifi: HifiConstants {} | 23 | readonly property HifiConstants hifi: HifiConstants {} |
| @@ -182,7 +181,7 @@ TabBar { · 157 unmodified lines | |||
| 182 | method: "newEntityButtonClicked", | 181 | method: "newEntityButtonClicked", |
| 183 | params: { buttonName: "newParticleButton" } | 182 | params: { buttonName: "newParticleButton" } |
| 184 | }); | 183 | }); |
| 185 | editTabView.currentIndex = tabIndex.particle | 184 | editTabView.currentIndex = tabIndex.properties |
| 186 | } | 185 | } |
| 187 | } | 186 | } |
| 188 | 187 | ||
| @@ -271,21 +270,6 @@ TabBar { · 82 unmodified lines | |||
| 271 | } | 270 | } |
| 272 | } | 271 | } |
| 273 | 272 | ||
| 274 | EditTabButton { | ||
| 275 | title: "P" | ||
| 276 | active: true | ||
| 277 | enabled: true | ||
| 278 | property string originalUrl: "" | ||
| 279 | |||
| 280 | property Component visualItem: Component { | ||
| 281 | WebView { | ||
| 282 | id: particleExplorerWebView | ||
| 283 | url: Paths.defaultScripts + "/system/particle_explorer/particleExplorer.html" | ||
| 284 | enabled: true | ||
| 285 | } | ||
| 286 | } | ||
| 287 | } | ||
| 288 | |||
| 289 | function fromScript(message) { | 273 | function fromScript(message) { |
| 290 | switch (message.method) { | 274 | switch (message.method) { |
| 291 | case 'selectTab': | 275 | case 'selectTab': |
| @@ -299,7 +283,7 @@ TabBar { · 7 unmodified lines | |||
| 299 | // Changes the current tab based on tab index or title as input | 283 | // Changes the current tab based on tab index or title as input |
| 300 | function selectTab(id) { | 284 | function selectTab(id) { |
| 301 | if (typeof id === 'number') { | 285 | if (typeof id === 'number') { |
| 302 | if (id >= tabIndex.create && id <= tabIndex.particle) { | 286 | if (id >= tabIndex.create && id <= tabIndex.grid) { |
| 303 | editTabView.currentIndex = id; | 287 | editTabView.currentIndex = id; |
| 304 | } else { | 288 | } else { |
| 305 | console.warn('Attempt to switch to invalid tab:', id); | 289 | console.warn('Attempt to switch to invalid tab:', id); |
| @@ -315,9 +299,6 @@ TabBar { · 9 unmodified lines | |||
| 315 | case 'grid': | 299 | case 'grid': |
| 316 | editTabView.currentIndex = tabIndex.grid; | 300 | editTabView.currentIndex = tabIndex.grid; |
| 317 | break; | 301 | break; |
| 318 | case 'particle': | ||
| 319 | editTabView.currentIndex = tabIndex.particle; | ||
| 320 | break; | ||
| 321 | default: | 302 | default: |
| 322 | console.warn('Attempt to switch to invalid tab:', id); | 303 | console.warn('Attempt to switch to invalid tab:', id); |
| 323 | } | 304 | } |
| @@ -9,8 +9,8 @@ · 8 unmodified lines | |||
| 9 | import QtQuick 2.5 | 9 | import QtQuick 2.5 |
| 10 | import Hifi 1.0 | 10 | import Hifi 1.0 |
| 11 | 11 | ||
| 12 | import "../../styles-uit" | 12 | import stylesUit 1.0 |
| 13 | import "../../controls-uit" as HifiControls | 13 | import controlsUit 1.0 as HifiControls |
| 14 | import "../../windows" | 14 | import "../../windows" |
| 15 | import "../../dialogs" | 15 | import "../../dialogs" |
| 16 | 16 | ||
| @@ -13,8 +13,8 @@ import QtQuick 2.7 · 12 unmodified lines | |||
| 13 | import QtQuick.Controls 2.2 | 13 | import QtQuick.Controls 2.2 |
| 14 | import QtQuick.Dialogs 1.2 as OriginalDialogs | 14 | import QtQuick.Dialogs 1.2 as OriginalDialogs |
| 15 | 15 | ||
| 16 | import "../../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "../../controls-uit" | 17 | import controlsUit 1.0 |
| 18 | import "../dialogs" | 18 | import "../dialogs" |
| 19 | 19 | ||
| 20 | Rectangle { | 20 | Rectangle { |
| @@ -12,8 +12,8 @@ · 11 unmodified lines | |||
| 12 | import QtQuick 2.5 | 12 | import QtQuick 2.5 |
| 13 | import QtQuick.Dialogs 1.2 as OriginalDialogs | 13 | import QtQuick.Dialogs 1.2 as OriginalDialogs |
| 14 | 14 | ||
| 15 | import "../../styles-uit" | 15 | import stylesUit 1.0 |
| 16 | import "../../controls-uit" | 16 | import controlsUit 1.0 |
| 17 | import "../dialogs" | 17 | import "../dialogs" |
| 18 | 18 | ||
| 19 | Rectangle { | 19 | Rectangle { |
| @@ -9,9 +9,9 @@ · 8 unmodified lines | |||
| 9 | import QtQuick 2.5 | 9 | import QtQuick 2.5 |
| 10 | import QtGraphicalEffects 1.0 | 10 | import QtGraphicalEffects 1.0 |
| 11 | 11 | ||
| 12 | import "../../styles-uit" | 12 | import stylesUit 1.0 |
| 13 | import "../../controls" | 13 | import "../../controls" |
| 14 | import "../../controls-uit" as HifiControls | 14 | import controlsUit 1.0 as HifiControls |
| 15 | import "." | 15 | import "." |
| 16 | 16 | ||
| 17 | 17 | ||
| @@ -822,11 +822,44 @@ Flickable { · 804 unmodified lines | |||
| 822 | } | 822 | } |
| 823 | } | 823 | } |
| 824 | 824 | ||
| 825 | Row { | ||
| 826 | id: outOfRangeDataStrategyRow | ||
| 827 | anchors.top: viveInDesktop.bottom | ||
| 828 | anchors.topMargin: 5 | ||
| 829 | anchors.left: openVrConfiguration.left | ||
| 830 | anchors.leftMargin: leftMargin + 10 | ||
| 831 | spacing: 15 | ||
| 832 | |||
| 833 | RalewayRegular { | ||
| 834 | id: outOfRangeDataStrategyLabel | ||
| 835 | size: 12 | ||
| 836 | text: "Out Of Range Data Strategy:" | ||
| 837 | color: hifi.colors.lightGrayText | ||
| 838 | topPadding: 5 | ||
| 839 | } | ||
| 840 | |||
| 841 | HifiControls.ComboBox { | ||
| 842 | id: outOfRangeDataStrategyComboBox | ||
| 843 | |||
| 844 | height: 25 | ||
| 845 | width: 100 | ||
| 846 | |||
| 847 | editable: true | ||
| 848 | colorScheme: hifi.colorSchemes.dark | ||
| 849 | model: ["None", "Freeze", "Drop"] | ||
| 850 | label: "" | ||
| 851 | |||
| 852 | onCurrentIndexChanged: { | ||
| 853 | sendConfigurationSettings(); | ||
| 854 | } | ||
| 855 | } | ||
| 856 | } | ||
| 857 | |||
| 825 | RalewayBold { | 858 | RalewayBold { |
| 826 | id: viveDesktopText | 859 | id: viveDesktopText |
| 827 | size: 10 | 860 | size: 12 |
| 828 | text: "Use " + stack.selectedPlugin + " devices in desktop mode" | 861 | text: "Use " + stack.selectedPlugin + " devices in desktop mode" |
| 829 | color: hifi.colors.white | 862 | color: hifi.colors.lightGrayText |
| 830 | 863 | ||
| 831 | anchors { | 864 | anchors { |
| 832 | left: viveInDesktop.right | 865 | left: viveInDesktop.right |
| @@ -946,6 +979,7 @@ Flickable { · 113 unmodified lines | |||
| 946 | 979 | ||
| 947 | viveInDesktop.checked = desktopMode; | 980 | viveInDesktop.checked = desktopMode; |
| 948 | hmdInDesktop.checked = hmdDesktopPosition; | 981 | hmdInDesktop.checked = hmdDesktopPosition; |
| 982 | outOfRangeDataStrategyComboBox.currentIndex = outOfRangeDataStrategyComboBox.model.indexOf(settings.outOfRangeDataStrategy); | ||
| 949 | 983 | ||
| 950 | initializeButtonState(); | 984 | initializeButtonState(); |
| 951 | updateCalibrationText(); | 985 | updateCalibrationText(); |
| @@ -1107,7 +1141,8 @@ Flickable { · 155 unmodified lines | |||
| 1107 | "armCircumference": armCircumference.realValue, | 1141 | "armCircumference": armCircumference.realValue, |
| 1108 | "shoulderWidth": shoulderWidth.realValue, | 1142 | "shoulderWidth": shoulderWidth.realValue, |
| 1109 | "desktopMode": viveInDesktop.checked, | 1143 | "desktopMode": viveInDesktop.checked, |
| 1110 | "hmdDesktopTracking": hmdInDesktop.checked | 1144 | "hmdDesktopTracking": hmdInDesktop.checked, |
| 1145 | "outOfRangeDataStrategy": outOfRangeDataStrategyComboBox.model[outOfRangeDataStrategyComboBox.currentIndex] | ||
| 1111 | } | 1146 | } |
| 1112 | 1147 | ||
| 1113 | return settingsObject; | 1148 | return settingsObject; |
| @@ -18,8 +18,8 @@ import "../../styles" · 17 unmodified lines | |||
| 18 | import "../../windows" | 18 | import "../../windows" |
| 19 | import "../" | 19 | import "../" |
| 20 | import "../toolbars" | 20 | import "../toolbars" |
| 21 | import "../../styles-uit" as HifiStyles | 21 | import stylesUit 1.0 as HifiStyles |
| 22 | import "../../controls-uit" as HifiControls | 22 | import controlsUit 1.0 as HifiControls |
| 23 | import QtQuick.Controls 2.2 as QQC2 | 23 | import QtQuick.Controls 2.2 as QQC2 |
| 24 | import QtQuick.Templates 2.2 as T | 24 | import QtQuick.Templates 2.2 as T |
| 25 | 25 | ||
| @@ -56,10 +56,13 @@ StackView { · 30 unmodified lines | |||
| 56 | Qt.callLater(function() { | 56 | Qt.callLater(function() { |
| 57 | addressBarDialog.keyboardEnabled = HMD.active; | 57 | addressBarDialog.keyboardEnabled = HMD.active; |
| 58 | addressLine.forceActiveFocus(); | 58 | addressLine.forceActiveFocus(); |
| 59 | addressBarDialog.raised = true; | ||
| 59 | }) | 60 | }) |
| 60 | } | 61 | } |
| 62 | |||
| 61 | Component.onDestruction: { | 63 | Component.onDestruction: { |
| 62 | root.parentChanged.disconnect(center); | 64 | root.parentChanged.disconnect(center); |
| 65 | keyboard.raised = false; | ||
| 63 | } | 66 | } |
| 64 | 67 | ||
| 65 | function center() { | 68 | function center() { |
| @@ -218,6 +221,11 @@ StackView { · 152 unmodified lines | |||
| 218 | leftMargin: 8; | 221 | leftMargin: 8; |
| 219 | verticalCenter: addressLineContainer.verticalCenter; | 222 | verticalCenter: addressLineContainer.verticalCenter; |
| 220 | } | 223 | } |
| 224 | |||
| 225 | onFocusChanged: { | ||
| 226 | addressBarDialog.raised = focus; | ||
| 227 | } | ||
| 228 | |||
| 221 | onTextChanged: { | 229 | onTextChanged: { |
| 222 | updateLocationText(text.length > 0); | 230 | updateLocationText(text.length > 0); |
| 223 | } | 231 | } |
| @@ -6,7 +6,7 @@ import QtQuick.Layouts 1.3 · 5 unmodified lines | |||
| 6 | import TabletScriptingInterface 1.0 | 6 | import TabletScriptingInterface 1.0 |
| 7 | 7 | ||
| 8 | import "." | 8 | import "." |
| 9 | import "../../styles-uit" | 9 | import stylesUit 1.0 |
| 10 | import "../audio" as HifiAudio | 10 | import "../audio" as HifiAudio |
| 11 | 11 | ||
| 12 | Item { | 12 | Item { |
| @@ -7,7 +7,7 @@ import QtWebEngine 1.1 · 6 unmodified lines | |||
| 7 | 7 | ||
| 8 | 8 | ||
| 9 | import "." | 9 | import "." |
| 10 | import "../../styles-uit" | 10 | import stylesUit 1.0 |
| 11 | import "../../controls" | 11 | import "../../controls" |
| 12 | 12 | ||
| 13 | FocusScope { | 13 | FocusScope { |
| @@ -11,8 +11,8 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import QtQuick.Controls 1.4 | 12 | import QtQuick.Controls 1.4 |
| 13 | 13 | ||
| 14 | import "../../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | import "../../styles-uit" | 15 | import stylesUit 1.0 |
| 16 | 16 | ||
| 17 | Item { | 17 | Item { |
| 18 | id: root | 18 | id: root |
| @@ -11,7 +11,7 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | import TabletScriptingInterface 1.0 | 12 | import TabletScriptingInterface 1.0 |
| 13 | 13 | ||
| 14 | import "../../styles-uit" | 14 | import stylesUit 1.0 |
| 15 | import "." | 15 | import "." |
| 16 | 16 | ||
| 17 | FocusScope { | 17 | FocusScope { |
| @@ -10,8 +10,8 @@ · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../../controls-uit" as HifiControls | 13 | import controlsUit 1.0 as HifiControls |
| 14 | import "../../styles-uit" | 14 | import stylesUit 1.0 |
| 15 | import "../dialogs/content" | 15 | import "../dialogs/content" |
| 16 | 16 | ||
| 17 | Item { | 17 | Item { |
| @@ -129,8 +129,21 @@ Windows.ScrollingWindow { · 128 unmodified lines | |||
| 129 | 129 | ||
| 130 | height: pane.scrollHeight | 130 | height: pane.scrollHeight |
| 131 | width: pane.contentWidth | 131 | width: pane.contentWidth |
| 132 | anchors.left: parent.left | 132 | |
| 133 | anchors.top: parent.top | 133 | // this might be looking not clear from the first look |
| 134 | // but loader.parent is not tabletRoot and it can be null! | ||
| 135 | // unfortunately we can't use conditional bindings here due to https://bugreports.qt.io/browse/QTBUG-22005 | ||
| 136 | |||
| 137 | onParentChanged: { | ||
| 138 | if (parent) { | ||
| 139 | anchors.left = Qt.binding(function() { return parent.left }) | ||
| 140 | anchors.top = Qt.binding(function() { return parent.top }) | ||
| 141 | } else { | ||
| 142 | anchors.left = undefined | ||
| 143 | anchors.top = undefined | ||
| 144 | } | ||
| 145 | } | ||
| 146 | |||
| 134 | signal loaded; | 147 | signal loaded; |
| 135 | 148 | ||
| 136 | onWidthChanged: { | 149 | onWidthChanged: { |
| @@ -16,8 +16,8 @@ import QtQuick.Controls 1.4 as QQC1 · 15 unmodified lines | |||
| 16 | import QtQuick.Controls 2.3 | 16 | import QtQuick.Controls 2.3 |
| 17 | 17 | ||
| 18 | import ".." | 18 | import ".." |
| 19 | import "../../../controls-uit" | 19 | import controlsUit 1.0 |
| 20 | import "../../../styles-uit" | 20 | import stylesUit 1.0 |
| 21 | import "../../../windows" | 21 | import "../../../windows" |
| 22 | 22 | ||
| 23 | import "../../../dialogs/fileDialog" | 23 | import "../../../dialogs/fileDialog" |
| @@ -12,8 +12,8 @@ import QtQuick 2.5 · 11 unmodified lines | |||
| 12 | 12 | ||
| 13 | import "." | 13 | import "." |
| 14 | import "./preferences" | 14 | import "./preferences" |
| 15 | import "../../../styles-uit" | 15 | import stylesUit 1.0 |
| 16 | import "../../../controls-uit" as HifiControls | 16 | import controlsUit 1.0 as HifiControls |
| 17 | 17 | ||
| 18 | Item { | 18 | Item { |
| 19 | id: dialog | 19 | id: dialog |
| @@ -242,6 +242,10 @@ Item { · 222 unmodified lines | |||
| 242 | keyboardEnabled = HMD.active; | 242 | keyboardEnabled = HMD.active; |
| 243 | } | 243 | } |
| 244 | 244 | ||
| 245 | Component.onDestruction: { | ||
| 246 | keyboard.raised = false; | ||
| 247 | } | ||
| 248 | |||
| 245 | onKeyboardRaisedChanged: { | 249 | onKeyboardRaisedChanged: { |
| 246 | if (keyboardEnabled && keyboardRaised) { | 250 | if (keyboardEnabled && keyboardRaised) { |
| 247 | var delta = mouseArea.mouseY - (dialog.height - footer.height - keyboard.raisedHeight -hifi.dimensions.controlLineHeight); | 251 | var delta = mouseArea.mouseY - (dialog.height - footer.height - keyboard.raisedHeight -hifi.dimensions.controlLineHeight); |
| @@ -12,8 +12,8 @@ import QtQuick 2.5 · 11 unmodified lines | |||
| 12 | import Hifi 1.0 | 12 | import Hifi 1.0 |
| 13 | 13 | ||
| 14 | import "../../../../dialogs/preferences" | 14 | import "../../../../dialogs/preferences" |
| 15 | import "../../../../controls-uit" as HiFiControls | 15 | import controlsUit 1.0 as HiFiControls |
| 16 | import "../../../../styles-uit" | 16 | import stylesUit 1.0 |
| 17 | import "." | 17 | import "." |
| 18 | 18 | ||
| 19 | Preference { | 19 | Preference { |
| @@ -11,7 +11,7 @@ · 10 unmodified lines | |||
| 11 | import QtQuick 2.5 | 11 | import QtQuick 2.5 |
| 12 | 12 | ||
| 13 | import "../../../../dialogs" | 13 | import "../../../../dialogs" |
| 14 | import "../../../../controls-uit" | 14 | import controlsUit 1.0 |
| 15 | import "../" | 15 | import "../" |
| 16 | 16 | ||
| 17 | Preference { | 17 | Preference { |
| @@ -0,0 +1,314 @@ | |||
| 1 | // | ||
| 2 | // TTS.qml | ||
| 3 | // | ||
| 4 | // TTS App | ||
| 5 | // | ||
| 6 | // Created by Zach Fox on 2018-10-10 | ||
| 7 | // Copyright 2018 High Fidelity, Inc. | ||
| 8 | // | ||
| 9 | // Distributed under the Apache License, Version 2.0. | ||
| 10 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | ||
| 11 | // | ||
| 12 | |||
| 13 | import Hifi 1.0 as Hifi | ||
| 14 | import QtQuick 2.10 | ||
| 15 | import QtQuick.Controls 2.3 | ||
| 16 | import "qrc:////qml//styles-uit" as HifiStylesUit | ||
| 17 | import "qrc:////qml//controls-uit" as HifiControlsUit | ||
| 18 | import "qrc:////qml//controls" as HifiControls | ||
| 19 | |||
| 20 | Rectangle { | ||
| 21 | HifiStylesUit.HifiConstants { id: hifi; } | ||
| 22 | |||
| 23 | id: root; | ||
| 24 | // Style | ||
| 25 | color: hifi.colors.darkGray; | ||
| 26 | property bool keyboardRaised: false; | ||
| 27 | |||
| 28 | // | ||
| 29 | // TITLE BAR START | ||
| 30 | // | ||
| 31 | Item { | ||
| 32 | id: titleBarContainer; | ||
| 33 | // Size | ||
| 34 | width: root.width; | ||
| 35 | height: 50; | ||
| 36 | // Anchors | ||
| 37 | anchors.left: parent.left; | ||
| 38 | anchors.top: parent.top; | ||
| 39 | |||
| 40 | // Title bar text | ||
| 41 | HifiStylesUit.RalewaySemiBold { | ||
| 42 | id: titleBarText; | ||
| 43 | text: "Text-to-Speech"; | ||
| 44 | // Text size | ||
| 45 | size: hifi.fontSizes.overlayTitle; | ||
| 46 | // Anchors | ||
| 47 | anchors.top: parent.top; | ||
| 48 | anchors.bottom: parent.bottom; | ||
| 49 | anchors.left: parent.left; | ||
| 50 | anchors.leftMargin: 16; | ||
| 51 | width: paintedWidth; | ||
| 52 | // Style | ||
| 53 | color: hifi.colors.lightGrayText; | ||
| 54 | // Alignment | ||
| 55 | horizontalAlignment: Text.AlignHLeft; | ||
| 56 | verticalAlignment: Text.AlignVCenter; | ||
| 57 | } | ||
| 58 | |||
| 59 | // Separator | ||
| 60 | HifiControlsUit.Separator { | ||
| 61 | anchors.left: parent.left; | ||
| 62 | anchors.right: parent.right; | ||
| 63 | anchors.bottom: parent.bottom; | ||
| 64 | } | ||
| 65 | } | ||
| 66 | // | ||
| 67 | // TITLE BAR END | ||
| 68 | // | ||
| 69 | |||
| 70 | |||
| 71 | Item { | ||
| 72 | id: tagButtonContainer; | ||
| 73 | anchors.top: titleBarContainer.bottom; | ||
| 74 | anchors.topMargin: 2; | ||
| 75 | anchors.left: parent.left; | ||
| 76 | anchors.right: parent.right; | ||
| 77 | height: 70; | ||
| 78 | |||
| 79 | HifiStylesUit.RalewaySemiBold { | ||
| 80 | id: tagButtonTitle; | ||
| 81 | text: "Insert Tag:"; | ||
| 82 | // Text size | ||
| 83 | size: 18; | ||
| 84 | // Anchors | ||
| 85 | anchors.top: parent.top; | ||
| 86 | anchors.left: parent.left; | ||
| 87 | anchors.right: parent.right; | ||
| 88 | height: 35; | ||
| 89 | // Style | ||
| 90 | color: hifi.colors.lightGrayText; | ||
| 91 | // Alignment | ||
| 92 | horizontalAlignment: Text.AlignHCenter; | ||
| 93 | verticalAlignment: Text.AlignVCenter; | ||
| 94 | } | ||
| 95 | |||
| 96 | HifiControlsUit.Button { | ||
| 97 | id: pitch10Button; | ||
| 98 | focusPolicy: Qt.NoFocus; | ||
| 99 | color: hifi.buttons.none; | ||
| 100 | colorScheme: hifi.colorSchemes.dark; | ||
| 101 | anchors.top: tagButtonTitle.bottom; | ||
| 102 | anchors.left: parent.left; | ||
| 103 | anchors.leftMargin: 3; | ||
| 104 | width: parent.width/6 - 6; | ||
| 105 | height: 30; | ||
| 106 | text: "Pitch 10"; | ||
| 107 | onClicked: { | ||
| 108 | messageToSpeak.insert(messageToSpeak.cursorPosition, "<pitch absmiddle='10'/>"); | ||
| 109 | } | ||
| 110 | } | ||
| 111 | |||
| 112 | HifiControlsUit.Button { | ||
| 113 | id: pitch0Button; | ||
| 114 | focusPolicy: Qt.NoFocus; | ||
| 115 | color: hifi.buttons.none; | ||
| 116 | colorScheme: hifi.colorSchemes.dark; | ||
| 117 | anchors.top: tagButtonTitle.bottom; | ||
| 118 | anchors.left: pitch10Button.right; | ||
| 119 | anchors.leftMargin: 6; | ||
| 120 | width: parent.width/6 - anchors.leftMargin; | ||
| 121 | height: 30; | ||
| 122 | text: "Pitch 0"; | ||
| 123 | onClicked: { | ||
| 124 | messageToSpeak.insert(messageToSpeak.cursorPosition, "<pitch absmiddle='0'/>"); | ||
| 125 | } | ||
| 126 | } | ||
| 127 | |||
| 128 | HifiControlsUit.Button { | ||
| 129 | id: pitchNeg10Button; | ||
| 130 | focusPolicy: Qt.NoFocus; | ||
| 131 | color: hifi.buttons.none; | ||
| 132 | colorScheme: hifi.colorSchemes.dark; | ||
| 133 | anchors.top: tagButtonTitle.bottom; | ||
| 134 | anchors.left: pitch0Button.right; | ||
| 135 | anchors.leftMargin: 6; | ||
| 136 | width: parent.width/6 - anchors.leftMargin; | ||
| 137 | height: 30; | ||
| 138 | text: "Pitch -10"; | ||
| 139 | onClicked: { | ||
| 140 | messageToSpeak.insert(messageToSpeak.cursorPosition, "<pitch absmiddle='-10'/>"); | ||
| 141 | } | ||
| 142 | } | ||
| 143 | |||
| 144 | HifiControlsUit.Button { | ||
| 145 | id: speed5Button; | ||
| 146 | focusPolicy: Qt.NoFocus; | ||
| 147 | color: hifi.buttons.none; | ||
| 148 | colorScheme: hifi.colorSchemes.dark; | ||
| 149 | anchors.top: tagButtonTitle.bottom; | ||
| 150 | anchors.left: pitchNeg10Button.right; | ||
| 151 | anchors.leftMargin: 6; | ||
| 152 | width: parent.width/6 - anchors.leftMargin; | ||
| 153 | height: 30; | ||
| 154 | text: "Speed 5"; | ||
| 155 | onClicked: { | ||
| 156 | messageToSpeak.insert(messageToSpeak.cursorPosition, "<rate absspeed='5'/>"); | ||
| 157 | } | ||
| 158 | } | ||
| 159 | |||
| 160 | HifiControlsUit.Button { | ||
| 161 | id: speed0Button; | ||
| 162 | focusPolicy: Qt.NoFocus; | ||
| 163 | color: hifi.buttons.none; | ||
| 164 | colorScheme: hifi.colorSchemes.dark; | ||
| 165 | anchors.top: tagButtonTitle.bottom; | ||
| 166 | anchors.left: speed5Button.right; | ||
| 167 | anchors.leftMargin: 6; | ||
| 168 | width: parent.width/6 - anchors.leftMargin; | ||
| 169 | height: 30; | ||
| 170 | text: "Speed 0"; | ||
| 171 | onClicked: { | ||
| 172 | messageToSpeak.insert(messageToSpeak.cursorPosition, "<rate absspeed='0'/>"); | ||
| 173 | } | ||
| 174 | } | ||
| 175 | |||
| 176 | HifiControlsUit.Button { | ||
| 177 | id: speedNeg10Button; | ||
| 178 | focusPolicy: Qt.NoFocus; | ||
| 179 | color: hifi.buttons.none; | ||
| 180 | colorScheme: hifi.colorSchemes.dark; | ||
| 181 | anchors.top: tagButtonTitle.bottom; | ||
| 182 | anchors.left: speed0Button.right; | ||
| 183 | anchors.leftMargin: 6; | ||
| 184 | width: parent.width/6 - anchors.leftMargin; | ||
| 185 | height: 30; | ||
| 186 | text: "Speed -10"; | ||
| 187 | onClicked: { | ||
| 188 | messageToSpeak.insert(messageToSpeak.cursorPosition, "<rate absspeed='-10'/>"); | ||
| 189 | } | ||
| 190 | } | ||
| 191 | } | ||
| 192 | |||
| 193 | Item { | ||
| 194 | anchors.top: tagButtonContainer.bottom; | ||
| 195 | anchors.topMargin: 8; | ||
| 196 | anchors.bottom: keyboardContainer.top; | ||
| 197 | anchors.bottomMargin: 16; | ||
| 198 | anchors.left: parent.left; | ||
| 199 | anchors.leftMargin: 16; | ||
| 200 | anchors.right: parent.right; | ||
| 201 | anchors.rightMargin: 16; | ||
| 202 | |||
| 203 | TextArea { | ||
| 204 | id: messageToSpeak; | ||
| 205 | font.family: "Fira Sans SemiBold"; | ||
| 206 | font.pixelSize: 20; | ||
| 207 | // Anchors | ||
| 208 | anchors.top: parent.top; | ||
| 209 | anchors.left: parent.left; | ||
| 210 | anchors.right: parent.right; | ||
| 211 | anchors.bottom: speakButton.top; | ||
| 212 | anchors.bottomMargin: 8; | ||
| 213 | // Style | ||
| 214 | background: Rectangle { | ||
| 215 | anchors.fill: parent; | ||
| 216 | color: parent.activeFocus ? hifi.colors.black : hifi.colors.baseGrayShadow; | ||
| 217 | border.width: parent.activeFocus ? 1 : 0; | ||
| 218 | border.color: parent.activeFocus ? hifi.colors.primaryHighlight : hifi.colors.textFieldLightBackground; | ||
| 219 | } | ||
| 220 | color: hifi.colors.white; | ||
| 221 | textFormat: TextEdit.PlainText; | ||
| 222 | wrapMode: TextEdit.Wrap; | ||
| 223 | activeFocusOnPress: true; | ||
| 224 | activeFocusOnTab: true; | ||
| 225 | Keys.onPressed: { | ||
| 226 | if (event.key == Qt.Key_Return || event.key == Qt.Key_Enter) { | ||
| 227 | TextToSpeech.speakText(messageToSpeak.text, 480, 10, 24000, 16, true); | ||
| 228 | event.accepted = true; | ||
| 229 | } | ||
| 230 | } | ||
| 231 | |||
| 232 | HifiStylesUit.FiraSansRegular { | ||
| 233 | text: "<i>Input Text to Speak...</i>"; | ||
| 234 | size: 20; | ||
| 235 | anchors.fill: parent; | ||
| 236 | anchors.topMargin: 4; | ||
| 237 | anchors.leftMargin: 4; | ||
| 238 | color: hifi.colors.lightGrayText; | ||
| 239 | visible: !parent.activeFocus && messageToSpeak.text === ""; | ||
| 240 | verticalAlignment: Text.AlignTop; | ||
| 241 | } | ||
| 242 | } | ||
| 243 | |||
| 244 | HifiControlsUit.Button { | ||
| 245 | id: speakButton; | ||
| 246 | focusPolicy: Qt.NoFocus; | ||
| 247 | color: hifi.buttons.blue; | ||
| 248 | colorScheme: hifi.colorSchemes.dark; | ||
| 249 | anchors.right: parent.right; | ||
| 250 | anchors.bottom: parent.bottom; | ||
| 251 | width: 215; | ||
| 252 | height: 40; | ||
| 253 | text: "Speak"; | ||
| 254 | onClicked: { | ||
| 255 | TextToSpeech.speakText(messageToSpeak.text, 480, 10, 24000, 16, true); | ||
| 256 | } | ||
| 257 | } | ||
| 258 | |||
| 259 | HifiControlsUit.Button { | ||
| 260 | id: clearButton; | ||
| 261 | focusPolicy: Qt.NoFocus; | ||
| 262 | color: hifi.buttons.white; | ||
| 263 | colorScheme: hifi.colorSchemes.dark; | ||
| 264 | anchors.right: speakButton.left; | ||
| 265 | anchors.rightMargin: 16; | ||
| 266 | anchors.bottom: parent.bottom; | ||
| 267 | width: 100; | ||
| 268 | height: 40; | ||
| 269 | text: "Clear"; | ||
| 270 | onClicked: { | ||
| 271 | messageToSpeak.text = ""; | ||
| 272 | } | ||
| 273 | } | ||
| 274 | |||
| 275 | HifiControlsUit.Button { | ||
| 276 | id: stopButton; | ||
| 277 | focusPolicy: Qt.NoFocus; | ||
| 278 | color: hifi.buttons.red; | ||
| 279 | colorScheme: hifi.colorSchemes.dark; | ||
| 280 | anchors.right: clearButton.left; | ||
| 281 | anchors.rightMargin: 16; | ||
| 282 | anchors.bottom: parent.bottom; | ||
| 283 | width: 100; | ||
| 284 | height: 40; | ||
| 285 | text: "Stop Last"; | ||
| 286 | onClicked: { | ||
| 287 | TextToSpeech.stopLastSpeech(); | ||
| 288 | } | ||
| 289 | } | ||
25 more lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 356 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 2 lines aren’t shown here.
File renamed without changes.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 354 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
File renamed without changes.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
Binary file not shown.
This diff is large: its 461 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 187 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 87 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 67 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 112 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 153 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 39 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 100 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 60 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 66 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 164 lines aren’t shown here.
This diff is large: its 89 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 102 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 883 lines aren’t shown here.
This diff is large: its 156 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 81 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 130 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 50 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 95 lines aren’t shown here.
This diff is large: its 86 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 514 lines aren’t shown here.
This diff is large: its 157 lines aren’t shown here.
This diff is large: its 52 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 89 lines aren’t shown here.
This diff is large: its 41 lines aren’t shown here.
This diff is large: its 249 lines aren’t shown here.
This diff is large: its 84 lines aren’t shown here.
This diff is large: its 144 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 752 lines aren’t shown here.
This diff is large: its 104 lines aren’t shown here.
This diff is large: its 88 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 45 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 65 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 193 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 196 lines aren’t shown here.
This diff is large: its 64 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 287 lines aren’t shown here.
This diff is large: its 240 lines aren’t shown here.
This diff is large: its 7 lines aren’t shown here.
This diff is large: its 79 lines aren’t shown here.
This diff is large: its 52 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 232 lines aren’t shown here.
This diff is large: its 931 lines aren’t shown here.
This diff is large: its 55 lines aren’t shown here.
This diff is large: its 154 lines aren’t shown here.
This diff is large: its 233 lines aren’t shown here.
This diff is large: its 324 lines aren’t shown here.
This diff is large: its 33 lines aren’t shown here.
This diff is large: its 270 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 115 lines aren’t shown here.
This diff is large: its 61 lines aren’t shown here.
This diff is large: its 80 lines aren’t shown here.
This diff is large: its 82 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 65 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 31 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 189 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 112 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 261 lines aren’t shown here.
This diff is large: its 50 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 49 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 47 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 313 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 55 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 82 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 352 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 52 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 151 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 258 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 223 lines aren’t shown here.
This diff is large: its 64 lines aren’t shown here.
This diff is large: its 241 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 439 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 229 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 233 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 486 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 385 lines aren’t shown here.
This diff is large: its 103 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 885 lines aren’t shown here.
This diff is large: its 1282 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 63 lines aren’t shown here.
This diff is large: its 892 lines aren’t shown here.
This diff is large: its 117 lines aren’t shown here.
This diff is large: its 628 lines aren’t shown here.
This diff is large: its 164 lines aren’t shown here.
This diff is large: its 5259 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 167 lines aren’t shown here.
File renamed without changes.
This diff is large: its 198 lines aren’t shown here.
This diff is large: its 84 lines aren’t shown here.
This diff is large: its 371 lines aren’t shown here.
This diff is large: its 789 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 710 lines aren’t shown here.
This diff is large: its 141 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 486 lines aren’t shown here.
This diff is large: its 145 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 78 lines aren’t shown here.
This diff is large: its 61 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 132 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 299 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 151 lines aren’t shown here.
This diff is large: its 112 lines aren’t shown here.
This diff is large: its 731 lines aren’t shown here.
This diff is large: its 347 lines aren’t shown here.
This diff is large: its 161 lines aren’t shown here.
This diff is large: its 95 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 129 lines aren’t shown here.
This diff is large: its 115 lines aren’t shown here.
This diff is large: its 91 lines aren’t shown here.
This diff is large: its 162 lines aren’t shown here.
This diff is large: its 462 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 158 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 302 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 1013 lines aren’t shown here.
This diff is large: its 214 lines aren’t shown here.
This diff is large: its 401 lines aren’t shown here.
This diff is large: its 72 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 185 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 84 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.