History

removed cruft

amantley committed 7 years ago

Commit f2f4a552 parents 5365085 ec4f2f7888 files · +23435 −19797Browse files

Unified · Split

888 files
  1. BUILD.md +17 −8
  2. CMakeLists.txt +33 −13
  3. LICENSE +1 −1
  4. VCPKG.md +75 −0
  5. android/app/build.gradle +0 −1
  6. android/build.gradle +1 −43
  7. assignment-client/src/Agent.cpp +1 −1
  8. assignment-client/src/audio/AudioMixer.cpp +2 −1
  9. assignment-client/src/audio/AudioMixerClientData.cpp +24 −2
  10. assignment-client/src/audio/AudioMixerClientData.h +7 −1
  11. assignment-client/src/audio/AudioMixerSlave.cpp +16 −5
  12. assignment-client/src/audio/AudioMixerSlave.h +1 −1
  13. assignment-client/src/avatars/AvatarMixer.cpp +5 −4
  14. assignment-client/src/avatars/AvatarMixerClientData.cpp +12 −12
  15. assignment-client/src/avatars/AvatarMixerClientData.h +15 −16
  16. assignment-client/src/avatars/AvatarMixerSlave.cpp +81 −101
  17. assignment-client/src/avatars/AvatarMixerSlave.h +1 −1
  18. assignment-client/src/avatars/ScriptableAvatar.cpp +8 −8
  19. cmake/externals/boostconfig/CMakeLists.txt +0 −20
  20. cmake/externals/bullet/CMakeLists.txt +0 −85
  21. cmake/externals/draco/CMakeLists.txt +0 −41
  22. cmake/externals/etc2comp/CMakeLists.txt +0 −58
  23. cmake/externals/gli/CMakeLists.txt +0 −21
  24. cmake/externals/glm/CMakeLists.txt +0 −21
  25. cmake/externals/glslang/CMakeLists.txt +0 −42
  26. cmake/externals/json/CMakeLists.txt +0 −22
  27. cmake/externals/nvtt/CMakeLists.txt +0 −87
  28. cmake/externals/openvr/CMakeLists.txt +0 −49
  29. cmake/externals/quazip/CMakeLists.txt +8 −5
  30. cmake/externals/sdl2/CMakeLists.txt +0 −90
  31. cmake/externals/spirv_binaries/CMakeLists.txt +0 −34
  32. cmake/externals/spirv_cross/CMakeLists.txt +0 −35
  33. cmake/externals/spirv_headers/CMakeLists.txt +0 −18
  34. cmake/externals/spirv_tools/CMakeLists.txt +0 −33
  35. cmake/externals/zlib/CMakeLists.txt +0 −33
  36. cmake/macros/AutoScribeShader.cmake +10 −69
  37. cmake/macros/ManuallyInstallOpenSSLForQt.cmake +2 −2
  38. cmake/macros/TargetBullet.cmake +0 −1
  39. cmake/macros/TargetDraco.cmake +14 −8
  40. cmake/macros/TargetEtc2Comp.cmake +6 −5
  41. cmake/macros/TargetGli.cmake +2 −3
  42. cmake/macros/TargetGlm.cmake +6 −4
  43. cmake/macros/TargetJson.cmake +2 −3
  44. cmake/macros/TargetNvtt.cmake +9 −4
  45. cmake/macros/TargetOpenSSL.cmake +1 −8
  46. cmake/macros/TargetOpenVR.cmake +13 −0
  47. cmake/macros/TargetSDL2.cmake +8 −5
  48. cmake/macros/TargetTBB.cmake +9 −4
  49. cmake/macros/TargetVulkan.cmake +3 −11
  50. cmake/macros/TargetZlib.cmake +1 −10
  51. cmake/modules/FindDraco.cmake +0 −30
  52. cmake/modules/FindEtc2Comp.cmake +0 −37
  53. cmake/modules/FindGLEW.cmake +0 −33
  54. cmake/modules/FindJSON.cmake +0 −19
  55. cmake/modules/FindOpenSSL.cmake +0 −174
  56. cmake/modules/FindOpenVR.cmake +0 −21
  57. cmake/modules/FindSDL2.cmake +0 −224
  58. cmake/ports/bullet3/CONTROL +3 −0
  59. cmake/ports/bullet3/portfile.cmake +57 −0
  60. cmake/ports/draco/CONTROL +4 −0
  61. cmake/ports/draco/portfile.cmake +56 −0
  62. cmake/ports/etc2comp/CONTROL +3 −0
  63. cmake/ports/etc2comp/portfile.cmake +39 −0
  64. cmake/ports/gli/CONTROL +4 −0
  65. cmake/ports/gli/portfile.cmake +19 −0
  66. cmake/ports/glm/CONTROL +3 −0
  67. cmake/ports/glm/disable_warnings_as_error.patch +13 −0
  68. cmake/ports/glm/portfile.cmake +32 −0
  69. cmake/ports/glslang/CONTROL +3 −0
  70. cmake/ports/glslang/copyright +35 −0
  71. cmake/ports/glslang/portfile.cmake +26 −0
  72. cmake/ports/hifi-client-deps/CONTROL +4 −0
  73. cmake/ports/hifi-client-deps/portfile.cmake +1 −0
  74. cmake/ports/hifi-deps/CONTROL +4 −0
  75. cmake/ports/hifi-deps/portfile.cmake +1 −0
  76. cmake/ports/hifi-host-tools/CONTROL +4 −0
  77. cmake/ports/hifi-host-tools/portfile.cmake +1 −0
  78. cmake/ports/hifi-scribe/CONTROL +3 −0
  79. cmake/ports/hifi-scribe/portfile.cmake +19 −0
  80. cmake/ports/nlohmann-json/CONTROL +3 −0
  81. cmake/ports/nlohmann-json/portfile.cmake +18 −0
  82. cmake/ports/nvtt/CONTROL +3 −0
  83. cmake/ports/nvtt/portfile.cmake +39 −0
  84. cmake/ports/openssl-android/CONTROL +3 −0
  85. cmake/ports/openssl-android/LICENSE.txt +125 −0
  86. cmake/ports/openssl-android/portfile.cmake +24 −0
  87. cmake/ports/openssl-unix/CMakeLists.txt +136 −0
  88. cmake/ports/openssl-unix/CONTROL +3 −0
  89. cmake/ports/openssl-unix/ConfigureIncludeQuotesFix.patch +13 −0
  90. cmake/ports/openssl-unix/EmbedSymbolsInStaticLibsZ7.patch +25 −0
  91. cmake/ports/openssl-unix/STRINGIFYPatch.patch +23 −0
  92. cmake/ports/openssl-unix/portfile.cmake +63 −0
  93. cmake/ports/openssl-unix/remove-deps.cmake +7 −0
  94. cmake/ports/openssl-unix/usage +4 −0
  95. cmake/ports/openssl-unix/vcpkg-cmake-wrapper.cmake +10 −0
  96. cmake/ports/openssl-windows/CONTROL +3 −0
  97. cmake/ports/openssl-windows/ConfigureIncludeQuotesFix.patch +13 −0
  98. cmake/ports/openssl-windows/EmbedSymbolsInStaticLibsZ7.patch +25 −0
  99. cmake/ports/openssl-windows/STRINGIFYPatch.patch +23 −0
  100. cmake/ports/openssl-windows/portfile.cmake +163 −0
  101. cmake/ports/openssl-windows/usage +4 −0
  102. cmake/ports/openssl/CONTROL +4 −0
  103. cmake/ports/openssl/portfile.cmake +2 −0
  104. cmake/ports/openssl/usage +4 −0
  105. cmake/ports/openvr/CONTROL +3 −0
  106. cmake/ports/openvr/portfile.cmake +47 −0
  107. cmake/ports/sdl2/CONTROL +3 −0
  108. cmake/ports/sdl2/enable-winrt-cmake.patch +206 −0
  109. cmake/ports/sdl2/export-symbols-only-in-shared-build.patch +24 −0
  110. cmake/ports/sdl2/portfile.cmake +79 −0
  111. cmake/ports/shaderc/0001-Do-not-generate-build-version.inc.patch +30 −0
  112. cmake/ports/shaderc/CMakeLists.txt +31 −0
  113. cmake/ports/shaderc/CMakeLists_spirv.txt +8 −0
  114. cmake/ports/shaderc/CONTROL +4 −0
  115. cmake/ports/shaderc/build-version.inc +3 −0
  116. cmake/ports/shaderc/portfile.cmake +49 −0
  117. cmake/ports/spirv-cross/CONTROL +3 −0
  118. cmake/ports/spirv-cross/portfile.cmake +33 −0
  119. cmake/ports/spirv-tools/CONTROL +3 −0
  120. cmake/ports/spirv-tools/portfile.cmake +43 −0
  121. cmake/ports/tbb/CMakeLists.txt +18 −0
  122. cmake/ports/tbb/CONTROL +3 −0
  123. cmake/ports/tbb/portfile.cmake +86 −0
  124. cmake/ports/tbb/usage +4 −0
  125. cmake/ports/vulkanmemoryallocator/CONTROL +3 −0
  126. cmake/ports/vulkanmemoryallocator/portfile.cmake +14 −0
  127. cmake/ports/zlib/CONTROL +3 −0
  128. cmake/ports/zlib/LICENSE +20 −0
  129. cmake/ports/zlib/cmake_dont_build_more_than_needed.patch +42 −0
  130. cmake/ports/zlib/portfile.cmake +47 −0
  131. cmake/ports/zlib/usage +4 −0
  132. cmake/templates/NSIS.template.in +113 −2
  133. domain-server/CMakeLists.txt +2 −24
  134. domain-server/src/AssetsBackupHandler.cpp +9 −0
  135. domain-server/src/ContentSettingsBackupHandler.cpp +11 −0
  136. domain-server/src/EntitiesBackupHandler.cpp +9 −0
  137. interface/CMakeLists.txt +0 −2
  138. interface/resources/QtWebEngine/UIDelegates/Menu.qml +2 −2
  139. interface/resources/QtWebEngine/UIDelegates/MenuItem.qml +2 −2
  140. interface/resources/QtWebEngine/UIDelegates/PromptDialog.qml +2 −2
  141. interface/resources/avatar/animations/teleport.fbx +0 −0
  142. interface/resources/avatar/network-animation.json +160 −0
  143. interface/resources/config/keyboard.json +2476 −0
  144. interface/resources/controllers/vive.json +15 −13
  145. interface/resources/icons/tablet-icons/inventory-a-msg.svg +4 −0
  146. interface/resources/icons/tablet-icons/inventory-a.svg +3 −0
  147. interface/resources/icons/tablet-icons/inventory-i-msg.svg +4 −0
  148. interface/resources/icons/tablet-icons/inventory-i.svg +3 −0
  149. interface/resources/icons/tablet-icons/wallet-a-msg.svg +0 −6
  150. interface/resources/icons/tablet-icons/wallet-a.svg +0 −1
  151. interface/resources/icons/tablet-icons/wallet-i-msg.svg +0 −16
  152. interface/resources/icons/tablet-icons/wallet-i.svg +0 −14
  153. interface/resources/meshes/drumstick.fbx +0 −0
  154. interface/resources/meshes/keyboard/SM_enter.fbx +0 −0
  155. interface/resources/meshes/keyboard/SM_key.fbx +0 −0
  156. interface/resources/meshes/keyboard/SM_space.fbx +0 −0
  157. interface/resources/meshes/keyboard/keyCap_F.png +0 −0
  158. interface/resources/meshes/keyboard/keyCap_a.png +0 −0
  159. interface/resources/meshes/keyboard/keyCap_b.png +0 −0
  160. interface/resources/meshes/keyboard/keyCap_c.png +0 −0
  161. interface/resources/meshes/keyboard/keyCap_d.png +0 −0
  162. interface/resources/meshes/keyboard/keyCap_e.png +0 −0
  163. interface/resources/meshes/keyboard/keyCap_g.png +0 −0
  164. interface/resources/meshes/keyboard/keyCap_h.png +0 −0
  165. interface/resources/meshes/keyboard/keyCap_i.png +0 −0
  166. interface/resources/meshes/keyboard/keyCap_j.png +0 −0
  167. interface/resources/meshes/keyboard/keyCap_k.png +0 −0
  168. interface/resources/meshes/keyboard/keyCap_l.png +0 −0
  169. interface/resources/meshes/keyboard/keyCap_m.png +0 −0
  170. interface/resources/meshes/keyboard/keyCap_n.png +0 −0
  171. interface/resources/meshes/keyboard/keyCap_o.png +0 −0
  172. interface/resources/meshes/keyboard/keyCap_p.png +0 −0
  173. interface/resources/meshes/keyboard/keyCap_q.png +0 −0
  174. interface/resources/meshes/keyboard/keyCap_r.png +0 −0
  175. interface/resources/meshes/keyboard/keyCap_s.png +0 −0
  176. interface/resources/meshes/keyboard/keyCap_t.png +0 −0
  177. interface/resources/meshes/keyboard/keyCap_u.png +0 −0
  178. interface/resources/meshes/keyboard/keyCap_v.png +0 −0
  179. interface/resources/meshes/keyboard/keyCap_w.png +0 −0
  180. interface/resources/meshes/keyboard/keyCap_x.png +0 −0
  181. interface/resources/meshes/keyboard/keyCap_y.png +0 −0
  182. interface/resources/meshes/keyboard/keyCap_z.png +0 −0
  183. interface/resources/meshes/keyboard/key_0.png +0 −0
  184. interface/resources/meshes/keyboard/key_1.png +0 −0
  185. interface/resources/meshes/keyboard/key_123.png +0 −0
  186. interface/resources/meshes/keyboard/key_2.png +0 −0
  187. interface/resources/meshes/keyboard/key_3.png +0 −0
  188. interface/resources/meshes/keyboard/key_4.png +0 −0
  189. interface/resources/meshes/keyboard/key_5.png +0 −0
  190. interface/resources/meshes/keyboard/key_6.png +0 −0
  191. interface/resources/meshes/keyboard/key_7.png +0 −0
  192. interface/resources/meshes/keyboard/key_8.png +0 −0
  193. interface/resources/meshes/keyboard/key_9.png +0 −0
  194. interface/resources/meshes/keyboard/key_a.png +0 −0
  195. interface/resources/meshes/keyboard/key_abc.png +0 −0
  196. interface/resources/meshes/keyboard/key_ampersand.png +0 −0
  197. interface/resources/meshes/keyboard/key_ast.png +0 −0
  198. interface/resources/meshes/keyboard/key_at.png +0 −0
  199. interface/resources/meshes/keyboard/key_b.png +0 −0
  200. interface/resources/meshes/keyboard/key_backspace.png +0 −0
  201. interface/resources/meshes/keyboard/key_c.png +0 −0
  202. interface/resources/meshes/keyboard/key_cap.png +0 −0
  203. interface/resources/meshes/keyboard/key_caret.png +0 −0
  204. interface/resources/meshes/keyboard/key_close_paren.png +0 −0
  205. interface/resources/meshes/keyboard/key_colon.png +0 −0
  206. interface/resources/meshes/keyboard/key_comma.png +0 −0
  207. interface/resources/meshes/keyboard/key_d.png +0 −0
  208. interface/resources/meshes/keyboard/key_dollar.png +0 −0
  209. interface/resources/meshes/keyboard/key_dquote.png +0 −0
  210. interface/resources/meshes/keyboard/key_e.png +0 −0
  211. interface/resources/meshes/keyboard/key_enter.png +0 −0
  212. interface/resources/meshes/keyboard/key_exclam.png +0 −0
  213. interface/resources/meshes/keyboard/key_exit.png +0 −0
  214. interface/resources/meshes/keyboard/key_f.png +0 −0
  215. interface/resources/meshes/keyboard/key_g.png +0 −0
  216. interface/resources/meshes/keyboard/key_h.png +0 −0
  217. interface/resources/meshes/keyboard/key_hashtag.png +0 −0
  218. interface/resources/meshes/keyboard/key_i.png +0 −0
  219. interface/resources/meshes/keyboard/key_j.png +0 −0
  220. interface/resources/meshes/keyboard/key_k.png +0 −0
  221. interface/resources/meshes/keyboard/key_l.png +0 −0
  222. interface/resources/meshes/keyboard/key_m.png +0 −0
  223. interface/resources/meshes/keyboard/key_min.png +0 −0
  224. interface/resources/meshes/keyboard/key_n.png +0 −0
  225. interface/resources/meshes/keyboard/key_o.png +0 −0
  226. interface/resources/meshes/keyboard/key_open_paren.png +0 −0
  227. interface/resources/meshes/keyboard/key_p.png +0 −0
  228. interface/resources/meshes/keyboard/key_percentage.png +0 −0
  229. interface/resources/meshes/keyboard/key_period.png +0 −0
  230. interface/resources/meshes/keyboard/key_plus.png +0 −0
  231. interface/resources/meshes/keyboard/key_q.png +0 −0
  232. interface/resources/meshes/keyboard/key_question.png +0 −0
  233. interface/resources/meshes/keyboard/key_r.png +0 −0
  234. interface/resources/meshes/keyboard/key_s.png +0 −0
  235. interface/resources/meshes/keyboard/key_semi.png +0 −0
  236. interface/resources/meshes/keyboard/key_slash.png +0 −0
  237. interface/resources/meshes/keyboard/key_squote.png +0 −0
  238. interface/resources/meshes/keyboard/key_t.png +0 −0
  239. interface/resources/meshes/keyboard/key_u.png +0 −0
  240. interface/resources/meshes/keyboard/key_under.png +0 −0
  241. interface/resources/meshes/keyboard/key_v.png +0 −0
  242. interface/resources/meshes/keyboard/key_w.png +0 −0
  243. interface/resources/meshes/keyboard/key_x.png +0 −0
  244. interface/resources/meshes/keyboard/key_y.png +0 −0
  245. interface/resources/meshes/keyboard/key_z.png +0 −0
  246. interface/resources/meshes/keyboard/text_placard.png +0 −0
  247. interface/resources/meshes/keyboard/white.png +0 −0
  248. interface/resources/meshes/mannequin/+gles/Eyes.ktx +0 −0
  249. interface/resources/meshes/mannequin/+gles/lambert1_Base_Color.ktx +0 −0
  250. interface/resources/meshes/mannequin/+gles/lambert1_Normal_OpenGL.ktx +0 −0
  251. interface/resources/meshes/mannequin/+gles/lambert1_Roughness.ktx +0 −0
  252. interface/resources/meshes/mannequin/Eyes.texmeta.json +8 −0
  253. interface/resources/meshes/mannequin/Eyes_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.ktx +0 −0
  254. interface/resources/meshes/mannequin/Eyes_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT.ktx +0 −0
  255. interface/resources/meshes/mannequin/StingrayPBS10_Base_Color.png +0 −0
  256. interface/resources/meshes/mannequin/StingrayPBS10_Base_Color_bcn.ktx +0 −0
  257. interface/resources/meshes/mannequin/StingrayPBS10_Normal_OpenGL.png +0 −0
  258. interface/resources/meshes/mannequin/StingrayPBS10_Normal_OpenGL_bcn.ktx +0 −0
  259. interface/resources/meshes/mannequin/lambert1_Base_Color.png +0 −0
  260. interface/resources/meshes/mannequin/lambert1_Base_Color.texmeta.json +8 −0
  261. interface/resources/meshes/mannequin/lambert1_Base_Color_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.ktx +0 −0
  262. interface/resources/meshes/mannequin/lambert1_Base_Color_COMPRESSED_SRGB_S3TC_DXT1_EXT.ktx +0 −0
  263. interface/resources/meshes/mannequin/lambert1_Normal_OpenGL.png +0 −0
  264. interface/resources/meshes/mannequin/lambert1_Normal_OpenGL.texmeta.json +8 −0
  265. interface/resources/meshes/mannequin/lambert1_Normal_OpenGL_COMPRESSED_RG11_EAC.ktx +0 −0
  266. interface/resources/meshes/mannequin/lambert1_Normal_OpenGL_COMPRESSED_RG_RGTC2.ktx +0 −0
  267. interface/resources/meshes/mannequin/lambert1_Roughness.png +0 −0
  268. interface/resources/meshes/mannequin/lambert1_Roughness.texmeta.json +8 −0
  269. interface/resources/meshes/mannequin/lambert1_Roughness_COMPRESSED_R11_EAC.ktx +0 −0
  270. interface/resources/meshes/mannequin/lambert1_Roughness_COMPRESSED_RED_RGTC1.ktx +0 −0
  271. interface/resources/meshes/mannequin/lambert1_Roughness_bcn.ktx +0 −0
  272. interface/resources/meshes/mannequin/mannequin.baked.fbx +0 −0
  273. interface/resources/qml/+android/Stats.qml +1 −0
  274. interface/resources/qml/AudioScopeUI.qml +2 −2
  275. interface/resources/qml/Browser.qml +2 −2
  276. interface/resources/qml/CurrentAPI.qml +2 −2
  277. interface/resources/qml/InfoView.qml +1 −1
  278. interface/resources/qml/InteractiveWindow.qml +2 −2
  279. interface/resources/qml/LoginDialog.qml +2 −2
  280. interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml +2 −2
  281. interface/resources/qml/LoginDialog/+android/SignUpBody.qml +2 −2
  282. interface/resources/qml/LoginDialog/CompleteProfileBody.qml +2 −2
  283. interface/resources/qml/LoginDialog/LinkAccountBody.qml +21 −13
  284. interface/resources/qml/LoginDialog/SignInBody.qml +2 −2
  285. interface/resources/qml/LoginDialog/SignUpBody.qml +2 −2
  286. interface/resources/qml/LoginDialog/UsernameCollisionBody.qml +2 −2
  287. interface/resources/qml/LoginDialog/WelcomeBody.qml +2 −2
  288. interface/resources/qml/QmlWebWindow.qml +2 −2
  289. interface/resources/qml/QmlWindow.qml +2 −2
  290. interface/resources/qml/TabletBrowser.qml +2 −2
  291. interface/resources/qml/UpdateDialog.qml +2 −2
  292. interface/resources/qml/controls-uit/AttachmentsTable.qml +3 −169
  293. interface/resources/qml/controls-uit/BaseWebView.qml +3 −37
  294. interface/resources/qml/controls-uit/Button.qml +2 −120
  295. interface/resources/qml/controls-uit/CheckBox.qml +2 −119
  296. interface/resources/qml/controls-uit/CheckBoxQQC2.qml +3 −124
  297. interface/resources/qml/controls-uit/ComboBox.qml +2 −189
  298. interface/resources/qml/controls-uit/ContentSection.qml +2 −136
  299. interface/resources/qml/controls-uit/FilterBar.qml +2 −319
  300. interface/resources/qml/controls-uit/GlyphButton.qml +2 −89
  301. interface/resources/qml/controls-uit/HorizontalRule.qml +2 −16
  302. interface/resources/qml/controls-uit/HorizontalSpacer.qml +2 −19
  303. interface/resources/qml/controls-uit/ImageMessageBox.qml +2 −61
  304. interface/resources/qml/controls-uit/Key.qml +2 −183
  305. interface/resources/qml/controls-uit/Keyboard.qml +2 −352
  306. interface/resources/qml/controls-uit/Label.qml +2 −33
  307. interface/resources/qml/controls-uit/QueuedButton.qml +2 −39
  308. interface/resources/qml/controls-uit/RadioButton.qml +2 −91
  309. interface/resources/qml/controls-uit/ScrollBar.qml +1 −38
  310. interface/resources/qml/controls-uit/Separator.qml +2 −42
  311. interface/resources/qml/controls-uit/Slider.qml +2 −96
  312. interface/resources/qml/controls-uit/SpinBox.qml +1 −182
  313. interface/resources/qml/controls-uit/Switch.qml +2 −158
  314. interface/resources/qml/controls-uit/Table.qml +2 −163
  315. interface/resources/qml/controls-uit/TabletContentSection.qml +2 −136
  316. interface/resources/qml/controls-uit/TabletHeader.qml +2 −32
  317. interface/resources/qml/controls-uit/TextAction.qml +2 −63
  318. interface/resources/qml/controls-uit/TextEdit.qml +1 −20
  319. interface/resources/qml/controls-uit/TextField.qml +1 −177
  320. interface/resources/qml/controls-uit/ToolTip.qml +3 −50
  321. interface/resources/qml/controls-uit/Tree.qml +2 −203
  322. interface/resources/qml/controls-uit/VerticalSpacer.qml +2 −19
  323. interface/resources/qml/controls-uit/WebGlyphButton.qml +2 −38
  324. interface/resources/qml/controls-uit/WebSpinner.qml +2 −22
  325. interface/resources/qml/controls-uit/WebView.qml +2 −19
  326. interface/resources/qml/controls-uit/readme.txt +1 −0
  327. interface/resources/qml/controls/Button.qml +0 −1
  328. interface/resources/qml/controls/FlickableWebViewCore.qml +1 −1
  329. interface/resources/qml/controls/TabletWebButton.qml +1 −1
  330. interface/resources/qml/controls/TabletWebScreen.qml +1 −1
  331. interface/resources/qml/controls/TabletWebView.qml +6 −2
  332. interface/resources/qml/controls/WebView.qml +1 −1
  333. interface/resources/qml/controlsUit/+android/ImageButton.qml +3 −3
  334. interface/resources/qml/controlsUit/AttachmentsTable.qml +170 −0
  335. interface/resources/qml/controlsUit/BaseWebView.qml +38 −0
  336. interface/resources/qml/controlsUit/Button.qml +122 −0
  337. interface/resources/qml/controlsUit/CheckBox.qml +121 −0
  338. interface/resources/qml/controlsUit/CheckBoxQQC2.qml +125 −0
  339. interface/resources/qml/controlsUit/ComboBox.qml +191 −0
  340. interface/resources/qml/controlsUit/ContentSection.qml +138 −0
  341. interface/resources/qml/controlsUit/FilterBar.qml +333 −0
  342. interface/resources/qml/controlsUit/GlyphButton.qml +91 −0
  343. interface/resources/qml/controlsUit/HorizontalRule.qml +18 −0
  344. interface/resources/qml/controlsUit/HorizontalSpacer.qml +21 −0
  345. interface/resources/qml/controlsUit/ImageMessageBox.qml +63 −0
  346. interface/resources/qml/controlsUit/Key.qml +185 −0
  347. interface/resources/qml/controlsUit/Keyboard.qml +370 −0
  348. interface/resources/qml/controlsUit/Label.qml +35 −0
  349. interface/resources/qml/controlsUit/QueuedButton.qml +41 −0
  350. interface/resources/qml/controlsUit/RadioButton.qml +93 −0
  351. interface/resources/qml/controlsUit/ScrollBar.qml +41 −0
  352. interface/resources/qml/controlsUit/Separator.qml +44 −0
  353. interface/resources/qml/controlsUit/Slider.qml +98 −0
  354. interface/resources/qml/controlsUit/SpinBox.qml +185 −0
  355. interface/resources/qml/controlsUit/Switch.qml +160 −0
  356. interface/resources/qml/controlsUit/Table.qml +165 −0
  357. interface/resources/qml/controlsUit/TabletContentSection.qml +138 −0
  358. interface/resources/qml/controlsUit/TabletHeader.qml +34 −0
  359. interface/resources/qml/controlsUit/TextAction.qml +65 −0
  360. interface/resources/qml/controlsUit/TextEdit.qml +23 −0
  361. interface/resources/qml/controlsUit/TextField.qml +180 −0
  362. interface/resources/qml/controlsUit/ToolTip.qml +51 −0
  363. interface/resources/qml/controlsUit/Tree.qml +205 −0
  364. interface/resources/qml/controlsUit/VerticalSpacer.qml +21 −0
  365. interface/resources/qml/controlsUit/WebGlyphButton.qml +40 −0
  366. interface/resources/qml/controlsUit/WebSpinner.qml +24 −0
  367. interface/resources/qml/controlsUit/WebView.qml +21 −0
  368. interface/resources/qml/controlsUit/qmldir +2 −0
  369. interface/resources/qml/dialogs/AssetDialog.qml +1 −1
  370. interface/resources/qml/dialogs/CustomQueryDialog.qml +2 −2
  371. interface/resources/qml/dialogs/FileDialog.qml +2 −2
  372. interface/resources/qml/dialogs/MessageDialog.qml +2 −2
  373. interface/resources/qml/dialogs/PreferencesDialog.qml +2 −2
  374. interface/resources/qml/dialogs/QueryDialog.qml +2 −2
  375. interface/resources/qml/dialogs/TabletAssetDialog.qml +1 −1
  376. interface/resources/qml/dialogs/TabletCustomQueryDialog.qml +2 −2
  377. interface/resources/qml/dialogs/TabletFileDialog.qml +2 −2
  378. interface/resources/qml/dialogs/TabletLoginDialog.qml +22 −2
  379. interface/resources/qml/dialogs/TabletMessageBox.qml +2 −2
  380. interface/resources/qml/dialogs/TabletQueryDialog.qml +2 −2
  381. interface/resources/qml/dialogs/assetDialog/AssetDialogContent.qml +2 −2
  382. interface/resources/qml/dialogs/fileDialog/FileTypeSelection.qml +1 −1
  383. interface/resources/qml/dialogs/messageDialog/MessageDialogButton.qml +1 −1
  384. interface/resources/qml/dialogs/preferences/AvatarPreference.qml +1 −1
  385. interface/resources/qml/dialogs/preferences/BrowsablePreference.qml +1 −1
  386. interface/resources/qml/dialogs/preferences/ButtonPreference.qml +1 −1
  387. interface/resources/qml/dialogs/preferences/CheckBoxPreference.qml +1 −1
  388. interface/resources/qml/dialogs/preferences/ComboBoxPreference.qml +2 −2
  389. interface/resources/qml/dialogs/preferences/EditablePreference.qml +1 −1
  390. interface/resources/qml/dialogs/preferences/PrimaryHandPreference.qml +1 −1
  391. interface/resources/qml/dialogs/preferences/RadioButtonsPreference.qml +2 −2
  392. interface/resources/qml/dialogs/preferences/Section.qml +2 −2
  393. interface/resources/qml/dialogs/preferences/SliderPreference.qml +1 −1
  394. interface/resources/qml/dialogs/preferences/SpinBoxPreference.qml +1 −1
  395. interface/resources/qml/dialogs/preferences/SpinnerSliderPreference.qml +1 −1
  396. interface/resources/qml/hifi/+android/ActionBar.qml +2 −2
  397. interface/resources/qml/hifi/+android/AudioBar.qml +2 −2
  398. interface/resources/qml/hifi/+android/AvatarOption.qml +1 −1
  399. interface/resources/qml/hifi/+android/StatsBar.qml +2 −2
  400. interface/resources/qml/hifi/+android/WindowHeader.qml +2 −2
  401. interface/resources/qml/hifi/+android/bottomHudOptions.qml +2 −2
  402. interface/resources/qml/hifi/+android/modesbar.qml +2 −2
  403. interface/resources/qml/hifi/AssetServer.qml +2 −2
  404. interface/resources/qml/hifi/AvatarApp.qml +11 −4
  405. interface/resources/qml/hifi/Card.qml +1 −1
  406. interface/resources/qml/hifi/ComboDialog.qml +2 −2
  407. interface/resources/qml/hifi/Desktop.qml +1 −1
  408. interface/resources/qml/hifi/DesktopLetterboxMessage.qml +1 −1
  409. interface/resources/qml/hifi/Feed.qml +1 −1
  410. interface/resources/qml/hifi/LetterboxMessage.qml +1 −1
  411. interface/resources/qml/hifi/NameCard.qml +2 −2
  412. interface/resources/qml/hifi/Pal.qml +2 −2
  413. interface/resources/qml/hifi/SkyboxChanger.qml +2 −2
  414. interface/resources/qml/hifi/SpectatorCamera.qml +2 −2
  415. interface/resources/qml/hifi/TabletTextButton.qml +1 −1
  416. interface/resources/qml/hifi/TextButton.qml +1 −1
  417. interface/resources/qml/hifi/WebBrowser.qml +2 −2
  418. interface/resources/qml/hifi/audio/Audio.qml +2 −2
  419. interface/resources/qml/hifi/audio/AudioTabButton.qml +2 −2
  420. interface/resources/qml/hifi/audio/CheckBox.qml +1 −1
  421. interface/resources/qml/hifi/audio/PlaySampleSound.qml +2 −2
  422. interface/resources/qml/hifi/avatarapp/AdjustWearables.qml +22 −7
  423. interface/resources/qml/hifi/avatarapp/AvatarAppHeader.qml +1 −1
  424. interface/resources/qml/hifi/avatarapp/AvatarAppStyle.qml +1 −1
  425. interface/resources/qml/hifi/avatarapp/AvatarWearablesIndicator.qml +2 −2
  426. interface/resources/qml/hifi/avatarapp/BlueButton.qml +2 −2
  427. interface/resources/qml/hifi/avatarapp/CreateFavoriteDialog.qml +2 −2
  428. interface/resources/qml/hifi/avatarapp/InputField.qml +2 −2
  429. interface/resources/qml/hifi/avatarapp/InputTextStyle4.qml +2 −2
  430. interface/resources/qml/hifi/avatarapp/MessageBox.qml +2 −2
  431. interface/resources/qml/hifi/avatarapp/MessageBoxes.qml +5 −5
  432. interface/resources/qml/hifi/avatarapp/Settings.qml +26 −2
  433. interface/resources/qml/hifi/avatarapp/ShadowGlyph.qml +1 −1
  434. interface/resources/qml/hifi/avatarapp/ShadowImage.qml +1 −1
  435. interface/resources/qml/hifi/avatarapp/ShadowRectangle.qml +1 −1
  436. interface/resources/qml/hifi/avatarapp/SquareLabel.qml +2 −2
  437. interface/resources/qml/hifi/avatarapp/Vector3.qml +2 −2
  438. interface/resources/qml/hifi/avatarapp/WhiteButton.qml +2 −2
  439. interface/resources/qml/hifi/commerce/checkout/Checkout.qml +40 −35
  440. interface/resources/qml/hifi/commerce/common/CommerceLightbox.qml +6 −4
  441. interface/resources/qml/hifi/commerce/common/EmulatedMarketplaceHeader.qml +4 −58
  442. interface/resources/qml/hifi/commerce/common/FirstUseTutorial.qml +4 −4
  443. interface/resources/qml/hifi/commerce/common/sendAsset/ConnectionItem.qml +2 −2
  444. interface/resources/qml/hifi/commerce/common/sendAsset/RecipientDisplay.qml +2 −2
  445. interface/resources/qml/hifi/commerce/common/sendAsset/SendAsset.qml +12 −4
  446. interface/resources/qml/hifi/commerce/inspectionCertificate/InspectionCertificate.qml +29 −28
  447. interface/resources/qml/hifi/commerce/marketplaceItemTester/ItemUnderTest.qml +2 −2
  448. interface/resources/qml/hifi/commerce/marketplaceItemTester/MarketplaceItemTester.qml +3 −2
  449. interface/resources/qml/hifi/commerce/purchases/PurchasedItem.qml +5 −5
  450. interface/resources/qml/hifi/commerce/purchases/Purchases.qml +31 −46
  451. interface/resources/qml/hifi/commerce/wallet/Help.qml +5 −8
  452. interface/resources/qml/hifi/commerce/wallet/NeedsLogIn.qml +3 −3
  453. interface/resources/qml/hifi/commerce/wallet/PassphraseChange.qml +2 −2
  454. interface/resources/qml/hifi/commerce/wallet/PassphraseModal.qml +2 −2
  455. interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml +2 −2
  456. interface/resources/qml/hifi/commerce/wallet/Security.qml +0 −246
  457. interface/resources/qml/hifi/commerce/wallet/Wallet.qml +167 −159
  458. interface/resources/qml/hifi/commerce/wallet/WalletChoice.qml +2 −2
  459. interface/resources/qml/hifi/commerce/wallet/WalletHome.qml +2 −25
  460. interface/resources/qml/hifi/commerce/wallet/WalletSetup.qml +2 −122
  461. interface/resources/qml/hifi/commerce/wallet/images/items-tab-a.svg +8 −0
  462. interface/resources/qml/hifi/dialogs/AboutDialog.qml +1 −1
  463. interface/resources/qml/hifi/dialogs/RunningScripts.qml +2 −2
  464. interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml +1 −1
  465. interface/resources/qml/hifi/dialogs/TabletAssetServer.qml +2 −2
  466. interface/resources/qml/hifi/dialogs/TabletDCDialog.qml +2 −2
  467. interface/resources/qml/hifi/dialogs/TabletDebugWindow.qml +2 −2
  468. interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml +2 −2
  469. interface/resources/qml/hifi/dialogs/TabletEntityStatisticsItem.qml +2 −2
  470. interface/resources/qml/hifi/dialogs/TabletLODTools.qml +2 −2
  471. interface/resources/qml/hifi/dialogs/TabletRunningScripts.qml +6 −2
  472. interface/resources/qml/hifi/dialogs/content/ModelBrowserContent.qml +1 −1
  473. interface/resources/qml/hifi/dialogs/security/Security.qml +344 −0
  474. interface/resources/qml/hifi/dialogs/security/SecurityImageChange.qml +18 −23
  475. interface/resources/qml/hifi/dialogs/security/SecurityImageModel.qml +4 −4
  476. interface/resources/qml/hifi/dialogs/security/SecurityImageSelection.qml +12 −14
  477. interface/resources/qml/hifi/dialogs/security/images/01.jpg +0 −0
  478. interface/resources/qml/hifi/dialogs/security/images/02.jpg +0 −0
  479. interface/resources/qml/hifi/dialogs/security/images/03.jpg +0 −0
  480. interface/resources/qml/hifi/dialogs/security/images/04.jpg +0 −0
  481. interface/resources/qml/hifi/dialogs/security/images/05.jpg +0 −0
  482. interface/resources/qml/hifi/dialogs/security/images/06.jpg +0 −0
  483. interface/resources/qml/hifi/dialogs/security/images/07.jpg +0 −0
  484. interface/resources/qml/hifi/dialogs/security/images/08.jpg +0 −0
  485. interface/resources/qml/hifi/dialogs/security/images/09.jpg +0 −0
  486. interface/resources/qml/hifi/dialogs/security/images/10.jpg +0 −0
  487. interface/resources/qml/hifi/dialogs/security/images/11.jpg +0 −0
  488. interface/resources/qml/hifi/dialogs/security/images/12.jpg +0 −0
  489. interface/resources/qml/hifi/dialogs/security/images/13.jpg +0 −0
  490. interface/resources/qml/hifi/dialogs/security/images/14.jpg +0 −0
  491. interface/resources/qml/hifi/dialogs/security/images/15.jpg +0 −0
  492. interface/resources/qml/hifi/dialogs/security/images/16.jpg +0 −0
  493. interface/resources/qml/hifi/dialogs/security/images/17.jpg +0 −0
  494. interface/resources/qml/hifi/dialogs/security/images/18.jpg +0 −0
  495. interface/resources/qml/hifi/dialogs/security/images/19.jpg +0 −0
  496. interface/resources/qml/hifi/dialogs/security/images/20.jpg +0 −0
  497. interface/resources/qml/hifi/dialogs/security/images/21.jpg +0 −0
  498. interface/resources/qml/hifi/dialogs/security/images/22.jpg +0 −0
  499. interface/resources/qml/hifi/dialogs/security/images/23.jpg +0 −0
  500. interface/resources/qml/hifi/dialogs/security/images/24.jpg +0 −0
  501. interface/resources/qml/hifi/dialogs/security/images/25.jpg +0 −0
  502. interface/resources/qml/hifi/dialogs/security/images/26.jpg +0 −0
  503. interface/resources/qml/hifi/dialogs/security/images/27.jpg +0 −0
  504. interface/resources/qml/hifi/dialogs/security/images/28.jpg +0 −0
  505. interface/resources/qml/hifi/dialogs/security/images/29.jpg +0 −0
  506. interface/resources/qml/hifi/dialogs/security/images/30.jpg +0 −0
  507. interface/resources/qml/hifi/dialogs/security/images/31.jpg +0 −0
  508. interface/resources/qml/hifi/dialogs/security/images/32.jpg +0 −0
  509. interface/resources/qml/hifi/dialogs/security/images/33.jpg +0 −0
  510. interface/resources/qml/hifi/dialogs/security/images/34.jpg +0 −0
  511. interface/resources/qml/hifi/tablet/CalibratingScreen.qml +2 −2
  512. interface/resources/qml/hifi/tablet/ControllerSettings.qml +2 −2
  513. interface/resources/qml/hifi/tablet/Edit.qml +6 −0
  514. interface/resources/qml/hifi/tablet/EditEntityList.qml +2 −2
  515. interface/resources/qml/hifi/tablet/EditTabButton.qml +2 −2
  516. interface/resources/qml/hifi/tablet/EditTabView.qml +3 −21
  517. interface/resources/qml/hifi/tablet/EditToolsTabView.qml +4 −23
  518. interface/resources/qml/hifi/tablet/InputRecorder.qml +2 −2
  519. interface/resources/qml/hifi/tablet/NewMaterialDialog.qml +2 −2
  520. interface/resources/qml/hifi/tablet/NewModelDialog.qml +2 −2
  521. interface/resources/qml/hifi/tablet/OpenVrConfiguration.qml +40 −5
  522. interface/resources/qml/hifi/tablet/TabletAddressDialog.qml +10 −2
  523. interface/resources/qml/hifi/tablet/TabletHome.qml +1 −1
  524. interface/resources/qml/hifi/tablet/TabletMenu.qml +1 −1
  525. interface/resources/qml/hifi/tablet/TabletMenuItem.qml +2 −2
  526. interface/resources/qml/hifi/tablet/TabletMenuView.qml +1 −1
  527. interface/resources/qml/hifi/tablet/TabletModelBrowserDialog.qml +2 −2
  528. interface/resources/qml/hifi/tablet/WindowRoot.qml +15 −2
  529. interface/resources/qml/hifi/tablet/tabletWindows/TabletFileDialog.qml +2 −2
  530. interface/resources/qml/hifi/tablet/tabletWindows/TabletPreferencesDialog.qml +6 −2
  531. interface/resources/qml/hifi/tablet/tabletWindows/preferences/Section.qml +2 −2
  532. interface/resources/qml/hifi/tablet/tabletWindows/preferences/TabletBrowsablePreference.qml +1 −1
  533. interface/resources/qml/hifi/tts/TTS.qml +314 −0
  534. interface/resources/qml/styles-uit/AnonymousProRegular.qml +2 −18
  535. interface/resources/qml/styles-uit/ButtonLabel.qml +2 −14
  536. interface/resources/qml/styles-uit/FiraSansRegular.qml +2 −18
  537. interface/resources/qml/styles-uit/FiraSansSemiBold.qml +2 −18
  538. interface/resources/qml/styles-uit/HiFiGlyphs.qml +2 −20
  539. interface/resources/qml/styles-uit/HifiConstants.qml +2 −351
  540. interface/resources/qml/styles-uit/IconButton.qml +2 −16
  541. interface/resources/qml/styles-uit/InfoItem.qml +2 −15
  542. interface/resources/qml/styles-uit/InputLabel.qml +2 −14
  543. interface/resources/qml/styles-uit/ListItem.qml +2 −14
  544. interface/resources/qml/styles-uit/Logs.qml +2 −14
  545. interface/resources/qml/styles-uit/OverlayTitle.qml +2 −14
  546. interface/resources/qml/styles-uit/RalewayBold.qml +2 −19
  547. interface/resources/qml/styles-uit/RalewayLight.qml +2 −18
  548. interface/resources/qml/styles-uit/RalewayRegular.qml +2 −18
  549. interface/resources/qml/styles-uit/RalewaySemiBold.qml +2 −19
  550. interface/resources/qml/styles-uit/SectionName.qml +2 −15
  551. interface/resources/qml/styles-uit/Separator.qml +2 −39
  552. interface/resources/qml/styles-uit/ShortcutText.qml +2 −14
  553. interface/resources/qml/styles-uit/TabName.qml +2 −15
  554. interface/resources/qml/styles-uit/TextFieldInput.qml +2 −14
  555. interface/resources/qml/styles-uit/readme.txt +1 −0
  556. interface/resources/qml/stylesUit/+android/HifiConstants.qml +0 −0
  557. interface/resources/qml/stylesUit/AnonymousProRegular.qml +20 −0
  558. interface/resources/qml/stylesUit/ButtonLabel.qml +16 −0
  559. interface/resources/qml/stylesUit/FiraSansRegular.qml +20 −0
  560. interface/resources/qml/stylesUit/FiraSansSemiBold.qml +20 −0
  561. interface/resources/qml/stylesUit/HiFiGlyphs.qml +22 −0
  562. interface/resources/qml/stylesUit/HifiConstants.qml +353 −0
  563. interface/resources/qml/stylesUit/IconButton.qml +18 −0
  564. interface/resources/qml/stylesUit/InfoItem.qml +17 −0
  565. interface/resources/qml/stylesUit/InputLabel.qml +16 −0
  566. interface/resources/qml/stylesUit/ListItem.qml +16 −0
  567. interface/resources/qml/stylesUit/Logs.qml +16 −0
  568. interface/resources/qml/stylesUit/OverlayTitle.qml +16 −0
  569. interface/resources/qml/stylesUit/RalewayBold.qml +21 −0
  570. interface/resources/qml/stylesUit/RalewayLight.qml +20 −0
  571. interface/resources/qml/stylesUit/RalewayRegular.qml +20 −0
  572. interface/resources/qml/stylesUit/RalewaySemiBold.qml +21 −0
  573. interface/resources/qml/stylesUit/SectionName.qml +17 −0
  574. interface/resources/qml/stylesUit/Separator.qml +41 −0
  575. interface/resources/qml/stylesUit/ShortcutText.qml +16 −0
  576. interface/resources/qml/stylesUit/TabName.qml +17 −0
  577. interface/resources/qml/stylesUit/TextFieldInput.qml +16 −0
  578. interface/resources/qml/stylesUit/qmldir +0 −0
  579. interface/resources/qml/windows/Decoration.qml +1 −1
  580. interface/resources/qml/windows/DefaultFrame.qml +1 −1
  581. interface/resources/qml/windows/DefaultFrameDecoration.qml +1 −1
  582. interface/resources/qml/windows/Fadable.qml +1 −1
  583. interface/resources/qml/windows/Frame.qml +1 −1
  584. interface/resources/qml/windows/ModalFrame.qml +2 −2
  585. interface/resources/qml/windows/ScrollingWindow.qml +2 −2
  586. interface/resources/qml/windows/TabletModalFrame.qml +2 −2
  587. interface/resources/qml/windows/ToolFrame.qml +1 −1
  588. interface/resources/qml/windows/ToolFrameDecoration.qml +1 −1
  589. interface/resources/qml/windows/Window.qml +1 −1
  590. interface/resources/sounds/keyboard_key.mp3 +0 −0
  591. interface/src/Application.cpp +164 −60
  592. interface/src/Application.h +5 −0
  593. interface/src/Menu.cpp +80 −51
  594. interface/src/Menu.h +2 −0
  595. interface/src/ModelPackager.cpp +17 −17
  596. interface/src/ModelPackager.h +3 −3
  597. interface/src/ModelPropertiesDialog.cpp +10 −10
  598. interface/src/ModelPropertiesDialog.h +2 −2
  599. interface/src/Util.cpp +1 −1
  600. interface/src/assets/ATPAssetMigrator.cpp +2 −2
  601. interface/src/avatar/AvatarActionHold.cpp +2 −2
  602. interface/src/avatar/AvatarManager.cpp +40 −19
  603. interface/src/avatar/AvatarManager.h +5 −4
  604. interface/src/avatar/MyAvatar.cpp +8 −11
  605. interface/src/avatar/MySkeletonModel.cpp +24 −45
  606. interface/src/avatar/MySkeletonModel.h +4 −2
  607. interface/src/commerce/Ledger.cpp +8 −3
  608. interface/src/commerce/Ledger.h +1 −1
  609. interface/src/commerce/QmlCommerce.cpp +2 −2
  610. interface/src/commerce/QmlCommerce.h +1 −1
  611. interface/src/commerce/Wallet.cpp +1 −1
  612. interface/src/main.cpp +13 −0
  613. interface/src/raypick/CollisionPick.cpp +15 −15
  614. interface/src/raypick/PickScriptingInterface.cpp +10 −2
  615. interface/src/raypick/PointerScriptingInterface.cpp +37 −1
  616. interface/src/raypick/RayPick.cpp +1 −1
  617. interface/src/raypick/StylusPick.cpp +7 −11
  618. interface/src/raypick/StylusPick.h +4 −2
  619. interface/src/raypick/StylusPointer.cpp +22 −10
  620. interface/src/raypick/StylusPointer.h +6 −1
  621. interface/src/scripting/Audio.h +2 −0
  622. interface/src/scripting/HMDScriptingInterface.cpp +5 −2
  623. interface/src/scripting/HMDScriptingInterface.h +2 −0
  624. interface/src/scripting/KeyboardScriptingInterface.cpp +34 −0
  625. interface/src/scripting/KeyboardScriptingInterface.h +43 −0
  626. interface/src/scripting/TTSScriptingInterface.cpp +163 −0
  627. interface/src/scripting/TTSScriptingInterface.h +88 −0
  628. interface/src/scripting/WalletScriptingInterface.cpp +4 −2
  629. interface/src/scripting/WalletScriptingInterface.h +21 −10
  630. interface/src/ui/ApplicationOverlay.cpp +1 −0
  631. interface/src/ui/Keyboard.cpp +882 −0
  632. interface/src/ui/Keyboard.h +155 −0
  633. interface/src/ui/PreferencesDialog.cpp +0 −1
  634. interface/src/ui/overlays/Base3DOverlay.cpp +1 −0
  635. interface/src/ui/overlays/Base3DOverlay.h +0 −2
  636. interface/src/ui/overlays/ContextOverlayInterface.cpp +1 −6
  637. interface/src/ui/overlays/Image3DOverlay.cpp +12 −2
  638. interface/src/ui/overlays/Image3DOverlay.h +1 −0
  639. interface/src/ui/overlays/ModelOverlay.cpp +17 −15
  640. interface/src/ui/overlays/Overlay.cpp +1 −1
  641. interface/src/ui/overlays/Overlays.cpp +44 −16
  642. interface/src/ui/overlays/Volume3DOverlay.cpp +4 −14
  643. interface/src/ui/overlays/Volume3DOverlay.h +1 −2
  644. interface/src/ui/overlays/Web3DOverlay.cpp +4 −0
  645. libraries/animation/src/AnimClip.cpp +11 −11
  646. libraries/animation/src/AnimClip.h +2 −0
  647. libraries/animation/src/AnimInverseKinematics.cpp +18 −4
  648. libraries/animation/src/AnimSkeleton.cpp +8 −8
  649. libraries/animation/src/AnimSkeleton.h +4 −4
  650. libraries/animation/src/AnimTwoBoneIK.cpp +5 −2
  651. libraries/animation/src/AnimUtil.h +90 −0
  652. libraries/animation/src/AnimationCache.cpp +17 −17
  653. libraries/animation/src/AnimationCache.h +6 −6
  654. libraries/animation/src/AnimationObject.cpp +4 −4
  655. libraries/animation/src/AnimationObject.h +2 −2
  656. libraries/animation/src/Rig.cpp +249 −52
  657. libraries/animation/src/Rig.h +51 −12
  658. libraries/audio-client/src/AudioClient.cpp +23 −5
  659. libraries/audio-client/src/AudioClient.h +3 −1
  660. libraries/audio/src/AbstractAudioInterface.h +3 −0
  661. libraries/audio/src/AudioInjectorLocalBuffer.h +1 −1
  662. libraries/audio/src/AudioSolo.cpp +88 −0
  663. libraries/audio/src/AudioSolo.h +40 −0
  664. libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +59 −65
  665. libraries/avatars-renderer/src/avatars-renderer/Avatar.h +16 −13
  666. libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp +23 −23
  667. libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.h +2 −2
  668. libraries/avatars/src/AvatarData.cpp +274 −199
  669. libraries/avatars/src/AvatarData.h +34 −5
  670. libraries/avatars/src/AvatarHashMap.cpp +38 −31
  671. libraries/baking/CMakeLists.txt +1 −4
  672. libraries/baking/src/FBXBaker.cpp +5 −5
  673. libraries/baking/src/FBXBaker.h +1 −1
  674. libraries/baking/src/ModelBaker.cpp +1 −1
  675. libraries/baking/src/ModelBaker.h +1 −1
  676. libraries/baking/src/OBJBaker.cpp +10 −10
  677. libraries/baking/src/OBJBaker.h +2 −2
  678. libraries/controllers/src/controllers/impl/Filter.cpp +2 −0
  679. libraries/controllers/src/controllers/impl/filters/AccelerationLimiterFilter.cpp +192 −0
  680. libraries/controllers/src/controllers/impl/filters/AccelerationLimiterFilter.h +41 −0
  681. libraries/controllers/src/controllers/impl/filters/ExponentialSmoothingFilter.cpp +1 −1
  682. libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +3 −0
  683. libraries/entities-renderer/src/RenderableModelEntityItem.cpp +34 −35
  684. libraries/entities-renderer/src/RenderableWebEntityItem.cpp +5 −10
  685. libraries/entities-renderer/src/RenderableWebEntityItem.h +0 −1
  686. libraries/entities/src/EntityEditFilters.cpp +1 −1
  687. libraries/entities/src/EntityItemProperties.cpp +12 −0
  688. libraries/entities/src/EntityItemProperties.h +1 −0
  689. libraries/entities/src/EntityScriptingInterface.cpp +238 −0
  690. libraries/entities/src/EntityTree.cpp +118 −101
  691. libraries/entities/src/EntityTree.h +2 −0
  692. libraries/entities/src/GrabPropertyGroup.cpp +30 −0
  693. libraries/entities/src/ParticleEffectEntityItem.cpp +14 −13
  694. libraries/entities/src/ParticleEffectEntityItem.h +2 −1
  695. libraries/fbx/src/FBX.h +48 −48
  696. libraries/fbx/src/FBXReader.cpp +186 −186
  697. libraries/fbx/src/FBXReader.h +10 −10
  698. libraries/fbx/src/FBXReader_Material.cpp +20 −20
  699. libraries/fbx/src/FBXReader_Mesh.cpp +40 −40
  700. libraries/fbx/src/GLTFReader.cpp +79 −79
  701. libraries/fbx/src/GLTFReader.h +6 −6
  702. libraries/fbx/src/OBJReader.cpp +64 −64
  703. libraries/fbx/src/OBJReader.h +6 −6
  704. libraries/gl/src/gl/Context.cpp +14 −30
  705. libraries/gl/src/gl/Context.h +8 −6
  706. libraries/gl/src/gl/ContextQt.cpp +44 −8
  707. libraries/gl/src/gl/GLHelpers.cpp +45 −1
  708. libraries/gl/src/gl/GLHelpers.h +3 −0
  709. libraries/gl/src/gl/GLWidget.cpp +2 −2
  710. libraries/gl/src/gl/GLWidget.h +1 −1
  711. libraries/gl/src/gl/GLWindow.cpp +1 −1
  712. libraries/gl/src/gl/OffscreenGLCanvas.cpp +6 −24
  713. libraries/gl/src/gl/OffscreenGLCanvas.h +2 −3
  714. libraries/gl/src/gl/QOpenGLContextWrapper.cpp +17 −0
  715. libraries/gl/src/gl/QOpenGLContextWrapper.h +5 −0
  716. libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp +42 −63
  717. libraries/gpu-gl-common/src/gpu/gl/GLBackend.h +27 −9
  718. libraries/gpu-gl/src/gpu/gl41/GL41BackendShader.cpp +1 −1
  719. libraries/gpu-gles/src/gpu/gles/GLESBackend.h +4 −0
  720. libraries/gpu-gles/src/gpu/gles/GLESBackendBuffer.cpp +46 −13
  721. libraries/gpu/src/gpu/MipGeneration.slh +1 −1
  722. libraries/gpu/src/gpu/ShaderConstants.h +6 −0
  723. libraries/graphics/src/graphics/BufferViewHelpers.h +0 −1
  724. libraries/image/src/image/Image.cpp +2 −2
  725. libraries/model-networking/src/model-networking/ModelCache.cpp +57 −47
  726. libraries/model-networking/src/model-networking/ModelCache.h +7 −7
  727. libraries/model-networking/src/model-networking/TextureCache.cpp +2 −2
  728. libraries/networking/src/AccountManager.cpp +4 −0
  729. libraries/networking/src/AccountManager.h +6 −0
  730. libraries/networking/src/AddressManager.cpp +5 −5
  731. libraries/networking/src/DomainHandler.cpp +1 −1
  732. libraries/networking/src/DomainHandler.h +5 −1
  733. libraries/networking/src/NetworkingConstants.h +5 −5
  734. libraries/networking/src/ResourceCache.cpp +3 −1
  735. libraries/networking/src/ResourceCache.h +1 −1
  736. libraries/networking/src/ResourceManager.cpp +9 −9
  737. libraries/networking/src/udt/CongestionControl.h +2 −0
  738. libraries/networking/src/udt/Connection.cpp +11 −11
  739. libraries/networking/src/udt/PacketHeaders.h +1 −2
  740. libraries/networking/src/udt/SendQueue.cpp +1 −0
  741. libraries/networking/src/udt/SequenceNumber.h +1 −1
  742. libraries/networking/src/udt/TCPVegasCC.cpp +132 −84
  743. libraries/networking/src/udt/TCPVegasCC.h +16 −3
  744. libraries/physics/src/CharacterController.cpp +5 −3
  745. libraries/physics/src/ObjectMotionState.cpp +9 −8
  746. libraries/physics/src/PhysicsEngine.cpp +6 −0
  747. libraries/qml/src/qml/impl/RenderEventHandler.cpp +6 −2
  748. libraries/qml/src/qml/impl/TextureCache.cpp +9 −5
  749. libraries/render-utils/src/AnimDebugDraw.cpp +11 −6
  750. libraries/render-utils/src/AnimDebugDraw.h +2 −1
  751. libraries/render-utils/src/Blendshape.slh +2 −2
  752. libraries/render-utils/src/CauterizedModel.cpp +12 −12
  753. libraries/render-utils/src/Highlight_aabox.slv +2 −2
  754. libraries/render-utils/src/LightStage.cpp +2 −1
  755. libraries/render-utils/src/MeshPartPayload.cpp +10 −6
  756. libraries/render-utils/src/Model.cpp +54 −54
  757. libraries/render-utils/src/Model.h +5 −5
  758. libraries/render-utils/src/SoftAttachmentModel.cpp +4 −4
  759. libraries/render-utils/src/WorkloadResource.slh +4 −4
  760. libraries/render-utils/src/debug_deferred_buffer.slf +1 −1
  761. libraries/render/src/render/CullTask.cpp +1 −1
  762. libraries/render/src/render/drawItemBounds.slv +2 −2
  763. libraries/script-engine/src/AudioScriptingInterface.h +38 −2
  764. libraries/shaders/src/shaders/Shaders.cpp +1 −1
  765. libraries/shared/src/AvatarConstants.h +4 −3
  766. libraries/shared/src/GLMHelpers.cpp +8 −5
  767. libraries/shared/src/PrioritySortUtil.h +11 −2
  768. libraries/shared/src/RegisteredMetaTypes.h +9 −5
  769. libraries/shared/src/SpatiallyNestable.cpp +6 −4
  770. libraries/ui/src/ui/OffscreenQmlSurface.cpp +1 −0
  771. libraries/ui/src/ui/TabletScriptingInterface.cpp +6 −0
  772. libraries/ui/src/ui/TabletScriptingInterface.h +1 −0
  773. libraries/ui/src/ui/types/RequestFilters.cpp +3 −7
  774. libraries/workload/src/workload/ViewTask.cpp +14 −3
  775. plugins/hifiSdl2/src/Joystick.h +1 −1
  776. plugins/hifiSdl2/src/SDL2Manager.h +1 −1
  777. plugins/oculus/CMakeLists.txt +0 −3
  778. plugins/openvr/CMakeLists.txt +1 −8
  779. plugins/openvr/src/ViveControllerManager.cpp +71 −26
  780. plugins/openvr/src/ViveControllerManager.h +8 −0
  781. prebuild.py +257 −0
  782. scripts/defaultScripts.js +1 −1
  783. scripts/developer/accelerationFilterApp.js +222 −0
  784. scripts/developer/debugging/debugWindow.js +32 −4
  785. scripts/developer/exponentialFilterApp.js +240 −0
  786. scripts/developer/tests/ControlsGallery.qml +2 −9
  787. scripts/developer/tests/drawTrackedObjects.js +8 −10
  788. scripts/developer/tests/filtered-puck-attach.js +438 −0
  789. scripts/developer/tests/puck-attach.js +2 −2
  790. scripts/developer/utilities/audio/Stats.qml +1 −1
  791. scripts/developer/utilities/audio/TabletStats.qml +1 −2
  792. scripts/developer/utilities/lib/jet/qml/TaskList.qml +2 −2
  793. scripts/developer/utilities/lib/jet/qml/TaskListView.qml +2 −2
  794. scripts/developer/utilities/lib/plotperf/Color.qml +2 −2
  795. scripts/developer/utilities/render/antialiasing.qml +2 −2
  796. scripts/developer/utilities/render/configSlider/ConfigSlider.qml +2 −2
  797. scripts/developer/utilities/render/configSlider/RichSlider.qml +2 −2
  798. scripts/developer/utilities/render/deferredLighting.qml +23 −7
  799. scripts/developer/utilities/render/engineInspector.qml +2 −2
  800. scripts/developer/utilities/render/highlight.qml +2 −2
  801. scripts/developer/utilities/render/highlight/HighlightStyle.qml +2 −2
  802. scripts/developer/utilities/render/lod.qml +2 −2
  803. scripts/developer/utilities/render/luci.js +106 −97
  804. scripts/developer/utilities/render/shadow.qml +2 −2
  805. scripts/developer/utilities/render/transition.qml +2 −2
  806. scripts/developer/utilities/workload/workloadInspector.qml +2 −2
  807. scripts/modules/appUi.js +106 −61
  808. scripts/modules/request.js +3 −2
  809. scripts/system/assets/data/createAppTooltips.json +485 −0
  810. scripts/system/avatarapp.js +4 −5
  811. scripts/system/commerce/wallet.js +176 −54
  812. scripts/system/controllers/controllerModules/equipEntity.js +2 −73
  813. scripts/system/controllers/controllerModules/farParentGrabEntity.js +3 −1
  814. scripts/system/controllers/controllerModules/inEditMode.js +17 −0
  815. scripts/system/controllers/controllerModules/nearParentGrabEntity.js +6 −14
  816. scripts/system/controllers/controllerModules/nearParentGrabOverlay.js +5 −1
  817. scripts/system/edit.js +310 −233
  818. scripts/system/html/css/edit-style.css +366 −530
  819. scripts/system/html/css/hifi-style.css +4 −4
  820. scripts/system/html/entityList.html +23 −8
  821. scripts/system/html/entityProperties.html +4 −871
  822. scripts/system/html/js/createAppTooltip.js +116 −0
  823. scripts/system/html/js/entityList.js +340 −81
  824. scripts/system/html/js/entityListContextMenu.js +163 −0
  825. scripts/system/html/js/entityProperties.js +2993 −1832
  826. scripts/system/html/js/listView.js +25 −1
  827. scripts/system/html/js/marketplacesInject.js +22 −47
  828. scripts/system/html/js/underscore-min.js +0 −0
  829. scripts/system/interstitialPage.js +52 −45
  830. scripts/system/libraries/entityList.js +31 −4
  831. scripts/system/libraries/entitySelectionTool.js +93 −48
  832. scripts/system/marketplaces/marketplaces.js +53 −535
  833. scripts/system/notifications.js +1 −1
  834. scripts/system/pal.js +8 −8
  835. scripts/system/particle_explorer/hifi-entity-ui.js +0 −709
  836. scripts/system/particle_explorer/particle-style.css +0 −140
  837. scripts/system/particle_explorer/particleExplorer.html +0 −43
  838. scripts/system/particle_explorer/particleExplorer.js +0 −485
  839. scripts/system/particle_explorer/particleExplorerTool.js +0 −144
  840. scripts/system/tablet-goto.js +8 −8
  841. server-console/src/main.js +0 −4
  842. server-console/src/modules/hf-notifications.js +9 −2
  843. tests-manual/controllers/CMakeLists.txt +1 −7
  844. tests-manual/gpu/src/TestFbx.cpp +5 −5
  845. tests-manual/gpu/src/TestFbx.h +1 −1
  846. tests-manual/qml/qml/MacQml.qml +77 −0
  847. tests-manual/qml/src/MacQml.cpp +60 −0
  848. tests-manual/qml/src/MacQml.h +16 −0
  849. tests-manual/qml/src/StressWeb.cpp +131 −0
  850. tests-manual/qml/src/StressWeb.h +34 −0
  851. tests-manual/qml/src/TestCase.cpp +25 −0
  852. tests-manual/qml/src/TestCase.h +23 −0
  853. tests-manual/qml/src/main.cpp +55 −148
  854. tests-manual/render-texture-load/src/GLIHelpers.cpp +2 −0
  855. tests-manual/render-texture-load/src/GLIHelpers.h +3 −2
  856. tests-manual/ui/qml/ControlsGalleryWindow.qml +14 −0
  857. tests-manual/ui/qml/Palettes.qml +0 −150
  858. tests-manual/ui/qml/ScrollingGraph.qml +0 −111
  859. tests-manual/ui/qml/StubMenu.qml +0 −730
  860. tests-manual/ui/qml/Stubs.qml +0 −346
  861. tests-manual/ui/qml/TestControllers.qml +0 −160
  862. tests-manual/ui/qml/TestDialog.qml +0 −94
  863. tests-manual/ui/qml/TestMenu.qml +0 −10
  864. tests-manual/ui/qml/TestRoot.qml +0 −43
  865. tests-manual/ui/qml/controlDemo/ButtonPage.qml +0 −128
  866. tests-manual/ui/qml/controlDemo/InputPage.qml +0 −114
  867. tests-manual/ui/qml/controlDemo/ProgressPage.qml +0 −90
  868. tests-manual/ui/qml/controlDemo/main.qml +0 −161
  869. tests-manual/ui/qml/main.qml +0 −461
  870. tests-manual/ui/qmlscratch.pro +2 −26
  871. tests-manual/ui/src/main.cpp +24 −101
  872. tests/animation/src/AnimInverseKinematicsTests.cpp +13 −13
  873. tests/shaders/CMakeLists.txt +8 −0
  874. tests/shaders/src/ShaderTests.cpp +70 −165
  875. tools/CMakeLists.txt +1 −3
  876. tools/auto-tester/CMakeLists.txt +1 −1
  877. tools/auto-tester/src/TestRunner.cpp +1 −1
  878. tools/scribe/CMakeLists.txt +0 −8
  879. tools/scribe/src/TextTemplate.cpp +0 −1012
  880. tools/scribe/src/TextTemplate.h +0 −213
  881. tools/scribe/src/main.cpp +0 −400
  882. tools/shadergen.py +12 −18
  883. tools/skeleton-dump/src/SkeletonDumpApp.cpp +2 −2
  884. tools/vhacd-util/src/VHACDUtil.cpp +28 −28
  885. tools/vhacd-util/src/VHACDUtil.h +6 −6
  886. tools/vhacd-util/src/VHACDUtilApp.cpp +13 −13
  887. tools/vhacd-util/src/VHACDUtilApp.h +1 −1
  888. unpublishedScripts/marketplace/spectator-camera/SpectatorCamera.qml +2 −2
BUILD.md+17−8
@@ -10,14 +10,11 @@ · 9 unmodified lines
1010 - [cmake](https://cmake.org/download/): 3.9
1111 - [Qt](https://www.qt.io/download-open-source): 5.10.1
1212 - [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)
1513
1614 ### CMake External Project Dependencies
1715
1816 These dependencies need not be installed manually. They are automatically downloaded on the platforms where they are required.
1917 - [Bullet Physics Engine](https://github.com/bulletphysics/bullet3/releases): 2.83
20−- [GLEW](http://glew.sourceforge.net/): 1.13
2118 - [glm](https://glm.g-truc.net/0.9.8/index.html): 0.9.8
2219 - [Oculus SDK](https://developer.oculus.com/downloads/): 1.11 (Win32) / 0.5 (Mac)
2320 - [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
2522 - [QuaZip](https://sourceforge.net/projects/quazip/files/quazip/): 0.7.3
2623 - [SDL2](https://www.libsdl.org/download-2.0.php): 2.0.3
2724 - [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)
2927 - [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)
3129
3230 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.
3331
3432 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.
3533
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−
3834 #### CMake
3935
4036 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
8278 * $NAME_ROOT_DIR - set this variable in your ENV
8379 * HIFI_LIB_DIR - set this variable in your ENV to your High Fidelity lib folder, should contain a folder '$name'
8480
85−
8681 ### Optional Components
8782
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+
8897 #### Devices
8998
9099 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.
CMakeLists.txt+33−13
@@ -7,22 +7,36 @@ else() · 6 unmodified lines
77 cmake_minimum_required(VERSION 3.2)
88 endif()
99
10−# squelch the Policy CMP0074 warning without requiring an update to cmake 3.12.
11−if ((${CMAKE_MAJOR_VERSION} EQUAL 3 AND ${CMAKE_MINOR_VERSION} GREATER 11) OR ${CMAKE_MAJOR_VERSION} GREATER 3)
12− cmake_policy(SET CMP0074 NEW)
10+include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/macros/TargetPython.cmake")
11+target_python()
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()
1327 endif()
1428
15−project(hifi)
29+if(NOT EXISTS "${CMAKE_BINARY_DIR}/vcpkg.cmake")
30+ message(FATAL_ERROR "vcpkg configuration missing.")
31+endif()
1632
33+include("${CMAKE_BINARY_DIR}/vcpkg.cmake")
34+project(hifi)
1735 include("cmake/init.cmake")
18−
1936 include("cmake/compiler.cmake")
2037
21−if (BUILD_SCRIBE_ONLY)
22− add_subdirectory(tools/scribe)
23− add_subdirectory(tools/shader_reflect)
24− return()
25−endif()
38+add_paths_to_fixup_libs(${VCPKG_INSTALL_ROOT}/bin)
39+add_paths_to_fixup_libs(${VCPKG_INSTALL_ROOT}/debug/bin)
2640
2741 if (NOT DEFINED CLIENT_ONLY)
2842 set(CLIENT_ONLY 0)
@@ -40,7 +54,8 @@ endif() · 11 unmodified lines
4054
4155 set(BUILD_CLIENT_OPTION ON)
4256 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})
4459 set(BUILD_TOOLS_OPTION ON)
4560 set(BUILD_INSTALLER_OPTION ON)
4661 set(GLES_OPTION OFF)
@@ -66,7 +81,7 @@ if (ANDROID) · 19 unmodified lines
6681 set(GLES_OPTION ON)
6782 set(PLATFORM_QT_COMPONENTS AndroidExtras WebView)
6883 else ()
69− set(PLATFORM_QT_COMPONENTS WebEngine WebEngineWidgets)
84+ set(PLATFORM_QT_COMPONENTS WebEngine)
7085 endif ()
7186
7287 if (USE_GLES AND (NOT ANDROID))
@@ -77,6 +92,7 @@ endif() · 4 unmodified lines
7792 option(BUILD_CLIENT "Build client components" ${BUILD_CLIENT_OPTION})
7893 option(BUILD_SERVER "Build server components" ${BUILD_SERVER_OPTION})
7994 option(BUILD_TESTS "Build tests" ${BUILD_TESTS_OPTION})
95+option(BUILD_MANUAL_TESTS "Build manual tests" ${BUILD_MANUAL_TESTS_OPTION})
8096 option(BUILD_TOOLS "Build tools" ${BUILD_TOOLS_OPTION})
8197 option(BUILD_INSTALLER "Build installer" ${BUILD_INSTALLER_OPTION})
8298 option(USE_GLES "Use OpenGL ES" ${GLES_OPTION})
@@ -144,6 +160,8 @@ list(APPEND CMAKE_PREFIX_PATH "${QT_CMAKE_PREFIX_PATH}") · 61 unmodified lines
144160 find_package( Threads )
145161
146162 add_definitions(-DGLM_FORCE_RADIANS)
163+add_definitions(-DGLM_ENABLE_EXPERIMENTAL)
164+add_definitions(-DGLM_FORCE_CTOR_INIT)
147165 set(HIFI_LIBRARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries")
148166
149167 set(EXTERNAL_PROJECT_PREFIX "project")
@@ -191,7 +209,9 @@ if (BUILD_TESTS) · 41 unmodified lines
191209 include(CTest)
192210 enable_testing()
193211 add_subdirectory(tests)
194− add_subdirectory(tests-manual)
212+ if (BUILD_MANUAL_TESTS)
213+ add_subdirectory(tests-manual)
214+ endif()
195215 endif()
196216
197217 if (BUILD_INSTALLER)
LICENSE+1−1
@@ -1,4 +1,4 @@
1−Copyright (c) 2013-2016, High Fidelity, Inc.
1+Copyright (c) 2013-2018, High Fidelity, Inc.
22 All rights reserved.
33 licensing@highfidelity.io
44
VCPKG.md+75−0
@@ -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.
android/app/build.gradle+0−1
@@ -23,7 +23,6 @@ android { · 22 unmodified lines
2323 '-DANDROID_TOOLCHAIN=clang',
2424 '-DANDROID_STL=c++_shared',
2525 '-DQT_CMAKE_PREFIX_PATH=' + HIFI_ANDROID_PRECOMPILED + '/qt/lib/cmake',
26− '-DNATIVE_SCRIBE=' + HIFI_ANDROID_PRECOMPILED + '/scribe' + EXEC_SUFFIX,
2726 '-DHIFI_ANDROID_PRECOMPILED=' + HIFI_ANDROID_PRECOMPILED,
2827 '-DRELEASE_NUMBER=' + RELEASE_NUMBER,
2928 '-DRELEASE_TYPE=' + RELEASE_TYPE,
android/build.gradle+1−43
@@ -106,11 +106,6 @@ def packages = [ · 105 unmodified lines
106106 versionId: 'r5Zran.JSCtvrrB6Q4KaqfIoALPw3lYY',
107107 checksum: 'a8ee8584cf1ccd34766c7ddd9d5e5449',
108108 ],
109− glm: [
110− file: 'glm-0.9.8.5-patched.tgz',
111− versionId: 'cskfMoJrFlAeqI3WPxemyO_Cxt7rT9EJ',
112− checksum: '067b5fe16b220b5b1a1039ba51b062ae',
113− ],
114109 gvr: [
115110 file: 'gvrsdk_v1.101.0.tgz',
116111 versionId: 'nqBV_j81Uc31rC7bKIrlya_Hah4v3y5r',
@@ -161,21 +156,6 @@ def packages = [ · 44 unmodified lines
161156 ]
162157 ]
163158
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−
179159 def options = [
180160 files: new TreeSet<File>(),
181161 features: new HashSet<String>(),
@@ -434,28 +414,6 @@ task copyDependencies(dependsOn: [ extractDependencies ]) { · 252 unmodified lines
434414 }
435415 }
436416
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−
459417 task extractGvrBinaries(dependsOn: extractDependencies) {
460418 doLast {
461419 def gvrLibFolder = new File(HIFI_ANDROID_PRECOMPILED, 'gvr/gvr-android-sdk-1.101.0/libraries');
@@ -542,7 +500,7 @@ task qtBundle { · 80 unmodified lines
542500 }
543501 }
544502
545−task setupDependencies(dependsOn: [setupScribe, copyDependencies, extractGvrBinaries, qtBundle]) { }
503+task setupDependencies(dependsOn: [copyDependencies, extractGvrBinaries, qtBundle]) { }
546504
547505 task cleanDependencies(type: Delete) {
548506 delete HIFI_ANDROID_PRECOMPILED
assignment-client/src/Agent.cpp+1−1
@@ -216,7 +216,7 @@ void Agent::requestScript() { · 215 unmodified lines
216216 }
217217
218218 // 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) {
220220 qWarning() << "Cannot load script for Agent from local filesystem.";
221221 scriptRequestFinished();
222222 return;
assignment-client/src/audio/AudioMixer.cpp+2−1
@@ -89,7 +89,8 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : · 88 unmodified lines
8989 PacketType::NodeIgnoreRequest,
9090 PacketType::RadiusIgnoreRequest,
9191 PacketType::RequestsDomainListData,
92− PacketType::PerAvatarGainSet },
92+ PacketType::PerAvatarGainSet,
93+ PacketType::AudioSoloRequest },
9394 this, "queueAudioPacket");
9495
9596 // packets whose consequences are global should be processed on the main thread
assignment-client/src/audio/AudioMixerClientData.cpp+24−2
@@ -13,7 +13,7 @@ · 12 unmodified lines
1313
1414 #include <random>
1515
16−#include <glm/detail/func_common.hpp>
16+#include <glm/common.hpp>
1717
1818 #include <QtCore/QDebug>
1919 #include <QtCore/QJsonArray>
@@ -98,6 +98,9 @@ int AudioMixerClientData::processPackets(ConcurrentAddedStreams& addedStreams) { · 78 unmodified lines
9898 case PacketType::RadiusIgnoreRequest:
9999 parseRadiusIgnoreRequest(packet, node);
100100 break;
101+ case PacketType::AudioSoloRequest:
102+ parseSoloRequest(packet, node);
103+ break;
101104 default:
102105 Q_UNREACHABLE();
103106 }
@@ -202,7 +205,7 @@ void AudioMixerClientData::parsePerAvatarGainSet(ReceivedMessage& message, const · 98 unmodified lines
202205 }
203206 }
204207
205−void AudioMixerClientData::setGainForAvatar(QUuid nodeID, uint8_t gain) {
208+void AudioMixerClientData::setGainForAvatar(QUuid nodeID, float gain) {
206209 auto it = std::find_if(_streams.active.cbegin(), _streams.active.cend(), [nodeID](const MixableStream& mixableStream){
207210 return mixableStream.nodeStreamID.nodeID == nodeID && mixableStream.nodeStreamID.streamID.isNull();
208211 });
@@ -295,6 +298,25 @@ void AudioMixerClientData::parseRadiusIgnoreRequest(QSharedPointer<ReceivedMessa · 86 unmodified lines
295298 }
296299 }
297300
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+
298320 AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() {
299321 auto it = std::find_if(_audioStreams.begin(), _audioStreams.end(), [](const SharedStreamPointer& stream){
300322 return stream->getStreamIdentifier().isNull();
assignment-client/src/audio/AudioMixerClientData.h+7−1
@@ -65,6 +65,7 @@ public: · 64 unmodified lines
6565 void parsePerAvatarGainSet(ReceivedMessage& message, const SharedNodePointer& node);
6666 void parseNodeIgnoreRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node);
6767 void parseRadiusIgnoreRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node);
68+ void parseSoloRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node);
6869
6970 // attempt to pop a frame from each audio stream, and return the number of streams from this client
7071 int checkBuffersBeforeFrameSend();
@@ -150,6 +151,9 @@ public: · 79 unmodified lines
150151
151152 const Node::IgnoredNodeIDs& getIgnoringNodeIDs() const { return _ignoringNodeIDs; }
152153
154+
155+ const std::vector<QUuid>& getSoloedNodes() const { return _soloedNodes; }
156+
153157 bool getHasReceivedFirstMix() const { return _hasReceivedFirstMix; }
154158 void setHasReceivedFirstMix(bool hasReceivedFirstMix) { _hasReceivedFirstMix = hasReceivedFirstMix; }
155159
@@ -172,7 +176,7 @@ private: · 16 unmodified lines
172176
173177 void optionallyReplicatePacket(ReceivedMessage& packet, const Node& node);
174178
175− void setGainForAvatar(QUuid nodeID, uint8_t gain);
179+ void setGainForAvatar(QUuid nodeID, float gain);
176180
177181 bool containsValidPosition(ReceivedMessage& message) const;
178182
@@ -209,6 +213,8 @@ private: · 30 unmodified lines
209213
210214 std::atomic_bool _isIgnoreRadiusEnabled { false };
211215
216+ std::vector<QUuid> _soloedNodes;
217+
212218 bool _hasReceivedFirstMix { false };
213219 };
214220
assignment-client/src/audio/AudioMixerSlave.cpp+16−5
@@ -272,6 +272,10 @@ bool shouldBeSkipped(MixableStream& stream, const Node& listener, · 271 unmodified lines
272272 return true;
273273 }
274274
275+ if (!listenerData.getSoloedNodes().empty()) {
276+ return !contains(listenerData.getSoloedNodes(), stream.nodeStreamID.nodeID);
277+ }
278+
275279 bool shouldCheckIgnoreBox = (listenerAudioStream.isIgnoreBoxEnabled() ||
276280 stream.positionalStream->isIgnoreBoxEnabled());
277281 if (shouldCheckIgnoreBox &&
@@ -310,6 +314,7 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { · 32 unmodified lines
310314 memset(_mixSamples, 0, sizeof(_mixSamples));
311315
312316 bool isThrottling = _numToRetain != -1;
317+ bool isSoloing = !listenerData->getSoloedNodes().empty();
313318
314319 auto& streams = listenerData->getStreams();
315320
@@ -376,13 +381,14 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { · 60 unmodified lines
376381 stream.approximateVolume = approximateVolume(stream, listenerAudioStream);
377382 } else {
378383 if (shouldBeSkipped(stream, *listener, *listenerAudioStream, *listenerData)) {
379− addStream(stream, *listenerAudioStream, 0.0f);
384+ addStream(stream, *listenerAudioStream, 0.0f, isSoloing);
380385 streams.skipped.push_back(move(stream));
381386 ++stats.activeToSkipped;
382387 return true;
383388 }
384389
385− addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain());
390+ addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain(),
391+ isSoloing);
386392
387393 if (shouldBeInactive(stream)) {
388394 // 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
417423 return true;
418424 }
419425
420− addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain());
426+ addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain(),
427+ isSoloing);
421428
422429 if (shouldBeInactive(stream)) {
423430 // 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
484491
485492 void AudioMixerSlave::addStream(AudioMixerClientData::MixableStream& mixableStream,
486493 AvatarAudioStream& listeningNodeStream,
487− float masterListenerGain) {
494+ float masterListenerGain, bool isSoloing) {
488495 ++stats.totalMixes;
489496
490497 auto streamToAdd = mixableStream.positionalStream;
@@ -495,9 +502,13 @@ void AudioMixerSlave::addStream(AudioMixerClientData::MixableStream& mixableStre · 4 unmodified lines
495502 glm::vec3 relativePosition = streamToAdd->getPosition() - listeningNodeStream.getPosition();
496503
497504 float distance = glm::max(glm::length(relativePosition), EPSILON);
498− float gain = computeGain(masterListenerGain, listeningNodeStream, *streamToAdd, relativePosition, distance, isEcho);
499505 float azimuth = isEcho ? 0.0f : computeAzimuth(listeningNodeStream, listeningNodeStream, relativePosition);
500506
507+ float gain = 1.0f;
508+ if (!isSoloing) {
509+ gain = computeGain(masterListenerGain, listeningNodeStream, *streamToAdd, relativePosition, distance, isEcho);
510+ }
511+
501512 const int HRTF_DATASET_INDEX = 1;
502513
503514 if (!streamToAdd->lastPopSucceeded()) {
assignment-client/src/audio/AudioMixerSlave.h+1−1
@@ -57,7 +57,7 @@ private: · 56 unmodified lines
5757 bool prepareMix(const SharedNodePointer& listener);
5858 void addStream(AudioMixerClientData::MixableStream& mixableStream,
5959 AvatarAudioStream& listeningNodeStream,
60− float masterListenerGain);
60+ float masterListenerGain, bool isSoloing);
6161 void updateHRTFParameters(AudioMixerClientData::MixableStream& mixableStream,
6262 AvatarAudioStream& listeningNodeStream,
6363 float masterListenerGain);
assignment-client/src/avatars/AvatarMixer.cpp+5−4
@@ -541,7 +541,7 @@ void AvatarMixer::handleRequestsDomainListDataPacket(QSharedPointer<ReceivedMess · 540 unmodified lines
541541 // ...For those nodes, reset the lastBroadcastTime to 0
542542 // so that the AvatarMixer will send Identity data to us
543543 [&](const SharedNodePointer& node) {
544− nodeData->setLastBroadcastTime(node->getUUID(), 0);
544+ nodeData->setLastBroadcastTime(node->getLocalID(), 0);
545545 nodeData->resetSentTraitData(node->getLocalID());
546546 }
547547 );
@@ -565,7 +565,8 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer<ReceivedMessage> mes · 17 unmodified lines
565565 // parse the identity packet and update the change timestamp if appropriate
566566 bool identityChanged = false;
567567 bool displayNameChanged = false;
568− avatar.processAvatarIdentity(message->getMessage(), identityChanged, displayNameChanged);
568+ QDataStream avatarIdentityStream(message->getMessage());
569+ avatar.processAvatarIdentity(avatarIdentityStream, identityChanged, displayNameChanged);
569570
570571 if (identityChanged) {
571572 QMutexLocker nodeDataLocker(&nodeData->getMutex());
@@ -637,7 +638,7 @@ void AvatarMixer::handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> · 65 unmodified lines
637638 // Reset the lastBroadcastTime for the ignored avatar to 0
638639 // so the AvatarMixer knows it'll have to send identity data about the ignored avatar
639640 // to the ignorer if the ignorer unignores.
640− nodeData->setLastBroadcastTime(ignoredUUID, 0);
641+ nodeData->setLastBroadcastTime(ignoredNode->getLocalID(), 0);
641642 nodeData->resetSentTraitData(ignoredNode->getLocalID());
642643 }
643644
@@ -647,7 +648,7 @@ void AvatarMixer::handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> · 3 unmodified lines
647648 // to the ignored if the ignorer unignores.
648649 AvatarMixerClientData* ignoredNodeData = reinterpret_cast<AvatarMixerClientData*>(ignoredNode->getLinkedData());
649650 if (ignoredNodeData) {
650− ignoredNodeData->setLastBroadcastTime(senderNode->getUUID(), 0);
651+ ignoredNodeData->setLastBroadcastTime(senderNode->getLocalID(), 0);
651652 ignoredNodeData->resetSentTraitData(senderNode->getLocalID());
652653 }
653654 }
assignment-client/src/avatars/AvatarMixerClientData.cpp+12−12
@@ -26,20 +26,20 @@ AvatarMixerClientData::AvatarMixerClientData(const QUuid& nodeID, Node::LocalID · 25 unmodified lines
2626 _avatar->setID(nodeID);
2727 }
2828
29−uint64_t AvatarMixerClientData::getLastOtherAvatarEncodeTime(QUuid otherAvatar) const {
30− std::unordered_map<QUuid, uint64_t>::const_iterator itr = _lastOtherAvatarEncodeTime.find(otherAvatar);
29+uint64_t AvatarMixerClientData::getLastOtherAvatarEncodeTime(NLPacket::LocalID otherAvatar) const {
30+ const auto itr = _lastOtherAvatarEncodeTime.find(otherAvatar);
3131 if (itr != _lastOtherAvatarEncodeTime.end()) {
3232 return itr->second;
3333 }
3434 return 0;
3535 }
3636
37−void AvatarMixerClientData::setLastOtherAvatarEncodeTime(const QUuid& otherAvatar, uint64_t time) {
38− std::unordered_map<QUuid, uint64_t>::iterator itr = _lastOtherAvatarEncodeTime.find(otherAvatar);
37+void AvatarMixerClientData::setLastOtherAvatarEncodeTime(NLPacket::LocalID otherAvatar, uint64_t time) {
38+ auto itr = _lastOtherAvatarEncodeTime.find(otherAvatar);
3939 if (itr != _lastOtherAvatarEncodeTime.end()) {
4040 itr->second = time;
4141 } else {
42− _lastOtherAvatarEncodeTime.emplace(std::pair<QUuid, uint64_t>(otherAvatar, time));
42+ _lastOtherAvatarEncodeTime.emplace(std::pair<NLPacket::LocalID, uint64_t>(otherAvatar, time));
4343 }
4444 }
4545
@@ -220,7 +220,7 @@ void AvatarMixerClientData::checkSkeletonURLAgainstWhitelist(const SlaveSharedDa · 174 unmodified lines
220220 }
221221 }
222222
223−uint64_t AvatarMixerClientData::getLastBroadcastTime(const QUuid& nodeUUID) const {
223+uint64_t AvatarMixerClientData::getLastBroadcastTime(NLPacket::LocalID nodeUUID) const {
224224 // return the matching PacketSequenceNumber, or the default if we don't have it
225225 auto nodeMatch = _lastBroadcastTimes.find(nodeUUID);
226226 if (nodeMatch != _lastBroadcastTimes.end()) {
@@ -229,9 +229,9 @@ uint64_t AvatarMixerClientData::getLastBroadcastTime(const QUuid& nodeUUID) cons · 2 unmodified lines
229229 return 0;
230230 }
231231
232−uint16_t AvatarMixerClientData::getLastBroadcastSequenceNumber(const QUuid& nodeUUID) const {
232+uint16_t AvatarMixerClientData::getLastBroadcastSequenceNumber(NLPacket::LocalID nodeID) const {
233233 // 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);
235235 if (nodeMatch != _lastBroadcastSequenceNumbers.end()) {
236236 return nodeMatch->second;
237237 }
@@ -252,7 +252,7 @@ void AvatarMixerClientData::ignoreOther(const Node* self, const Node* other) { · 14 unmodified lines
252252 } else {
253253 killPacket->writePrimitive(KillAvatarReason::YourAvatarEnteredTheirBubble);
254254 }
255− setLastBroadcastTime(other->getUUID(), 0);
255+ setLastBroadcastTime(other->getLocalID(), 0);
256256
257257 resetSentTraitData(other->getLocalID());
258258
@@ -331,9 +331,9 @@ AvatarMixerClientData::TraitsCheckTimestamp AvatarMixerClientData::getLastOtherA · 72 unmodified lines
331331 }
332332 }
333333
334−void AvatarMixerClientData::cleanupKilledNode(const QUuid& nodeUUID, Node::LocalID nodeLocalID) {
335− removeLastBroadcastSequenceNumber(nodeUUID);
336− removeLastBroadcastTime(nodeUUID);
334+void AvatarMixerClientData::cleanupKilledNode(const QUuid&, Node::LocalID nodeLocalID) {
335+ removeLastBroadcastSequenceNumber(nodeLocalID);
336+ removeLastBroadcastTime(nodeLocalID);
337337 _lastSentTraitsTimestamps.erase(nodeLocalID);
338338 _sentTraitVersions.erase(nodeLocalID);
339339 }
assignment-client/src/avatars/AvatarMixerClientData.h+15−16
@@ -49,17 +49,16 @@ public: · 48 unmodified lines
4949 const AvatarData* getConstAvatarData() const { return _avatar.get(); }
5050 AvatarSharedPointer getAvatarSharedPointer() const { return _avatar; }
5151
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); }
5256 bool isIgnoreRadiusEnabled() const { return _isIgnoreRadiusEnabled; }
5357 void setIsIgnoreRadiusEnabled(bool enabled) { _isIgnoreRadiusEnabled = enabled; }
5458
55− uint16_t getLastBroadcastSequenceNumber(const QUuid& nodeUUID) const;
56− void setLastBroadcastSequenceNumber(const QUuid& nodeUUID, uint16_t sequenceNumber)
57− { _lastBroadcastSequenceNumbers[nodeUUID] = sequenceNumber; }
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); }
59+ uint64_t getLastBroadcastTime(NLPacket::LocalID nodeUUID) const;
60+ void setLastBroadcastTime(NLPacket::LocalID nodeUUID, uint64_t broadcastTime) { _lastBroadcastTimes[nodeUUID] = broadcastTime; }
61+ Q_INVOKABLE void removeLastBroadcastTime(NLPacket::LocalID nodeUUID) { _lastBroadcastTimes.erase(nodeUUID); }
6362
6463 Q_INVOKABLE void cleanupKilledNode(const QUuid& nodeUUID, Node::LocalID nodeLocalID);
6564
@@ -93,7 +92,7 @@ public: · 27 unmodified lines
9392
9493 void loadJSONStats(QJsonObject& jsonObject) const;
9594
96− glm::vec3 getPosition() const { return _avatar ? _avatar->getWorldPosition() : glm::vec3(0); }
95+ glm::vec3 getPosition() const { return _avatar ? _avatar->getClientGlobalPosition() : glm::vec3(0); }
9796 bool isRadiusIgnoring(const QUuid& other) const;
9897 void addToRadiusIgnoringSet(const QUuid& other);
9998 void removeFromRadiusIgnoringSet(const QUuid& other);
@@ -114,10 +113,10 @@ public: · 14 unmodified lines
114113
115114 const ConicalViewFrustums& getViewFrustums() const { return _currentViewFrustums; }
116115
117− uint64_t getLastOtherAvatarEncodeTime(QUuid otherAvatar) const;
118− void setLastOtherAvatarEncodeTime(const QUuid& otherAvatar, uint64_t time);
116+ uint64_t getLastOtherAvatarEncodeTime(NLPacket::LocalID otherAvatar) const;
117+ void setLastOtherAvatarEncodeTime(NLPacket::LocalID otherAvatar, uint64_t time);
119118
120− QVector<JointData>& getLastOtherAvatarSentJoints(QUuid otherAvatar) { return _lastOtherAvatarSentJoints[otherAvatar]; }
119+ QVector<JointData>& getLastOtherAvatarSentJoints(NLPacket::LocalID otherAvatar) { return _lastOtherAvatarSentJoints[otherAvatar]; }
121120
122121 void queuePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer node);
123122 int processPackets(const SlaveSharedData& slaveSharedData); // returns number of packets processed
@@ -150,13 +149,13 @@ private: · 26 unmodified lines
150149 AvatarSharedPointer _avatar { new AvatarData() };
151150
152151 uint16_t _lastReceivedSequenceNumber { 0 };
153− std::unordered_map<QUuid, uint16_t> _lastBroadcastSequenceNumbers;
154− std::unordered_map<QUuid, uint64_t> _lastBroadcastTimes;
152+ std::unordered_map<NLPacket::LocalID, uint16_t> _lastBroadcastSequenceNumbers;
153+ std::unordered_map<NLPacket::LocalID, uint64_t> _lastBroadcastTimes;
155154
156155 // this is a map of the last time we encoded an "other" avatar for
157156 // sending to "this" node
158− std::unordered_map<QUuid, uint64_t> _lastOtherAvatarEncodeTime;
159− std::unordered_map<QUuid, QVector<JointData>> _lastOtherAvatarSentJoints;
157+ std::unordered_map<NLPacket::LocalID, uint64_t> _lastOtherAvatarEncodeTime;
158+ std::unordered_map<NLPacket::LocalID, QVector<JointData>> _lastOtherAvatarSentJoints;
160159
161160 uint64_t _identityChangeTimestamp;
162161 bool _avatarSessionDisplayNameMustChange{ true };
assignment-client/src/avatars/AvatarMixerSlave.cpp+81−101
@@ -68,13 +68,11 @@ void AvatarMixerSlave::processIncomingPackets(const SharedNodePointer& node) { · 67 unmodified lines
6868 _stats.processIncomingPacketsElapsedTime += (end - start);
6969 }
7070
71−int AvatarMixerSlave::sendIdentityPacket(const AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode) {
72− if (destinationNode->getType() == NodeType::Agent && !destinationNode->isUpstream()) {
71+int AvatarMixerSlave::sendIdentityPacket(NLPacketList& packetList, const AvatarMixerClientData* nodeData, const Node& destinationNode) {
72+ if (destinationNode.getType() == NodeType::Agent && !destinationNode.isUpstream()) {
7373 QByteArray individualData = nodeData->getConstAvatarData()->identityByteArray();
7474 individualData.replace(0, NUM_BYTES_RFC4122_UUID, nodeData->getNodeID().toRfc4122()); // FIXME, this looks suspicious
75− auto identityPackets = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true);
76− identityPackets->write(individualData);
77− DependencyManager::get<NodeList>()->sendPacketList(std::move(identityPackets), *destinationNode);
75+ packetList.write(individualData);
7876 _stats.numIdentityPackets++;
7977 return individualData.size();
8078 } else {
@@ -247,12 +245,12 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 166 unmodified lines
247245 // reset the internal state for correct random number distribution
248246 distribution.reset();
249247
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+
250251 // reset the number of sent avatars
251252 nodeData->resetNumAvatarsSentLastFrame();
252253
253− // keep a counter of the number of considered avatars
254− int numOtherAvatars = 0;
255−
256254 // keep track of outbound data rate specifically for avatar data
257255 int numAvatarDataBytes = 0;
258256 int identityBytesSent = 0;
@@ -261,7 +259,6 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 2 unmodified lines
261259 // max number of avatarBytes per frame
262260 int maxAvatarBytesPerFrame = int(_maxKbpsPerNode * BYTES_PER_KILOBIT / AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND);
263261
264−
265262 // keep track of the number of other avatars held back in this frame
266263 int numAvatarsHeldBack = 0;
267264
@@ -279,10 +276,6 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 11 unmodified lines
279276 int minimumBytesPerAvatar = PALIsOpen ? AvatarDataPacket::AVATAR_HAS_FLAGS_SIZE + NUM_BYTES_RFC4122_UUID +
280277 sizeof(AvatarDataPacket::AvatarGlobalPosition) + sizeof(AvatarDataPacket::AudioLoudness) : 0;
281278
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−
286279 // compute node bounding box
287280 const float MY_AVATAR_BUBBLE_EXPANSION_FACTOR = 4.0f; // magic number determined emperically
288281 AABox nodeBox = computeBubbleBox(avatar, MY_AVATAR_BUBBLE_EXPANSION_FACTOR);
@@ -350,8 +343,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 61 unmodified lines
350343 // Don't bother with these checks if the other avatar has their bubble enabled and we're gettingAnyIgnored
351344 if (nodeData->isIgnoreRadiusEnabled() || (avatarClientNodeData->isIgnoreRadiusEnabled() && !getsAnyIgnored)) {
352345 // Perform the collision check between the two bounding boxes
353− const float OTHER_AVATAR_BUBBLE_EXPANSION_FACTOR = 2.4f; // magic number determined empirically
354− AABox otherNodeBox = computeBubbleBox(avatarClientNodeData->getAvatar(), OTHER_AVATAR_BUBBLE_EXPANSION_FACTOR);
346+ AABox otherNodeBox = avatarClientNodeData->getAvatar().getDefaultBubbleBox();
355347 if (nodeBox.touches(otherNodeBox)) {
356348 nodeData->ignoreOther(destinationNode, avatarNode);
357349 shouldIgnore = !getsAnyIgnored;
@@ -364,7 +356,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 6 unmodified lines
364356 }
365357
366358 if (!shouldIgnore) {
367− AvatarDataSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(avatarNode->getUUID());
359+ AvatarDataSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(avatarNode->getLocalID());
368360 AvatarDataSequenceNumber lastSeqFromSender = avatarClientNodeData->getLastReceivedSequenceNumber();
369361
370362 // 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
396388 if (!shouldIgnore) {
397389 // sort this one for later
398390 const AvatarData* avatarNodeData = avatarClientNodeData->getConstAvatarData();
399− auto lastEncodeTime = nodeData->getLastOtherAvatarEncodeTime(avatarNodeData->getSessionUUID());
391+ auto lastEncodeTime = nodeData->getLastOtherAvatarEncodeTime(avatarNode->getLocalID());
400392
401393 sortedAvatars.push(SortableAvatar(avatarNodeData, avatarNode, lastEncodeTime));
402394 }
@@ -406,8 +398,13 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 3 unmodified lines
406398
407399 int remainingAvatars = (int)sortedAvatars.size();
408400 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);
409406
410− const auto& sortedAvatarVector = sortedAvatars.getSortedVector();
407+ const auto& sortedAvatarVector = sortedAvatars.getSortedVector(numToSendEst);
411408 for (const auto& sortedAvatar : sortedAvatarVector) {
412409 const Node* otherNode = sortedAvatar.getNode();
413410 auto lastEncodeForOther = sortedAvatar.getTimestamp();
@@ -432,21 +429,9 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 18 unmodified lines
432429
433430 auto startAvatarDataPacking = chrono::high_resolution_clock::now();
434431
435− ++numOtherAvatars;
436−
437432 const AvatarMixerClientData* otherNodeData = reinterpret_cast<const AvatarMixerClientData*>(otherNode->getLinkedData());
438433 const AvatarData* otherAvatar = otherNodeData->getConstAvatarData();
439434
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−
450435 // Typically all out-of-view avatars but such avatars' priorities will rise with time:
451436 bool isLowerPriority = sortedAvatar.getPriority() <= OUT_OF_VIEW_THRESHOLD;
452437
@@ -456,71 +441,56 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 3 unmodified lines
456441 } else if (!overBudget) {
457442 detail = distribution(generator) < AVATAR_SEND_FULL_UPDATE_RATIO ? AvatarData::SendAllData : AvatarData::CullSmallData;
458443 nodeData->incrementAvatarInView();
459− }
460444
461− bool includeThisAvatar = true;
462− QVector<JointData>& lastSentJointsForOther = nodeData->getLastOtherAvatarSentJoints(otherNode->getUUID());
463−
464− lastSentJointsForOther.resize(otherAvatar->getJointCount());
465−
466− bool distanceAdjust = true;
467− glm::vec3 viewerPosition = myPosition;
468− AvatarDataPacket::HasFlags hasFlagsOut; // the result of the toByteArray
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− }
445+ // If the time that the mixer sent AVATAR DATA about Avatar B to Avatar A is BEFORE OR EQUAL TO
446+ // the time that Avatar B flagged an IDENTITY DATA change, send IDENTITY DATA about Avatar B to Avatar A.
447+ if (otherAvatar->hasProcessedFirstIdentity()
448+ && nodeData->getLastBroadcastTime(otherNode->getLocalID()) <= otherNodeData->getIdentityChangeTimestamp()) {
449+ identityBytesSent += sendIdentityPacket(*identityPacketList, otherNodeData, *destinationNode);
450+
451+ // remember the last time we sent identity details about this other node to the receiver
452+ nodeData->setLastBroadcastTime(otherNode->getLocalID(), usecTimestampNow());
500453 }
501454 }
502455
503− if (includeThisAvatar) {
504− // start a new segment in the PacketList for this avatar
505− avatarPacketList->startSegment();
506− numAvatarDataBytes += avatarPacketList->write(otherNode->getUUID().toRfc4122());
507− numAvatarDataBytes += avatarPacketList->write(bytes);
508− avatarPacketList->endSegment();
456+ QVector<JointData>& lastSentJointsForOther = nodeData->getLastOtherAvatarSentJoints(otherNode->getLocalID());
457+
458+ const bool distanceAdjust = true;
459+ const bool dropFaceTracking = false;
460+ AvatarDataPacket::SendStatus sendStatus;
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);
509483
510− if (detail != AvatarData::NoData) {
511− _stats.numOthersIncluded++;
484+ if (detail != AvatarData::NoData) {
485+ _stats.numOthersIncluded++;
512486
513− // increment the number of avatars sent to this reciever
514− nodeData->incrementNumAvatarsSentLastFrame();
487+ // increment the number of avatars sent to this receiver
488+ nodeData->incrementNumAvatarsSentLastFrame();
515489
516− // set the last sent sequence number for this sender on the receiver
517− nodeData->setLastBroadcastSequenceNumber(otherNode->getUUID(),
518− otherNodeData->getLastReceivedSequenceNumber());
519− nodeData->setLastOtherAvatarEncodeTime(otherNode->getUUID(), 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.
490+ // set the last sent sequence number for this sender on the receiver
491+ nodeData->setLastBroadcastSequenceNumber(otherNode->getLocalID(),
492+ otherNodeData->getLastReceivedSequenceNumber());
493+ nodeData->setLastOtherAvatarEncodeTime(otherNode->getLocalID(), usecTimestampNow());
524494 }
525495
526496 auto endAvatarDataPacking = chrono::high_resolution_clock::now();
@@ -532,17 +502,21 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 5 unmodified lines
532502 remainingAvatars--;
533503 }
534504
505+ if (nodeData->getNumAvatarsSentLastFrame() > numToSendEst) {
506+ qCWarning(avatars) << "More avatars sent than upper estimate" << nodeData->getNumAvatarsSentLastFrame()
507+ << " / " << numToSendEst;
508+ }
509+
535510 quint64 startPacketSending = usecTimestampNow();
536511
537− // close the current packet so that we're always sending something
538− avatarPacketList->closeCurrentPacket(true);
512+ if (avatarPacket->getPayloadSize() != 0) {
513+ nodeList->sendPacket(std::move(avatarPacket), *destinationNode);
514+ ++numPacketsSent;
515+ }
539516
540− _stats.numPacketsSent += (int)avatarPacketList->getNumPackets();
517+ _stats.numPacketsSent += numPacketsSent;
541518 _stats.numBytesSent += numAvatarDataBytes;
542519
543− // send the avatar data PacketList
544− nodeList->sendPacketList(std::move(avatarPacketList), *destinationNode);
545−
546520 // record the bytes sent for other avatar data in the AvatarMixerClientData
547521 nodeData->recordSentAvatarData(numAvatarDataBytes);
548522
@@ -554,6 +528,12 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 5 unmodified lines
554528 nodeList->sendPacketList(std::move(traitsPacketList), *destinationNode);
555529 }
556530
531+ // Send any AvatarIdentity packets:
532+ identityPacketList->closeCurrentPacket();
533+ if (identityBytesSent > 0) {
534+ nodeList->sendPacketList(std::move(identityPacketList), *destinationNode);
535+ }
536+
557537 // record the number of avatars held back this frame
558538 nodeData->recordNumOtherAvatarStarves(numAvatarsHeldBack);
559539 nodeData->recordNumOtherAvatarSkips(numAvatarsWithSkippedFrames);
@@ -599,20 +579,20 @@ void AvatarMixerSlave::broadcastAvatarDataToDownstreamMixer(const SharedNodePoin · 39 unmodified lines
599579 // so we always send a full update for this avatar
600580
601581 quint64 start = usecTimestampNow();
602− AvatarDataPacket::HasFlags flagsOut;
582+ AvatarDataPacket::SendStatus sendStatus;
603583
604584 QVector<JointData> emptyLastJointSendData { otherAvatar->getJointCount() };
605585
606586 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);
608588 quint64 end = usecTimestampNow();
609589 _stats.toByteArrayElapsedTime += (end - start);
610590
611− auto lastBroadcastTime = nodeData->getLastBroadcastTime(agentNode->getUUID());
591+ auto lastBroadcastTime = nodeData->getLastBroadcastTime(agentNode->getLocalID());
612592 if (lastBroadcastTime <= agentNodeData->getIdentityChangeTimestamp()
613593 || (start - lastBroadcastTime) >= REBROADCAST_IDENTITY_TO_DOWNSTREAM_EVERY_US) {
614594 sendReplicatedIdentityPacket(*agentNode, agentNodeData, *node);
615− nodeData->setLastBroadcastTime(agentNode->getUUID(), start);
595+ nodeData->setLastBroadcastTime(agentNode->getLocalID(), start);
616596 }
617597
618598 // 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
630610 << "-" << avatarByteArray.size() << "bytes";
631611
632612 avatarByteArray = otherAvatar->toByteArray(AvatarData::SendAllData, 0, emptyLastJointSendData,
633− flagsOut, true, false, glm::vec3(0), nullptr);
613+ sendStatus, true, false, glm::vec3(0), nullptr, 0);
634614
635615 if (avatarByteArray.size() > maxAvatarByteArraySize) {
636616 qCWarning(avatars) << "Replicated avatar data without facial data still too large for"
637617 << otherAvatar->getSessionUUID() << "-" << avatarByteArray.size() << "bytes";
638618
639619 avatarByteArray = otherAvatar->toByteArray(AvatarData::MinimumData, 0, emptyLastJointSendData,
640− flagsOut, true, false, glm::vec3(0), nullptr);
620+ sendStatus, true, false, glm::vec3(0), nullptr, 0);
641621 }
642622 }
643623
@@ -646,7 +626,7 @@ void AvatarMixerSlave::broadcastAvatarDataToDownstreamMixer(const SharedNodePoin · 2 unmodified lines
646626 nodeData->incrementNumAvatarsSentLastFrame();
647627
648628 // set the last sent sequence number for this sender on the receiver
649− nodeData->setLastBroadcastSequenceNumber(agentNode->getUUID(),
629+ nodeData->setLastBroadcastSequenceNumber(agentNode->getLocalID(),
650630 agentNodeData->getLastReceivedSequenceNumber());
651631
652632 // increment the number of avatars sent to this reciever
assignment-client/src/avatars/AvatarMixerSlave.h+1−1
@@ -101,7 +101,7 @@ public: · 100 unmodified lines
101101 void harvestStats(AvatarMixerSlaveStats& stats);
102102
103103 private:
104− int sendIdentityPacket(const AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode);
104+ int sendIdentityPacket(NLPacketList& packet, const AvatarMixerClientData* nodeData, const Node& destinationNode);
105105 int sendReplicatedIdentityPacket(const Node& agentNode, const AvatarMixerClientData* nodeData, const Node& destinationNode);
106106
107107 qint64 addChangedTraitsToBulkPacket(AvatarMixerClientData* listeningNodeData,
assignment-client/src/avatars/ScriptableAvatar.cpp+8−8
@@ -69,10 +69,10 @@ void ScriptableAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { · 68 unmodified lines
6969 AvatarData::setSkeletonModelURL(skeletonModelURL);
7070 }
7171
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) {
7373 glm::mat4 translationMat = glm::translate(translation);
74− glm::mat4 rotationMat = glm::mat4_cast(fbxJoint.preRotation * rotation * fbxJoint.postRotation);
75− glm::mat4 finalMat = translationMat * fbxJoint.preTransform * rotationMat * fbxJoint.postTransform;
74+ glm::mat4 rotationMat = glm::mat4_cast(joint.preRotation * rotation * joint.postRotation);
75+ glm::mat4 finalMat = translationMat * joint.preTransform * rotationMat * joint.postTransform;
7676 return AnimPose(finalMat);
7777 }
7878
@@ -84,7 +84,7 @@ void ScriptableAvatar::update(float deltatime) { · 5 unmodified lines
8484 // Run animation
8585 if (_animation && _animation->isLoaded() && _animation->getFrames().size() > 0 && !_bind.isNull() && _bind->isLoaded()) {
8686 if (!_animSkeleton) {
87− _animSkeleton = std::make_shared<AnimSkeleton>(_bind->getGeometry());
87+ _animSkeleton = std::make_shared<AnimSkeleton>(_bind->getHFMModel());
8888 }
8989 float currentFrame = _animationDetails.currentFrame + deltatime * _animationDetails.fps;
9090 if (_animationDetails.loop || currentFrame < _animationDetails.lastFrame) {
@@ -93,7 +93,7 @@ void ScriptableAvatar::update(float deltatime) { · 2 unmodified lines
9393 }
9494 _animationDetails.currentFrame = currentFrame;
9595
96− const QVector<FBXJoint>& modelJoints = _bind->getGeometry().joints;
96+ const QVector<HFMJoint>& modelJoints = _bind->getHFMModel().joints;
9797 QStringList animationJointNames = _animation->getJointNames();
9898
9999 const int nJoints = modelJoints.size();
@@ -102,8 +102,8 @@ void ScriptableAvatar::update(float deltatime) { · 2 unmodified lines
102102 }
103103
104104 const int frameCount = _animation->getFrames().size();
105− const FBXAnimationFrame& floorFrame = _animation->getFrames().at((int)glm::floor(currentFrame) % frameCount);
106− const FBXAnimationFrame& ceilFrame = _animation->getFrames().at((int)glm::ceil(currentFrame) % frameCount);
105+ const HFMAnimationFrame& floorFrame = _animation->getFrames().at((int)glm::floor(currentFrame) % frameCount);
106+ const HFMAnimationFrame& ceilFrame = _animation->getFrames().at((int)glm::ceil(currentFrame) % frameCount);
107107 const float frameFraction = glm::fract(currentFrame);
108108 std::vector<AnimPose> poses = _animSkeleton->getRelativeDefaultPoses();
109109
@@ -113,7 +113,7 @@ void ScriptableAvatar::update(float deltatime) { · 3 unmodified lines
113113 const QString& name = animationJointNames[i];
114114 // As long as we need the model preRotations anyway, let's get the jointIndex from the bind skeleton rather than
115115 // 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);
117117 if (mapping != -1 && !_maskedJoints.contains(name)) {
118118
119119 AnimPose floorPose = composeAnimPose(modelJoints[mapping], floorFrame.rotations[i], floorFrame.translations[i] * UNIT_SCALE);
cmake/externals/boostconfig/CMakeLists.txt+0−20
@@ -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")
cmake/externals/bullet/CMakeLists.txt+0−85
@@ -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 ()
cmake/externals/draco/CMakeLists.txt+0−41
@@ -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")
cmake/externals/etc2comp/CMakeLists.txt+0−58
@@ -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
cmake/externals/gli/CMakeLists.txt+0−21
@@ -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")
cmake/externals/glm/CMakeLists.txt+0−21
@@ -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")
cmake/externals/glslang/CMakeLists.txt+0−42
@@ -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")
cmake/externals/json/CMakeLists.txt+0−22
@@ -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")
cmake/externals/nvtt/CMakeLists.txt+0−87
@@ -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")
cmake/externals/openvr/CMakeLists.txt+0−49
@@ -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−
cmake/externals/quazip/CMakeLists.txt+8−5
@@ -3,7 +3,14 @@ string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) · 2 unmodified lines
33
44 include(ExternalProject)
55
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)
714
815 if (NOT APPLE)
916 set(QUAZIP_CMAKE_ARGS ${QUAZIP_CMAKE_ARGS} -DCMAKE_CXX_STANDARD=11)
@@ -20,10 +27,6 @@ ExternalProject_Add( · 10 unmodified lines
2027 LOG_BUILD 1
2128 )
2229
23−if (WIN32)
24− add_dependencies(quazip zlib)
25−endif ()
26−
2730 # Hide this external target (for ide users)
2831 set_target_properties(${EXTERNAL_NAME} PROPERTIES
2932 FOLDER "hidden/externals"
cmake/externals/sdl2/CMakeLists.txt+0−90
@@ -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 ()
cmake/externals/spirv_binaries/CMakeLists.txt+0−34
@@ -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−
cmake/externals/spirv_cross/CMakeLists.txt+0−35
@@ -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")
cmake/externals/spirv_headers/CMakeLists.txt+0−18
@@ -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")
cmake/externals/spirv_tools/CMakeLists.txt+0−33
@@ -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")
cmake/externals/zlib/CMakeLists.txt+0−33
@@ -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")
cmake/macros/AutoScribeShader.cmake+10−69
@@ -14,13 +14,6 @@ macro(AUTOSCRIBE_APPEND_QRC) · 13 unmodified lines
1414 string(CONCAT SHADER_QRC "${SHADER_QRC}" "<file alias=\"${ARGV0}\">${ARGV1}</file>\n")
1515 endmacro()
1616
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−
2417 macro(AUTOSCRIBE_PLATFORM_SHADER)
2518 set(AUTOSCRIBE_PLATFORM_PATH "${ARGV0}")
2619 string(REGEX MATCH "([0-9]+(es)?)(/stereo)?" PLATFORM_PATH_REGEX ${AUTOSCRIBE_PLATFORM_PATH})
@@ -75,36 +68,6 @@ macro(AUTOSCRIBE_PLATFORM_SHADER) · 48 unmodified lines
7568 list(APPEND SHADER_GEN_LINE ${TEMP_PATH})
7669 list(APPEND SHADER_GEN_LINE ${AUTOSCRIBE_SHADER_SEEN_LIBS})
7770 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})
10871 endmacro()
10972
11073 macro(AUTOSCRIBE_SHADER)
@@ -307,38 +270,16 @@ macro(AUTOSCRIBE_SHADER_LIBS) · 196 unmodified lines
307270 set(AUTOSCRIBE_SHADERGEN_COMMANDS_FILE ${CMAKE_CURRENT_BINARY_DIR}/shadergen.txt)
308271 file(WRITE ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE} "${AUTOSCRIBE_SHADERGEN_COMMANDS}")
309272
310− # grab the SPIRV binaries we require
311− # note we don't use the normal ADD_DEPENDENCY_EXTERNAL_PROJECTS macro because only a custom command
312− # depends on these, not any of our build artifacts, so there's no valid target for the add_dependencies
313− # call in ADD_DEPENDENCY_EXTERNAL_PROJECTS to use
314− add_subdirectory(${EXTERNAL_PROJECT_DIR}/spirv_binaries ${EXTERNALS_BINARY_DIR}/spirv_binaries)
315−
316− target_python()
317−
318− # A custom python script which will generate
319− if (ANDROID)
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()
273+ # A custom python script which will generate all our shader artifacts
274+ add_custom_command(
275+ OUTPUT ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS}
276+ COMMENT "Generating/updating shaders"
277+ COMMAND ${HIFI_PYTHON_EXEC} ${CMAKE_SOURCE_DIR}/tools/shadergen.py
278+ --commands ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE}
279+ --tools-dir ${VCPKG_TOOLS_DIR}
280+ --build-dir ${CMAKE_CURRENT_BINARY_DIR}
281+ --source-dir ${CMAKE_SOURCE_DIR}
282+ DEPENDS ${AUTOSCRIBE_SHADER_HEADERS} ${CMAKE_SOURCE_DIR}/tools/shadergen.py ${ALL_SCRIBE_SHADERS})
342283
343284 add_custom_target(shadergen DEPENDS ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS})
344285 set_target_properties(shadergen PROPERTIES FOLDER "Shaders")
cmake/macros/ManuallyInstallOpenSSLForQt.cmake+2−2
@@ -19,13 +19,13 @@ macro(manually_install_openssl_for_qt) · 18 unmodified lines
1919 find_package(OpenSSL REQUIRED)
2020
2121 install(
22− FILES "${OPENSSL_DLL_PATH}/ssleay32.dll"
22+ FILES "${VCPKG_INSTALL_ROOT}/bin/ssleay32.dll"
2323 DESTINATION ${TARGET_INSTALL_DIR}
2424 COMPONENT ${TARGET_INSTALL_COMPONENT}
2525 )
2626
2727 install(
28− FILES "${OPENSSL_DLL_PATH}/libeay32.dll"
28+ FILES "${VCPKG_INSTALL_ROOT}/bin/libeay32.dll"
2929 DESTINATION ${TARGET_INSTALL_DIR}
3030 COMPONENT ${TARGET_INSTALL_COMPONENT}
3131 )
cmake/macros/TargetBullet.cmake+0−1
@@ -16,7 +16,6 @@ macro(TARGET_BULLET) · 15 unmodified lines
1616 list(APPEND BULLET_LIBRARIES ${LIB_DIR}/libLinearMath.a)
1717 list(APPEND BULLET_LIBRARIES ${LIB_DIR}/libBulletSoftBody.a)
1818 else()
19− add_dependency_external_projects(bullet)
2019 find_package(Bullet REQUIRED)
2120 endif()
2221 # perform the system include hack for OS X to ignore warnings
cmake/macros/TargetDraco.cmake+14−8
@@ -1,18 +1,24 @@
11 macro(TARGET_DRACO)
2+ set(LIBS draco dracodec dracoenc)
3+ find_library(LIBPATH ${LIB} PATHS )
24 if (ANDROID)
35 set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/draco)
46 set(DRACO_INCLUDE_DIRS "${INSTALL_DIR}/include" CACHE TYPE INTERNAL)
5−
67 set(LIB_DIR ${INSTALL_DIR}/lib)
78 list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdraco.a)
89 list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdracodec.a)
910 list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdracoenc.a)
11+ target_link_libraries(${TARGET_NAME} ${DRACO_LIBRARIES})
1012 else()
11− add_dependency_external_projects(draco)
12− find_package(Draco REQUIRED)
13− list(APPEND DRACO_LIBRARIES ${DRACO_LIBRARY})
14− list(APPEND DRACO_LIBRARIES ${DRACO_ENCODER_LIBRARY})
13+ set(LIB_SEARCH_PATH_RELEASE ${VCPKG_INSTALL_ROOT}/lib/)
14+ set(LIB_SEARCH_PATH_DEBUG ${VCPKG_INSTALL_ROOT}/debug/lib/)
15+ foreach(LIB ${LIBS})
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})
1523 endif()
16− target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${DRACO_INCLUDE_DIRS})
17− target_link_libraries(${TARGET_NAME} ${DRACO_LIBRARIES})
18−endmacro()
24+endmacro()
cmake/macros/TargetEtc2Comp.cmake+6−5
@@ -8,15 +8,16 @@ · 7 unmodified lines
88 macro(TARGET_ETC2COMP)
99 if (ANDROID)
1010 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")
1212 set(ETC2COMP_LIBRARY_DEBUG ${INSTALL_DIR}/lib/libEtcLib.a)
1313 set(ETC2COMP_LIBRARY_RELEASE ${INSTALL_DIR}/lib/libEtcLib.a)
14− select_library_configurations(ETC2COMP)
14+ target_include_directories(${TARGET_NAME} PRIVATE ${ETC2COMP_INCLUDE_DIRS})
1515 else()
16− add_dependency_external_projects(etc2comp)
17− find_package(Etc2Comp REQUIRED)
16+ find_library(ETC2COMP_LIBRARY_DEBUG EtcLib PATHS ${VCPKG_INSTALL_ROOT}/debug/lib/ NO_DEFAULT_PATH)
17+ find_library(ETC2COMP_LIBRARY_RELEASE EtcLib PATHS ${VCPKG_INSTALL_ROOT}/lib/ NO_DEFAULT_PATH)
1818 endif()
1919
20− target_include_directories(${TARGET_NAME} PRIVATE ${ETC2COMP_INCLUDE_DIRS})
20+ select_library_configurations(ETC2COMP)
2121 target_link_libraries(${TARGET_NAME} ${ETC2COMP_LIBRARIES})
2222 endmacro()
23+
cmake/macros/TargetGli.cmake+2−3
@@ -6,7 +6,6 @@ · 5 unmodified lines
66 # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
77 #
88 macro(TARGET_GLI)
9− add_dependency_external_projects(gli)
10− find_package(GLI REQUIRED)
11− target_include_directories(${TARGET_NAME} PUBLIC ${GLI_INCLUDE_DIRS})
9+ # We use vcpkg for both gli and glm, so we just re-use the target_glm macro here
10+ target_glm()
1211 endmacro()
cmake/macros/TargetGlm.cmake+6−4
@@ -7,10 +7,12 @@ · 6 unmodified lines
77 #
88 macro(TARGET_GLM)
99 if (ANDROID)
10− set(GLM_INCLUDE_DIRS "${HIFI_ANDROID_PRECOMPILED}/glm/include")
10+ target_include_directories(${TARGET_NAME} PUBLIC "${VCPKG_INSTALL_ROOT}/include")
1111 else()
12− add_dependency_external_projects(glm)
13− find_package(GLM REQUIRED)
12+ find_package(glm CONFIG REQUIRED)
13+ target_link_libraries(${TARGET_NAME} glm)
1414 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)
1618 endmacro()
cmake/macros/TargetJson.cmake+2−3
@@ -6,7 +6,6 @@ · 5 unmodified lines
66 # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
77 #
88 macro(TARGET_JSON)
9− add_dependency_external_projects(json)
10− find_package(JSON REQUIRED)
11− target_include_directories(${TARGET_NAME} PUBLIC ${JSON_INCLUDE_DIRS})
9+ # We use vcpkg for both json and glm, so we just re-use the target_glm macro here
10+ target_glm()
1211 endmacro()
cmake/macros/TargetNvtt.cmake+9−4
@@ -15,12 +15,17 @@ macro(TARGET_NVTT) · 14 unmodified lines
1515 list(APPEND NVTT_LIBS "${NVTT_LIB_DIR}/libnvimage.so")
1616 list(APPEND NVTT_LIBS "${NVTT_LIB_DIR}/libnvtt.so")
1717 set(NVTT_LIBRARIES ${NVTT_LIBS} CACHE TYPE INTERNAL)
18+ target_include_directories(${TARGET_NAME} PRIVATE ${NVTT_INCLUDE_DIRS})
1819 else()
19− add_dependency_external_projects(nvtt)
20− find_package(NVTT REQUIRED)
21− add_paths_to_fixup_libs(${NVTT_DLL_PATH})
20+ find_library(NVTT_LIBRARY_RELEASE nvtt PATHS ${VCPKG_INSTALL_ROOT}/lib NO_DEFAULT_PATH)
21+ find_library(NVTT_LIBRARY_DEBUG nvtt PATHS ${VCPKG_INSTALL_ROOT}/debug/lib NO_DEFAULT_PATH)
22+ select_library_configurations(NVTT)
2223 endif()
2324
24− target_include_directories(${TARGET_NAME} PRIVATE ${NVTT_INCLUDE_DIRS})
2525 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+
2631 endmacro()
cmake/macros/TargetOpenSSL.cmake+1−8
@@ -11,15 +11,8 @@ macro(TARGET_OPENSSL) · 10 unmodified lines
1111 set(OPENSSL_INCLUDE_DIR "${OPENSSL_INSTALL_DIR}/include" CACHE TYPE INTERNAL)
1212 set(OPENSSL_LIBRARIES "${OPENSSL_INSTALL_DIR}/lib/libcrypto.a;${OPENSSL_INSTALL_DIR}/lib/libssl.a" CACHE TYPE INTERNAL)
1313 else()
14−
14+ # using VCPKG for OpenSSL
1515 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−
2316 endif()
2417
2518 include_directories(SYSTEM "${OPENSSL_INCLUDE_DIR}")
cmake/macros/TargetOpenVR.cmake+13−0
@@ -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()
cmake/macros/TargetSDL2.cmake+8−5
@@ -6,9 +6,12 @@ · 5 unmodified lines
66 # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
77 #
88 macro(TARGET_SDL2)
9− add_dependency_external_projects(sdl2)
10− find_package(SDL2 REQUIRED)
11− target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${SDL2_INCLUDE_DIR})
12− target_link_libraries(${TARGET_NAME} ${SDL2_LIBRARY})
9+ # using VCPKG for SDL2
10+ find_package(SDL2 CONFIG REQUIRED)
11+ if (WIN32)
12+ target_link_libraries(${TARGET_NAME} SDL2::SDL2)
13+ else()
14+ target_link_libraries(${TARGET_NAME} SDL2::SDL2-static)
15+ endif()
1316 add_definitions(-DHAVE_SDL2)
14−endmacro()
17+endmacro()
cmake/macros/TargetTBB.cmake+9−4
@@ -13,12 +13,17 @@ if (ANDROID) · 12 unmodified lines
1313 set(TBB_LIBRARY ${TBB_INSTALL_DIR}/lib/release/libtbb.so CACHE FILEPATH "TBB library location")
1414 set(TBB_MALLOC_LIBRARY ${TBB_INSTALL_DIR}/lib/release/libtbbmalloc.so CACHE FILEPATH "TBB malloc library location")
1515 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)
1719 add_dependency_external_projects(tbb)
1820 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)
1927 endif()
2028
21−target_link_libraries(${TARGET_NAME} ${TBB_LIBRARIES})
22−target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${TBB_INCLUDE_DIRS})
23−
2429 endmacro()
cmake/macros/TargetVulkan.cmake+3−11
@@ -5,15 +5,7 @@ · 4 unmodified lines
55 # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
66 #
77 macro(TARGET_VULKAN)
8− find_package(Vulkan)
9−
10− if (Vulkan_FOUND)
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()
8+ find_package(Vulkan REQUIRED)
9+ target_include_directories(${TARGET_NAME} PRIVATE ${VULKAN_INCLUDE_DIR})
10+ target_link_libraries(${TARGET_NAME} ${VULKAN_LIBRARY})
1911 endmacro()
cmake/macros/TargetZlib.cmake+1−10
@@ -6,17 +6,8 @@ · 5 unmodified lines
66 # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
77 #
88 macro(TARGET_ZLIB)
9−
10− if (WIN32)
11− add_dependency_external_projects(zlib)
12− endif()
13−
9+ # using VCPKG for zlib
1410 find_package(ZLIB REQUIRED)
15−
16− if (WIN32)
17− add_paths_to_fixup_libs(${ZLIB_DLL_PATH})
18− endif()
19−
2011 target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${ZLIB_INCLUDE_DIRS})
2112 target_link_libraries(${TARGET_NAME} ${ZLIB_LIBRARIES})
2213 endmacro()
cmake/modules/FindDraco.cmake+0−30
@@ -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)
cmake/modules/FindEtc2Comp.cmake+0−37
@@ -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)
cmake/modules/FindGLEW.cmake+0−33
@@ -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)
cmake/modules/FindJSON.cmake+0−19
@@ -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)
cmake/modules/FindOpenSSL.cmake+0−174
@@ -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)
cmake/modules/FindOpenVR.cmake+0−21
@@ -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)
cmake/modules/FindSDL2.cmake+0−224
@@ -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 ()
cmake/ports/bullet3/CONTROL+3−0
@@ -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
cmake/ports/bullet3/portfile.cmake+57−0
@@ -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)
cmake/ports/draco/CONTROL+4−0
@@ -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:
cmake/ports/draco/portfile.cmake+56−0
@@ -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)
cmake/ports/etc2comp/CONTROL+3−0
@@ -0,0 +1,3 @@
1+Source: etc2comp
2+Version: 7f1843bf07825c21cab711360c1ddbad04641036
3+Description: ETC2 image compression library
cmake/ports/etc2comp/portfile.cmake+39−0
@@ -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+
cmake/ports/gli/CONTROL+4−0
@@ -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
cmake/ports/gli/portfile.cmake+19−0
@@ -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)
cmake/ports/glm/CONTROL+3−0
@@ -0,0 +1,3 @@
1+Source: glm
2+Version: 0.9.9.3
3+Description: OpenGL Mathematics (GLM) https://glm.g-truc.net
cmake/ports/glm/disable_warnings_as_error.patch+13−0
@@ -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()
cmake/ports/glm/portfile.cmake+32−0
@@ -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)
cmake/ports/glslang/CONTROL+3−0
@@ -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
cmake/ports/glslang/copyright+35−0
@@ -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+//
cmake/ports/glslang/portfile.cmake+26−0
@@ -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)
cmake/ports/hifi-client-deps/CONTROL+4−0
@@ -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
cmake/ports/hifi-client-deps/portfile.cmake+1−0
@@ -0,0 +1 @@
1+set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
cmake/ports/hifi-deps/CONTROL+4−0
@@ -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
cmake/ports/hifi-deps/portfile.cmake+1−0
@@ -0,0 +1 @@
1+set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
cmake/ports/hifi-host-tools/CONTROL+4−0
@@ -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
cmake/ports/hifi-host-tools/portfile.cmake+1−0
@@ -0,0 +1 @@
1+set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
cmake/ports/hifi-scribe/CONTROL+3−0
@@ -0,0 +1,3 @@
1+Source: hifi-scribe
2+Version: 1bd638a36ca771e5a68d01985b6389b71835cbd2
3+Description: Scribe is a language for generating glsl files from templates
cmake/ports/hifi-scribe/portfile.cmake+19−0
@@ -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+
cmake/ports/nlohmann-json/CONTROL+3−0
@@ -0,0 +1,3 @@
1+Source: nlohmann-json
2+Version: 3.3.0
3+Description: JSON for Modern C++
cmake/ports/nlohmann-json/portfile.cmake+18−0
@@ -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)
cmake/ports/nvtt/CONTROL+3−0
@@ -0,0 +1,3 @@
1+Source: nvtt
2+Version: 8c7e6b40ee5095f227b75880fabd89c99d6f34c0
3+Description: Texture processing tools with support for Direct3D 10 and 11 formats.
cmake/ports/nvtt/portfile.cmake+39−0
@@ -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)
cmake/ports/openssl-android/CONTROL+3−0
@@ -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.
cmake/ports/openssl-android/LICENSE.txt+125−0
@@ -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+
cmake/ports/openssl-android/portfile.cmake+24−0
@@ -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+
cmake/ports/openssl-unix/CMakeLists.txt+136−0
@@ -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+)
cmake/ports/openssl-unix/CONTROL+3−0
@@ -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.
cmake/ports/openssl-unix/ConfigureIncludeQuotesFix.patch+13−0
@@ -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+ {
cmake/ports/openssl-unix/EmbedSymbolsInStaticLibsZ7.patch+25−0
@@ -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';
cmake/ports/openssl-unix/STRINGIFYPatch.patch+23−0
@@ -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
cmake/ports/openssl-unix/portfile.cmake+63−0
@@ -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)
cmake/ports/openssl-unix/remove-deps.cmake+7−0
@@ -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()
cmake/ports/openssl-unix/usage+4−0
@@ -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)
cmake/ports/openssl-unix/vcpkg-cmake-wrapper.cmake+10−0
@@ -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()
cmake/ports/openssl-windows/CONTROL+3−0
@@ -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.
cmake/ports/openssl-windows/ConfigureIncludeQuotesFix.patch+13−0
@@ -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+ {
cmake/ports/openssl-windows/EmbedSymbolsInStaticLibsZ7.patch+25−0
@@ -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';
cmake/ports/openssl-windows/STRINGIFYPatch.patch+23−0
@@ -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
cmake/ports/openssl-windows/portfile.cmake+163−0
@@ -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)
cmake/ports/openssl-windows/usage+4−0
@@ -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)
cmake/ports/openssl/CONTROL+4−0
@@ -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)
cmake/ports/openssl/portfile.cmake+2−0
@@ -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/)
cmake/ports/openssl/usage+4−0
@@ -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)
cmake/ports/openvr/CONTROL+3−0
@@ -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.
cmake/ports/openvr/portfile.cmake+47−0
@@ -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)
cmake/ports/sdl2/CONTROL+3−0
@@ -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.
cmake/ports/sdl2/enable-winrt-cmake.patch+206−0
@@ -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;
cmake/ports/sdl2/export-symbols-only-in-shared-build.patch+24−0
@@ -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
cmake/ports/sdl2/portfile.cmake+79−0
@@ -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()
cmake/ports/shaderc/0001-Do-not-generate-build-version.inc.patch+30−0
@@ -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+
cmake/ports/shaderc/CMakeLists.txt+31−0
@@ -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}")
cmake/ports/shaderc/CMakeLists_spirv.txt+8−0
@@ -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}")
cmake/ports/shaderc/CONTROL+4−0
@@ -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
cmake/ports/shaderc/build-version.inc+3−0
@@ -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"
cmake/ports/shaderc/portfile.cmake+49−0
@@ -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)
cmake/ports/spirv-cross/CONTROL+3−0
@@ -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.
cmake/ports/spirv-cross/portfile.cmake+33−0
@@ -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)
cmake/ports/spirv-tools/CONTROL+3−0
@@ -0,0 +1,3 @@
1+Source: spirv-tools
2+Version: 2018.5-1
3+Description: API and commands for processing SPIR-V modules
cmake/ports/spirv-tools/portfile.cmake+43−0
@@ -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)
cmake/ports/tbb/CMakeLists.txt+18−0
@@ -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)
cmake/ports/tbb/CONTROL+3−0
@@ -0,0 +1,3 @@
1+Source: tbb
2+Version: 2018_U5-4
3+Description: Intel's Threading Building Blocks.
cmake/ports/tbb/portfile.cmake+86−0
@@ -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)
cmake/ports/tbb/usage+4−0
@@ -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)
cmake/ports/vulkanmemoryallocator/CONTROL+3−0
@@ -0,0 +1,3 @@
1+Source: vulkanmemoryallocator
2+Version: 3a7249f313b047417fbb1d36a3fbe6c3bf1505b5
3+Description: Vulkan Memory Allocator
cmake/ports/vulkanmemoryallocator/portfile.cmake+14−0
@@ -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)
cmake/ports/zlib/CONTROL+3−0
@@ -0,0 +1,3 @@
1+Source: zlib
2+Version: 1.2.11-3
3+Description: A compression library
cmake/ports/zlib/LICENSE+20−0
@@ -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
cmake/ports/zlib/cmake_dont_build_more_than_needed.patch+42−0
@@ -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()
cmake/ports/zlib/portfile.cmake+47−0
@@ -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)
cmake/ports/zlib/usage+4−0
@@ -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)
cmake/templates/NSIS.template.in+113−2
@@ -28,6 +28,78 @@ · 27 unmodified lines
2828
2929 !include "WinVer.nsh"
3030
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+
31103 ;--------------------------------
32104 ; Utilities and Functions
33105 ;--------------------------------
@@ -375,6 +447,10 @@ Var GAClientID · 341 unmodified lines
375447 !insertmacro CreateGUID $GAClientID
376448 !macroend
377449
450+!macro LogStep Category Action Label Value
451+ ${LogText} "Step: ${Category} ${Action} ${Label} ${Value}"
452+!macroend
453+
378454 !macro GoogleAnalytics Category Action Label Value
379455 ${If} "@GA_TRACKING_ID@" != ""
380456 Push $0
@@ -557,11 +633,13 @@ Var Express · 176 unmodified lines
557633 !macro MaybeSkipPage
558634 ; Check if Express is set, if so, abort the post install options page
559635 ${If} $Express == "1"
636+ ${LogText} "Express Install: Skipping Post Install Options Page"
560637 Abort
561638 ${EndIf}
562639 !macroend
563640
564641 !macro DownloadSlideshowImages
642+ ${LogText} "Download Slideshow Images"
565643 InitPluginsDir
566644
567645 Push $0
@@ -583,32 +661,40 @@ Var Express · 15 unmodified lines
583661 !macroend
584662
585663 Function OnUserAbort
664+ !insertmacro LogStep "Installer" "Abort" "User Abort" ""
586665 !insertmacro GoogleAnalytics "Installer" "Abort" "User Abort" ""
587666 FunctionEnd
588667 Function PageWelcomePre
668+ !insertmacro LogStep "Installer" "Welcome" "" ""
589669 !insertmacro GoogleAnalytics "Installer" "Welcome" "" ""
590670 !insertmacro DownloadSlideshowImages
591671 FunctionEnd
592672 Function PageLicensePre
673+ !insertmacro LogStep "Installer" "License" "" ""
593674 !insertmacro GoogleAnalytics "Installer" "License" "" ""
594675 FunctionEnd
595676 Function PageDirectoryPre
596677 !insertmacro MaybeSkipPage
678+ !insertmacro LogStep "Installer" "Directory" "" ""
597679 !insertmacro GoogleAnalytics "Installer" "Directory" "" ""
598680 FunctionEnd
599681 Function PageStartMenuPre
600682 !insertmacro MaybeSkipPage
683+ !insertmacro LogStep "Installer" "StartMenu" "" ""
601684 !insertmacro GoogleAnalytics "Installer" "StartMenu" "" ""
602685 FunctionEnd
603686 Function PageComponentsPre
604687 !insertmacro MaybeSkipPage
688+ !insertmacro LogStep "Installer" "Components" "" ""
605689 !insertmacro GoogleAnalytics "Installer" "Components" "" ""
606690 FunctionEnd
607691 Function PageInstallFilesPre
692+ !insertmacro LogStep "Installer" "Install" "" ""
608693 !insertmacro GoogleAnalytics "Installer" "Install" "" ""
609694 FunctionEnd
610695
611696 !macro SetInstallOption Checkbox OptionName Default
697+ ${LogText} "SetInstallOption ${OptionName} ${Default}"
612698 ; reads the value for the given install option to the registry
613699 ReadRegStr $0 HKLM "@REGISTRY_HKLM_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\@POST_INSTALL_OPTIONS_REG_GROUP@" "${OptionName}"
614700
@@ -625,6 +711,7 @@ FunctionEnd · 10 unmodified lines
625711 !macroend
626712
627713 Function InstallTypesPage
714+ !insertmacro LogStep "Installer" "Install Types" "" ""
628715 !insertmacro GoogleAnalytics "Installer" "Install Types" "" ""
629716
630717 !insertmacro MUI_HEADER_TEXT "Choose Installation Type" "Express or Custom Install"
@@ -688,6 +775,7 @@ FunctionEnd · 57 unmodified lines
688775
689776 Function StartInstallSlideshow
690777 ; create a slideshow file based on what files we have available
778+ ${LogText} "Start Installs Slideshow"
691779
692780 ; stash $0 and $1
693781 Push $0
@@ -730,7 +818,11 @@ Function StartInstallSlideshow · 36 unmodified lines
730818 FunctionEnd
731819
732820 Function PostInstallOptionsPage
821+
822+ ${LogText} "Install Directory: $INSTDIR"
823+
733824 !insertmacro MaybeSkipPage
825+ !insertmacro LogStep "Installer" "Post Install Options" "" ""
734826 !insertmacro GoogleAnalytics "Installer" "Post Install Options" "" ""
735827
736828 !insertmacro MUI_HEADER_TEXT "Setup Options" ""
@@ -876,30 +968,43 @@ Function ReadPostInstallOptions · 139 unmodified lines
876968
877969 ; check if the user asked for a desktop shortcut to console
878970 ${NSD_GetState} $DesktopConsoleCheckbox $DesktopConsoleState
879−
971+ ${LogText} "Option: Start Desktop Console: $DesktopConsoleState"
972+
880973 ; check if the user asked to have console launched every startup
881974 ${NSD_GetState} $ConsoleStartupCheckbox $ConsoleStartupState
975+ ${LogText} "Option: Start Desktop Console On Startup: $ConsoleStartupState"
882976
977+ ${If} @SERVER_COMPONENT_CONDITIONAL@
978+ ${LogText} "Option: Install Server"
979+ ${EndIf}
980+
883981 ${If} @CLIENT_COMPONENT_CONDITIONAL@
982+ ${LogText} "Option: Install Client"
884983 ; check if the user asked for a desktop shortcut to High Fidelity
885984 ${NSD_GetState} $DesktopClientCheckbox $DesktopClientState
985+ ${LogText} "Option: Create Client Desktop Shortcut: $DesktopClientState"
886986 ${EndIf}
887987
888988 ${If} @PR_BUILD@ == 1
989+ ${LogText} "Option: PR Build"
889990 ; check if we need to copy settings/content from production for this PR build
890991 ${NSD_GetState} $CopyFromProductionCheckbox $CopyFromProductionState
992+ ${LogText} "Option: Copy Settings From Production: $CopyFromProductionState"
891993 ${EndIf}
892994
893995 ; check if we need to launch the console post-install
894996 ${NSD_GetState} $LaunchConsoleNowCheckbox $LaunchConsoleNowState
997+ ${LogText} "Option: Launch Console Now: $LaunchConsoleNowState"
895998
896999 ${If} @CLIENT_COMPONENT_CONDITIONAL@
8971000 ; check if we need to launch the client post-install
8981001 ${NSD_GetState} $LaunchClientNowCheckbox $LaunchClientNowState
1002+ ${LogText} "Option: Launch Client Now: $LaunchClientNowState"
8991003 ${EndIf}
9001004
9011005 ; check if the user asked for a clean install
9021006 ${NSD_GetState} $CleanInstallCheckbox $CleanInstallState
1007+ ${LogText} "Option: Clean Install: $CleanInstallState"
9031008 FunctionEnd
9041009
9051010 Function HandlePostInstallOptions
@@ -1225,6 +1330,7 @@ Section "-Core installation" · 319 unmodified lines
12251330 ; Handle whichever post install options were set
12261331 Call HandlePostInstallOptions
12271332
1333+ !insertmacro LogStep "Installer" "Done" "" ""
12281334 !insertmacro GoogleAnalytics "Installer" "Done" "" ""
12291335 SectionEnd
12301336
@@ -1232,7 +1338,6 @@ SectionEnd · 1 unmodified line
12321338
12331339 !macro PromptForRunningApplication applicationName displayName action prompter
12341340 !define UniqueID ${__LINE__}
1235−
12361341 Prompt_${UniqueID}:
12371342
12381343 ${nsProcess::FindProcess} ${applicationName} $R0
@@ -1478,6 +1583,11 @@ InstallDirRegKey HKLM "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_RE · 239 unmodified lines
14781583
14791584 Function .onInit
14801585
1586+ Delete "$TEMP\hifi_install.log"
1587+ ${LogSetFileName} "$TEMP\hifi_install.log"
1588+ ${LogSetOn}
1589+ ${LogText} "In .onInit"
1590+
14811591 !ifdef INNER
14821592 ; If INNER is defined, then we aren't supposed to do anything except write out
14831593 ; the installer. This is better than processing a command line option as it means
@@ -1495,6 +1605,7 @@ Function .onInit · 11 unmodified lines
14951605 !insertmacro GoogleAnalytics "Installer" "Start" "$CampaignName" ""
14961606
14971607 ; make sure none of the installed applications are still running
1608+ ${LogText} "Checking For Running Applications"
14981609 !insertmacro CheckForRunningApplications "installed" "Installer"
14991610 ${nsProcess::Unload}
15001611
domain-server/CMakeLists.txt+2−24
@@ -27,30 +27,8 @@ include_hifi_library_headers(graphics) · 26 unmodified lines
2727 link_hifi_libraries(embedded-webserver networking shared avatars octree)
2828
2929 target_zlib()
30−
31−add_dependency_external_projects(quazip)
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})
30+target_quazip()
31+target_openssl()
5432
5533 # libcrypto uses dlopen in libdl
5634 if (UNIX)
domain-server/src/AssetsBackupHandler.cpp+9−0
@@ -15,9 +15,18 @@ · 14 unmodified lines
1515 #include <QDate>
1616 #include <QtCore/QLoggingCategory>
1717
18+#if !defined(__clang__) && defined(__GNUC__)
19+#pragma GCC diagnostic push
20+#pragma GCC diagnostic ignored "-Wsuggest-override"
21+#endif
22+
1823 #include <quazip5/quazipfile.h>
1924 #include <quazip5/quazipdir.h>
2025
26+#if !defined(__clang__) && defined(__GNUC__)
27+#pragma GCC diagnostic pop
28+#endif
29+
2130 #include <AssetClient.h>
2231 #include <AssetRequest.h>
2332 #include <AssetUpload.h>
domain-server/src/ContentSettingsBackupHandler.cpp+11−0
@@ -11,8 +11,19 @@ · 10 unmodified lines
1111
1212 #include "ContentSettingsBackupHandler.h"
1313
14+#if !defined(__clang__) && defined(__GNUC__)
15+#pragma GCC diagnostic push
16+#pragma GCC diagnostic ignored "-Wsuggest-override"
17+#endif
18+
1419 #include <quazip5/quazip.h>
1520 #include <quazip5/quazipfile.h>
21+#include <quazip5/quazipdir.h>
22+
23+#if !defined(__clang__) && defined(__GNUC__)
24+#pragma GCC diagnostic pop
25+#endif
26+
1627
1728 ContentSettingsBackupHandler::ContentSettingsBackupHandler(DomainServerSettingsManager& domainServerSettingsManager) :
1829 _settingsManager(domainServerSettingsManager)
domain-server/src/EntitiesBackupHandler.cpp+9−0
@@ -13,9 +13,18 @@ · 12 unmodified lines
1313
1414 #include <QDebug>
1515
16+#if !defined(__clang__) && defined(__GNUC__)
17+#pragma GCC diagnostic push
18+#pragma GCC diagnostic ignored "-Wsuggest-override"
19+#endif
20+
1621 #include <quazip5/quazip.h>
1722 #include <quazip5/quazipfile.h>
1823
24+#if !defined(__clang__) && defined(__GNUC__)
25+#pragma GCC diagnostic pop
26+#endif
27+
1928 #include <OctreeDataUtils.h>
2029
2130 EntitiesBackupHandler::EntitiesBackupHandler(QString entitiesFilePath, QString entitiesReplacementFilePath) :
interface/CMakeLists.txt+0−2
@@ -190,8 +190,6 @@ if (WIN32) · 189 unmodified lines
190190 add_dependency_external_projects(sixense)
191191 endif ()
192192
193− add_dependency_external_projects(sdl2)
194− add_dependency_external_projects(OpenVR)
195193 add_dependency_external_projects(neuron)
196194 add_dependency_external_projects(wasapi)
197195 add_dependency_external_projects(steamworks)
interface/resources/QtWebEngine/UIDelegates/Menu.qml+2−2
@@ -1,7 +1,7 @@
11 import QtQuick 2.5
22
3−import "../../qml/controls-uit"
4−import "../../qml/styles-uit"
3+import controlsUit 1.0
4+import stylesUit 1.0
55
66 Item {
77 id: menu
interface/resources/QtWebEngine/UIDelegates/MenuItem.qml+2−2
@@ -1,7 +1,7 @@
11 import QtQuick 2.5
22
3−import "../../qml/controls-uit"
4−import "../../qml/styles-uit"
3+import controlsUit 1.0
4+import stylesUit 1.0
55
66 Item {
77 id: root
interface/resources/QtWebEngine/UIDelegates/PromptDialog.qml+2−2
@@ -1,7 +1,7 @@
11 import QtQuick 2.5
22
3−import "../../qml/controls-uit"
4−import "../../qml/styles-uit"
3+import controlsUit 1.0
4+import stylesUit 1.0
55 import "../../qml/dialogs"
66
77 QtObject {
interface/resources/avatar/animations/teleport.fbx+0−0

Binary file not shown.

interface/resources/avatar/network-animation.json+160−0
@@ -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+}
interface/resources/config/keyboard.json+2476−0
@@ -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+}
interface/resources/controllers/vive.json+15−13
@@ -51,32 +51,34 @@ · 50 unmodified lines
5151 { "from": "Vive.RSCenter", "to": "Standard.RightPrimaryThumb" },
5252 { "from": "Vive.RightApplicationMenu", "to": "Standard.RightSecondaryThumb" },
5353
54− { "from": "Vive.LeftHand", "to": "Standard.LeftHand"},
55− { "from": "Vive.RightHand", "to": "Standard.RightHand"},
54+ { "from": "Vive.LeftHand", "to": "Standard.LeftHand" },
55+ { "from": "Vive.RightHand", "to": "Standard.RightHand" },
56+ { "from": "Vive.Head", "to" : "Standard.Head" },
5657
5758 {
5859 "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}]
6061 },
61−
6262 {
6363 "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}]
6565 },
66−
6766 {
6867 "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}]
7069 },
71−
7270 {
7371 "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}]
7581 },
76−
77− { "from": "Vive.Head", "to" : "Standard.Head"},
78− { "from": "Vive.RightArm", "to" : "Standard.RightArm" },
79− { "from": "Vive.LeftArm", "to" : "Standard.LeftArm" },
8082
8183 { "from": "Vive.TrackedObject00", "to" : "Standard.TrackedObject00" },
8284 { "from": "Vive.TrackedObject01", "to" : "Standard.TrackedObject01" },
interface/resources/icons/tablet-icons/inventory-a-msg.svg+4−0
@@ -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>
interface/resources/icons/tablet-icons/inventory-a.svg+3−0
@@ -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>
interface/resources/icons/tablet-icons/inventory-i-msg.svg+4−0
@@ -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>
interface/resources/icons/tablet-icons/inventory-i.svg+3−0
@@ -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>
interface/resources/icons/tablet-icons/wallet-a-msg.svg+0−6
@@ -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>
interface/resources/icons/tablet-icons/wallet-a.svg+0−1
@@ -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>
interface/resources/icons/tablet-icons/wallet-i-msg.svg+0−16
@@ -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>
interface/resources/icons/tablet-icons/wallet-i.svg+0−14
@@ -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>
interface/resources/meshes/drumstick.fbx+0−0

Binary file not shown.

interface/resources/meshes/keyboard/SM_enter.fbx+0−0

Binary file not shown.

interface/resources/meshes/keyboard/SM_key.fbx+0−0

Binary file not shown.

interface/resources/meshes/keyboard/SM_space.fbx+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_F.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_a.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_b.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_c.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_d.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_e.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_g.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_h.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_i.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_j.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_k.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_l.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_m.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_n.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_o.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_p.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_q.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_r.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_s.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_t.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_u.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_v.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_w.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_x.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_y.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/keyCap_z.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_0.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_1.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_123.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_2.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_3.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_4.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_5.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_6.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_7.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_8.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_9.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_a.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_abc.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_ampersand.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_ast.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_at.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_b.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_backspace.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_c.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_cap.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_caret.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_close_paren.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_colon.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_comma.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_d.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_dollar.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_dquote.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_e.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_enter.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_exclam.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_exit.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_f.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_g.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_h.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_hashtag.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_i.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_j.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_k.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_l.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_m.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_min.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_n.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_o.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_open_paren.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_p.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_percentage.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_period.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_plus.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_q.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_question.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_r.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_s.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_semi.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_slash.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_squote.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_t.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_u.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_under.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_v.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_w.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_x.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_y.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/key_z.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/text_placard.png+0−0

Binary file not shown.

interface/resources/meshes/keyboard/white.png+0−0

Binary file not shown.

interface/resources/meshes/mannequin/+gles/Eyes.ktx+0−0

Binary file not shown.

interface/resources/meshes/mannequin/+gles/lambert1_Base_Color.ktx+0−0

Binary file not shown.

interface/resources/meshes/mannequin/+gles/lambert1_Normal_OpenGL.ktx+0−0

Binary file not shown.

interface/resources/meshes/mannequin/+gles/lambert1_Roughness.ktx+0−0

Binary file not shown.

interface/resources/meshes/mannequin/Eyes.texmeta.json+8−0
@@ -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+}
interface/resources/meshes/mannequin/Eyes_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.ktx+0−0

Binary file not shown.

interface/resources/meshes/mannequin/Eyes_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT.ktxrenamed from interface/resources/meshes/mannequin/Eyes_bcn.ktx+0−0

File renamed without changes.

interface/resources/meshes/mannequin/StingrayPBS10_Base_Color.png+0−0

Binary file not shown.

interface/resources/meshes/mannequin/StingrayPBS10_Base_Color_bcn.ktx+0−0

Binary file not shown.

interface/resources/meshes/mannequin/StingrayPBS10_Normal_OpenGL.png+0−0

Binary file not shown.

interface/resources/meshes/mannequin/StingrayPBS10_Normal_OpenGL_bcn.ktx+0−0

Binary file not shown.

interface/resources/meshes/mannequin/lambert1_Base_Color.png+0−0

Binary file not shown.

interface/resources/meshes/mannequin/lambert1_Base_Color.texmeta.json+8−0
@@ -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+}
interface/resources/meshes/mannequin/lambert1_Base_Color_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.ktx+0−0

Binary file not shown.

interface/resources/meshes/mannequin/lambert1_Base_Color_COMPRESSED_SRGB_S3TC_DXT1_EXT.ktx+0−0

Binary file not shown.

interface/resources/meshes/mannequin/lambert1_Normal_OpenGL.png+0−0

Binary file not shown.

interface/resources/meshes/mannequin/lambert1_Normal_OpenGL.texmeta.json+8−0
@@ -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+}
interface/resources/meshes/mannequin/lambert1_Normal_OpenGL_COMPRESSED_RG11_EAC.ktx+0−0

Binary file not shown.

interface/resources/meshes/mannequin/lambert1_Normal_OpenGL_COMPRESSED_RG_RGTC2.ktx+0−0

Binary file not shown.

interface/resources/meshes/mannequin/lambert1_Roughness.png+0−0

Binary file not shown.

interface/resources/meshes/mannequin/lambert1_Roughness.texmeta.json+8−0
@@ -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+}
interface/resources/meshes/mannequin/lambert1_Roughness_COMPRESSED_R11_EAC.ktx+0−0

Binary file not shown.

interface/resources/meshes/mannequin/lambert1_Roughness_COMPRESSED_RED_RGTC1.ktx+0−0

Binary file not shown.

interface/resources/meshes/mannequin/lambert1_Roughness_bcn.ktx+0−0

Binary file not shown.

interface/resources/meshes/mannequin/mannequin.baked.fbx+0−0

Binary file not shown.

interface/resources/qml/+android/Stats.qml+1−0
@@ -10,6 +10,7 @@ Item { · 9 unmodified lines
1010 property int modality: Qt.NonModal
1111 implicitHeight: row.height
1212 implicitWidth: row.width
13+ visible: false
1314
1415 Component.onCompleted: {
1516 stats.parentChanged.connect(fill);
interface/resources/qml/AudioScopeUI.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.5
1212 import QtQuick.Controls 1.4
13−import "styles-uit"
14−import "controls-uit" as HifiControlsUit
13+import stylesUit 1.0
14+import controlsUit 1.0 as HifiControlsUit
1515
1616 Item {
1717 id: root
interface/resources/qml/Browser.qml+2−2
@@ -2,9 +2,9 @@ import QtQuick 2.5 · 1 unmodified line
22 import QtWebChannel 1.0
33 import QtWebEngine 1.5
44
5−import "controls-uit"
5+import controlsUit 1.0
66 import "styles" as HifiStyles
7−import "styles-uit"
7+import stylesUit 1.0
88 import "windows"
99
1010 ScrollingWindow {
interface/resources/qml/CurrentAPI.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.5
1212 import QtQuick.Controls 1.4
13−import "styles-uit"
14−import "controls-uit" as HifiControls
13+import stylesUit 1.0
14+import controlsUit 1.0 as HifiControls
1515
1616 Item {
1717 id: root
interface/resources/qml/InfoView.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212 import Hifi 1.0 as Hifi
1313
14−import "controls-uit"
14+import controlsUit 1.0
1515 import "windows" as Windows
1616
1717 Windows.ScrollingWindow {
interface/resources/qml/InteractiveWindow.qml+2−2
@@ -12,9 +12,9 @@ import QtQuick 2.3 · 11 unmodified lines
1212
1313 import "windows" as Windows
1414 import "controls"
15−import "controls-uit" as Controls
15+import controlsUit 1.0 as Controls
1616 import "styles"
17−import "styles-uit"
17+import stylesUit 1.0
1818
1919 Windows.Window {
2020 id: root;
interface/resources/qml/LoginDialog.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
1111 import Hifi 1.0
1212 import QtQuick 2.4
1313
14−import "controls-uit"
15−import "styles-uit"
14+import controlsUit 1.0
15+import stylesUit 1.0
1616 import "windows"
1717
1818 import "LoginDialog"
interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml+2−2
@@ -13,8 +13,8 @@ import QtQuick 2.4 · 12 unmodified lines
1313 import QtQuick.Controls 1.4
1414 import QtQuick.Controls.Styles 1.4 as OriginalStyles
1515
16−import "../../controls-uit"
17−import "../../styles-uit"
16+import controlsUit 1.0
17+import stylesUit 1.0
1818
1919 Item {
2020 id: linkAccountBody
interface/resources/qml/LoginDialog/+android/SignUpBody.qml+2−2
@@ -13,8 +13,8 @@ import QtQuick 2.4 · 12 unmodified lines
1313 import QtQuick.Controls 1.4
1414 import QtQuick.Controls.Styles 1.4 as OriginalStyles
1515
16−import "../../controls-uit"
17−import "../../styles-uit"
16+import controlsUit 1.0
17+import stylesUit 1.0
1818
1919 Item {
2020 id: signupBody
interface/resources/qml/LoginDialog/CompleteProfileBody.qml+2−2
@@ -12,8 +12,8 @@ import Hifi 1.0 · 11 unmodified lines
1212 import QtQuick 2.4
1313 import QtQuick.Controls.Styles 1.4 as OriginalStyles
1414
15−import "../controls-uit"
16−import "../styles-uit"
15+import controlsUit 1.0
16+import stylesUit 1.0
1717
1818 Item {
1919 id: completeProfileBody
interface/resources/qml/LoginDialog/LinkAccountBody.qml+21−13
@@ -13,8 +13,9 @@ import QtQuick 2.7 · 12 unmodified lines
1313 import QtQuick.Controls 1.4
1414 import QtQuick.Controls.Styles 1.4 as OriginalStyles
1515
16−import "../controls-uit"
17−import "../styles-uit"
16+import controlsUit 1.0
17+import stylesUit 1.0
18+
1819 Item {
1920 id: linkAccountBody
2021 clip: true
@@ -96,7 +97,7 @@ Item { · 75 unmodified lines
9697 topMargin: hifi.dimensions.contentSpacing.y
9798 }
9899
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!")
100101 width: parent.width
101102 wrapMode: Text.WordWrap
102103 lineHeight: 1
@@ -136,7 +137,7 @@ Item { · 33 unmodified lines
136137
137138 TextField {
138139 id: usernameField
139− text: Settings.getValue("wallet/savedUsername", "");
140+ text: Settings.getValue("keepMeLoggedIn/savedUsername", "");
140141 width: parent.width
141142 focus: true
142143 placeholderText: "Username or Email"
@@ -165,7 +166,7 @@ Item { · 22 unmodified lines
165166 root.text = "";
166167 }
167168 Component.onCompleted: {
168− var savedUsername = Settings.getValue("wallet/savedUsername", "");
169+ var savedUsername = Settings.getValue("keepMeLoggedIn/savedUsername", "");
169170 usernameField.text = savedUsername === "Unknown user" ? "" : savedUsername;
170171 }
171172 }
@@ -239,7 +240,10 @@ Item { · 67 unmodified lines
239240
240241 }
241242
242− Keys.onReturnPressed: linkAccountBody.login()
243+ Keys.onReturnPressed: {
244+ Settings.setValue("keepMeLoggedIn/savedUsername", usernameField.text);
245+ linkAccountBody.login();
246+ }
243247 }
244248
245249 InfoItem {
@@ -263,21 +267,21 @@ Item { · 17 unmodified lines
263267
264268 CheckBox {
265269 id: autoLogoutCheckbox
266− checked: !Settings.getValue("wallet/autoLogout", true)
267− text: "Keep me signed in"
270+ checked: Settings.getValue("keepMeLoggedIn", false)
271+ text: "Keep me logged in"
268272 boxSize: 20;
269273 labelFontSize: 15
270274 color: hifi.colors.black
271275 onCheckedChanged: {
272− Settings.setValue("wallet/autoLogout", !checked);
276+ Settings.setValue("keepMeLoggedIn", checked);
273277 if (checked) {
274− Settings.setValue("wallet/savedUsername", Account.username);
278+ Settings.setValue("keepMeLoggedIn/savedUsername", usernameField.text);
275279 } else {
276− Settings.setValue("wallet/savedUsername", "");
280+ Settings.setValue("keepMeLoggedIn/savedUsername", "");
277281 }
278282 }
279283 Component.onDestruction: {
280− Settings.setValue("wallet/autoLogout", !checked);
284+ Settings.setValue("keepMeLoggedIn", checked);
281285 }
282286 }
283287
@@ -289,7 +293,10 @@ Item { · 5 unmodified lines
289293 text: qsTr(loginDialog.isSteamRunning() ? "Link Account" : "Log in")
290294 color: hifi.buttons.blue
291295
292− onClicked: linkAccountBody.login()
296+ onClicked: {
297+ Settings.setValue("keepMeLoggedIn/savedUsername", usernameField.text);
298+ linkAccountBody.login();
299+ }
293300 }
294301 }
295302
@@ -403,6 +410,7 @@ Item { · 107 unmodified lines
403410 case Qt.Key_Enter:
404411 case Qt.Key_Return:
405412 event.accepted = true
413+ Settings.setValue("keepMeLoggedIn/savedUsername", usernameField.text);
406414 linkAccountBody.login()
407415 break
408416 }
interface/resources/qml/LoginDialog/SignInBody.qml+2−2
@@ -12,8 +12,8 @@ import Hifi 1.0 · 11 unmodified lines
1212 import QtQuick 2.7
1313 import QtQuick.Controls.Styles 1.4 as OriginalStyles
1414
15−import "../controls-uit"
16−import "../styles-uit"
15+import controlsUit 1.0
16+import stylesUit 1.0
1717
1818 Item {
1919 id: signInBody
interface/resources/qml/LoginDialog/SignUpBody.qml+2−2
@@ -12,8 +12,8 @@ import Hifi 1.0 · 11 unmodified lines
1212 import QtQuick 2.7
1313 import QtQuick.Controls 1.4
1414
15−import "../controls-uit"
16−import "../styles-uit"
15+import controlsUit 1.0
16+import stylesUit 1.0
1717
1818 Item {
1919 id: signupBody
interface/resources/qml/LoginDialog/UsernameCollisionBody.qml+2−2
@@ -12,8 +12,8 @@ import Hifi 1.0 · 11 unmodified lines
1212 import QtQuick 2.4
1313 import QtQuick.Controls 1.4
1414
15−import "../controls-uit"
16−import "../styles-uit"
15+import controlsUit 1.0
16+import stylesUit 1.0
1717
1818 Item {
1919 id: usernameCollisionBody
interface/resources/qml/LoginDialog/WelcomeBody.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
1111 import Hifi 1.0
1212 import QtQuick 2.4
1313
14−import "../controls-uit"
15−import "../styles-uit"
14+import controlsUit 1.0
15+import stylesUit 1.0
1616
1717 Item {
1818 id: welcomeBody
interface/resources/qml/QmlWebWindow.qml+2−2
@@ -13,8 +13,8 @@ import QtWebEngine 1.1 · 12 unmodified lines
1313 import QtWebChannel 1.0
1414
1515 import "windows" as Windows
16−import "controls-uit" as Controls
17−import "styles-uit"
16+import controlsUit 1.0 as Controls
17+import stylesUit 1.0
1818
1919 Windows.ScrollingWindow {
2020 id: root
interface/resources/qml/QmlWindow.qml+2−2
@@ -2,9 +2,9 @@ import QtQuick 2.3 · 1 unmodified line
22
33 import "windows" as Windows
44 import "controls"
5−import "controls-uit" as Controls
5+import controlsUit 1.0 as Controls
66 import "styles"
7−import "styles-uit"
7+import stylesUit 1.0
88
99 Windows.Window {
1010 id: root
interface/resources/qml/TabletBrowser.qml+2−2
@@ -3,9 +3,9 @@ import QtWebChannel 1.0 · 2 unmodified lines
33 import QtWebEngine 1.5
44
55 import "controls"
6−import "controls-uit" as HifiControls
6+import controlsUit 1.0 as HifiControls
77 import "styles" as HifiStyles
8−import "styles-uit"
8+import stylesUit 1.0
99 import "windows"
1010
1111 Item {
interface/resources/qml/UpdateDialog.qml+2−2
@@ -4,9 +4,9 @@ import QtQuick.Controls 1.3 · 3 unmodified lines
44 import QtQuick.Controls.Styles 1.3
55 import QtGraphicalEffects 1.0
66
7−import "controls-uit"
7+import controlsUit 1.0
88 import "styles" as HifiStyles
9−import "styles-uit"
9+import stylesUit 1.0
1010 import "windows"
1111
1212 ScrollingWindow {
interface/resources/qml/controls-uit/AttachmentsTable.qml+3−169
@@ -1,170 +1,4 @@
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−//
1+import controlsUit 1.0
102
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 "../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−}
3+AttachmentsTable {
4+}
interface/resources/qml/controls-uit/BaseWebView.qml+3−37
@@ -1,38 +1,4 @@
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−//
1+import controlsUit 1.0
102
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−}
3+BaseWebView {
4+}
interface/resources/qml/controls-uit/Button.qml+2−120
@@ -1,122 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.7
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− }
3+Button {
1214 }
122−
interface/resources/qml/controls-uit/CheckBox.qml+2−119
@@ -1,121 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.2
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− }
3+CheckBox {
1214 }
interface/resources/qml/controls-uit/CheckBoxQQC2.qml+3−124
@@ -1,125 +1,4 @@
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 "../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−}
1+import controlsUit 1.0
1252
3+CheckBoxQQC2 {
4+}
interface/resources/qml/controls-uit/ComboBox.qml+2−189
@@ -1,191 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.7
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− }
3+ComboBox {
1914 }
interface/resources/qml/controls-uit/ContentSection.qml+2−136
@@ -1,138 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.5
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− }
3+ContentSection {
1384 }
interface/resources/qml/controls-uit/FilterBar.qml+2−319
@@ -1,321 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.9
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− }
3+FilterBar {
3214 }
interface/resources/qml/controls-uit/GlyphButton.qml+2−89
@@ -1,91 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.7
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− }
3+GlyphButton {
904 }
91−
interface/resources/qml/controls-uit/HorizontalRule.qml+2−16
@@ -1,18 +1,4 @@
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−//
1+import controlsUit 1.0
102
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
3+HorizontalRule {
184 }
interface/resources/qml/controls-uit/HorizontalSpacer.qml+2−19
@@ -1,21 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.5
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
3+HorizontalSpacer {
214 }
interface/resources/qml/controls-uit/ImageMessageBox.qml+2−61
@@ -1,63 +1,4 @@
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 "../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− }
1+import controlsUit 1.0
622
3+ImageMessageBox {
634 }
interface/resources/qml/controls-uit/Key.qml+2−183
@@ -1,185 +1,4 @@
1−import QtQuick 2.0
2−import TabletScriptingInterface 1.0
1+import controlsUit 1.0
32
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− ]
3+Key {
1854 }
interface/resources/qml/controls-uit/Keyboard.qml+2−352
@@ -1,354 +1,4 @@
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−//
1+import controlsUit 1.0
102
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: 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− }
3+Keyboard {
3544 }
interface/resources/qml/controls-uit/Label.qml+2−33
@@ -1,35 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.7
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− }
3+Label {
354 }
interface/resources/qml/controls-uit/QueuedButton.qml+2−39
@@ -1,41 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.5
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
3+QueuedButton {
414 }
interface/resources/qml/controls-uit/RadioButton.qml+2−91
@@ -1,93 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.5
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− }
3+RadioButton {
934 }
interface/resources/qml/controls-uit/ScrollBar.qml+1−38
@@ -1,41 +1,4 @@
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 "../styles-uit"
1+import controlsUit 1.0
152
163 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− }
414 }
interface/resources/qml/controls-uit/Separator.qml+2−42
@@ -1,44 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.5
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− }
3+Separator {
444 }
interface/resources/qml/controls-uit/Slider.qml+2−96
@@ -1,98 +1,4 @@
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 "../styles-uit"
15−import "../controls-uit" as HifiControls
1+import controlsUit 1.0
162
173 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−}
4+}
interface/resources/qml/controls-uit/SpinBox.qml+1−182
@@ -1,185 +1,4 @@
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 "../styles-uit"
15−import "../controls-uit" as HifiControls
1+import controlsUit 1.0
162
173 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− }
1854 }
interface/resources/qml/controls-uit/Switch.qml+2−158
@@ -1,160 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.7
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− }
3+Switch {
1604 }
interface/resources/qml/controls-uit/Table.qml+2−163
@@ -1,165 +1,4 @@
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−//
1+import controlsUit 1.0
102
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 "../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− }
3+Table {
1654 }
interface/resources/qml/controls-uit/TabletContentSection.qml+2−136
@@ -1,138 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.5
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− }
3+TabletContentSection {
1384 }
interface/resources/qml/controls-uit/TabletHeader.qml+2−32
@@ -1,34 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.5
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− }
3+TabletHeader {
344 }
interface/resources/qml/controls-uit/TextAction.qml+2−63
@@ -1,65 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.5
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− }
3+TextAction {
654 }
interface/resources/qml/controls-uit/TextEdit.qml+1−20
@@ -1,23 +1,4 @@
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 "../styles-uit"
1+import controlsUit 1.0
132
143 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
234 }
interface/resources/qml/controls-uit/TextField.qml+1−177
@@ -1,180 +1,4 @@
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 "../styles-uit"
16−import "../controls-uit" as HifiControls
1+import controlsUit 1.0
172
183 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− }
1804 }
interface/resources/qml/controls-uit/ToolTip.qml+3−50
@@ -1,51 +1,4 @@
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−//
1+import controlsUit 1.0
102
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−}
3+ToolTip {
4+}
interface/resources/qml/controls-uit/Tree.qml+2−203
@@ -1,205 +1,4 @@
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−//
1+import controlsUit 1.0
102
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 "../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)
3+Tree {
2054 }
interface/resources/qml/controls-uit/VerticalSpacer.qml+2−19
@@ -1,21 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.5
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
3+VerticalSpacer {
214 }
interface/resources/qml/controls-uit/WebGlyphButton.qml+2−38
@@ -1,40 +1,4 @@
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−//
1+import controlsUit 1.0
102
11−import QtQuick 2.5
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− }
3+WebGlyphButton {
394 }
40−
interface/resources/qml/controls-uit/WebSpinner.qml+2−22
@@ -1,24 +1,4 @@
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−//
1+import controlsUit 1.0
102
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− }
3+WebSpinner {
244 }
interface/resources/qml/controls-uit/WebView.qml+2−19
@@ -1,21 +1,4 @@
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−//
1+import controlsUit 1.0
102
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− }
3+WebView {
214 }
interface/resources/qml/controls-uit/readme.txt+1−0
@@ -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
interface/resources/qml/controls/Button.qml+0−1
@@ -3,7 +3,6 @@ import QtQuick.Controls 2.2 as Original · 2 unmodified lines
33
44 import "."
55 import "../styles"
6−import "../controls-uit"
76
87 Original.Button {
98 id: control
interface/resources/qml/controls/FlickableWebViewCore.qml+1−1
@@ -4,7 +4,7 @@ import QtWebChannel 1.0 · 3 unmodified lines
44
55 import QtQuick.Controls 2.2
66
7−import "../styles-uit" as StylesUIt
7+import stylesUit 1.0 as StylesUIt
88
99 Item {
1010 id: flick
interface/resources/qml/controls/TabletWebButton.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
1010
1111 import Hifi 1.0
1212 import QtQuick 2.4
13−import "../styles-uit"
13+import stylesUit 1.0
1414
1515 Rectangle {
1616 property alias text: label.text
interface/resources/qml/controls/TabletWebScreen.qml+1−1
@@ -1,5 +1,5 @@
11 import QtQuick 2.7
2−import "../controls-uit" as HiFiControls
2+import controlsUit 1.0 as HiFiControls
33
44 Item {
55 id: root
interface/resources/qml/controls/TabletWebView.qml+6−2
@@ -1,8 +1,8 @@
11 import QtQuick 2.7
22 import QtWebEngine 1.5
3−import "../controls-uit" as HiFiControls
3+import controlsUit 1.0 as HiFiControls
44 import "../styles" as HifiStyles
5−import "../styles-uit"
5+import stylesUit 1.0
66
77 Item {
88 id: root
@@ -195,6 +195,10 @@ Item { · 186 unmodified lines
195195 keyboardEnabled = HMD.active;
196196 }
197197
198+ Component.onDestruction: {
199+ keyboardRaised = false;
200+ }
201+
198202 Keys.onPressed: {
199203 switch(event.key) {
200204 case Qt.Key_L:
interface/resources/qml/controls/WebView.qml+1−1
@@ -1,5 +1,5 @@
11 import QtQuick 2.7
2−import "../controls-uit" as HiFiControls
2+import controlsUit 1.0 as HiFiControls
33
44 Item {
55 width: parent !== null ? parent.width : undefined
interface/resources/qml/controlsUit/+android/ImageButton.qmlrenamed from interface/resources/qml/controls-uit/+android/ImageButton.qml+3−3
@@ -1,6 +1,6 @@
11 //
22 // ImageButton.qml
3−// interface/resources/qml/controls-uit
3+// interface/resources/qml/controlsUit
44 //
55 // Created by Gabriel Calero & Cristian Duarte on 12 Oct 2017
66 // Copyright 2017 High Fidelity, Inc.
@@ -11,7 +11,7 @@ · 4 unmodified lines
1111
1212 import QtQuick 2.5
1313 import QtQuick.Layouts 1.3
14−import "../styles-uit" as HifiStyles
14+import "../stylesUit" as HifiStyles
1515
1616 Item {
1717 id: button
@@ -79,4 +79,4 @@ Item { · 61 unmodified lines
7979 }
8080 }
8181 ]
82−}
82+}
interface/resources/qml/controlsUit/AttachmentsTable.qml+170−0
@@ -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+}
interface/resources/qml/controlsUit/BaseWebView.qml+38−0
@@ -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+}
interface/resources/qml/controlsUit/Button.qml+122−0
@@ -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+
interface/resources/qml/controlsUit/CheckBox.qml+121−0
@@ -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+}
interface/resources/qml/controlsUit/CheckBoxQQC2.qml+125−0
@@ -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+
interface/resources/qml/controlsUit/ComboBox.qml+191−0
@@ -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+}
interface/resources/qml/controlsUit/ContentSection.qml+138−0
@@ -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+}
interface/resources/qml/controlsUit/FilterBar.qml+333−0
@@ -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+}
interface/resources/qml/controlsUit/GlyphButton.qml+91−0
@@ -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+
interface/resources/qml/controlsUit/HorizontalRule.qml+18−0
@@ -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+}
interface/resources/qml/controlsUit/HorizontalSpacer.qml+21−0
@@ -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+}
interface/resources/qml/controlsUit/ImageMessageBox.qml+63−0
@@ -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+}
interface/resources/qml/controlsUit/Key.qml+185−0
@@ -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+}
interface/resources/qml/controlsUit/Keyboard.qml+370−0
@@ -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+}
interface/resources/qml/controlsUit/Label.qml+35−0
@@ -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+}
interface/resources/qml/controlsUit/QueuedButton.qml+41−0
@@ -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+}
interface/resources/qml/controlsUit/RadioButton.qml+93−0
@@ -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+}
interface/resources/qml/controlsUit/ScrollBar.qml+41−0
@@ -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+}
interface/resources/qml/controlsUit/Separator.qml+44−0
@@ -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+}
interface/resources/qml/controlsUit/Slider.qml+98−0
@@ -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+}
interface/resources/qml/controlsUit/SpinBox.qml+185−0
@@ -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+}
interface/resources/qml/controlsUit/Switch.qml+160−0
@@ -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+}
interface/resources/qml/controlsUit/Table.qml+165−0
@@ -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+}
interface/resources/qml/controlsUit/TabletContentSection.qml+138−0
@@ -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+}
interface/resources/qml/controlsUit/TabletHeader.qml+34−0
@@ -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+}
interface/resources/qml/controlsUit/TextAction.qml+65−0
@@ -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+}
interface/resources/qml/controlsUit/TextEdit.qml+23−0
@@ -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+}
interface/resources/qml/controlsUit/TextField.qml+180−0
@@ -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+}
interface/resources/qml/controlsUit/ToolTip.qml+51−0
@@ -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+}
interface/resources/qml/controlsUit/Tree.qml+205−0
@@ -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+}
interface/resources/qml/controlsUit/VerticalSpacer.qml+21−0
@@ -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+}
interface/resources/qml/controlsUit/WebGlyphButton.qml+40−0
@@ -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+
interface/resources/qml/controlsUit/WebSpinner.qml+24−0
@@ -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+}
interface/resources/qml/controlsUit/WebView.qml+21−0
@@ -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+}
interface/resources/qml/controlsUit/qmldirrenamed from interface/resources/qml/controls-uit/qmldir+2−0
@@ -6,6 +6,7 @@ CheckBox 1.0 CheckBox.qml · 5 unmodified lines
66 CheckBoxQQC2 1.0 CheckBoxQQC2.qml
77 ComboBox 1.0 ComboBox.qml
88 ContentSection 1.0 ContentSection.qml
9+FilterBar 1.0 FilterBar.qml
910 GlyphButton 1.0 GlyphButton.qml
1011 HorizontalRule 1.0 HorizontalRule.qml
1112 HorizontalSpacer 1.0 HorizontalSpacer.qml
@@ -15,6 +16,7 @@ Keyboard 1.0 Keyboard.qml · 3 unmodified lines
1516 Label 1.0 Label.qml
1617 QueuedButton 1.0 QueuedButton.qml
1718 RadioButton 1.0 RadioButton.qml
19+ScrollBar 1.0 ScrollBar.qml
1820 Separator 1.0 Separator.qml
1921 Slider 1.0 Slider.qml
2022 SpinBox 1.0 SpinBox.qml
interface/resources/qml/dialogs/AssetDialog.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212 import Qt.labs.settings 1.0
1313
14−import "../styles-uit"
14+import stylesUit 1.0
1515 import "../windows"
1616
1717 import "assetDialog"
interface/resources/qml/dialogs/CustomQueryDialog.qml+2−2
@@ -12,8 +12,8 @@ import QtQuick 2.7; · 11 unmodified lines
1212 import QtQuick.Dialogs 1.2 as OriginalDialogs;
1313 import QtQuick.Controls 2.3
1414
15−import "../controls-uit";
16−import "../styles-uit";
15+import controlsUit 1.0
16+import stylesUit 1.0
1717 import "../windows";
1818
1919 ModalWindow {
interface/resources/qml/dialogs/FileDialog.qml+2−2
@@ -16,8 +16,8 @@ import QtQuick.Controls 1.4 as QQC1 · 15 unmodified lines
1616 import QtQuick.Controls 2.3
1717
1818 import ".."
19−import "../controls-uit"
20−import "../styles-uit"
19+import controlsUit 1.0
20+import stylesUit 1.0
2121 import "../windows"
2222
2323 import "fileDialog"
interface/resources/qml/dialogs/MessageDialog.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212 import QtQuick.Dialogs 1.2 as OriginalDialogs
1313
14−import "../controls-uit"
15−import "../styles-uit"
14+import controlsUit 1.0
15+import stylesUit 1.0
1616 import "../windows"
1717
1818 import "messageDialog"
interface/resources/qml/dialogs/PreferencesDialog.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.5
1212
13−import "../controls-uit" as HifiControls
14−import "../styles-uit"
13+import controlsUit 1.0 as HifiControls
14+import stylesUit 1.0
1515 import "../windows"
1616 import "preferences"
1717
interface/resources/qml/dialogs/QueryDialog.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
1111 import QtQuick 2.7
1212 import QtQuick.Controls 2.3
1313
14−import "../controls-uit"
15−import "../styles-uit"
14+import controlsUit 1.0
15+import stylesUit 1.0
1616 import "../windows"
1717
1818 ModalWindow {
interface/resources/qml/dialogs/TabletAssetDialog.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.5
1212
13−import "../styles-uit"
13+import stylesUit 1.0
1414 import "../windows"
1515
1616 import "assetDialog"
interface/resources/qml/dialogs/TabletCustomQueryDialog.qml+2−2
@@ -12,8 +12,8 @@ import QtQuick 2.7 · 11 unmodified lines
1212 import QtQuick.Dialogs 1.2 as OriginalDialogs
1313 import QtQuick.Controls 2.3
1414
15−import "../controls-uit"
16−import "../styles-uit"
15+import controlsUit 1.0
16+import stylesUit 1.0
1717 import "../windows"
1818
1919 TabletModalWindow {
interface/resources/qml/dialogs/TabletFileDialog.qml+2−2
@@ -16,8 +16,8 @@ import QtQuick.Controls 1.4 as QQC1 · 15 unmodified lines
1616 import QtQuick.Controls 2.3
1717
1818 import ".."
19−import "../controls-uit"
20−import "../styles-uit"
19+import controlsUit 1.0
20+import stylesUit 1.0
2121 import "../windows"
2222
2323 import "fileDialog"
interface/resources/qml/dialogs/TabletLoginDialog.qml+22−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
1111 import Hifi 1.0
1212 import QtQuick 2.5
1313
14−import "../controls-uit"
15−import "../styles-uit"
14+import controlsUit 1.0
15+import stylesUit 1.0
1616 import "../windows"
1717
1818 import "../LoginDialog"
@@ -95,6 +95,18 @@ TabletModalWindow { · 76 unmodified lines
9595 }
9696 }
9797
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+
98110 TabletModalFrame {
99111 id: mfRoot
100112
@@ -127,6 +139,14 @@ TabletModalWindow { · 26 unmodified lines
127139 }
128140 }
129141
142+ Component.onDestruction: {
143+ loginKeyboard.raised = false;
144+ }
145+
146+ Component.onCompleted: {
147+ keyboardTimer.start();
148+ }
149+
130150 Keyboard {
131151 id: loginKeyboard
132152 raised: root.keyboardEnabled && root.keyboardRaised
interface/resources/qml/dialogs/TabletMessageBox.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212 import QtQuick.Dialogs 1.2 as OriginalDialogs
1313
14−import "../controls-uit"
15−import "../styles-uit"
14+import controlsUit 1.0
15+import stylesUit 1.0
1616 import "../windows"
1717
1818 import "messageDialog"
interface/resources/qml/dialogs/TabletQueryDialog.qml+2−2
@@ -12,8 +12,8 @@ import QtQuick 2.7 · 11 unmodified lines
1212 import QtQuick.Dialogs 1.2 as OriginalDialogs
1313 import QtQuick.Controls 2.3
1414
15−import "../controls-uit"
16−import "../styles-uit"
15+import controlsUit 1.0
16+import stylesUit 1.0
1717 import "../windows"
1818
1919 TabletModalWindow {
interface/resources/qml/dialogs/assetDialog/AssetDialogContent.qml+2−2
@@ -12,8 +12,8 @@ import QtQuick 2.7 · 11 unmodified lines
1212 import QtQuick.Controls 2.3
1313 import QtQuick.Controls 1.5 as QQC1
1414
15−import "../../controls-uit"
16−import "../../styles-uit"
15+import controlsUit 1.0
16+import stylesUit 1.0
1717
1818 import "../fileDialog"
1919
interface/resources/qml/dialogs/fileDialog/FileTypeSelection.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.5
1212
13−import "../../controls-uit"
13+import controlsUit 1.0
1414
1515 ComboBox {
1616 id: root
interface/resources/qml/dialogs/messageDialog/MessageDialogButton.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212 import QtQuick.Dialogs 1.2
1313
14−import "../../controls-uit"
14+import controlsUit 1.0
1515
1616 Button {
1717 property var dialog;
interface/resources/qml/dialogs/preferences/AvatarPreference.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.5
1212
13−import "../../controls-uit"
13+import controlsUit 1.0
1414 import "../../hifi/tablet/tabletWindows/preferences"
1515
1616 Preference {
interface/resources/qml/dialogs/preferences/BrowsablePreference.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212
1313 import "../../dialogs"
14−import "../../controls-uit"
14+import controlsUit 1.0
1515
1616 Preference {
1717 id: root
interface/resources/qml/dialogs/preferences/ButtonPreference.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212 import TabletScriptingInterface 1.0
1313
14−import "../../controls-uit"
14+import controlsUit 1.0
1515
1616 Preference {
1717 id: root
interface/resources/qml/dialogs/preferences/CheckBoxPreference.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212 import TabletScriptingInterface 1.0
1313
14−import "../../controls-uit"
14+import controlsUit 1.0
1515
1616 Preference {
1717 id: root
interface/resources/qml/dialogs/preferences/ComboBoxPreference.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.5
1212
13−import "../../controls-uit" as HiFiControls
14−import "../../styles-uit"
13+import controlsUit 1.0 as HiFiControls
14+import stylesUit 1.0
1515
1616 Preference {
1717 id: root
interface/resources/qml/dialogs/preferences/EditablePreference.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212
1313 import "../../dialogs"
14−import "../../controls-uit"
14+import controlsUit 1.0
1515
1616 Preference {
1717 id: root
interface/resources/qml/dialogs/preferences/PrimaryHandPreference.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.5
1212
13−import "../../controls-uit"
13+import controlsUit 1.0
1414
1515 Preference {
1616 id: root
interface/resources/qml/dialogs/preferences/RadioButtonsPreference.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.5
1212
13−import "../../controls-uit"
14−import "../../styles-uit"
13+import controlsUit 1.0
14+import stylesUit 1.0
1515
1616 Preference {
1717 id: root
interface/resources/qml/dialogs/preferences/Section.qml+2−2
@@ -12,8 +12,8 @@ import QtQuick 2.5 · 11 unmodified lines
1212 import QtQuick.Controls 1.4
1313 import Hifi 1.0
1414
15−import "../../controls-uit" as HiFiControls
16−import "../../styles-uit"
15+import controlsUit 1.0 as HiFiControls
16+import stylesUit 1.0
1717 import "."
1818
1919 Preference {
interface/resources/qml/dialogs/preferences/SliderPreference.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212
1313 import "../../dialogs"
14−import "../../controls-uit"
14+import controlsUit 1.0
1515
1616 Preference {
1717 id: root
interface/resources/qml/dialogs/preferences/SpinBoxPreference.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.5
1212
13−import "../../controls-uit"
13+import controlsUit 1.0
1414
1515 Preference {
1616 id: root
interface/resources/qml/dialogs/preferences/SpinnerSliderPreference.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212
1313 import "../../dialogs"
14−import "../../controls-uit"
14+import controlsUit 1.0
1515
1616 Preference {
1717 id: root
interface/resources/qml/hifi/+android/ActionBar.qml+2−2
@@ -3,8 +3,8 @@ import QtQuick.Controls 1.4 · 2 unmodified lines
33 import QtQuick.Controls.Styles 1.4
44 import QtQuick.Layouts 1.3
55 import Qt.labs.settings 1.0
6−import "../../styles-uit"
7−import "../../controls-uit" as HifiControlsUit
6+import stylesUit 1.0
7+import controlsUit 1.0 as HifiControlsUit
88 import "../../controls" as HifiControls
99 import ".."
1010
interface/resources/qml/hifi/+android/AudioBar.qml+2−2
@@ -3,8 +3,8 @@ import QtQuick.Controls 1.4 · 2 unmodified lines
33 import QtQuick.Controls.Styles 1.4
44 import QtQuick.Layouts 1.3
55 import Qt.labs.settings 1.0
6−import "../../styles-uit"
7−import "../../controls-uit" as HifiControlsUit
6+import stylesUit 1.0
7+import controlsUit 1.0 as HifiControlsUit
88 import "../../controls" as HifiControls
99 import ".."
1010
interface/resources/qml/hifi/+android/AvatarOption.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
1111
1212 import QtQuick.Layouts 1.3
1313 import QtQuick 2.5
14−import "../controls-uit" as HifiControlsUit
14+import controlsUit 1.0 as HifiControlsUit
1515
1616 ColumnLayout {
1717 id: itemRoot
interface/resources/qml/hifi/+android/StatsBar.qml+2−2
@@ -3,8 +3,8 @@ import QtQuick.Controls 1.4 · 2 unmodified lines
33 import QtQuick.Controls.Styles 1.4
44 import QtQuick.Layouts 1.3
55 import Qt.labs.settings 1.0
6−import "../../styles-uit"
7−import "../../controls-uit" as HifiControlsUit
6+import stylesUit 1.0
7+import controlsUit 1.0 as HifiControlsUit
88 import "../../controls" as HifiControls
99 import ".."
1010
interface/resources/qml/hifi/+android/WindowHeader.qml+2−2
@@ -16,8 +16,8 @@ import QtQuick.Layouts 1.3 · 15 unmodified lines
1616 import Qt.labs.settings 1.0
1717 import "."
1818 import "../styles" as HifiStyles
19−import "../styles-uit"
20−import "../controls-uit" as HifiControlsUit
19+import stylesUit 1.0
20+import controlsUit 1.0 as HifiControlsUit
2121 import "../controls" as HifiControls
2222 import ".."
2323
interface/resources/qml/hifi/+android/bottomHudOptions.qml+2−2
@@ -16,8 +16,8 @@ import QtQuick.Controls.Styles 1.4 · 15 unmodified lines
1616 import QtQuick.Layouts 1.3
1717 import Qt.labs.settings 1.0
1818 import "../../styles" as HifiStyles
19−import "../../styles-uit"
20−import "../../controls-uit" as HifiControlsUit
19+import stylesUit 1.0
20+import controlsUit 1.0 as HifiControlsUit
2121 import "../../controls" as HifiControls
2222 import ".."
2323 import "."
interface/resources/qml/hifi/+android/modesbar.qml+2−2
@@ -3,8 +3,8 @@ import QtQuick.Controls 1.4 · 2 unmodified lines
33 import QtQuick.Controls.Styles 1.4
44 import QtQuick.Layouts 1.3
55 import Qt.labs.settings 1.0
6−import "../../styles-uit"
7−import "../../controls-uit" as HifiControlsUit
6+import stylesUit 1.0
7+import controlsUit 1.0 as HifiControlsUit
88 import "../../controls" as HifiControls
99 import ".."
1010
interface/resources/qml/hifi/AssetServer.qml+2−2
@@ -14,8 +14,8 @@ import QtQuick.Controls.Styles 1.4 · 13 unmodified lines
1414 import QtQuick.Dialogs 1.2 as OriginalDialogs
1515 import Qt.labs.settings 1.0
1616
17−import "../styles-uit"
18−import "../controls-uit" as HifiControls
17+import stylesUit 1.0
18+import controlsUit 1.0 as HifiControls
1919 import "../windows" as Windows
2020 import "../dialogs"
2121
interface/resources/qml/hifi/AvatarApp.qml+11−4
@@ -3,8 +3,8 @@ import QtQuick.Controls 2.2 · 2 unmodified lines
33 import QtQuick.Layouts 1.3
44 import QtQml.Models 2.1
55 import QtGraphicalEffects 1.0
6−import "../controls-uit" as HifiControls
7−import "../styles-uit"
6+import controlsUit 1.0 as HifiControls
7+import stylesUit 1.0
88 import "avatarapp"
99
1010 Rectangle {
@@ -19,7 +19,7 @@ Rectangle { · 8 unmodified lines
1919 HifiControls.Keyboard {
2020 id: keyboard
2121 z: 1000
22− raised: parent.keyboardEnabled && parent.keyboardRaised
22+ raised: parent.keyboardEnabled && parent.keyboardRaised && HMD.active
2323 numeric: parent.punctuationMode
2424 anchors {
2525 left: parent.left
@@ -204,7 +204,8 @@ Rectangle { · 178 unmodified lines
204204
205205 property bool isInManageState: false
206206
207− Component.onCompleted: {
207+ Component.onDestruction: {
208+ keyboard.raised = false;
208209 }
209210
210211 AvatarAppStyle {
@@ -235,6 +236,8 @@ Rectangle { · 24 unmodified lines
235236 avatarIconVisible: mainPageVisible
236237 settingsButtonVisible: mainPageVisible
237238 onSettingsClicked: {
239+ displayNameInput.focus = false;
240+ root.keyboardRaised = false;
238241 settings.open(currentAvatarSettings, currentAvatar.avatarScale);
239242 }
240243 }
@@ -344,6 +347,10 @@ Rectangle { · 103 unmodified lines
344347 emitSendToScript({'method' : 'changeDisplayName', 'displayName' : text})
345348 focus = false;
346349 }
350+
351+ onFocusChanged: {
352+ root.keyboardRaised = focus;
353+ }
347354 }
348355
349356 ShadowImage {
interface/resources/qml/hifi/Card.qml+1−1
@@ -17,7 +17,7 @@ import QtGraphicalEffects 1.0 · 16 unmodified lines
1717 import TabletScriptingInterface 1.0
1818
1919 import "toolbars"
20−import "../styles-uit"
20+import stylesUit 1.0
2121
2222 Item {
2323 id: root;
interface/resources/qml/hifi/ComboDialog.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
1010 //
1111
1212 import QtQuick 2.5
13−import "../styles-uit"
14−import "../controls-uit"
13+import stylesUit 1.0
14+import controlsUit 1.0
1515
1616 Item {
1717 property var dialogTitleText : "";
interface/resources/qml/hifi/Desktop.qml+1−1
@@ -8,7 +8,7 @@ import "../desktop" as OriginalDesktop · 7 unmodified lines
88 import ".."
99 import "."
1010 import "./toolbars"
11−import "../controls-uit"
11+import controlsUit 1.0
1212
1313 OriginalDesktop.Desktop {
1414 id: desktop
interface/resources/qml/hifi/DesktopLetterboxMessage.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
1010 //
1111
1212 import QtQuick 2.5
13−import "../styles-uit"
13+import stylesUit 1.0
1414
1515 Item {
1616 property alias text: popupText.text
interface/resources/qml/hifi/Feed.qml+1−1
@@ -15,7 +15,7 @@ import Hifi 1.0 · 14 unmodified lines
1515 import QtQuick 2.5
1616 import QtGraphicalEffects 1.0
1717 import "toolbars"
18−import "../styles-uit"
18+import stylesUit 1.0
1919 import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.
2020
2121 Column {
interface/resources/qml/hifi/LetterboxMessage.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
1010 //
1111
1212 import QtQuick 2.5
13−import "../styles-uit"
13+import stylesUit 1.0
1414
1515 Item {
1616 property alias text: popupText.text
interface/resources/qml/hifi/NameCard.qml+2−2
@@ -13,8 +13,8 @@ import QtQuick 2.5 · 12 unmodified lines
1313 import QtQuick.Controls 1.4
1414 import QtQuick.Controls.Styles 1.4
1515 import QtGraphicalEffects 1.0
16−import "../styles-uit"
17−import "../controls-uit" as HifiControls
16+import stylesUit 1.0
17+import controlsUit 1.0 as HifiControls
1818 import "toolbars"
1919
2020 // references Users, UserActivityLogger, MyAvatar, Vec3, Quat, AddressManager, Account from root context
interface/resources/qml/hifi/Pal.qml+2−2
@@ -15,8 +15,8 @@ import QtQuick 2.5 · 14 unmodified lines
1515 import QtQuick.Controls 1.4
1616 import QtGraphicalEffects 1.0
1717 import Qt.labs.settings 1.0
18−import "../styles-uit"
19−import "../controls-uit" as HifiControlsUit
18+import stylesUit 1.0
19+import controlsUit 1.0 as HifiControlsUit
2020 import "../controls" as HifiControls
2121 import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.
2222
interface/resources/qml/hifi/SkyboxChanger.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
1010 //
1111
1212 import QtQuick 2.5
13−import "../styles-uit"
14−import "../controls-uit" as HifiControls
13+import stylesUit 1.0
14+import controlsUit 1.0 as HifiControls
1515 import QtQuick.Controls 2.2
1616
1717 Item {
interface/resources/qml/hifi/SpectatorCamera.qml+2−2
@@ -13,8 +13,8 @@ · 12 unmodified lines
1313
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.7
16−import "../styles-uit"
17−import "../controls-uit" as HifiControlsUit
16+import stylesUit 1.0
17+import controlsUit 1.0 as HifiControlsUit
1818 import "../controls" as HifiControls
1919
2020 // references HMD, XXX from root context
interface/resources/qml/hifi/TabletTextButton.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
1010
1111 import Hifi 1.0
1212 import QtQuick 2.4
13−import "../styles-uit"
13+import stylesUit 1.0
1414
1515 Rectangle {
1616 property alias text: label.text
interface/resources/qml/hifi/TextButton.qml+1−1
@@ -9,7 +9,7 @@ · 8 unmodified lines
99 //
1010 import Hifi 1.0
1111 import QtQuick 2.4
12−import "../styles-uit"
12+import stylesUit 1.0
1313
1414 Rectangle {
1515 property alias text: label.text;
interface/resources/qml/hifi/WebBrowser.qml+2−2
@@ -18,8 +18,8 @@ import QtGraphicalEffects 1.0 · 17 unmodified lines
1818 import QtWebEngine 1.5
1919 import QtWebChannel 1.0
2020
21−import "../styles-uit"
22−import "../controls-uit" as HifiControls
21+import stylesUit 1.0
22+import controlsUit 1.0 as HifiControls
2323 import "../windows"
2424 import "../controls"
2525
interface/resources/qml/hifi/audio/Audio.qml+2−2
@@ -15,8 +15,8 @@ import QtQuick 2.5 · 14 unmodified lines
1515 import QtQuick.Controls 2.2
1616 import QtQuick.Layouts 1.3
1717
18−import "../../styles-uit"
19−import "../../controls-uit" as HifiControls
18+import stylesUit 1.0
19+import controlsUit 1.0 as HifiControls
2020 import "../../windows"
2121 import "./" as AudioControls
2222
interface/resources/qml/hifi/audio/AudioTabButton.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
1111
1212 import QtQuick 2.7
1313 import QtQuick.Controls 2.2
14−import "../../controls-uit" as HifiControls
15−import "../../styles-uit"
14+import controlsUit 1.0 as HifiControls
15+import stylesUit 1.0
1616
1717 TabButton {
1818 id: control
interface/resources/qml/hifi/audio/CheckBox.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
1111
1212 import QtQuick 2.7
1313
14−import "../../controls-uit" as HifiControls
14+import controlsUit 1.0 as HifiControls
1515
1616 HifiControls.CheckBoxQQC2 {
1717 color: "white"
interface/resources/qml/hifi/audio/PlaySampleSound.qml+2−2
@@ -13,8 +13,8 @@ import QtQuick 2.7 · 12 unmodified lines
1313 import QtQuick.Controls 2.2
1414 import QtQuick.Layouts 1.3
1515
16−import "../../styles-uit"
17−import "../../controls-uit" as HifiControls
16+import stylesUit 1.0
17+import controlsUit 1.0 as HifiControls
1818
1919 RowLayout {
2020 property var sound: null;
interface/resources/qml/hifi/avatarapp/AdjustWearables.qml+22−7
@@ -1,9 +1,8 @@
11 import Hifi 1.0 as Hifi
22 import QtQuick 2.5
33 import QtQuick.Layouts 1.3
4−import "../../styles-uit"
5−import "../../controls-uit" as HifiControlsUit
6−import "../../controls" as HifiControls
4+import stylesUit 1.0
5+import controlsUit 1.0 as HifiControlsUit
76
87 Rectangle {
98 id: root;
@@ -49,16 +48,32 @@ Rectangle { · 39 unmodified lines
4948 refresh(avatar);
5049 }
5150
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+
5260 function refresh(avatar) {
5361 wearablesCombobox.model.clear();
5462 wearablesCombobox.currentIndex = -1;
5563
5664 for (var i = 0; i < avatar.wearables.count; ++i) {
5765 var wearable = avatar.wearables.get(i).properties;
58− for (var j = (wearable.modelURL.length - 1); j >= 0; --j) {
59− if (wearable.modelURL[j] === '/') {
60− wearable.text = wearable.modelURL.substring(j + 1);
61− break;
66+ if (wearable.modelURL) {
67+ wearable.text = extractTitleFromUrl(wearable.modelURL);
68+ } else if (wearable.materialURL) {
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;
6277 }
6378 }
6479 wearablesCombobox.model.append(wearable);
interface/resources/qml/hifi/avatarapp/AvatarAppHeader.qml+1−1
@@ -1,6 +1,6 @@
11 import Hifi 1.0 as Hifi
22 import QtQuick 2.5
3−import "../../styles-uit"
3+import stylesUit 1.0
44
55 ShadowRectangle {
66 id: header
interface/resources/qml/hifi/avatarapp/AvatarAppStyle.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.5
1212 import QtQuick.Window 2.2
13−import "../../styles-uit"
13+import stylesUit 1.0
1414
1515 QtObject {
1616 readonly property QtObject colors: QtObject {
interface/resources/qml/hifi/avatarapp/AvatarWearablesIndicator.qml+2−2
@@ -1,6 +1,6 @@
11 import QtQuick 2.9
2−import "../../controls-uit"
3−import "../../styles-uit"
2+import controlsUit 1.0
3+import stylesUit 1.0
44
55 ShadowRectangle {
66 property int wearablesCount: 0
interface/resources/qml/hifi/avatarapp/BlueButton.qml+2−2
@@ -1,6 +1,6 @@
11 import QtQuick 2.5
2−import "../../styles-uit"
3−import "../../controls-uit" as HifiControlsUit
2+import stylesUit 1.0
3+import controlsUit 1.0 as HifiControlsUit
44
55 HifiControlsUit.Button {
66 HifiConstants {
interface/resources/qml/hifi/avatarapp/CreateFavoriteDialog.qml+2−2
@@ -1,7 +1,7 @@
11 import Hifi 1.0 as Hifi
22 import QtQuick 2.5
3−import "../../styles-uit"
4−import "../../controls-uit" as HifiControlsUit
3+import stylesUit 1.0
4+import controlsUit 1.0 as HifiControlsUit
55 import "../../controls" as HifiControls
66
77 Rectangle {
interface/resources/qml/hifi/avatarapp/InputField.qml+2−2
@@ -1,7 +1,7 @@
11 import QtQuick 2.5
22 import QtQuick.Controls 2.2
3−import "../../styles-uit"
4−import "../../controls-uit" as HifiControlsUit
3+import stylesUit 1.0
4+import controlsUit 1.0 as HifiControlsUit
55
66 TextField {
77 id: textField
interface/resources/qml/hifi/avatarapp/InputTextStyle4.qml+2−2
@@ -1,5 +1,5 @@
1−import "../../controls-uit" as HifiControlsUit
2−import "../../styles-uit"
1+import controlsUit 1.0 as HifiControlsUit
2+import stylesUit 1.0
33
44 import QtQuick 2.0
55 import QtQuick.Controls 2.2
interface/resources/qml/hifi/avatarapp/MessageBox.qml+2−2
@@ -1,7 +1,7 @@
11 import Hifi 1.0 as Hifi
22 import QtQuick 2.5
3−import "../../styles-uit"
4−import "../../controls-uit" as HifiControlsUit
3+import stylesUit 1.0
4+import controlsUit 1.0 as HifiControlsUit
55 import "../../controls" as HifiControls
66
77 Rectangle {
interface/resources/qml/hifi/avatarapp/MessageBoxes.qml+5−5
@@ -63,8 +63,8 @@ MessageBox { · 62 unmodified lines
6363 popup.dialogButtons.yesButton.fontCapitalization = Font.MixedCase;
6464 popup.button1text = 'CANCEL'
6565 popup.titleText = 'Get Wearables'
66− popup.bodyText = 'Buy 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/>' +
66+ popup.bodyText = 'Get wearables from <b><a href="app://marketplace">Marketplace.</a></b>' + '<br/>' +
67+ 'Wear wearable from <b><a href="app://purchases">Inventory.</a></b>' + '<br/>' + '<br/>' +
6868 'Visit “AvatarIsland” to get wearables'
6969
7070 popup.imageSource = getWearablesUrl;
@@ -89,7 +89,7 @@ MessageBox { · 18 unmodified lines
8989
9090 function showDeleteFavorite(favoriteName, callback) {
9191 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.'
9393 popup.imageSource = null;
9494 popup.button1text = 'CANCEL'
9595 popup.button2text = 'DELETE'
@@ -128,8 +128,8 @@ MessageBox { · 32 unmodified lines
128128 popup.button1text = 'CANCEL'
129129 popup.titleText = 'Get Avatars'
130130
131− popup.bodyText = 'Buy 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/>' +
131+ popup.bodyText = 'Get avatars from <b><a href="app://marketplace">Marketplace.</a></b>' + '<br/>' +
132+ 'Wear avatars in <b><a href="app://purchases">Inventory.</a></b>' + '<br/>' + '<br/>' +
133133 'Visit “BodyMart” to get free avatars.'
134134
135135 popup.imageSource = getAvatarsUrl;
interface/resources/qml/hifi/avatarapp/Settings.qml+26−2
@@ -2,8 +2,8 @@ import Hifi 1.0 as Hifi · 1 unmodified line
22 import QtQuick 2.5
33 import QtQuick.Controls 2.2
44 import QtQuick.Layouts 1.3
5−import "../../styles-uit"
6−import "../../controls-uit" as HifiControlsUit
5+import stylesUit 1.0
6+import controlsUit 1.0 as HifiControlsUit
77 import "../../controls" as HifiControls
88
99 Rectangle {
@@ -14,6 +14,22 @@ Rectangle { · 4 unmodified lines
1414
1515 signal scaleChanged(real scale);
1616
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+
1733 property alias onSaveClicked: dialogButtons.onYesClicked
1834 property alias onCancelClicked: dialogButtons.onNoClicked
1935
@@ -314,6 +330,10 @@ Rectangle { · 294 unmodified lines
314330 anchors.left: parent.left
315331 anchors.right: parent.right
316332 placeholderText: 'user\\file\\dir'
333+
334+ onFocusChanged: {
335+ keyboardRaised = (avatarAnimationUrlInputText.focus || avatarCollisionSoundUrlInputText.focus);
336+ }
317337 }
318338 }
319339
@@ -340,6 +360,10 @@ Rectangle { · 20 unmodified lines
340360 anchors.left: parent.left
341361 anchors.right: parent.right
342362 placeholderText: 'https://hifi-public.s3.amazonaws.com/sounds/Collisions-'
363+
364+ onFocusChanged: {
365+ keyboardRaised = (avatarAnimationUrlInputText.focus || avatarCollisionSoundUrlInputText.focus);
366+ }
343367 }
344368 }
345369
interface/resources/qml/hifi/avatarapp/ShadowGlyph.qml+1−1
@@ -1,4 +1,4 @@
1−import "../../styles-uit"
1+import stylesUit 1.0
22 import QtQuick 2.9
33 import QtGraphicalEffects 1.0
44
interface/resources/qml/hifi/avatarapp/ShadowImage.qml+1−1
@@ -1,4 +1,4 @@
1−import "../../styles-uit"
1+import stylesUit 1.0
22 import QtQuick 2.9
33 import QtGraphicalEffects 1.0
44
interface/resources/qml/hifi/avatarapp/ShadowRectangle.qml+1−1
@@ -1,4 +1,4 @@
1−import "../../styles-uit"
1+import stylesUit 1.0
22 import QtQuick 2.9
33 import QtGraphicalEffects 1.0
44
interface/resources/qml/hifi/avatarapp/SquareLabel.qml+2−2
@@ -1,5 +1,5 @@
1−import "../../styles-uit"
2−import "../../controls-uit" as HifiControlsUit
1+import stylesUit 1.0
2+import controlsUit 1.0 as HifiControlsUit
33 import QtQuick 2.9
44 import QtGraphicalEffects 1.0
55
interface/resources/qml/hifi/avatarapp/Vector3.qml+2−2
@@ -1,7 +1,7 @@
11 import Hifi 1.0 as Hifi
22 import QtQuick 2.5
3−import "../../styles-uit"
4−import "../../controls-uit" as HifiControlsUit
3+import stylesUit 1.0
4+import controlsUit 1.0 as HifiControlsUit
55 import "../../controls" as HifiControls
66
77 Row {
interface/resources/qml/hifi/avatarapp/WhiteButton.qml+2−2
@@ -1,6 +1,6 @@
11 import QtQuick 2.5
2−import "../../styles-uit"
3−import "../../controls-uit" as HifiControlsUit
2+import stylesUit 1.0
3+import controlsUit 1.0 as HifiControlsUit
44
55 HifiControlsUit.Button {
66 HifiConstants {
interface/resources/qml/hifi/commerce/checkout/Checkout.qml+40−35
@@ -14,8 +14,8 @@ · 13 unmodified lines
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.5
1616 import QtQuick.Controls 1.4
17−import "../../../styles-uit"
18−import "../../../controls-uit" as HifiControlsUit
17+import stylesUit 1.0
18+import controlsUit 1.0 as HifiControlsUit
1919 import "../../../controls" as HifiControls
2020 import "../wallet" as HifiWallet
2121 import "../common" as HifiCommerceCommon
@@ -55,6 +55,7 @@ Rectangle { · 33 unmodified lines
5555 property bool isInstalled;
5656 property bool isUpdating;
5757 property string baseAppURL;
58+ property int currentUpdatesPage: 1;
5859 // Style
5960 color: hifi.colors.white;
6061 Connections {
@@ -156,8 +157,14 @@ Rectangle { · 95 unmodified lines
156157 break;
157158 }
158159 }
159− root.availableUpdatesReceived = true;
160− refreshBuyUI();
160+
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+ }
161168 }
162169 }
163170
@@ -176,6 +183,7 @@ Rectangle { · 12 unmodified lines
176183 root.ownershipStatusReceived = false;
177184 Commerce.alreadyOwned(root.itemId);
178185 root.availableUpdatesReceived = false;
186+ root.currentUpdatesPage = 1;
179187 Commerce.getAvailableUpdates(root.itemId);
180188 itemPreviewImage.source = "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/" + itemId + "/thumbnail/hifi-mp-" + itemId + ".jpg";
181189 }
@@ -240,11 +248,6 @@ Rectangle { · 58 unmodified lines
240248 lightboxPopup.button1method = function() {
241249 lightboxPopup.visible = false;
242250 }
243− lightboxPopup.button2text = "GO TO WALLET";
244− lightboxPopup.button2method = function() {
245− lightboxPopup.visible = false;
246− sendToScript({method: 'checkout_openWallet'});
247− };
248251 lightboxPopup.visible = true;
249252 } else {
250253 sendToScript(msg);
@@ -383,7 +386,7 @@ Rectangle { · 132 unmodified lines
383386 anchors.leftMargin: 16;
384387 width: paintedWidth;
385388 height: paintedHeight;
386− text: "Review Purchase:";
389+ text: "Review:";
387390 color: hifi.colors.black;
388391 size: 28;
389392 }
@@ -448,7 +451,7 @@ Rectangle { · 58 unmodified lines
448451 // "HFC" balance label
449452 HiFiGlyphs {
450453 id: itemPriceTextLabel;
451− visible: !(root.isUpdating && root.itemEdition > 0);
454+ visible: !(root.isUpdating && root.itemEdition > 0) && (root.itemPrice > 0);
452455 text: hifi.glyphs.hfc;
453456 // Size
454457 size: 30;
@@ -464,7 +467,7 @@ Rectangle { · 9 unmodified lines
464467 }
465468 FiraSansSemiBold {
466469 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"));
468471 // Text size
469472 size: (root.isUpdating && root.itemEdition > 0) ? 20 : 26;
470473 // Anchors
@@ -559,7 +562,7 @@ Rectangle { · 88 unmodified lines
559562 }
560563 }
561564
562− // "View in My Purchases" button
565+ // "View in Inventory" button
563566 HifiControlsUit.Button {
564567 id: viewInMyPurchasesButton;
565568 visible: false;
@@ -570,7 +573,7 @@ Rectangle { · 4 unmodified lines
570573 height: 50;
571574 anchors.left: parent.left;
572575 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";
574577 onClicked: {
575578 if (root.isUpdating) {
576579 sendToScript({method: 'checkout_goToPurchases', filterText: root.baseItemName});
@@ -594,7 +597,7 @@ Rectangle { · 17 unmodified lines
594597 anchors.left: parent.left;
595598 anchors.right: parent.right;
596599 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"));
598601 onClicked: {
599602 if (root.isUpdating && root.itemEdition > 0) {
600603 // If we're updating an app, the existing app needs to be uninstalled.
@@ -608,9 +611,9 @@ Rectangle { · 7 unmodified lines
608611 } else if (root.isCertified) {
609612 if (!root.shouldBuyWithControlledFailure) {
610613 if (root.itemType === "contentSet" && !Entities.canReplaceContent()) {
611− lightboxPopup.titleText = "Purchase Content Set";
614+ lightboxPopup.titleText = "Get Content Set";
612615 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?";
614617 lightboxPopup.button1text = "CANCEL";
615618 lightboxPopup.button1method = function() {
616619 lightboxPopup.visible = false;
@@ -694,7 +697,7 @@ Rectangle { · 77 unmodified lines
694697 id: completeText2;
695698 text: "The " + (root.itemTypesText)[itemTypesArray.indexOf(root.itemType)] +
696699 ' <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.";
698701 // Text size
699702 size: 18;
700703 // Anchors
@@ -833,7 +836,7 @@ Rectangle { · 132 unmodified lines
833836 }
834837 lightboxPopup.button2text = "OPEN GOTO";
835838 lightboxPopup.button2method = function() {
836− sendToScript({method: 'purchases_openGoTo'});
839+ sendToScript({method: 'checkout_openGoTo'});
837840 lightboxPopup.visible = false;
838841 };
839842 lightboxPopup.visible = true;
@@ -864,7 +867,7 @@ Rectangle { · 24 unmodified lines
864867
865868 RalewaySemiBold {
866869 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>';
868871 // Text size
869872 size: 18;
870873 // Anchors
@@ -886,7 +889,8 @@ Rectangle { · 15 unmodified lines
886889
887890 RalewaySemiBold {
888891 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>';
890894 // Text size
891895 size: 18;
892896 // Anchors
@@ -902,18 +906,18 @@ Rectangle { · 9 unmodified lines
902906 horizontalAlignment: Text.AlignLeft;
903907 verticalAlignment: Text.AlignVCenter;
904908 onLinkActivated: {
905− sendToScript({method: 'purchases_openWallet'});
909+ sendToScript({method: 'checkout_openRecentActivity'});
906910 }
907911 }
908912
909913 RalewayRegular {
910914 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. ' +
912916 '<b><font color="' + hifi.colors.primaryHighlight + '"><a href="#">Learn More</a></font></b>';
913917 // Text size
914918 size: 18;
915919 // Anchors
916− anchors.top: walletLink.bottom;
920+ anchors.top: walletLink.visible ? walletLink.bottom : myPurchasesLink.bottom;
917921 anchors.topMargin: 32;
918922 height: paintedHeight;
919923 anchors.left: parent.left;
@@ -925,8 +929,8 @@ Rectangle { · 5 unmodified lines
925929 horizontalAlignment: Text.AlignLeft;
926930 verticalAlignment: Text.AlignVCenter;
927931 onLinkActivated: {
928− lightboxPopup.titleText = "Purchase Confirmations";
929− lightboxPopup.bodyText = 'Your item is marked "pending" while your purchase is being confirmed.<br><br>' +
932+ lightboxPopup.titleText = "Confirmations";
933+ lightboxPopup.bodyText = 'Your item is marked "pending" while the transfer is being confirmed.<br><br>' +
930934 'Confirmations usually take about 90 seconds.';
931935 lightboxPopup.button1text = "CLOSE";
932936 lightboxPopup.button1method = function() {
@@ -936,9 +940,9 @@ Rectangle { · 3 unmodified lines
936940 }
937941 }
938942
939− // "Continue Shopping" button
943+ // "Continue" button
940944 HifiControlsUit.Button {
941− id: continueShoppingButton;
945+ id: continueButton;
942946 color: hifi.buttons.noneBorderlessGray;
943947 colorScheme: hifi.colorSchemes.light;
944948 anchors.bottom: parent.bottom;
@@ -946,9 +950,9 @@ Rectangle { · 1 unmodified line
946950 anchors.right: parent.right;
947951 width: 193;
948952 height: 44;
949− text: "Continue Shopping";
953+ text: "Continue";
950954 onClicked: {
951− sendToScript({method: 'checkout_continueShopping', itemId: itemId});
955+ sendToScript({method: 'checkout_continue', itemId: itemId});
952956 }
953957 }
954958 }
@@ -971,7 +975,7 @@ Rectangle { · 16 unmodified lines
971975
972976 RalewayRegular {
973977 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.";
975979 // Text size
976980 size: 24;
977981 // Anchors
@@ -1037,7 +1041,7 @@ Rectangle { · 59 unmodified lines
10371041 width: parent.width/2 - anchors.leftMargin*2;
10381042 text: "Back to Marketplace";
10391043 onClicked: {
1040− sendToScript({method: 'checkout_continueShopping', itemId: itemId});
1044+ sendToScript({method: 'checkout_continue', itemId: itemId});
10411045 }
10421046 }
10431047 }
@@ -1122,10 +1126,10 @@ Rectangle { · 78 unmodified lines
11221126 if (root.balanceAfterPurchase < 0) {
11231127 // If you already own the item...
11241128 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>";
11261130 // Else if you don't already own the item...
11271131 } 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>";
11291133 } else {
11301134 buyText.text = "<b>While you do not have sufficient funds to buy this, you already have this item.</b>"
11311135 }
@@ -1171,7 +1175,7 @@ Rectangle { · 39 unmodified lines
11711175 buyText.text = "";
11721176 }
11731177 } 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>';
11751179 buyTextContainer.color = hifi.colors.white;
11761180 buyTextContainer.border.color = hifi.colors.white;
11771181 buyGlyph.text = "";
@@ -1185,6 +1189,7 @@ Rectangle { · 7 unmodified lines
11851189 root.ownershipStatusReceived = false;
11861190 Commerce.alreadyOwned(root.itemId);
11871191 root.availableUpdatesReceived = false;
1192+ root.currentUpdatesPage = 1;
11881193 Commerce.getAvailableUpdates(root.itemId);
11891194 root.balanceReceived = false;
11901195 Commerce.balance();
interface/resources/qml/hifi/commerce/common/CommerceLightbox.qml+6−4
@@ -14,9 +14,9 @@ · 13 unmodified lines
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.5
1616 import QtGraphicalEffects 1.0
17−import "../../../styles-uit"
18−import "../../../controls-uit" as HifiControlsUit
19−import "../../../controls" as HifiControls
17+import stylesUit 1.0
18+import controlsUit 1.0 as HifiControlsUit
19+import "qrc:////qml//controls" as HifiControls
2020
2121 // references XXX from root context
2222
@@ -33,13 +33,15 @@ Rectangle { · 10 unmodified lines
3333 property string buttonLayout: "leftright";
3434
3535 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...";
3737
3838 id: root;
3939 visible: false;
4040 anchors.fill: parent;
4141 color: Qt.rgba(0, 0, 0, 0.5);
4242 z: 999;
43+
44+ HifiConstants { id: hifi; }
4345
4446 onVisibleChanged: {
4547 if (!visible) {
interface/resources/qml/hifi/commerce/common/EmulatedMarketplaceHeader.qml+4−58
@@ -14,8 +14,8 @@ · 13 unmodified lines
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.7
1616 import QtGraphicalEffects 1.0
17−import "../../../styles-uit"
18−import "../../../controls-uit" as HifiControlsUit
17+import stylesUit 1.0
18+import controlsUit 1.0 as HifiControlsUit
1919 import "../../../controls" as HifiControls
2020
2121 // references XXX from root context
@@ -27,7 +27,6 @@ Item { · 5 unmodified lines
2727 property string referrerURL: (Account.metaverseServerURL + "/marketplace?");
2828 readonly property int additionalDropdownHeight: usernameDropdown.height - myUsernameButton.anchors.bottomMargin;
2929 property alias usernameDropdownVisible: usernameDropdown.visible;
30− property bool messagesWaiting: false;
3130
3231 height: mainContainer.height + additionalDropdownHeight;
3332
@@ -38,7 +37,6 @@ Item { · 4 unmodified lines
3837 if (walletStatus === 0) {
3938 sendToParent({method: "needsLogIn"});
4039 } else if (walletStatus === 5) {
41− Commerce.getAvailableUpdates();
4240 Commerce.getSecurityImage();
4341 } else if (walletStatus > 5) {
4442 console.log("ERROR in EmulatedMarketplaceHeader.qml: Unknown wallet status: " + walletStatus);
@@ -59,14 +57,6 @@ Item { · 14 unmodified lines
5957 securityImage.source = "image://security/securityImage";
6058 }
6159 }
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− }
7060 }
7161
7262 Component.onCompleted: {
@@ -118,50 +108,6 @@ Item { · 45 unmodified lines
118108 anchors.right: securityImage.left;
119109 anchors.rightMargin: 6;
120110
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−
165111 TextMetrics {
166112 id: textMetrics;
167113 font.family: "Raleway"
@@ -267,7 +213,7 @@ Item { · 99 unmodified lines
267213 anchors.topMargin: -buttonAndUsernameContainer.anchors.bottomMargin;
268214 anchors.right: buttonAndUsernameContainer.right;
269215 height: childrenRect.height;
270− width: 100;
216+ width: 150;
271217
272218 Rectangle {
273219 id: myItemsButton;
@@ -279,7 +225,7 @@ Item { · 5 unmodified lines
279225
280226 RalewaySemiBold {
281227 anchors.fill: parent;
282− text: "My Items"
228+ text: "My Submissions"
283229 color: hifi.colors.baseGray;
284230 horizontalAlignment: Text.AlignHCenter;
285231 verticalAlignment: Text.AlignVCenter;
interface/resources/qml/hifi/commerce/common/FirstUseTutorial.qml+4−4
@@ -14,8 +14,8 @@ · 13 unmodified lines
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.5
1616 import QtGraphicalEffects 1.0
17−import "../../../styles-uit"
18−import "../../../controls-uit" as HifiControlsUit
17+import stylesUit 1.0
18+import controlsUit 1.0 as HifiControlsUit
1919 import "../../../controls" as HifiControls
2020
2121 // references XXX from root context
@@ -87,7 +87,7 @@ Rectangle { · 65 unmodified lines
8787 }
8888 RalewayRegular {
8989 id: introText2;
90− text: "My Purchases";
90+ text: "Inventory";
9191 // Text size
9292 size: 22;
9393 // Anchors
@@ -116,7 +116,7 @@ Rectangle { · 22 unmodified lines
116116
117117 RalewayRegular {
118118 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.";
120120 // Text size
121121 size: 20;
122122 // Anchors
interface/resources/qml/hifi/commerce/common/sendAsset/ConnectionItem.qml+2−2
@@ -16,8 +16,8 @@ import QtQuick 2.5 · 15 unmodified lines
1616 import QtGraphicalEffects 1.0
1717 import QtQuick.Controls 1.4
1818 import QtQuick.Controls.Styles 1.4
19−import "../../../../styles-uit"
20−import "../../../../controls-uit" as HifiControlsUit
19+import stylesUit 1.0
20+import controlsUit 1.0 as HifiControlsUit
2121 import "../../../../controls" as HifiControls
2222 import "../../wallet" as HifiWallet
2323
interface/resources/qml/hifi/commerce/common/sendAsset/RecipientDisplay.qml+2−2
@@ -15,8 +15,8 @@ import Hifi 1.0 as Hifi · 14 unmodified lines
1515 import QtQuick 2.6
1616 import QtQuick.Controls 2.2
1717 import QtGraphicalEffects 1.0
18−import "../../../../styles-uit"
19−import "../../../../controls-uit" as HifiControlsUit
18+import stylesUit 1.0
19+import controlsUit 1.0 as HifiControlsUit
2020 import "../../../../controls" as HifiControls
2121 import "../" as HifiCommerceCommon
2222
interface/resources/qml/hifi/commerce/common/sendAsset/SendAsset.qml+12−4
@@ -15,8 +15,8 @@ import Hifi 1.0 as Hifi · 14 unmodified lines
1515 import QtQuick 2.6
1616 import QtQuick.Controls 2.2
1717 import QtGraphicalEffects 1.0
18−import "../../../../styles-uit"
19−import "../../../../controls-uit" as HifiControlsUit
18+import stylesUit 1.0
19+import controlsUit 1.0 as HifiControlsUit
2020 import "../../../../controls" as HifiControls
2121 import "../" as HifiCommerceCommon
2222 import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.
@@ -73,6 +73,10 @@ Item { · 50 unmodified lines
7373 }
7474
7575 onTransferAssetToNodeResult: {
76+ if (!root.visible) {
77+ return;
78+ }
79+
7680 root.isCurrentlySendingAsset = false;
7781
7882 if (result.status === 'success') {
@@ -92,6 +96,10 @@ Item { · 13 unmodified lines
9296 }
9397
9498 onTransferAssetToUsernameResult: {
99+ if (!root.visible) {
100+ return;
101+ }
102+
95103 root.isCurrentlySendingAsset = false;
96104
97105 if (result.status === 'success') {
@@ -1309,13 +1317,13 @@ Item { · 1211 unmodified lines
13091317
13101318 Rectangle {
13111319 anchors.top: parent.top;
1312− anchors.topMargin: root.assetName === "" ? 15 : 150;
1320+ anchors.topMargin: root.assetName === "" ? 15 : 125;
13131321 anchors.left: parent.left;
13141322 anchors.leftMargin: root.assetName === "" ? 15 : 50;
13151323 anchors.right: parent.right;
13161324 anchors.rightMargin: root.assetName === "" ? 15 : 50;
13171325 anchors.bottom: parent.bottom;
1318− anchors.bottomMargin: root.assetName === "" ? 15 : 240;
1326+ anchors.bottomMargin: root.assetName === "" ? 15 : 125;
13191327 color: "#FFFFFF";
13201328
13211329 RalewaySemiBold {
interface/resources/qml/hifi/commerce/inspectionCertificate/InspectionCertificate.qml+29−28
@@ -13,8 +13,8 @@ · 12 unmodified lines
1313
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.5
16−import "../../../styles-uit"
17−import "../../../controls-uit" as HifiControlsUit
16+import stylesUit 1.0
17+import controlsUit 1.0 as HifiControlsUit
1818 import "../../../controls" as HifiControls
1919 import "../wallet" as HifiWallet
2020
@@ -28,7 +28,7 @@ Rectangle { · 7 unmodified lines
2828 property string itemName: "--";
2929 property string itemOwner: "--";
3030 property string itemEdition: "--";
31− property string dateOfPurchase: "--";
31+ property string dateAcquired: "--";
3232 property string itemCost: "--";
3333 property string certTitleTextColor: hifi.colors.darkGray;
3434 property string certTextColor: hifi.colors.white;
@@ -64,7 +64,7 @@ Rectangle { · 29 unmodified lines
6464 root.itemName = "";
6565 root.itemEdition = "";
6666 root.itemOwner = "";
67− root.dateOfPurchase = "";
67+ root.dateAcquired = "";
6868 root.itemCost = "";
6969 errorText.text = "Information about this certificate is currently unavailable. Please try again later.";
7070 }
@@ -77,8 +77,9 @@ Rectangle { · 6 unmodified lines
7777 // "\u2022" is the Unicode character 'BULLET' - it's what's used in password fields on the web, etc
7878 root.itemOwner = root.isMyCert ? Account.username :
7979 "\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";
81− root.itemCost = (root.isMyCert && result.data.cost !== undefined) ? result.data.cost : "Undisclosed";
80+ root.dateAcquired = root.isMyCert ? getFormattedDate(result.data.transfer_created_at * 1000) : "Undisclosed";
81+ root.itemCost = (root.isMyCert && result.data.cost !== undefined) ?
82+ (parseInt(result.data.cost) > 0 ? result.data.cost : "Free") : "Undisclosed";
8283 }
8384 if (root.certInfoReplaceMode > 4) {
8485 root.itemEdition = result.data.edition_number + "/" + (result.data.limited_run === -1 ? "\u221e" : result.data.limited_run);
@@ -86,7 +87,7 @@ Rectangle { · 1 unmodified line
8687
8788 if (root.certificateStatus === 4) { // CERTIFICATE_STATUS_OWNER_VERIFICATION_FAILED
8889 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.";
9091 } else {
9192 errorText.text = "The person who placed this item doesn't own it.";
9293 }
@@ -102,8 +103,8 @@ Rectangle { · 9 unmodified lines
102103 showInMarketplaceButton.visible = false;
103104 // "Edition" text previously set above in this function
104105 // "Owner" text previously set above in this function
105− // "Purchase Date" text previously set above in this function
106− // "Purchase Price" text previously set above in this function
106+ // "Acquisition Date" text previously set above in this function
107+ // "Acquisition Price" text previously set above in this function
107108 if (result.data.invalid_reason) {
108109 errorText.text = result.data.invalid_reason;
109110 }
@@ -117,8 +118,8 @@ Rectangle { · 7 unmodified lines
117118 showInMarketplaceButton.visible = true;
118119 // "Edition" text previously set above in this function
119120 // "Owner" text previously set above in this function
120− // "Purchase Date" text previously set above in this function
121− // "Purchase Price" text previously set above in this function
121+ // "Acquisition Date" text previously set above in this function
122+ // "Acquisition Price" text previously set above in this function
122123 errorText.text = "The status of this item is still pending confirmation. If the purchase is not confirmed, " +
123124 "this entity will be cleaned up by the domain.";
124125 }
@@ -145,8 +146,8 @@ Rectangle { · 20 unmodified lines
145146 // "Item Name" text will be set in "onCertificateInfoResult()"
146147 // "Edition" text will be set in "onCertificateInfoResult()"
147148 // "Owner" text will be set in "onCertificateInfoResult()"
148− // "Purchase Date" text will be set in "onCertificateInfoResult()"
149− // "Purchase Price" text will be set in "onCertificateInfoResult()"
149+ // "Acquisition Date" text will be set in "onCertificateInfoResult()"
150+ // "Acquisition Price" text will be set in "onCertificateInfoResult()"
150151 errorText.text = "";
151152 } else if (root.certificateStatus === 2) { // CERTIFICATE_STATUS_VERIFICATION_TIMEOUT
152153 root.useGoldCert = false;
@@ -160,7 +161,7 @@ Rectangle { · 7 unmodified lines
160161 root.itemName = "";
161162 root.itemEdition = "";
162163 root.itemOwner = "";
163− root.dateOfPurchase = "";
164+ root.dateAcquired = "";
164165 root.itemCost = "";
165166 errorText.text = "Your request to inspect this item timed out. Please try again later.";
166167 } else if (root.certificateStatus === 3) { // CERTIFICATE_STATUS_STATIC_VERIFICATION_FAILED
@@ -175,8 +176,8 @@ Rectangle { · 8 unmodified lines
175176 // "Item Name" text will be set in "onCertificateInfoResult()"
176177 // "Edition" text will be set in "onCertificateInfoResult()"
177178 // "Owner" text will be set in "onCertificateInfoResult()"
178− // "Purchase Date" text will be set in "onCertificateInfoResult()"
179− // "Purchase Price" text will be set in "onCertificateInfoResult()"
179+ // "Acquisition Date" text will be set in "onCertificateInfoResult()"
180+ // "Acquisition Price" text will be set in "onCertificateInfoResult()"
180181 errorText.text = "The information associated with this item has been modified and it no longer matches the original certified item.";
181182 } else if (root.certificateStatus === 4) { // CERTIFICATE_STATUS_OWNER_VERIFICATION_FAILED
182183 root.useGoldCert = false;
@@ -190,8 +191,8 @@ Rectangle { · 7 unmodified lines
190191 // "Item Name" text will be set in "onCertificateInfoResult()"
191192 root.itemEdition = "Uncertified Copy"
192193 // "Owner" text will be set in "onCertificateInfoResult()"
193− // "Purchase Date" text will be set in "onCertificateInfoResult()"
194− // "Purchase Price" text will be set in "onCertificateInfoResult()"
194+ // "Acquisition Date" text will be set in "onCertificateInfoResult()"
195+ // "Acquisition Price" text will be set in "onCertificateInfoResult()"
195196 // "Error Text" text will be set in "onCertificateInfoResult()"
196197 } else {
197198 console.log("Unknown certificate status received from ledger signal!");
@@ -485,8 +486,8 @@ Rectangle { · 287 unmodified lines
485486 }
486487
487488 RalewayRegular {
488− id: dateOfPurchaseHeader;
489− text: "PURCHASE DATE";
489+ id: dateAcquiredHeader;
490+ text: "ACQUISITION DATE";
490491 // Text size
491492 size: 16;
492493 // Anchors
@@ -500,15 +501,15 @@ Rectangle { · 7 unmodified lines
500501 color: hifi.colors.darkGray;
501502 }
502503 AnonymousProRegular {
503− id: dateOfPurchase;
504− text: root.dateOfPurchase;
504+ id: dateAcquired;
505+ text: root.dateAcquired;
505506 // Text size
506507 size: 18;
507508 // Anchors
508− anchors.top: dateOfPurchaseHeader.bottom;
509+ anchors.top: dateAcquiredHeader.bottom;
509510 anchors.topMargin: 8;
510− anchors.left: dateOfPurchaseHeader.left;
511− anchors.right: dateOfPurchaseHeader.right;
511+ anchors.left: dateAcquiredHeader.left;
512+ anchors.right: dateAcquiredHeader.right;
512513 height: paintedHeight;
513514 // Style
514515 color: root.infoTextColor;
@@ -516,7 +517,7 @@ Rectangle { · 1 unmodified line
516517
517518 RalewayRegular {
518519 id: priceHeader;
519− text: "PURCHASE PRICE";
520+ text: "ACQUISITION PRICE";
520521 // Text size
521522 size: 16;
522523 // Anchors
@@ -530,7 +531,7 @@ Rectangle { · 7 unmodified lines
530531 }
531532 HiFiGlyphs {
532533 id: hfcGlyph;
533− visible: priceText.text !== "Undisclosed" && priceText.text !== "";
534+ visible: priceText.text !== "Undisclosed" && priceText.text !== "" && priceText.text !== "Free";
534535 text: hifi.glyphs.hfc;
535536 // Size
536537 size: 24;
@@ -618,7 +619,7 @@ Rectangle { · 81 unmodified lines
618619 root.itemName = "--";
619620 root.itemOwner = "--";
620621 root.itemEdition = "--";
621− root.dateOfPurchase = "--";
622+ root.dateAcquired = "--";
622623 root.marketplaceUrl = "";
623624 root.itemCost = "--";
624625 root.isMyCert = false;
interface/resources/qml/hifi/commerce/marketplaceItemTester/ItemUnderTest.qml+2−2
@@ -14,8 +14,8 @@ · 13 unmodified lines
1414 import QtQuick 2.10
1515 import QtQuick.Controls 2.3
1616 import Hifi 1.0 as Hifi
17−import "qrc:////qml//styles-uit" as HifiStylesUit
18−import "qrc:////qml//controls-uit" as HifiControlsUit
17+import stylesUit 1.0 as HifiStylesUit
18+import controlsUit 1.0 as HifiControlsUit
1919
2020 Rectangle {
2121 id: root;
interface/resources/qml/hifi/commerce/marketplaceItemTester/MarketplaceItemTester.qml+3−2
@@ -15,8 +15,9 @@ import QtQuick 2.10 · 14 unmodified lines
1515 import QtQuick.Layouts 1.1
1616 import QtQuick.Controls 2.3
1717 import Hifi 1.0 as Hifi
18−import "qrc:////qml//styles-uit" as HifiStylesUit
19−import "qrc:////qml//controls-uit" as HifiControlsUit
18+import stylesUit 1.0 as HifiStylesUit
19+import controlsUit 1.0 as HifiControlsUit
20+
2021
2122
2223
interface/resources/qml/hifi/commerce/purchases/PurchasedItem.qml+5−5
@@ -15,8 +15,8 @@ import Hifi 1.0 as Hifi · 14 unmodified lines
1515 import QtQuick 2.5
1616 import QtQuick.Controls 1.4
1717 import QtQuick.Controls.Styles 1.4
18−import "../../../styles-uit"
19−import "../../../controls-uit" as HifiControlsUit
18+import stylesUit 1.0
19+import controlsUit 1.0 as HifiControlsUit
2020 import "../../../controls" as HifiControls
2121 import "../wallet" as HifiWallet
2222 import TabletScriptingInterface 1.0
@@ -47,8 +47,7 @@ Item { · 24 unmodified lines
4747 property string wornEntityID;
4848 property string upgradeUrl;
4949 property string upgradeTitle;
50− property bool updateAvailable: root.upgradeUrl !== "" && !root.isShowingMyItems;
51− property bool isShowingMyItems;
50+ property bool updateAvailable: root.upgradeUrl !== "";
5251 property bool valid;
5352
5453 property string originalStatusText;
@@ -231,7 +230,7 @@ Item { · 176 unmodified lines
231230
232231 Loader {
233232 id: giftButton;
234− visible: !root.isShowingMyItems;
233+ visible: root.itemEdition > 0;
235234 sourceComponent: contextCardButton;
236235 anchors.right: parent.right;
237236 anchors.top: parent.top;
@@ -345,6 +344,7 @@ Item { · 107 unmodified lines
345344
346345 Rectangle {
347346 id: permissionExplanationCard;
347+ visible: false;
348348 anchors.left: parent.left;
349349 anchors.leftMargin: 30;
350350 anchors.top: parent.top;
interface/resources/qml/hifi/commerce/purchases/Purchases.qml+31−46
@@ -13,13 +13,12 @@ · 12 unmodified lines
1313
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.5
16−import "../../../styles-uit"
17−import "../../../controls-uit" as HifiControlsUit
16+import stylesUit 1.0
17+import controlsUit 1.0 as HifiControlsUit
1818 import "../../../controls" as HifiControls
1919 import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.
2020 import "../wallet" as HifiWallet
2121 import "../common" as HifiCommerceCommon
22−import "../inspectionCertificate" as HifiInspectionCertificate
2322 import "../common/sendAsset" as HifiSendAsset
2423 import "../.." as HifiCommon
2524
@@ -34,7 +33,6 @@ Rectangle { · 8 unmodified lines
3433 property bool securityImageResultReceived: false;
3534 property bool purchasesReceived: false;
3635 property bool punctuationMode: false;
37− property bool isShowingMyItems: false;
3836 property bool isDebuggingFirstUseTutorial: false;
3937 property string installedApps;
4038 property bool keyboardRaised: false;
@@ -92,7 +90,6 @@ Rectangle { · 51 unmodified lines
9290 if (result.status !== 'success') {
9391 console.log("Failed to get Available Updates", result.data.message);
9492 } else {
95− sendToScript({method: 'purchases_availableUpdatesReceived', numUpdates: result.data.updates.length });
9693 root.numUpdatesAvailable = result.total_entries;
9794 }
9895 }
@@ -106,10 +103,6 @@ Rectangle { · 7 unmodified lines
106103 }
107104 }
108105
109− onIsShowingMyItemsChanged: {
110− getPurchases();
111− }
112−
113106 Timer {
114107 id: notSetUpTimer;
115108 interval: 200;
@@ -118,19 +111,6 @@ Rectangle { · 2 unmodified lines
118111 }
119112 }
120113
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−
134114 HifiCommerceCommon.CommerceLightbox {
135115 id: lightboxPopup;
136116 z: 999;
@@ -180,7 +160,8 @@ Rectangle { · 43 unmodified lines
180160 HifiCommerceCommon.EmulatedMarketplaceHeader {
181161 id: titleBarContainer;
182162 z: 997;
183− visible: !needsLogIn.visible;
163+ visible: false;
164+ height: 100;
184165 // Size
185166 width: parent.width;
186167 // Anchors
@@ -199,11 +180,6 @@ Rectangle { · 12 unmodified lines
199180 lightboxPopup.button1method = function() {
200181 lightboxPopup.visible = false;
201182 }
202− lightboxPopup.button2text = "GO TO WALLET";
203− lightboxPopup.button2method = function() {
204− sendToScript({method: 'purchases_openWallet'});
205− lightboxPopup.visible = false;
206− };
207183 lightboxPopup.visible = true;
208184 } else {
209185 sendToScript(msg);
@@ -475,7 +451,7 @@ Rectangle { · 265 unmodified lines
475451 anchors.left: parent.left;
476452 anchors.leftMargin: 16;
477453 width: paintedWidth;
478− text: isShowingMyItems ? "My Items" : "My Purchases";
454+ text: "Items";
479455 color: hifi.colors.black;
480456 size: 22;
481457 }
@@ -517,8 +493,13 @@ Rectangle { · 35 unmodified lines
517493 "filterName": "wearable"
518494 },
519495 {
496+ "separator" : true,
520497 "displayName": "Updatable",
521498 "filterName": "updated"
499+ },
500+ {
501+ "displayName": "My Submissions",
502+ "filterName": "proofs"
522503 }
523504 ]
524505 filterBar.primaryFilterChoices.clear();
@@ -533,6 +514,7 @@ Rectangle { · 8 unmodified lines
533514 onTextChanged: {
534515 purchasesModel.searchFilter = filterBar.text;
535516 filterBar.previousText = filterBar.text;
517+
536518 }
537519 }
538520 }
@@ -556,10 +538,18 @@ Rectangle { · 17 unmodified lines
556538 listModelName: 'purchases';
557539 listView: purchasesContentsList;
558540 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+ }
560550 Commerce.inventory(
561− root.isShowingMyItems ? "proofs" : "purchased",
562− filterBar.primaryFilter_filterName,
551+ editionFilter,
552+ primaryFilter,
563553 filterBar.text,
564554 purchasesModel.currentPageToRetrieve,
565555 purchasesModel.itemsPerPage
@@ -609,7 +599,6 @@ Rectangle { · 43 unmodified lines
609599 upgradeUrl: model.upgrade_url;
610600 upgradeTitle: model.upgrade_title;
611601 itemType: model.item_type;
612− isShowingMyItems: root.isShowingMyItems;
613602 valid: model.valid;
614603 anchors.topMargin: 10;
615604 anchors.bottomMargin: 10;
@@ -626,8 +615,6 @@ Rectangle { · 10 unmodified lines
626615 sendToScript({ method: 'purchases_updateWearables' });
627616 }
628617 } else if (msg.method === 'purchases_itemCertificateClicked') {
629− inspectionCertificate.visible = true;
630− inspectionCertificate.isLightbox = true;
631618 sendToScript(msg);
632619 } else if (msg.method === "showInvalidatedLightbox") {
633620 lightboxPopup.titleText = "Item Invalidated";
@@ -640,7 +627,7 @@ Rectangle { · 6 unmodified lines
640627 lightboxPopup.visible = true;
641628 } else if (msg.method === "showPendingLightbox") {
642629 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. ' +
644631 "Usually, purchases take about 90 seconds to confirm.";
645632 lightboxPopup.button1text = "CLOSE";
646633 lightboxPopup.button1method = function() {
@@ -822,7 +809,8 @@ Rectangle { · 175 unmodified lines
822809
823810 Rectangle {
824811 id: updatesAvailableBanner;
825− visible: root.numUpdatesAvailable > 0 && !root.isShowingMyItems;
812+ visible: root.numUpdatesAvailable > 0 &&
813+ filterBar.primaryFilter_filterName !== "proofs";
826814 anchors.bottom: parent.bottom;
827815 anchors.left: parent.left;
828816 anchors.right: parent.right;
@@ -883,9 +871,8 @@ Rectangle { · 54 unmodified lines
883871 id: noItemsAlertContainer;
884872 visible: !purchasesContentsList.visible &&
885873 root.purchasesReceived &&
886− root.isShowingMyItems &&
887874 filterBar.text === "" &&
888− filterBar.primaryFilter_displayName === "";
875+ filterBar.primaryFilter_filterName === "proofs";
889876 anchors.top: filterBarContainer.bottom;
890877 anchors.topMargin: 12;
891878 anchors.left: parent.left;
@@ -895,7 +882,7 @@ Rectangle { · 3 unmodified lines
895882 // Explanitory text
896883 RalewayRegular {
897884 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.";
899886 // Text size
900887 size: 22;
901888 // Anchors
@@ -933,7 +920,6 @@ Rectangle { · 31 unmodified lines
933920 id: noPurchasesAlertContainer;
934921 visible: !purchasesContentsList.visible &&
935922 root.purchasesReceived &&
936− !root.isShowingMyItems &&
937923 filterBar.text === "" &&
938924 filterBar.primaryFilter_displayName === "";
939925 anchors.top: filterBarContainer.bottom;
@@ -945,7 +931,7 @@ Rectangle { · 5 unmodified lines
945931 // Explanitory text
946932 RalewayRegular {
947933 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.";
949935 // Text size
950936 size: 22;
951937 // Anchors
@@ -1065,11 +1051,10 @@ Rectangle { · 113 unmodified lines
10651051 titleBarContainer.referrerURL = message.referrerURL || "";
10661052 filterBar.text = message.filterText ? message.filterText : "";
10671053 break;
1068− case 'inspectionCertificate_setCertificateId':
1069− inspectionCertificate.fromScript(message);
1070− break;
10711054 case 'purchases_showMyItems':
1072− root.isShowingMyItems = true;
1055+ filterBar.primaryFilter_filterName = "proofs";
1056+ filterBar.primaryFilter_displayName = "Proofs";
1057+ filterBar.primaryFilter_index = 6;
10731058 break;
10741059 case 'updateConnections':
10751060 sendAsset.updateConnections(message.connections);
interface/resources/qml/hifi/commerce/wallet/Help.qml+5−8
@@ -14,8 +14,8 @@ · 13 unmodified lines
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.7
1616 import QtQuick.Controls 2.2
17−import "../../../styles-uit"
18−import "../../../controls-uit" as HifiControlsUit
17+import stylesUit 1.0
18+import controlsUit 1.0 as HifiControlsUit
1919 import "../../../controls" as HifiControls
2020
2121 // references XXX from root context
@@ -62,7 +62,7 @@ Item { · 40 unmodified lines
6262 isExpanded: false;
6363 question: "How can I get HFC?";
6464 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!";
6666 }
6767 ListElement {
6868 isExpanded: false;
@@ -74,8 +74,7 @@ In your Wallet's Send Money tab, choose from your list of connections, or choose · 5 unmodified lines
7474 isExpanded: false;
7575 question: "What is a Security Pic?"
7676 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. \
78−<br><br><b><font color='#0093C5'><a href='#securitypic'>Tap here to change your Security Pic.</a></font></b>";
77+When you see your Security Pic, you know that your actions and data are securely making use of your account.";
7978 }
8079 ListElement {
8180 isExpanded: false;
@@ -137,7 +136,7 @@ At the moment, there is currently no way to convert HFC to other currencies. Sta · 55 unmodified lines
137136 anchors.left: parent.left;
138137 width: parent.width;
139138 height: questionText.paintedHeight + 50;
140−
139+
141140 RalewaySemiBold {
142141 id: plusMinusButton;
143142 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
217216 }
218217 } else if (link === "#support") {
219218 Qt.openUrlExternally("mailto:support@highfidelity.com");
220− } else if (link === "#securitypic") {
221− sendSignalToWallet({method: 'walletSecurity_changeSecurityImage'});
222219 }
223220 }
224221 }
interface/resources/qml/hifi/commerce/wallet/NeedsLogIn.qml+3−3
@@ -13,8 +13,8 @@ · 12 unmodified lines
1313
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.5
16−import "../../../styles-uit"
17−import "../../../controls-uit" as HifiControlsUit
16+import stylesUit 1.0
17+import controlsUit 1.0 as HifiControlsUit
1818 import "../../../controls" as HifiControls
1919
2020 // references XXX from root context
@@ -93,7 +93,7 @@ Item { · 72 unmodified lines
9393 // Text below helper text
9494 RalewayRegular {
9595 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.";
9797 // Text size
9898 size: 18;
9999 // Anchors
interface/resources/qml/hifi/commerce/wallet/PassphraseChange.qml+2−2
@@ -13,8 +13,8 @@ · 12 unmodified lines
1313
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.5
16−import "../../../styles-uit"
17−import "../../../controls-uit" as HifiControlsUit
16+import stylesUit 1.0
17+import controlsUit 1.0 as HifiControlsUit
1818 import "../../../controls" as HifiControls
1919
2020 // references XXX from root context
interface/resources/qml/hifi/commerce/wallet/PassphraseModal.qml+2−2
@@ -13,8 +13,8 @@ · 12 unmodified lines
1313
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.5
16−import "../../../styles-uit"
17−import "../../../controls-uit" as HifiControlsUit
16+import stylesUit 1.0
17+import controlsUit 1.0 as HifiControlsUit
1818 import "../../../controls" as HifiControls
1919 import "../common" as HifiCommerceCommon
2020
interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml+2−2
@@ -13,8 +13,8 @@ · 12 unmodified lines
1313
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.5
16−import "../../../styles-uit"
17−import "../../../controls-uit" as HifiControlsUit
16+import stylesUit 1.0
17+import controlsUit 1.0 as HifiControlsUit
1818 import "../../../controls" as HifiControls
1919
2020 // references XXX from root context
interface/resources/qml/hifi/commerce/wallet/Security.qml+0−246
@@ -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−}
interface/resources/qml/hifi/commerce/wallet/Wallet.qml+167−159
@@ -14,12 +14,14 @@ · 13 unmodified lines
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.5
1616 import QtGraphicalEffects 1.0
17−import "../../../styles-uit"
18−import "../../../controls-uit" as HifiControlsUit
17+import stylesUit 1.0
18+import controlsUit 1.0 as HifiControlsUit
1919 import "../../../controls" as HifiControls
2020 import "../common" as HifiCommerceCommon
2121 import "../common/sendAsset"
2222 import "../.." as HifiCommon
23+import "../purchases" as HifiPurchases
24+import "../inspectionCertificate" as HifiInspectionCertificate
2325
2426 Rectangle {
2527 HifiConstants { id: hifi; }
@@ -27,6 +29,7 @@ Rectangle { · 1 unmodified line
2729 id: root;
2830
2931 property string activeView: "initialize";
32+ property string initialActiveViewAfterStatus5: "walletInventory";
3033 property bool keyboardRaised: false;
3134 property bool isPassword: false;
3235
@@ -37,6 +40,10 @@ Rectangle { · 4 unmodified lines
3740 source: "images/wallet-bg.jpg";
3841 }
3942
43+ Component.onDestruction: {
44+ KeyboardScriptingInterface.raised = false;
45+ }
46+
4047 Connections {
4148 target: Commerce;
4249
@@ -64,7 +71,8 @@ Rectangle { · 21 unmodified lines
6471 }
6572 } else if (walletStatus === 5) {
6673 if (root.activeView !== "walletSetup") {
67− root.activeView = "walletHome";
74+ root.activeView = root.initialActiveViewAfterStatus5;
75+ Commerce.getAvailableUpdates();
6876 Commerce.getSecurityImage();
6977 }
7078 } else {
@@ -86,6 +94,21 @@ Rectangle { · 15 unmodified lines
8694 titleBarSecurityImage.source = "image://security/securityImage";
8795 }
8896 }
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+ }
89112 }
90113
91114 HifiCommerceCommon.CommerceLightbox {
@@ -108,29 +131,32 @@ Rectangle { · 16 unmodified lines
108131 anchors.top: parent.top;
109132
110133 // Wallet icon
111− HiFiGlyphs {
134+ Image {
112135 id: walletIcon;
113− text: hifi.glyphs.wallet;
114− // Size
115− size: parent.height * 0.8;
116− // Anchors
136+ source: "../../../../icons/tablet-icons/inventory-a.svg";
137+ height: parent.height * 0.5;
138+ width: walletIcon.height;
117139 anchors.left: parent.left;
118140 anchors.leftMargin: 8;
119141 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;
121147 color: hifi.colors.blueHighlight;
122148 }
123149
124150 // Title Bar text
125151 RalewaySemiBold {
126152 id: titleBarText;
127− text: "WALLET";
153+ text: "INVENTORY";
128154 // Text size
129155 size: hifi.fontSizes.overlayTitle;
130156 // Anchors
131157 anchors.top: parent.top;
132158 anchors.left: walletIcon.right;
133− anchors.leftMargin: 4;
159+ anchors.leftMargin: 6;
134160 anchors.bottom: parent.bottom;
135161 width: paintedWidth;
136162 // Style
@@ -142,7 +168,7 @@ Rectangle { · 5 unmodified lines
142168 Image {
143169 id: titleBarSecurityImage;
144170 source: "";
145− visible: titleBarSecurityImage.source !== "" && !securityImageChange.visible;
171+ visible: titleBarSecurityImage.source !== "";
146172 anchors.right: parent.right;
147173 anchors.rightMargin: 6;
148174 anchors.top: parent.top;
@@ -232,10 +258,6 @@ Rectangle { · 83 unmodified lines
232258 root.isPassword = msg.isPasswordField;
233259 } else if (msg.method === 'walletSetup_lowerKeyboard') {
234260 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";
239261 } else {
240262 sendToScript(msg);
241263 }
@@ -245,27 +267,6 @@ Rectangle { · 3 unmodified lines
245267 }
246268 }
247269 }
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− }
269270
270271 //
271272 // TAB CONTENTS START
@@ -344,6 +345,39 @@ Rectangle { · 72 unmodified lines
344345 }
345346 }
346347
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+
347381 HifiCommon.RootHttpRequest {
348382 id: http;
349383 }
@@ -366,39 +400,6 @@ Rectangle { · 16 unmodified lines
366400 }
367401 }
368402
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−
402403 Help {
403404 id: help;
404405 visible: root.activeView === "help";
@@ -407,14 +408,6 @@ Rectangle { · 2 unmodified lines
407408 anchors.left: parent.left;
408409 anchors.right: parent.right;
409410
410− Connections {
411− onSendSignalToWallet: {
412− if (msg.method === 'walletSecurity_changeSecurityImage') {
413− securityImageChange.initModel();
414− root.activeView = "securityImageChange";
415− }
416− }
417− }
418411 }
419412
420413
@@ -427,8 +420,8 @@ Rectangle { · 6 unmodified lines
427420 //
428421 Item {
429422 id: tabButtonsContainer;
430− visible: !needsLogIn.visible && root.activeView !== "passphraseChange" && root.activeView !== "securityImageChange" && sendMoney.currentActiveView !== "sendAssetStep";
431− property int numTabs: 5;
423+ visible: !needsLogIn.visible && root.activeView !== "passphraseChange" && sendMoney.currentActiveView !== "sendAssetStep" && !WalletScriptingInterface.limitedCommerce;
424+ property int numTabs: 4;
432425 // Size
433426 width: root.width;
434427 height: 90;
@@ -446,16 +439,17 @@ Rectangle { · 11 unmodified lines
446439 // "WALLET HOME" tab button
447440 Rectangle {
448441 id: walletHomeButtonContainer;
442+ property bool messagesWaiting: false;
449443 visible: !walletSetup.visible;
450444 color: root.activeView === "walletHome" ? hifi.colors.blueAccent : hifi.colors.black;
451445 anchors.top: parent.top;
452− anchors.left: parent.left;
446+ anchors.left: exchangeMoneyButtonContainer.right;
453447 anchors.bottom: parent.bottom;
454448 width: parent.width / tabButtonsContainer.numTabs;
455449
456450 HiFiGlyphs {
457451 id: homeTabIcon;
458− text: hifi.glyphs.home2;
452+ text: hifi.glyphs.leftRightArrows;
459453 // Size
460454 size: 50;
461455 // Anchors
@@ -463,11 +457,24 @@ Rectangle { · 1 unmodified line
463457 anchors.top: parent.top;
464458 anchors.topMargin: -2;
465459 // 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";
467474 }
468475
469476 RalewaySemiBold {
470− text: "WALLET HOME";
477+ text: "RECENT ACTIVITY";
471478 // Text size
472479 size: 16;
473480 // Anchors
@@ -478,7 +485,7 @@ Rectangle { · 4 unmodified lines
478485 anchors.right: parent.right;
479486 anchors.rightMargin: 4;
480487 // 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);
482489 wrapMode: Text.WordWrap;
483490 // Alignment
484491 horizontalAlignment: Text.AlignHCenter;
@@ -487,6 +494,7 @@ Rectangle { · 2 unmodified lines
487494 MouseArea {
488495 id: walletHomeTabMouseArea;
489496 anchors.fill: parent;
497+ enabled: !WalletScriptingInterface.limitedCommerce;
490498 hoverEnabled: enabled;
491499 onClicked: {
492500 root.activeView = "walletHome";
@@ -500,28 +508,46 @@ Rectangle { · 7 unmodified lines
500508 // "EXCHANGE MONEY" tab button
501509 Rectangle {
502510 id: exchangeMoneyButtonContainer;
511+ property bool messagesWaiting: false;
512+
503513 visible: !walletSetup.visible;
504− color: hifi.colors.black;
514+ color: root.activeView === "walletInventory" ? hifi.colors.blueAccent : hifi.colors.black;
505515 anchors.top: parent.top;
506− anchors.left: walletHomeButtonContainer.right;
516+ anchors.left: parent.left;
507517 anchors.bottom: parent.bottom;
508518 width: parent.width / tabButtonsContainer.numTabs;
509519
510− HiFiGlyphs {
520+ Image {
511521 id: exchangeMoneyTabIcon;
512− text: hifi.glyphs.leftRightArrows;
513− // Size
514− size: 50;
515− // Anchors
522+ source: "images/items-tab-a.svg";
523+ height: 25;
524+ width: exchangeMoneyTabIcon.height;
516525 anchors.horizontalCenter: parent.horizontalCenter;
517526 anchors.top: parent.top;
518− anchors.topMargin: -2;
519− // Style
520− color: hifi.colors.lightGray50;
527+ anchors.topMargin: 10;
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.
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";
521547 }
522548
523549 RalewaySemiBold {
524− text: "EXCHANGE MONEY";
550+ text: "ITEMS";
525551 // Text size
526552 size: 16;
527553 // Anchors
@@ -532,12 +558,24 @@ Rectangle { · 4 unmodified lines
532558 anchors.right: parent.right;
533559 anchors.rightMargin: 4;
534560 // Style
535− color: hifi.colors.lightGray50;
561+ color: root.activeView === "walletInventory" || inventoryTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight;
536562 wrapMode: Text.WordWrap;
537563 // Alignment
538564 horizontalAlignment: Text.AlignHCenter;
539565 verticalAlignment: Text.AlignTop;
540566 }
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+ }
541579 }
542580
543581
@@ -547,7 +585,7 @@ Rectangle { · 3 unmodified lines
547585 visible: !walletSetup.visible;
548586 color: root.activeView === "sendMoney" ? hifi.colors.blueAccent : hifi.colors.black;
549587 anchors.top: parent.top;
550− anchors.left: exchangeMoneyButtonContainer.right;
588+ anchors.left: walletHomeButtonContainer.right;
551589 anchors.bottom: parent.bottom;
552590 width: parent.width / tabButtonsContainer.numTabs;
553591
@@ -561,7 +599,7 @@ Rectangle { · 7 unmodified lines
561599 anchors.top: parent.top;
562600 anchors.topMargin: -2;
563601 // 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);
565603 }
566604
567605 RalewaySemiBold {
@@ -576,7 +614,7 @@ Rectangle { · 8 unmodified lines
576614 anchors.right: parent.right;
577615 anchors.rightMargin: 4;
578616 // 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);
580618 wrapMode: Text.WordWrap;
581619 // Alignment
582620 horizontalAlignment: Text.AlignHCenter;
@@ -586,6 +624,7 @@ Rectangle { · 3 unmodified lines
586624 MouseArea {
587625 id: sendMoneyTabMouseArea;
588626 anchors.fill: parent;
627+ enabled: !WalletScriptingInterface.limitedCommerce;
589628 hoverEnabled: enabled;
590629 onClicked: {
591630 root.activeView = "sendMoney";
@@ -596,67 +635,13 @@ Rectangle { · 4 unmodified lines
596635 }
597636 }
598637
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−
653638 // "HELP" tab button
654639 Rectangle {
655640 id: helpButtonContainer;
656641 visible: !walletSetup.visible;
657642 color: root.activeView === "help" ? hifi.colors.blueAccent : hifi.colors.black;
658643 anchors.top: parent.top;
659− anchors.left: securityButtonContainer.right;
644+ anchors.left: sendMoneyButtonContainer.right;
660645 anchors.bottom: parent.bottom;
661646 width: parent.width / tabButtonsContainer.numTabs;
662647
@@ -708,16 +693,16 @@ Rectangle { · 45 unmodified lines
708693 function resetTabButtonColors() {
709694 walletHomeButtonContainer.color = hifi.colors.black;
710695 sendMoneyButtonContainer.color = hifi.colors.black;
711− securityButtonContainer.color = hifi.colors.black;
712696 helpButtonContainer.color = hifi.colors.black;
697+ exchangeMoneyButtonContainer.color = hifi.colors.black;
713698 if (root.activeView === "walletHome") {
714699 walletHomeButtonContainer.color = hifi.colors.blueAccent;
715700 } else if (root.activeView === "sendMoney") {
716701 sendMoneyButtonContainer.color = hifi.colors.blueAccent;
717− } else if (root.activeView === "security") {
718− securityButtonContainer.color = hifi.colors.blueAccent;
719702 } else if (root.activeView === "help") {
720703 helpButtonContainer.color = hifi.colors.blueAccent;
704+ } else if (root.activeView == "walletInventory") {
705+ exchangeMoneyButtonContainer.color = hifi.colors.blueAccent;
721706 }
722707 }
723708 }
@@ -783,18 +768,40 @@ Rectangle { · 59 unmodified lines
783768 break;
784769 case 'updateConnections':
785770 sendMoney.updateConnections(message.connections);
771+ walletInventory.fromScript(message);
786772 break;
787773 case 'selectRecipient':
788774 case 'updateSelectedRecipientUsername':
789775 sendMoney.fromScript(message);
776+ walletInventory.fromScript(message);
790777 break;
791778 case 'http.response':
792779 http.handleHttpResponse(message);
780+ // Duplicate handler is required because we don't track referrer for `http`
781+ walletInventory.fromScript(message);
793782 break;
794783 case 'palIsStale':
795784 case 'avatarDisconnected':
796785 // 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.
797786 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;
798805 default:
799806 console.log('Unrecognized message from wallet.js:', JSON.stringify(message));
800807 }
@@ -842,7 +849,8 @@ Rectangle { · 41 unmodified lines
842849 root.activeView = "initialize";
843850 Commerce.getWalletStatus();
844851 } else if (msg.referrer === 'purchases') {
845− sendToScript({method: 'goToPurchases'});
852+ root.activeView = "walletInventory";
853+ tabButtonsContainer.resetTabButtonColors();
846854 } else if (msg.referrer === 'marketplace cta' || msg.referrer === 'mainPage') {
847855 sendToScript({method: 'goToMarketplaceMainPage', itemId: msg.referrer});
848856 } else {
interface/resources/qml/hifi/commerce/wallet/WalletChoice.qml+2−2
@@ -14,8 +14,8 @@ · 13 unmodified lines
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.5
1616 import "../common" as HifiCommerceCommon
17−import "../../../styles-uit"
18−import "../../../controls-uit" as HifiControlsUit
17+import stylesUit 1.0
18+import controlsUit 1.0 as HifiControlsUit
1919
2020
2121 Item {
interface/resources/qml/hifi/commerce/wallet/WalletHome.qml+2−25
@@ -15,8 +15,8 @@ import Hifi 1.0 as Hifi · 14 unmodified lines
1515 import QtQuick 2.5
1616 import QtGraphicalEffects 1.0
1717 import QtQuick.Controls 2.2
18−import "../../../styles-uit"
19−import "../../../controls-uit" as HifiControlsUit
18+import stylesUit 1.0
19+import controlsUit 1.0 as HifiControlsUit
2020 import "../../../controls" as HifiControls
2121 import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.
2222
@@ -29,7 +29,6 @@ Item { · 6 unmodified lines
2929 if (visible) {
3030 Commerce.balance();
3131 transactionHistoryModel.getFirstPage();
32− Commerce.getAvailableUpdates();
3332 } else {
3433 refreshTimer.stop();
3534 }
@@ -179,28 +178,6 @@ Item { · 143 unmodified lines
179178 color: hifi.colors.baseGrayHighlight;
180179 }
181180
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−
204181 HifiModels.PSFListModel {
205182 id: transactionHistoryModel;
206183 property int lastPendingCount: 0;
interface/resources/qml/hifi/commerce/wallet/WalletSetup.qml+2−122
@@ -14,8 +14,8 @@ · 13 unmodified lines
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.5
1616 import QtGraphicalEffects 1.0
17−import "../../../styles-uit"
18−import "../../../controls-uit" as HifiControlsUit
17+import stylesUit 1.0
18+import controlsUit 1.0 as HifiControlsUit
1919 import "../../../controls" as HifiControls
2020 import "../common" as HifiCommerceCommon
2121
@@ -243,7 +243,6 @@ Item { · 221 unmodified lines
243243 height: 50;
244244 text: "Set Up Wallet";
245245 onClicked: {
246− securityImageSelection.initModel();
247246 root.activeView = "step_2";
248247 }
249248 }
@@ -267,124 +266,6 @@ Item { · 17 unmodified lines
267266 // FIRST PAGE END
268267 //
269268
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−
388269 //
389270 // SECURE PASSPHRASE SELECTION START
390271 //
@@ -525,7 +406,6 @@ Item { · 134 unmodified lines
525406 width: 200;
526407 text: "Back"
527408 onClicked: {
528− securityImageSelection.resetSelection();
529409 root.lastPage = "step_3";
530410 root.activeView = "step_2";
531411 }
interface/resources/qml/hifi/commerce/wallet/images/items-tab-a.svg+8−0
@@ -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>
interface/resources/qml/hifi/dialogs/AboutDialog.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.8
1212
13−import "../../styles-uit"
13+import stylesUit 1.0
1414 import "../../windows"
1515
1616 ScrollingWindow {
interface/resources/qml/hifi/dialogs/RunningScripts.qml+2−2
@@ -13,8 +13,8 @@ import QtQuick.Controls 1.4 · 12 unmodified lines
1313 import QtQuick.Dialogs 1.2 as OriginalDialogs
1414 import Qt.labs.settings 1.0
1515
16−import "../../styles-uit"
17−import "../../controls-uit" as HifiControls
16+import stylesUit 1.0
17+import controlsUit 1.0 as HifiControls
1818 import "../../windows"
1919 import "../"
2020
interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml+1−1
@@ -9,7 +9,7 @@ · 8 unmodified lines
99 //
1010
1111 import QtQuick 2.5
12−import "../../styles-uit"
12+import stylesUit 1.0
1313
1414 Rectangle {
1515 width: 480
interface/resources/qml/hifi/dialogs/TabletAssetServer.qml+2−2
@@ -14,8 +14,8 @@ import QtQuick.Controls.Styles 1.4 · 13 unmodified lines
1414 import QtQuick.Dialogs 1.2 as OriginalDialogs
1515 import Qt.labs.settings 1.0
1616
17−import "../../styles-uit"
18−import "../../controls-uit" as HifiControls
17+import stylesUit 1.0
18+import controlsUit 1.0 as HifiControls
1919 import "../../windows"
2020 import ".."
2121
interface/resources/qml/hifi/dialogs/TabletDCDialog.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212 import Qt.labs.settings 1.0
1313
14−import "../../styles-uit"
15−import "../../controls-uit" as HifiControls
14+import stylesUit 1.0
15+import controlsUit 1.0 as HifiControls
1616 import "../../windows"
1717
1818 Rectangle {
interface/resources/qml/hifi/dialogs/TabletDebugWindow.qml+2−2
@@ -12,8 +12,8 @@ import QtQuick 2.7 · 11 unmodified lines
1212 import QtQuick.Controls 2.2
1313 import Hifi 1.0 as Hifi
1414
15−import "../../styles-uit"
16−import "../../controls-uit" as HifiControls
15+import stylesUit 1.0
16+import controlsUit 1.0 as HifiControls
1717
1818 Rectangle {
1919 id: root
interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212 import Qt.labs.settings 1.0
1313
14−import "../../styles-uit"
15−import "../../controls-uit" as HifiControls
14+import stylesUit 1.0
15+import controlsUit 1.0 as HifiControls
1616 import "../../windows"
1717
1818 Rectangle {
interface/resources/qml/hifi/dialogs/TabletEntityStatisticsItem.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.5
1212
13−import "../../styles-uit"
14−import "../../controls-uit" as HifiControls
13+import stylesUit 1.0
14+import controlsUit 1.0 as HifiControls
1515
1616 Column {
1717 id: root
interface/resources/qml/hifi/dialogs/TabletLODTools.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.5
1212
13−import "../../styles-uit"
14−import "../../controls-uit" as HifiControls
13+import stylesUit 1.0
14+import controlsUit 1.0 as HifiControls
1515 import "../../windows"
1616
1717 Rectangle {
interface/resources/qml/hifi/dialogs/TabletRunningScripts.qml+6−2
@@ -13,8 +13,8 @@ import QtQuick.Controls 1.4 · 12 unmodified lines
1313 import QtQuick.Dialogs 1.2 as OriginalDialogs
1414 import Qt.labs.settings 1.0
1515
16−import "../../styles-uit"
17−import "../../controls-uit" as HifiControls
16+import stylesUit 1.0
17+import controlsUit 1.0 as HifiControls
1818 import "../../windows"
1919 import "../"
2020
@@ -88,6 +88,10 @@ Rectangle { · 67 unmodified lines
8888 checkMenu.restart();
8989 }
9090
91+ Component.onDestruction: {
92+ keyboard.raised = false;
93+ }
94+
9195 function updateRunningScripts() {
9296 function simplify(path) {
9397 // trim URI querystring/fragment
interface/resources/qml/hifi/dialogs/content/ModelBrowserContent.qml+1−1
@@ -1,7 +1,7 @@
11 import QtQuick 2.7
22 import QtQuick.Controls 2.3
33
4−import "../../../controls-uit" as HifiControls
4+import controlsUit 1.0 as HifiControls
55
66 Column {
77 width: pane.contentWidth
interface/resources/qml/hifi/dialogs/security/Security.qml+344−0
@@ -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+}
interface/resources/qml/hifi/dialogs/security/SecurityImageChange.qmlrenamed from interface/resources/qml/hifi/commerce/wallet/SecurityImageChange.qml+18−23
@@ -1,11 +1,11 @@
11 //
22 // SecurityImageChange.qml
3−// qml/hifi/commerce/wallet
3+// qml\hifi\dialogs\security
44 //
5−// SecurityImageChange
5+// Security
66 //
7−// Created by Zach Fox on 2017-08-18
8−// Copyright 2017 High Fidelity, Inc.
7+// Created by Zach Fox on 2018-10-31
8+// Copyright 2018 High Fidelity, Inc.
99 //
1010 // Distributed under the Apache License, Version 2.0.
1111 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@@ -13,16 +13,17 @@ · 1 unmodified line
1313
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.5
16−import "../../../styles-uit"
17−import "../../../controls-uit" as HifiControlsUit
18−import "../../../controls" as HifiControls
16+import stylesUit 1.0 as HifiStylesUit
17+import controlsUit 1.0 as HifiControlsUit
18+import "qrc:////qml//controls" as HifiControls
1919
2020 // references XXX from root context
2121
22−Item {
23− HifiConstants { id: hifi; }
22+Rectangle {
23+ HifiStylesUit.HifiConstants { id: hifi; }
2424
2525 id: root;
26+ color: hifi.colors.baseGray;
2627 property bool justSubmitted: false;
2728
2829 Connections {
@@ -33,7 +34,7 @@ Item { · 4 unmodified lines
3334 securityImageChangePageSecurityImage.source = "image://security/securityImage";
3435 if (exists) { // Success submitting new security image
3536 if (root.justSubmitted) {
36− sendSignalToWallet({method: "walletSecurity_changeSecurityImageSuccess"});
37+ sendSignalToParent({method: "walletSecurity_changeSecurityImageSuccess"});
3738 root.justSubmitted = false;
3839 }
3940 } else if (root.justSubmitted) {
@@ -72,7 +73,7 @@ Item { · 32 unmodified lines
7273 anchors.bottom: parent.bottom;
7374 height: 22;
7475 // Lock icon
75− HiFiGlyphs {
76+ HifiStylesUit.HiFiGlyphs {
7677 id: lockIcon;
7778 text: hifi.glyphs.lock;
7879 anchors.bottom: parent.bottom;
@@ -83,8 +84,8 @@ Item { · 4 unmodified lines
8384 verticalAlignment: Text.AlignBottom;
8485 color: hifi.colors.white;
8586 }
86− // "Security image" text below pic
87− RalewayRegular {
87+ // "Security image" text below image
88+ HifiStylesUit.RalewayRegular {
8889 id: securityImageText;
8990 text: "SECURITY PIC";
9091 // Text size
@@ -116,9 +117,9 @@ Item { · 25 unmodified lines
116117 anchors.bottom: parent.bottom;
117118
118119 // "Change Security Image" text
119− RalewaySemiBold {
120+ HifiStylesUit.RalewaySemiBold {
120121 id: securityImageTitle;
121− text: "Change Security Pic:";
122+ text: "Change Security Image:";
122123 // Text size
123124 size: 18;
124125 anchors.top: parent.top;
@@ -139,12 +140,6 @@ Item { · 14 unmodified lines
139140 anchors.right: parent.right;
140141 anchors.rightMargin: 16;
141142 height: 300;
142−
143− Connections {
144− onSendSignalToWallet: {
145− sendSignalToWallet(msg);
146− }
147− }
148143 }
149144
150145 // Navigation Bar
@@ -169,7 +164,7 @@ Item { · 18 unmodified lines
169164 width: 150;
170165 text: "Cancel"
171166 onClicked: {
172− sendSignalToWallet({method: "walletSecurity_changeSecurityImageCancelled"});
167+ sendSignalToParent({method: "walletSecurity_changeSecurityImageCancelled"});
173168 }
174169 }
175170
@@ -197,7 +192,7 @@ Item { · 21 unmodified lines
197192 // SECURITY IMAGE SELECTION END
198193 //
199194
200− signal sendSignalToWallet(var msg);
195+ signal sendSignalToParent(var msg);
201196
202197 function initModel() {
203198 securityImageSelection.initModel();
interface/resources/qml/hifi/dialogs/security/SecurityImageModel.qmlrenamed from interface/resources/qml/hifi/commerce/wallet/SecurityImageModel.qml+4−4
@@ -1,11 +1,11 @@
11 //
22 // SecurityImageModel.qml
3−// qml/hifi/commerce
3+// qml\hifi\dialogs\security
44 //
5−// SecurityImageModel
5+// Security
66 //
7−// Created by Zach Fox on 2017-08-17
8−// Copyright 2017 High Fidelity, Inc.
7+// Created by Zach Fox on 2018-10-31
8+// Copyright 2018 High Fidelity, Inc.
99 //
1010 // Distributed under the Apache License, Version 2.0.
1111 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
interface/resources/qml/hifi/dialogs/security/SecurityImageSelection.qmlrenamed from interface/resources/qml/hifi/commerce/wallet/SecurityImageSelection.qml+12−14
@@ -1,11 +1,11 @@
11 //
22 // SecurityImageSelection.qml
3−// qml/hifi/commerce/wallet
3+// qml\hifi\dialogs\security
44 //
5−// SecurityImageSelection
5+// Security
66 //
7−// Created by Zach Fox on 2017-08-17
8−// Copyright 2017 High Fidelity, Inc.
7+// Created by Zach Fox on 2018-10-31
8+// Copyright 2018 High Fidelity, Inc.
99 //
1010 // Distributed under the Apache License, Version 2.0.
1111 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@@ -13,14 +13,14 @@ · 1 unmodified line
1313
1414 import Hifi 1.0 as Hifi
1515 import QtQuick 2.5
16−import "../../../styles-uit"
17−import "../../../controls-uit" as HifiControlsUit
18−import "../../../controls" as HifiControls
16+import stylesUit 1.0 as HifiStylesUit
17+import controlsUit 1.0 as HifiControlsUit
18+import "qrc:////qml//controls" as HifiControls
1919
2020 // references XXX from root context
2121
2222 Item {
23− HifiConstants { id: hifi; }
23+ HifiStylesUit.HifiConstants { id: hifi; }
2424
2525 id: root;
2626 property alias currentIndex: securityImageGrid.currentIndex;
@@ -64,17 +64,15 @@ Item { · 37 unmodified lines
6464 }
6565 }
6666 highlight: Rectangle {
67− width: securityImageGrid.cellWidth;
68− height: securityImageGrid.cellHeight;
69− color: hifi.colors.blueHighlight;
70− }
67+ width: securityImageGrid.cellWidth;
68+ height: securityImageGrid.cellHeight;
69+ color: hifi.colors.blueHighlight;
70+ }
7171 }
7272
7373 //
7474 // FUNCTION DEFINITIONS START
7575 //
76− signal sendSignalToWallet(var msg);
77−
7876 function getImagePathFromImageID(imageID) {
7977 return (imageID ? gridModel.getImagePathFromImageID(imageID) : "");
8078 }
interface/resources/qml/hifi/dialogs/security/images/01.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/01.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/02.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/02.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/03.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/03.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/04.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/04.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/05.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/05.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/06.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/06.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/07.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/07.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/08.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/08.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/09.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/09.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/10.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/10.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/11.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/11.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/12.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/12.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/13.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/13.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/14.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/14.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/15.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/15.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/16.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/16.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/17.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/17.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/18.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/18.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/19.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/19.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/20.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/20.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/21.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/21.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/22.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/22.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/23.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/23.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/24.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/24.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/25.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/25.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/26.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/26.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/27.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/27.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/28.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/28.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/29.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/29.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/30.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/30.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/31.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/31.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/32.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/32.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/33.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/33.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/dialogs/security/images/34.jpgrenamed from interface/resources/qml/hifi/commerce/wallet/images/34.jpg+0−0

File renamed without changes.

interface/resources/qml/hifi/tablet/CalibratingScreen.qml+2−2
@@ -10,9 +10,9 @@ · 9 unmodified lines
1010 import QtQuick 2.5
1111 import QtGraphicalEffects 1.0
1212
13−import "../../styles-uit"
13+import stylesUit 1.0
1414 import "../../controls"
15−import "../../controls-uit" as HifiControls
15+import controlsUit 1.0 as HifiControls
1616
1717
1818 Rectangle {
interface/resources/qml/hifi/tablet/ControllerSettings.qml+2−2
@@ -11,9 +11,9 @@ import QtQuick.Controls 2.2 · 10 unmodified lines
1111 import QtQuick.Layouts 1.3
1212 import QtGraphicalEffects 1.0
1313 import Qt.labs.settings 1.0
14−import "../../styles-uit"
14+import stylesUit 1.0
1515 import "../../controls"
16−import "../../controls-uit" as HifiControls
16+import controlsUit 1.0 as HifiControls
1717 import "../../dialogs"
1818 import "../../dialogs/preferences"
1919 import "tabletWindows"
interface/resources/qml/hifi/tablet/Edit.qml+6−0
@@ -49,5 +49,11 @@ StackView { · 48 unmodified lines
4949 if (currentItem && currentItem.fromScript)
5050 currentItem.fromScript(message);
5151 }
52+
53+ Component.onDestruction: {
54+ if (KeyboardScriptingInterface.raised) {
55+ KeyboardScriptingInterface.raised = false;
56+ }
57+ }
5258 }
5359
interface/resources/qml/hifi/tablet/EditEntityList.qml+2−2
@@ -4,8 +4,8 @@ import QtWebChannel 1.0 · 3 unmodified lines
44 import "../../controls"
55 import "../toolbars"
66 import QtGraphicalEffects 1.0
7−import "../../controls-uit" as HifiControls
8−import "../../styles-uit"
7+import controlsUit 1.0 as HifiControls
8+import stylesUit 1.0
99
1010
1111 WebView {
interface/resources/qml/hifi/tablet/EditTabButton.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
1111
1212 import QtQuick 2.7
1313 import QtQuick.Controls 2.2
14−import "../../controls-uit" as HifiControls
15−import "../../styles-uit"
14+import controlsUit 1.0 as HifiControls
15+import stylesUit 1.0
1616
1717 TabButton {
1818 id: control
interface/resources/qml/hifi/tablet/EditTabView.qml+3−21
@@ -4,8 +4,8 @@ import QtWebChannel 1.0 · 3 unmodified lines
44 import "../../controls"
55 import "../toolbars"
66 import QtGraphicalEffects 1.0
7−import "../../controls-uit" as HifiControls
8−import "../../styles-uit"
7+import controlsUit 1.0 as HifiControls
8+import stylesUit 1.0
99
1010 TabBar {
1111 id: editTabView
@@ -175,7 +175,7 @@ TabBar { · 163 unmodified lines
175175 method: "newEntityButtonClicked",
176176 params: { buttonName: "newParticleButton" }
177177 });
178− editTabView.currentIndex = 4
178+ editTabView.currentIndex = 2
179179 }
180180 }
181181
@@ -279,21 +279,6 @@ TabBar { · 97 unmodified lines
279279 }
280280 }
281281
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−
297282 function fromScript(message) {
298283 switch (message.method) {
299284 case 'selectTab':
@@ -326,9 +311,6 @@ TabBar { · 26 unmodified lines
326311 case 'grid':
327312 editTabView.currentIndex = 3;
328313 break;
329− case 'particle':
330− editTabView.currentIndex = 4;
331− break;
332314 default:
333315 console.warn('Attempt to switch to invalid tab:', id);
334316 }
interface/resources/qml/hifi/tablet/EditToolsTabView.qml+4−23
@@ -4,8 +4,8 @@ import QtWebChannel 1.0 · 3 unmodified lines
44 import "../../controls"
55 import "../toolbars"
66 import QtGraphicalEffects 1.0
7−import "../../controls-uit" as HifiControls
8−import "../../styles-uit"
7+import controlsUit 1.0 as HifiControls
8+import stylesUit 1.0
99
1010 TabBar {
1111 id: editTabView
@@ -18,7 +18,6 @@ TabBar { · 6 unmodified lines
1818 readonly property int create: 0
1919 readonly property int properties: 1
2020 readonly property int grid: 2
21− readonly property int particle: 3
2221 }
2322
2423 readonly property HifiConstants hifi: HifiConstants {}
@@ -182,7 +181,7 @@ TabBar { · 157 unmodified lines
182181 method: "newEntityButtonClicked",
183182 params: { buttonName: "newParticleButton" }
184183 });
185− editTabView.currentIndex = tabIndex.particle
184+ editTabView.currentIndex = tabIndex.properties
186185 }
187186 }
188187
@@ -271,21 +270,6 @@ TabBar { · 82 unmodified lines
271270 }
272271 }
273272
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−
289273 function fromScript(message) {
290274 switch (message.method) {
291275 case 'selectTab':
@@ -299,7 +283,7 @@ TabBar { · 7 unmodified lines
299283 // Changes the current tab based on tab index or title as input
300284 function selectTab(id) {
301285 if (typeof id === 'number') {
302− if (id >= tabIndex.create && id <= tabIndex.particle) {
286+ if (id >= tabIndex.create && id <= tabIndex.grid) {
303287 editTabView.currentIndex = id;
304288 } else {
305289 console.warn('Attempt to switch to invalid tab:', id);
@@ -315,9 +299,6 @@ TabBar { · 9 unmodified lines
315299 case 'grid':
316300 editTabView.currentIndex = tabIndex.grid;
317301 break;
318− case 'particle':
319− editTabView.currentIndex = tabIndex.particle;
320− break;
321302 default:
322303 console.warn('Attempt to switch to invalid tab:', id);
323304 }
interface/resources/qml/hifi/tablet/InputRecorder.qml+2−2
@@ -9,8 +9,8 @@ · 8 unmodified lines
99 import QtQuick 2.5
1010 import Hifi 1.0
1111
12−import "../../styles-uit"
13−import "../../controls-uit" as HifiControls
12+import stylesUit 1.0
13+import controlsUit 1.0 as HifiControls
1414 import "../../windows"
1515 import "../../dialogs"
1616
interface/resources/qml/hifi/tablet/NewMaterialDialog.qml+2−2
@@ -13,8 +13,8 @@ import QtQuick 2.7 · 12 unmodified lines
1313 import QtQuick.Controls 2.2
1414 import QtQuick.Dialogs 1.2 as OriginalDialogs
1515
16−import "../../styles-uit"
17−import "../../controls-uit"
16+import stylesUit 1.0
17+import controlsUit 1.0
1818 import "../dialogs"
1919
2020 Rectangle {
interface/resources/qml/hifi/tablet/NewModelDialog.qml+2−2
@@ -12,8 +12,8 @@ · 11 unmodified lines
1212 import QtQuick 2.5
1313 import QtQuick.Dialogs 1.2 as OriginalDialogs
1414
15−import "../../styles-uit"
16−import "../../controls-uit"
15+import stylesUit 1.0
16+import controlsUit 1.0
1717 import "../dialogs"
1818
1919 Rectangle {
interface/resources/qml/hifi/tablet/OpenVrConfiguration.qml+40−5
@@ -9,9 +9,9 @@ · 8 unmodified lines
99 import QtQuick 2.5
1010 import QtGraphicalEffects 1.0
1111
12−import "../../styles-uit"
12+import stylesUit 1.0
1313 import "../../controls"
14−import "../../controls-uit" as HifiControls
14+import controlsUit 1.0 as HifiControls
1515 import "."
1616
1717
@@ -822,11 +822,44 @@ Flickable { · 804 unmodified lines
822822 }
823823 }
824824
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+
825858 RalewayBold {
826859 id: viveDesktopText
827− size: 10
860+ size: 12
828861 text: "Use " + stack.selectedPlugin + " devices in desktop mode"
829− color: hifi.colors.white
862+ color: hifi.colors.lightGrayText
830863
831864 anchors {
832865 left: viveInDesktop.right
@@ -946,6 +979,7 @@ Flickable { · 113 unmodified lines
946979
947980 viveInDesktop.checked = desktopMode;
948981 hmdInDesktop.checked = hmdDesktopPosition;
982+ outOfRangeDataStrategyComboBox.currentIndex = outOfRangeDataStrategyComboBox.model.indexOf(settings.outOfRangeDataStrategy);
949983
950984 initializeButtonState();
951985 updateCalibrationText();
@@ -1107,7 +1141,8 @@ Flickable { · 155 unmodified lines
11071141 "armCircumference": armCircumference.realValue,
11081142 "shoulderWidth": shoulderWidth.realValue,
11091143 "desktopMode": viveInDesktop.checked,
1110− "hmdDesktopTracking": hmdInDesktop.checked
1144+ "hmdDesktopTracking": hmdInDesktop.checked,
1145+ "outOfRangeDataStrategy": outOfRangeDataStrategyComboBox.model[outOfRangeDataStrategyComboBox.currentIndex]
11111146 }
11121147
11131148 return settingsObject;
interface/resources/qml/hifi/tablet/TabletAddressDialog.qml+10−2
@@ -18,8 +18,8 @@ import "../../styles" · 17 unmodified lines
1818 import "../../windows"
1919 import "../"
2020 import "../toolbars"
21−import "../../styles-uit" as HifiStyles
22−import "../../controls-uit" as HifiControls
21+import stylesUit 1.0 as HifiStyles
22+import controlsUit 1.0 as HifiControls
2323 import QtQuick.Controls 2.2 as QQC2
2424 import QtQuick.Templates 2.2 as T
2525
@@ -56,10 +56,13 @@ StackView { · 30 unmodified lines
5656 Qt.callLater(function() {
5757 addressBarDialog.keyboardEnabled = HMD.active;
5858 addressLine.forceActiveFocus();
59+ addressBarDialog.raised = true;
5960 })
6061 }
62+
6163 Component.onDestruction: {
6264 root.parentChanged.disconnect(center);
65+ keyboard.raised = false;
6366 }
6467
6568 function center() {
@@ -218,6 +221,11 @@ StackView { · 152 unmodified lines
218221 leftMargin: 8;
219222 verticalCenter: addressLineContainer.verticalCenter;
220223 }
224+
225+ onFocusChanged: {
226+ addressBarDialog.raised = focus;
227+ }
228+
221229 onTextChanged: {
222230 updateLocationText(text.length > 0);
223231 }
interface/resources/qml/hifi/tablet/TabletHome.qml+1−1
@@ -6,7 +6,7 @@ import QtQuick.Layouts 1.3 · 5 unmodified lines
66 import TabletScriptingInterface 1.0
77
88 import "."
9−import "../../styles-uit"
9+import stylesUit 1.0
1010 import "../audio" as HifiAudio
1111
1212 Item {
interface/resources/qml/hifi/tablet/TabletMenu.qml+1−1
@@ -7,7 +7,7 @@ import QtWebEngine 1.1 · 6 unmodified lines
77
88
99 import "."
10−import "../../styles-uit"
10+import stylesUit 1.0
1111 import "../../controls"
1212
1313 FocusScope {
interface/resources/qml/hifi/tablet/TabletMenuItem.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212 import QtQuick.Controls 1.4
1313
14−import "../../controls-uit"
15−import "../../styles-uit"
14+import controlsUit 1.0
15+import stylesUit 1.0
1616
1717 Item {
1818 id: root
interface/resources/qml/hifi/tablet/TabletMenuView.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212 import TabletScriptingInterface 1.0
1313
14−import "../../styles-uit"
14+import stylesUit 1.0
1515 import "."
1616
1717 FocusScope {
interface/resources/qml/hifi/tablet/TabletModelBrowserDialog.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
1010
1111 import QtQuick 2.5
1212
13−import "../../controls-uit" as HifiControls
14−import "../../styles-uit"
13+import controlsUit 1.0 as HifiControls
14+import stylesUit 1.0
1515 import "../dialogs/content"
1616
1717 Item {
interface/resources/qml/hifi/tablet/WindowRoot.qml+15−2
@@ -129,8 +129,21 @@ Windows.ScrollingWindow { · 128 unmodified lines
129129
130130 height: pane.scrollHeight
131131 width: pane.contentWidth
132− anchors.left: parent.left
133− anchors.top: parent.top
132+
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+
134147 signal loaded;
135148
136149 onWidthChanged: {
interface/resources/qml/hifi/tablet/tabletWindows/TabletFileDialog.qml+2−2
@@ -16,8 +16,8 @@ import QtQuick.Controls 1.4 as QQC1 · 15 unmodified lines
1616 import QtQuick.Controls 2.3
1717
1818 import ".."
19−import "../../../controls-uit"
20−import "../../../styles-uit"
19+import controlsUit 1.0
20+import stylesUit 1.0
2121 import "../../../windows"
2222
2323 import "../../../dialogs/fileDialog"
interface/resources/qml/hifi/tablet/tabletWindows/TabletPreferencesDialog.qml+6−2
@@ -12,8 +12,8 @@ import QtQuick 2.5 · 11 unmodified lines
1212
1313 import "."
1414 import "./preferences"
15−import "../../../styles-uit"
16−import "../../../controls-uit" as HifiControls
15+import stylesUit 1.0
16+import controlsUit 1.0 as HifiControls
1717
1818 Item {
1919 id: dialog
@@ -242,6 +242,10 @@ Item { · 222 unmodified lines
242242 keyboardEnabled = HMD.active;
243243 }
244244
245+ Component.onDestruction: {
246+ keyboard.raised = false;
247+ }
248+
245249 onKeyboardRaisedChanged: {
246250 if (keyboardEnabled && keyboardRaised) {
247251 var delta = mouseArea.mouseY - (dialog.height - footer.height - keyboard.raisedHeight -hifi.dimensions.controlLineHeight);
interface/resources/qml/hifi/tablet/tabletWindows/preferences/Section.qml+2−2
@@ -12,8 +12,8 @@ import QtQuick 2.5 · 11 unmodified lines
1212 import Hifi 1.0
1313
1414 import "../../../../dialogs/preferences"
15−import "../../../../controls-uit" as HiFiControls
16−import "../../../../styles-uit"
15+import controlsUit 1.0 as HiFiControls
16+import stylesUit 1.0
1717 import "."
1818
1919 Preference {
interface/resources/qml/hifi/tablet/tabletWindows/preferences/TabletBrowsablePreference.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
1111 import QtQuick 2.5
1212
1313 import "../../../../dialogs"
14−import "../../../../controls-uit"
14+import controlsUit 1.0
1515 import "../"
1616
1717 Preference {
interface/resources/qml/hifi/tts/TTS.qml+314−0
@@ -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.

interface/resources/qml/styles-uit/AnonymousProRegular.qml+2−18

This diff is large: its 23 lines aren’t shown here.

interface/resources/qml/styles-uit/ButtonLabel.qml+2−14

This diff is large: its 19 lines aren’t shown here.

interface/resources/qml/styles-uit/FiraSansRegular.qml+2−18

This diff is large: its 23 lines aren’t shown here.

interface/resources/qml/styles-uit/FiraSansSemiBold.qml+2−18

This diff is large: its 23 lines aren’t shown here.

interface/resources/qml/styles-uit/HiFiGlyphs.qml+2−20

This diff is large: its 25 lines aren’t shown here.

interface/resources/qml/styles-uit/HifiConstants.qml+2−351

This diff is large: its 356 lines aren’t shown here.

interface/resources/qml/styles-uit/IconButton.qml+2−16

This diff is large: its 21 lines aren’t shown here.

interface/resources/qml/styles-uit/InfoItem.qml+2−15

This diff is large: its 20 lines aren’t shown here.

interface/resources/qml/styles-uit/InputLabel.qml+2−14

This diff is large: its 19 lines aren’t shown here.

interface/resources/qml/styles-uit/ListItem.qml+2−14

This diff is large: its 19 lines aren’t shown here.

interface/resources/qml/styles-uit/Logs.qml+2−14

This diff is large: its 19 lines aren’t shown here.

interface/resources/qml/styles-uit/OverlayTitle.qml+2−14

This diff is large: its 19 lines aren’t shown here.

interface/resources/qml/styles-uit/RalewayBold.qml+2−19

This diff is large: its 24 lines aren’t shown here.

interface/resources/qml/styles-uit/RalewayLight.qml+2−18

This diff is large: its 23 lines aren’t shown here.

interface/resources/qml/styles-uit/RalewayRegular.qml+2−18

This diff is large: its 23 lines aren’t shown here.

interface/resources/qml/styles-uit/RalewaySemiBold.qml+2−19

This diff is large: its 24 lines aren’t shown here.

interface/resources/qml/styles-uit/SectionName.qml+2−15

This diff is large: its 20 lines aren’t shown here.

interface/resources/qml/styles-uit/Separator.qml+2−39

This diff is large: its 44 lines aren’t shown here.

interface/resources/qml/styles-uit/ShortcutText.qml+2−14

This diff is large: its 19 lines aren’t shown here.

interface/resources/qml/styles-uit/TabName.qml+2−15

This diff is large: its 20 lines aren’t shown here.

interface/resources/qml/styles-uit/TextFieldInput.qml+2−14

This diff is large: its 19 lines aren’t shown here.

interface/resources/qml/styles-uit/readme.txt+1−0

This diff is large: its 2 lines aren’t shown here.

interface/resources/qml/stylesUit/+android/HifiConstants.qmlrenamed from interface/resources/qml/styles-uit/+android/HifiConstants.qml+0−0

File renamed without changes.

interface/resources/qml/stylesUit/AnonymousProRegular.qml+20−0

This diff is large: its 21 lines aren’t shown here.

interface/resources/qml/stylesUit/ButtonLabel.qml+16−0

This diff is large: its 17 lines aren’t shown here.

interface/resources/qml/stylesUit/FiraSansRegular.qml+20−0

This diff is large: its 21 lines aren’t shown here.

interface/resources/qml/stylesUit/FiraSansSemiBold.qml+20−0

This diff is large: its 21 lines aren’t shown here.

interface/resources/qml/stylesUit/HiFiGlyphs.qml+22−0

This diff is large: its 23 lines aren’t shown here.

interface/resources/qml/stylesUit/HifiConstants.qml+353−0

This diff is large: its 354 lines aren’t shown here.

interface/resources/qml/stylesUit/IconButton.qml+18−0

This diff is large: its 19 lines aren’t shown here.

interface/resources/qml/stylesUit/InfoItem.qml+17−0

This diff is large: its 18 lines aren’t shown here.

interface/resources/qml/stylesUit/InputLabel.qml+16−0

This diff is large: its 17 lines aren’t shown here.

interface/resources/qml/stylesUit/ListItem.qml+16−0

This diff is large: its 17 lines aren’t shown here.

interface/resources/qml/stylesUit/Logs.qml+16−0

This diff is large: its 17 lines aren’t shown here.

interface/resources/qml/stylesUit/OverlayTitle.qml+16−0

This diff is large: its 17 lines aren’t shown here.

interface/resources/qml/stylesUit/RalewayBold.qml+21−0

This diff is large: its 22 lines aren’t shown here.

interface/resources/qml/stylesUit/RalewayLight.qml+20−0

This diff is large: its 21 lines aren’t shown here.

interface/resources/qml/stylesUit/RalewayRegular.qml+20−0

This diff is large: its 21 lines aren’t shown here.

interface/resources/qml/stylesUit/RalewaySemiBold.qml+21−0

This diff is large: its 22 lines aren’t shown here.

interface/resources/qml/stylesUit/SectionName.qml+17−0

This diff is large: its 18 lines aren’t shown here.

interface/resources/qml/stylesUit/Separator.qml+41−0

This diff is large: its 42 lines aren’t shown here.

interface/resources/qml/stylesUit/ShortcutText.qml+16−0

This diff is large: its 17 lines aren’t shown here.

interface/resources/qml/stylesUit/TabName.qml+17−0

This diff is large: its 18 lines aren’t shown here.

interface/resources/qml/stylesUit/TextFieldInput.qml+16−0

This diff is large: its 17 lines aren’t shown here.

interface/resources/qml/stylesUit/qmldirrenamed from interface/resources/qml/styles-uit/qmldir+0−0

File renamed without changes.

interface/resources/qml/windows/Decoration.qml+1−1

This diff is large: its 9 lines aren’t shown here.

interface/resources/qml/windows/DefaultFrame.qml+1−1

This diff is large: its 9 lines aren’t shown here.

interface/resources/qml/windows/DefaultFrameDecoration.qml+1−1

This diff is large: its 9 lines aren’t shown here.

interface/resources/qml/windows/Fadable.qml+1−1

This diff is large: its 9 lines aren’t shown here.

interface/resources/qml/windows/Frame.qml+1−1

This diff is large: its 9 lines aren’t shown here.

interface/resources/qml/windows/ModalFrame.qml+2−2

This diff is large: its 11 lines aren’t shown here.

interface/resources/qml/windows/ScrollingWindow.qml+2−2

This diff is large: its 11 lines aren’t shown here.

interface/resources/qml/windows/TabletModalFrame.qml+2−2

This diff is large: its 11 lines aren’t shown here.

interface/resources/qml/windows/ToolFrame.qml+1−1

This diff is large: its 9 lines aren’t shown here.

interface/resources/qml/windows/ToolFrameDecoration.qml+1−1

This diff is large: its 9 lines aren’t shown here.

interface/resources/qml/windows/Window.qml+1−1

This diff is large: its 9 lines aren’t shown here.

interface/resources/sounds/keyboard_key.mp3+0−0

Binary file not shown.

interface/src/Application.cpp+164−60

This diff is large: its 461 lines aren’t shown here.

interface/src/Application.h+5−0

This diff is large: its 18 lines aren’t shown here.

interface/src/Menu.cpp+80−51

This diff is large: its 187 lines aren’t shown here.

interface/src/Menu.h+2−0

This diff is large: its 16 lines aren’t shown here.

interface/src/ModelPackager.cpp+17−17

This diff is large: its 87 lines aren’t shown here.

interface/src/ModelPackager.h+3−3

This diff is large: its 27 lines aren’t shown here.

interface/src/ModelPropertiesDialog.cpp+10−10

This diff is large: its 67 lines aren’t shown here.

interface/src/ModelPropertiesDialog.h+2−2

This diff is large: its 18 lines aren’t shown here.

interface/src/Util.cpp+1−1

This diff is large: its 9 lines aren’t shown here.

interface/src/assets/ATPAssetMigrator.cpp+2−2

This diff is large: its 11 lines aren’t shown here.

interface/src/avatar/AvatarActionHold.cpp+2−2

This diff is large: its 18 lines aren’t shown here.

interface/src/avatar/AvatarManager.cpp+40−19

This diff is large: its 112 lines aren’t shown here.

interface/src/avatar/AvatarManager.h+5−4

This diff is large: its 24 lines aren’t shown here.

interface/src/avatar/MyAvatar.cpp+8−11

This diff is large: its 73 lines aren’t shown here.

interface/src/avatar/MySkeletonModel.cpp+24−45

This diff is large: its 153 lines aren’t shown here.

interface/src/avatar/MySkeletonModel.h+4−2

This diff is large: its 23 lines aren’t shown here.

interface/src/commerce/Ledger.cpp+8−3

This diff is large: its 39 lines aren’t shown here.

interface/src/commerce/Ledger.h+1−1

This diff is large: its 9 lines aren’t shown here.

interface/src/commerce/QmlCommerce.cpp+2−2

This diff is large: its 12 lines aren’t shown here.

interface/src/commerce/QmlCommerce.h+1−1

This diff is large: its 9 lines aren’t shown here.

interface/src/commerce/Wallet.cpp+1−1

This diff is large: its 9 lines aren’t shown here.

interface/src/main.cpp+13−0

This diff is large: its 27 lines aren’t shown here.

interface/src/raypick/CollisionPick.cpp+15−15

This diff is large: its 100 lines aren’t shown here.

interface/src/raypick/PickScriptingInterface.cpp+10−2

This diff is large: its 30 lines aren’t shown here.

interface/src/raypick/PointerScriptingInterface.cpp+37−1

This diff is large: its 60 lines aren’t shown here.

interface/src/raypick/RayPick.cpp+1−1

This diff is large: its 6 lines aren’t shown here.

interface/src/raypick/StylusPick.cpp+7−11

This diff is large: its 57 lines aren’t shown here.

interface/src/raypick/StylusPick.h+4−2

This diff is large: its 19 lines aren’t shown here.

interface/src/raypick/StylusPointer.cpp+22−10

This diff is large: its 66 lines aren’t shown here.

interface/src/raypick/StylusPointer.h+6−1

This diff is large: its 21 lines aren’t shown here.

interface/src/scripting/Audio.h+2−0

This diff is large: its 9 lines aren’t shown here.

interface/src/scripting/HMDScriptingInterface.cpp+5−2

This diff is large: its 14 lines aren’t shown here.

interface/src/scripting/HMDScriptingInterface.h+2−0

This diff is large: its 9 lines aren’t shown here.

interface/src/scripting/KeyboardScriptingInterface.cpp+34−0

This diff is large: its 35 lines aren’t shown here.

interface/src/scripting/KeyboardScriptingInterface.h+43−0

This diff is large: its 44 lines aren’t shown here.

interface/src/scripting/TTSScriptingInterface.cpp+163−0

This diff is large: its 164 lines aren’t shown here.

interface/src/scripting/TTSScriptingInterface.h+88−0

This diff is large: its 89 lines aren’t shown here.

interface/src/scripting/WalletScriptingInterface.cpp+4−2

This diff is large: its 23 lines aren’t shown here.

interface/src/scripting/WalletScriptingInterface.h+21−10

This diff is large: its 102 lines aren’t shown here.

interface/src/ui/ApplicationOverlay.cpp+1−0

This diff is large: its 8 lines aren’t shown here.

interface/src/ui/Keyboard.cpp+882−0

This diff is large: its 883 lines aren’t shown here.

interface/src/ui/Keyboard.h+155−0

This diff is large: its 156 lines aren’t shown here.

interface/src/ui/PreferencesDialog.cpp+0−1

This diff is large: its 8 lines aren’t shown here.

interface/src/ui/overlays/Base3DOverlay.cpp+1−0

This diff is large: its 8 lines aren’t shown here.

interface/src/ui/overlays/Base3DOverlay.h+0−2

This diff is large: its 9 lines aren’t shown here.

interface/src/ui/overlays/ContextOverlayInterface.cpp+1−6

This diff is large: its 14 lines aren’t shown here.

interface/src/ui/overlays/Image3DOverlay.cpp+12−2

This diff is large: its 42 lines aren’t shown here.

interface/src/ui/overlays/Image3DOverlay.h+1−0

This diff is large: its 8 lines aren’t shown here.

interface/src/ui/overlays/ModelOverlay.cpp+17−15

This diff is large: its 81 lines aren’t shown here.

interface/src/ui/overlays/Overlay.cpp+1−1

This diff is large: its 9 lines aren’t shown here.

interface/src/ui/overlays/Overlays.cpp+44−16

This diff is large: its 130 lines aren’t shown here.

interface/src/ui/overlays/Volume3DOverlay.cpp+4−14

This diff is large: its 32 lines aren’t shown here.

interface/src/ui/overlays/Volume3DOverlay.h+1−2

This diff is large: its 17 lines aren’t shown here.

interface/src/ui/overlays/Web3DOverlay.cpp+4−0

This diff is large: its 26 lines aren’t shown here.

libraries/animation/src/AnimClip.cpp+11−11

This diff is large: its 62 lines aren’t shown here.

libraries/animation/src/AnimClip.h+2−0

This diff is large: its 9 lines aren’t shown here.

libraries/animation/src/AnimInverseKinematics.cpp+18−4

This diff is large: its 38 lines aren’t shown here.

libraries/animation/src/AnimSkeleton.cpp+8−8

This diff is large: its 50 lines aren’t shown here.

libraries/animation/src/AnimSkeleton.h+4−4

This diff is large: its 23 lines aren’t shown here.

libraries/animation/src/AnimTwoBoneIK.cpp+5−2

This diff is large: its 20 lines aren’t shown here.

libraries/animation/src/AnimUtil.h+90−0

This diff is large: its 95 lines aren’t shown here.

libraries/animation/src/AnimationCache.cpp+17−17

This diff is large: its 86 lines aren’t shown here.

libraries/animation/src/AnimationCache.h+6−6

This diff is large: its 43 lines aren’t shown here.

libraries/animation/src/AnimationObject.cpp+4−4

This diff is large: its 22 lines aren’t shown here.

libraries/animation/src/AnimationObject.h+2−2

This diff is large: its 16 lines aren’t shown here.

libraries/animation/src/Rig.cpp+249−52

This diff is large: its 514 lines aren’t shown here.

libraries/animation/src/Rig.h+51−12

This diff is large: its 157 lines aren’t shown here.

libraries/audio-client/src/AudioClient.cpp+23−5

This diff is large: its 52 lines aren’t shown here.

libraries/audio-client/src/AudioClient.h+3−1

This diff is large: its 25 lines aren’t shown here.

libraries/audio/src/AbstractAudioInterface.h+3−0

This diff is large: its 17 lines aren’t shown here.

libraries/audio/src/AudioInjectorLocalBuffer.h+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/audio/src/AudioSolo.cpp+88−0

This diff is large: its 89 lines aren’t shown here.

libraries/audio/src/AudioSolo.h+40−0

This diff is large: its 41 lines aren’t shown here.

libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp+59−65

This diff is large: its 249 lines aren’t shown here.

libraries/avatars-renderer/src/avatars-renderer/Avatar.h+16−13

This diff is large: its 84 lines aren’t shown here.

libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp+23−23

This diff is large: its 144 lines aren’t shown here.

libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.h+2−2

This diff is large: its 13 lines aren’t shown here.

libraries/avatars/src/AvatarData.cpp+274−199

This diff is large: its 752 lines aren’t shown here.

libraries/avatars/src/AvatarData.h+34−5

This diff is large: its 104 lines aren’t shown here.

libraries/avatars/src/AvatarHashMap.cpp+38−31

This diff is large: its 88 lines aren’t shown here.

libraries/baking/CMakeLists.txt+1−4

This diff is large: its 9 lines aren’t shown here.

libraries/baking/src/FBXBaker.cpp+5−5

This diff is large: its 45 lines aren’t shown here.

libraries/baking/src/FBXBaker.h+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/baking/src/ModelBaker.cpp+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/baking/src/ModelBaker.h+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/baking/src/OBJBaker.cpp+10−10

This diff is large: its 65 lines aren’t shown here.

libraries/baking/src/OBJBaker.h+2−2

This diff is large: its 11 lines aren’t shown here.

libraries/controllers/src/controllers/impl/Filter.cpp+2−0

This diff is large: its 16 lines aren’t shown here.

libraries/controllers/src/controllers/impl/filters/AccelerationLimiterFilter.cpp+192−0

This diff is large: its 193 lines aren’t shown here.

libraries/controllers/src/controllers/impl/filters/AccelerationLimiterFilter.h+41−0

This diff is large: its 42 lines aren’t shown here.

libraries/controllers/src/controllers/impl/filters/ExponentialSmoothingFilter.cpp+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp+3−0

This diff is large: its 18 lines aren’t shown here.

libraries/entities-renderer/src/RenderableModelEntityItem.cpp+34−35

This diff is large: its 196 lines aren’t shown here.

libraries/entities-renderer/src/RenderableWebEntityItem.cpp+5−10

This diff is large: its 64 lines aren’t shown here.

libraries/entities-renderer/src/RenderableWebEntityItem.h+0−1

This diff is large: its 8 lines aren’t shown here.

libraries/entities/src/EntityEditFilters.cpp+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/entities/src/EntityItemProperties.cpp+12−0

This diff is large: its 26 lines aren’t shown here.

libraries/entities/src/EntityItemProperties.h+1−0

This diff is large: its 8 lines aren’t shown here.

libraries/entities/src/EntityScriptingInterface.cpp+238−0

This diff is large: its 287 lines aren’t shown here.

libraries/entities/src/EntityTree.cpp+118−101

This diff is large: its 240 lines aren’t shown here.

libraries/entities/src/EntityTree.h+2−0

This diff is large: its 7 lines aren’t shown here.

libraries/entities/src/GrabPropertyGroup.cpp+30−0

This diff is large: its 79 lines aren’t shown here.

libraries/entities/src/ParticleEffectEntityItem.cpp+14−13

This diff is large: its 52 lines aren’t shown here.

libraries/entities/src/ParticleEffectEntityItem.h+2−1

This diff is large: its 12 lines aren’t shown here.

libraries/fbx/src/FBX.h+48−48

This diff is large: its 232 lines aren’t shown here.

libraries/fbx/src/FBXReader.cpp+186−186

This diff is large: its 931 lines aren’t shown here.

libraries/fbx/src/FBXReader.h+10−10

This diff is large: its 55 lines aren’t shown here.

libraries/fbx/src/FBXReader_Material.cpp+20−20

This diff is large: its 154 lines aren’t shown here.

libraries/fbx/src/FBXReader_Mesh.cpp+40−40

This diff is large: its 233 lines aren’t shown here.

libraries/fbx/src/GLTFReader.cpp+79−79

This diff is large: its 324 lines aren’t shown here.

libraries/fbx/src/GLTFReader.h+6−6

This diff is large: its 33 lines aren’t shown here.

libraries/fbx/src/OBJReader.cpp+64−64

This diff is large: its 270 lines aren’t shown here.

libraries/fbx/src/OBJReader.h+6−6

This diff is large: its 42 lines aren’t shown here.

libraries/gl/src/gl/Context.cpp+14−30

This diff is large: its 115 lines aren’t shown here.

libraries/gl/src/gl/Context.h+8−6

This diff is large: its 61 lines aren’t shown here.

libraries/gl/src/gl/ContextQt.cpp+44−8

This diff is large: its 80 lines aren’t shown here.

libraries/gl/src/gl/GLHelpers.cpp+45−1

This diff is large: its 82 lines aren’t shown here.

libraries/gl/src/gl/GLHelpers.h+3−0

This diff is large: its 10 lines aren’t shown here.

libraries/gl/src/gl/GLWidget.cpp+2−2

This diff is large: its 13 lines aren’t shown here.

libraries/gl/src/gl/GLWidget.h+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/gl/src/gl/GLWindow.cpp+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/gl/src/gl/OffscreenGLCanvas.cpp+6−24

This diff is large: its 65 lines aren’t shown here.

libraries/gl/src/gl/OffscreenGLCanvas.h+2−3

This diff is large: its 24 lines aren’t shown here.

libraries/gl/src/gl/QOpenGLContextWrapper.cpp+17−0

This diff is large: its 31 lines aren’t shown here.

libraries/gl/src/gl/QOpenGLContextWrapper.h+5−0

This diff is large: its 19 lines aren’t shown here.

libraries/gpu-gl-common/src/gpu/gl/GLBackend.cpp+42−63

This diff is large: its 189 lines aren’t shown here.

libraries/gpu-gl-common/src/gpu/gl/GLBackend.h+27−9

This diff is large: its 44 lines aren’t shown here.

libraries/gpu-gl/src/gpu/gl41/GL41BackendShader.cpp+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/gpu-gles/src/gpu/gles/GLESBackend.h+4−0

This diff is large: its 11 lines aren’t shown here.

libraries/gpu-gles/src/gpu/gles/GLESBackendBuffer.cpp+46−13

This diff is large: its 112 lines aren’t shown here.

libraries/gpu/src/gpu/MipGeneration.slh+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/gpu/src/gpu/ShaderConstants.h+6−0

This diff is large: its 13 lines aren’t shown here.

libraries/graphics/src/graphics/BufferViewHelpers.h+0−1

This diff is large: its 8 lines aren’t shown here.

libraries/image/src/image/Image.cpp+2−2

This diff is large: its 11 lines aren’t shown here.

libraries/model-networking/src/model-networking/ModelCache.cpp+57−47

This diff is large: its 261 lines aren’t shown here.

libraries/model-networking/src/model-networking/ModelCache.h+7−7

This diff is large: its 50 lines aren’t shown here.

libraries/model-networking/src/model-networking/TextureCache.cpp+2−2

This diff is large: its 18 lines aren’t shown here.

libraries/networking/src/AccountManager.cpp+4−0

This diff is large: its 8 lines aren’t shown here.

libraries/networking/src/AccountManager.h+6−0

This diff is large: its 27 lines aren’t shown here.

libraries/networking/src/AddressManager.cpp+5−5

This diff is large: its 30 lines aren’t shown here.

libraries/networking/src/DomainHandler.cpp+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/networking/src/DomainHandler.h+5−1

This diff is large: its 13 lines aren’t shown here.

libraries/networking/src/NetworkingConstants.h+5−5

This diff is large: its 20 lines aren’t shown here.

libraries/networking/src/ResourceCache.cpp+3−1

This diff is large: its 18 lines aren’t shown here.

libraries/networking/src/ResourceCache.h+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/networking/src/ResourceManager.cpp+9−9

This diff is large: its 49 lines aren’t shown here.

libraries/networking/src/udt/CongestionControl.h+2−0

This diff is large: its 11 lines aren’t shown here.

libraries/networking/src/udt/Connection.cpp+11−11

This diff is large: its 47 lines aren’t shown here.

libraries/networking/src/udt/PacketHeaders.h+1−2

This diff is large: its 16 lines aren’t shown here.

libraries/networking/src/udt/SendQueue.cpp+1−0

This diff is large: its 8 lines aren’t shown here.

libraries/networking/src/udt/SequenceNumber.h+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/networking/src/udt/TCPVegasCC.cpp+132−84

This diff is large: its 313 lines aren’t shown here.

libraries/networking/src/udt/TCPVegasCC.h+16−3

This diff is large: its 43 lines aren’t shown here.

libraries/physics/src/CharacterController.cpp+5−3

This diff is large: its 20 lines aren’t shown here.

libraries/physics/src/ObjectMotionState.cpp+9−8

This diff is large: its 25 lines aren’t shown here.

libraries/physics/src/PhysicsEngine.cpp+6−0

This diff is large: its 13 lines aren’t shown here.

libraries/qml/src/qml/impl/RenderEventHandler.cpp+6−2

This diff is large: its 37 lines aren’t shown here.

libraries/qml/src/qml/impl/TextureCache.cpp+9−5

This diff is large: its 28 lines aren’t shown here.

libraries/render-utils/src/AnimDebugDraw.cpp+11−6

This diff is large: its 55 lines aren’t shown here.

libraries/render-utils/src/AnimDebugDraw.h+2−1

This diff is large: its 10 lines aren’t shown here.

libraries/render-utils/src/Blendshape.slh+2−2

This diff is large: its 15 lines aren’t shown here.

libraries/render-utils/src/CauterizedModel.cpp+12−12

This diff is large: its 82 lines aren’t shown here.

libraries/render-utils/src/Highlight_aabox.slv+2−2

This diff is large: its 18 lines aren’t shown here.

libraries/render-utils/src/LightStage.cpp+2−1

This diff is large: its 10 lines aren’t shown here.

libraries/render-utils/src/MeshPartPayload.cpp+10−6

This diff is large: its 32 lines aren’t shown here.

libraries/render-utils/src/Model.cpp+54−54

This diff is large: its 352 lines aren’t shown here.

libraries/render-utils/src/Model.h+5−5

This diff is large: its 38 lines aren’t shown here.

libraries/render-utils/src/SoftAttachmentModel.cpp+4−4

This diff is large: its 27 lines aren’t shown here.

libraries/render-utils/src/WorkloadResource.slh+4−4

This diff is large: its 36 lines aren’t shown here.

libraries/render-utils/src/debug_deferred_buffer.slf+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/render/src/render/CullTask.cpp+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/render/src/render/drawItemBounds.slv+2−2

This diff is large: its 18 lines aren’t shown here.

libraries/script-engine/src/AudioScriptingInterface.h+38−2

This diff is large: its 52 lines aren’t shown here.

libraries/shaders/src/shaders/Shaders.cpp+1−1

This diff is large: its 9 lines aren’t shown here.

libraries/shared/src/AvatarConstants.h+4−3

This diff is large: its 14 lines aren’t shown here.

libraries/shared/src/GLMHelpers.cpp+8−5

This diff is large: its 34 lines aren’t shown here.

libraries/shared/src/PrioritySortUtil.h+11−2

This diff is large: its 27 lines aren’t shown here.

libraries/shared/src/RegisteredMetaTypes.h+9−5

This diff is large: its 42 lines aren’t shown here.

libraries/shared/src/SpatiallyNestable.cpp+6−4

This diff is large: its 17 lines aren’t shown here.

libraries/ui/src/ui/OffscreenQmlSurface.cpp+1−0

This diff is large: its 8 lines aren’t shown here.

libraries/ui/src/ui/TabletScriptingInterface.cpp+6−0

This diff is large: its 13 lines aren’t shown here.

libraries/ui/src/ui/TabletScriptingInterface.h+1−0

This diff is large: its 8 lines aren’t shown here.

libraries/ui/src/ui/types/RequestFilters.cpp+3−7

This diff is large: its 27 lines aren’t shown here.

libraries/workload/src/workload/ViewTask.cpp+14−3

This diff is large: its 36 lines aren’t shown here.

plugins/hifiSdl2/src/Joystick.h+1−1

This diff is large: its 9 lines aren’t shown here.

plugins/hifiSdl2/src/SDL2Manager.h+1−1

This diff is large: its 9 lines aren’t shown here.

plugins/oculus/CMakeLists.txt+0−3

This diff is large: its 10 lines aren’t shown here.

plugins/openvr/CMakeLists.txt+1−8

This diff is large: its 22 lines aren’t shown here.

plugins/openvr/src/ViveControllerManager.cpp+71−26

This diff is large: its 151 lines aren’t shown here.

plugins/openvr/src/ViveControllerManager.h+8−0

This diff is large: its 27 lines aren’t shown here.

prebuild.py+257−0

This diff is large: its 258 lines aren’t shown here.

scripts/defaultScripts.js+1−1

This diff is large: its 9 lines aren’t shown here.

scripts/developer/accelerationFilterApp.js+222−0

This diff is large: its 223 lines aren’t shown here.

scripts/developer/debugging/debugWindow.js+32−4

This diff is large: its 64 lines aren’t shown here.

scripts/developer/exponentialFilterApp.js+240−0

This diff is large: its 241 lines aren’t shown here.

scripts/developer/tests/ControlsGallery.qml+2−9

This diff is large: its 19 lines aren’t shown here.

scripts/developer/tests/drawTrackedObjects.jsrenamed from scripts/developer/tests/viveTrackedObjects.js+8−10

This diff is large: its 25 lines aren’t shown here.

scripts/developer/tests/filtered-puck-attach.js+438−0

This diff is large: its 439 lines aren’t shown here.

scripts/developer/tests/puck-attach.js+2−2

This diff is large: its 15 lines aren’t shown here.

scripts/developer/utilities/audio/Stats.qml+1−1

This diff is large: its 9 lines aren’t shown here.

scripts/developer/utilities/audio/TabletStats.qml+1−2

This diff is large: its 10 lines aren’t shown here.

scripts/developer/utilities/lib/jet/qml/TaskList.qml+2−2

This diff is large: its 11 lines aren’t shown here.

scripts/developer/utilities/lib/jet/qml/TaskListView.qml+2−2

This diff is large: its 11 lines aren’t shown here.

scripts/developer/utilities/lib/plotperf/Color.qml+2−2

This diff is large: its 11 lines aren’t shown here.

scripts/developer/utilities/render/antialiasing.qml+2−2

This diff is large: its 11 lines aren’t shown here.

scripts/developer/utilities/render/configSlider/ConfigSlider.qml+2−2

This diff is large: its 11 lines aren’t shown here.

scripts/developer/utilities/render/configSlider/RichSlider.qml+2−2

This diff is large: its 11 lines aren’t shown here.

scripts/developer/utilities/render/deferredLighting.qml+23−7

This diff is large: its 44 lines aren’t shown here.

scripts/developer/utilities/render/engineInspector.qml+2−2

This diff is large: its 11 lines aren’t shown here.

scripts/developer/utilities/render/highlight.qml+2−2

This diff is large: its 11 lines aren’t shown here.

scripts/developer/utilities/render/highlight/HighlightStyle.qml+2−2

This diff is large: its 11 lines aren’t shown here.

scripts/developer/utilities/render/lod.qml+2−2

This diff is large: its 11 lines aren’t shown here.

scripts/developer/utilities/render/luci.js+106−97

This diff is large: its 229 lines aren’t shown here.

scripts/developer/utilities/render/shadow.qml+2−2

This diff is large: its 11 lines aren’t shown here.

scripts/developer/utilities/render/transition.qml+2−2

This diff is large: its 11 lines aren’t shown here.

scripts/developer/utilities/workload/workloadInspector.qml+2−2

This diff is large: its 11 lines aren’t shown here.

scripts/modules/appUi.js+106−61

This diff is large: its 233 lines aren’t shown here.

scripts/modules/request.js+3−2

This diff is large: its 19 lines aren’t shown here.

scripts/system/assets/data/createAppTooltips.json+485−0

This diff is large: its 486 lines aren’t shown here.

scripts/system/avatarapp.js+4−5

This diff is large: its 32 lines aren’t shown here.

scripts/system/commerce/wallet.js+176−54

This diff is large: its 385 lines aren’t shown here.

scripts/system/controllers/controllerModules/equipEntity.js+2−73

This diff is large: its 103 lines aren’t shown here.

scripts/system/controllers/controllerModules/farParentGrabEntity.js+3−1

This diff is large: its 11 lines aren’t shown here.

scripts/system/controllers/controllerModules/inEditMode.js+17−0

This diff is large: its 24 lines aren’t shown here.

scripts/system/controllers/controllerModules/nearParentGrabEntity.js+6−14

This diff is large: its 27 lines aren’t shown here.

scripts/system/controllers/controllerModules/nearParentGrabOverlay.js+5−1

This diff is large: its 20 lines aren’t shown here.

scripts/system/edit.js+310−233

This diff is large: its 885 lines aren’t shown here.

scripts/system/html/css/edit-style.css+366−530

This diff is large: its 1282 lines aren’t shown here.

scripts/system/html/css/hifi-style.css+4−4

This diff is large: its 24 lines aren’t shown here.

scripts/system/html/entityList.html+23−8

This diff is large: its 63 lines aren’t shown here.

scripts/system/html/entityProperties.html+4−871

This diff is large: its 892 lines aren’t shown here.

scripts/system/html/js/createAppTooltip.js+116−0

This diff is large: its 117 lines aren’t shown here.

scripts/system/html/js/entityList.js+340−81

This diff is large: its 628 lines aren’t shown here.

scripts/system/html/js/entityListContextMenu.js+163−0

This diff is large: its 164 lines aren’t shown here.

scripts/system/html/js/entityProperties.js+2993−1832

This diff is large: its 5259 lines aren’t shown here.

scripts/system/html/js/listView.js+25−1

This diff is large: its 40 lines aren’t shown here.

scripts/system/html/js/marketplacesInject.js+22−47

This diff is large: its 167 lines aren’t shown here.

scripts/system/html/js/underscore-min.jsrenamed from scripts/system/particle_explorer/underscore-min.js+0−0

File renamed without changes.

scripts/system/interstitialPage.js+52−45

This diff is large: its 198 lines aren’t shown here.

scripts/system/libraries/entityList.js+31−4

This diff is large: its 84 lines aren’t shown here.

scripts/system/libraries/entitySelectionTool.js+93−48

This diff is large: its 371 lines aren’t shown here.

scripts/system/marketplaces/marketplaces.js+53−535

This diff is large: its 789 lines aren’t shown here.

scripts/system/notifications.js+1−1

This diff is large: its 9 lines aren’t shown here.

scripts/system/pal.js+8−8

This diff is large: its 37 lines aren’t shown here.

scripts/system/particle_explorer/hifi-entity-ui.js+0−709

This diff is large: its 710 lines aren’t shown here.

scripts/system/particle_explorer/particle-style.css+0−140

This diff is large: its 141 lines aren’t shown here.

scripts/system/particle_explorer/particleExplorer.html+0−43

This diff is large: its 44 lines aren’t shown here.

scripts/system/particle_explorer/particleExplorer.js+0−485

This diff is large: its 486 lines aren’t shown here.

scripts/system/particle_explorer/particleExplorerTool.js+0−144

This diff is large: its 145 lines aren’t shown here.

scripts/system/tablet-goto.js+8−8

This diff is large: its 37 lines aren’t shown here.

server-console/src/main.js+0−4

This diff is large: its 11 lines aren’t shown here.

server-console/src/modules/hf-notifications.js+9−2

This diff is large: its 25 lines aren’t shown here.

tests-manual/controllers/CMakeLists.txt+1−7

This diff is large: its 16 lines aren’t shown here.

tests-manual/gpu/src/TestFbx.cpp+5−5

This diff is large: its 42 lines aren’t shown here.

tests-manual/gpu/src/TestFbx.h+1−1

This diff is large: its 9 lines aren’t shown here.

tests-manual/qml/qml/MacQml.qml+77−0

This diff is large: its 78 lines aren’t shown here.

tests-manual/qml/src/MacQml.cpp+60−0

This diff is large: its 61 lines aren’t shown here.

tests-manual/qml/src/MacQml.h+16−0

This diff is large: its 17 lines aren’t shown here.

tests-manual/qml/src/StressWeb.cpp+131−0

This diff is large: its 132 lines aren’t shown here.

tests-manual/qml/src/StressWeb.h+34−0

This diff is large: its 35 lines aren’t shown here.

tests-manual/qml/src/TestCase.cpp+25−0

This diff is large: its 26 lines aren’t shown here.

tests-manual/qml/src/TestCase.h+23−0

This diff is large: its 24 lines aren’t shown here.

tests-manual/qml/src/main.cpp+55−148

This diff is large: its 299 lines aren’t shown here.

tests-manual/render-texture-load/src/GLIHelpers.cpp+2−0

This diff is large: its 13 lines aren’t shown here.

tests-manual/render-texture-load/src/GLIHelpers.h+3−2

This diff is large: its 17 lines aren’t shown here.

tests-manual/ui/qml/ControlsGalleryWindow.qml+14−0

This diff is large: its 15 lines aren’t shown here.

tests-manual/ui/qml/Palettes.qml+0−150

This diff is large: its 151 lines aren’t shown here.

tests-manual/ui/qml/ScrollingGraph.qml+0−111

This diff is large: its 112 lines aren’t shown here.

tests-manual/ui/qml/StubMenu.qml+0−730

This diff is large: its 731 lines aren’t shown here.

tests-manual/ui/qml/Stubs.qml+0−346

This diff is large: its 347 lines aren’t shown here.

tests-manual/ui/qml/TestControllers.qml+0−160

This diff is large: its 161 lines aren’t shown here.

tests-manual/ui/qml/TestDialog.qml+0−94

This diff is large: its 95 lines aren’t shown here.

tests-manual/ui/qml/TestMenu.qml+0−10

This diff is large: its 11 lines aren’t shown here.

tests-manual/ui/qml/TestRoot.qml+0−43

This diff is large: its 44 lines aren’t shown here.

tests-manual/ui/qml/controlDemo/ButtonPage.qml+0−128

This diff is large: its 129 lines aren’t shown here.

tests-manual/ui/qml/controlDemo/InputPage.qml+0−114

This diff is large: its 115 lines aren’t shown here.

tests-manual/ui/qml/controlDemo/ProgressPage.qml+0−90

This diff is large: its 91 lines aren’t shown here.

tests-manual/ui/qml/controlDemo/main.qml+0−161

This diff is large: its 162 lines aren’t shown here.

tests-manual/ui/qml/main.qml+0−461

This diff is large: its 462 lines aren’t shown here.

tests-manual/ui/qmlscratch.pro+2−26

This diff is large: its 37 lines aren’t shown here.

tests-manual/ui/src/main.cpp+24−101

This diff is large: its 158 lines aren’t shown here.

tests/animation/src/AnimInverseKinematicsTests.cpp+13−13

This diff is large: its 73 lines aren’t shown here.

tests/shaders/CMakeLists.txt+8−0

This diff is large: its 15 lines aren’t shown here.

tests/shaders/src/ShaderTests.cpp+70−165

This diff is large: its 302 lines aren’t shown here.

tools/CMakeLists.txt+1−3

This diff is large: its 10 lines aren’t shown here.

tools/auto-tester/CMakeLists.txt+1−1

This diff is large: its 9 lines aren’t shown here.

tools/auto-tester/src/TestRunner.cpp+1−1

This diff is large: its 9 lines aren’t shown here.

tools/scribe/CMakeLists.txt+0−8

This diff is large: its 9 lines aren’t shown here.

tools/scribe/src/TextTemplate.cpp+0−1012

This diff is large: its 1013 lines aren’t shown here.

tools/scribe/src/TextTemplate.h+0−213

This diff is large: its 214 lines aren’t shown here.

tools/scribe/src/main.cpp+0−400

This diff is large: its 401 lines aren’t shown here.

tools/shadergen.py+12−18

This diff is large: its 72 lines aren’t shown here.

tools/skeleton-dump/src/SkeletonDumpApp.cpp+2−2

This diff is large: its 11 lines aren’t shown here.

tools/vhacd-util/src/VHACDUtil.cpp+28−28

This diff is large: its 185 lines aren’t shown here.

tools/vhacd-util/src/VHACDUtil.h+6−6

This diff is large: its 30 lines aren’t shown here.

tools/vhacd-util/src/VHACDUtilApp.cpp+13−13

This diff is large: its 84 lines aren’t shown here.

tools/vhacd-util/src/VHACDUtilApp.h+1−1

This diff is large: its 9 lines aren’t shown here.

unpublishedScripts/marketplace/spectator-camera/SpectatorCamera.qml+2−2

This diff is large: its 11 lines aren’t shown here.