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
10- [cmake](https://cmake.org/download/): 3.910- [cmake](https://cmake.org/download/): 3.9
11- [Qt](https://www.qt.io/download-open-source): 5.10.111- [Qt](https://www.qt.io/download-open-source): 5.10.1
12- [Python](https://www.python.org/downloads/): 3.6 or higher12- [Python](https://www.python.org/downloads/): 3.6 or higher
13- [OpenSSL](https://www.openssl.org/): Use the latest available 1.0 version (**NOT** 1.1) of OpenSSL to avoid security vulnerabilities.
14- [VHACD](https://github.com/virneo/v-hacd)(clone this repository)(Optional)
15 13
16### CMake External Project Dependencies14### CMake External Project Dependencies
17 15
18These dependencies need not be installed manually. They are automatically downloaded on the platforms where they are required. 16These dependencies need not be installed manually. They are automatically downloaded on the platforms where they are required.
19- [Bullet Physics Engine](https://github.com/bulletphysics/bullet3/releases): 2.8317- [Bullet Physics Engine](https://github.com/bulletphysics/bullet3/releases): 2.83
20- [GLEW](http://glew.sourceforge.net/): 1.13
21- [glm](https://glm.g-truc.net/0.9.8/index.html): 0.9.818- [glm](https://glm.g-truc.net/0.9.8/index.html): 0.9.8
22- [Oculus SDK](https://developer.oculus.com/downloads/): 1.11 (Win32) / 0.5 (Mac)19- [Oculus SDK](https://developer.oculus.com/downloads/): 1.11 (Win32) / 0.5 (Mac)
23- [OpenVR](https://github.com/ValveSoftware/openvr): 1.0.6 (Win32 only)20- [OpenVR](https://github.com/ValveSoftware/openvr): 1.0.6 (Win32 only)
@@ -25,16 +22,15 @@ These dependencies need not be installed manually. They are automatically downlo · 1 unmodified line
25- [QuaZip](https://sourceforge.net/projects/quazip/files/quazip/): 0.7.322- [QuaZip](https://sourceforge.net/projects/quazip/files/quazip/): 0.7.3
26- [SDL2](https://www.libsdl.org/download-2.0.php): 2.0.323- [SDL2](https://www.libsdl.org/download-2.0.php): 2.0.3
27- [Intel Threading Building Blocks](https://www.threadingbuildingblocks.org/): 4.324- [Intel Threading Building Blocks](https://www.threadingbuildingblocks.org/): 4.3
28- [Sixense](http://sixense.com/): 07161525- [vcpkg](https://github.com/highfidelity/vcpkg):
26- [VHACD](https://github.com/virneo/v-hacd)
29- [zlib](http://www.zlib.net/): 1.28 (Win32 only)27- [zlib](http://www.zlib.net/): 1.28 (Win32 only)
30- nVidia Texture Tools: 2.128- [nvtt](https://github.com/highfidelity/nvidia-texture-tools): 2.1.1 (customized)
31 29
32The 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.30The above dependencies will be downloaded, built, linked and included automatically by CMake where we require them. The CMakeLists files that handle grabbing each of the following external dependencies can be found in the [cmake/externals folder](cmake/externals). The resulting downloads, source files and binaries will be placed in the `build/ext` folder in each of the subfolders for each external project.
33 31
34These 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.32These are not placed in your normal build tree when doing an out of source build so that they do not need to be re-downloaded and re-compiled every time the CMake build folder is cleared. Should you want to force a re-download and re-compile of a specific external, you can simply remove that directory from the appropriate subfolder in `build/ext`. Should you want to force a re-download and re-compile of all externals, just remove the `build/ext` folder.
35 33
36If you would like to use a specific install of a dependency instead of the version that would be grabbed as a CMake ExternalProject, you can pass -DUSE\_LOCAL\_$NAME=0 (where $NAME is the name of the subfolder in [cmake/externals](cmake/externals)) when you run CMake to tell it not to get that dependency as an external project.
37
38#### CMake34#### CMake
39 35
40Hifi uses CMake to generate build files and project files for your platform.36Hifi uses CMake to generate build files and project files for your platform.
@@ -82,9 +78,22 @@ In the examples below the variable $NAME would be replaced by the name of the de · 41 unmodified lines
82* $NAME_ROOT_DIR - set this variable in your ENV78* $NAME_ROOT_DIR - set this variable in your ENV
83* HIFI_LIB_DIR - set this variable in your ENV to your High Fidelity lib folder, should contain a folder '$name'79* HIFI_LIB_DIR - set this variable in your ENV to your High Fidelity lib folder, should contain a folder '$name'
84 80
85
86### Optional Components81### Optional Components
87 82
83#### Build Options
84
85The following build options can be used when running CMake
86
87* BUILD_CLIENT
88* BUILD_SERVER
89* BUILD_TESTS
90* BUILD_TOOLS
91
92#### Developer Build Options
93
94* USE_GLES
95* DISABLE_UI
96
88#### Devices97#### Devices
89 98
90You 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.99You 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
7 cmake_minimum_required(VERSION 3.2)7 cmake_minimum_required(VERSION 3.2)
8endif()8endif()
9 9
10# squelch the Policy CMP0074 warning without requiring an update to cmake 3.12.10include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/macros/TargetPython.cmake")
11if ((${CMAKE_MAJOR_VERSION} EQUAL 3 AND ${CMAKE_MINOR_VERSION} GREATER 11) OR ${CMAKE_MAJOR_VERSION} GREATER 3)11target_python()
12 cmake_policy(SET CMP0074 NEW)12
13if (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 )
18else()
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()
13endif()27endif()
14 28
15project(hifi)29if(NOT EXISTS "${CMAKE_BINARY_DIR}/vcpkg.cmake")
30 message(FATAL_ERROR "vcpkg configuration missing.")
31endif()
16 32
33include("${CMAKE_BINARY_DIR}/vcpkg.cmake")
34project(hifi)
17include("cmake/init.cmake")35include("cmake/init.cmake")
18
19include("cmake/compiler.cmake")36include("cmake/compiler.cmake")
20 37
21if (BUILD_SCRIBE_ONLY)38add_paths_to_fixup_libs(${VCPKG_INSTALL_ROOT}/bin)
22 add_subdirectory(tools/scribe)39add_paths_to_fixup_libs(${VCPKG_INSTALL_ROOT}/debug/bin)
23 add_subdirectory(tools/shader_reflect)
24 return()
25endif()
26 40
27if (NOT DEFINED CLIENT_ONLY)41if (NOT DEFINED CLIENT_ONLY)
28 set(CLIENT_ONLY 0)42 set(CLIENT_ONLY 0)
@@ -40,7 +54,8 @@ endif() · 11 unmodified lines
40 54
41set(BUILD_CLIENT_OPTION ON)55set(BUILD_CLIENT_OPTION ON)
42set(BUILD_SERVER_OPTION ON)56set(BUILD_SERVER_OPTION ON)
43set(BUILD_TESTS_OPTION ON)57set(BUILD_TESTS_OPTION OFF)
58set(BUILD_MANUAL_TESTS_OPTION ${BUILD_TESTS_OPTION})
44set(BUILD_TOOLS_OPTION ON)59set(BUILD_TOOLS_OPTION ON)
45set(BUILD_INSTALLER_OPTION ON)60set(BUILD_INSTALLER_OPTION ON)
46set(GLES_OPTION OFF)61set(GLES_OPTION OFF)
@@ -66,7 +81,7 @@ if (ANDROID) · 19 unmodified lines
66 set(GLES_OPTION ON)81 set(GLES_OPTION ON)
67 set(PLATFORM_QT_COMPONENTS AndroidExtras WebView)82 set(PLATFORM_QT_COMPONENTS AndroidExtras WebView)
68else ()83else ()
69 set(PLATFORM_QT_COMPONENTS WebEngine WebEngineWidgets)84 set(PLATFORM_QT_COMPONENTS WebEngine)
70endif ()85endif ()
71 86
72if (USE_GLES AND (NOT ANDROID))87if (USE_GLES AND (NOT ANDROID))
@@ -77,6 +92,7 @@ endif() · 4 unmodified lines
77option(BUILD_CLIENT "Build client components" ${BUILD_CLIENT_OPTION})92option(BUILD_CLIENT "Build client components" ${BUILD_CLIENT_OPTION})
78option(BUILD_SERVER "Build server components" ${BUILD_SERVER_OPTION})93option(BUILD_SERVER "Build server components" ${BUILD_SERVER_OPTION})
79option(BUILD_TESTS "Build tests" ${BUILD_TESTS_OPTION})94option(BUILD_TESTS "Build tests" ${BUILD_TESTS_OPTION})
95option(BUILD_MANUAL_TESTS "Build manual tests" ${BUILD_MANUAL_TESTS_OPTION})
80option(BUILD_TOOLS "Build tools" ${BUILD_TOOLS_OPTION})96option(BUILD_TOOLS "Build tools" ${BUILD_TOOLS_OPTION})
81option(BUILD_INSTALLER "Build installer" ${BUILD_INSTALLER_OPTION})97option(BUILD_INSTALLER "Build installer" ${BUILD_INSTALLER_OPTION})
82option(USE_GLES "Use OpenGL ES" ${GLES_OPTION})98option(USE_GLES "Use OpenGL ES" ${GLES_OPTION})
@@ -144,6 +160,8 @@ list(APPEND CMAKE_PREFIX_PATH "${QT_CMAKE_PREFIX_PATH}") · 61 unmodified lines
144find_package( Threads )160find_package( Threads )
145 161
146add_definitions(-DGLM_FORCE_RADIANS)162add_definitions(-DGLM_FORCE_RADIANS)
163add_definitions(-DGLM_ENABLE_EXPERIMENTAL)
164add_definitions(-DGLM_FORCE_CTOR_INIT)
147set(HIFI_LIBRARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries")165set(HIFI_LIBRARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries")
148 166
149set(EXTERNAL_PROJECT_PREFIX "project")167set(EXTERNAL_PROJECT_PREFIX "project")
@@ -191,7 +209,9 @@ if (BUILD_TESTS) · 41 unmodified lines
191 include(CTest)209 include(CTest)
192 enable_testing()210 enable_testing()
193 add_subdirectory(tests)211 add_subdirectory(tests)
194 add_subdirectory(tests-manual)212 if (BUILD_MANUAL_TESTS)
213 add_subdirectory(tests-manual)
214 endif()
195endif()215endif()
196 216
197if (BUILD_INSTALLER)217if (BUILD_INSTALLER)
LICENSE+1−1
@@ -1,4 +1,4 @@
1Copyright (c) 2013-2016, High Fidelity, Inc.1Copyright (c) 2013-2018, High Fidelity, Inc.
2All rights reserved.2All rights reserved.
3licensing@highfidelity.io3licensing@highfidelity.io
4 4
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
3VCPKG is now our primary mechanism for managing the external libraries and tools on which we rely to build our applications.
4
5Conventional 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
7Because 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
11Note... 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
15In 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
23Your 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
27We 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
31This 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
35This 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
39This 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
41Note 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
45How 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
47Typically 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
55Getting 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
57If 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
61If 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
63If your package is not binary, but doesn't use CMake, you're just going to have to figure it out.
64
65If your package is binary, then you can just skip this step
66
67#### Installing
68
69Once 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
71If 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
75Once 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
23 '-DANDROID_TOOLCHAIN=clang',23 '-DANDROID_TOOLCHAIN=clang',
24 '-DANDROID_STL=c++_shared',24 '-DANDROID_STL=c++_shared',
25 '-DQT_CMAKE_PREFIX_PATH=' + HIFI_ANDROID_PRECOMPILED + '/qt/lib/cmake',25 '-DQT_CMAKE_PREFIX_PATH=' + HIFI_ANDROID_PRECOMPILED + '/qt/lib/cmake',
26 '-DNATIVE_SCRIBE=' + HIFI_ANDROID_PRECOMPILED + '/scribe' + EXEC_SUFFIX,
27 '-DHIFI_ANDROID_PRECOMPILED=' + HIFI_ANDROID_PRECOMPILED,26 '-DHIFI_ANDROID_PRECOMPILED=' + HIFI_ANDROID_PRECOMPILED,
28 '-DRELEASE_NUMBER=' + RELEASE_NUMBER,27 '-DRELEASE_NUMBER=' + RELEASE_NUMBER,
29 '-DRELEASE_TYPE=' + RELEASE_TYPE,28 '-DRELEASE_TYPE=' + RELEASE_TYPE,
android/build.gradle+1−43
@@ -106,11 +106,6 @@ def packages = [ · 105 unmodified lines
106 versionId: 'r5Zran.JSCtvrrB6Q4KaqfIoALPw3lYY',106 versionId: 'r5Zran.JSCtvrrB6Q4KaqfIoALPw3lYY',
107 checksum: 'a8ee8584cf1ccd34766c7ddd9d5e5449',107 checksum: 'a8ee8584cf1ccd34766c7ddd9d5e5449',
108 ],108 ],
109 glm: [
110 file: 'glm-0.9.8.5-patched.tgz',
111 versionId: 'cskfMoJrFlAeqI3WPxemyO_Cxt7rT9EJ',
112 checksum: '067b5fe16b220b5b1a1039ba51b062ae',
113 ],
114 gvr: [109 gvr: [
115 file: 'gvrsdk_v1.101.0.tgz',110 file: 'gvrsdk_v1.101.0.tgz',
116 versionId: 'nqBV_j81Uc31rC7bKIrlya_Hah4v3y5r',111 versionId: 'nqBV_j81Uc31rC7bKIrlya_Hah4v3y5r',
@@ -161,21 +156,6 @@ def packages = [ · 44 unmodified lines
161 ]156 ]
162]157]
163 158
164def scribeLocalFile='scribe' + EXEC_SUFFIX
165def scribeFile='scribe_linux_x86_64'
166def scribeChecksum='4635c28192724281d2367ce9e94380ab'
167def scribeVersion='mPAY_N846oZH1tPY1bwChB_hzqkiYyoC'
168
169if (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
179def options = [159def options = [
180 files: new TreeSet<File>(),160 files: new TreeSet<File>(),
181 features: new HashSet<String>(),161 features: new HashSet<String>(),
@@ -434,28 +414,6 @@ task copyDependencies(dependsOn: [ extractDependencies ]) { · 252 unmodified lines
434 }414 }
435}415}
436 416
437task downloadScribe(type: Download) {
438 src baseUrl + scribeFile + '?versionId=' + scribeVersion
439 dest new File(baseFolder, scribeLocalFile)
440 onlyIfNewer true
441}
442
443task verifyScribe (type: Verify, dependsOn: downloadScribe) {
444 src new File(baseFolder, scribeLocalFile);
445 checksum scribeChecksum
446}
447
448task fixScribePermissions(type: Exec, dependsOn: verifyScribe) {
449 commandLine 'chmod', 'a+x', HIFI_ANDROID_PRECOMPILED + '/' + scribeLocalFile
450}
451
452task setupScribe(dependsOn: [verifyScribe]) { }
453
454// On Windows, we don't need to set the executable bit, but on OSX and Unix we do
455if (!Os.isFamily(Os.FAMILY_WINDOWS)) {
456 setupScribe.dependsOn fixScribePermissions
457}
458
459task extractGvrBinaries(dependsOn: extractDependencies) {417task extractGvrBinaries(dependsOn: extractDependencies) {
460 doLast {418 doLast {
461 def gvrLibFolder = new File(HIFI_ANDROID_PRECOMPILED, 'gvr/gvr-android-sdk-1.101.0/libraries');419 def gvrLibFolder = new File(HIFI_ANDROID_PRECOMPILED, 'gvr/gvr-android-sdk-1.101.0/libraries');
@@ -542,7 +500,7 @@ task qtBundle { · 80 unmodified lines
542 }500 }
543}501}
544 502
545task setupDependencies(dependsOn: [setupScribe, copyDependencies, extractGvrBinaries, qtBundle]) { }503task setupDependencies(dependsOn: [copyDependencies, extractGvrBinaries, qtBundle]) { }
546 504
547task cleanDependencies(type: Delete) {505task cleanDependencies(type: Delete) {
548 delete HIFI_ANDROID_PRECOMPILED506 delete HIFI_ANDROID_PRECOMPILED
assignment-client/src/Agent.cpp+1−1
@@ -216,7 +216,7 @@ void Agent::requestScript() { · 215 unmodified lines
216 }216 }
217 217
218 // make sure this is not a script request for the file scheme218 // make sure this is not a script request for the file scheme
219 if (scriptURL.scheme() == URL_SCHEME_FILE) {219 if (scriptURL.scheme() == HIFI_URL_SCHEME_FILE) {
220 qWarning() << "Cannot load script for Agent from local filesystem.";220 qWarning() << "Cannot load script for Agent from local filesystem.";
221 scriptRequestFinished();221 scriptRequestFinished();
222 return;222 return;
assignment-client/src/audio/AudioMixer.cpp+2−1
@@ -89,7 +89,8 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : · 88 unmodified lines
89 PacketType::NodeIgnoreRequest,89 PacketType::NodeIgnoreRequest,
90 PacketType::RadiusIgnoreRequest,90 PacketType::RadiusIgnoreRequest,
91 PacketType::RequestsDomainListData,91 PacketType::RequestsDomainListData,
92 PacketType::PerAvatarGainSet },92 PacketType::PerAvatarGainSet,
93 PacketType::AudioSoloRequest },
93 this, "queueAudioPacket");94 this, "queueAudioPacket");
94 95
95 // packets whose consequences are global should be processed on the main thread96 // 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
13 13
14#include <random>14#include <random>
15 15
16#include <glm/detail/func_common.hpp>16#include <glm/common.hpp>
17 17
18#include <QtCore/QDebug>18#include <QtCore/QDebug>
19#include <QtCore/QJsonArray>19#include <QtCore/QJsonArray>
@@ -98,6 +98,9 @@ int AudioMixerClientData::processPackets(ConcurrentAddedStreams& addedStreams) { · 78 unmodified lines
98 case PacketType::RadiusIgnoreRequest:98 case PacketType::RadiusIgnoreRequest:
99 parseRadiusIgnoreRequest(packet, node);99 parseRadiusIgnoreRequest(packet, node);
100 break;100 break;
101 case PacketType::AudioSoloRequest:
102 parseSoloRequest(packet, node);
103 break;
101 default:104 default:
102 Q_UNREACHABLE();105 Q_UNREACHABLE();
103 }106 }
@@ -202,7 +205,7 @@ void AudioMixerClientData::parsePerAvatarGainSet(ReceivedMessage& message, const · 98 unmodified lines
202 }205 }
203}206}
204 207
205void AudioMixerClientData::setGainForAvatar(QUuid nodeID, uint8_t gain) {208void AudioMixerClientData::setGainForAvatar(QUuid nodeID, float gain) {
206 auto it = std::find_if(_streams.active.cbegin(), _streams.active.cend(), [nodeID](const MixableStream& mixableStream){209 auto it = std::find_if(_streams.active.cbegin(), _streams.active.cend(), [nodeID](const MixableStream& mixableStream){
207 return mixableStream.nodeStreamID.nodeID == nodeID && mixableStream.nodeStreamID.streamID.isNull();210 return mixableStream.nodeStreamID.nodeID == nodeID && mixableStream.nodeStreamID.streamID.isNull();
208 });211 });
@@ -295,6 +298,25 @@ void AudioMixerClientData::parseRadiusIgnoreRequest(QSharedPointer<ReceivedMessa · 86 unmodified lines
295 }298 }
296}299}
297 300
301
302void 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
298AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() {320AvatarAudioStream* AudioMixerClientData::getAvatarAudioStream() {
299 auto it = std::find_if(_audioStreams.begin(), _audioStreams.end(), [](const SharedStreamPointer& stream){321 auto it = std::find_if(_audioStreams.begin(), _audioStreams.end(), [](const SharedStreamPointer& stream){
300 return stream->getStreamIdentifier().isNull();322 return stream->getStreamIdentifier().isNull();
assignment-client/src/audio/AudioMixerClientData.h+7−1
@@ -65,6 +65,7 @@ public: · 64 unmodified lines
65 void parsePerAvatarGainSet(ReceivedMessage& message, const SharedNodePointer& node);65 void parsePerAvatarGainSet(ReceivedMessage& message, const SharedNodePointer& node);
66 void parseNodeIgnoreRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node);66 void parseNodeIgnoreRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node);
67 void parseRadiusIgnoreRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node);67 void parseRadiusIgnoreRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node);
68 void parseSoloRequest(QSharedPointer<ReceivedMessage> message, const SharedNodePointer& node);
68 69
69 // attempt to pop a frame from each audio stream, and return the number of streams from this client70 // attempt to pop a frame from each audio stream, and return the number of streams from this client
70 int checkBuffersBeforeFrameSend();71 int checkBuffersBeforeFrameSend();
@@ -150,6 +151,9 @@ public: · 79 unmodified lines
150 151
151 const Node::IgnoredNodeIDs& getIgnoringNodeIDs() const { return _ignoringNodeIDs; }152 const Node::IgnoredNodeIDs& getIgnoringNodeIDs() const { return _ignoringNodeIDs; }
152 153
154
155 const std::vector<QUuid>& getSoloedNodes() const { return _soloedNodes; }
156
153 bool getHasReceivedFirstMix() const { return _hasReceivedFirstMix; }157 bool getHasReceivedFirstMix() const { return _hasReceivedFirstMix; }
154 void setHasReceivedFirstMix(bool hasReceivedFirstMix) { _hasReceivedFirstMix = hasReceivedFirstMix; }158 void setHasReceivedFirstMix(bool hasReceivedFirstMix) { _hasReceivedFirstMix = hasReceivedFirstMix; }
155 159
@@ -172,7 +176,7 @@ private: · 16 unmodified lines
172 176
173 void optionallyReplicatePacket(ReceivedMessage& packet, const Node& node);177 void optionallyReplicatePacket(ReceivedMessage& packet, const Node& node);
174 178
175 void setGainForAvatar(QUuid nodeID, uint8_t gain);179 void setGainForAvatar(QUuid nodeID, float gain);
176 180
177 bool containsValidPosition(ReceivedMessage& message) const;181 bool containsValidPosition(ReceivedMessage& message) const;
178 182
@@ -209,6 +213,8 @@ private: · 30 unmodified lines
209 213
210 std::atomic_bool _isIgnoreRadiusEnabled { false };214 std::atomic_bool _isIgnoreRadiusEnabled { false };
211 215
216 std::vector<QUuid> _soloedNodes;
217
212 bool _hasReceivedFirstMix { false };218 bool _hasReceivedFirstMix { false };
213};219};
214 220
assignment-client/src/audio/AudioMixerSlave.cpp+16−5
@@ -272,6 +272,10 @@ bool shouldBeSkipped(MixableStream& stream, const Node& listener, · 271 unmodified lines
272 return true;272 return true;
273 }273 }
274 274
275 if (!listenerData.getSoloedNodes().empty()) {
276 return !contains(listenerData.getSoloedNodes(), stream.nodeStreamID.nodeID);
277 }
278
275 bool shouldCheckIgnoreBox = (listenerAudioStream.isIgnoreBoxEnabled() ||279 bool shouldCheckIgnoreBox = (listenerAudioStream.isIgnoreBoxEnabled() ||
276 stream.positionalStream->isIgnoreBoxEnabled());280 stream.positionalStream->isIgnoreBoxEnabled());
277 if (shouldCheckIgnoreBox &&281 if (shouldCheckIgnoreBox &&
@@ -310,6 +314,7 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { · 32 unmodified lines
310 memset(_mixSamples, 0, sizeof(_mixSamples));314 memset(_mixSamples, 0, sizeof(_mixSamples));
311 315
312 bool isThrottling = _numToRetain != -1;316 bool isThrottling = _numToRetain != -1;
317 bool isSoloing = !listenerData->getSoloedNodes().empty();
313 318
314 auto& streams = listenerData->getStreams();319 auto& streams = listenerData->getStreams();
315 320
@@ -376,13 +381,14 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { · 60 unmodified lines
376 stream.approximateVolume = approximateVolume(stream, listenerAudioStream);381 stream.approximateVolume = approximateVolume(stream, listenerAudioStream);
377 } else {382 } else {
378 if (shouldBeSkipped(stream, *listener, *listenerAudioStream, *listenerData)) {383 if (shouldBeSkipped(stream, *listener, *listenerAudioStream, *listenerData)) {
379 addStream(stream, *listenerAudioStream, 0.0f);384 addStream(stream, *listenerAudioStream, 0.0f, isSoloing);
380 streams.skipped.push_back(move(stream));385 streams.skipped.push_back(move(stream));
381 ++stats.activeToSkipped;386 ++stats.activeToSkipped;
382 return true;387 return true;
383 }388 }
384 389
385 addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain());390 addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain(),
391 isSoloing);
386 392
387 if (shouldBeInactive(stream)) {393 if (shouldBeInactive(stream)) {
388 // To reduce artifacts we still call render to flush the HRTF for every silent394 // To reduce artifacts we still call render to flush the HRTF for every silent
@@ -417,7 +423,8 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { · 28 unmodified lines
417 return true;423 return true;
418 }424 }
419 425
420 addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain());426 addStream(stream, *listenerAudioStream, listenerData->getMasterAvatarGain(),
427 isSoloing);
421 428
422 if (shouldBeInactive(stream)) {429 if (shouldBeInactive(stream)) {
423 // To reduce artifacts we still call render to flush the HRTF for every silent430 // To reduce artifacts we still call render to flush the HRTF for every silent
@@ -484,7 +491,7 @@ bool AudioMixerSlave::prepareMix(const SharedNodePointer& listener) { · 60 unmodified lines
484 491
485void AudioMixerSlave::addStream(AudioMixerClientData::MixableStream& mixableStream,492void AudioMixerSlave::addStream(AudioMixerClientData::MixableStream& mixableStream,
486 AvatarAudioStream& listeningNodeStream,493 AvatarAudioStream& listeningNodeStream,
487 float masterListenerGain) {494 float masterListenerGain, bool isSoloing) {
488 ++stats.totalMixes;495 ++stats.totalMixes;
489 496
490 auto streamToAdd = mixableStream.positionalStream;497 auto streamToAdd = mixableStream.positionalStream;
@@ -495,9 +502,13 @@ void AudioMixerSlave::addStream(AudioMixerClientData::MixableStream& mixableStre · 4 unmodified lines
495 glm::vec3 relativePosition = streamToAdd->getPosition() - listeningNodeStream.getPosition();502 glm::vec3 relativePosition = streamToAdd->getPosition() - listeningNodeStream.getPosition();
496 503
497 float distance = glm::max(glm::length(relativePosition), EPSILON);504 float distance = glm::max(glm::length(relativePosition), EPSILON);
498 float gain = computeGain(masterListenerGain, listeningNodeStream, *streamToAdd, relativePosition, distance, isEcho);
499 float azimuth = isEcho ? 0.0f : computeAzimuth(listeningNodeStream, listeningNodeStream, relativePosition);505 float azimuth = isEcho ? 0.0f : computeAzimuth(listeningNodeStream, listeningNodeStream, relativePosition);
500 506
507 float gain = 1.0f;
508 if (!isSoloing) {
509 gain = computeGain(masterListenerGain, listeningNodeStream, *streamToAdd, relativePosition, distance, isEcho);
510 }
511
501 const int HRTF_DATASET_INDEX = 1;512 const int HRTF_DATASET_INDEX = 1;
502 513
503 if (!streamToAdd->lastPopSucceeded()) {514 if (!streamToAdd->lastPopSucceeded()) {
assignment-client/src/audio/AudioMixerSlave.h+1−1
@@ -57,7 +57,7 @@ private: · 56 unmodified lines
57 bool prepareMix(const SharedNodePointer& listener);57 bool prepareMix(const SharedNodePointer& listener);
58 void addStream(AudioMixerClientData::MixableStream& mixableStream,58 void addStream(AudioMixerClientData::MixableStream& mixableStream,
59 AvatarAudioStream& listeningNodeStream,59 AvatarAudioStream& listeningNodeStream,
60 float masterListenerGain);60 float masterListenerGain, bool isSoloing);
61 void updateHRTFParameters(AudioMixerClientData::MixableStream& mixableStream,61 void updateHRTFParameters(AudioMixerClientData::MixableStream& mixableStream,
62 AvatarAudioStream& listeningNodeStream,62 AvatarAudioStream& listeningNodeStream,
63 float masterListenerGain);63 float masterListenerGain);
assignment-client/src/avatars/AvatarMixer.cpp+5−4
@@ -541,7 +541,7 @@ void AvatarMixer::handleRequestsDomainListDataPacket(QSharedPointer<ReceivedMess · 540 unmodified lines
541 // ...For those nodes, reset the lastBroadcastTime to 0541 // ...For those nodes, reset the lastBroadcastTime to 0
542 // so that the AvatarMixer will send Identity data to us542 // so that the AvatarMixer will send Identity data to us
543 [&](const SharedNodePointer& node) {543 [&](const SharedNodePointer& node) {
544 nodeData->setLastBroadcastTime(node->getUUID(), 0);544 nodeData->setLastBroadcastTime(node->getLocalID(), 0);
545 nodeData->resetSentTraitData(node->getLocalID());545 nodeData->resetSentTraitData(node->getLocalID());
546 }546 }
547 );547 );
@@ -565,7 +565,8 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer<ReceivedMessage> mes · 17 unmodified lines
565 // parse the identity packet and update the change timestamp if appropriate565 // parse the identity packet and update the change timestamp if appropriate
566 bool identityChanged = false;566 bool identityChanged = false;
567 bool displayNameChanged = false;567 bool displayNameChanged = false;
568 avatar.processAvatarIdentity(message->getMessage(), identityChanged, displayNameChanged);568 QDataStream avatarIdentityStream(message->getMessage());
569 avatar.processAvatarIdentity(avatarIdentityStream, identityChanged, displayNameChanged);
569 570
570 if (identityChanged) {571 if (identityChanged) {
571 QMutexLocker nodeDataLocker(&nodeData->getMutex());572 QMutexLocker nodeDataLocker(&nodeData->getMutex());
@@ -637,7 +638,7 @@ void AvatarMixer::handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> · 65 unmodified lines
637 // Reset the lastBroadcastTime for the ignored avatar to 0638 // Reset the lastBroadcastTime for the ignored avatar to 0
638 // so the AvatarMixer knows it'll have to send identity data about the ignored avatar639 // so the AvatarMixer knows it'll have to send identity data about the ignored avatar
639 // to the ignorer if the ignorer unignores.640 // to the ignorer if the ignorer unignores.
640 nodeData->setLastBroadcastTime(ignoredUUID, 0);641 nodeData->setLastBroadcastTime(ignoredNode->getLocalID(), 0);
641 nodeData->resetSentTraitData(ignoredNode->getLocalID());642 nodeData->resetSentTraitData(ignoredNode->getLocalID());
642 }643 }
643 644
@@ -647,7 +648,7 @@ void AvatarMixer::handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> · 3 unmodified lines
647 // to the ignored if the ignorer unignores.648 // to the ignored if the ignorer unignores.
648 AvatarMixerClientData* ignoredNodeData = reinterpret_cast<AvatarMixerClientData*>(ignoredNode->getLinkedData());649 AvatarMixerClientData* ignoredNodeData = reinterpret_cast<AvatarMixerClientData*>(ignoredNode->getLinkedData());
649 if (ignoredNodeData) {650 if (ignoredNodeData) {
650 ignoredNodeData->setLastBroadcastTime(senderNode->getUUID(), 0);651 ignoredNodeData->setLastBroadcastTime(senderNode->getLocalID(), 0);
651 ignoredNodeData->resetSentTraitData(senderNode->getLocalID());652 ignoredNodeData->resetSentTraitData(senderNode->getLocalID());
652 }653 }
653 }654 }
assignment-client/src/avatars/AvatarMixerClientData.cpp+12−12
@@ -26,20 +26,20 @@ AvatarMixerClientData::AvatarMixerClientData(const QUuid& nodeID, Node::LocalID · 25 unmodified lines
26 _avatar->setID(nodeID);26 _avatar->setID(nodeID);
27}27}
28 28
29uint64_t AvatarMixerClientData::getLastOtherAvatarEncodeTime(QUuid otherAvatar) const {29uint64_t AvatarMixerClientData::getLastOtherAvatarEncodeTime(NLPacket::LocalID otherAvatar) const {
30 std::unordered_map<QUuid, uint64_t>::const_iterator itr = _lastOtherAvatarEncodeTime.find(otherAvatar);30 const auto itr = _lastOtherAvatarEncodeTime.find(otherAvatar);
31 if (itr != _lastOtherAvatarEncodeTime.end()) {31 if (itr != _lastOtherAvatarEncodeTime.end()) {
32 return itr->second;32 return itr->second;
33 }33 }
34 return 0;34 return 0;
35}35}
36 36
37void AvatarMixerClientData::setLastOtherAvatarEncodeTime(const QUuid& otherAvatar, uint64_t time) {37void AvatarMixerClientData::setLastOtherAvatarEncodeTime(NLPacket::LocalID otherAvatar, uint64_t time) {
38 std::unordered_map<QUuid, uint64_t>::iterator itr = _lastOtherAvatarEncodeTime.find(otherAvatar);38 auto itr = _lastOtherAvatarEncodeTime.find(otherAvatar);
39 if (itr != _lastOtherAvatarEncodeTime.end()) {39 if (itr != _lastOtherAvatarEncodeTime.end()) {
40 itr->second = time;40 itr->second = time;
41 } else {41 } else {
42 _lastOtherAvatarEncodeTime.emplace(std::pair<QUuid, uint64_t>(otherAvatar, time));42 _lastOtherAvatarEncodeTime.emplace(std::pair<NLPacket::LocalID, uint64_t>(otherAvatar, time));
43 }43 }
44}44}
45 45
@@ -220,7 +220,7 @@ void AvatarMixerClientData::checkSkeletonURLAgainstWhitelist(const SlaveSharedDa · 174 unmodified lines
220 }220 }
221}221}
222 222
223uint64_t AvatarMixerClientData::getLastBroadcastTime(const QUuid& nodeUUID) const {223uint64_t AvatarMixerClientData::getLastBroadcastTime(NLPacket::LocalID nodeUUID) const {
224 // return the matching PacketSequenceNumber, or the default if we don't have it224 // return the matching PacketSequenceNumber, or the default if we don't have it
225 auto nodeMatch = _lastBroadcastTimes.find(nodeUUID);225 auto nodeMatch = _lastBroadcastTimes.find(nodeUUID);
226 if (nodeMatch != _lastBroadcastTimes.end()) {226 if (nodeMatch != _lastBroadcastTimes.end()) {
@@ -229,9 +229,9 @@ uint64_t AvatarMixerClientData::getLastBroadcastTime(const QUuid& nodeUUID) cons · 2 unmodified lines
229 return 0;229 return 0;
230}230}
231 231
232uint16_t AvatarMixerClientData::getLastBroadcastSequenceNumber(const QUuid& nodeUUID) const {232uint16_t AvatarMixerClientData::getLastBroadcastSequenceNumber(NLPacket::LocalID nodeID) const {
233 // return the matching PacketSequenceNumber, or the default if we don't have it233 // return the matching PacketSequenceNumber, or the default if we don't have it
234 auto nodeMatch = _lastBroadcastSequenceNumbers.find(nodeUUID);234 auto nodeMatch = _lastBroadcastSequenceNumbers.find(nodeID);
235 if (nodeMatch != _lastBroadcastSequenceNumbers.end()) {235 if (nodeMatch != _lastBroadcastSequenceNumbers.end()) {
236 return nodeMatch->second;236 return nodeMatch->second;
237 }237 }
@@ -252,7 +252,7 @@ void AvatarMixerClientData::ignoreOther(const Node* self, const Node* other) { · 14 unmodified lines
252 } else {252 } else {
253 killPacket->writePrimitive(KillAvatarReason::YourAvatarEnteredTheirBubble);253 killPacket->writePrimitive(KillAvatarReason::YourAvatarEnteredTheirBubble);
254 }254 }
255 setLastBroadcastTime(other->getUUID(), 0);255 setLastBroadcastTime(other->getLocalID(), 0);
256 256
257 resetSentTraitData(other->getLocalID());257 resetSentTraitData(other->getLocalID());
258 258
@@ -331,9 +331,9 @@ AvatarMixerClientData::TraitsCheckTimestamp AvatarMixerClientData::getLastOtherA · 72 unmodified lines
331 }331 }
332}332}
333 333
334void AvatarMixerClientData::cleanupKilledNode(const QUuid& nodeUUID, Node::LocalID nodeLocalID) {334void AvatarMixerClientData::cleanupKilledNode(const QUuid&, Node::LocalID nodeLocalID) {
335 removeLastBroadcastSequenceNumber(nodeUUID);335 removeLastBroadcastSequenceNumber(nodeLocalID);
336 removeLastBroadcastTime(nodeUUID);336 removeLastBroadcastTime(nodeLocalID);
337 _lastSentTraitsTimestamps.erase(nodeLocalID);337 _lastSentTraitsTimestamps.erase(nodeLocalID);
338 _sentTraitVersions.erase(nodeLocalID);338 _sentTraitVersions.erase(nodeLocalID);
339}339}
assignment-client/src/avatars/AvatarMixerClientData.h+15−16
@@ -49,17 +49,16 @@ public: · 48 unmodified lines
49 const AvatarData* getConstAvatarData() const { return _avatar.get(); }49 const AvatarData* getConstAvatarData() const { return _avatar.get(); }
50 AvatarSharedPointer getAvatarSharedPointer() const { return _avatar; }50 AvatarSharedPointer getAvatarSharedPointer() const { return _avatar; }
51 51
52 uint16_t getLastBroadcastSequenceNumber(NLPacket::LocalID nodeID) const;
53 void setLastBroadcastSequenceNumber(NLPacket::LocalID nodeID, uint16_t sequenceNumber)
54 { _lastBroadcastSequenceNumbers[nodeID] = sequenceNumber; }
55 Q_INVOKABLE void removeLastBroadcastSequenceNumber(NLPacket::LocalID nodeID) { _lastBroadcastSequenceNumbers.erase(nodeID); }
52 bool isIgnoreRadiusEnabled() const { return _isIgnoreRadiusEnabled; }56 bool isIgnoreRadiusEnabled() const { return _isIgnoreRadiusEnabled; }
53 void setIsIgnoreRadiusEnabled(bool enabled) { _isIgnoreRadiusEnabled = enabled; }57 void setIsIgnoreRadiusEnabled(bool enabled) { _isIgnoreRadiusEnabled = enabled; }
54 58
55 uint16_t getLastBroadcastSequenceNumber(const QUuid& nodeUUID) const;59 uint64_t getLastBroadcastTime(NLPacket::LocalID nodeUUID) const;
56 void setLastBroadcastSequenceNumber(const QUuid& nodeUUID, uint16_t sequenceNumber)60 void setLastBroadcastTime(NLPacket::LocalID nodeUUID, uint64_t broadcastTime) { _lastBroadcastTimes[nodeUUID] = broadcastTime; }
57 { _lastBroadcastSequenceNumbers[nodeUUID] = sequenceNumber; }61 Q_INVOKABLE void removeLastBroadcastTime(NLPacket::LocalID nodeUUID) { _lastBroadcastTimes.erase(nodeUUID); }
58 Q_INVOKABLE void removeLastBroadcastSequenceNumber(const QUuid& nodeUUID) { _lastBroadcastSequenceNumbers.erase(nodeUUID); }
59
60 uint64_t getLastBroadcastTime(const QUuid& nodeUUID) const;
61 void setLastBroadcastTime(const QUuid& nodeUUID, uint64_t broadcastTime) { _lastBroadcastTimes[nodeUUID] = broadcastTime; }
62 Q_INVOKABLE void removeLastBroadcastTime(const QUuid& nodeUUID) { _lastBroadcastTimes.erase(nodeUUID); }
63 62
64 Q_INVOKABLE void cleanupKilledNode(const QUuid& nodeUUID, Node::LocalID nodeLocalID);63 Q_INVOKABLE void cleanupKilledNode(const QUuid& nodeUUID, Node::LocalID nodeLocalID);
65 64
@@ -93,7 +92,7 @@ public: · 27 unmodified lines
93 92
94 void loadJSONStats(QJsonObject& jsonObject) const;93 void loadJSONStats(QJsonObject& jsonObject) const;
95 94
96 glm::vec3 getPosition() const { return _avatar ? _avatar->getWorldPosition() : glm::vec3(0); }95 glm::vec3 getPosition() const { return _avatar ? _avatar->getClientGlobalPosition() : glm::vec3(0); }
97 bool isRadiusIgnoring(const QUuid& other) const;96 bool isRadiusIgnoring(const QUuid& other) const;
98 void addToRadiusIgnoringSet(const QUuid& other);97 void addToRadiusIgnoringSet(const QUuid& other);
99 void removeFromRadiusIgnoringSet(const QUuid& other);98 void removeFromRadiusIgnoringSet(const QUuid& other);
@@ -114,10 +113,10 @@ public: · 14 unmodified lines
114 113
115 const ConicalViewFrustums& getViewFrustums() const { return _currentViewFrustums; }114 const ConicalViewFrustums& getViewFrustums() const { return _currentViewFrustums; }
116 115
117 uint64_t getLastOtherAvatarEncodeTime(QUuid otherAvatar) const;116 uint64_t getLastOtherAvatarEncodeTime(NLPacket::LocalID otherAvatar) const;
118 void setLastOtherAvatarEncodeTime(const QUuid& otherAvatar, uint64_t time);117 void setLastOtherAvatarEncodeTime(NLPacket::LocalID otherAvatar, uint64_t time);
119 118
120 QVector<JointData>& getLastOtherAvatarSentJoints(QUuid otherAvatar) { return _lastOtherAvatarSentJoints[otherAvatar]; }119 QVector<JointData>& getLastOtherAvatarSentJoints(NLPacket::LocalID otherAvatar) { return _lastOtherAvatarSentJoints[otherAvatar]; }
121 120
122 void queuePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer node);121 void queuePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer node);
123 int processPackets(const SlaveSharedData& slaveSharedData); // returns number of packets processed122 int processPackets(const SlaveSharedData& slaveSharedData); // returns number of packets processed
@@ -150,13 +149,13 @@ private: · 26 unmodified lines
150 AvatarSharedPointer _avatar { new AvatarData() };149 AvatarSharedPointer _avatar { new AvatarData() };
151 150
152 uint16_t _lastReceivedSequenceNumber { 0 };151 uint16_t _lastReceivedSequenceNumber { 0 };
153 std::unordered_map<QUuid, uint16_t> _lastBroadcastSequenceNumbers;152 std::unordered_map<NLPacket::LocalID, uint16_t> _lastBroadcastSequenceNumbers;
154 std::unordered_map<QUuid, uint64_t> _lastBroadcastTimes;153 std::unordered_map<NLPacket::LocalID, uint64_t> _lastBroadcastTimes;
155 154
156 // this is a map of the last time we encoded an "other" avatar for155 // this is a map of the last time we encoded an "other" avatar for
157 // sending to "this" node156 // sending to "this" node
158 std::unordered_map<QUuid, uint64_t> _lastOtherAvatarEncodeTime;157 std::unordered_map<NLPacket::LocalID, uint64_t> _lastOtherAvatarEncodeTime;
159 std::unordered_map<QUuid, QVector<JointData>> _lastOtherAvatarSentJoints;158 std::unordered_map<NLPacket::LocalID, QVector<JointData>> _lastOtherAvatarSentJoints;
160 159
161 uint64_t _identityChangeTimestamp;160 uint64_t _identityChangeTimestamp;
162 bool _avatarSessionDisplayNameMustChange{ true };161 bool _avatarSessionDisplayNameMustChange{ true };
assignment-client/src/avatars/AvatarMixerSlave.cpp+81−101
@@ -68,13 +68,11 @@ void AvatarMixerSlave::processIncomingPackets(const SharedNodePointer& node) { · 67 unmodified lines
68 _stats.processIncomingPacketsElapsedTime += (end - start);68 _stats.processIncomingPacketsElapsedTime += (end - start);
69}69}
70 70
71int AvatarMixerSlave::sendIdentityPacket(const AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode) {71int AvatarMixerSlave::sendIdentityPacket(NLPacketList& packetList, const AvatarMixerClientData* nodeData, const Node& destinationNode) {
72 if (destinationNode->getType() == NodeType::Agent && !destinationNode->isUpstream()) {72 if (destinationNode.getType() == NodeType::Agent && !destinationNode.isUpstream()) {
73 QByteArray individualData = nodeData->getConstAvatarData()->identityByteArray();73 QByteArray individualData = nodeData->getConstAvatarData()->identityByteArray();
74 individualData.replace(0, NUM_BYTES_RFC4122_UUID, nodeData->getNodeID().toRfc4122()); // FIXME, this looks suspicious74 individualData.replace(0, NUM_BYTES_RFC4122_UUID, nodeData->getNodeID().toRfc4122()); // FIXME, this looks suspicious
75 auto identityPackets = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true);75 packetList.write(individualData);
76 identityPackets->write(individualData);
77 DependencyManager::get<NodeList>()->sendPacketList(std::move(identityPackets), *destinationNode);
78 _stats.numIdentityPackets++;76 _stats.numIdentityPackets++;
79 return individualData.size();77 return individualData.size();
80 } else {78 } else {
@@ -247,12 +245,12 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 166 unmodified lines
247 // reset the internal state for correct random number distribution245 // reset the internal state for correct random number distribution
248 distribution.reset();246 distribution.reset();
249 247
248 // Estimate number to sort on number sent last frame (with min. of 20).
249 const int numToSendEst = std::max(int(nodeData->getNumAvatarsSentLastFrame() * 2.5f), 20);
250
250 // reset the number of sent avatars251 // reset the number of sent avatars
251 nodeData->resetNumAvatarsSentLastFrame();252 nodeData->resetNumAvatarsSentLastFrame();
252 253
253 // keep a counter of the number of considered avatars
254 int numOtherAvatars = 0;
255
256 // keep track of outbound data rate specifically for avatar data254 // keep track of outbound data rate specifically for avatar data
257 int numAvatarDataBytes = 0;255 int numAvatarDataBytes = 0;
258 int identityBytesSent = 0;256 int identityBytesSent = 0;
@@ -261,7 +259,6 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 2 unmodified lines
261 // max number of avatarBytes per frame259 // max number of avatarBytes per frame
262 int maxAvatarBytesPerFrame = int(_maxKbpsPerNode * BYTES_PER_KILOBIT / AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND);260 int maxAvatarBytesPerFrame = int(_maxKbpsPerNode * BYTES_PER_KILOBIT / AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND);
263 261
264
265 // keep track of the number of other avatars held back in this frame262 // keep track of the number of other avatars held back in this frame
266 int numAvatarsHeldBack = 0;263 int numAvatarsHeldBack = 0;
267 264
@@ -279,10 +276,6 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 11 unmodified lines
279 int minimumBytesPerAvatar = PALIsOpen ? AvatarDataPacket::AVATAR_HAS_FLAGS_SIZE + NUM_BYTES_RFC4122_UUID +276 int minimumBytesPerAvatar = PALIsOpen ? AvatarDataPacket::AVATAR_HAS_FLAGS_SIZE + NUM_BYTES_RFC4122_UUID +
280 sizeof(AvatarDataPacket::AvatarGlobalPosition) + sizeof(AvatarDataPacket::AudioLoudness) : 0;277 sizeof(AvatarDataPacket::AvatarGlobalPosition) + sizeof(AvatarDataPacket::AudioLoudness) : 0;
281 278
282 // setup a PacketList for the avatarPackets
283 auto avatarPacketList = NLPacketList::create(PacketType::BulkAvatarData);
284 static auto maxAvatarDataBytes = avatarPacketList->getMaxSegmentSize() - NUM_BYTES_RFC4122_UUID;
285
286 // compute node bounding box279 // compute node bounding box
287 const float MY_AVATAR_BUBBLE_EXPANSION_FACTOR = 4.0f; // magic number determined emperically280 const float MY_AVATAR_BUBBLE_EXPANSION_FACTOR = 4.0f; // magic number determined emperically
288 AABox nodeBox = computeBubbleBox(avatar, MY_AVATAR_BUBBLE_EXPANSION_FACTOR);281 AABox nodeBox = computeBubbleBox(avatar, MY_AVATAR_BUBBLE_EXPANSION_FACTOR);
@@ -350,8 +343,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 61 unmodified lines
350 // Don't bother with these checks if the other avatar has their bubble enabled and we're gettingAnyIgnored343 // Don't bother with these checks if the other avatar has their bubble enabled and we're gettingAnyIgnored
351 if (nodeData->isIgnoreRadiusEnabled() || (avatarClientNodeData->isIgnoreRadiusEnabled() && !getsAnyIgnored)) {344 if (nodeData->isIgnoreRadiusEnabled() || (avatarClientNodeData->isIgnoreRadiusEnabled() && !getsAnyIgnored)) {
352 // Perform the collision check between the two bounding boxes345 // Perform the collision check between the two bounding boxes
353 const float OTHER_AVATAR_BUBBLE_EXPANSION_FACTOR = 2.4f; // magic number determined empirically346 AABox otherNodeBox = avatarClientNodeData->getAvatar().getDefaultBubbleBox();
354 AABox otherNodeBox = computeBubbleBox(avatarClientNodeData->getAvatar(), OTHER_AVATAR_BUBBLE_EXPANSION_FACTOR);
355 if (nodeBox.touches(otherNodeBox)) {347 if (nodeBox.touches(otherNodeBox)) {
356 nodeData->ignoreOther(destinationNode, avatarNode);348 nodeData->ignoreOther(destinationNode, avatarNode);
357 shouldIgnore = !getsAnyIgnored;349 shouldIgnore = !getsAnyIgnored;
@@ -364,7 +356,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 6 unmodified lines
364 }356 }
365 357
366 if (!shouldIgnore) {358 if (!shouldIgnore) {
367 AvatarDataSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(avatarNode->getUUID());359 AvatarDataSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(avatarNode->getLocalID());
368 AvatarDataSequenceNumber lastSeqFromSender = avatarClientNodeData->getLastReceivedSequenceNumber();360 AvatarDataSequenceNumber lastSeqFromSender = avatarClientNodeData->getLastReceivedSequenceNumber();
369 361
370 // FIXME - This code does appear to be working. But it seems brittle.362 // FIXME - This code does appear to be working. But it seems brittle.
@@ -396,7 +388,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 25 unmodified lines
396 if (!shouldIgnore) {388 if (!shouldIgnore) {
397 // sort this one for later389 // sort this one for later
398 const AvatarData* avatarNodeData = avatarClientNodeData->getConstAvatarData();390 const AvatarData* avatarNodeData = avatarClientNodeData->getConstAvatarData();
399 auto lastEncodeTime = nodeData->getLastOtherAvatarEncodeTime(avatarNodeData->getSessionUUID());391 auto lastEncodeTime = nodeData->getLastOtherAvatarEncodeTime(avatarNode->getLocalID());
400 392
401 sortedAvatars.push(SortableAvatar(avatarNodeData, avatarNode, lastEncodeTime));393 sortedAvatars.push(SortableAvatar(avatarNodeData, avatarNode, lastEncodeTime));
402 }394 }
@@ -406,8 +398,13 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 3 unmodified lines
406 398
407 int remainingAvatars = (int)sortedAvatars.size();399 int remainingAvatars = (int)sortedAvatars.size();
408 auto traitsPacketList = NLPacketList::create(PacketType::BulkAvatarTraits, QByteArray(), true, true);400 auto traitsPacketList = NLPacketList::create(PacketType::BulkAvatarTraits, QByteArray(), true, true);
401 auto avatarPacket = NLPacket::create(PacketType::BulkAvatarData);
402 const int avatarPacketCapacity = avatarPacket->getPayloadCapacity();
403 int avatarSpaceAvailable = avatarPacketCapacity;
404 int numPacketsSent = 0;
405 auto identityPacketList = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true);
409 406
410 const auto& sortedAvatarVector = sortedAvatars.getSortedVector();407 const auto& sortedAvatarVector = sortedAvatars.getSortedVector(numToSendEst);
411 for (const auto& sortedAvatar : sortedAvatarVector) {408 for (const auto& sortedAvatar : sortedAvatarVector) {
412 const Node* otherNode = sortedAvatar.getNode();409 const Node* otherNode = sortedAvatar.getNode();
413 auto lastEncodeForOther = sortedAvatar.getTimestamp();410 auto lastEncodeForOther = sortedAvatar.getTimestamp();
@@ -432,21 +429,9 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 18 unmodified lines
432 429
433 auto startAvatarDataPacking = chrono::high_resolution_clock::now();430 auto startAvatarDataPacking = chrono::high_resolution_clock::now();
434 431
435 ++numOtherAvatars;
436
437 const AvatarMixerClientData* otherNodeData = reinterpret_cast<const AvatarMixerClientData*>(otherNode->getLinkedData());432 const AvatarMixerClientData* otherNodeData = reinterpret_cast<const AvatarMixerClientData*>(otherNode->getLinkedData());
438 const AvatarData* otherAvatar = otherNodeData->getConstAvatarData();433 const AvatarData* otherAvatar = otherNodeData->getConstAvatarData();
439 434
440 // If the time that the mixer sent AVATAR DATA about Avatar B to Avatar A is BEFORE OR EQUAL TO
441 // the time that Avatar B flagged an IDENTITY DATA change, send IDENTITY DATA about Avatar B to Avatar A.
442 if (otherAvatar->hasProcessedFirstIdentity()
443 && nodeData->getLastBroadcastTime(otherNode->getUUID()) <= otherNodeData->getIdentityChangeTimestamp()) {
444 identityBytesSent += sendIdentityPacket(otherNodeData, node);
445
446 // remember the last time we sent identity details about this other node to the receiver
447 nodeData->setLastBroadcastTime(otherNode->getUUID(), usecTimestampNow());
448 }
449
450 // Typically all out-of-view avatars but such avatars' priorities will rise with time:435 // Typically all out-of-view avatars but such avatars' priorities will rise with time:
451 bool isLowerPriority = sortedAvatar.getPriority() <= OUT_OF_VIEW_THRESHOLD;436 bool isLowerPriority = sortedAvatar.getPriority() <= OUT_OF_VIEW_THRESHOLD;
452 437
@@ -456,71 +441,56 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 3 unmodified lines
456 } else if (!overBudget) {441 } else if (!overBudget) {
457 detail = distribution(generator) < AVATAR_SEND_FULL_UPDATE_RATIO ? AvatarData::SendAllData : AvatarData::CullSmallData;442 detail = distribution(generator) < AVATAR_SEND_FULL_UPDATE_RATIO ? AvatarData::SendAllData : AvatarData::CullSmallData;
458 nodeData->incrementAvatarInView();443 nodeData->incrementAvatarInView();
459 }
460 444
461 bool includeThisAvatar = true;445 // If the time that the mixer sent AVATAR DATA about Avatar B to Avatar A is BEFORE OR EQUAL TO
462 QVector<JointData>& lastSentJointsForOther = nodeData->getLastOtherAvatarSentJoints(otherNode->getUUID());446 // the time that Avatar B flagged an IDENTITY DATA change, send IDENTITY DATA about Avatar B to Avatar A.
463 447 if (otherAvatar->hasProcessedFirstIdentity()
464 lastSentJointsForOther.resize(otherAvatar->getJointCount());448 && nodeData->getLastBroadcastTime(otherNode->getLocalID()) <= otherNodeData->getIdentityChangeTimestamp()) {
465 449 identityBytesSent += sendIdentityPacket(*identityPacketList, otherNodeData, *destinationNode);
466 bool distanceAdjust = true;450
467 glm::vec3 viewerPosition = myPosition;451 // remember the last time we sent identity details about this other node to the receiver
468 AvatarDataPacket::HasFlags hasFlagsOut; // the result of the toByteArray452 nodeData->setLastBroadcastTime(otherNode->getLocalID(), usecTimestampNow());
469 bool dropFaceTracking = false;
470
471 auto startSerialize = chrono::high_resolution_clock::now();
472 QByteArray bytes = otherAvatar->toByteArray(detail, lastEncodeForOther, lastSentJointsForOther,
473 hasFlagsOut, dropFaceTracking, distanceAdjust, viewerPosition,
474 &lastSentJointsForOther);
475 auto endSerialize = chrono::high_resolution_clock::now();
476 _stats.toByteArrayElapsedTime +=
477 (quint64) chrono::duration_cast<chrono::microseconds>(endSerialize - startSerialize).count();
478
479 if (bytes.size() > maxAvatarDataBytes) {
480 qCWarning(avatars) << "otherAvatar.toByteArray() for" << otherNode->getUUID()
481 << "resulted in very large buffer of" << bytes.size() << "bytes - dropping facial data";
482
483 dropFaceTracking = true; // first try dropping the facial data
484 bytes = otherAvatar->toByteArray(detail, lastEncodeForOther, lastSentJointsForOther,
485 hasFlagsOut, dropFaceTracking, distanceAdjust, viewerPosition, &lastSentJointsForOther);
486
487 if (bytes.size() > maxAvatarDataBytes) {
488 qCWarning(avatars) << "otherAvatar.toByteArray() for" << otherNode->getUUID()
489 << "without facial data resulted in very large buffer of" << bytes.size()
490 << "bytes - reducing to MinimumData";
491 bytes = otherAvatar->toByteArray(AvatarData::MinimumData, lastEncodeForOther, lastSentJointsForOther,
492 hasFlagsOut, dropFaceTracking, distanceAdjust, viewerPosition, &lastSentJointsForOther);
493
494 if (bytes.size() > maxAvatarDataBytes) {
495 qCWarning(avatars) << "otherAvatar.toByteArray() for" << otherNode->getUUID()
496 << "MinimumData resulted in very large buffer of" << bytes.size()
497 << "bytes - refusing to send avatar";
498 includeThisAvatar = false;
499 }
500 }453 }
501 }454 }
502 455
503 if (includeThisAvatar) {456 QVector<JointData>& lastSentJointsForOther = nodeData->getLastOtherAvatarSentJoints(otherNode->getLocalID());
504 // start a new segment in the PacketList for this avatar457
505 avatarPacketList->startSegment();458 const bool distanceAdjust = true;
506 numAvatarDataBytes += avatarPacketList->write(otherNode->getUUID().toRfc4122());459 const bool dropFaceTracking = false;
507 numAvatarDataBytes += avatarPacketList->write(bytes);460 AvatarDataPacket::SendStatus sendStatus;
508 avatarPacketList->endSegment();461 sendStatus.sendUUID = true;
462
463 do {
464 auto startSerialize = chrono::high_resolution_clock::now();
465 QByteArray bytes = otherAvatar->toByteArray(detail, lastEncodeForOther, lastSentJointsForOther,
466 sendStatus, dropFaceTracking, distanceAdjust, myPosition,
467 &lastSentJointsForOther, avatarSpaceAvailable);
468 auto endSerialize = chrono::high_resolution_clock::now();
469 _stats.toByteArrayElapsedTime +=
470 (quint64)chrono::duration_cast<chrono::microseconds>(endSerialize - startSerialize).count();
471
472 avatarPacket->write(bytes);
473 avatarSpaceAvailable -= bytes.size();
474 numAvatarDataBytes += bytes.size();
475 if (!sendStatus || avatarSpaceAvailable < (int)AvatarDataPacket::MIN_BULK_PACKET_SIZE) {
476 // Weren't able to fit everything.
477 nodeList->sendPacket(std::move(avatarPacket), *destinationNode);
478 ++numPacketsSent;
479 avatarPacket = NLPacket::create(PacketType::BulkAvatarData);
480 avatarSpaceAvailable = avatarPacketCapacity;
481 }
482 } while (!sendStatus);
509 483
510 if (detail != AvatarData::NoData) {484 if (detail != AvatarData::NoData) {
511 _stats.numOthersIncluded++;485 _stats.numOthersIncluded++;
512 486
513 // increment the number of avatars sent to this reciever487 // increment the number of avatars sent to this receiver
514 nodeData->incrementNumAvatarsSentLastFrame();488 nodeData->incrementNumAvatarsSentLastFrame();
515 489
516 // set the last sent sequence number for this sender on the receiver490 // set the last sent sequence number for this sender on the receiver
517 nodeData->setLastBroadcastSequenceNumber(otherNode->getUUID(),491 nodeData->setLastBroadcastSequenceNumber(otherNode->getLocalID(),
518 otherNodeData->getLastReceivedSequenceNumber());492 otherNodeData->getLastReceivedSequenceNumber());
519 nodeData->setLastOtherAvatarEncodeTime(otherNode->getUUID(), usecTimestampNow());493 nodeData->setLastOtherAvatarEncodeTime(otherNode->getLocalID(), usecTimestampNow());
520 }
521 } else {
522 // TODO? this avatar is not included now, and will probably not be included next frame.
523 // It would be nice if we could tweak its future sort priority to put it at the back of the list.
524 }494 }
525 495
526 auto endAvatarDataPacking = chrono::high_resolution_clock::now();496 auto endAvatarDataPacking = chrono::high_resolution_clock::now();
@@ -532,17 +502,21 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 5 unmodified lines
532 remainingAvatars--;502 remainingAvatars--;
533 }503 }
534 504
505 if (nodeData->getNumAvatarsSentLastFrame() > numToSendEst) {
506 qCWarning(avatars) << "More avatars sent than upper estimate" << nodeData->getNumAvatarsSentLastFrame()
507 << " / " << numToSendEst;
508 }
509
535 quint64 startPacketSending = usecTimestampNow();510 quint64 startPacketSending = usecTimestampNow();
536 511
537 // close the current packet so that we're always sending something512 if (avatarPacket->getPayloadSize() != 0) {
538 avatarPacketList->closeCurrentPacket(true);513 nodeList->sendPacket(std::move(avatarPacket), *destinationNode);
514 ++numPacketsSent;
515 }
539 516
540 _stats.numPacketsSent += (int)avatarPacketList->getNumPackets();517 _stats.numPacketsSent += numPacketsSent;
541 _stats.numBytesSent += numAvatarDataBytes;518 _stats.numBytesSent += numAvatarDataBytes;
542 519
543 // send the avatar data PacketList
544 nodeList->sendPacketList(std::move(avatarPacketList), *destinationNode);
545
546 // record the bytes sent for other avatar data in the AvatarMixerClientData520 // record the bytes sent for other avatar data in the AvatarMixerClientData
547 nodeData->recordSentAvatarData(numAvatarDataBytes);521 nodeData->recordSentAvatarData(numAvatarDataBytes);
548 522
@@ -554,6 +528,12 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node) · 5 unmodified lines
554 nodeList->sendPacketList(std::move(traitsPacketList), *destinationNode);528 nodeList->sendPacketList(std::move(traitsPacketList), *destinationNode);
555 }529 }
556 530
531 // Send any AvatarIdentity packets:
532 identityPacketList->closeCurrentPacket();
533 if (identityBytesSent > 0) {
534 nodeList->sendPacketList(std::move(identityPacketList), *destinationNode);
535 }
536
557 // record the number of avatars held back this frame537 // record the number of avatars held back this frame
558 nodeData->recordNumOtherAvatarStarves(numAvatarsHeldBack);538 nodeData->recordNumOtherAvatarStarves(numAvatarsHeldBack);
559 nodeData->recordNumOtherAvatarSkips(numAvatarsWithSkippedFrames);539 nodeData->recordNumOtherAvatarSkips(numAvatarsWithSkippedFrames);
@@ -599,20 +579,20 @@ void AvatarMixerSlave::broadcastAvatarDataToDownstreamMixer(const SharedNodePoin · 39 unmodified lines
599 // so we always send a full update for this avatar579 // so we always send a full update for this avatar
600 580
601 quint64 start = usecTimestampNow();581 quint64 start = usecTimestampNow();
602 AvatarDataPacket::HasFlags flagsOut;582 AvatarDataPacket::SendStatus sendStatus;
603 583
604 QVector<JointData> emptyLastJointSendData { otherAvatar->getJointCount() };584 QVector<JointData> emptyLastJointSendData { otherAvatar->getJointCount() };
605 585
606 QByteArray avatarByteArray = otherAvatar->toByteArray(AvatarData::SendAllData, 0, emptyLastJointSendData,586 QByteArray avatarByteArray = otherAvatar->toByteArray(AvatarData::SendAllData, 0, emptyLastJointSendData,
607 flagsOut, false, false, glm::vec3(0), nullptr);587 sendStatus, false, false, glm::vec3(0), nullptr, 0);
608 quint64 end = usecTimestampNow();588 quint64 end = usecTimestampNow();
609 _stats.toByteArrayElapsedTime += (end - start);589 _stats.toByteArrayElapsedTime += (end - start);
610 590
611 auto lastBroadcastTime = nodeData->getLastBroadcastTime(agentNode->getUUID());591 auto lastBroadcastTime = nodeData->getLastBroadcastTime(agentNode->getLocalID());
612 if (lastBroadcastTime <= agentNodeData->getIdentityChangeTimestamp()592 if (lastBroadcastTime <= agentNodeData->getIdentityChangeTimestamp()
613 || (start - lastBroadcastTime) >= REBROADCAST_IDENTITY_TO_DOWNSTREAM_EVERY_US) {593 || (start - lastBroadcastTime) >= REBROADCAST_IDENTITY_TO_DOWNSTREAM_EVERY_US) {
614 sendReplicatedIdentityPacket(*agentNode, agentNodeData, *node);594 sendReplicatedIdentityPacket(*agentNode, agentNodeData, *node);
615 nodeData->setLastBroadcastTime(agentNode->getUUID(), start);595 nodeData->setLastBroadcastTime(agentNode->getLocalID(), start);
616 }596 }
617 597
618 // figure out how large our avatar byte array can be to fit in the packet list598 // figure out how large our avatar byte array can be to fit in the packet list
@@ -630,14 +610,14 @@ void AvatarMixerSlave::broadcastAvatarDataToDownstreamMixer(const SharedNodePoin · 11 unmodified lines
630 << "-" << avatarByteArray.size() << "bytes";610 << "-" << avatarByteArray.size() << "bytes";
631 611
632 avatarByteArray = otherAvatar->toByteArray(AvatarData::SendAllData, 0, emptyLastJointSendData,612 avatarByteArray = otherAvatar->toByteArray(AvatarData::SendAllData, 0, emptyLastJointSendData,
633 flagsOut, true, false, glm::vec3(0), nullptr);613 sendStatus, true, false, glm::vec3(0), nullptr, 0);
634 614
635 if (avatarByteArray.size() > maxAvatarByteArraySize) {615 if (avatarByteArray.size() > maxAvatarByteArraySize) {
636 qCWarning(avatars) << "Replicated avatar data without facial data still too large for"616 qCWarning(avatars) << "Replicated avatar data without facial data still too large for"
637 << otherAvatar->getSessionUUID() << "-" << avatarByteArray.size() << "bytes";617 << otherAvatar->getSessionUUID() << "-" << avatarByteArray.size() << "bytes";
638 618
639 avatarByteArray = otherAvatar->toByteArray(AvatarData::MinimumData, 0, emptyLastJointSendData,619 avatarByteArray = otherAvatar->toByteArray(AvatarData::MinimumData, 0, emptyLastJointSendData,
640 flagsOut, true, false, glm::vec3(0), nullptr);620 sendStatus, true, false, glm::vec3(0), nullptr, 0);
641 }621 }
642 }622 }
643 623
@@ -646,7 +626,7 @@ void AvatarMixerSlave::broadcastAvatarDataToDownstreamMixer(const SharedNodePoin · 2 unmodified lines
646 nodeData->incrementNumAvatarsSentLastFrame();626 nodeData->incrementNumAvatarsSentLastFrame();
647 627
648 // set the last sent sequence number for this sender on the receiver628 // set the last sent sequence number for this sender on the receiver
649 nodeData->setLastBroadcastSequenceNumber(agentNode->getUUID(),629 nodeData->setLastBroadcastSequenceNumber(agentNode->getLocalID(),
650 agentNodeData->getLastReceivedSequenceNumber());630 agentNodeData->getLastReceivedSequenceNumber());
651 631
652 // increment the number of avatars sent to this reciever632 // 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
101 void harvestStats(AvatarMixerSlaveStats& stats);101 void harvestStats(AvatarMixerSlaveStats& stats);
102 102
103private:103private:
104 int sendIdentityPacket(const AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode);104 int sendIdentityPacket(NLPacketList& packet, const AvatarMixerClientData* nodeData, const Node& destinationNode);
105 int sendReplicatedIdentityPacket(const Node& agentNode, const AvatarMixerClientData* nodeData, const Node& destinationNode);105 int sendReplicatedIdentityPacket(const Node& agentNode, const AvatarMixerClientData* nodeData, const Node& destinationNode);
106 106
107 qint64 addChangedTraitsToBulkPacket(AvatarMixerClientData* listeningNodeData,107 qint64 addChangedTraitsToBulkPacket(AvatarMixerClientData* listeningNodeData,
assignment-client/src/avatars/ScriptableAvatar.cpp+8−8
@@ -69,10 +69,10 @@ void ScriptableAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { · 68 unmodified lines
69 AvatarData::setSkeletonModelURL(skeletonModelURL);69 AvatarData::setSkeletonModelURL(skeletonModelURL);
70}70}
71 71
72static AnimPose composeAnimPose(const FBXJoint& fbxJoint, const glm::quat rotation, const glm::vec3 translation) {72static AnimPose composeAnimPose(const HFMJoint& joint, const glm::quat rotation, const glm::vec3 translation) {
73 glm::mat4 translationMat = glm::translate(translation);73 glm::mat4 translationMat = glm::translate(translation);
74 glm::mat4 rotationMat = glm::mat4_cast(fbxJoint.preRotation * rotation * fbxJoint.postRotation);74 glm::mat4 rotationMat = glm::mat4_cast(joint.preRotation * rotation * joint.postRotation);
75 glm::mat4 finalMat = translationMat * fbxJoint.preTransform * rotationMat * fbxJoint.postTransform;75 glm::mat4 finalMat = translationMat * joint.preTransform * rotationMat * joint.postTransform;
76 return AnimPose(finalMat);76 return AnimPose(finalMat);
77}77}
78 78
@@ -84,7 +84,7 @@ void ScriptableAvatar::update(float deltatime) { · 5 unmodified lines
84 // Run animation84 // Run animation
85 if (_animation && _animation->isLoaded() && _animation->getFrames().size() > 0 && !_bind.isNull() && _bind->isLoaded()) {85 if (_animation && _animation->isLoaded() && _animation->getFrames().size() > 0 && !_bind.isNull() && _bind->isLoaded()) {
86 if (!_animSkeleton) {86 if (!_animSkeleton) {
87 _animSkeleton = std::make_shared<AnimSkeleton>(_bind->getGeometry());87 _animSkeleton = std::make_shared<AnimSkeleton>(_bind->getHFMModel());
88 }88 }
89 float currentFrame = _animationDetails.currentFrame + deltatime * _animationDetails.fps;89 float currentFrame = _animationDetails.currentFrame + deltatime * _animationDetails.fps;
90 if (_animationDetails.loop || currentFrame < _animationDetails.lastFrame) {90 if (_animationDetails.loop || currentFrame < _animationDetails.lastFrame) {
@@ -93,7 +93,7 @@ void ScriptableAvatar::update(float deltatime) { · 2 unmodified lines
93 }93 }
94 _animationDetails.currentFrame = currentFrame;94 _animationDetails.currentFrame = currentFrame;
95 95
96 const QVector<FBXJoint>& modelJoints = _bind->getGeometry().joints;96 const QVector<HFMJoint>& modelJoints = _bind->getHFMModel().joints;
97 QStringList animationJointNames = _animation->getJointNames();97 QStringList animationJointNames = _animation->getJointNames();
98 98
99 const int nJoints = modelJoints.size();99 const int nJoints = modelJoints.size();
@@ -102,8 +102,8 @@ void ScriptableAvatar::update(float deltatime) { · 2 unmodified lines
102 }102 }
103 103
104 const int frameCount = _animation->getFrames().size();104 const int frameCount = _animation->getFrames().size();
105 const FBXAnimationFrame& floorFrame = _animation->getFrames().at((int)glm::floor(currentFrame) % frameCount);105 const HFMAnimationFrame& floorFrame = _animation->getFrames().at((int)glm::floor(currentFrame) % frameCount);
106 const FBXAnimationFrame& ceilFrame = _animation->getFrames().at((int)glm::ceil(currentFrame) % frameCount);106 const HFMAnimationFrame& ceilFrame = _animation->getFrames().at((int)glm::ceil(currentFrame) % frameCount);
107 const float frameFraction = glm::fract(currentFrame);107 const float frameFraction = glm::fract(currentFrame);
108 std::vector<AnimPose> poses = _animSkeleton->getRelativeDefaultPoses();108 std::vector<AnimPose> poses = _animSkeleton->getRelativeDefaultPoses();
109 109
@@ -113,7 +113,7 @@ void ScriptableAvatar::update(float deltatime) { · 3 unmodified lines
113 const QString& name = animationJointNames[i];113 const QString& name = animationJointNames[i];
114 // As long as we need the model preRotations anyway, let's get the jointIndex from the bind skeleton rather than114 // As long as we need the model preRotations anyway, let's get the jointIndex from the bind skeleton rather than
115 // trusting the .fst (which is sometimes not updated to match changes to .fbx).115 // trusting the .fst (which is sometimes not updated to match changes to .fbx).
116 int mapping = _bind->getGeometry().getJointIndex(name);116 int mapping = _bind->getHFMModel().getJointIndex(name);
117 if (mapping != -1 && !_maskedJoints.contains(name)) {117 if (mapping != -1 && !_maskedJoints.contains(name)) {
118 118
119 AnimPose floorPose = composeAnimPose(modelJoints[mapping], floorFrame.rotations[i], floorFrame.translations[i] * UNIT_SCALE);119 AnimPose floorPose = composeAnimPose(modelJoints[mapping], floorFrame.rotations[i], floorFrame.translations[i] * UNIT_SCALE);
cmake/externals/boostconfig/CMakeLists.txt+0−20
@@ -1,20 +0,0 @@
1set(EXTERNAL_NAME boostconfig)
2string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
3
4include(ExternalProject)
5ExternalProject_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
16ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR)
17
18set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR}/include CACHE TYPE INTERNAL)
19
20set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
cmake/externals/bullet/CMakeLists.txt+0−85
@@ -1,85 +0,0 @@
1set(EXTERNAL_NAME bullet)
2
3if (WIN32)
4 set(PLATFORM_CMAKE_ARGS "-DUSE_MSVC_RUNTIME_LIBRARY_DLL=1")
5else ()
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()
13endif ()
14
15include(ExternalProject)
16
17if (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 )
28else ()
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 )
39endif ()
40
41# Hide this external target (for ide users)
42set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
43
44ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR)
45
46string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
47
48set(BULLET_LIB_DIR "${INSTALL_DIR}/lib")
49
50if (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")
58elseif (WIN32)
59 set(BULLET_LIB_EXT "lib")
60endif ()
61
62if (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()
81endif ()
82
83if (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")
85endif ()
cmake/externals/draco/CMakeLists.txt+0−41
@@ -1,41 +0,0 @@
1set(EXTERNAL_NAME draco)
2
3if (ANDROID)
4 set(ANDROID_CMAKE_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DANDROID_NATIVE_API_LEVEL=19")
5endif ()
6
7if (APPLE)
8 set(EXTRA_CMAKE_FLAGS -DCMAKE_CXX_FLAGS=-stdlib=libc++ -DCMAKE_EXE_LINKER_FLAGS=-stdlib=libc++)
9endif ()
10
11include(ExternalProject)
12ExternalProject_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)
23set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
24
25ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR)
26set(SUFFIXED_INSTALL_DIR "${INSTALL_DIR}-$<CONFIG>")
27
28string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
29
30set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SUFFIXED_INSTALL_DIR}/include CACHE PATH "List of Draco include directories")
31
32if (UNIX)
33 set(LIB_PREFIX "lib")
34 set(LIB_EXT "a")
35elseif (WIN32)
36 set(LIB_EXT "lib")
37endif ()
38
39set(${EXTERNAL_NAME_UPPER}_LIBRARY ${SUFFIXED_INSTALL_DIR}/lib/${LIB_PREFIX}draco.${LIB_EXT} CACHE FILEPATH "Path to Draco release library")
40set(${EXTERNAL_NAME_UPPER}_ENCODER_LIBRARY ${SUFFIXED_INSTALL_DIR}/lib/${LIB_PREFIX}dracoenc.${LIB_EXT} CACHE FILEPATH "Path to Draco encoder release library")
41set(${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 @@
1set(EXTERNAL_NAME etc2comp)
2
3if (ANDROID)
4 set(ANDROID_CMAKE_ARGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DANDROID_NATIVE_API_LEVEL=19")
5endif ()
6
7if (APPLE)
8 set(EXTRA_CMAKE_FLAGS -DCMAKE_CXX_FLAGS=-stdlib=libc++ -DCMAKE_EXE_LINKER_FLAGS=-stdlib=libc++)
9endif ()
10
11include(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
16ExternalProject_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)
29set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
30
31ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR)
32ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR)
33
34string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
35
36if (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")
50else ()
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
54endif ()
55
56set(ETC_INCLUDE_DIR ${SOURCE_DIR}/EtcLib/Etc CACHE FILEPATH "Path to Etc2Comp/Etc include directory")
57set(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 @@
1set(EXTERNAL_NAME gli)
2
3include(ExternalProject)
4ExternalProject_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)
16set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
17
18ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR)
19
20string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
21set(${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 @@
1set(EXTERNAL_NAME glm)
2
3include(ExternalProject)
4ExternalProject_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)
16set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
17
18ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR)
19
20string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
21set(${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 @@
1set(EXTERNAL_NAME glslang)
2string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
3
4include(ExternalProject)
5
6ExternalProject_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)
17set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
18
19# includes
20ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR)
21set(SUFFIXED_INSTALL_DIR "${INSTALL_DIR}-$<CONFIG>")
22
23list(APPEND INCLUDE_DIRS ${SUFFIXED_INSTALL_DIR}/include)
24#list(APPEND INCLUDE_DIRS ${INSTALL_DIR}/include)
25set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INCLUDE_DIRS} CACHE PATH "List of glslang include directories")
26set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${${EXTERNAL_NAME_UPPER}_INCLUDE_DIR} CACHE PATH "List of glslang include directories")
27
28
29set(LIB_DIR ${SUFFIXED_INSTALL_DIR}/lib)
30list(APPEND LIB_NAMES glslang HLSL OGLCompiler OSDependent SPIRV SPVRemapper)
31include(SelectLibraryConfigurations)
32
33foreach(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")
37endforeach()
38
39select_library_configurations(${EXTERNAL_NAME_UPPER})
40
41set(${EXTERNAL_NAME_UPPER}_LIBRARY ${${EXTERNAL_NAME_UPPER}_LIBRARY} CACHE FILEPATH "Location of glslang libraries")
42set(${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 @@
1set(EXTERNAL_NAME json)
2
3include(ExternalProject)
4ExternalProject_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)
17set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
18
19ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR)
20
21string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
22set(${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 @@
1include(ExternalProject)
2include(SelectLibraryConfigurations)
3
4set(EXTERNAL_NAME nvtt)
5
6string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
7
8if (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")
24else ()
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 ()
84endif ()
85
86# Hide this external target (for IDE users)
87set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
cmake/externals/openvr/CMakeLists.txt+0−49
@@ -1,49 +0,0 @@
1include(ExternalProject)
2include(SelectLibraryConfigurations)
3
4set(EXTERNAL_NAME OpenVR)
5
6string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
7
8ExternalProject_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)
19set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
20
21ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR)
22
23set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR}/headers CACHE TYPE INTERNAL)
24
25if (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
36elseif(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
42elseif(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
48endif()
49
cmake/externals/quazip/CMakeLists.txt+8−5
@@ -3,7 +3,14 @@ string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) · 2 unmodified lines
3 3
4include(ExternalProject)4include(ExternalProject)
5 5
6set(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)6set(QUAZIP_CMAKE_ARGS
7 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
8 -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
9 -DCMAKE_PREFIX_PATH=${QT_CMAKE_PREFIX_PATH}
10 -DCMAKE_INSTALL_NAME_DIR:PATH=<INSTALL_DIR>/lib
11 -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
12 -DZLIB_ROOT=${VCPKG_INSTALL_ROOT}
13 -DCMAKE_POSITION_INDEPENDENT_CODE=ON)
7 14
8if (NOT APPLE)15if (NOT APPLE)
9 set(QUAZIP_CMAKE_ARGS ${QUAZIP_CMAKE_ARGS} -DCMAKE_CXX_STANDARD=11)16 set(QUAZIP_CMAKE_ARGS ${QUAZIP_CMAKE_ARGS} -DCMAKE_CXX_STANDARD=11)
@@ -20,10 +27,6 @@ ExternalProject_Add( · 10 unmodified lines
20 LOG_BUILD 127 LOG_BUILD 1
21)28)
22 29
23if (WIN32)
24 add_dependencies(quazip zlib)
25endif ()
26
27# Hide this external target (for ide users)30# Hide this external target (for ide users)
28set_target_properties(${EXTERNAL_NAME} PROPERTIES31set_target_properties(${EXTERNAL_NAME} PROPERTIES
29 FOLDER "hidden/externals"32 FOLDER "hidden/externals"
cmake/externals/sdl2/CMakeLists.txt+0−90
@@ -1,90 +0,0 @@
1set(EXTERNAL_NAME sdl2)
2
3include(ExternalProject)
4
5string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
6
7if (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 )
17elseif (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
46else ()
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 )
60endif ()
61
62# Hide this external target (for ide users)
63set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
64
65if (APPLE)
66
67# NOOP
68
69elseif (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
84else ()
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
90endif ()
cmake/externals/spirv_binaries/CMakeLists.txt+0−34
@@ -1,34 +0,0 @@
1set(EXTERNAL_NAME spirv_binaries)
2string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
3
4include(ExternalProject)
5if (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")
9elseif (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")
13else ()
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")
17endif ()
18
19ExternalProject_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)
30set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
31ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR)
32
33set(${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 @@
1set(EXTERNAL_NAME spirv_cross)
2
3include(ExternalProject)
4ExternalProject_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)
15set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
16
17ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR)
18set(SUFFIXED_INSTALL_DIR "${INSTALL_DIR}-$<CONFIG>")
19
20string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
21
22set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SUFFIXED_INSTALL_DIR}/include CACHE PATH "List of Draco include directories")
23
24if (UNIX)
25 set(LIB_PREFIX "lib")
26 set(LIB_EXT "a")
27elseif (WIN32)
28 set(LIB_EXT "lib")
29endif ()
30
31foreach(lib glsl msl cpp hlsl reflect util core)
32 list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARIES ${SUFFIXED_INSTALL_DIR}/lib/spirv-cross-${lib}.${LIB_EXT})
33endforeach()
34
35set(${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 @@
1set(EXTERNAL_NAME spirv_headers)
2string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
3
4include(ExternalProject)
5ExternalProject_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)
16set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
17ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR)
18set(${EXTERNAL_NAME_UPPER}_ROOT ${INSTALL_DIR} CACHE PATH "List of include directories")
cmake/externals/spirv_tools/CMakeLists.txt+0−33
@@ -1,33 +0,0 @@
1set(EXTERNAL_NAME spirv_tools)
2string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
3
4include(ExternalProject)
5ExternalProject_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)
16set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
17
18ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR)
19set(SUFFIXED_INSTALL_DIR "${INSTALL_DIR}-$<CONFIG>")
20
21set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SUFFIXED_INSTALL_DIR}/include CACHE PATH "List of SPIRV-Tools include directories")
22
23if (UNIX)
24 set(LIB_PREFIX "lib")
25 set(LIB_EXT "a")
26elseif (WIN32)
27 set(LIB_EXT "lib")
28endif ()
29
30list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARIES ${SUFFIXED_INSTALL_DIR}/lib/SPIRV-Tools-opt.${LIB_EXT})
31list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARIES ${SUFFIXED_INSTALL_DIR}/lib/SPIRV-Tools-link.${LIB_EXT})
32list(APPEND ${EXTERNAL_NAME_UPPER}_LIBRARIES ${SUFFIXED_INSTALL_DIR}/lib/SPIRV-Tools.${LIB_EXT})
33set(${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 @@
1set(EXTERNAL_NAME zlib)
2string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER)
3
4include(ExternalProject)
5
6ExternalProject_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)
18set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals")
19
20ExternalProject_Get_Property(${EXTERNAL_NAME} INSTALL_DIR)
21set(${EXTERNAL_NAME_UPPER}_ROOT ${INSTALL_DIR} CACHE PATH "Path for Zlib install root")
22set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INSTALL_DIR}/include CACHE PATH "List of zlib include directories")
23set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${${EXTERNAL_NAME_UPPER}_INCLUDE_DIR} CACHE PATH "List of zlib include directories")
24set(${EXTERNAL_NAME_UPPER}_DLL_PATH ${INSTALL_DIR}/bin CACHE FILEPATH "Location of ZLib DLL")
25set(${EXTERNAL_NAME_UPPER}_LIBRARY_RELEASE ${INSTALL_DIR}/lib/zlib.lib CACHE FILEPATH "Location of zlib release library")
26set(${EXTERNAL_NAME_UPPER}_LIBRARY_DEBUG ${INSTALL_DIR}/lib/zlibd.lib CACHE FILEPATH "Location of zlib debug library")
27
28include(SelectLibraryConfigurations)
29select_library_configurations(${EXTERNAL_NAME_UPPER})
30
31# Force selected libraries into the cache
32set(${EXTERNAL_NAME_UPPER}_LIBRARY ${${EXTERNAL_NAME_UPPER}_LIBRARY} CACHE FILEPATH "Location of zlib libraries")
33set(${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
14 string(CONCAT SHADER_QRC "${SHADER_QRC}" "<file alias=\"${ARGV0}\">${ARGV1}</file>\n")14 string(CONCAT SHADER_QRC "${SHADER_QRC}" "<file alias=\"${ARGV0}\">${ARGV1}</file>\n")
15endmacro()15endmacro()
16 16
17set(VULKAN_DIR $ENV{VULKAN_SDK})
18set(GLSLANG_EXEC "${VULKAN_DIR}/Bin/glslangValidator.exe")
19set(SPIRV_CROSS_EXEC "${VULKAN_DIR}/Bin/spirv-cross.exe")
20set(SPIRV_OPT_EXEC "${VULKAN_DIR}/Bin/spirv-opt.exe")
21set(GLSLC_EXEC "${VULKAN_DIR}/Bin/glslc.exe")
22set(SCRIBE_EXEC "D:/scribe.exe")
23
24macro(AUTOSCRIBE_PLATFORM_SHADER)17macro(AUTOSCRIBE_PLATFORM_SHADER)
25 set(AUTOSCRIBE_PLATFORM_PATH "${ARGV0}")18 set(AUTOSCRIBE_PLATFORM_PATH "${ARGV0}")
26 string(REGEX MATCH "([0-9]+(es)?)(/stereo)?" PLATFORM_PATH_REGEX ${AUTOSCRIBE_PLATFORM_PATH})19 string(REGEX MATCH "([0-9]+(es)?)(/stereo)?" PLATFORM_PATH_REGEX ${AUTOSCRIBE_PLATFORM_PATH})
@@ -75,36 +68,6 @@ macro(AUTOSCRIBE_PLATFORM_SHADER) · 48 unmodified lines
75 list(APPEND SHADER_GEN_LINE ${TEMP_PATH})68 list(APPEND SHADER_GEN_LINE ${TEMP_PATH})
76 list(APPEND SHADER_GEN_LINE ${AUTOSCRIBE_SHADER_SEEN_LIBS})69 list(APPEND SHADER_GEN_LINE ${AUTOSCRIBE_SHADER_SEEN_LIBS})
77 string(CONCAT AUTOSCRIBE_SHADERGEN_COMMANDS "${AUTOSCRIBE_SHADERGEN_COMMANDS}" "${SHADER_GEN_LINE}\n")70 string(CONCAT AUTOSCRIBE_SHADERGEN_COMMANDS "${AUTOSCRIBE_SHADERGEN_COMMANDS}" "${SHADER_GEN_LINE}\n")
78
79 # # FIXME need better mechanism for determining the include files
80 # add_custom_command(
81 # OUTPUT ${AUTOSCRIBE_OUTPUT_FILE}
82 # COMMAND ${SCRIBE_COMMAND} ${SHADER_FILE} ${SCRIBE_ARGS} -o ${AUTOSCRIBE_OUTPUT_FILE} -h ${AUTOSCRIBE_DIALECT_HEADER} -h ${AUTOSCRIBE_VARIANT_HEADER}
83 # DEPENDS ${SCRIBE_COMMAND} ${SHADER_FILE} ${AUTOSCRIBE_DIALECT_HEADER} ${AUTOSCRIBE_VARIANT_HEADER})
84
85 # # Generate the spirv file
86 # add_custom_command(
87 # OUTPUT ${AUTOSCRIBE_SPIRV_FILE}
88 # COMMAND ${GLSLANG_EXEC} -V110 -o ${AUTOSCRIBE_SPIRV_FILE} ${AUTOSCRIBE_OUTPUT_FILE}
89 # DEPENDS ${AUTOSCRIBE_OUTPUT_FILE} ${GLSLANG_EXEC})
90
91 # # Generate the optimized spirv file
92 # add_custom_command(
93 # OUTPUT ${AUTOSCRIBE_SPIRV_OPT_FILE}
94 # COMMAND ${SPIRV_OPT_EXEC} -O ${AUTOSCRIBE_SPIRV_FILE} -o ${AUTOSCRIBE_SPIRV_OPT_FILE}
95 # DEPENDS ${AUTOSCRIBE_SPIRV_FILE} ${SPIRV_OPT_EXEC})
96
97 # # Generate the optimized GLSL file
98 # add_custom_command(
99 # OUTPUT ${AUTOSCRIBE_SPIRV_GLSL_FILE}
100 # COMMAND ${SPIRV_CROSS_EXEC} ${SPIRV_CROSS_ARGS} ${AUTOSCRIBE_SPIRV_OPT_FILE} --output ${AUTOSCRIBE_SPIRV_GLSL_FILE}
101 # DEPENDS ${AUTOSCRIBE_SPIRV_OPT_FILE} ${SPIRV_CROSS_EXEC})
102
103 # # Generate the optimized spirv file
104 # add_custom_command(
105 # OUTPUT ${AUTOSCRIBE_SPIRV_JSON_FILE}
106 # COMMAND ${SPIRV_CROSS_EXEC} --reflect json ${AUTOSCRIBE_SPIRV_OPT_FILE} --output ${AUTOSCRIBE_SPIRV_JSON_FILE}
107 # DEPENDS ${AUTOSCRIBE_SPIRV_OPT_FILE} ${SPIRV_CROSS_EXEC})
108endmacro()71endmacro()
109 72
110macro(AUTOSCRIBE_SHADER)73macro(AUTOSCRIBE_SHADER)
@@ -307,38 +270,16 @@ macro(AUTOSCRIBE_SHADER_LIBS) · 196 unmodified lines
307 set(AUTOSCRIBE_SHADERGEN_COMMANDS_FILE ${CMAKE_CURRENT_BINARY_DIR}/shadergen.txt)270 set(AUTOSCRIBE_SHADERGEN_COMMANDS_FILE ${CMAKE_CURRENT_BINARY_DIR}/shadergen.txt)
308 file(WRITE ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE} "${AUTOSCRIBE_SHADERGEN_COMMANDS}")271 file(WRITE ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE} "${AUTOSCRIBE_SHADERGEN_COMMANDS}")
309 272
310 # grab the SPIRV binaries we require273 # A custom python script which will generate all our shader artifacts
311 # note we don't use the normal ADD_DEPENDENCY_EXTERNAL_PROJECTS macro because only a custom command 274 add_custom_command(
312 # depends on these, not any of our build artifacts, so there's no valid target for the add_dependencies275 OUTPUT ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS}
313 # call in ADD_DEPENDENCY_EXTERNAL_PROJECTS to use276 COMMENT "Generating/updating shaders"
314 add_subdirectory(${EXTERNAL_PROJECT_DIR}/spirv_binaries ${EXTERNALS_BINARY_DIR}/spirv_binaries)277 COMMAND ${HIFI_PYTHON_EXEC} ${CMAKE_SOURCE_DIR}/tools/shadergen.py
315 278 --commands ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE}
316 target_python()279 --tools-dir ${VCPKG_TOOLS_DIR}
317 280 --build-dir ${CMAKE_CURRENT_BINARY_DIR}
318 # A custom python script which will generate 281 --source-dir ${CMAKE_SOURCE_DIR}
319 if (ANDROID)282 DEPENDS ${AUTOSCRIBE_SHADER_HEADERS} ${CMAKE_SOURCE_DIR}/tools/shadergen.py ${ALL_SCRIBE_SHADERS})
320 add_custom_command(
321 OUTPUT ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS}
322 COMMENT "Generating/updating shaders"
323 COMMAND ${HIFI_PYTHON_EXEC} ${CMAKE_SOURCE_DIR}/tools/shadergen.py
324 --commands ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE}
325 --spirv-binaries ${SPIRV_BINARIES_DIR}
326 --scribe ${NATIVE_SCRIBE}
327 --build-dir ${CMAKE_CURRENT_BINARY_DIR}
328 --source-dir ${CMAKE_SOURCE_DIR}
329 DEPENDS ${AUTOSCRIBE_SHADER_HEADERS} spirv_binaries ${CMAKE_SOURCE_DIR}/tools/shadergen.py ${ALL_SCRIBE_SHADERS})
330 else()
331 add_custom_command(
332 OUTPUT ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS}
333 COMMENT "Generating/updating shaders"
334 COMMAND ${HIFI_PYTHON_EXEC} ${CMAKE_SOURCE_DIR}/tools/shadergen.py
335 --commands ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE}
336 --spirv-binaries ${SPIRV_BINARIES_DIR}
337 --scribe $<TARGET_FILE:scribe>
338 --build-dir ${CMAKE_CURRENT_BINARY_DIR}
339 --source-dir ${CMAKE_SOURCE_DIR}
340 DEPENDS ${AUTOSCRIBE_SHADER_HEADERS} scribe spirv_binaries ${CMAKE_SOURCE_DIR}/tools/shadergen.py ${ALL_SCRIBE_SHADERS})
341 endif()
342 283
343 add_custom_target(shadergen DEPENDS ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS})284 add_custom_target(shadergen DEPENDS ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS})
344 set_target_properties(shadergen PROPERTIES FOLDER "Shaders")285 set_target_properties(shadergen PROPERTIES FOLDER "Shaders")
cmake/macros/ManuallyInstallOpenSSLForQt.cmake+2−2
@@ -19,13 +19,13 @@ macro(manually_install_openssl_for_qt) · 18 unmodified lines
19 find_package(OpenSSL REQUIRED)19 find_package(OpenSSL REQUIRED)
20 20
21 install(21 install(
22 FILES "${OPENSSL_DLL_PATH}/ssleay32.dll"22 FILES "${VCPKG_INSTALL_ROOT}/bin/ssleay32.dll"
23 DESTINATION ${TARGET_INSTALL_DIR}23 DESTINATION ${TARGET_INSTALL_DIR}
24 COMPONENT ${TARGET_INSTALL_COMPONENT}24 COMPONENT ${TARGET_INSTALL_COMPONENT}
25 )25 )
26 26
27 install(27 install(
28 FILES "${OPENSSL_DLL_PATH}/libeay32.dll"28 FILES "${VCPKG_INSTALL_ROOT}/bin/libeay32.dll"
29 DESTINATION ${TARGET_INSTALL_DIR}29 DESTINATION ${TARGET_INSTALL_DIR}
30 COMPONENT ${TARGET_INSTALL_COMPONENT}30 COMPONENT ${TARGET_INSTALL_COMPONENT}
31 )31 )
cmake/macros/TargetBullet.cmake+0−1
@@ -16,7 +16,6 @@ macro(TARGET_BULLET) · 15 unmodified lines
16 list(APPEND BULLET_LIBRARIES ${LIB_DIR}/libLinearMath.a)16 list(APPEND BULLET_LIBRARIES ${LIB_DIR}/libLinearMath.a)
17 list(APPEND BULLET_LIBRARIES ${LIB_DIR}/libBulletSoftBody.a)17 list(APPEND BULLET_LIBRARIES ${LIB_DIR}/libBulletSoftBody.a)
18 else()18 else()
19 add_dependency_external_projects(bullet)
20 find_package(Bullet REQUIRED)19 find_package(Bullet REQUIRED)
21 endif()20 endif()
22 # perform the system include hack for OS X to ignore warnings21 # perform the system include hack for OS X to ignore warnings
cmake/macros/TargetDraco.cmake+14−8
@@ -1,18 +1,24 @@
1macro(TARGET_DRACO)1macro(TARGET_DRACO)
2 set(LIBS draco dracodec dracoenc)
3 find_library(LIBPATH ${LIB} PATHS )
2 if (ANDROID)4 if (ANDROID)
3 set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/draco)5 set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/draco)
4 set(DRACO_INCLUDE_DIRS "${INSTALL_DIR}/include" CACHE TYPE INTERNAL)6 set(DRACO_INCLUDE_DIRS "${INSTALL_DIR}/include" CACHE TYPE INTERNAL)
5
6 set(LIB_DIR ${INSTALL_DIR}/lib)7 set(LIB_DIR ${INSTALL_DIR}/lib)
7 list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdraco.a)8 list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdraco.a)
8 list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdracodec.a)9 list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdracodec.a)
9 list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdracoenc.a)10 list(APPEND DRACO_LIBRARIES ${LIB_DIR}/libdracoenc.a)
11 target_link_libraries(${TARGET_NAME} ${DRACO_LIBRARIES})
10 else()12 else()
11 add_dependency_external_projects(draco)13 set(LIB_SEARCH_PATH_RELEASE ${VCPKG_INSTALL_ROOT}/lib/)
12 find_package(Draco REQUIRED)14 set(LIB_SEARCH_PATH_DEBUG ${VCPKG_INSTALL_ROOT}/debug/lib/)
13 list(APPEND DRACO_LIBRARIES ${DRACO_LIBRARY})15 foreach(LIB ${LIBS})
14 list(APPEND DRACO_LIBRARIES ${DRACO_ENCODER_LIBRARY})16 find_library(${LIB}_LIBPATH ${LIB} PATHS ${LIB_SEARCH_PATH_RELEASE} NO_DEFAULT_PATH)
17 list(APPEND DRACO_LIBRARY_RELEASE ${${LIB}_LIBPATH})
18 find_library(${LIB}D_LIBPATH ${LIB} PATHS ${LIB_SEARCH_PATH_DEBUG} NO_DEFAULT_PATH)
19 list(APPEND DRACO_LIBRARY_DEBUG ${${LIB}D_LIBPATH})
20 endforeach()
21 select_library_configurations(DRACO)
22 target_link_libraries(${TARGET_NAME} ${DRACO_LIBRARY})
15 endif()23 endif()
16 target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${DRACO_INCLUDE_DIRS})24endmacro()
17 target_link_libraries(${TARGET_NAME} ${DRACO_LIBRARIES})
18endmacro()
cmake/macros/TargetEtc2Comp.cmake+6−5
@@ -8,15 +8,16 @@ · 7 unmodified lines
8macro(TARGET_ETC2COMP)8macro(TARGET_ETC2COMP)
9 if (ANDROID)9 if (ANDROID)
10 set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/etc2comp)10 set(INSTALL_DIR ${HIFI_ANDROID_PRECOMPILED}/etc2comp)
11 set(ETC2COMP_INCLUDE_DIRS "${INSTALL_DIR}/include/Etc" "${INSTALL_DIR}/include/EtcCodec")11 set(ETC2COMP_INCLUDE_DIRS "${INSTALL_DIR}/include" "${INSTALL_DIR}/include/Etc" "${INSTALL_DIR}/include/EtcCodec")
12 set(ETC2COMP_LIBRARY_DEBUG ${INSTALL_DIR}/lib/libEtcLib.a)12 set(ETC2COMP_LIBRARY_DEBUG ${INSTALL_DIR}/lib/libEtcLib.a)
13 set(ETC2COMP_LIBRARY_RELEASE ${INSTALL_DIR}/lib/libEtcLib.a)13 set(ETC2COMP_LIBRARY_RELEASE ${INSTALL_DIR}/lib/libEtcLib.a)
14 select_library_configurations(ETC2COMP)14 target_include_directories(${TARGET_NAME} PRIVATE ${ETC2COMP_INCLUDE_DIRS})
15 else()15 else()
16 add_dependency_external_projects(etc2comp)16 find_library(ETC2COMP_LIBRARY_DEBUG EtcLib PATHS ${VCPKG_INSTALL_ROOT}/debug/lib/ NO_DEFAULT_PATH)
17 find_package(Etc2Comp REQUIRED)17 find_library(ETC2COMP_LIBRARY_RELEASE EtcLib PATHS ${VCPKG_INSTALL_ROOT}/lib/ NO_DEFAULT_PATH)
18 endif()18 endif()
19 19
20 target_include_directories(${TARGET_NAME} PRIVATE ${ETC2COMP_INCLUDE_DIRS})20 select_library_configurations(ETC2COMP)
21 target_link_libraries(${TARGET_NAME} ${ETC2COMP_LIBRARIES})21 target_link_libraries(${TARGET_NAME} ${ETC2COMP_LIBRARIES})
22endmacro()22endmacro()
23
cmake/macros/TargetGli.cmake+2−3
@@ -6,7 +6,6 @@ · 5 unmodified lines
6# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html6# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
7# 7#
8macro(TARGET_GLI)8macro(TARGET_GLI)
9 add_dependency_external_projects(gli)9 # We use vcpkg for both gli and glm, so we just re-use the target_glm macro here
10 find_package(GLI REQUIRED)10 target_glm()
11 target_include_directories(${TARGET_NAME} PUBLIC ${GLI_INCLUDE_DIRS})
12endmacro()11endmacro()
cmake/macros/TargetGlm.cmake+6−4
@@ -7,10 +7,12 @@ · 6 unmodified lines
7# 7#
8macro(TARGET_GLM)8macro(TARGET_GLM)
9 if (ANDROID)9 if (ANDROID)
10 set(GLM_INCLUDE_DIRS "${HIFI_ANDROID_PRECOMPILED}/glm/include")10 target_include_directories(${TARGET_NAME} PUBLIC "${VCPKG_INSTALL_ROOT}/include")
11 else()11 else()
12 add_dependency_external_projects(glm)12 find_package(glm CONFIG REQUIRED)
13 find_package(GLM REQUIRED)13 target_link_libraries(${TARGET_NAME} glm)
14 endif()14 endif()
15 target_include_directories(${TARGET_NAME} PUBLIC ${GLM_INCLUDE_DIRS})15 target_compile_definitions(${TARGET_NAME} PUBLIC GLM_FORCE_RADIANS)
16 target_compile_definitions(${TARGET_NAME} PUBLIC GLM_ENABLE_EXPERIMENTAL)
17 target_compile_definitions(${TARGET_NAME} PUBLIC GLM_FORCE_CTOR_INIT)
16endmacro()18endmacro()
cmake/macros/TargetJson.cmake+2−3
@@ -6,7 +6,6 @@ · 5 unmodified lines
6# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html6# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
7# 7#
8macro(TARGET_JSON)8macro(TARGET_JSON)
9 add_dependency_external_projects(json)9 # We use vcpkg for both json and glm, so we just re-use the target_glm macro here
10 find_package(JSON REQUIRED)10 target_glm()
11 target_include_directories(${TARGET_NAME} PUBLIC ${JSON_INCLUDE_DIRS})
12endmacro()11endmacro()
cmake/macros/TargetNvtt.cmake+9−4
@@ -15,12 +15,17 @@ macro(TARGET_NVTT) · 14 unmodified lines
15 list(APPEND NVTT_LIBS "${NVTT_LIB_DIR}/libnvimage.so")15 list(APPEND NVTT_LIBS "${NVTT_LIB_DIR}/libnvimage.so")
16 list(APPEND NVTT_LIBS "${NVTT_LIB_DIR}/libnvtt.so")16 list(APPEND NVTT_LIBS "${NVTT_LIB_DIR}/libnvtt.so")
17 set(NVTT_LIBRARIES ${NVTT_LIBS} CACHE TYPE INTERNAL)17 set(NVTT_LIBRARIES ${NVTT_LIBS} CACHE TYPE INTERNAL)
18 target_include_directories(${TARGET_NAME} PRIVATE ${NVTT_INCLUDE_DIRS})
18 else()19 else()
19 add_dependency_external_projects(nvtt)20 find_library(NVTT_LIBRARY_RELEASE nvtt PATHS ${VCPKG_INSTALL_ROOT}/lib NO_DEFAULT_PATH)
20 find_package(NVTT REQUIRED)21 find_library(NVTT_LIBRARY_DEBUG nvtt PATHS ${VCPKG_INSTALL_ROOT}/debug/lib NO_DEFAULT_PATH)
21 add_paths_to_fixup_libs(${NVTT_DLL_PATH})22 select_library_configurations(NVTT)
22 endif()23 endif()
23 24
24 target_include_directories(${TARGET_NAME} PRIVATE ${NVTT_INCLUDE_DIRS})
25 target_link_libraries(${TARGET_NAME} ${NVTT_LIBRARIES})25 target_link_libraries(${TARGET_NAME} ${NVTT_LIBRARIES})
26 if ((NOT WIN32) AND (NOT ANDROID) AND (NOT APPLE))
27 find_package(OpenMP)
28 target_link_libraries(${TARGET_NAME} OpenMP::OpenMP_C OpenMP::OpenMP_CXX)
29 endif()
30
26endmacro()31endmacro()
cmake/macros/TargetOpenSSL.cmake+1−8
@@ -11,15 +11,8 @@ macro(TARGET_OPENSSL) · 10 unmodified lines
11 set(OPENSSL_INCLUDE_DIR "${OPENSSL_INSTALL_DIR}/include" CACHE TYPE INTERNAL)11 set(OPENSSL_INCLUDE_DIR "${OPENSSL_INSTALL_DIR}/include" CACHE TYPE INTERNAL)
12 set(OPENSSL_LIBRARIES "${OPENSSL_INSTALL_DIR}/lib/libcrypto.a;${OPENSSL_INSTALL_DIR}/lib/libssl.a" CACHE TYPE INTERNAL)12 set(OPENSSL_LIBRARIES "${OPENSSL_INSTALL_DIR}/lib/libcrypto.a;${OPENSSL_INSTALL_DIR}/lib/libssl.a" CACHE TYPE INTERNAL)
13 else()13 else()
14 14 # using VCPKG for OpenSSL
15 find_package(OpenSSL REQUIRED)15 find_package(OpenSSL REQUIRED)
16
17 if (APPLE AND ${OPENSSL_INCLUDE_DIR} STREQUAL "/usr/include")
18 # this is a user on OS X using system OpenSSL, which is going to throw warnings since they're deprecating for their common crypto
19 message(WARNING "The found version of OpenSSL is the OS X system version. This will produce deprecation warnings."
20 "\nWe recommend you install a newer version (at least 1.0.1h) in a different directory and set OPENSSL_ROOT_DIR in your env so Cmake can find it.")
21 endif()
22
23 endif()16 endif()
24 17
25 include_directories(SYSTEM "${OPENSSL_INCLUDE_DIR}")18 include_directories(SYSTEM "${OPENSSL_INCLUDE_DIR}")
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#
8macro(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})
13endmacro()
cmake/macros/TargetSDL2.cmake+8−5
@@ -6,9 +6,12 @@ · 5 unmodified lines
6# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html6# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
7# 7#
8macro(TARGET_SDL2)8macro(TARGET_SDL2)
9 add_dependency_external_projects(sdl2)9 # using VCPKG for SDL2
10 find_package(SDL2 REQUIRED)10 find_package(SDL2 CONFIG REQUIRED)
11 target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${SDL2_INCLUDE_DIR})11 if (WIN32)
12 target_link_libraries(${TARGET_NAME} ${SDL2_LIBRARY})12 target_link_libraries(${TARGET_NAME} SDL2::SDL2)
13 else()
14 target_link_libraries(${TARGET_NAME} SDL2::SDL2-static)
15 endif()
13 add_definitions(-DHAVE_SDL2)16 add_definitions(-DHAVE_SDL2)
14endmacro()17endmacro()
cmake/macros/TargetTBB.cmake+9−4
@@ -13,12 +13,17 @@ if (ANDROID) · 12 unmodified lines
13 set(TBB_LIBRARY ${TBB_INSTALL_DIR}/lib/release/libtbb.so CACHE FILEPATH "TBB library location")13 set(TBB_LIBRARY ${TBB_INSTALL_DIR}/lib/release/libtbb.so CACHE FILEPATH "TBB library location")
14 set(TBB_MALLOC_LIBRARY ${TBB_INSTALL_DIR}/lib/release/libtbbmalloc.so CACHE FILEPATH "TBB malloc library location")14 set(TBB_MALLOC_LIBRARY ${TBB_INSTALL_DIR}/lib/release/libtbbmalloc.so CACHE FILEPATH "TBB malloc library location")
15 set(TBB_LIBRARIES ${TBB_LIBRARY} ${TBB_MALLOC_LIBRARY})15 set(TBB_LIBRARIES ${TBB_LIBRARY} ${TBB_MALLOC_LIBRARY})
16else()16 target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${TBB_INCLUDE_DIRS})
17 target_link_libraries(${TARGET_NAME} ${TBB_LIBRARIES})
18elseif(APPLE)
17 add_dependency_external_projects(tbb)19 add_dependency_external_projects(tbb)
18 find_package(TBB REQUIRED)20 find_package(TBB REQUIRED)
21 target_link_libraries(${TARGET_NAME} ${TBB_LIBRARIES})
22 target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${TBB_INCLUDE_DIRS})
23else()
24 # using VCPKG for TBB
25 find_package(TBB CONFIG REQUIRED)
26 target_link_libraries(${TARGET_NAME} TBB::tbb)
19endif()27endif()
20 28
21target_link_libraries(${TARGET_NAME} ${TBB_LIBRARIES})
22target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${TBB_INCLUDE_DIRS})
23
24endmacro()29endmacro()
cmake/macros/TargetVulkan.cmake+3−11
@@ -5,15 +5,7 @@ · 4 unmodified lines
5# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html5# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
6# 6#
7macro(TARGET_VULKAN)7macro(TARGET_VULKAN)
8 find_package(Vulkan)8 find_package(Vulkan REQUIRED)
9 9 target_include_directories(${TARGET_NAME} PRIVATE ${VULKAN_INCLUDE_DIR})
10 if (Vulkan_FOUND)10 target_link_libraries(${TARGET_NAME} ${VULKAN_LIBRARY})
11 add_definitions(-DHAVE_VULKAN)
12 target_include_directories(${TARGET_NAME} PRIVATE ${Vulkan_INCLUDE_DIRS})
13 target_link_libraries(${TARGET_NAME} ${Vulkan_LIBRARIES})
14
15 add_dependency_external_projects(glslang)
16 target_include_directories(${TARGET_NAME} PRIVATE ${GLSLANG_INCLUDE_DIRS})
17 target_link_libraries(${TARGET_NAME} ${GLSLANG_LIBRARIES})
18 endif()
19endmacro()11endmacro()
cmake/macros/TargetZlib.cmake+1−10
@@ -6,17 +6,8 @@ · 5 unmodified lines
6# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html6# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
7#7#
8macro(TARGET_ZLIB)8macro(TARGET_ZLIB)
9 9 # using VCPKG for zlib
10 if (WIN32)
11 add_dependency_external_projects(zlib)
12 endif()
13
14 find_package(ZLIB REQUIRED)10 find_package(ZLIB REQUIRED)
15
16 if (WIN32)
17 add_paths_to_fixup_libs(${ZLIB_DLL_PATH})
18 endif()
19
20 target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${ZLIB_INCLUDE_DIRS})11 target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${ZLIB_INCLUDE_DIRS})
21 target_link_libraries(${TARGET_NAME} ${ZLIB_LIBRARIES})12 target_link_libraries(${TARGET_NAME} ${ZLIB_LIBRARIES})
22endmacro()13endmacro()
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
20include("${MACRO_DIR}/HifiLibrarySearchHints.cmake")
21hifi_library_search_hints("draco")
22
23find_path(DRACO_INCLUDE_DIRS draco/core/draco_types.h PATH_SUFFIXES include/draco/src include HINTS ${DRACO_SEARCH_DIRS})
24
25find_library(DRACO_LIBRARY draco PATH_SUFFIXES "lib" HINTS ${DRACO_SEARCH_DIRS})
26find_library(DRACO_ENCODER_LIBRARY draco PATH_SUFFIXES "lib" HINTS ${DRACO_SEARCH_DIRS})
27find_library(DRACO_DECODER_LIBRARY draco PATH_SUFFIXES "lib" HINTS ${DRACO_SEARCH_DIRS})
28
29include(FindPackageHandleStandardArgs)
30find_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
19include("${MACRO_DIR}/HifiLibrarySearchHints.cmake")
20hifi_library_search_hints("etc2comp")
21
22find_path(ETC_INCLUDE_DIR NAMES Etc.h HINTS ${ETC2COMP_SEARCH_DIRS})
23find_path(ETCCODEC_INCLUDE_DIR NAMES EtcBlock4x4.h HINTS ${ETC2COMP_SEARCH_DIRS})
24set(ETC2COMP_INCLUDE_DIRS "${ETC_INCLUDE_DIR}" "${ETCCODEC_INCLUDE_DIR}")
25
26find_library(ETC2COMP_LIBRARY_DEBUG NAMES ETC2COMP ETC2COMP_LIB PATH_SUFFIXES EtcLib/Debug HINTS ${ETC2COMP_SEARCH_DIRS})
27find_library(ETC2COMP_LIBRARY_RELEASE NAMES ETC2COMP ETC2COMP_LIB PATH_SUFFIXES EtcLib/Release EtcLib HINTS ${ETC2COMP_SEARCH_DIRS})
28
29include(SelectLibraryConfigurations)
30select_library_configurations(ETC2COMP)
31
32set(ETC2COMP_LIBRARIES ${ETC2COMP_LIBRARY})
33
34find_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
37mark_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
21include("${MACRO_DIR}/HifiLibrarySearchHints.cmake")
22hifi_library_search_hints("glew")
23
24find_path(GLEW_INCLUDE_DIRS GL/glew.h PATH_SUFFIXES include HINTS ${GLEW_SEARCH_DIRS})
25
26find_library(GLEW_LIBRARY_RELEASE glew32 PATH_SUFFIXES "lib/Release/Win32" "lib" HINTS ${GLEW_SEARCH_DIRS})
27find_library(GLEW_LIBRARY_DEBUG glew32d PATH_SUFFIXES "lib/Debug/Win32" "lib" HINTS ${GLEW_SEARCH_DIRS})
28
29include(SelectLibraryConfigurations)
30select_library_configurations(GLEW)
31
32include(FindPackageHandleStandardArgs)
33find_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
10include("${MACRO_DIR}/HifiLibrarySearchHints.cmake")
11hifi_library_search_hints("json")
12
13# locate header
14find_path(JSON_INCLUDE_DIRS "json/json.hpp" HINTS ${JSON_SEARCH_DIRS})
15
16include(FindPackageHandleStandardArgs)
17find_package_handle_standard_args(JSON DEFAULT_MSG JSON_INCLUDE_DIRS)
18
19mark_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
31if (UNIX)
32 find_package(PkgConfig QUIET)
33 pkg_check_modules(_OPENSSL QUIET openssl)
34endif ()
35
36if (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()
42else ()
43 include("${MACRO_DIR}/HifiLibrarySearchHints.cmake")
44 hifi_library_search_hints("openssl")
45
46 set(_OPENSSL_ROOT_HINTS_AND_PATHS ${OPENSSL_SEARCH_DIRS})
47endif ()
48
49find_path(OPENSSL_INCLUDE_DIR NAMES openssl/ssl.h HINTS ${_OPENSSL_ROOT_HINTS_AND_PATHS} ${_OPENSSL_INCLUDEDIR}
50 PATH_SUFFIXES include
51)
52
53if (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()
65else()
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
83endif ()
84
85function(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)
114endfunction()
115
116if (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 ()
150endif ()
151
152include(FindPackageHandleStandardArgs)
153
154set(OPENSSL_REQUIREMENTS OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR)
155if (WIN32)
156 list(APPEND OPENSSL_REQUIREMENTS OPENSSL_DLL_PATH)
157endif ()
158
159if (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 )
168else ()
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 )
172endif ()
173
174mark_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
16if (NOT ANDROID)
17 include(FindPackageHandleStandardArgs)
18 find_package_handle_standard_args(OPENVR DEFAULT_MSG OPENVR_INCLUDE_DIRS OPENVR_LIBRARIES)
19endif()
20
21mark_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.)
105include("${MACRO_DIR}/HifiLibrarySearchHints.cmake")
106hifi_library_search_hints("sdl2")
107
108FIND_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
127IF(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
146ELSE(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 ()
164ENDIF(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.
170IF(NOT APPLE)
171 FIND_PACKAGE(Threads)
172ENDIF(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.)
177IF(MINGW)
178 SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW")
179ENDIF(MINGW)
180
181SET(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")
211ENDIF(SDL2_LIBRARY_TEMP)
212
213INCLUDE(FindPackageHandleStandardArgs)
214
215set(SDL2_REQUIREMENTS SDL2_LIBRARY SDL2_INCLUDE_DIR)
216if (WIN32)
217 list(APPEND SDL2_REQUIREMENTS SDL2_DLL_PATH)
218endif ()
219
220FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 REQUIRED_VARS ${SDL2_REQUIREMENTS})
221
222if (WIN32)
223 add_paths_to_fixup_libs(${SDL2_DLL_PATH})
224endif ()
cmake/ports/bullet3/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: bullet3
2Version: ab8f16961e19a86ee20c6a1d61f662392524cc77
3Description: 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#
12include(vcpkg_common_functions)
13
14if (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)
18endif()
19
20vcpkg_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
29vcpkg_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
47vcpkg_install_cmake()
48
49file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/lib/cmake)
50file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/lib/cmake)
51file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)
52file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/include/bullet/BulletInverseDynamics/details)
53
54vcpkg_copy_pdbs()
55
56# Handle copyright
57file(INSTALL ${SOURCE_PATH}/LICENSE.txt DESTINATION ${CURRENT_PACKAGES_DIR}/share/bullet3 RENAME copyright)
cmake/ports/draco/CONTROL+4−0
@@ -0,0 +1,4 @@
1Source: draco
2Version: 1.3.3
3Description: A library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics.
4Build-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
13if (VCPKG_LIBRARY_LINKAGE STREQUAL dynamic)
14 message(STATUS "Warning: Dynamic building not supported yet. Building static.")
15 set(VCPKG_LIBRARY_LINKAGE static)
16endif()
17
18include(vcpkg_common_functions)
19
20vcpkg_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
28vcpkg_configure_cmake(
29 SOURCE_PATH ${SOURCE_PATH}
30 PREFER_NINJA
31)
32
33vcpkg_install_cmake()
34
35vcpkg_fixup_cmake_targets(CONFIG_PATH lib/draco/cmake)
36
37# Install tools and plugins
38file(GLOB TOOLS "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/*.exe")
39if(TOOLS)
40 file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/tools/draco)
41 file(COPY ${TOOLS} DESTINATION ${CURRENT_PACKAGES_DIR}/tools/draco)
42endif()
43
44file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin)
45file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/lib/draco)
46file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/bin)
47file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/lib/draco)
48
49file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)
50file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share)
51
52vcpkg_copy_pdbs()
53
54# Handle copyright
55file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/draco)
56file(RENAME ${CURRENT_PACKAGES_DIR}/share/draco/LICENSE ${CURRENT_PACKAGES_DIR}/share/draco/copyright)
cmake/ports/etc2comp/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: etc2comp
2Version: 7f1843bf07825c21cab711360c1ddbad04641036
3Description: 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#
12if (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)
16endif()
17
18include(vcpkg_common_functions)
19
20vcpkg_from_github(
21 OUT_SOURCE_PATH SOURCE_PATH
22 REPO highfidelity/etc2comp
23 REF 7f1843bf07825c21cab711360c1ddbad04641036
24 SHA512 d747076acda8537d39585858c793a35c3dcc9ef283d723619a47f8c81ec1454c95b3340ad35f0655a939eae5b8271c801c48a9a7568311a01903a344c44af25b
25 HEAD_REF master
26)
27
28vcpkg_configure_cmake(
29 SOURCE_PATH ${SOURCE_PATH}
30)
31
32vcpkg_install_cmake()
33
34file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)
35file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/etc2comp)
36file(RENAME ${CURRENT_PACKAGES_DIR}/share/etc2comp/LICENSE ${CURRENT_PACKAGES_DIR}/share/etc2comp/copyright)
37
38vcpkg_copy_pdbs()
39
cmake/ports/gli/CONTROL+4−0
@@ -0,0 +1,4 @@
1Source: gli
2Version: 0.8.2-1
3Build-Depends: glm
4Description: OpenGL Image (GLI) https://gli.g-truc.net
cmake/ports/gli/portfile.cmake+19−0
@@ -0,0 +1,19 @@
1#header-only library
2include(vcpkg_common_functions)
3
4vcpkg_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
14file(COPY ${SOURCE_PATH}/manual.md DESTINATION ${CURRENT_PACKAGES_DIR}/share/gli/)
15file(RENAME ${CURRENT_PACKAGES_DIR}/share/gli/manual.md ${CURRENT_PACKAGES_DIR}/share/gli/copyright)
16
17# Copy the glm header files
18file(GLOB HEADER_FILES "${SOURCE_PATH}/gli/*.hpp" "${SOURCE_PATH}/gli/core")
19file(COPY ${HEADER_FILES} DESTINATION ${CURRENT_PACKAGES_DIR}/include/gli)
cmake/ports/glm/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: glm
2Version: 0.9.9.3
3Description: OpenGL Mathematics (GLM) https://glm.g-truc.net
cmake/ports/glm/disable_warnings_as_error.patch+13−0
@@ -0,0 +1,13 @@
1diff --git a/CMakeLists.txt b/CMakeLists.txt
2index 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 @@
1include(vcpkg_common_functions)
2
3vcpkg_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
11vcpkg_apply_patches(
12 SOURCE_PATH ${SOURCE_PATH}
13 PATCHES "${CMAKE_CURRENT_LIST_DIR}/disable_warnings_as_error.patch"
14)
15
16vcpkg_configure_cmake(
17 SOURCE_PATH ${SOURCE_PATH}
18 OPTIONS -DGLM_TEST_ENABLE=OFF
19)
20
21vcpkg_install_cmake()
22
23vcpkg_fixup_cmake_targets(CONFIG_PATH "lib/cmake/glm")
24
25vcpkg_copy_pdbs()
26
27file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)
28file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share)
29
30# Put the license file where vcpkg expects it
31file(COPY ${SOURCE_PATH}/manual.md DESTINATION ${CURRENT_PACKAGES_DIR}/share/glm/)
32file(RENAME ${CURRENT_PACKAGES_DIR}/share/glm/manual.md ${CURRENT_PACKAGES_DIR}/share/glm/copyright)
cmake/ports/glslang/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: glslang
2Version: untagged-048c4dbc7f021224a933-1
3Description: 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 @@
1include(vcpkg_common_functions)
2
3vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
4
5vcpkg_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
13vcpkg_configure_cmake(
14 SOURCE_PATH ${SOURCE_PATH}
15 PREFER_NINJA
16 OPTIONS -DCMAKE_DEBUG_POSTFIX=d
17)
18
19vcpkg_install_cmake()
20
21file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)
22file(RENAME "${CURRENT_PACKAGES_DIR}/bin" "${CURRENT_PACKAGES_DIR}/tools")
23file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/bin")
24
25# Handle copyright
26file(COPY ${CMAKE_CURRENT_LIST_DIR}/copyright DESTINATION ${CURRENT_PACKAGES_DIR}/share/glslang)
cmake/ports/hifi-client-deps/CONTROL+4−0
@@ -0,0 +1,4 @@
1Source: hifi-client-deps
2Version: 0
3Description: Collected dependencies for High Fidelity applications
4Build-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 @@
1set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
cmake/ports/hifi-deps/CONTROL+4−0
@@ -0,0 +1,4 @@
1Source: hifi-deps
2Version: 0
3Description: Collected dependencies for High Fidelity applications
4Build-Depends: bullet3, draco, etc2comp, glm, nvtt, openssl (windows), tbb (!android&!osx), zlib
cmake/ports/hifi-deps/portfile.cmake+1−0
@@ -0,0 +1 @@
1set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
cmake/ports/hifi-host-tools/CONTROL+4−0
@@ -0,0 +1,4 @@
1Source: hifi-host-tools
2Version: 0
3Description: Host build system compatible tools for building High Fidelity applications
4Build-Depends: hifi-scribe, glslang, spirv-cross, spirv-tools
cmake/ports/hifi-host-tools/portfile.cmake+1−0
@@ -0,0 +1 @@
1set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
cmake/ports/hifi-scribe/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: hifi-scribe
2Version: 1bd638a36ca771e5a68d01985b6389b71835cbd2
3Description: Scribe is a language for generating glsl files from templates
cmake/ports/hifi-scribe/portfile.cmake+19−0
@@ -0,0 +1,19 @@
1set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
2include(vcpkg_common_functions)
3
4vcpkg_from_github(
5 OUT_SOURCE_PATH SOURCE_PATH
6 REPO highfidelity/scribe
7 REF 1bd638a36ca771e5a68d01985b6389b71835cbd2
8 SHA512 dbe241d86df3912e544f6b9839873f9875df54efc93822b145e7b13243eaf2e3d690bc8a28b1e52d05bdcd7e68fca6b0b2f5c43ffd0f56a9b7a50d54dcf9e31e
9 HEAD_REF master
10)
11
12vcpkg_configure_cmake(SOURCE_PATH ${SOURCE_PATH})
13vcpkg_install_cmake()
14vcpkg_copy_pdbs()
15
16# cleanup
17configure_file(${SOURCE_PATH}/LICENSE ${CURRENT_PACKAGES_DIR}/share/hifi-scribe/copyright COPYONLY)
18file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/tools)
19
cmake/ports/nlohmann-json/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: nlohmann-json
2Version: 3.3.0
3Description: JSON for Modern C++
cmake/ports/nlohmann-json/portfile.cmake+18−0
@@ -0,0 +1,18 @@
1include(vcpkg_common_functions)
2
3set(SOURCE_VERSION 3.3.0)
4
5vcpkg_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
11vcpkg_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
17file(INSTALL ${HEADER} DESTINATION ${CURRENT_PACKAGES_DIR}/include/nlohmann RENAME json.hpp)
18file(INSTALL ${LICENSE} DESTINATION ${CURRENT_PACKAGES_DIR}/share/nlohmann-json RENAME copyright)
cmake/ports/nvtt/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: nvtt
2Version: 8c7e6b40ee5095f227b75880fabd89c99d6f34c0
3Description: 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#
8include(vcpkg_common_functions)
9
10vcpkg_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
18vcpkg_configure_cmake(
19 SOURCE_PATH ${SOURCE_PATH}
20 OPTIONS
21 -DBUILD_TESTS=OFF
22 -DBUILD_TOOLS=OFF
23)
24
25vcpkg_install_cmake()
26
27if(VCPKG_LIBRARY_LINKAGE STREQUAL static)
28 file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin ${CURRENT_PACKAGES_DIR}/debug/bin)
29endif()
30
31vcpkg_copy_pdbs()
32
33file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)
34file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share)
35
36# Handle copyright
37file(REMOVE ${CURRENT_PACKAGES_DIR}/share/doc/nvtt/LICENSE)
38file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/nvtt)
39file(RENAME ${CURRENT_PACKAGES_DIR}/share/nvtt/LICENSE ${CURRENT_PACKAGES_DIR}/share/nvtt/copyright)
cmake/ports/openssl-android/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: openssl-android
2Version: 1.0.2p
3Description: 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 @@
1include(vcpkg_common_functions)
2set(OPENSSL_VERSION 1.1.0g)
3set(MASTER_COPY_SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src)
4
5message("MASTER_COPY_SOURCE_PATH ${MASTER_COPY_SOURCE_PATH}")
6vcpkg_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
13vcpkg_extract_source_archive(${OPENSSL_SOURCE_ARCHIVE})
14
15file(COPY ${MASTER_COPY_SOURCE_PATH}/include DESTINATION ${CURRENT_PACKAGES_DIR})
16file(GLOB LIBS ${MASTER_COPY_SOURCE_PATH}/lib/*.a)
17file(COPY ${LIBS} DESTINATION ${CURRENT_PACKAGES_DIR}/libs)
18file(COPY ${LIBS} DESTINATION ${CURRENT_PACKAGES_DIR}/debug/libs)
19file(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 @@
1cmake_minimum_required(VERSION 3.9)
2project(openssl C)
3
4if(NOT SOURCE_PATH)
5 message(FATAL_ERROR "Requires SOURCE_PATH")
6endif()
7
8if(CMAKE_SYSTEM_NAME STREQUAL "Android")
9 set(PLATFORM android)
10elseif(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()
16elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
17 set(PLATFORM darwin64-x86_64-cc)
18elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
19 set(PLATFORM BSD-generic64)
20else()
21 message(FATAL_ERROR "Unknown platform")
22endif()
23
24get_filename_component(COMPILER_ROOT "${CMAKE_C_COMPILER}" DIRECTORY)
25
26message("CMAKE_C_COMPILER=${CMAKE_C_COMPILER}")
27message("COMPILER_ROOT=${COMPILER_ROOT}")
28message("CMAKE_SYSROOT=${CMAKE_SYSROOT}")
29message("CMAKE_C_FLAGS=${CMAKE_C_FLAGS}")
30message("CMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}")
31message("CMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}")
32message("CMAKE_INCLUDE_SYSTEM_FLAG_C=${CMAKE_INCLUDE_SYSTEM_FLAG_C}")
33
34set(CFLAGS "${CMAKE_C_FLAGS}")
35if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
36 set(CFLAGS "-Wno-error=unused-command-line-argument ${CMAKE_C_FLAGS}")
37endif()
38if(CMAKE_C_COMPILER_TARGET)
39 set(CFLAGS "${CFLAGS} ${CMAKE_C_COMPILE_OPTIONS_TARGET}${CMAKE_C_COMPILER_TARGET}")
40endif()
41if(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN)
42 set(CFLAGS "${CFLAGS} ${CMAKE_C_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN}${CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN}")
43endif()
44if(CMAKE_SYSROOT AND CMAKE_C_COMPILE_OPTIONS_SYSROOT)
45 set(CFLAGS "${CFLAGS} ${CMAKE_C_COMPILE_OPTIONS_SYSROOT}${CMAKE_SYSROOT}")
46endif()
47
48string(REGEX REPLACE "^ " "" CFLAGS "${CFLAGS}")
49
50if(CMAKE_HOST_WIN32)
51 file(TO_NATIVE_PATH ENV_PATH "${COMPILER_ROOT};$ENV{PATH}")
52else()
53 file(TO_NATIVE_PATH ENV_PATH "${COMPILER_ROOT}:$ENV{PATH}")
54endif()
55set(ENV{ANDROID_DEV} "${CMAKE_SYSROOT}/usr")
56set(ENV{CC} "${CMAKE_C_COMPILER}")
57
58message("ENV{ANDROID_DEV}=$ENV{ANDROID_DEV}")
59
60get_filename_component(SOURCE_PATH_NAME "${SOURCE_PATH}" NAME)
61set(BUILDDIR "${CMAKE_CURRENT_BINARY_DIR}/${SOURCE_PATH_NAME}")
62
63if(NOT EXISTS "${BUILDDIR}")
64 file(COPY ${SOURCE_PATH} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
65endif()
66
67get_filename_component(MSYS_BIN_DIR "${MAKE}" DIRECTORY)
68
69
70file(READ "${BUILDDIR}/Configure" _contents)
71string(REPLACE "-mandroid" "" _contents "${_contents}")
72file(WRITE "${BUILDDIR}/Configure" "${_contents}")
73
74if(BUILD_SHARED_LIBS)
75 set(SHARED shared)
76else()
77 set(SHARED no-shared)
78endif()
79
80if(CMAKE_HOST_WIN32)
81 set(ENV_COMMAND set)
82 set(PATH_VAR ";%PATH%")
83else()
84 set(ENV_COMMAND export)
85 set(PATH_VAR ":$ENV{PATH}")
86endif()
87
88add_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
116add_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)
123add_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
133install(
134 FILES "${BUILDDIR}/libssl.a" "${BUILDDIR}/libcrypto.a"
135 DESTINATION lib
136)
cmake/ports/openssl-unix/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: openssl-unix
2Version: 1.0.2p
3Description: 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 @@
1diff --git a/Configure b/Configure
2index 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 @@
1diff --git a/util/pl/VC-32.pl b/util/pl/VC-32.pl
2index 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 @@
1diff --git a/crypto/cversion.c b/crypto/cversion.c
2index 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 @@
1if(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")
3endif()
4
5include(vcpkg_common_functions)
6set(OPENSSL_VERSION 1.0.2p)
7set(MASTER_COPY_SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src/openssl-${OPENSSL_VERSION})
8
9vcpkg_find_acquire_program(PERL)
10
11vcpkg_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
17vcpkg_extract_source_archive(${OPENSSL_SOURCE_ARCHIVE})
18vcpkg_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
25if(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)
29else()
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()
34endif()
35
36vcpkg_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
47vcpkg_install_cmake()
48
49file(GLOB HEADERS ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/*/include/openssl/*.h)
50set(RESOLVED_HEADERS)
51foreach(HEADER ${HEADERS})
52 get_filename_component(X "${HEADER}" REALPATH)
53 list(APPEND RESOLVED_HEADERS "${X}")
54endforeach()
55
56file(INSTALL ${RESOLVED_HEADERS} DESTINATION ${CURRENT_PACKAGES_DIR}/include/openssl)
57file(INSTALL ${MASTER_COPY_SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/openssl-unix RENAME copyright)
58
59if(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
60 file(COPY ${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/openssl)
61endif()
62
63vcpkg_test_cmake(PACKAGE_NAME OpenSSL MODULE)
cmake/ports/openssl-unix/remove-deps.cmake+7−0
@@ -0,0 +1,7 @@
1file(GLOB_RECURSE MAKEFILES ${DIR}/*/Makefile)
2foreach(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}")
7endforeach()
cmake/ports/openssl-unix/usage+4−0
@@ -0,0 +1,4 @@
1The 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})
2if(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()
10endif()
cmake/ports/openssl-windows/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: openssl-windows
2Version: 1.0.2p-1
3Description: 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 @@
1diff --git a/Configure b/Configure
2index 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 @@
1diff --git a/util/pl/VC-32.pl b/util/pl/VC-32.pl
2index 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 @@
1diff --git a/crypto/cversion.c b/crypto/cversion.c
2index 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 @@
1if(VCPKG_CMAKE_SYSTEM_NAME)
2 message(FATAL_ERROR "This port is only for building openssl on Windows Desktop")
3endif()
4
5include(vcpkg_common_functions)
6set(OPENSSL_VERSION 1.0.2p)
7set(MASTER_COPY_SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src/openssl-${OPENSSL_VERSION})
8
9vcpkg_find_acquire_program(PERL)
10
11get_filename_component(PERL_EXE_PATH ${PERL} DIRECTORY)
12set(ENV{PATH} "$ENV{PATH};${PERL_EXE_PATH}")
13
14vcpkg_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
20vcpkg_extract_source_archive(${OPENSSL_SOURCE_ARCHIVE})
21vcpkg_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
28vcpkg_find_acquire_program(NASM)
29get_filename_component(NASM_EXE_PATH ${NASM} DIRECTORY)
30set(ENV{PATH} "${NASM_EXE_PATH};$ENV{PATH}")
31
32vcpkg_find_acquire_program(JOM)
33
34set(CONFIGURE_COMMAND ${PERL} Configure
35 enable-static-engine
36 enable-capieng
37 no-ssl2
38 -utf-8
39)
40
41if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86")
42 set(OPENSSL_ARCH VC-WIN32)
43 set(OPENSSL_DO "ms\\do_nasm.bat")
44elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64")
45 set(OPENSSL_ARCH VC-WIN64A)
46 set(OPENSSL_DO "ms\\do_win64a.bat")
47else()
48 message(FATAL_ERROR "Unsupported target architecture: ${VCPKG_TARGET_ARCHITECTURE}")
49endif()
50
51if(VCPKG_LIBRARY_LINKAGE STREQUAL dynamic)
52 set(OPENSSL_MAKEFILE "ms\\ntdll.mak")
53else()
54 set(OPENSSL_MAKEFILE "ms\\nt.mak")
55endif()
56
57file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
58
59
60if(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")
94endif()
95
96
97if(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")
129endif()
130
131
132file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)
133file(REMOVE
134 ${CURRENT_PACKAGES_DIR}/debug/bin/openssl.exe
135 ${CURRENT_PACKAGES_DIR}/debug/openssl.cnf
136 ${CURRENT_PACKAGES_DIR}/openssl.cnf
137)
138
139file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/tools/openssl/)
140file(RENAME ${CURRENT_PACKAGES_DIR}/bin/openssl.exe ${CURRENT_PACKAGES_DIR}/tools/openssl/openssl.exe)
141
142vcpkg_copy_tool_dependencies(${CURRENT_PACKAGES_DIR}/tools/openssl)
143
144if(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/)
148endif()
149
150file(READ "${CURRENT_PACKAGES_DIR}/include/openssl/dtls1.h" _contents)
151string(REPLACE "<winsock.h>" "<winsock2.h>" _contents "${_contents}")
152file(WRITE "${CURRENT_PACKAGES_DIR}/include/openssl/dtls1.h" "${_contents}")
153
154file(READ "${CURRENT_PACKAGES_DIR}/include/openssl/rand.h" _contents)
155string(REPLACE "# include <windows.h>" "#ifndef _WINSOCKAPI_\n#define _WINSOCKAPI_\n#endif\n# include <windows.h>" _contents "${_contents}")
156file(WRITE "${CURRENT_PACKAGES_DIR}/include/openssl/rand.h" "${_contents}")
157
158vcpkg_copy_pdbs()
159
160file(COPY ${CMAKE_CURRENT_LIST_DIR}/usage DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT})
161file(INSTALL ${MASTER_COPY_SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT} RENAME copyright)
162
163vcpkg_test_cmake(PACKAGE_NAME OpenSSL MODULE)
cmake/ports/openssl-windows/usage+4−0
@@ -0,0 +1,4 @@
1The 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 @@
1Source: openssl
2Version: 0
3Description: 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.
4Build-Depends: openssl-windows (windows), openssl-android (android), openssl-unix (!android&!windows)
cmake/ports/openssl/portfile.cmake+2−0
@@ -0,0 +1,2 @@
1set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
2file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/usage DESTINATION ${CURRENT_PACKAGES_DIR}/share/openssl/)
cmake/ports/openssl/usage+4−0
@@ -0,0 +1,4 @@
1The 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 @@
1Source: openvr
2Version: 1.0.16
3Description: 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 @@
1include(vcpkg_common_functions)
2
3vcpkg_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
11set(VCPKG_LIBRARY_LINKAGE dynamic)
12
13if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64")
14 set(ARCH_PATH "win64")
15elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86")
16 set(ARCH_PATH "win32")
17else()
18 message(FATAL_ERROR "Package only supports x64 and x86 windows.")
19endif()
20
21if(VCPKG_CMAKE_SYSTEM_NAME)
22 message(FATAL_ERROR "Package only supports windows desktop.")
23endif()
24
25file(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)
31file(COPY ${SOURCE_PATH}/lib/${ARCH_PATH}/openvr_api.lib DESTINATION ${CURRENT_PACKAGES_DIR}/lib)
32file(COPY ${SOURCE_PATH}/lib/${ARCH_PATH}/openvr_api.lib DESTINATION ${CURRENT_PACKAGES_DIR}/debug/lib)
33file(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)
38file(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)
43file(COPY ${SOURCE_PATH}/headers DESTINATION ${CURRENT_PACKAGES_DIR})
44file(RENAME ${CURRENT_PACKAGES_DIR}/headers ${CURRENT_PACKAGES_DIR}/include)
45
46file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/openvr)
47file(RENAME ${CURRENT_PACKAGES_DIR}/share/openvr/LICENSE ${CURRENT_PACKAGES_DIR}/share/openvr/copyright)
cmake/ports/sdl2/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: sdl2
2Version: 2.0.8-1
3Description: 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 @@
1diff --git a/CMakeLists.txt b/CMakeLists.txt
2index 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})
178diff --git a/include/SDL_config.h.cmake b/include/SDL_config.h.cmake
179index 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
8win32: fix symbols leakage for static libraries
9
10diff -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 @@
1include(vcpkg_common_functions)
2
3vcpkg_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
11vcpkg_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
18string(COMPARE EQUAL "${VCPKG_LIBRARY_LINKAGE}" "static" SDL_STATIC)
19string(COMPARE EQUAL "${VCPKG_LIBRARY_LINKAGE}" "dynamic" SDL_SHARED)
20string(COMPARE EQUAL "${VCPKG_CRT_LINKAGE}" "static" FORCE_STATIC_VCRT)
21
22vcpkg_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
33vcpkg_install_cmake()
34
35if(EXISTS "${CURRENT_PACKAGES_DIR}/cmake")
36 vcpkg_fixup_cmake_targets(CONFIG_PATH "cmake")
37elseif(EXISTS "${CURRENT_PACKAGES_DIR}/lib/cmake/SDL2")
38 vcpkg_fixup_cmake_targets(CONFIG_PATH "lib/cmake/SDL2")
39elseif(EXISTS "${CURRENT_PACKAGES_DIR}/SDL2.framework/Resources")
40 vcpkg_fixup_cmake_targets(CONFIG_PATH "SDL2.framework/Resources")
41endif()
42
43file(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
52file(GLOB BINS ${CURRENT_PACKAGES_DIR}/debug/bin/* ${CURRENT_PACKAGES_DIR}/bin/*)
53if(NOT BINS)
54 file(REMOVE_RECURSE
55 ${CURRENT_PACKAGES_DIR}/bin
56 ${CURRENT_PACKAGES_DIR}/debug/bin
57 )
58endif()
59
60if(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()
76endif()
77
78file(INSTALL ${SOURCE_PATH}/COPYING.txt DESTINATION ${CURRENT_PACKAGES_DIR}/share/sdl2 RENAME copyright)
79vcpkg_copy_pdbs()
cmake/ports/shaderc/0001-Do-not-generate-build-version.inc.patch+30−0
@@ -0,0 +1,30 @@
1From e8e12e856cbc41f9bdcc83bc87eb5013df199ee1 Mon Sep 17 00:00:00 2001
2From: vlj <vljn.ovi@gmail.com>
3Date: Fri, 2 Dec 2016 16:36:25 +0100
4Subject: [PATCH] Do not generate build-version.inc
5
6---
7 CMakeLists.txt | 10 +++++-----
8 1 file changed, 5 insertions(+), 5 deletions(-)
9
10diff --git a/CMakeLists.txt b/CMakeLists.txt
11index 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--
292.10.2.windows.1
30
cmake/ports/shaderc/CMakeLists.txt+31−0
@@ -0,0 +1,31 @@
1option(SUFFIX_D "Add d Suffix to lib" ${SUFFIX_D})
2if(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)
8ELSE()
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)
14ENDIF()
15
16add_library(glslang STATIC IMPORTED GLOBAL)
17set_property(TARGET glslang PROPERTY IMPORTED_LOCATION "${GLSLANG}")
18find_path(glslang_SOURCE_DIR glslang/Include/Common)
19set_property(TARGET glslang APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${glslang_SOURCE_DIR}")
20
21add_library(OSDependent STATIC IMPORTED GLOBAL)
22set_property(TARGET OSDependent PROPERTY IMPORTED_LOCATION "${OSDEPENDENT}")
23
24add_library(OGLCompiler STATIC IMPORTED GLOBAL)
25set_property(TARGET OGLCompiler PROPERTY IMPORTED_LOCATION "${OGLCOMPILER}")
26
27add_library(HLSL STATIC IMPORTED GLOBAL)
28set_property(TARGET HLSL PROPERTY IMPORTED_LOCATION "${HLSLLIB}")
29
30add_library(SPIRV STATIC IMPORTED GLOBAL)
31set_property(TARGET SPIRV PROPERTY IMPORTED_LOCATION "${SPIRVLIB}")
cmake/ports/shaderc/CMakeLists_spirv.txt+8−0
@@ -0,0 +1,8 @@
1find_library(SPIRVTOOLSOPT SPIRV-Tools-opt)
2find_library(SPIRVTOOLS SPIRV-Tools)
3
4add_library(SPIRV-Tools-opt STATIC IMPORTED GLOBAL)
5set_property(TARGET SPIRV-Tools-opt PROPERTY IMPORTED_LOCATION "${SPIRVTOOLSOPT}")
6
7add_library(SPIRV-Tools STATIC IMPORTED GLOBAL)
8set_property(TARGET SPIRV-Tools PROPERTY IMPORTED_LOCATION "${SPIRVTOOLS}")
cmake/ports/shaderc/CONTROL+4−0
@@ -0,0 +1,4 @@
1Source: shaderc
2Version: 2018.0-1
3Description: A collection of tools, libraries and tests for shader compilation.
4Build-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 @@
1include(vcpkg_common_functions)
2
3vcpkg_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
13file(COPY ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt DESTINATION ${SOURCE_PATH}/third_party/glslang)
14file(COPY ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_spirv.txt DESTINATION ${SOURCE_PATH}/third_party/spirv-tools)
15file(RENAME ${SOURCE_PATH}/third_party/spirv-tools/CMakeLists_spirv.txt ${SOURCE_PATH}/third_party/spirv-tools/CMakeLists.txt)
16file(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
19set(VCPKG_LIBRARY_LINKAGE "static")
20set(OPTIONS)
21if(VCPKG_CRT_LINKAGE STREQUAL "dynamic")
22 list(APPEND OPTIONS -DSHADERC_ENABLE_SHARED_CRT=ON)
23endif()
24
25# shaderc uses python to manipulate copyright information
26vcpkg_find_acquire_program(PYTHON3)
27get_filename_component(PYTHON3_EXE_PATH ${PYTHON3} DIRECTORY)
28vcpkg_add_to_path(PREPEND "${PYTHON3_EXE_PATH}")
29
30vcpkg_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
37vcpkg_install_cmake()
38
39file(GLOB EXES "${CURRENT_PACKAGES_DIR}/bin/*.exe")
40file(COPY ${EXES} DESTINATION ${CURRENT_PACKAGES_DIR}/tools)
41
42#Safe to remove as libs are static
43file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin)
44file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/bin)
45file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)
46
47# Handle copyright
48file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/shaderc)
49file(RENAME ${CURRENT_PACKAGES_DIR}/share/shaderc/LICENSE ${CURRENT_PACKAGES_DIR}/share/shaderc/copyright)
cmake/ports/spirv-cross/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: spirv-cross
2Version: 2018-08-07-1
3Description: 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 @@
1include(vcpkg_common_functions)
2
3vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
4
5vcpkg_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
13vcpkg_configure_cmake(
14 SOURCE_PATH ${SOURCE_PATH}
15 PREFER_NINJA
16 OPTIONS -DSPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS=OFF
17)
18
19vcpkg_install_cmake()
20vcpkg_copy_pdbs()
21
22foreach(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})
24endforeach()
25
26file(GLOB EXES "${CURRENT_PACKAGES_DIR}/bin/*")
27file(COPY ${EXES} DESTINATION ${CURRENT_PACKAGES_DIR}/tools)
28
29# cleanup
30configure_file(${SOURCE_PATH}/LICENSE ${CURRENT_PACKAGES_DIR}/share/spirv-cross/copyright COPYONLY)
31file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)
32file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share)
33file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin ${CURRENT_PACKAGES_DIR}/debug/bin)
cmake/ports/spirv-tools/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: spirv-tools
2Version: 2018.5-1
3Description: API and commands for processing SPIR-V modules
cmake/ports/spirv-tools/portfile.cmake+43−0
@@ -0,0 +1,43 @@
1include(vcpkg_common_functions)
2
3vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
4
5vcpkg_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
13vcpkg_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
21vcpkg_find_acquire_program(PYTHON3)
22get_filename_component(PYTHON3_DIR "${PYTHON3}" DIRECTORY)
23vcpkg_add_to_path("${PYTHON3_DIR}")
24
25vcpkg_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
33vcpkg_install_cmake()
34
35file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)
36file(GLOB EXES "${CURRENT_PACKAGES_DIR}/bin/*")
37file(COPY ${EXES} DESTINATION ${CURRENT_PACKAGES_DIR}/tools)
38file(REMOVE ${EXES})
39file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/bin ${CURRENT_PACKAGES_DIR}/debug/bin)
40
41# Handle copyright
42file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/spirv-tools)
43file(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 @@
1project(tbb CXX)
2
3file(GLOB SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*)
4file(COPY ${SOURCES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/src)
5
6include(${CMAKE_CURRENT_BINARY_DIR}/src/cmake/TBBBuild.cmake REQUIRED)
7tbb_build(TBB_ROOT ${CMAKE_CURRENT_BINARY_DIR}/src MAKE_ARGS extra_inc=big_iron.inc)
8
9set(SUBDIR ${CMAKE_CURRENT_BINARY_DIR}/tbb_cmake_build/tbb_cmake_build_subdir)
10if(CMAKE_BUILD_TYPE STREQUAL "Release")
11 set(SUBDIR "${SUBDIR}_release")
12else()
13 set(SUBDIR "${SUBDIR}_debug")
14endif()
15
16file(GLOB OUTPUTS ${SUBDIR}/*.so.* ${SUBDIR}/*.so ${SUBDIR}/*.a ${SUBDIR}/*.dylib ${SUBDIR}/*.dylib.*)
17
18install(FILES ${OUTPUTS} DESTINATION lib)
cmake/ports/tbb/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: tbb
2Version: 2018_U5-4
3Description: Intel's Threading Building Blocks.
cmake/ports/tbb/portfile.cmake+86−0
@@ -0,0 +1,86 @@
1include(vcpkg_common_functions)
2
3if(NOT VCPKG_CMAKE_SYSTEM_NAME OR VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore")
4 vcpkg_check_linkage(ONLY_DYNAMIC_LIBRARY)
5endif()
6
7vcpkg_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
15file(COPY ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt DESTINATION ${SOURCE_PATH})
16
17if(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)
28else()
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)
46endif()
47
48file(COPY
49 ${SOURCE_PATH}/include/tbb
50 ${SOURCE_PATH}/include/serial
51 DESTINATION ${CURRENT_PACKAGES_DIR}/include)
52
53# Settings for TBBConfigForSource.cmake.in
54if(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
55 set(TBB_DEFAULT_COMPONENTS tbb tbbmalloc)
56else()
57 set(TBB_DEFAULT_COMPONENTS tbb tbbmalloc tbbmalloc_proxy)
58endif()
59file(READ "${SOURCE_PATH}/include/tbb/tbb_stddef.h" _tbb_stddef)
60string(REGEX REPLACE ".*#define TBB_VERSION_MAJOR ([0-9]+).*" "\\1" _tbb_ver_major "${_tbb_stddef}")
61string(REGEX REPLACE ".*#define TBB_VERSION_MINOR ([0-9]+).*" "\\1" _tbb_ver_minor "${_tbb_stddef}")
62string(REGEX REPLACE ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1" TBB_INTERFACE_VERSION "${_tbb_stddef}")
63set(TBB_VERSION "${_tbb_ver_major}.${_tbb_ver_minor}")
64set(TBB_RELEASE_DIR "\${_tbb_root}/lib")
65set(TBB_DEBUG_DIR "\${_tbb_root}/debug/lib")
66
67configure_file(
68 ${SOURCE_PATH}/cmake/templates/TBBConfigForSource.cmake.in
69 ${CURRENT_PACKAGES_DIR}/share/tbb/TBBConfig.cmake
70 @ONLY
71)
72file(READ ${CURRENT_PACKAGES_DIR}/share/tbb/TBBConfig.cmake _contents)
73string(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)
79string(REPLACE "SHARED IMPORTED)" "UNKNOWN IMPORTED)" _contents "${_contents}")
80file(WRITE ${CURRENT_PACKAGES_DIR}/share/tbb/TBBConfig.cmake "${_contents}")
81
82# Handle copyright
83file(COPY ${SOURCE_PATH}/LICENSE ${CMAKE_CURRENT_LIST_DIR}/usage DESTINATION ${CURRENT_PACKAGES_DIR}/share/tbb)
84file(RENAME ${CURRENT_PACKAGES_DIR}/share/tbb/LICENSE ${CURRENT_PACKAGES_DIR}/share/tbb/copyright)
85
86vcpkg_test_cmake(PACKAGE_NAME TBB)
cmake/ports/tbb/usage+4−0
@@ -0,0 +1,4 @@
1The 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 @@
1Source: vulkanmemoryallocator
2Version: 3a7249f313b047417fbb1d36a3fbe6c3bf1505b5
3Description: Vulkan Memory Allocator
cmake/ports/vulkanmemoryallocator/portfile.cmake+14−0
@@ -0,0 +1,14 @@
1include(vcpkg_common_functions)
2
3set(SOURCE_VERSION 3.3.0)
4
5vcpkg_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
13file(INSTALL ${SOURCE_PATH}/src/vk_mem_alloc.h DESTINATION ${CURRENT_PACKAGES_DIR}/include/vma)
14file(INSTALL ${SOURCE_PATH}/LICENSE.txt DESTINATION ${CURRENT_PACKAGES_DIR}/share/vulkanmemoryallocator RENAME copyright)
cmake/ports/zlib/CONTROL+3−0
@@ -0,0 +1,3 @@
1Source: zlib
2Version: 1.2.11-3
3Description: 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 @@
1diff --git a/CMakeLists.txt b/CMakeLists.txt
2index 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 @@
1include(vcpkg_common_functions)
2set(SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src/zlib-1.2.11)
3vcpkg_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)
8vcpkg_extract_source_archive(${ARCHIVE_FILE})
9
10vcpkg_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
17file(REMOVE ${SOURCE_PATH}/zconf.h)
18
19vcpkg_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
29vcpkg_install_cmake()
30
31# Both dynamic and static are built, so keep only the one needed
32if(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()
39endif()
40
41file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/zlib RENAME copyright)
42
43vcpkg_copy_pdbs()
44
45file(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 @@
1The 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
28 28
29 !include "WinVer.nsh"29 !include "WinVer.nsh"
30 30
31;--------------------------------
32;Include Installer Logging
33; taken from http://nsis.sourceforge.net/Logging:_Simple_Text_File_Logging_Functions_and_Macros
34; TextLog.nsh v1.1 - 2005-12-26
35; Written by Mike Schinkel [http://www.mikeschinkel.com/blog/]
36
37 Var /GLOBAL __TextLog_FileHandle
38 Var /GLOBAL __TextLog_FileName
39 Var /GLOBAL __TextLog_State
40
41 !define LogMsg '!insertmacro LogMsgCall'
42 !macro LogMsgCall _text
43 Call LogSetOn
44 Push "${_text}"
45 Call LogText
46 Call LogSetOff
47 !macroend
48
49
50 !define LogText '!insertmacro LogTextCall'
51 !macro LogTextCall _text
52 Push "${_text}"
53 Call LogText
54 !macroend
55
56 Function LogText
57 Exch $0 ; pABC -> 0ABC
58 FileWrite $__TextLog_FileHandle "$0$\r$\n"
59 Pop $0 ; 0ABC -> ABC
60 FunctionEnd
61
62 !define LogSetFileName '!insertmacro LogSetFileNameCall'
63 !macro LogSetFileNameCall _filename
64 Push "${_filename}"
65 Call LogSetFileName
66 !macroend
67
68 Function LogSetFileName
69 Exch $0 ; pABC -> 0ABC
70 StrCpy $__TextLog_FileName "$0"
71 StrCmp $__TextLog_State "open" +1 +3
72 Call LogSetOff
73 Call LogSetOn
74 Pop $0 ; 0ABC -> ABC
75 FunctionEnd
76
77 !define LogSetOn '!insertmacro LogSetOnCall'
78 !macro LogSetOnCall
79 Call LogSetOn
80 !macroend
81
82 Function LogSetOn
83 StrCmp $__TextLog_FileName "" +1 AlreadySet
84 StrCpy $__TextLog_FileName "$INSTDIR\install.log"
85 AlreadySet:
86 StrCmp $__TextLog_State "open" +2
87 FileOpen $__TextLog_FileHandle "$__TextLog_FileName" a
88 FileSeek $__TextLog_FileHandle 0 END
89 StrCpy $__TextLog_State "open"
90 FunctionEnd
91
92 !define LogSetOff '!insertmacro LogSetOffCall'
93 !macro LogSetOffCall
94 Call LogSetOff
95 !macroend
96
97 Function LogSetOff
98 StrCmp $__TextLog_State "open" +1 +2
99 FileClose $__TextLog_FileHandle
100 StrCpy $__TextLog_State ""
101 FunctionEnd
102
31;--------------------------------103;--------------------------------
32; Utilities and Functions104; Utilities and Functions
33 ;--------------------------------105 ;--------------------------------
@@ -375,6 +447,10 @@ Var GAClientID · 341 unmodified lines
375 !insertmacro CreateGUID $GAClientID447 !insertmacro CreateGUID $GAClientID
376!macroend448!macroend
377 449
450!macro LogStep Category Action Label Value
451 ${LogText} "Step: ${Category} ${Action} ${Label} ${Value}"
452!macroend
453
378!macro GoogleAnalytics Category Action Label Value454!macro GoogleAnalytics Category Action Label Value
379 ${If} "@GA_TRACKING_ID@" != ""455 ${If} "@GA_TRACKING_ID@" != ""
380 Push $0456 Push $0
@@ -557,11 +633,13 @@ Var Express · 176 unmodified lines
557!macro MaybeSkipPage633!macro MaybeSkipPage
558 ; Check if Express is set, if so, abort the post install options page634 ; Check if Express is set, if so, abort the post install options page
559 ${If} $Express == "1"635 ${If} $Express == "1"
636 ${LogText} "Express Install: Skipping Post Install Options Page"
560 Abort637 Abort
561 ${EndIf}638 ${EndIf}
562!macroend639!macroend
563 640
564!macro DownloadSlideshowImages641!macro DownloadSlideshowImages
642 ${LogText} "Download Slideshow Images"
565 InitPluginsDir643 InitPluginsDir
566 644
567 Push $0645 Push $0
@@ -583,32 +661,40 @@ Var Express · 15 unmodified lines
583!macroend661!macroend
584 662
585Function OnUserAbort663Function OnUserAbort
664 !insertmacro LogStep "Installer" "Abort" "User Abort" ""
586 !insertmacro GoogleAnalytics "Installer" "Abort" "User Abort" ""665 !insertmacro GoogleAnalytics "Installer" "Abort" "User Abort" ""
587FunctionEnd666FunctionEnd
588Function PageWelcomePre667Function PageWelcomePre
668 !insertmacro LogStep "Installer" "Welcome" "" ""
589 !insertmacro GoogleAnalytics "Installer" "Welcome" "" ""669 !insertmacro GoogleAnalytics "Installer" "Welcome" "" ""
590 !insertmacro DownloadSlideshowImages670 !insertmacro DownloadSlideshowImages
591FunctionEnd671FunctionEnd
592Function PageLicensePre672Function PageLicensePre
673 !insertmacro LogStep "Installer" "License" "" ""
593 !insertmacro GoogleAnalytics "Installer" "License" "" ""674 !insertmacro GoogleAnalytics "Installer" "License" "" ""
594FunctionEnd675FunctionEnd
595Function PageDirectoryPre676Function PageDirectoryPre
596 !insertmacro MaybeSkipPage677 !insertmacro MaybeSkipPage
678 !insertmacro LogStep "Installer" "Directory" "" ""
597 !insertmacro GoogleAnalytics "Installer" "Directory" "" ""679 !insertmacro GoogleAnalytics "Installer" "Directory" "" ""
598FunctionEnd680FunctionEnd
599Function PageStartMenuPre681Function PageStartMenuPre
600 !insertmacro MaybeSkipPage682 !insertmacro MaybeSkipPage
683 !insertmacro LogStep "Installer" "StartMenu" "" ""
601 !insertmacro GoogleAnalytics "Installer" "StartMenu" "" ""684 !insertmacro GoogleAnalytics "Installer" "StartMenu" "" ""
602FunctionEnd685FunctionEnd
603Function PageComponentsPre686Function PageComponentsPre
604 !insertmacro MaybeSkipPage687 !insertmacro MaybeSkipPage
688 !insertmacro LogStep "Installer" "Components" "" ""
605 !insertmacro GoogleAnalytics "Installer" "Components" "" ""689 !insertmacro GoogleAnalytics "Installer" "Components" "" ""
606FunctionEnd690FunctionEnd
607Function PageInstallFilesPre691Function PageInstallFilesPre
692 !insertmacro LogStep "Installer" "Install" "" ""
608 !insertmacro GoogleAnalytics "Installer" "Install" "" ""693 !insertmacro GoogleAnalytics "Installer" "Install" "" ""
609FunctionEnd694FunctionEnd
610 695
611!macro SetInstallOption Checkbox OptionName Default696!macro SetInstallOption Checkbox OptionName Default
697 ${LogText} "SetInstallOption ${OptionName} ${Default}"
612 ; reads the value for the given install option to the registry698 ; reads the value for the given install option to the registry
613 ReadRegStr $0 HKLM "@REGISTRY_HKLM_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\@POST_INSTALL_OPTIONS_REG_GROUP@" "${OptionName}"699 ReadRegStr $0 HKLM "@REGISTRY_HKLM_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\@POST_INSTALL_OPTIONS_REG_GROUP@" "${OptionName}"
614 700
@@ -625,6 +711,7 @@ FunctionEnd · 10 unmodified lines
625!macroend711!macroend
626 712
627Function InstallTypesPage713Function InstallTypesPage
714 !insertmacro LogStep "Installer" "Install Types" "" ""
628 !insertmacro GoogleAnalytics "Installer" "Install Types" "" ""715 !insertmacro GoogleAnalytics "Installer" "Install Types" "" ""
629 716
630 !insertmacro MUI_HEADER_TEXT "Choose Installation Type" "Express or Custom Install"717 !insertmacro MUI_HEADER_TEXT "Choose Installation Type" "Express or Custom Install"
@@ -688,6 +775,7 @@ FunctionEnd · 57 unmodified lines
688 775
689Function StartInstallSlideshow776Function StartInstallSlideshow
690 ; create a slideshow file based on what files we have available777 ; create a slideshow file based on what files we have available
778 ${LogText} "Start Installs Slideshow"
691 779
692 ; stash $0 and $1780 ; stash $0 and $1
693 Push $0781 Push $0
@@ -730,7 +818,11 @@ Function StartInstallSlideshow · 36 unmodified lines
730FunctionEnd818FunctionEnd
731 819
732Function PostInstallOptionsPage820Function PostInstallOptionsPage
821
822 ${LogText} "Install Directory: $INSTDIR"
823
733 !insertmacro MaybeSkipPage824 !insertmacro MaybeSkipPage
825 !insertmacro LogStep "Installer" "Post Install Options" "" ""
734 !insertmacro GoogleAnalytics "Installer" "Post Install Options" "" ""826 !insertmacro GoogleAnalytics "Installer" "Post Install Options" "" ""
735 827
736 !insertmacro MUI_HEADER_TEXT "Setup Options" ""828 !insertmacro MUI_HEADER_TEXT "Setup Options" ""
@@ -876,30 +968,43 @@ Function ReadPostInstallOptions · 139 unmodified lines
876 968
877 ; check if the user asked for a desktop shortcut to console969 ; check if the user asked for a desktop shortcut to console
878 ${NSD_GetState} $DesktopConsoleCheckbox $DesktopConsoleState970 ${NSD_GetState} $DesktopConsoleCheckbox $DesktopConsoleState
879 971 ${LogText} "Option: Start Desktop Console: $DesktopConsoleState"
972
880 ; check if the user asked to have console launched every startup973 ; check if the user asked to have console launched every startup
881 ${NSD_GetState} $ConsoleStartupCheckbox $ConsoleStartupState974 ${NSD_GetState} $ConsoleStartupCheckbox $ConsoleStartupState
975 ${LogText} "Option: Start Desktop Console On Startup: $ConsoleStartupState"
882 976
977 ${If} @SERVER_COMPONENT_CONDITIONAL@
978 ${LogText} "Option: Install Server"
979 ${EndIf}
980
883 ${If} @CLIENT_COMPONENT_CONDITIONAL@981 ${If} @CLIENT_COMPONENT_CONDITIONAL@
982 ${LogText} "Option: Install Client"
884 ; check if the user asked for a desktop shortcut to High Fidelity983 ; check if the user asked for a desktop shortcut to High Fidelity
885 ${NSD_GetState} $DesktopClientCheckbox $DesktopClientState984 ${NSD_GetState} $DesktopClientCheckbox $DesktopClientState
985 ${LogText} "Option: Create Client Desktop Shortcut: $DesktopClientState"
886 ${EndIf}986 ${EndIf}
887 987
888 ${If} @PR_BUILD@ == 1988 ${If} @PR_BUILD@ == 1
989 ${LogText} "Option: PR Build"
889 ; check if we need to copy settings/content from production for this PR build990 ; check if we need to copy settings/content from production for this PR build
890 ${NSD_GetState} $CopyFromProductionCheckbox $CopyFromProductionState991 ${NSD_GetState} $CopyFromProductionCheckbox $CopyFromProductionState
992 ${LogText} "Option: Copy Settings From Production: $CopyFromProductionState"
891 ${EndIf}993 ${EndIf}
892 994
893 ; check if we need to launch the console post-install995 ; check if we need to launch the console post-install
894 ${NSD_GetState} $LaunchConsoleNowCheckbox $LaunchConsoleNowState996 ${NSD_GetState} $LaunchConsoleNowCheckbox $LaunchConsoleNowState
997 ${LogText} "Option: Launch Console Now: $LaunchConsoleNowState"
895 998
896 ${If} @CLIENT_COMPONENT_CONDITIONAL@999 ${If} @CLIENT_COMPONENT_CONDITIONAL@
897 ; check if we need to launch the client post-install1000 ; check if we need to launch the client post-install
898 ${NSD_GetState} $LaunchClientNowCheckbox $LaunchClientNowState1001 ${NSD_GetState} $LaunchClientNowCheckbox $LaunchClientNowState
1002 ${LogText} "Option: Launch Client Now: $LaunchClientNowState"
899 ${EndIf}1003 ${EndIf}
900 1004
901 ; check if the user asked for a clean install1005 ; check if the user asked for a clean install
902 ${NSD_GetState} $CleanInstallCheckbox $CleanInstallState1006 ${NSD_GetState} $CleanInstallCheckbox $CleanInstallState
1007 ${LogText} "Option: Clean Install: $CleanInstallState"
903FunctionEnd1008FunctionEnd
904 1009
905Function HandlePostInstallOptions1010Function HandlePostInstallOptions
@@ -1225,6 +1330,7 @@ Section "-Core installation" · 319 unmodified lines
1225 ; Handle whichever post install options were set1330 ; Handle whichever post install options were set
1226 Call HandlePostInstallOptions1331 Call HandlePostInstallOptions
1227 1332
1333 !insertmacro LogStep "Installer" "Done" "" ""
1228 !insertmacro GoogleAnalytics "Installer" "Done" "" ""1334 !insertmacro GoogleAnalytics "Installer" "Done" "" ""
1229SectionEnd1335SectionEnd
1230 1336
@@ -1232,7 +1338,6 @@ SectionEnd · 1 unmodified line
1232 1338
1233!macro PromptForRunningApplication applicationName displayName action prompter1339!macro PromptForRunningApplication applicationName displayName action prompter
1234 !define UniqueID ${__LINE__}1340 !define UniqueID ${__LINE__}
1235
1236 Prompt_${UniqueID}:1341 Prompt_${UniqueID}:
1237 1342
1238 ${nsProcess::FindProcess} ${applicationName} $R01343 ${nsProcess::FindProcess} ${applicationName} $R0
@@ -1478,6 +1583,11 @@ InstallDirRegKey HKLM "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_RE · 239 unmodified lines
1478 1583
1479Function .onInit1584Function .onInit
1480 1585
1586 Delete "$TEMP\hifi_install.log"
1587 ${LogSetFileName} "$TEMP\hifi_install.log"
1588 ${LogSetOn}
1589 ${LogText} "In .onInit"
1590
1481 !ifdef INNER1591 !ifdef INNER
1482 ; If INNER is defined, then we aren't supposed to do anything except write out1592 ; If INNER is defined, then we aren't supposed to do anything except write out
1483 ; the installer. This is better than processing a command line option as it means1593 ; the installer. This is better than processing a command line option as it means
@@ -1495,6 +1605,7 @@ Function .onInit · 11 unmodified lines
1495 !insertmacro GoogleAnalytics "Installer" "Start" "$CampaignName" ""1605 !insertmacro GoogleAnalytics "Installer" "Start" "$CampaignName" ""
1496 1606
1497 ; make sure none of the installed applications are still running1607 ; make sure none of the installed applications are still running
1608 ${LogText} "Checking For Running Applications"
1498 !insertmacro CheckForRunningApplications "installed" "Installer"1609 !insertmacro CheckForRunningApplications "installed" "Installer"
1499 ${nsProcess::Unload}1610 ${nsProcess::Unload}
1500 1611
domain-server/CMakeLists.txt+2−24
@@ -27,30 +27,8 @@ include_hifi_library_headers(graphics) · 26 unmodified lines
27link_hifi_libraries(embedded-webserver networking shared avatars octree)27link_hifi_libraries(embedded-webserver networking shared avatars octree)
28 28
29target_zlib()29target_zlib()
30 30target_quazip()
31add_dependency_external_projects(quazip)31target_openssl()
32
33find_package(QuaZip REQUIRED)
34target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${QUAZIP_INCLUDE_DIRS})
35target_link_libraries(${TARGET_NAME} ${QUAZIP_LIBRARIES})
36
37if (WIN32)
38 add_paths_to_fixup_libs(${QUAZIP_DLL_PATH})
39endif ()
40
41# find OpenSSL
42find_package(OpenSSL REQUIRED)
43
44if (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.")
48endif ()
49
50include_directories(SYSTEM "${OPENSSL_INCLUDE_DIR}")
51
52# append OpenSSL to our list of libraries to link
53target_link_libraries(${TARGET_NAME} ${OPENSSL_LIBRARIES})
54 32
55# libcrypto uses dlopen in libdl33# libcrypto uses dlopen in libdl
56if (UNIX)34if (UNIX)
domain-server/src/AssetsBackupHandler.cpp+9−0
@@ -15,9 +15,18 @@ · 14 unmodified lines
15#include <QDate>15#include <QDate>
16#include <QtCore/QLoggingCategory>16#include <QtCore/QLoggingCategory>
17 17
18#if !defined(__clang__) && defined(__GNUC__)
19#pragma GCC diagnostic push
20#pragma GCC diagnostic ignored "-Wsuggest-override"
21#endif
22
18#include <quazip5/quazipfile.h>23#include <quazip5/quazipfile.h>
19#include <quazip5/quazipdir.h>24#include <quazip5/quazipdir.h>
20 25
26#if !defined(__clang__) && defined(__GNUC__)
27#pragma GCC diagnostic pop
28#endif
29
21#include <AssetClient.h>30#include <AssetClient.h>
22#include <AssetRequest.h>31#include <AssetRequest.h>
23#include <AssetUpload.h>32#include <AssetUpload.h>
domain-server/src/ContentSettingsBackupHandler.cpp+11−0
@@ -11,8 +11,19 @@ · 10 unmodified lines
11 11
12#include "ContentSettingsBackupHandler.h"12#include "ContentSettingsBackupHandler.h"
13 13
14#if !defined(__clang__) && defined(__GNUC__)
15#pragma GCC diagnostic push
16#pragma GCC diagnostic ignored "-Wsuggest-override"
17#endif
18
14#include <quazip5/quazip.h>19#include <quazip5/quazip.h>
15#include <quazip5/quazipfile.h>20#include <quazip5/quazipfile.h>
21#include <quazip5/quazipdir.h>
22
23#if !defined(__clang__) && defined(__GNUC__)
24#pragma GCC diagnostic pop
25#endif
26
16 27
17ContentSettingsBackupHandler::ContentSettingsBackupHandler(DomainServerSettingsManager& domainServerSettingsManager) :28ContentSettingsBackupHandler::ContentSettingsBackupHandler(DomainServerSettingsManager& domainServerSettingsManager) :
18 _settingsManager(domainServerSettingsManager)29 _settingsManager(domainServerSettingsManager)
domain-server/src/EntitiesBackupHandler.cpp+9−0
@@ -13,9 +13,18 @@ · 12 unmodified lines
13 13
14#include <QDebug>14#include <QDebug>
15 15
16#if !defined(__clang__) && defined(__GNUC__)
17#pragma GCC diagnostic push
18#pragma GCC diagnostic ignored "-Wsuggest-override"
19#endif
20
16#include <quazip5/quazip.h>21#include <quazip5/quazip.h>
17#include <quazip5/quazipfile.h>22#include <quazip5/quazipfile.h>
18 23
24#if !defined(__clang__) && defined(__GNUC__)
25#pragma GCC diagnostic pop
26#endif
27
19#include <OctreeDataUtils.h>28#include <OctreeDataUtils.h>
20 29
21EntitiesBackupHandler::EntitiesBackupHandler(QString entitiesFilePath, QString entitiesReplacementFilePath) :30EntitiesBackupHandler::EntitiesBackupHandler(QString entitiesFilePath, QString entitiesReplacementFilePath) :
interface/CMakeLists.txt+0−2
@@ -190,8 +190,6 @@ if (WIN32) · 189 unmodified lines
190 add_dependency_external_projects(sixense)190 add_dependency_external_projects(sixense)
191 endif ()191 endif ()
192 192
193 add_dependency_external_projects(sdl2)
194 add_dependency_external_projects(OpenVR)
195 add_dependency_external_projects(neuron)193 add_dependency_external_projects(neuron)
196 add_dependency_external_projects(wasapi)194 add_dependency_external_projects(wasapi)
197 add_dependency_external_projects(steamworks)195 add_dependency_external_projects(steamworks)
interface/resources/QtWebEngine/UIDelegates/Menu.qml+2−2
@@ -1,7 +1,7 @@
1import QtQuick 2.51import QtQuick 2.5
2 2
3import "../../qml/controls-uit"3import controlsUit 1.0
4import "../../qml/styles-uit"4import stylesUit 1.0
5 5
6Item {6Item {
7 id: menu7 id: menu
interface/resources/QtWebEngine/UIDelegates/MenuItem.qml+2−2
@@ -1,7 +1,7 @@
1import QtQuick 2.51import QtQuick 2.5
2 2
3import "../../qml/controls-uit"3import controlsUit 1.0
4import "../../qml/styles-uit"4import stylesUit 1.0
5 5
6Item {6Item {
7 id: root7 id: root
interface/resources/QtWebEngine/UIDelegates/PromptDialog.qml+2−2
@@ -1,7 +1,7 @@
1import QtQuick 2.51import QtQuick 2.5
2 2
3import "../../qml/controls-uit"3import controlsUit 1.0
4import "../../qml/styles-uit"4import stylesUit 1.0
5import "../../qml/dialogs"5import "../../qml/dialogs"
6 6
7QtObject {7QtObject {
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
51 { "from": "Vive.RSCenter", "to": "Standard.RightPrimaryThumb" },51 { "from": "Vive.RSCenter", "to": "Standard.RightPrimaryThumb" },
52 { "from": "Vive.RightApplicationMenu", "to": "Standard.RightSecondaryThumb" },52 { "from": "Vive.RightApplicationMenu", "to": "Standard.RightSecondaryThumb" },
53 53
54 { "from": "Vive.LeftHand", "to": "Standard.LeftHand"},54 { "from": "Vive.LeftHand", "to": "Standard.LeftHand" },
55 { "from": "Vive.RightHand", "to": "Standard.RightHand"},55 { "from": "Vive.RightHand", "to": "Standard.RightHand" },
56 { "from": "Vive.Head", "to" : "Standard.Head" },
56 57
57 {58 {
58 "from": "Vive.LeftFoot", "to" : "Standard.LeftFoot",59 "from": "Vive.LeftFoot", "to" : "Standard.LeftFoot",
59 "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.3}]60 "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.15}]
60 },61 },
61
62 {62 {
63 "from": "Vive.RightFoot", "to" : "Standard.RightFoot",63 "from": "Vive.RightFoot", "to" : "Standard.RightFoot",
64 "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.3}]64 "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.15}]
65 },65 },
66
67 {66 {
68 "from": "Vive.Hips", "to" : "Standard.Hips",67 "from": "Vive.Hips", "to" : "Standard.Hips",
69 "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.3}]68 "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.15}]
70 },69 },
71
72 {70 {
73 "from": "Vive.Spine2", "to" : "Standard.Spine2",71 "from": "Vive.Spine2", "to" : "Standard.Spine2",
74 "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.3}]72 "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.15}]
73 },
74 {
75 "from": "Vive.RightArm", "to" : "Standard.RightArm",
76 "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.15}]
77 },
78 {
79 "from": "Vive.LeftArm", "to" : "Standard.LeftArm",
80 "filters" : [{"type" : "exponentialSmoothing", "rotation" : 0.15, "translation": 0.15}]
75 },81 },
76
77 { "from": "Vive.Head", "to" : "Standard.Head"},
78 { "from": "Vive.RightArm", "to" : "Standard.RightArm" },
79 { "from": "Vive.LeftArm", "to" : "Standard.LeftArm" },
80 82
81 { "from": "Vive.TrackedObject00", "to" : "Standard.TrackedObject00" },83 { "from": "Vive.TrackedObject00", "to" : "Standard.TrackedObject00" },
82 { "from": "Vive.TrackedObject01", "to" : "Standard.TrackedObject01" },84 { "from": "Vive.TrackedObject01", "to" : "Standard.TrackedObject01" },
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
10 property int modality: Qt.NonModal10 property int modality: Qt.NonModal
11 implicitHeight: row.height11 implicitHeight: row.height
12 implicitWidth: row.width12 implicitWidth: row.width
13 visible: false
13 14
14 Component.onCompleted: {15 Component.onCompleted: {
15 stats.parentChanged.connect(fill);16 stats.parentChanged.connect(fill);
interface/resources/qml/AudioScopeUI.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
10 10
11import QtQuick 2.511import QtQuick 2.5
12import QtQuick.Controls 1.412import QtQuick.Controls 1.4
13import "styles-uit"13import stylesUit 1.0
14import "controls-uit" as HifiControlsUit14import controlsUit 1.0 as HifiControlsUit
15 15
16Item {16Item {
17 id: root17 id: root
interface/resources/qml/Browser.qml+2−2
@@ -2,9 +2,9 @@ import QtQuick 2.5 · 1 unmodified line
2import QtWebChannel 1.02import QtWebChannel 1.0
3import QtWebEngine 1.53import QtWebEngine 1.5
4 4
5import "controls-uit"5import controlsUit 1.0
6import "styles" as HifiStyles6import "styles" as HifiStyles
7import "styles-uit"7import stylesUit 1.0
8import "windows"8import "windows"
9 9
10ScrollingWindow {10ScrollingWindow {
interface/resources/qml/CurrentAPI.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
10 10
11import QtQuick 2.511import QtQuick 2.5
12import QtQuick.Controls 1.412import QtQuick.Controls 1.4
13import "styles-uit"13import stylesUit 1.0
14import "controls-uit" as HifiControls14import controlsUit 1.0 as HifiControls
15 15
16Item {16Item {
17 id: root17 id: root
interface/resources/qml/InfoView.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12import Hifi 1.0 as Hifi12import Hifi 1.0 as Hifi
13 13
14import "controls-uit"14import controlsUit 1.0
15import "windows" as Windows15import "windows" as Windows
16 16
17Windows.ScrollingWindow {17Windows.ScrollingWindow {
interface/resources/qml/InteractiveWindow.qml+2−2
@@ -12,9 +12,9 @@ import QtQuick 2.3 · 11 unmodified lines
12 12
13import "windows" as Windows13import "windows" as Windows
14import "controls"14import "controls"
15import "controls-uit" as Controls15import controlsUit 1.0 as Controls
16import "styles"16import "styles"
17import "styles-uit"17import stylesUit 1.0
18 18
19Windows.Window {19Windows.Window {
20 id: root;20 id: root;
interface/resources/qml/LoginDialog.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
11import Hifi 1.011import Hifi 1.0
12import QtQuick 2.412import QtQuick 2.4
13 13
14import "controls-uit"14import controlsUit 1.0
15import "styles-uit"15import stylesUit 1.0
16import "windows"16import "windows"
17 17
18import "LoginDialog"18import "LoginDialog"
interface/resources/qml/LoginDialog/+android/LinkAccountBody.qml+2−2
@@ -13,8 +13,8 @@ import QtQuick 2.4 · 12 unmodified lines
13import QtQuick.Controls 1.413import QtQuick.Controls 1.4
14import QtQuick.Controls.Styles 1.4 as OriginalStyles14import QtQuick.Controls.Styles 1.4 as OriginalStyles
15 15
16import "../../controls-uit"16import controlsUit 1.0
17import "../../styles-uit"17import stylesUit 1.0
18 18
19Item {19Item {
20 id: linkAccountBody20 id: linkAccountBody
interface/resources/qml/LoginDialog/+android/SignUpBody.qml+2−2
@@ -13,8 +13,8 @@ import QtQuick 2.4 · 12 unmodified lines
13import QtQuick.Controls 1.413import QtQuick.Controls 1.4
14import QtQuick.Controls.Styles 1.4 as OriginalStyles14import QtQuick.Controls.Styles 1.4 as OriginalStyles
15 15
16import "../../controls-uit"16import controlsUit 1.0
17import "../../styles-uit"17import stylesUit 1.0
18 18
19Item {19Item {
20 id: signupBody20 id: signupBody
interface/resources/qml/LoginDialog/CompleteProfileBody.qml+2−2
@@ -12,8 +12,8 @@ import Hifi 1.0 · 11 unmodified lines
12import QtQuick 2.412import QtQuick 2.4
13import QtQuick.Controls.Styles 1.4 as OriginalStyles13import QtQuick.Controls.Styles 1.4 as OriginalStyles
14 14
15import "../controls-uit"15import controlsUit 1.0
16import "../styles-uit"16import stylesUit 1.0
17 17
18Item {18Item {
19 id: completeProfileBody19 id: completeProfileBody
interface/resources/qml/LoginDialog/LinkAccountBody.qml+21−13
@@ -13,8 +13,9 @@ import QtQuick 2.7 · 12 unmodified lines
13import QtQuick.Controls 1.413import QtQuick.Controls 1.4
14import QtQuick.Controls.Styles 1.4 as OriginalStyles14import QtQuick.Controls.Styles 1.4 as OriginalStyles
15 15
16import "../controls-uit"16import controlsUit 1.0
17import "../styles-uit"17import stylesUit 1.0
18
18Item {19Item {
19 id: linkAccountBody20 id: linkAccountBody
20 clip: true21 clip: true
@@ -96,7 +97,7 @@ Item { · 75 unmodified lines
96 topMargin: hifi.dimensions.contentSpacing.y97 topMargin: hifi.dimensions.contentSpacing.y
97 }98 }
98 99
99 text: qsTr("Sign in to High Fidelity to make friends, get HFC, and buy interesting things on the Marketplace!")100 text: qsTr("Sign in to High Fidelity to make friends, get HFC, and get interesting things on the Marketplace!")
100 width: parent.width101 width: parent.width
101 wrapMode: Text.WordWrap102 wrapMode: Text.WordWrap
102 lineHeight: 1103 lineHeight: 1
@@ -136,7 +137,7 @@ Item { · 33 unmodified lines
136 137
137 TextField {138 TextField {
138 id: usernameField139 id: usernameField
139 text: Settings.getValue("wallet/savedUsername", "");140 text: Settings.getValue("keepMeLoggedIn/savedUsername", "");
140 width: parent.width141 width: parent.width
141 focus: true142 focus: true
142 placeholderText: "Username or Email"143 placeholderText: "Username or Email"
@@ -165,7 +166,7 @@ Item { · 22 unmodified lines
165 root.text = "";166 root.text = "";
166 }167 }
167 Component.onCompleted: {168 Component.onCompleted: {
168 var savedUsername = Settings.getValue("wallet/savedUsername", "");169 var savedUsername = Settings.getValue("keepMeLoggedIn/savedUsername", "");
169 usernameField.text = savedUsername === "Unknown user" ? "" : savedUsername;170 usernameField.text = savedUsername === "Unknown user" ? "" : savedUsername;
170 }171 }
171 }172 }
@@ -239,7 +240,10 @@ Item { · 67 unmodified lines
239 240
240 }241 }
241 242
242 Keys.onReturnPressed: linkAccountBody.login()243 Keys.onReturnPressed: {
244 Settings.setValue("keepMeLoggedIn/savedUsername", usernameField.text);
245 linkAccountBody.login();
246 }
243 }247 }
244 248
245 InfoItem {249 InfoItem {
@@ -263,21 +267,21 @@ Item { · 17 unmodified lines
263 267
264 CheckBox {268 CheckBox {
265 id: autoLogoutCheckbox269 id: autoLogoutCheckbox
266 checked: !Settings.getValue("wallet/autoLogout", true)270 checked: Settings.getValue("keepMeLoggedIn", false)
267 text: "Keep me signed in"271 text: "Keep me logged in"
268 boxSize: 20;272 boxSize: 20;
269 labelFontSize: 15273 labelFontSize: 15
270 color: hifi.colors.black274 color: hifi.colors.black
271 onCheckedChanged: {275 onCheckedChanged: {
272 Settings.setValue("wallet/autoLogout", !checked);276 Settings.setValue("keepMeLoggedIn", checked);
273 if (checked) {277 if (checked) {
274 Settings.setValue("wallet/savedUsername", Account.username);278 Settings.setValue("keepMeLoggedIn/savedUsername", usernameField.text);
275 } else {279 } else {
276 Settings.setValue("wallet/savedUsername", "");280 Settings.setValue("keepMeLoggedIn/savedUsername", "");
277 }281 }
278 }282 }
279 Component.onDestruction: {283 Component.onDestruction: {
280 Settings.setValue("wallet/autoLogout", !checked);284 Settings.setValue("keepMeLoggedIn", checked);
281 }285 }
282 }286 }
283 287
@@ -289,7 +293,10 @@ Item { · 5 unmodified lines
289 text: qsTr(loginDialog.isSteamRunning() ? "Link Account" : "Log in")293 text: qsTr(loginDialog.isSteamRunning() ? "Link Account" : "Log in")
290 color: hifi.buttons.blue294 color: hifi.buttons.blue
291 295
292 onClicked: linkAccountBody.login()296 onClicked: {
297 Settings.setValue("keepMeLoggedIn/savedUsername", usernameField.text);
298 linkAccountBody.login();
299 }
293 }300 }
294 }301 }
295 302
@@ -403,6 +410,7 @@ Item { · 107 unmodified lines
403 case Qt.Key_Enter:410 case Qt.Key_Enter:
404 case Qt.Key_Return:411 case Qt.Key_Return:
405 event.accepted = true412 event.accepted = true
413 Settings.setValue("keepMeLoggedIn/savedUsername", usernameField.text);
406 linkAccountBody.login()414 linkAccountBody.login()
407 break415 break
408 }416 }
interface/resources/qml/LoginDialog/SignInBody.qml+2−2
@@ -12,8 +12,8 @@ import Hifi 1.0 · 11 unmodified lines
12import QtQuick 2.712import QtQuick 2.7
13import QtQuick.Controls.Styles 1.4 as OriginalStyles13import QtQuick.Controls.Styles 1.4 as OriginalStyles
14 14
15import "../controls-uit"15import controlsUit 1.0
16import "../styles-uit"16import stylesUit 1.0
17 17
18Item {18Item {
19 id: signInBody19 id: signInBody
interface/resources/qml/LoginDialog/SignUpBody.qml+2−2
@@ -12,8 +12,8 @@ import Hifi 1.0 · 11 unmodified lines
12import QtQuick 2.712import QtQuick 2.7
13import QtQuick.Controls 1.413import QtQuick.Controls 1.4
14 14
15import "../controls-uit"15import controlsUit 1.0
16import "../styles-uit"16import stylesUit 1.0
17 17
18Item {18Item {
19 id: signupBody19 id: signupBody
interface/resources/qml/LoginDialog/UsernameCollisionBody.qml+2−2
@@ -12,8 +12,8 @@ import Hifi 1.0 · 11 unmodified lines
12import QtQuick 2.412import QtQuick 2.4
13import QtQuick.Controls 1.413import QtQuick.Controls 1.4
14 14
15import "../controls-uit"15import controlsUit 1.0
16import "../styles-uit"16import stylesUit 1.0
17 17
18Item {18Item {
19 id: usernameCollisionBody19 id: usernameCollisionBody
interface/resources/qml/LoginDialog/WelcomeBody.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
11import Hifi 1.011import Hifi 1.0
12import QtQuick 2.412import QtQuick 2.4
13 13
14import "../controls-uit"14import controlsUit 1.0
15import "../styles-uit"15import stylesUit 1.0
16 16
17Item {17Item {
18 id: welcomeBody18 id: welcomeBody
interface/resources/qml/QmlWebWindow.qml+2−2
@@ -13,8 +13,8 @@ import QtWebEngine 1.1 · 12 unmodified lines
13import QtWebChannel 1.013import QtWebChannel 1.0
14 14
15import "windows" as Windows15import "windows" as Windows
16import "controls-uit" as Controls16import controlsUit 1.0 as Controls
17import "styles-uit"17import stylesUit 1.0
18 18
19Windows.ScrollingWindow {19Windows.ScrollingWindow {
20 id: root20 id: root
interface/resources/qml/QmlWindow.qml+2−2
@@ -2,9 +2,9 @@ import QtQuick 2.3 · 1 unmodified line
2 2
3import "windows" as Windows3import "windows" as Windows
4import "controls"4import "controls"
5import "controls-uit" as Controls5import controlsUit 1.0 as Controls
6import "styles"6import "styles"
7import "styles-uit"7import stylesUit 1.0
8 8
9Windows.Window {9Windows.Window {
10 id: root10 id: root
interface/resources/qml/TabletBrowser.qml+2−2
@@ -3,9 +3,9 @@ import QtWebChannel 1.0 · 2 unmodified lines
3import QtWebEngine 1.53import QtWebEngine 1.5
4 4
5import "controls"5import "controls"
6import "controls-uit" as HifiControls6import controlsUit 1.0 as HifiControls
7import "styles" as HifiStyles7import "styles" as HifiStyles
8import "styles-uit"8import stylesUit 1.0
9import "windows"9import "windows"
10 10
11Item {11Item {
interface/resources/qml/UpdateDialog.qml+2−2
@@ -4,9 +4,9 @@ import QtQuick.Controls 1.3 · 3 unmodified lines
4import QtQuick.Controls.Styles 1.34import QtQuick.Controls.Styles 1.3
5import QtGraphicalEffects 1.05import QtGraphicalEffects 1.0
6 6
7import "controls-uit"7import controlsUit 1.0
8import "styles" as HifiStyles8import "styles" as HifiStyles
9import "styles-uit"9import stylesUit 1.0
10import "windows"10import "windows"
11 11
12ScrollingWindow {12ScrollingWindow {
interface/resources/qml/controls-uit/AttachmentsTable.qml+3−169
@@ -1,170 +1,4 @@
1//1import controlsUit 1.0
2// AttachmentsTable.qml
3//
4// Created by David Rowe on 18 Feb 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53AttachmentsTable {
12import QtQuick.Controls 1.44}
13import QtQuick.Controls.Styles 1.4
14import QtQuick.XmlListModel 2.0
15
16import "../styles-uit"
17import "../controls-uit" as HifiControls
18import "../windows"
19import "../hifi/models"
20
21TableView {
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/controls-uit/BaseWebView.qml+3−37
@@ -1,38 +1,4 @@
1//1import controlsUit 1.0
2// WebView.qml
3//
4// Created by Bradley Austin Davis on 12 Jan 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.73BaseWebView {
12import QtWebEngine 1.54}
13
14WebEngineView {
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/controls-uit/Button.qml+2−120
@@ -1,122 +1,4 @@
1//1import controlsUit 1.0
2// Button.qml
3//
4// Created by David Rowe on 16 Feb 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.73Button {
12import QtQuick.Controls 2.3 as Original
13import TabletScriptingInterface 1.0
14
15import "../styles-uit"
16
17Original.Button {
18 id: control;
19
20 property int color: 0
21 property int colorScheme: hifi.colorSchemes.light
22 property int fontSize: hifi.fontSizes.buttonLabel
23 property int radius: hifi.buttons.radius
24 property alias implicitTextWidth: buttonText.implicitWidth
25 property string buttonGlyph: "";
26 property int fontCapitalization: Font.AllUppercase
27
28 width: hifi.dimensions.buttonWidth
29 height: hifi.dimensions.controlLineHeight
30
31 HifiConstants { id: hifi }
32
33 onHoveredChanged: {
34 if (hovered) {
35 Tablet.playSound(TabletEnums.ButtonHover);
36 }
37 }
38
39 onFocusChanged: {
40 if (focus) {
41 Tablet.playSound(TabletEnums.ButtonHover);
42 }
43 }
44
45 onClicked: {
46 Tablet.playSound(TabletEnums.ButtonClick);
47 }
48
49 background: Rectangle {
50 radius: control.radius
51
52 border.width: (control.color === hifi.buttons.none ||
53 (control.color === hifi.buttons.noneBorderless && control.hovered) ||
54 (control.color === hifi.buttons.noneBorderlessWhite && control.hovered) ||
55 (control.color === hifi.buttons.noneBorderlessGray && control.hovered)) ? 1 : 0;
56 border.color: control.color === hifi.buttons.noneBorderless ? hifi.colors.blueHighlight :
57 (control.color === hifi.buttons.noneBorderlessGray ? hifi.colors.baseGray : hifi.colors.white);
58
59 gradient: Gradient {
60 GradientStop {
61 position: 0.2
62 color: {
63 if (!control.enabled) {
64 hifi.buttons.disabledColorStart[control.colorScheme]
65 } else if (control.pressed) {
66 hifi.buttons.pressedColor[control.color]
67 } else if (control.hovered) {
68 hifi.buttons.hoveredColor[control.color]
69 } else {
70 hifi.buttons.colorStart[control.color]
71 }
72 }
73 }
74 GradientStop {
75 position: 1.0
76 color: {
77 if (!control.enabled) {
78 hifi.buttons.disabledColorFinish[control.colorScheme]
79 } else if (control.pressed) {
80 hifi.buttons.pressedColor[control.color]
81 } else if (control.hovered) {
82 hifi.buttons.hoveredColor[control.color]
83 } else {
84 hifi.buttons.colorFinish[control.color]
85 }
86 }
87 }
88 }
89 }
90
91 contentItem: Item {
92 HiFiGlyphs {
93 id: buttonGlyph;
94 visible: control.buttonGlyph !== "";
95 text: control.buttonGlyph === "" ? hifi.glyphs.question : control.buttonGlyph;
96 // Size
97 size: 34;
98 // Anchors
99 anchors.right: buttonText.left;
100 anchors.top: parent.top;
101 anchors.bottom: parent.bottom;
102 // Style
103 color: enabled ? hifi.buttons.textColor[control.color]
104 : hifi.buttons.disabledTextColor[control.colorScheme];
105 // Alignment
106 horizontalAlignment: Text.AlignHCenter;
107 verticalAlignment: Text.AlignVCenter;
108 }
109 RalewayBold {
110 id: buttonText;
111 anchors.centerIn: parent;
112 font.capitalization: control.fontCapitalization
113 color: enabled ? hifi.buttons.textColor[control.color]
114 : hifi.buttons.disabledTextColor[control.colorScheme]
115 size: control.fontSize
116 verticalAlignment: Text.AlignVCenter
117 horizontalAlignment: Text.AlignHCenter
118 text: control.text
119 }
120 }
121}4}
122
interface/resources/qml/controls-uit/CheckBox.qml+2−119
@@ -1,121 +1,4 @@
1//1import controlsUit 1.0
2// CheckBox.qml
3//
4// Created by David Rowe on 26 Feb 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.23CheckBox {
12import QtQuick.Controls 2.2 as Original
13
14import "../styles-uit"
15
16import TabletScriptingInterface 1.0
17
18Original.CheckBox {
19 id: checkBox
20
21 property int colorScheme: hifi.colorSchemes.light
22 property string color: hifi.colors.lightGrayText
23 readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light
24 property bool isRedCheck: false
25 property int boxSize: 14
26 property int boxRadius: 3
27 property bool wrap: true;
28 readonly property int checkSize: Math.max(boxSize - 8, 10)
29 readonly property int checkRadius: 2
30 property string labelFontFamily: "Raleway"
31 property int labelFontSize: 14;
32 property int labelFontWeight: Font.DemiBold;
33 focusPolicy: Qt.ClickFocus
34 hoverEnabled: true
35
36 onClicked: {
37 Tablet.playSound(TabletEnums.ButtonClick);
38 }
39
40 onHoveredChanged: {
41 if (hovered) {
42 Tablet.playSound(TabletEnums.ButtonHover);
43 }
44 }
45
46
47 indicator: Rectangle {
48 id: box
49 implicitWidth: boxSize
50 implicitHeight: boxSize
51 radius: boxRadius
52 y: parent.height / 2 - height / 2
53 border.width: 1
54 border.color: pressed || hovered
55 ? hifi.colors.checkboxCheckedBorder
56 : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish)
57
58 gradient: Gradient {
59 GradientStop {
60 position: 0.2
61 color: pressed || hovered
62 ? (checkBox.isLightColorScheme ? hifi.colors.checkboxChecked : hifi.colors.checkboxLightStart)
63 : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightStart : hifi.colors.checkboxDarkStart)
64 }
65 GradientStop {
66 position: 1.0
67 color: pressed || hovered
68 ? (checkBox.isLightColorScheme ? hifi.colors.checkboxChecked : hifi.colors.checkboxLightFinish)
69 : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish)
70 }
71 }
72
73 Rectangle {
74 visible: pressed || hovered
75 anchors.centerIn: parent
76 id: innerBox
77 width: checkSize - 4
78 height: width
79 radius: checkRadius
80 color: hifi.colors.checkboxCheckedBorder
81 }
82
83 Rectangle {
84 id: check
85 width: checkSize
86 height: checkSize
87 radius: checkRadius
88 anchors.centerIn: parent
89 color: isRedCheck ? hifi.colors.checkboxCheckedRed : hifi.colors.checkboxChecked
90 border.width: 2
91 border.color: isRedCheck? hifi.colors.checkboxCheckedBorderRed : hifi.colors.checkboxCheckedBorder
92 visible: checked && !pressed || !checked && pressed
93 }
94
95 Rectangle {
96 id: disabledOverlay
97 visible: !enabled
98 width: boxSize
99 height: boxSize
100 radius: boxRadius
101 border.width: 1
102 border.color: hifi.colors.baseGrayHighlight
103 color: hifi.colors.baseGrayHighlight
104 opacity: 0.5
105 }
106 }
107
108 contentItem: Label {
109 text: checkBox.text
110 color: checkBox.color
111 font.family: checkBox.labelFontFamily;
112 font.pixelSize: checkBox.labelFontSize;
113 font.weight: checkBox.labelFontWeight;
114 x: 2
115 verticalAlignment: Text.AlignVCenter
116 wrapMode: checkBox.wrap ? Text.Wrap : Text.NoWrap
117 elide: checkBox.wrap ? Text.ElideNone : Text.ElideRight
118 enabled: checkBox.enabled
119 leftPadding: checkBox.indicator.width + checkBox.spacing
120 }
121}4}
interface/resources/qml/controls-uit/CheckBoxQQC2.qml+3−124
@@ -1,125 +1,4 @@
1//1import controlsUit 1.0
2// CheckBox2.qml
3//
4// Created by Vlad Stelmahovsky on 10 Aug 2017
5// Copyright 2017 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10
11import QtQuick 2.7
12import QtQuick.Controls 2.2
13
14import "../styles-uit"
15import "../controls-uit" as HiFiControls
16import TabletScriptingInterface 1.0
17
18CheckBox {
19 id: checkBox
20
21 HifiConstants { id: hifi; }
22
23 padding: 0
24 leftPadding: 0
25 property int colorScheme: hifi.colorSchemes.light
26 property string color: hifi.colors.lightGrayText
27 readonly property bool isLightColorScheme: colorScheme === hifi.colorSchemes.light
28 property bool isRedCheck: false
29 property bool isRound: false
30 property int boxSize: 14
31 property int boxRadius: isRound ? boxSize : 3
32 property bool wrap: true;
33 readonly property int checkSize: Math.max(boxSize - 8, 10)
34 readonly property int checkRadius: isRound ? checkSize / 2 : 2
35 focusPolicy: Qt.ClickFocus
36 hoverEnabled: true
37
38 onClicked: {
39 Tablet.playSound(TabletEnums.ButtonClick);
40 }
41
42 onHoveredChanged: {
43 if (hovered) {
44 Tablet.playSound(TabletEnums.ButtonHover);
45 }
46 }
47
48 indicator: Rectangle {
49 id: box
50 implicitWidth: boxSize
51 implicitHeight: boxSize
52 radius: boxRadius
53 x: checkBox.leftPadding
54 y: parent.height / 2 - height / 2
55 border.width: 1
56 border.color: pressed || hovered
57 ? hifi.colors.checkboxCheckedBorder
58 : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish)
59
60 gradient: Gradient {
61 GradientStop {
62 position: 0.2
63 color: pressed || hovered
64 ? (checkBox.isLightColorScheme ? hifi.colors.checkboxChecked : hifi.colors.checkboxLightStart)
65 : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightStart : hifi.colors.checkboxDarkStart)
66 }
67 GradientStop {
68 position: 1.0
69 color: pressed || hovered
70 ? (checkBox.isLightColorScheme ? hifi.colors.checkboxChecked : hifi.colors.checkboxLightFinish)
71 : (checkBox.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish)
72 }
73 }
74
75 Rectangle {
76 visible: pressed || hovered
77 anchors.centerIn: parent
78 id: innerBox
79 width: checkSize - 4
80 height: width
81 radius: checkRadius
82 color: hifi.colors.checkboxCheckedBorder
83 }
84
85 Rectangle {
86 id: check
87 width: checkSize
88 height: checkSize
89 radius: checkRadius
90 anchors.centerIn: parent
91 color: isRedCheck ? hifi.colors.checkboxCheckedRed : hifi.colors.checkboxChecked
92 border.width: 2
93 border.color: isRedCheck? hifi.colors.checkboxCheckedBorderRed : hifi.colors.checkboxCheckedBorder
94 visible: checked && !pressed || !checked && pressed
95 }
96
97 Rectangle {
98 id: disabledOverlay
99 visible: !enabled
100 width: boxSize
101 height: boxSize
102 radius: boxRadius
103 border.width: 1
104 border.color: hifi.colors.baseGrayHighlight
105 color: hifi.colors.baseGrayHighlight
106 opacity: 0.5
107 }
108 }
109
110 contentItem: Text {
111 id: root
112 font.pixelSize: hifi.fontSizes.inputLabel
113 font.family: "Raleway"
114 font.weight: Font.DemiBold
115 text: checkBox.text
116 color: checkBox.color
117 x: 2
118 wrapMode: checkBox.wrap ? Text.Wrap : Text.NoWrap
119 elide: checkBox.wrap ? Text.ElideNone : Text.ElideRight
120 enabled: checkBox.enabled
121 verticalAlignment: Text.AlignVCenter
122 leftPadding: checkBox.indicator.width + checkBox.spacing
123 }
124}
125 2
3CheckBoxQQC2 {
4}
interface/resources/qml/controls-uit/ComboBox.qml+2−189
@@ -1,191 +1,4 @@
1//1import controlsUit 1.0
2// ComboBox.qml
3//
4// Created by Bradley Austin David on 27 Jan 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.73ComboBox {
12import QtQuick.Controls 2.2
13
14import "../styles-uit"
15import "../controls-uit" as HifiControls
16
17FocusScope {
18 id: root
19 HifiConstants { id: hifi }
20
21 property alias model: comboBox.model;
22 property alias editable: comboBox.editable
23 property alias comboBox: comboBox
24 readonly property alias currentText: comboBox.currentText;
25 property alias currentIndex: comboBox.currentIndex;
26 property int currentHighLightedIndex: comboBox.currentIndex;
27
28 property int dropdownHeight: 480
29 property int colorScheme: hifi.colorSchemes.light
30 readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light
31 property string label: ""
32 property real controlHeight: height + (comboBoxLabel.visible ? comboBoxLabel.height + comboBoxLabel.anchors.bottomMargin : 0)
33
34 readonly property ComboBox control: comboBox
35
36 property bool isDesktop: true
37
38 signal accepted();
39
40 implicitHeight: comboBox.height;
41 focus: true
42
43 ComboBox {
44 id: comboBox
45 anchors.fill: parent
46 hoverEnabled: true
47 visible: true
48 height: hifi.fontSizes.textFieldInput + 13 // Match height of TextField control.
49
50 function previousItem() { root.currentHighLightedIndex = (root.currentHighLightedIndex + comboBox.count - 1) % comboBox.count; }
51 function nextItem() { root.currentHighLightedIndex = (root.currentHighLightedIndex + comboBox.count + 1) % comboBox.count; }
52 function selectCurrentItem() { root.currentIndex = root.currentHighLightedIndex; close(); /*hideList();*/ }
53 function selectSpecificItem(index) { root.currentIndex = index; close();/*hideList();*/ }
54
55 Keys.onUpPressed: previousItem();
56 Keys.onDownPressed: nextItem();
57 Keys.onSpacePressed: selectCurrentItem();
58 Keys.onRightPressed: selectCurrentItem();
59 Keys.onReturnPressed: selectCurrentItem();
60
61 background: Rectangle {
62 gradient: Gradient {
63 GradientStop {
64 position: 0.2
65 color: comboBox.popup.visible
66 ? (isLightColorScheme ? hifi.colors.dropDownPressedLight : hifi.colors.dropDownPressedDark)
67 : (isLightColorScheme ? hifi.colors.dropDownLightStart : hifi.colors.dropDownDarkStart)
68 }
69 GradientStop {
70 position: 1.0
71 color: comboBox.popup.visible
72 ? (isLightColorScheme ? hifi.colors.dropDownPressedLight : hifi.colors.dropDownPressedDark)
73 : (isLightColorScheme ? hifi.colors.dropDownLightFinish : hifi.colors.dropDownDarkFinish)
74 }
75 }
76 }
77
78 indicator: Item {
79 id: dropIcon
80 anchors { right: parent.right; verticalCenter: parent.verticalCenter }
81 height: root.height
82 width: height
83 Rectangle {
84 width: 1
85 height: parent.height
86 anchors.top: parent.top
87 anchors.left: parent.left
88 color: isLightColorScheme ? hifi.colors.faintGray : hifi.colors.baseGray
89 }
90 HiFiGlyphs {
91 anchors { top: parent.top; topMargin: -11; horizontalCenter: parent.horizontalCenter }
92 size: hifi.dimensions.spinnerSize
93 text: hifi.glyphs.caratDn
94 color: comboBox.hovered || comboBox.popup.visible ? hifi.colors.baseGray : (isLightColorScheme ? hifi.colors.lightGray : hifi.colors.lightGrayText)
95 }
96 }
97
98 contentItem: FiraSansSemiBold {
99 id: textField
100 anchors {
101 left: parent.left
102 leftMargin: hifi.dimensions.textPadding
103 verticalCenter: parent.verticalCenter
104 }
105 size: hifi.fontSizes.textFieldInput
106 text: comboBox.displayText ? comboBox.displayText : comboBox.currentText
107 elide: Text.ElideRight
108 color: comboBox.hovered || comboBox.popup.visible ? hifi.colors.baseGray : (isLightColorScheme ? hifi.colors.lightGray : hifi.colors.lightGrayText )
109 }
110
111 delegate: ItemDelegate {
112 id: itemDelegate
113 hoverEnabled: true
114 width: root.width + 4
115 height: popupText.implicitHeight * 1.4
116 highlighted: root.currentHighLightedIndex == index
117
118 onHoveredChanged: {
119 if (hovered) {
120 root.currentHighLightedIndex = index
121 }
122 }
123
124 background: Rectangle {
125 color: itemDelegate.highlighted ? hifi.colors.primaryHighlight
126 : (isLightColorScheme ? hifi.colors.dropDownPressedLight
127 : hifi.colors.dropDownPressedDark)
128 }
129
130 contentItem: FiraSansSemiBold {
131 id: popupText
132 anchors.left: parent.left
133 anchors.leftMargin: hifi.dimensions.textPadding
134 anchors.verticalCenter: parent.verticalCenter
135 text: comboBox.model[index] ? comboBox.model[index]
136 : (comboBox.model.get && comboBox.model.get(index).text ?
137 comboBox.model.get(index).text : "")
138 size: hifi.fontSizes.textFieldInput
139 color: hifi.colors.baseGray
140 }
141 }
142 popup: Popup {
143 y: comboBox.height - 1
144 width: comboBox.width
145 implicitHeight: listView.contentHeight > dropdownHeight ? dropdownHeight
146 : listView.contentHeight
147 padding: 0
148 topPadding: 1
149
150 onClosed: {
151 root.accepted()
152 }
153
154 contentItem: ListView {
155 id: listView
156 clip: true
157 model: comboBox.popup.visible ? comboBox.delegateModel : null
158 currentIndex: root.currentHighLightedIndex
159 delegate: comboBox.delegate
160 ScrollBar.vertical: HifiControls.ScrollBar {
161 id: scrollbar
162 parent: listView
163 policy: ScrollBar.AsNeeded
164 visible: size < 1.0
165 }
166 }
167
168 background: Rectangle {
169 color: hifi.colors.baseGray
170 }
171 }
172 }
173
174 function textAt(index) {
175 return comboBox.textAt(index);
176 }
177
178 HifiControls.Label {
179 id: comboBoxLabel
180 text: root.label
181 colorScheme: root.colorScheme
182 anchors.left: parent.left
183 anchors.bottom: parent.top
184 anchors.bottomMargin: 4
185 visible: label != ""
186 }
187
188 Component.onCompleted: {
189 isDesktop = (typeof desktop !== "undefined");
190 }
191}4}
interface/resources/qml/controls-uit/ContentSection.qml+2−136
@@ -1,138 +1,4 @@
1//1import controlsUit 1.0
2// ContentSection.qml
3//
4// Created by David Rowe on 16 Feb 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53ContentSection {
12import QtGraphicalEffects 1.0
13
14import "../styles-uit"
15
16Column {
17 property string name: "Content Section"
18 property bool isFirst: false
19 property bool isCollapsible: false // Set at creation.
20 property bool isCollapsed: false
21
22 spacing: 0 // Defer spacing decisions to individual controls.
23
24 anchors {
25 left: parent.left
26 leftMargin: hifi.dimensions.contentMargin.x
27 right: parent.right
28 rightMargin: hifi.dimensions.contentMargin.x
29 }
30
31 function toggleCollapsed() {
32 if (isCollapsible) {
33 isCollapsed = !isCollapsed;
34 for (var i = 1; i < children.length; i++) {
35 children[i].visible = !isCollapsed;
36 }
37 }
38 }
39
40 Item {
41 id: sectionName
42 anchors.left: parent.left
43 anchors.right: parent.right
44 height: leadingSpace.height + topBar.height + heading.height + bottomBar.height
45
46 Item {
47 id: leadingSpace
48 width: 1
49 height: isFirst ? 7 : 0
50 anchors.top: parent.top
51 }
52
53 Item {
54 id: topBar
55 visible: !isFirst
56 height: visible ? 2 : 0
57 anchors.top: leadingSpace.bottom
58
59 Rectangle {
60 id: shadow
61 width: frame.width
62 height: 1
63 color: hifi.colors.baseGrayShadow
64 x: -hifi.dimensions.contentMargin.x
65 }
66
67 Rectangle {
68 width: frame.width
69 height: 1
70 color: hifi.colors.baseGrayHighlight
71 x: -hifi.dimensions.contentMargin.x
72 anchors.top: shadow.bottom
73 }
74 }
75
76 Item {
77 id: heading
78 anchors {
79 left: parent.left
80 right: parent.right
81 top: topBar.bottom
82 }
83 height: isCollapsible ? 36 : 28
84
85 RalewayRegular {
86 id: title
87 anchors {
88 left: parent.left
89 top: parent.top
90 topMargin: 12
91 }
92 size: hifi.fontSizes.sectionName
93 font.capitalization: Font.AllUppercase
94 text: name
95 color: hifi.colors.lightGrayText
96 }
97
98 HiFiGlyphs {
99 anchors {
100 top: title.top
101 topMargin: -9
102 right: parent.right
103 rightMargin: -4
104 }
105 size: hifi.fontSizes.disclosureButton
106 text: isCollapsed ? hifi.glyphs.disclosureButtonExpand : hifi.glyphs.disclosureButtonCollapse
107 color: hifi.colors.lightGrayText
108 visible: isCollapsible
109 }
110
111 MouseArea {
112 // Events are propogated so that any active control is defocused.
113 anchors.fill: parent
114 propagateComposedEvents: true
115 onPressed: {
116 toggleCollapsed();
117 mouse.accepted = false;
118 }
119 }
120 }
121
122 LinearGradient {
123 id: bottomBar
124 visible: desktop.gradientsSupported && isCollapsible
125 width: frame.width
126 height: visible ? 4 : 0
127 x: -hifi.dimensions.contentMargin.x
128 anchors.top: heading.bottom
129 start: Qt.point(0, 0)
130 end: Qt.point(0, 4)
131 gradient: Gradient {
132 GradientStop { position: 0.0; color: hifi.colors.darkGray }
133 GradientStop { position: 1.0; color: hifi.colors.baseGray } // Equivalent of darkGray0 over baseGray background.
134 }
135 cached: true
136 }
137 }
138}4}
interface/resources/qml/controls-uit/FilterBar.qml+2−319
@@ -1,321 +1,4 @@
1//1import controlsUit 1.0
2// FilterBar.qml
3//
4// Created by Zach Fox on 17 Feb 2018-03-12
5// Copyright 2018 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.93FilterBar {
12import QtQuick.Controls 2.2
13import QtGraphicalEffects 1.0
14
15import "../styles-uit"
16import "../controls-uit" as HifiControls
17
18Item {
19 id: root;
20
21 property int colorScheme: hifi.colorSchemes.light
22 readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light
23 readonly property bool isFaintGrayColorScheme: colorScheme == hifi.colorSchemes.faintGray
24 property bool error: false;
25 property alias textFieldHeight: textField.height;
26 property string placeholderText;
27 property alias dropdownHeight: dropdownContainer.height;
28 property alias text: textField.text;
29 property alias primaryFilterChoices: filterBarModel;
30 property int primaryFilter_index: -1;
31 property string primaryFilter_filterName: "";
32 property string primaryFilter_displayName: "";
33 signal accepted;
34
35 onPrimaryFilter_indexChanged: {
36 if (primaryFilter_index === -1) {
37 primaryFilter_filterName = "";
38 primaryFilter_displayName = "";
39 } else {
40 primaryFilter_filterName = filterBarModel.get(primaryFilter_index).filterName;
41 primaryFilter_displayName = filterBarModel.get(primaryFilter_index).displayName;
42 }
43 }
44
45 TextField {
46 id: textField;
47
48 anchors.top: parent.top;
49 anchors.right: parent.right;
50 anchors.left: parent.left;
51
52 font.family: "Fira Sans"
53 font.pixelSize: hifi.fontSizes.textFieldInput;
54
55 placeholderText: root.primaryFilter_index === -1 ? root.placeholderText : "";
56
57 TextMetrics {
58 id: primaryFilterTextMetrics;
59 font.family: "FiraSans Regular";
60 font.pixelSize: hifi.fontSizes.textFieldInput;
61 font.capitalization: Font.AllUppercase;
62 text: root.primaryFilter_displayName;
63 }
64
65 // workaround for https://bugreports.qt.io/browse/QTBUG-49297
66 Keys.onPressed: {
67 switch (event.key) {
68 case Qt.Key_Return:
69 case Qt.Key_Enter:
70 event.accepted = true;
71
72 // emit accepted signal manually
73 if (acceptableInput) {
74 root.accepted();
75 root.forceActiveFocus();
76 }
77 break;
78 case Qt.Key_Backspace:
79 if (textField.text === "") {
80 primaryFilter_index = -1;
81 }
82 break;
83 }
84 }
85
86 onAccepted: {
87 root.forceActiveFocus();
88 }
89
90 onActiveFocusChanged: {
91 if (!activeFocus) {
92 dropdownContainer.visible = false;
93 }
94 }
95
96 color: {
97 if (isLightColorScheme) {
98 if (textField.activeFocus) {
99 hifi.colors.black
100 } else {
101 hifi.colors.lightGray
102 }
103 } else if (isFaintGrayColorScheme) {
104 if (textField.activeFocus) {
105 hifi.colors.black
106 } else {
107 hifi.colors.lightGray
108 }
109 } else {
110 if (textField.activeFocus) {
111 hifi.colors.white
112 } else {
113 hifi.colors.lightGrayText
114 }
115 }
116 }
117
118 background: Rectangle {
119 id: mainFilterBarRectangle;
120
121 color: {
122 if (isLightColorScheme) {
123 if (textField.activeFocus) {
124 hifi.colors.white
125 } else {
126 hifi.colors.textFieldLightBackground
127 }
128 } else if (isFaintGrayColorScheme) {
129 if (textField.activeFocus) {
130 hifi.colors.white
131 } else {
132 hifi.colors.faintGray50
133 }
134 } else {
135 if (textField.activeFocus) {
136 hifi.colors.black
137 } else {
138 hifi.colors.baseGrayShadow
139 }
140 }
141 }
142
143 border.color: textField.error ? hifi.colors.redHighlight :
144 (textField.activeFocus ? hifi.colors.primaryHighlight : (isFaintGrayColorScheme ? hifi.colors.lightGrayText : hifi.colors.lightGray))
145 border.width: 1
146 radius: 4
147
148 Item {
149 id: searchButtonContainer;
150 anchors.left: parent.left;
151 anchors.verticalCenter: parent.verticalCenter;
152 height: parent.height;
153 width: 42;
154
155 // Search icon
156 HiFiGlyphs {
157 id: searchIcon;
158 text: hifi.glyphs.search
159 color: textField.color
160 size: 40;
161 anchors.left: parent.left
162 anchors.verticalCenter: parent.verticalCenter
163 width: paintedWidth;
164 }
165
166 // Carat
167 HiFiGlyphs {
168 text: hifi.glyphs.caratDn;
169 color: textField.color;
170 size: 40;
171 anchors.left: parent.left;
172 anchors.leftMargin: 15;
173 width: paintedWidth;
174 }
175
176 MouseArea {
177 anchors.fill: parent;
178 onClicked: {
179 textField.forceActiveFocus();
180 dropdownContainer.visible = !dropdownContainer.visible;
181 }
182 }
183 }
184
185 Rectangle {
186 z: 999;
187 id: primaryFilterContainer;
188 color: textField.activeFocus ? hifi.colors.faintGray : hifi.colors.white;
189 width: primaryFilterTextMetrics.tightBoundingRect.width + 14;
190 height: parent.height - 8;
191 anchors.verticalCenter: parent.verticalCenter;
192 anchors.left: searchButtonContainer.right;
193 anchors.leftMargin: 4;
194 visible: primaryFilterText.text !== "";
195 radius: height/2;
196
197 FiraSansRegular {
198 id: primaryFilterText;
199 text: root.primaryFilter_displayName;
200 anchors.fill: parent;
201 color: textField.activeFocus ? hifi.colors.black : hifi.colors.lightGray;
202 horizontalAlignment: Text.AlignHCenter;
203 verticalAlignment: Text.AlignVCenter;
204 size: hifi.fontSizes.textFieldInput;
205 font.capitalization: Font.AllUppercase;
206 }
207
208 MouseArea {
209 anchors.fill: parent;
210 onClicked: {
211 textField.forceActiveFocus();
212 }
213 }
214 }
215
216 // "Clear" button
217 HiFiGlyphs {
218 text: hifi.glyphs.error
219 color: textField.color
220 size: 40
221 anchors.right: parent.right
222 anchors.rightMargin: hifi.dimensions.textPadding - 2
223 anchors.verticalCenter: parent.verticalCenter
224 visible: root.text !== "" || root.primaryFilter_index !== -1;
225
226 MouseArea {
227 anchors.fill: parent;
228 onClicked: {
229 root.text = "";
230 root.primaryFilter_index = -1;
231 dropdownContainer.visible = false;
232 textField.forceActiveFocus();
233 }
234 }
235 }
236 }
237
238 selectedTextColor: hifi.colors.black
239 selectionColor: hifi.colors.primaryHighlight
240 leftPadding: 44 + (root.primaryFilter_index === -1 ? 0 : primaryFilterTextMetrics.tightBoundingRect.width + 20);
241 rightPadding: 44;
242 }
243
244 Rectangle {
245 id: dropdownContainer;
246 visible: false;
247 height: 50 * filterBarModel.count;
248 width: parent.width;
249 anchors.top: textField.bottom;
250 anchors.left: parent.left;
251 anchors.right: parent.right;
252 color: hifi.colors.white;
253
254 ListModel {
255 id: filterBarModel;
256 }
257
258 ListView {
259 id: dropdownListView;
260 interactive: false;
261 anchors.fill: parent;
262 model: filterBarModel;
263 delegate: Rectangle {
264 id: dropDownButton;
265 color: hifi.colors.white;
266 width: parent.width;
267 height: 50;
268
269 RalewaySemiBold {
270 id: dropDownButtonText;
271 text: model.displayName;
272 anchors.fill: parent;
273 anchors.leftMargin: 12;
274 color: hifi.colors.baseGray;
275 horizontalAlignment: Text.AlignLeft;
276 verticalAlignment: Text.AlignVCenter;
277 size: 18;
278 }
279
280 MouseArea {
281 anchors.fill: parent;
282 hoverEnabled: true;
283 propagateComposedEvents: false;
284 onEntered: {
285 dropDownButton.color = hifi.colors.blueHighlight;
286 }
287 onExited: {
288 dropDownButton.color = hifi.colors.white;
289 }
290 onClicked: {
291 textField.forceActiveFocus();
292 root.primaryFilter_index = index;
293 dropdownContainer.visible = false;
294 }
295 }
296 }
297 }
298 }
299
300 DropShadow {
301 anchors.fill: dropdownContainer;
302 horizontalOffset: 0;
303 verticalOffset: 4;
304 radius: 4.0;
305 samples: 9
306 color: Qt.rgba(0, 0, 0, 0.25);
307 source: dropdownContainer;
308 visible: dropdownContainer.visible;
309 }
310
311 function changeFilterByDisplayName(name) {
312 for (var i = 0; i < filterBarModel.count; i++) {
313 if (filterBarModel.get(i).displayName === name) {
314 root.primaryFilter_index = i;
315 return;
316 }
317 }
318
319 console.log("Passed displayName not found in filterBarModel! primaryFilter unchanged.");
320 }
321}4}
interface/resources/qml/controls-uit/GlyphButton.qml+2−89
@@ -1,91 +1,4 @@
1//1import controlsUit 1.0
2// GlyphButton.qml
3//
4// Created by Clement on 3/7/16
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.73GlyphButton {
12import QtQuick.Controls 2.2 as Original
13import TabletScriptingInterface 1.0
14
15import "../styles-uit"
16
17Original.Button {
18 id: control
19 property int color: 0
20 property int colorScheme: hifi.colorSchemes.light
21 property string glyph: ""
22 property int size: 32
23
24 width: 120
25 height: 28
26
27 onHoveredChanged: {
28 if (hovered) {
29 Tablet.playSound(TabletEnums.ButtonHover);
30 }
31 }
32
33 onFocusChanged: {
34 if (focus) {
35 Tablet.playSound(TabletEnums.ButtonHover);
36 }
37 }
38
39 onClicked: {
40 Tablet.playSound(TabletEnums.ButtonClick);
41 }
42
43 background: Rectangle {
44 radius: hifi.buttons.radius
45
46 gradient: Gradient {
47 GradientStop {
48 position: 0.2
49 color: {
50 if (!control.enabled) {
51 hifi.buttons.disabledColorStart[control.colorScheme]
52 } else if (control.pressed) {
53 hifi.buttons.pressedColor[control.color]
54 } else if (control.hovered) {
55 hifi.buttons.hoveredColor[control.color]
56 } else if (!control.hovered && control.focus) {
57 hifi.buttons.focusedColor[control.color]
58 } else {
59 hifi.buttons.colorStart[control.color]
60 }
61 }
62 }
63 GradientStop {
64 position: 1.0
65 color: {
66 if (!control.enabled) {
67 hifi.buttons.disabledColorFinish[control.colorScheme]
68 } else if (control.pressed) {
69 hifi.buttons.pressedColor[control.color]
70 } else if (control.hovered) {
71 hifi.buttons.hoveredColor[control.color]
72 } else if (!control.hovered && control.focus) {
73 hifi.buttons.focusedColor[control.color]
74 } else {
75 hifi.buttons.colorFinish[control.color]
76 }
77 }
78 }
79 }
80 }
81
82 contentItem: HiFiGlyphs {
83 color: enabled ? hifi.buttons.textColor[control.color]
84 : hifi.buttons.disabledTextColor[control.colorScheme]
85 verticalAlignment: Text.AlignVCenter
86 horizontalAlignment: Text.AlignHCenter
87 text: control.glyph
88 size: control.size
89 }
90}4}
91
interface/resources/qml/controls-uit/HorizontalRule.qml+2−16
@@ -1,18 +1,4 @@
1//1import controlsUit 1.0
2// HorizontalRule.qml
3//
4// Created by Clement on 7/18/16
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53HorizontalRule {
12
13Rectangle {
14 anchors.left: parent.left
15 anchors.right: parent.right
16 height: 1
17 color: hifi.colors.lightGray
18}4}
interface/resources/qml/controls-uit/HorizontalSpacer.qml+2−19
@@ -1,21 +1,4 @@
1//1import controlsUit 1.0
2// HorizontalSpacer.qml
3//
4// Created by Clement on 7/18/16
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53HorizontalSpacer {
12
13import "../styles-uit"
14
15Item {
16 id: root
17 property alias size: root.width
18
19 width: hifi.dimensions.controlInterlineHeight
20 height: 1 // Must be non-zero
21}4}
interface/resources/qml/controls-uit/ImageMessageBox.qml+2−61
@@ -1,63 +1,4 @@
1//1import controlsUit 1.0
2// ImageMessageBox.qml
3//
4// Created by Dante Ruiz on 7/5/2017
5// Copyright 2017 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10
11import QtQuick 2.5
12import "../styles-uit"
13
14Item {
15 id: imageBox
16 visible: false
17 anchors.fill: parent
18 property alias source: image.source
19 property alias imageWidth: image.width
20 property alias imageHeight: image.height
21
22 Rectangle {
23 anchors.fill: parent
24 color: "black"
25 opacity: 0.3
26 }
27
28 Image {
29 id: image
30 anchors.centerIn: parent
31
32 HiFiGlyphs {
33 id: closeGlyphButton
34 text: hifi.glyphs.close
35 size: 25
36
37 anchors {
38 top: parent.top
39 topMargin: 15
40 right: parent.right
41 rightMargin: 15
42 }
43
44 MouseArea {
45 anchors.fill: parent
46 hoverEnabled: true
47
48 onEntered: {
49 parent.text = hifi.glyphs.closeInverted;
50 }
51
52 onExited: {
53 parent.text = hifi.glyphs.close;
54 }
55
56 onClicked: {
57 imageBox.visible = false;
58 }
59 }
60 }
61 }
62 2
3ImageMessageBox {
63}4}
interface/resources/qml/controls-uit/Key.qml+2−183
@@ -1,185 +1,4 @@
1import QtQuick 2.01import controlsUit 1.0
2import TabletScriptingInterface 1.0
3 2
4Item {3Key {
5 id: keyItem
6 width: 45
7 height: 50
8
9 property int contentPadding: 4
10 property string glyph: "a"
11 property bool toggle: false // does this button have the toggle behaivor?
12 property bool toggled: false // is this button currently toggled?
13 property alias mouseArea: mouseArea1
14 property alias fontFamily: letter.font.family;
15 property alias fontPixelSize: letter.font.pixelSize
16 property alias verticalAlignment: letter.verticalAlignment
17 property alias letterAnchors: letter.anchors
18
19 function resetToggledMode(mode) {
20 toggled = mode;
21 if (toggled) {
22 state = "mouseDepressed";
23 } else {
24 state = "";
25 }
26 }
27
28 MouseArea {
29 id: mouseArea1
30 width: 36
31 anchors.fill: parent
32 hoverEnabled: true
33
34 onCanceled: {
35 if (toggled) {
36 keyItem.state = "mouseDepressed";
37 } else {
38 keyItem.state = "";
39 }
40 }
41
42 onContainsMouseChanged: {
43 if (containsMouse) {
44 Tablet.playSound(TabletEnums.ButtonHover);
45 }
46 }
47
48 onDoubleClicked: {
49 mouse.accepted = true;
50 }
51
52 property var _HAPTIC_STRENGTH: 0.1;
53 property var _HAPTIC_DURATION: 3.0;
54 property var leftHand: 0;
55 property var rightHand: 1;
56
57 onEntered: {
58 keyItem.state = "mouseOver";
59
60 var globalPosition = keyItem.mapToGlobal(mouseArea1.mouseX, mouseArea1.mouseY);
61 var pointerID = Web3DOverlay.deviceIdByTouchPoint(globalPosition.x, globalPosition.y);
62
63 if (Pointers.isLeftHand(pointerID)) {
64 Controller.triggerHapticPulse(_HAPTIC_STRENGTH, _HAPTIC_DURATION, leftHand);
65 } else if (Pointers.isRightHand(pointerID)) {
66 Controller.triggerHapticPulse(_HAPTIC_STRENGTH, _HAPTIC_DURATION, rightHand);
67 }
68 }
69
70 onExited: {
71 if (toggled) {
72 keyItem.state = "mouseDepressed";
73 } else {
74 keyItem.state = "";
75 }
76 }
77
78 onPressed: {
79 keyItem.state = "mouseClicked";
80 mouse.accepted = true;
81 }
82
83 onReleased: {
84 if (containsMouse) {
85 Tablet.playSound(TabletEnums.ButtonClick);
86
87 webEntity.synthesizeKeyPress(glyph);
88 webEntity.synthesizeKeyPress(glyph, mirrorText);
89
90 if (toggle) {
91 toggled = !toggled;
92 }
93 keyItem.state = "mouseOver";
94 } else {
95 if (toggled) {
96 keyItem.state = "mouseDepressed";
97 } else {
98 keyItem.state = "";
99 }
100 }
101 mouse.accepted = true;
102 }
103 }
104
105 Rectangle {
106 id: roundedRect
107 width: 30
108 color: "#121212"
109 radius: 2
110 border.color: "#00000000"
111 anchors.fill: parent
112 anchors.margins: contentPadding
113 }
114
115 Text {
116 id: letter
117 y: 6
118 width: 50
119 color: "#ffffff"
120 text: glyph
121 style: Text.Normal
122 font.family: "Tahoma"
123 anchors.right: parent.right
124 anchors.rightMargin: 0
125 anchors.left: parent.left
126 anchors.leftMargin: 0
127 anchors.bottom: parent.bottom
128 anchors.bottomMargin: 0
129 anchors.top: parent.top
130 anchors.topMargin: 8
131 horizontalAlignment: Text.AlignHCenter
132 font.pixelSize: 28
133 }
134
135 states: [
136 State {
137 name: "mouseOver"
138
139 PropertyChanges {
140 target: roundedRect
141 color: "#121212"
142 radius: 3
143 border.width: 2
144 border.color: "#00b4ef"
145 }
146
147 PropertyChanges {
148 target: letter
149 color: "#00b4ef"
150 style: Text.Normal
151 }
152 },
153 State {
154 name: "mouseClicked"
155 PropertyChanges {
156 target: roundedRect
157 color: "#1080b8"
158 border.width: 2
159 border.color: "#00b4ef"
160 }
161
162 PropertyChanges {
163 target: letter
164 color: "#121212"
165 styleColor: "#00000000"
166 style: Text.Normal
167 }
168 },
169 State {
170 name: "mouseDepressed"
171 PropertyChanges {
172 target: roundedRect
173 color: "#0578b1"
174 border.width: 0
175 }
176
177 PropertyChanges {
178 target: letter
179 color: "#121212"
180 styleColor: "#00000000"
181 style: Text.Normal
182 }
183 }
184 ]
185}4}
interface/resources/qml/controls-uit/Keyboard.qml+2−352
@@ -1,354 +1,4 @@
1//1import controlsUit 1.0
2// FileDialog.qml
3//
4// Created by Anthony Thibault on 31 Oct 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.73Keyboard {
12import QtGraphicalEffects 1.0
13import "."
14
15Rectangle {
16 id: keyboardBase
17 objectName: "keyboard"
18
19 anchors.left: parent.left
20 anchors.right: parent.right
21
22 color: "#252525"
23
24 property bool raised: false
25 property bool numeric: false
26
27 readonly property int keyboardRowHeight: 50
28 readonly property int keyboardWidth: 480
29 readonly property int keyboardHeight: 200
30
31 readonly property int mirrorTextHeight: keyboardRowHeight
32
33 property bool password: false
34 property alias mirroredText: mirrorText.text
35 property bool showMirrorText: true
36
37 readonly property int raisedHeight: keyboardHeight + (showMirrorText ? keyboardRowHeight : 0)
38
39 height: enabled && raised ? raisedHeight : 0
40 visible: enabled && raised
41
42 property bool shiftMode: false
43 property bool numericShiftMode: false
44
45 onRaisedChanged: {
46 mirroredText = "";
47 }
48
49 function resetShiftMode(mode) {
50 shiftMode = mode;
51 shiftKey.resetToggledMode(mode);
52 }
53
54 function toUpper(str) {
55 if (str === ",") {
56 return "<";
57 } else if (str === ".") {
58 return ">";
59 } else if (str === "/") {
60 return "?";
61 } else if (str === "-") {
62 return "_";
63 } else {
64 return str.toUpperCase(str);
65 }
66 }
67
68 function toLower(str) {
69 if (str === "<") {
70 return ",";
71 } else if (str === ">") {
72 return ".";
73 } else if (str === "?") {
74 return "/";
75 } else if (str === "_") {
76 return "-";
77 } else {
78 return str.toLowerCase(str);
79 }
80 }
81
82 function forEachKey(func) {
83 var i, j;
84 for (i = 0; i < columnAlpha.children.length; i++) {
85 var row = columnAlpha.children[i];
86 for (j = 0; j < row.children.length; j++) {
87 var key = row.children[j];
88 func(key);
89 }
90 }
91 }
92
93 onShiftModeChanged: {
94 forEachKey(function (key) {
95 if (/[a-z-_]/i.test(key.glyph)) {
96 if (shiftMode) {
97 key.glyph = keyboardBase.toUpper(key.glyph);
98 } else {
99 key.glyph = keyboardBase.toLower(key.glyph);
100 }
101 }
102 });
103 }
104
105 function alphaKeyClickedHandler(mouseArea) {
106 // reset shift mode to false after first keypress
107 if (shiftMode) {
108 resetShiftMode(false);
109 }
110 }
111
112 Component.onCompleted: {
113 // hook up callbacks to every ascii key
114 forEachKey(function (key) {
115 if (/^[a-z]+$/i.test(key.glyph)) {
116 key.mouseArea.onClicked.connect(alphaKeyClickedHandler);
117 }
118 });
119 }
120
121 Rectangle {
122 height: showMirrorText ? mirrorTextHeight : 0
123 width: keyboardWidth
124 color: "#252525"
125 anchors.horizontalCenter: parent.horizontalCenter
126
127 TextInput {
128 id: mirrorText
129 visible: showMirrorText
130 font.family: "Fira Sans"
131 font.pixelSize: 20
132 verticalAlignment: Text.AlignVCenter
133 horizontalAlignment: Text.AlignHCenter
134 color: "#00B4EF";
135 anchors.left: parent.left
136 anchors.leftMargin: 10
137 anchors.right: parent.right
138 anchors.top: parent.top
139 anchors.bottom: parent.bottom
140
141 wrapMode: Text.WordWrap
142 readOnly: false // we need this to allow control to accept QKeyEvent
143 selectByMouse: false
144 echoMode: password ? TextInput.Password : TextInput.Normal
145
146 Keys.onPressed: {
147 if (event.key == Qt.Key_Return || event.key == Qt.Key_Space) {
148 mirrorText.text = "";
149 event.accepted = true;
150 }
151 }
152
153 MouseArea { // ... and we need this mouse area to prevent mirrorText from getting mouse events to ensure it will never get focus
154 anchors.fill: parent
155 }
156 }
157 }
158
159 Rectangle {
160 id: keyboardRect
161 y: showMirrorText ? mirrorTextHeight : 0
162 width: keyboardWidth
163 height: keyboardHeight
164 color: "#252525"
165 anchors.horizontalCenter: parent.horizontalCenter
166 anchors.bottom: parent.bottom
167 anchors.bottomMargin: 0
168
169 Column {
170 id: columnAlpha
171 width: keyboardWidth
172 height: keyboardHeight
173 visible: !numeric
174
175 Row {
176 width: keyboardWidth
177 height: keyboardRowHeight
178 anchors.left: parent.left
179 anchors.leftMargin: 4
180
181 Key { width: 43; glyph: "q"; }
182 Key { width: 43; glyph: "w"; }
183 Key { width: 43; glyph: "e"; }
184 Key { width: 43; glyph: "r"; }
185 Key { width: 43; glyph: "t"; }
186 Key { width: 43; glyph: "y"; }
187 Key { width: 43; glyph: "u"; }
188 Key { width: 43; glyph: "i"; }
189 Key { width: 43; glyph: "o"; }
190 Key { width: 43; glyph: "p"; }
191 Key { width: 43; glyph: "←"; }
192 }
193
194 Row {
195 width: keyboardWidth
196 height: keyboardRowHeight
197 anchors.left: parent.left
198 anchors.leftMargin: 20
199
200 Key { width: 43; glyph: "a"; }
201 Key { width: 43; glyph: "s"; }
202 Key { width: 43; glyph: "d"; }
203 Key { width: 43; glyph: "f"; }
204 Key { width: 43; glyph: "g"; }
205 Key { width: 43; glyph: "h"; }
206 Key { width: 43; glyph: "j"; }
207 Key { width: 43; glyph: "k"; }
208 Key { width: 43; glyph: "l"; }
209 Key { width: 70; glyph: "⏎"; }
210 }
211
212 Row {
213 width: keyboardWidth
214 height: keyboardRowHeight
215 anchors.left: parent.left
216 anchors.leftMargin: 4
217
218 Key {
219 id: shiftKey
220 width: 43
221 glyph: "⇪"
222 toggle: true
223 onToggledChanged: shiftMode = toggled
224 }
225 Key { width: 43; glyph: "z"; }
226 Key { width: 43; glyph: "x"; }
227 Key { width: 43; glyph: "c"; }
228 Key { width: 43; glyph: "v"; }
229 Key { width: 43; glyph: "b"; }
230 Key { width: 43; glyph: "n"; }
231 Key { width: 43; glyph: "m"; }
232 Key { width: 43; glyph: "-"; }
233 Key { width: 43; glyph: "/"; }
234 Key { width: 43; glyph: "?"; }
235 }
236
237 Row {
238 width: keyboardWidth
239 height: keyboardRowHeight
240 anchors.left: parent.left
241 anchors.leftMargin: 4
242
243 Key {
244 width: 70
245 glyph: "123"
246 mouseArea.onClicked: keyboardBase.parent.punctuationMode = true
247 }
248 Key { width: 231; glyph: " "; }
249 Key { width: 43; glyph: ","; }
250 Key { width: 43; glyph: "."; }
251 Key {
252 fontFamily: "hifi-glyphs";
253 fontPixelSize: 48;
254 letterAnchors.topMargin: -4;
255 verticalAlignment: Text.AlignVCenter;
256 width: 86; glyph: "\ue02b";
257 }
258 }
259 }
260
261 Column {
262 id: columnNumeric
263 width: keyboardWidth
264 height: keyboardHeight
265 visible: numeric
266
267 Row {
268 width: keyboardWidth
269 height: keyboardRowHeight
270 anchors.left: parent.left
271 anchors.leftMargin: 4
272
273 Key { width: 43; glyph: "1"; }
274 Key { width: 43; glyph: "2"; }
275 Key { width: 43; glyph: "3"; }
276 Key { width: 43; glyph: "4"; }
277 Key { width: 43; glyph: "5"; }
278 Key { width: 43; glyph: "6"; }
279 Key { width: 43; glyph: "7"; }
280 Key { width: 43; glyph: "8"; }
281 Key { width: 43; glyph: "9"; }
282 Key { width: 43; glyph: "0"; }
283 Key { width: 43; glyph: "←"; }
284 }
285
286 Row {
287 width: keyboardWidth
288 height: keyboardRowHeight
289 anchors.left: parent.left
290 anchors.leftMargin: 4
291
292 Key { width: 43; glyph: "!"; }
293 Key { width: 43; glyph: "@"; }
294 Key { width: 43; glyph: "#"; }
295 Key { width: 43; glyph: "$"; }
296 Key { width: 43; glyph: "%"; }
297 Key { width: 43; glyph: "^"; }
298 Key { width: 43; glyph: "&"; }
299 Key { width: 43; glyph: "*"; }
300 Key { width: 43; glyph: "("; }
301 Key { width: 43; glyph: ")"; }
302 Key { width: 43; glyph: "⏎"; }
303 }
304
305 Row {
306 width: keyboardWidth
307 height: keyboardRowHeight
308 anchors.left: parent.left
309 anchors.leftMargin: 4
310
311 Key {
312 id: numericShiftKey
313 width: 43
314 glyph: "\u21E8"
315 toggle: true
316 onToggledChanged: numericShiftMode = toggled
317 }
318 Key { width: 43; glyph: numericShiftMode ? "`" : "+"; }
319 Key { width: 43; glyph: numericShiftMode ? "~" : "-"; }
320 Key { width: 43; glyph: numericShiftMode ? "\u00A3" : "="; }
321 Key { width: 43; glyph: numericShiftMode ? "\u20AC" : ";"; }
322 Key { width: 43; glyph: numericShiftMode ? "\u00A5" : ":"; }
323 Key { width: 43; glyph: numericShiftMode ? "<" : "'"; }
324 Key { width: 43; glyph: numericShiftMode ? ">" : "\""; }
325 Key { width: 43; glyph: numericShiftMode ? "[" : "{"; }
326 Key { width: 43; glyph: numericShiftMode ? "]" : "}"; }
327 Key { width: 43; glyph: numericShiftMode ? "\\" : "|"; }
328 }
329
330 Row {
331 width: keyboardWidth
332 height: keyboardRowHeight
333 anchors.left: parent.left
334 anchors.leftMargin: 4
335
336 Key {
337 width: 70
338 glyph: "abc"
339 mouseArea.onClicked: keyboardBase.parent.punctuationMode = false
340 }
341 Key { width: 231; glyph: " "; }
342 Key { width: 43; glyph: ","; }
343 Key { width: 43; glyph: "."; }
344 Key {
345 fontFamily: "hifi-glyphs";
346 fontPixelSize: 48;
347 letterAnchors.topMargin: -4;
348 verticalAlignment: Text.AlignVCenter;
349 width: 86; glyph: "\ue02b";
350 }
351 }
352 }
353 }
354}4}
interface/resources/qml/controls-uit/Label.qml+2−33
@@ -1,35 +1,4 @@
1//1import controlsUit 1.0
2// Label.qml
3//
4// Created by David Rowe on 26 Feb 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.73Label {
12
13import "../styles-uit"
14
15RalewaySemiBold {
16 HifiConstants { id: hifi }
17 property int colorScheme: hifi.colorSchemes.light
18
19 size: hifi.fontSizes.inputLabel
20 color: {
21 if (colorScheme === hifi.colorSchemes.dark) {
22 if (enabled) {
23 hifi.colors.lightGrayText
24 } else {
25 hifi.colors.baseGrayHighlight
26 }
27 } else {
28 if (enabled) {
29 hifi.colors.lightGray
30 } else {
31 hifi.colors.lightGrayText
32 }
33 }
34 }
35}4}
interface/resources/qml/controls-uit/QueuedButton.qml+2−39
@@ -1,41 +1,4 @@
1//1import controlsUit 1.0
2// QueuedButton.qml
3// -- original Button.qml + signal timer workaround --ht
4// Created by David Rowe on 16 Feb 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53QueuedButton {
12
13import "../styles-uit"
14import "." as HifiControls
15
16HifiControls.Button {
17 // FIXME: THIS WORKAROUND MIGRATED/CONSOLIDATED FROM RUNNINGSCRIPTS.QML
18
19 // For some reason trigginer an API that enters
20 // an internal event loop directly from the button clicked
21 // trigger below causes the appliction to behave oddly.
22 // Most likely because the button onClicked handling is never
23 // completed until the function returns.
24 // FIXME find a better way of handling the input dialogs that
25 // doesn't trigger this.
26
27 // NOTE: dialogs that need to use this workaround can connect via
28 // onQueuedClicked: ...
29 // instead of:
30 // onClicked: ...
31
32 signal clickedQueued()
33 Timer {
34 id: fromTimer
35 interval: 5
36 repeat: false
37 running: false
38 onTriggered: clickedQueued()
39 }
40 onClicked: fromTimer.running = true
41}4}
interface/resources/qml/controls-uit/RadioButton.qml+2−91
@@ -1,93 +1,4 @@
1//1import controlsUit 1.0
2// RadioButton.qml
3//
4// Created by Cain Kilgore on 20th July 2017
5// Copyright 2017 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53RadioButton {
12import QtQuick.Controls 2.2 as Original
13
14import "../styles-uit"
15import "../controls-uit" as HifiControls
16
17import TabletScriptingInterface 1.0
18
19Original.RadioButton {
20 id: radioButton
21 HifiConstants { id: hifi }
22
23 hoverEnabled: true
24
25 property int colorScheme: hifi.colorSchemes.light
26 readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light
27
28 property real letterSpacing: 1
29 property int fontSize: hifi.fontSizes.inputLabel
30 property int boxSize: defaultBoxSize
31 property real scaleFactor: boxSize / defaultBoxSize
32
33 readonly property int defaultBoxSize: 14
34 readonly property int boxRadius: 3 * scaleFactor
35 readonly property int checkSize: 10 * scaleFactor
36 readonly property int checkRadius: 2 * scaleFactor
37 readonly property int indicatorRadius: 7 * scaleFactor
38
39 onClicked: {
40 Tablet.playSound(TabletEnums.ButtonClick);
41 }
42
43 onHoveredChanged: {
44 if (hovered) {
45 Tablet.playSound(TabletEnums.ButtonHover);
46 }
47 }
48
49 indicator: Rectangle {
50 id: box
51 width: boxSize
52 height: boxSize
53 radius: indicatorRadius
54 x: radioButton.leftPadding
55 y: parent.height / 2 - height / 2
56 gradient: Gradient {
57 GradientStop {
58 position: 0.2
59 color: pressed || hovered
60 ? (radioButton.isLightColorScheme ? hifi.colors.checkboxDarkStart : hifi.colors.checkboxLightStart)
61 : (radioButton.isLightColorScheme ? hifi.colors.checkboxLightStart : hifi.colors.checkboxDarkStart)
62 }
63 GradientStop {
64 position: 1.0
65 color: pressed || hovered
66 ? (radioButton.isLightColorScheme ? hifi.colors.checkboxDarkFinish : hifi.colors.checkboxLightFinish)
67 : (radioButton.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish)
68 }
69 }
70
71 Rectangle {
72 id: check
73 width: checkSize
74 height: checkSize
75 radius: indicatorRadius
76 anchors.centerIn: parent
77 color: "#00B4EF"
78 border.width: 1
79 border.color: "#36CDFF"
80 visible: checked && !pressed || !checked && pressed
81 }
82 }
83
84 contentItem: RalewaySemiBold {
85 text: radioButton.text
86 size: radioButton.fontSize
87 font.letterSpacing: letterSpacing
88 color: isLightColorScheme ? hifi.colors.lightGray : hifi.colors.lightGrayText
89 horizontalAlignment: Text.AlignHCenter
90 verticalAlignment: Text.AlignVCenter
91 leftPadding: radioButton.indicator.width + radioButton.spacing
92 }
93}4}
interface/resources/qml/controls-uit/ScrollBar.qml+1−38
@@ -1,41 +1,4 @@
1//1import controlsUit 1.0
2// ScrollBar.qml
3//
4// Created by Vlad Stelmahovsky on 27 Nov 2017
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10
11import QtQuick 2.7
12import QtQuick.Controls 2.2
13
14import "../styles-uit"
15 2
16ScrollBar {3ScrollBar {
17 visible: size < 1.0
18
19 HifiConstants { id: hifi }
20 property int colorScheme: hifi.colorSchemes.light
21 readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light
22
23 background: Item {
24 implicitWidth: hifi.dimensions.scrollbarBackgroundWidth
25 Rectangle {
26 anchors { fill: parent; topMargin: 3; bottomMargin: 3 }
27 radius: hifi.dimensions.scrollbarHandleWidth/2
28 color: isLightColorScheme ? hifi.colors.tableScrollBackgroundLight
29 : hifi.colors.tableScrollBackgroundDark
30 }
31 }
32
33 contentItem: Item {
34 implicitWidth: hifi.dimensions.scrollbarHandleWidth
35 Rectangle {
36 anchors { fill: parent; topMargin: 1; bottomMargin: 1 }
37 radius: hifi.dimensions.scrollbarHandleWidth/2
38 color: isLightColorScheme ? hifi.colors.tableScrollHandleLight : hifi.colors.tableScrollHandleDark
39 }
40 }
41}4}
interface/resources/qml/controls-uit/Separator.qml+2−42
@@ -1,44 +1,4 @@
1//1import controlsUit 1.0
2// Separator.qml
3//
4// Created by Zach Fox on 2017-06-06
5// Copyright 2017 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53Separator {
12import "../styles-uit"
13
14Item {
15 property int colorScheme: 0;
16
17 readonly property var topColor: [ hifi.colors.baseGrayShadow, hifi.colors.faintGray, "#89858C" ];
18 readonly property var bottomColor: [ hifi.colors.baseGrayHighlight, hifi.colors.faintGray, "#89858C" ];
19
20 // Size
21 height: colorScheme === 0 ? 2 : 1;
22 Rectangle {
23 // Size
24 width: parent.width;
25 height: 1;
26 // Anchors
27 anchors.left: parent.left;
28 anchors.bottom: parent.bottom;
29 // Style
30 color: topColor[colorScheme];
31 }
32 Rectangle {
33 visible: colorScheme === 0;
34 // Size
35 width: parent.width;
36 height: 1;
37 // Anchors
38 anchors.left: parent.left;
39 anchors.bottom: parent.bottom;
40 anchors.bottomMargin: -height;
41 // Style
42 color: bottomColor[colorScheme];
43 }
44}4}
interface/resources/qml/controls-uit/Slider.qml+2−96
@@ -1,98 +1,4 @@
1//1import controlsUit 1.0
2// Slider.qml
3//
4// Created by David Rowe on 27 Feb 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10
11import QtQuick 2.7
12import QtQuick.Controls 2.2
13
14import "../styles-uit"
15import "../controls-uit" as HifiControls
16 2
17Slider {3Slider {
18 id: slider4}
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/controls-uit/SpinBox.qml+1−182
@@ -1,185 +1,4 @@
1//1import controlsUit 1.0
2// SpinBox.qml
3//
4// Created by David Rowe on 26 Feb 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10
11import QtQuick 2.7
12import QtQuick.Controls 2.2
13
14import "../styles-uit"
15import "../controls-uit" as HifiControls
16 2
17SpinBox {3SpinBox {
18 id: spinBox
19
20 HifiConstants {
21 id: hifi
22 }
23
24 inputMethodHints: Qt.ImhFormattedNumbersOnly
25 property int colorScheme: hifi.colorSchemes.light
26 readonly property bool isLightColorScheme: colorScheme === hifi.colorSchemes.light
27 property string label: ""
28 property string suffix: ""
29 property string labelInside: ""
30 property color colorLabelInside: hifi.colors.white
31 property color backgroundColor: isLightColorScheme
32 ? (spinBox.activeFocus ? hifi.colors.white : hifi.colors.lightGray)
33 : (spinBox.activeFocus ? hifi.colors.black : hifi.colors.baseGrayShadow)
34 property real controlHeight: height + (spinBoxLabel.visible ? spinBoxLabel.height + spinBoxLabel.anchors.bottomMargin : 0)
35 property int decimals: 2;
36 property real factor: Math.pow(10, decimals)
37
38 property real minimumValue: 0.0
39 property real maximumValue: 0.0
40
41 property real realValue: 0.0
42 property real realFrom: minimumValue
43 property real realTo: maximumValue
44 property real realStepSize: 1.0
45
46 signal editingFinished()
47
48 implicitHeight: height
49 implicitWidth: width
50 editable: true
51
52 padding: 0
53 leftPadding: 0
54 rightPadding: padding + (up.indicator ? up.indicator.width : 0)
55 topPadding: 0
56 bottomPadding: 0
57
58 locale: Qt.locale("en_US")
59
60 onValueModified: realValue = value/factor
61 onValueChanged: realValue = value/factor
62 onRealValueChanged: {
63 var newValue = Math.round(realValue*factor);
64 if(value != newValue) {
65 value = newValue;
66 }
67 }
68
69 stepSize: realStepSize*factor
70 to : realTo*factor
71 from : realFrom*factor
72
73 font.family: "Fira Sans SemiBold"
74 font.pixelSize: hifi.fontSizes.textFieldInput
75 height: hifi.fontSizes.textFieldInput + 13 // Match height of TextField control.
76
77 y: spinBoxLabel.visible ? spinBoxLabel.height + spinBoxLabel.anchors.bottomMargin : 0
78
79 background: Rectangle {
80 color: backgroundColor
81 border.color: spinBoxLabelInside.visible ? spinBoxLabelInside.color : hifi.colors.primaryHighlight
82 border.width: spinBox.activeFocus ? spinBoxLabelInside.visible ? 2 : 1 : 0
83 }
84
85 validator: DoubleValidator {
86 bottom: Math.min(spinBox.from, spinBox.to)
87 top: Math.max(spinBox.from, spinBox.to)
88 }
89
90 textFromValue: function(value, locale) {
91 return parseFloat(value/factor).toFixed(decimals);
92 }
93
94 valueFromText: function(text, locale) {
95 return Number.fromLocaleString(locale, text)*factor;
96 }
97
98
99 contentItem: TextInput {
100 z: 2
101 color: isLightColorScheme
102 ? (spinBox.activeFocus ? hifi.colors.black : hifi.colors.lightGray)
103 : (spinBox.activeFocus ? hifi.colors.white : hifi.colors.lightGrayText)
104 selectedTextColor: hifi.colors.black
105 selectionColor: hifi.colors.primaryHighlight
106 text: spinBox.textFromValue(spinBox.value, spinBox.locale) + suffix
107 inputMethodHints: spinBox.inputMethodHints
108 validator: spinBox.validator
109 verticalAlignment: Qt.AlignVCenter
110 leftPadding: spinBoxLabelInside.visible ? 30 : hifi.dimensions.textPadding
111 //rightPadding: hifi.dimensions.spinnerSize
112 width: spinBox.width - hifi.dimensions.spinnerSize
113 onEditingFinished: spinBox.editingFinished()
114 }
115
116 up.indicator: Item {
117 x: spinBox.width - implicitWidth - 5
118 y: 1
119 clip: true
120 implicitHeight: spinBox.implicitHeight/2
121 implicitWidth: spinBox.implicitHeight/2
122 HiFiGlyphs {
123 anchors.centerIn: parent
124 text: hifi.glyphs.caratUp
125 size: hifi.dimensions.spinnerSize
126 color: spinBox.up.pressed || spinBox.up.hovered ? (isLightColorScheme ? hifi.colors.black : hifi.colors.white) : hifi.colors.gray
127 }
128 }
129 up.onPressedChanged: {
130 if(value) {
131 spinBox.forceActiveFocus();
132 }
133 }
134
135 down.indicator: Item {
136 x: spinBox.width - implicitWidth - 5
137 y: spinBox.implicitHeight/2
138 clip: true
139 implicitHeight: spinBox.implicitHeight/2
140 implicitWidth: spinBox.implicitHeight/2
141 HiFiGlyphs {
142 anchors.centerIn: parent
143 text: hifi.glyphs.caratDn
144 size: hifi.dimensions.spinnerSize
145 color: spinBox.down.pressed || spinBox.down.hovered ? (isLightColorScheme ? hifi.colors.black : hifi.colors.white) : hifi.colors.gray
146 }
147 }
148 down.onPressedChanged: {
149 if(value) {
150 spinBox.forceActiveFocus();
151 }
152 }
153
154 HifiControls.Label {
155 id: spinBoxLabel
156 text: spinBox.label
157 colorScheme: spinBox.colorScheme
158 anchors.left: parent.left
159 anchors.bottom: parent.top
160 anchors.bottomMargin: 4
161 visible: label != ""
162 }
163
164 HifiControls.Label {
165 id: spinBoxLabelInside
166 text: spinBox.labelInside
167 anchors.left: parent.left
168 anchors.leftMargin: 10
169 font.bold: true
170 anchors.verticalCenter: parent.verticalCenter
171 color: spinBox.colorLabelInside
172 visible: spinBox.labelInside != ""
173 }
174
175 MouseArea {
176 anchors.fill: parent
177 acceptedButtons: Qt.NoButton
178 onWheel: {
179 if (wheel.angleDelta.y > 0)
180 value += stepSize
181 else
182 value -= stepSize
183 }
184 }
185}4}
interface/resources/qml/controls-uit/Switch.qml+2−158
@@ -1,160 +1,4 @@
1//1import controlsUit 1.0
2// Switch.qml
3//
4// Created by Zach Fox on 2017-06-06
5// Copyright 2017 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.73Switch {
12import QtQuick.Controls 2.2 as Original
13
14import "../styles-uit"
15
16Item {
17 id: rootSwitch;
18
19 property int colorScheme: hifi.colorSchemes.light;
20 readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light;
21 property int switchWidth: 70;
22 readonly property int switchRadius: height/2;
23 property string labelTextOff: "";
24 property string labelGlyphOffText: "";
25 property int labelGlyphOffSize: 32;
26 property string labelTextOn: "";
27 property string labelGlyphOnText: "";
28 property int labelGlyphOnSize: 32;
29 property alias checked: originalSwitch.checked;
30 signal onCheckedChanged;
31 signal clicked;
32
33 Original.Switch {
34 id: originalSwitch;
35 focusPolicy: Qt.ClickFocus
36 anchors.top: rootSwitch.top;
37 anchors.left: rootSwitch.left;
38 anchors.leftMargin: rootSwitch.width/2 - rootSwitch.switchWidth/2;
39 onCheckedChanged: rootSwitch.onCheckedChanged();
40 onClicked: rootSwitch.clicked();
41 hoverEnabled: true
42
43 topPadding: 3;
44 leftPadding: 3;
45 rightPadding: 3;
46 bottomPadding: 3;
47
48 onHoveredChanged: {
49 if (hovered) {
50 switchHandle.color = hifi.colors.blueHighlight;
51 } else {
52 switchHandle.color = hifi.colors.lightGray;
53 }
54 }
55
56 background: Rectangle {
57 color: "#252525";
58 implicitWidth: rootSwitch.switchWidth;
59 implicitHeight: rootSwitch.height;
60 radius: rootSwitch.switchRadius;
61 }
62
63 indicator: Rectangle {
64 id: switchHandle;
65 implicitWidth: rootSwitch.height - originalSwitch.topPadding - originalSwitch.bottomPadding;
66 implicitHeight: implicitWidth;
67 radius: implicitWidth/2;
68 border.color: hifi.colors.lightGrayText;
69 color: hifi.colors.lightGray;
70 //x: originalSwitch.leftPadding
71 x: Math.max(0, Math.min(parent.width - width, originalSwitch.visualPosition * parent.width - (width / 2)))
72 y: parent.height / 2 - height / 2
73 Behavior on x {
74 enabled: !originalSwitch.down
75 SmoothedAnimation { velocity: 200 }
76 }
77
78 }
79 }
80
81 // OFF Label
82 Item {
83 anchors.right: originalSwitch.left;
84 anchors.rightMargin: 10;
85 anchors.top: rootSwitch.top;
86 height: rootSwitch.height;
87
88 RalewaySemiBold {
89 id: labelOff;
90 text: labelTextOff;
91 size: hifi.fontSizes.inputLabel;
92 color: originalSwitch.checked ? hifi.colors.lightGrayText : "#FFFFFF";
93 anchors.top: parent.top;
94 anchors.right: parent.right;
95 width: paintedWidth;
96 height: parent.height;
97 verticalAlignment: Text.AlignVCenter;
98 }
99
100 HiFiGlyphs {
101 id: labelGlyphOff;
102 text: labelGlyphOffText;
103 size: labelGlyphOffSize;
104 color: labelOff.color;
105 anchors.top: parent.top;
106 anchors.topMargin: 2;
107 anchors.right: labelOff.left;
108 anchors.rightMargin: 4;
109 }
110
111 MouseArea {
112 anchors.top: parent.top;
113 anchors.bottom: parent.bottom;
114 anchors.left: labelGlyphOff.left;
115 anchors.right: labelOff.right;
116 onClicked: {
117 originalSwitch.checked = false;
118 }
119 }
120 }
121
122 // ON Label
123 Item {
124 anchors.left: originalSwitch.right;
125 anchors.leftMargin: 10;
126 anchors.top: rootSwitch.top;
127 height: rootSwitch.height;
128
129 RalewaySemiBold {
130 id: labelOn;
131 text: labelTextOn;
132 size: hifi.fontSizes.inputLabel;
133 color: originalSwitch.checked ? "#FFFFFF" : hifi.colors.lightGrayText;
134 anchors.top: parent.top;
135 anchors.left: parent.left;
136 width: paintedWidth;
137 height: parent.height;
138 verticalAlignment: Text.AlignVCenter;
139 }
140
141 HiFiGlyphs {
142 id: labelGlyphOn;
143 text: labelGlyphOnText;
144 size: labelGlyphOnSize;
145 color: labelOn.color;
146 anchors.top: parent.top;
147 anchors.left: labelOn.right;
148 }
149
150 MouseArea {
151 anchors.top: parent.top;
152 anchors.bottom: parent.bottom;
153 anchors.left: labelOn.left;
154 anchors.right: labelGlyphOn.right;
155 onClicked: {
156 originalSwitch.checked = true;
157 }
158 }
159 }
160}4}
interface/resources/qml/controls-uit/Table.qml+2−163
@@ -1,165 +1,4 @@
1//1import controlsUit 1.0
2// Table.qml
3//
4// Created by David Rowe on 18 Feb 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53Table {
12import QtQuick.Controls 1.4
13import QtQuick.Controls.Styles 1.4
14import QtQuick.Controls 2.3 as QQC2
15
16import "../styles-uit"
17
18TableView {
19 id: tableView
20
21 property int colorScheme: hifi.colorSchemes.light
22 readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light
23 property bool expandSelectedRow: false
24 property bool centerHeaderText: false
25 readonly property real headerSpacing: 3 //spacing between sort indicator and table header title
26 property var titlePaintedPos: [] // storing extra data position behind painted
27 // title text and sort indicatorin table's header
28 signal titlePaintedPosSignal(int column) //signal that extradata position gets changed
29
30 model: ListModel { }
31
32 Component.onCompleted: {
33 if (flickableItem !== null && flickableItem !== undefined) {
34 tableView.flickableItem.QQC2.ScrollBar.vertical = scrollbar
35 }
36 }
37
38 QQC2.ScrollBar {
39 id: scrollbar
40 parent: tableView.flickableItem
41 policy: QQC2.ScrollBar.AsNeeded
42 orientation: Qt.Vertical
43 visible: size < 1.0
44 topPadding: tableView.headerVisible ? hifi.dimensions.tableHeaderHeight + 1 : 1
45 anchors.top: tableView.top
46 anchors.left: tableView.right
47 anchors.bottom: tableView.bottom
48
49 background: Item {
50 implicitWidth: hifi.dimensions.scrollbarBackgroundWidth
51 Rectangle {
52 anchors {
53 fill: parent;
54 topMargin: tableView.headerVisible ? hifi.dimensions.tableHeaderHeight : 0
55 }
56 color: isLightColorScheme ? hifi.colors.tableScrollBackgroundLight
57 : hifi.colors.tableScrollBackgroundDark
58 }
59 }
60
61 contentItem: Item {
62 implicitWidth: hifi.dimensions.scrollbarHandleWidth
63 Rectangle {
64 anchors.fill: parent
65 radius: (width - 4)/2
66 color: isLightColorScheme ? hifi.colors.tableScrollHandleLight : hifi.colors.tableScrollHandleDark
67 }
68 }
69 }
70
71 headerVisible: false
72 headerDelegate: Rectangle {
73 height: hifi.dimensions.tableHeaderHeight
74 color: isLightColorScheme ? hifi.colors.tableBackgroundLight : hifi.colors.tableBackgroundDark
75
76
77 RalewayRegular {
78 id: titleText
79 x: centerHeaderText ? (parent.width - paintedWidth -
80 ((sortIndicatorVisible &&
81 sortIndicatorColumn === styleData.column) ?
82 (titleSort.paintedWidth / 5 + tableView.headerSpacing) : 0)) / 2 :
83 hifi.dimensions.tablePadding
84 text: styleData.value
85 size: hifi.fontSizes.tableHeading
86 font.capitalization: Font.AllUppercase
87 color: hifi.colors.baseGrayHighlight
88 horizontalAlignment: (centerHeaderText ? Text.AlignHCenter : Text.AlignLeft)
89 anchors.verticalCenter: parent.verticalCenter
90 }
91
92 //actual image of sort indicator in glyph font only 20% of real font size
93 //i.e. if the charachter size set to 60 pixels, actual image is 12 pixels
94 HiFiGlyphs {
95 id: titleSort
96 text: sortIndicatorOrder == Qt.AscendingOrder ? hifi.glyphs.caratUp : hifi.glyphs.caratDn
97 color: hifi.colors.darkGray
98 opacity: 0.6;
99 size: hifi.fontSizes.tableHeadingIcon
100 anchors.verticalCenter: titleText.verticalCenter
101 anchors.left: titleText.right
102 anchors.leftMargin: -(hifi.fontSizes.tableHeadingIcon / 2.5) + tableView.headerSpacing
103 visible: sortIndicatorVisible && sortIndicatorColumn === styleData.column
104 onXChanged: {
105 titlePaintedPos[styleData.column] = titleText.x + titleText.paintedWidth +
106 paintedWidth / 5 + tableView.headerSpacing*2
107 titlePaintedPosSignal(styleData.column)
108 }
109 }
110
111 Rectangle {
112 width: 1
113 anchors {
114 left: parent.left
115 top: parent.top
116 topMargin: 1
117 bottom: parent.bottom
118 bottomMargin: 2
119 }
120 color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight
121 visible: styleData.column > 0
122 }
123
124 Rectangle {
125 height: 1
126 anchors {
127 left: parent.left
128 right: parent.right
129 bottom: parent.bottom
130 }
131 color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight
132 }
133 }
134
135 // Use rectangle to draw border with rounded corners.
136 frameVisible: false
137 Rectangle {
138 color: "#00000000"
139 anchors { fill: parent; margins: -2 }
140 border.color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight
141 border.width: 2
142 }
143 anchors.margins: 2 // Shrink TableView to lie within border.
144
145 backgroundVisible: true
146
147 horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
148 verticalScrollBarPolicy: Qt.ScrollBarAlwaysOff
149
150 style: TableViewStyle {
151 // Needed in order for rows to keep displaying rows after end of table entries.
152 backgroundColor: tableView.isLightColorScheme ? hifi.colors.tableBackgroundLight : hifi.colors.tableBackgroundDark
153 alternateBackgroundColor: tableView.isLightColorScheme ? hifi.colors.tableRowLightOdd : hifi.colors.tableRowDarkOdd
154 padding.top: headerVisible ? hifi.dimensions.tableHeaderHeight: 0
155 }
156
157 rowDelegate: Rectangle {
158 height: (styleData.selected && expandSelectedRow ? 1.8 : 1) * hifi.dimensions.tableRowHeight
159 color: styleData.selected
160 ? hifi.colors.primaryHighlight
161 : tableView.isLightColorScheme
162 ? (styleData.alternate ? hifi.colors.tableRowLightEven : hifi.colors.tableRowLightOdd)
163 : (styleData.alternate ? hifi.colors.tableRowDarkEven : hifi.colors.tableRowDarkOdd)
164 }
165}4}
interface/resources/qml/controls-uit/TabletContentSection.qml+2−136
@@ -1,138 +1,4 @@
1//1import controlsUit 1.0
2// ContentSection.qml
3//
4// Created by Dante Ruiz on 13 Feb 2017
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53TabletContentSection {
12import QtGraphicalEffects 1.0
13
14import "../styles-uit"
15
16Column {
17 property string name: "Content Section"
18 property bool isFirst: false
19 property bool isCollapsible: false // Set at creation.
20 property bool isCollapsed: false
21
22 spacing: 0 // Defer spacing decisions to individual controls.
23
24 anchors {
25 left: parent.left
26 leftMargin: hifi.dimensions.contentMargin.x
27 right: parent.right
28 rightMargin: hifi.dimensions.contentMargin.x
29 }
30
31 function toggleCollapsed() {
32 if (isCollapsible) {
33 isCollapsed = !isCollapsed;
34 for (var i = 1; i < children.length; i++) {
35 children[i].visible = !isCollapsed;
36 }
37 }
38 }
39
40 Item {
41 id: sectionName
42 anchors.left: parent.left
43 anchors.right: parent.right
44 height: leadingSpace.height + topBar.height + heading.height + bottomBar.height
45
46 Item {
47 id: leadingSpace
48 width: 1
49 height: isFirst ? 7 : 0
50 anchors.top: parent.top
51 }
52
53 Item {
54 id: topBar
55 visible: !isFirst
56 height: visible ? 2 : 0
57 anchors.top: leadingSpace.bottom
58
59 Rectangle {
60 id: shadow
61 width: 480
62 height: 1
63 color: hifi.colors.baseGrayShadow
64 x: -hifi.dimensions.contentMargin.x
65 }
66
67 Rectangle {
68 width: 480
69 height: 1
70 color: hifi.colors.baseGrayHighlight
71 x: -hifi.dimensions.contentMargin.x
72 anchors.top: shadow.bottom
73 }
74 }
75
76 Item {
77 id: heading
78 anchors {
79 left: parent.left
80 right: parent.right
81 top: topBar.bottom
82 }
83 height: isCollapsible ? 36 : 28
84
85 RalewayRegular {
86 id: title
87 anchors {
88 left: parent.left
89 top: parent.top
90 topMargin: 12
91 }
92 size: hifi.fontSizes.sectionName
93 font.capitalization: Font.AllUppercase
94 text: name
95 color: hifi.colors.lightGrayText
96 }
97
98 HiFiGlyphs {
99 anchors {
100 top: title.top
101 topMargin: -9
102 right: parent.right
103 rightMargin: -4
104 }
105 size: hifi.fontSizes.disclosureButton
106 text: isCollapsed ? hifi.glyphs.disclosureButtonExpand : hifi.glyphs.disclosureButtonCollapse
107 color: hifi.colors.lightGrayText
108 visible: isCollapsible
109 }
110
111 MouseArea {
112 // Events are propogated so that any active control is defocused.
113 anchors.fill: parent
114 propagateComposedEvents: true
115 onPressed: {
116 toggleCollapsed();
117 mouse.accepted = false;
118 }
119 }
120 }
121
122 LinearGradient {
123 id: bottomBar
124 visible: false
125 width: 480
126 height: visible ? 4 : 0
127 x: -hifi.dimensions.contentMargin.x
128 anchors.top: heading.bottom
129 start: Qt.point(0, 0)
130 end: Qt.point(0, 4)
131 gradient: Gradient {
132 GradientStop { position: 0.0; color: hifi.colors.darkGray }
133 GradientStop { position: 1.0; color: hifi.colors.baseGray } // Equivalent of darkGray0 over baseGray background.
134 }
135 cached: true
136 }
137 }
138}4}
interface/resources/qml/controls-uit/TabletHeader.qml+2−32
@@ -1,34 +1,4 @@
1//1import controlsUit 1.0
2// TabletHeader.qml
3//
4// Created by David Rowe on 11 Mar 2017.
5// Copyright 2017 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53TabletHeader {
12
13import "../styles-uit"
14
15Rectangle {
16
17 property string title: ""
18
19 HifiConstants { id: hifi }
20
21 height: hifi.dimensions.tabletMenuHeader
22 z: 100
23
24 color: hifi.colors.darkGray
25
26 RalewayBold {
27 text: title
28 size: 26
29 color: hifi.colors.white
30 anchors.verticalCenter: parent.verticalCenter
31 anchors.left: parent.left
32 anchors.leftMargin: hifi.dimensions.contentMargin.x
33 }
34}4}
interface/resources/qml/controls-uit/TextAction.qml+2−63
@@ -1,65 +1,4 @@
1//1import controlsUit 1.0
2// TextField.qml
3//
4// Created by David Rowe on 21 Apr 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53TextAction {
12
13import "../styles-uit"
14import "../controls-uit" as HifiControls
15
16Item {
17 property string icon: ""
18 property int iconSize: 30
19 property string text: ""
20
21 property int colorScheme: hifi.colorSchemes.light
22 readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light
23
24 signal clicked()
25
26 height: Math.max(glyph.visible ? glyph.height - 4 : 0, string.visible ? string.height : 0)
27 width: glyph.width + string.anchors.leftMargin + string.width
28
29 HiFiGlyphs {
30 id: glyph
31 anchors.left: parent.left
32 anchors.top: parent.top
33 anchors.topMargin: -2
34 text: parent.icon
35 size: parent.iconSize
36 color: isLightColorScheme
37 ? (mouseArea.containsMouse ? hifi.colors.baseGrayHighlight : hifi.colors.lightGray)
38 : (mouseArea.containsMouse ? hifi.colors.faintGray : hifi.colors.lightGrayText)
39 visible: text !== ""
40 width: visible ? implicitWidth : 0
41 }
42
43 RalewaySemiBold {
44 id: string
45 anchors {
46 left: glyph.visible ? glyph.right : parent.left
47 leftMargin: visible && glyph.visible ? hifi.dimensions.contentSpacing.x : 0
48 verticalCenter: glyph.visible ? glyph.verticalCenter : undefined
49 }
50 text: parent.text
51 size: hifi.fontSizes.inputLabel
52 color: isLightColorScheme
53 ? (mouseArea.containsMouse ? hifi.colors.baseGrayHighlight : hifi.colors.lightGray)
54 : (mouseArea.containsMouse ? hifi.colors.faintGray : hifi.colors.lightGrayText)
55 font.underline: true;
56 visible: text !== ""
57 }
58
59 MouseArea {
60 id: mouseArea
61 anchors.fill: parent
62 hoverEnabled: true
63 onClicked: parent.clicked()
64 }
65}4}
interface/resources/qml/controls-uit/TextEdit.qml+1−20
@@ -1,23 +1,4 @@
1//1import controlsUit 1.0
2// TextEdit.qml
3//
4// Created by Bradley Austin Davis on 24 Apr 2015
5// Copyright 2015 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10
11import QtQuick 2.5
12import "../styles-uit"
13 2
14TextEdit {3TextEdit {
15
16 property real size: 32
17
18 font.family: "Raleway"
19 font.weight: Font.DemiBold
20 font.pointSize: size
21 verticalAlignment: Text.AlignVCenter
22 horizontalAlignment: Text.AlignLeft
23}4}
interface/resources/qml/controls-uit/TextField.qml+1−177
@@ -1,180 +1,4 @@
1//1import controlsUit 1.0
2// TextField.qml
3//
4// Created by David Rowe on 17 Feb 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10
11import QtQuick 2.5
12import QtQuick.Controls 1.4
13import QtQuick.Controls.Styles 1.4
14
15import "../styles-uit"
16import "../controls-uit" as HifiControls
17 2
18TextField {3TextField {
19 id: textField
20
21 property int colorScheme: hifi.colorSchemes.light
22 readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light
23 readonly property bool isFaintGrayColorScheme: colorScheme == hifi.colorSchemes.faintGray
24 property bool isSearchField: false
25 property string label: ""
26 property real controlHeight: height + (textFieldLabel.visible ? textFieldLabel.height + 1 : 0)
27 property bool hasDefocusedBorder: true;
28 property bool hasRoundedBorder: false
29 property int roundedBorderRadius: 4
30 property bool error: false;
31 property bool hasClearButton: false;
32 property string leftPermanentGlyph: "";
33 property string centerPlaceholderGlyph: "";
34
35 placeholderText: textField.placeholderText
36
37 font.family: "Fira Sans"
38 font.pixelSize: hifi.fontSizes.textFieldInput
39 height: implicitHeight + 3 // Make surrounding box higher so that highlight is vertically centered.
40 property alias textFieldLabel: textFieldLabel
41
42 y: textFieldLabel.visible ? textFieldLabel.height + textFieldLabel.anchors.bottomMargin : 0
43
44 // workaround for https://bugreports.qt.io/browse/QTBUG-49297
45 Keys.onPressed: {
46 switch (event.key) {
47 case Qt.Key_Return:
48 case Qt.Key_Enter:
49 event.accepted = true;
50
51 // emit accepted signal manually
52 if (acceptableInput) {
53 accepted();
54 }
55 }
56 }
57
58 style: TextFieldStyle {
59 id: style;
60 textColor: {
61 if (isLightColorScheme) {
62 if (textField.activeFocus) {
63 hifi.colors.black
64 } else {
65 hifi.colors.lightGray
66 }
67 } else if (isFaintGrayColorScheme) {
68 if (textField.activeFocus) {
69 hifi.colors.black
70 } else {
71 hifi.colors.lightGray
72 }
73 } else {
74 if (textField.activeFocus) {
75 hifi.colors.white
76 } else {
77 hifi.colors.lightGrayText
78 }
79 }
80 }
81 background: Rectangle {
82 color: {
83 if (isLightColorScheme) {
84 if (textField.activeFocus) {
85 hifi.colors.white
86 } else {
87 hifi.colors.textFieldLightBackground
88 }
89 } else if (isFaintGrayColorScheme) {
90 if (textField.activeFocus) {
91 hifi.colors.white
92 } else {
93 hifi.colors.faintGray50
94 }
95 } else {
96 if (textField.activeFocus) {
97 hifi.colors.black
98 } else {
99 hifi.colors.baseGrayShadow
100 }
101 }
102 }
103 border.color: textField.error ? hifi.colors.redHighlight :
104 (textField.activeFocus ? hifi.colors.primaryHighlight : (hasDefocusedBorder ? (isFaintGrayColorScheme ? hifi.colors.lightGrayText : hifi.colors.lightGray) : color))
105 border.width: textField.activeFocus || hasRoundedBorder || textField.error ? 1 : 0
106 radius: isSearchField ? textField.height / 2 : (hasRoundedBorder ? roundedBorderRadius : 0)
107
108 HiFiGlyphs {
109 text: textField.leftPermanentGlyph;
110 color: textColor;
111 size: hifi.fontSizes.textFieldSearchIcon;
112 anchors.left: parent.left;
113 anchors.verticalCenter: parent.verticalCenter;
114 anchors.leftMargin: hifi.dimensions.textPadding - 2;
115 visible: text;
116 }
117
118 HiFiGlyphs {
119 text: textField.centerPlaceholderGlyph;
120 color: textColor;
121 size: parent.height;
122 anchors.horizontalCenter: parent.horizontalCenter;
123 anchors.verticalCenter: parent.verticalCenter;
124 visible: text && !textField.focus && textField.text === "";
125 }
126
127 HiFiGlyphs {
128 text: hifi.glyphs.search
129 color: textColor
130 size: hifi.fontSizes.textFieldSearchIcon
131 anchors.left: parent.left
132 anchors.verticalCenter: parent.verticalCenter
133 anchors.leftMargin: hifi.dimensions.textPadding - 2
134 visible: isSearchField
135 }
136
137 HiFiGlyphs {
138 text: hifi.glyphs.error
139 color: textColor
140 size: 40
141 anchors.right: parent.right
142 anchors.rightMargin: hifi.dimensions.textPadding - 2
143 anchors.verticalCenter: parent.verticalCenter
144 visible: hasClearButton && textField.text !== "";
145
146 MouseArea {
147 anchors.fill: parent;
148 onClicked: {
149 textField.text = "";
150 }
151 }
152 }
153 }
154 placeholderTextColor: isFaintGrayColorScheme ? hifi.colors.lightGrayText : hifi.colors.lightGray
155 selectedTextColor: hifi.colors.black
156 selectionColor: hifi.colors.primaryHighlight
157 padding.left: hasRoundedBorder ? textField.height / 2 : ((isSearchField || textField.leftPermanentGlyph !== "") ? textField.height - 2 : 0) + hifi.dimensions.textPadding
158 padding.right: (hasClearButton ? textField.height - 2 : 0) + hifi.dimensions.textPadding
159 }
160
161 HifiControls.Label {
162 id: textFieldLabel
163 text: textField.label
164 colorScheme: textField.colorScheme
165 anchors.left: parent.left
166
167 Binding on anchors.right {
168 when: textField.right
169 value: textField.right
170 }
171 Binding on wrapMode {
172 when: textField.right
173 value: Text.WordWrap
174 }
175
176 anchors.bottom: parent.top
177 anchors.bottomMargin: 3
178 visible: label != ""
179 }
180}4}
interface/resources/qml/controls-uit/ToolTip.qml+3−50
@@ -1,51 +1,4 @@
1//1import controlsUit 1.0
2// ToolTip.qml
3//
4// Created by Clement on 9/12/17
5// Copyright 2017 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53ToolTip {
12 4}
13Item {
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/controls-uit/Tree.qml+2−203
@@ -1,205 +1,4 @@
1//1import controlsUit 1.0
2// Tree.qml
3//
4// Created by David Rowe on 17 Feb 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQml.Models 2.23Tree {
12import QtQuick 2.7
13import QtQuick.Controls 1.4
14import QtQuick.Controls.Styles 1.4
15import QtQuick.Controls 2.2 as QQC2
16
17
18import "../styles-uit"
19
20TreeView {
21 id: treeView
22
23 property var treeModel: ListModel { }
24 property bool centerHeaderText: false
25 property int colorScheme: hifi.colorSchemes.light
26 readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light
27
28 property var modifyEl: function(index, data) { return false; }
29
30 model: treeModel
31 selection: ItemSelectionModel {
32 id: selectionModel
33 model: treeModel
34 }
35
36 anchors { left: parent.left; right: parent.right }
37
38 headerVisible: false
39
40 Component.onCompleted: {
41 if (flickableItem !== null && flickableItem !== undefined) {
42 treeView.flickableItem.QQC2.ScrollBar.vertical = scrollbar
43 }
44 }
45
46 QQC2.ScrollBar {
47 id: scrollbar
48 parent: treeView.flickableItem
49 policy: QQC2.ScrollBar.AsNeeded
50 orientation: Qt.Vertical
51 visible: size < 1.0
52 topPadding: treeView.headerVisible ? hifi.dimensions.tableHeaderHeight + 1 : 1
53 anchors.top: treeView.top
54 anchors.left: treeView.right
55 anchors.bottom: treeView.bottom
56
57 background: Item {
58 implicitWidth: hifi.dimensions.scrollbarBackgroundWidth
59 Rectangle {
60 anchors {
61 fill: parent;
62 topMargin: treeView.headerVisible ? hifi.dimensions.tableHeaderHeight: 0
63 }
64 color: isLightColorScheme ? hifi.colors.tableScrollBackgroundLight
65 : hifi.colors.tableScrollBackgroundDark
66 }
67 }
68
69 contentItem: Item {
70 implicitWidth: hifi.dimensions.scrollbarHandleWidth
71 Rectangle {
72 anchors.fill: parent
73 radius: (width - 4)/2
74 color: isLightColorScheme ? hifi.colors.tableScrollHandleLight : hifi.colors.tableScrollHandleDark
75 }
76 }
77 }
78
79 // Use rectangle to draw border with rounded corners.
80 frameVisible: false
81 Rectangle {
82 color: "#00000000"
83 anchors.fill: parent
84 radius: hifi.dimensions.borderRadius
85 border.color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight
86 border.width: 2
87 anchors.margins: -2
88 }
89 anchors.margins: 2 // Shrink TreeView to lie within border.
90
91 backgroundVisible: true
92
93 horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
94 verticalScrollBarPolicy: Qt.ScrollBarAlwaysOff
95
96 style: TreeViewStyle {
97 // Needed in order for rows to keep displaying rows after end of table entries.
98 backgroundColor: parent.isLightColorScheme ? hifi.colors.tableRowLightEven : hifi.colors.tableRowDarkEven
99 alternateBackgroundColor: parent.isLightColorScheme ? hifi.colors.tableRowLightOdd : hifi.colors.tableRowDarkOdd
100
101 headerDelegate: Rectangle {
102 height: hifi.dimensions.tableHeaderHeight
103 color: isLightColorScheme ? hifi.colors.tableBackgroundLight : hifi.colors.tableBackgroundDark
104
105 RalewayRegular {
106 id: titleText
107 text: styleData.value
108 size: hifi.fontSizes.tableHeading
109 font.capitalization: Font.AllUppercase
110 color: hifi.colors.baseGrayHighlight
111 horizontalAlignment: (centerHeaderText ? Text.AlignHCenter : Text.AlignLeft)
112 elide: Text.ElideRight
113 anchors {
114 left: parent.left
115 leftMargin: hifi.dimensions.tablePadding
116 right: sortIndicatorVisible && sortIndicatorColumn === styleData.column ? titleSort.left : parent.right
117 rightMargin: hifi.dimensions.tablePadding
118 verticalCenter: parent.verticalCenter
119 }
120 }
121
122 HiFiGlyphs {
123 id: titleSort
124 text: sortIndicatorOrder == Qt.AscendingOrder ? hifi.glyphs.caratUp : hifi.glyphs.caratDn
125 color: isLightColorScheme ? hifi.colors.darkGray : hifi.colors.baseGrayHighlight
126 opacity: 0.6;
127 size: hifi.fontSizes.tableHeadingIcon
128 anchors {
129 right: parent.right
130 verticalCenter: titleText.verticalCenter
131 }
132 visible: sortIndicatorVisible && sortIndicatorColumn === styleData.column
133 }
134
135 Rectangle {
136 width: 1
137 anchors {
138 left: parent.left
139 top: parent.top
140 topMargin: 1
141 bottom: parent.bottom
142 bottomMargin: 2
143 }
144 color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight
145 visible: styleData.column > 0
146 }
147
148 Rectangle {
149 height: 1
150 anchors {
151 left: parent.left
152 right: parent.right
153 bottom: parent.bottom
154 }
155 color: isLightColorScheme ? hifi.colors.lightGrayText : hifi.colors.baseGrayHighlight
156 }
157 }
158
159 branchDelegate: HiFiGlyphs {
160 text: styleData.isExpanded ? hifi.glyphs.caratDn : hifi.glyphs.caratR
161 size: hifi.fontSizes.carat
162 color: colorScheme == hifi.colorSchemes.light
163 ? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight)
164 : (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText)
165 anchors {
166 left: parent ? parent.left : undefined
167 leftMargin: hifi.dimensions.tablePadding / 2
168 }
169 }
170 }
171
172 rowDelegate: Rectangle {
173 height: hifi.dimensions.tableRowHeight
174 color: styleData.selected
175 ? hifi.colors.primaryHighlight
176 : treeView.isLightColorScheme
177 ? (styleData.alternate ? hifi.colors.tableRowLightEven : hifi.colors.tableRowLightOdd)
178 : (styleData.alternate ? hifi.colors.tableRowDarkEven : hifi.colors.tableRowDarkOdd)
179 }
180
181 itemDelegate: FiraSansSemiBold {
182 anchors {
183 left: parent ? parent.left : undefined
184 leftMargin: (2 + styleData.depth) * hifi.dimensions.tablePadding
185 right: parent ? parent.right : undefined
186 rightMargin: hifi.dimensions.tablePadding
187 verticalCenter: parent ? parent.verticalCenter : undefined
188 }
189
190 text: styleData.value
191 size: hifi.fontSizes.tableText
192 color: colorScheme == hifi.colorSchemes.light
193 ? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight)
194 : (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText)
195
196 elide: Text.ElideRight
197 }
198
199 Item {
200 id: unfocusHelper
201 visible: false
202 }
203
204 onDoubleClicked: isExpanded(index) ? collapse(index) : expand(index)
205}4}
interface/resources/qml/controls-uit/VerticalSpacer.qml+2−19
@@ -1,21 +1,4 @@
1//1import controlsUit 1.0
2// VerticalSpacer.qml
3//
4// Created by David Rowe on 16 Feb 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53VerticalSpacer {
12
13import "../styles-uit"
14
15Item {
16 id: root
17 property alias size: root.height
18
19 width: 1 // Must be non-zero
20 height: hifi.dimensions.controlInterlineHeight
21}4}
interface/resources/qml/controls-uit/WebGlyphButton.qml+2−38
@@ -1,40 +1,4 @@
1//1import controlsUit 1.0
2// GlyphButton.qml
3//
4// Created by Vlad Stelmahovsky on 2017-06-21
5// Copyright 2017 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53WebGlyphButton {
12import QtQuick.Controls 2.2 as Original
13
14import "../styles-uit"
15
16Original.Button {
17 id: control
18
19 property int colorScheme: hifi.colorSchemes.light
20 property string glyph: ""
21 property int size: 32
22 //colors
23 readonly property color normalColor: "#AFAFAF"
24 readonly property color hoverColor: "#00B4EF"
25 readonly property color clickedColor: "#FFFFFF"
26 readonly property color disabledColor: "#575757"
27
28 background: Item {}
29
30 contentItem: HiFiGlyphs {
31 color: control.enabled ? (control.pressed ? control.clickedColor :
32 (control.hovered ? control.hoverColor : control.normalColor)) :
33 control.disabledColor
34 verticalAlignment: Text.AlignVCenter
35 horizontalAlignment: Text.AlignHCenter
36 text: control.glyph
37 size: control.size
38 }
39}4}
40
interface/resources/qml/controls-uit/WebSpinner.qml+2−22
@@ -1,24 +1,4 @@
1//1import controlsUit 1.0
2// WebSpinner.qml
3//
4// Created by David Rowe on 23 May 2017
5// Copyright 2017 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53WebSpinner {
12import QtWebEngine 1.5
13
14AnimatedImage {
15 property WebEngineView webview: parent
16 source: "../../icons/loader-snake-64-w.gif"
17 visible: webview.loading && /^(http.*|)$/i.test(webview.url.toString())
18 playing: visible
19 z: 10000
20 anchors {
21 horizontalCenter: parent.horizontalCenter
22 verticalCenter: parent.verticalCenter
23 }
24}4}
interface/resources/qml/controls-uit/WebView.qml+2−19
@@ -1,21 +1,4 @@
1//1import controlsUit 1.0
2// WebView.qml
3//
4// Created by Bradley Austin Davis on 12 Jan 2016
5// Copyright 2016 High Fidelity, Inc.
6//
7// Distributed under the Apache License, Version 2.0.
8// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9//
10 2
11import QtQuick 2.53WebView {
12import "."
13
14BaseWebView {
15 onNewViewRequested: {
16 // Load dialog via OffscreenUi so that JavaScript EventBridge is available.
17 var browser = OffscreenUi.load("Browser.qml");
18 request.openIn(browser.webView);
19 browser.webView.forceActiveFocus();
20 }
21}4}
interface/resources/qml/controls-uit/readme.txt+1−0
@@ -0,0 +1 @@
1this 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
3 3
4import "."4import "."
5import "../styles"5import "../styles"
6import "../controls-uit"
7 6
8Original.Button {7Original.Button {
9 id: control8 id: control
interface/resources/qml/controls/FlickableWebViewCore.qml+1−1
@@ -4,7 +4,7 @@ import QtWebChannel 1.0 · 3 unmodified lines
4 4
5import QtQuick.Controls 2.25import QtQuick.Controls 2.2
6 6
7import "../styles-uit" as StylesUIt7import stylesUit 1.0 as StylesUIt
8 8
9Item {9Item {
10 id: flick10 id: flick
interface/resources/qml/controls/TabletWebButton.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
10 10
11import Hifi 1.011import Hifi 1.0
12import QtQuick 2.412import QtQuick 2.4
13import "../styles-uit"13import stylesUit 1.0
14 14
15Rectangle {15Rectangle {
16 property alias text: label.text16 property alias text: label.text
interface/resources/qml/controls/TabletWebScreen.qml+1−1
@@ -1,5 +1,5 @@
1import QtQuick 2.71import QtQuick 2.7
2import "../controls-uit" as HiFiControls2import controlsUit 1.0 as HiFiControls
3 3
4Item {4Item {
5 id: root5 id: root
interface/resources/qml/controls/TabletWebView.qml+6−2
@@ -1,8 +1,8 @@
1import QtQuick 2.71import QtQuick 2.7
2import QtWebEngine 1.52import QtWebEngine 1.5
3import "../controls-uit" as HiFiControls3import controlsUit 1.0 as HiFiControls
4import "../styles" as HifiStyles4import "../styles" as HifiStyles
5import "../styles-uit"5import stylesUit 1.0
6 6
7Item {7Item {
8 id: root8 id: root
@@ -195,6 +195,10 @@ Item { · 186 unmodified lines
195 keyboardEnabled = HMD.active;195 keyboardEnabled = HMD.active;
196 }196 }
197 197
198 Component.onDestruction: {
199 keyboardRaised = false;
200 }
201
198 Keys.onPressed: {202 Keys.onPressed: {
199 switch(event.key) {203 switch(event.key) {
200 case Qt.Key_L:204 case Qt.Key_L:
interface/resources/qml/controls/WebView.qml+1−1
@@ -1,5 +1,5 @@
1import QtQuick 2.71import QtQuick 2.7
2import "../controls-uit" as HiFiControls2import controlsUit 1.0 as HiFiControls
3 3
4Item {4Item {
5 width: parent !== null ? parent.width : undefined5 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 @@
1//1//
2// ImageButton.qml2// ImageButton.qml
3// interface/resources/qml/controls-uit3// interface/resources/qml/controlsUit
4//4//
5// Created by Gabriel Calero & Cristian Duarte on 12 Oct 20175// Created by Gabriel Calero & Cristian Duarte on 12 Oct 2017
6// Copyright 2017 High Fidelity, Inc.6// Copyright 2017 High Fidelity, Inc.
@@ -11,7 +11,7 @@ · 4 unmodified lines
11 11
12import QtQuick 2.512import QtQuick 2.5
13import QtQuick.Layouts 1.313import QtQuick.Layouts 1.3
14import "../styles-uit" as HifiStyles14import "../stylesUit" as HifiStyles
15 15
16Item {16Item {
17 id: button17 id: button
@@ -79,4 +79,4 @@ Item { · 61 unmodified lines
79 }79 }
80 }80 }
81 ]81 ]
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
11import QtQuick 2.5
12import QtQuick.Controls 1.4
13import QtQuick.Controls.Styles 1.4
14import QtQuick.XmlListModel 2.0
15
16import "../stylesUit"
17import "." as HifiControls
18import "../windows"
19import "../hifi/models"
20
21TableView {
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
11import QtQuick 2.7
12import QtWebEngine 1.5
13
14WebEngineView {
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
11import QtQuick 2.7
12import QtQuick.Controls 2.3 as Original
13import TabletScriptingInterface 1.0
14
15import "../stylesUit"
16
17Original.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
11import QtQuick 2.2
12import QtQuick.Controls 2.2 as Original
13
14import "../stylesUit"
15
16import TabletScriptingInterface 1.0
17
18Original.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
11import QtQuick 2.7
12import QtQuick.Controls 2.2
13
14import "../stylesUit"
15import "." as HiFiControls
16import TabletScriptingInterface 1.0
17
18CheckBox {
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
11import QtQuick 2.7
12import QtQuick.Controls 2.2
13
14import "../stylesUit"
15import "." as HifiControls
16
17FocusScope {
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
11import QtQuick 2.5
12import QtGraphicalEffects 1.0
13
14import "../stylesUit"
15
16Column {
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
11import QtQuick 2.9
12import QtQuick.Controls 2.2
13import QtGraphicalEffects 1.0
14
15import "../stylesUit"
16import "." as HifiControls
17
18Item {
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
11import QtQuick 2.7
12import QtQuick.Controls 2.2 as Original
13import TabletScriptingInterface 1.0
14
15import "../stylesUit"
16
17Original.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
11import QtQuick 2.5
12
13Rectangle {
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
11import QtQuick 2.5
12
13import "../stylesUit"
14
15Item {
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
11import QtQuick 2.5
12import "../stylesUit"
13
14Item {
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 @@
1import QtQuick 2.0
2import TabletScriptingInterface 1.0
3
4Item {
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
11import QtQuick 2.7
12import QtGraphicalEffects 1.0
13import "."
14
15Rectangle {
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
11import QtQuick 2.7
12
13import "../stylesUit"
14
15RalewaySemiBold {
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
11import QtQuick 2.5
12
13import "../stylesUit"
14import "." as HifiControls
15
16HifiControls.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
11import QtQuick 2.5
12import QtQuick.Controls 2.2 as Original
13
14import "../stylesUit"
15import "." as HifiControls
16
17import TabletScriptingInterface 1.0
18
19Original.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
11import QtQuick 2.7
12import QtQuick.Controls 2.2
13
14import "../stylesUit"
15
16ScrollBar {
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
11import QtQuick 2.5
12import "../stylesUit"
13
14Item {
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
11import QtQuick 2.7
12import QtQuick.Controls 2.2
13
14import "../stylesUit"
15import "." as HifiControls
16
17Slider {
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
11import QtQuick 2.7
12import QtQuick.Controls 2.2
13
14import "../stylesUit"
15import "." as HifiControls
16
17SpinBox {
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
11import QtQuick 2.7
12import QtQuick.Controls 2.2 as Original
13
14import "../stylesUit"
15
16Item {
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
11import QtQuick 2.5
12import QtQuick.Controls 1.4
13import QtQuick.Controls.Styles 1.4
14import QtQuick.Controls 2.3 as QQC2
15
16import "../stylesUit"
17
18TableView {
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
11import QtQuick 2.5
12import QtGraphicalEffects 1.0
13
14import "../stylesUit"
15
16Column {
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
11import QtQuick 2.5
12
13import "../stylesUit"
14
15Rectangle {
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
11import QtQuick 2.5
12
13import "../stylesUit"
14import "." as HifiControls
15
16Item {
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
11import QtQuick 2.5
12import "../stylesUit"
13
14TextEdit {
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
11import QtQuick 2.5
12import QtQuick.Controls 1.4
13import QtQuick.Controls.Styles 1.4
14
15import "../stylesUit"
16import "." as HifiControls
17
18TextField {
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
11import QtQuick 2.5
12
13Item {
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
11import QtQml.Models 2.2
12import QtQuick 2.7
13import QtQuick.Controls 1.4
14import QtQuick.Controls.Styles 1.4
15import QtQuick.Controls 2.2 as QQC2
16
17
18import "../stylesUit"
19
20TreeView {
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
11import QtQuick 2.5
12
13import "../stylesUit"
14
15Item {
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
11import QtQuick 2.5
12import QtQuick.Controls 2.2 as Original
13
14import "../stylesUit"
15
16Original.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
11import QtQuick 2.5
12import QtWebEngine 1.5
13
14AnimatedImage {
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
11import QtQuick 2.5
12import "."
13
14BaseWebView {
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
6CheckBoxQQC2 1.0 CheckBoxQQC2.qml6CheckBoxQQC2 1.0 CheckBoxQQC2.qml
7ComboBox 1.0 ComboBox.qml7ComboBox 1.0 ComboBox.qml
8ContentSection 1.0 ContentSection.qml8ContentSection 1.0 ContentSection.qml
9FilterBar 1.0 FilterBar.qml
9GlyphButton 1.0 GlyphButton.qml10GlyphButton 1.0 GlyphButton.qml
10HorizontalRule 1.0 HorizontalRule.qml11HorizontalRule 1.0 HorizontalRule.qml
11HorizontalSpacer 1.0 HorizontalSpacer.qml12HorizontalSpacer 1.0 HorizontalSpacer.qml
@@ -15,6 +16,7 @@ Keyboard 1.0 Keyboard.qml · 3 unmodified lines
15Label 1.0 Label.qml16Label 1.0 Label.qml
16QueuedButton 1.0 QueuedButton.qml17QueuedButton 1.0 QueuedButton.qml
17RadioButton 1.0 RadioButton.qml18RadioButton 1.0 RadioButton.qml
19ScrollBar 1.0 ScrollBar.qml
18Separator 1.0 Separator.qml20Separator 1.0 Separator.qml
19Slider 1.0 Slider.qml21Slider 1.0 Slider.qml
20SpinBox 1.0 SpinBox.qml22SpinBox 1.0 SpinBox.qml
interface/resources/qml/dialogs/AssetDialog.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12import Qt.labs.settings 1.012import Qt.labs.settings 1.0
13 13
14import "../styles-uit"14import stylesUit 1.0
15import "../windows"15import "../windows"
16 16
17import "assetDialog"17import "assetDialog"
interface/resources/qml/dialogs/CustomQueryDialog.qml+2−2
@@ -12,8 +12,8 @@ import QtQuick 2.7; · 11 unmodified lines
12import QtQuick.Dialogs 1.2 as OriginalDialogs;12import QtQuick.Dialogs 1.2 as OriginalDialogs;
13import QtQuick.Controls 2.313import QtQuick.Controls 2.3
14 14
15import "../controls-uit";15import controlsUit 1.0
16import "../styles-uit";16import stylesUit 1.0
17import "../windows";17import "../windows";
18 18
19ModalWindow {19ModalWindow {
interface/resources/qml/dialogs/FileDialog.qml+2−2
@@ -16,8 +16,8 @@ import QtQuick.Controls 1.4 as QQC1 · 15 unmodified lines
16import QtQuick.Controls 2.316import QtQuick.Controls 2.3
17 17
18import ".."18import ".."
19import "../controls-uit"19import controlsUit 1.0
20import "../styles-uit"20import stylesUit 1.0
21import "../windows"21import "../windows"
22 22
23import "fileDialog"23import "fileDialog"
interface/resources/qml/dialogs/MessageDialog.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12import QtQuick.Dialogs 1.2 as OriginalDialogs12import QtQuick.Dialogs 1.2 as OriginalDialogs
13 13
14import "../controls-uit"14import controlsUit 1.0
15import "../styles-uit"15import stylesUit 1.0
16import "../windows"16import "../windows"
17 17
18import "messageDialog"18import "messageDialog"
interface/resources/qml/dialogs/PreferencesDialog.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
10 10
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../controls-uit" as HifiControls13import controlsUit 1.0 as HifiControls
14import "../styles-uit"14import stylesUit 1.0
15import "../windows"15import "../windows"
16import "preferences"16import "preferences"
17 17
interface/resources/qml/dialogs/QueryDialog.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
11import QtQuick 2.711import QtQuick 2.7
12import QtQuick.Controls 2.312import QtQuick.Controls 2.3
13 13
14import "../controls-uit"14import controlsUit 1.0
15import "../styles-uit"15import stylesUit 1.0
16import "../windows"16import "../windows"
17 17
18ModalWindow {18ModalWindow {
interface/resources/qml/dialogs/TabletAssetDialog.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
10 10
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../styles-uit"13import stylesUit 1.0
14import "../windows"14import "../windows"
15 15
16import "assetDialog"16import "assetDialog"
interface/resources/qml/dialogs/TabletCustomQueryDialog.qml+2−2
@@ -12,8 +12,8 @@ import QtQuick 2.7 · 11 unmodified lines
12import QtQuick.Dialogs 1.2 as OriginalDialogs12import QtQuick.Dialogs 1.2 as OriginalDialogs
13import QtQuick.Controls 2.313import QtQuick.Controls 2.3
14 14
15import "../controls-uit"15import controlsUit 1.0
16import "../styles-uit"16import stylesUit 1.0
17import "../windows"17import "../windows"
18 18
19TabletModalWindow {19TabletModalWindow {
interface/resources/qml/dialogs/TabletFileDialog.qml+2−2
@@ -16,8 +16,8 @@ import QtQuick.Controls 1.4 as QQC1 · 15 unmodified lines
16import QtQuick.Controls 2.316import QtQuick.Controls 2.3
17 17
18import ".."18import ".."
19import "../controls-uit"19import controlsUit 1.0
20import "../styles-uit"20import stylesUit 1.0
21import "../windows"21import "../windows"
22 22
23import "fileDialog"23import "fileDialog"
interface/resources/qml/dialogs/TabletLoginDialog.qml+22−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
11import Hifi 1.011import Hifi 1.0
12import QtQuick 2.512import QtQuick 2.5
13 13
14import "../controls-uit"14import controlsUit 1.0
15import "../styles-uit"15import stylesUit 1.0
16import "../windows"16import "../windows"
17 17
18import "../LoginDialog"18import "../LoginDialog"
@@ -95,6 +95,18 @@ TabletModalWindow { · 76 unmodified lines
95 }95 }
96 }96 }
97 97
98 Timer {
99 id: keyboardTimer
100 repeat: false
101 interval: 200
102
103 onTriggered: {
104 if (MenuInterface.isOptionChecked("Use 3D Keyboard")) {
105 KeyboardScriptingInterface.raised = true;
106 }
107 }
108 }
109
98 TabletModalFrame {110 TabletModalFrame {
99 id: mfRoot111 id: mfRoot
100 112
@@ -127,6 +139,14 @@ TabletModalWindow { · 26 unmodified lines
127 }139 }
128 }140 }
129 141
142 Component.onDestruction: {
143 loginKeyboard.raised = false;
144 }
145
146 Component.onCompleted: {
147 keyboardTimer.start();
148 }
149
130 Keyboard {150 Keyboard {
131 id: loginKeyboard151 id: loginKeyboard
132 raised: root.keyboardEnabled && root.keyboardRaised152 raised: root.keyboardEnabled && root.keyboardRaised
interface/resources/qml/dialogs/TabletMessageBox.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12import QtQuick.Dialogs 1.2 as OriginalDialogs12import QtQuick.Dialogs 1.2 as OriginalDialogs
13 13
14import "../controls-uit"14import controlsUit 1.0
15import "../styles-uit"15import stylesUit 1.0
16import "../windows"16import "../windows"
17 17
18import "messageDialog"18import "messageDialog"
interface/resources/qml/dialogs/TabletQueryDialog.qml+2−2
@@ -12,8 +12,8 @@ import QtQuick 2.7 · 11 unmodified lines
12import QtQuick.Dialogs 1.2 as OriginalDialogs12import QtQuick.Dialogs 1.2 as OriginalDialogs
13import QtQuick.Controls 2.313import QtQuick.Controls 2.3
14 14
15import "../controls-uit"15import controlsUit 1.0
16import "../styles-uit"16import stylesUit 1.0
17import "../windows"17import "../windows"
18 18
19TabletModalWindow {19TabletModalWindow {
interface/resources/qml/dialogs/assetDialog/AssetDialogContent.qml+2−2
@@ -12,8 +12,8 @@ import QtQuick 2.7 · 11 unmodified lines
12import QtQuick.Controls 2.312import QtQuick.Controls 2.3
13import QtQuick.Controls 1.5 as QQC113import QtQuick.Controls 1.5 as QQC1
14 14
15import "../../controls-uit"15import controlsUit 1.0
16import "../../styles-uit"16import stylesUit 1.0
17 17
18import "../fileDialog"18import "../fileDialog"
19 19
interface/resources/qml/dialogs/fileDialog/FileTypeSelection.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
10 10
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../../controls-uit"13import controlsUit 1.0
14 14
15ComboBox {15ComboBox {
16 id: root16 id: root
interface/resources/qml/dialogs/messageDialog/MessageDialogButton.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12import QtQuick.Dialogs 1.212import QtQuick.Dialogs 1.2
13 13
14import "../../controls-uit"14import controlsUit 1.0
15 15
16Button {16Button {
17 property var dialog;17 property var dialog;
interface/resources/qml/dialogs/preferences/AvatarPreference.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
10 10
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../../controls-uit"13import controlsUit 1.0
14import "../../hifi/tablet/tabletWindows/preferences"14import "../../hifi/tablet/tabletWindows/preferences"
15 15
16Preference {16Preference {
interface/resources/qml/dialogs/preferences/BrowsablePreference.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../../dialogs"13import "../../dialogs"
14import "../../controls-uit"14import controlsUit 1.0
15 15
16Preference {16Preference {
17 id: root17 id: root
interface/resources/qml/dialogs/preferences/ButtonPreference.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12import TabletScriptingInterface 1.012import TabletScriptingInterface 1.0
13 13
14import "../../controls-uit"14import controlsUit 1.0
15 15
16Preference {16Preference {
17 id: root17 id: root
interface/resources/qml/dialogs/preferences/CheckBoxPreference.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12import TabletScriptingInterface 1.012import TabletScriptingInterface 1.0
13 13
14import "../../controls-uit"14import controlsUit 1.0
15 15
16Preference {16Preference {
17 id: root17 id: root
interface/resources/qml/dialogs/preferences/ComboBoxPreference.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
10 10
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../../controls-uit" as HiFiControls13import controlsUit 1.0 as HiFiControls
14import "../../styles-uit"14import stylesUit 1.0
15 15
16Preference {16Preference {
17 id: root17 id: root
interface/resources/qml/dialogs/preferences/EditablePreference.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../../dialogs"13import "../../dialogs"
14import "../../controls-uit"14import controlsUit 1.0
15 15
16Preference {16Preference {
17 id: root17 id: root
interface/resources/qml/dialogs/preferences/PrimaryHandPreference.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
10 10
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../../controls-uit"13import controlsUit 1.0
14 14
15Preference {15Preference {
16 id: root16 id: root
interface/resources/qml/dialogs/preferences/RadioButtonsPreference.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
10 10
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../../controls-uit"13import controlsUit 1.0
14import "../../styles-uit"14import stylesUit 1.0
15 15
16Preference {16Preference {
17 id: root17 id: root
interface/resources/qml/dialogs/preferences/Section.qml+2−2
@@ -12,8 +12,8 @@ import QtQuick 2.5 · 11 unmodified lines
12import QtQuick.Controls 1.412import QtQuick.Controls 1.4
13import Hifi 1.013import Hifi 1.0
14 14
15import "../../controls-uit" as HiFiControls15import controlsUit 1.0 as HiFiControls
16import "../../styles-uit"16import stylesUit 1.0
17import "."17import "."
18 18
19Preference {19Preference {
interface/resources/qml/dialogs/preferences/SliderPreference.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../../dialogs"13import "../../dialogs"
14import "../../controls-uit"14import controlsUit 1.0
15 15
16Preference {16Preference {
17 id: root17 id: root
interface/resources/qml/dialogs/preferences/SpinBoxPreference.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
10 10
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../../controls-uit"13import controlsUit 1.0
14 14
15Preference {15Preference {
16 id: root16 id: root
interface/resources/qml/dialogs/preferences/SpinnerSliderPreference.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../../dialogs"13import "../../dialogs"
14import "../../controls-uit"14import controlsUit 1.0
15 15
16Preference {16Preference {
17 id: root17 id: root
interface/resources/qml/hifi/+android/ActionBar.qml+2−2
@@ -3,8 +3,8 @@ import QtQuick.Controls 1.4 · 2 unmodified lines
3import QtQuick.Controls.Styles 1.43import QtQuick.Controls.Styles 1.4
4import QtQuick.Layouts 1.34import QtQuick.Layouts 1.3
5import Qt.labs.settings 1.05import Qt.labs.settings 1.0
6import "../../styles-uit"6import stylesUit 1.0
7import "../../controls-uit" as HifiControlsUit7import controlsUit 1.0 as HifiControlsUit
8import "../../controls" as HifiControls8import "../../controls" as HifiControls
9import ".."9import ".."
10 10
interface/resources/qml/hifi/+android/AudioBar.qml+2−2
@@ -3,8 +3,8 @@ import QtQuick.Controls 1.4 · 2 unmodified lines
3import QtQuick.Controls.Styles 1.43import QtQuick.Controls.Styles 1.4
4import QtQuick.Layouts 1.34import QtQuick.Layouts 1.3
5import Qt.labs.settings 1.05import Qt.labs.settings 1.0
6import "../../styles-uit"6import stylesUit 1.0
7import "../../controls-uit" as HifiControlsUit7import controlsUit 1.0 as HifiControlsUit
8import "../../controls" as HifiControls8import "../../controls" as HifiControls
9import ".."9import ".."
10 10
interface/resources/qml/hifi/+android/AvatarOption.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
11 11
12import QtQuick.Layouts 1.312import QtQuick.Layouts 1.3
13import QtQuick 2.513import QtQuick 2.5
14import "../controls-uit" as HifiControlsUit14import controlsUit 1.0 as HifiControlsUit
15 15
16ColumnLayout {16ColumnLayout {
17 id: itemRoot17 id: itemRoot
interface/resources/qml/hifi/+android/StatsBar.qml+2−2
@@ -3,8 +3,8 @@ import QtQuick.Controls 1.4 · 2 unmodified lines
3import QtQuick.Controls.Styles 1.43import QtQuick.Controls.Styles 1.4
4import QtQuick.Layouts 1.34import QtQuick.Layouts 1.3
5import Qt.labs.settings 1.05import Qt.labs.settings 1.0
6import "../../styles-uit"6import stylesUit 1.0
7import "../../controls-uit" as HifiControlsUit7import controlsUit 1.0 as HifiControlsUit
8import "../../controls" as HifiControls8import "../../controls" as HifiControls
9import ".."9import ".."
10 10
interface/resources/qml/hifi/+android/WindowHeader.qml+2−2
@@ -16,8 +16,8 @@ import QtQuick.Layouts 1.3 · 15 unmodified lines
16import Qt.labs.settings 1.016import Qt.labs.settings 1.0
17import "."17import "."
18import "../styles" as HifiStyles18import "../styles" as HifiStyles
19import "../styles-uit"19import stylesUit 1.0
20import "../controls-uit" as HifiControlsUit20import controlsUit 1.0 as HifiControlsUit
21import "../controls" as HifiControls21import "../controls" as HifiControls
22import ".."22import ".."
23 23
interface/resources/qml/hifi/+android/bottomHudOptions.qml+2−2
@@ -16,8 +16,8 @@ import QtQuick.Controls.Styles 1.4 · 15 unmodified lines
16import QtQuick.Layouts 1.316import QtQuick.Layouts 1.3
17import Qt.labs.settings 1.017import Qt.labs.settings 1.0
18import "../../styles" as HifiStyles18import "../../styles" as HifiStyles
19import "../../styles-uit"19import stylesUit 1.0
20import "../../controls-uit" as HifiControlsUit20import controlsUit 1.0 as HifiControlsUit
21import "../../controls" as HifiControls21import "../../controls" as HifiControls
22import ".."22import ".."
23import "."23import "."
interface/resources/qml/hifi/+android/modesbar.qml+2−2
@@ -3,8 +3,8 @@ import QtQuick.Controls 1.4 · 2 unmodified lines
3import QtQuick.Controls.Styles 1.43import QtQuick.Controls.Styles 1.4
4import QtQuick.Layouts 1.34import QtQuick.Layouts 1.3
5import Qt.labs.settings 1.05import Qt.labs.settings 1.0
6import "../../styles-uit"6import stylesUit 1.0
7import "../../controls-uit" as HifiControlsUit7import controlsUit 1.0 as HifiControlsUit
8import "../../controls" as HifiControls8import "../../controls" as HifiControls
9import ".."9import ".."
10 10
interface/resources/qml/hifi/AssetServer.qml+2−2
@@ -14,8 +14,8 @@ import QtQuick.Controls.Styles 1.4 · 13 unmodified lines
14import QtQuick.Dialogs 1.2 as OriginalDialogs14import QtQuick.Dialogs 1.2 as OriginalDialogs
15import Qt.labs.settings 1.015import Qt.labs.settings 1.0
16 16
17import "../styles-uit"17import stylesUit 1.0
18import "../controls-uit" as HifiControls18import controlsUit 1.0 as HifiControls
19import "../windows" as Windows19import "../windows" as Windows
20import "../dialogs"20import "../dialogs"
21 21
interface/resources/qml/hifi/AvatarApp.qml+11−4
@@ -3,8 +3,8 @@ import QtQuick.Controls 2.2 · 2 unmodified lines
3import QtQuick.Layouts 1.33import QtQuick.Layouts 1.3
4import QtQml.Models 2.14import QtQml.Models 2.1
5import QtGraphicalEffects 1.05import QtGraphicalEffects 1.0
6import "../controls-uit" as HifiControls6import controlsUit 1.0 as HifiControls
7import "../styles-uit"7import stylesUit 1.0
8import "avatarapp"8import "avatarapp"
9 9
10Rectangle {10Rectangle {
@@ -19,7 +19,7 @@ Rectangle { · 8 unmodified lines
19 HifiControls.Keyboard {19 HifiControls.Keyboard {
20 id: keyboard20 id: keyboard
21 z: 100021 z: 1000
22 raised: parent.keyboardEnabled && parent.keyboardRaised22 raised: parent.keyboardEnabled && parent.keyboardRaised && HMD.active
23 numeric: parent.punctuationMode23 numeric: parent.punctuationMode
24 anchors {24 anchors {
25 left: parent.left25 left: parent.left
@@ -204,7 +204,8 @@ Rectangle { · 178 unmodified lines
204 204
205 property bool isInManageState: false205 property bool isInManageState: false
206 206
207 Component.onCompleted: {207 Component.onDestruction: {
208 keyboard.raised = false;
208 }209 }
209 210
210 AvatarAppStyle {211 AvatarAppStyle {
@@ -235,6 +236,8 @@ Rectangle { · 24 unmodified lines
235 avatarIconVisible: mainPageVisible236 avatarIconVisible: mainPageVisible
236 settingsButtonVisible: mainPageVisible237 settingsButtonVisible: mainPageVisible
237 onSettingsClicked: {238 onSettingsClicked: {
239 displayNameInput.focus = false;
240 root.keyboardRaised = false;
238 settings.open(currentAvatarSettings, currentAvatar.avatarScale);241 settings.open(currentAvatarSettings, currentAvatar.avatarScale);
239 }242 }
240 }243 }
@@ -344,6 +347,10 @@ Rectangle { · 103 unmodified lines
344 emitSendToScript({'method' : 'changeDisplayName', 'displayName' : text})347 emitSendToScript({'method' : 'changeDisplayName', 'displayName' : text})
345 focus = false;348 focus = false;
346 }349 }
350
351 onFocusChanged: {
352 root.keyboardRaised = focus;
353 }
347 }354 }
348 355
349 ShadowImage {356 ShadowImage {
interface/resources/qml/hifi/Card.qml+1−1
@@ -17,7 +17,7 @@ import QtGraphicalEffects 1.0 · 16 unmodified lines
17import TabletScriptingInterface 1.017import TabletScriptingInterface 1.0
18 18
19import "toolbars"19import "toolbars"
20import "../styles-uit"20import stylesUit 1.0
21 21
22Item {22Item {
23 id: root;23 id: root;
interface/resources/qml/hifi/ComboDialog.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
10//10//
11 11
12import QtQuick 2.512import QtQuick 2.5
13import "../styles-uit"13import stylesUit 1.0
14import "../controls-uit"14import controlsUit 1.0
15 15
16Item {16Item {
17 property var dialogTitleText : "";17 property var dialogTitleText : "";
interface/resources/qml/hifi/Desktop.qml+1−1
@@ -8,7 +8,7 @@ import "../desktop" as OriginalDesktop · 7 unmodified lines
8import ".."8import ".."
9import "."9import "."
10import "./toolbars"10import "./toolbars"
11import "../controls-uit"11import controlsUit 1.0
12 12
13OriginalDesktop.Desktop {13OriginalDesktop.Desktop {
14 id: desktop14 id: desktop
interface/resources/qml/hifi/DesktopLetterboxMessage.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
10//10//
11 11
12import QtQuick 2.512import QtQuick 2.5
13import "../styles-uit"13import stylesUit 1.0
14 14
15Item {15Item {
16 property alias text: popupText.text16 property alias text: popupText.text
interface/resources/qml/hifi/Feed.qml+1−1
@@ -15,7 +15,7 @@ import Hifi 1.0 · 14 unmodified lines
15import QtQuick 2.515import QtQuick 2.5
16import QtGraphicalEffects 1.016import QtGraphicalEffects 1.0
17import "toolbars"17import "toolbars"
18import "../styles-uit"18import stylesUit 1.0
19import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.19import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.
20 20
21Column {21Column {
interface/resources/qml/hifi/LetterboxMessage.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
10//10//
11 11
12import QtQuick 2.512import QtQuick 2.5
13import "../styles-uit"13import stylesUit 1.0
14 14
15Item {15Item {
16 property alias text: popupText.text16 property alias text: popupText.text
interface/resources/qml/hifi/NameCard.qml+2−2
@@ -13,8 +13,8 @@ import QtQuick 2.5 · 12 unmodified lines
13import QtQuick.Controls 1.413import QtQuick.Controls 1.4
14import QtQuick.Controls.Styles 1.414import QtQuick.Controls.Styles 1.4
15import QtGraphicalEffects 1.015import QtGraphicalEffects 1.0
16import "../styles-uit"16import stylesUit 1.0
17import "../controls-uit" as HifiControls17import controlsUit 1.0 as HifiControls
18import "toolbars"18import "toolbars"
19 19
20// references Users, UserActivityLogger, MyAvatar, Vec3, Quat, AddressManager, Account from root context20// 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
15import QtQuick.Controls 1.415import QtQuick.Controls 1.4
16import QtGraphicalEffects 1.016import QtGraphicalEffects 1.0
17import Qt.labs.settings 1.017import Qt.labs.settings 1.0
18import "../styles-uit"18import stylesUit 1.0
19import "../controls-uit" as HifiControlsUit19import controlsUit 1.0 as HifiControlsUit
20import "../controls" as HifiControls20import "../controls" as HifiControls
21import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.21import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.
22 22
interface/resources/qml/hifi/SkyboxChanger.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
10//10//
11 11
12import QtQuick 2.512import QtQuick 2.5
13import "../styles-uit"13import stylesUit 1.0
14import "../controls-uit" as HifiControls14import controlsUit 1.0 as HifiControls
15import QtQuick.Controls 2.215import QtQuick.Controls 2.2
16 16
17Item {17Item {
interface/resources/qml/hifi/SpectatorCamera.qml+2−2
@@ -13,8 +13,8 @@ · 12 unmodified lines
13 13
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.715import QtQuick 2.7
16import "../styles-uit"16import stylesUit 1.0
17import "../controls-uit" as HifiControlsUit17import controlsUit 1.0 as HifiControlsUit
18import "../controls" as HifiControls18import "../controls" as HifiControls
19 19
20// references HMD, XXX from root context20// references HMD, XXX from root context
interface/resources/qml/hifi/TabletTextButton.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
10 10
11import Hifi 1.011import Hifi 1.0
12import QtQuick 2.412import QtQuick 2.4
13import "../styles-uit"13import stylesUit 1.0
14 14
15Rectangle {15Rectangle {
16 property alias text: label.text16 property alias text: label.text
interface/resources/qml/hifi/TextButton.qml+1−1
@@ -9,7 +9,7 @@ · 8 unmodified lines
9//9//
10import Hifi 1.010import Hifi 1.0
11import QtQuick 2.411import QtQuick 2.4
12import "../styles-uit"12import stylesUit 1.0
13 13
14Rectangle {14Rectangle {
15 property alias text: label.text;15 property alias text: label.text;
interface/resources/qml/hifi/WebBrowser.qml+2−2
@@ -18,8 +18,8 @@ import QtGraphicalEffects 1.0 · 17 unmodified lines
18import QtWebEngine 1.518import QtWebEngine 1.5
19import QtWebChannel 1.019import QtWebChannel 1.0
20 20
21import "../styles-uit"21import stylesUit 1.0
22import "../controls-uit" as HifiControls22import controlsUit 1.0 as HifiControls
23import "../windows"23import "../windows"
24import "../controls"24import "../controls"
25 25
interface/resources/qml/hifi/audio/Audio.qml+2−2
@@ -15,8 +15,8 @@ import QtQuick 2.5 · 14 unmodified lines
15import QtQuick.Controls 2.215import QtQuick.Controls 2.2
16import QtQuick.Layouts 1.316import QtQuick.Layouts 1.3
17 17
18import "../../styles-uit"18import stylesUit 1.0
19import "../../controls-uit" as HifiControls19import controlsUit 1.0 as HifiControls
20import "../../windows"20import "../../windows"
21import "./" as AudioControls21import "./" as AudioControls
22 22
interface/resources/qml/hifi/audio/AudioTabButton.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
11 11
12import QtQuick 2.712import QtQuick 2.7
13import QtQuick.Controls 2.213import QtQuick.Controls 2.2
14import "../../controls-uit" as HifiControls14import controlsUit 1.0 as HifiControls
15import "../../styles-uit"15import stylesUit 1.0
16 16
17TabButton {17TabButton {
18 id: control18 id: control
interface/resources/qml/hifi/audio/CheckBox.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
11 11
12import QtQuick 2.712import QtQuick 2.7
13 13
14import "../../controls-uit" as HifiControls14import controlsUit 1.0 as HifiControls
15 15
16HifiControls.CheckBoxQQC2 {16HifiControls.CheckBoxQQC2 {
17 color: "white"17 color: "white"
interface/resources/qml/hifi/audio/PlaySampleSound.qml+2−2
@@ -13,8 +13,8 @@ import QtQuick 2.7 · 12 unmodified lines
13import QtQuick.Controls 2.213import QtQuick.Controls 2.2
14import QtQuick.Layouts 1.314import QtQuick.Layouts 1.3
15 15
16import "../../styles-uit"16import stylesUit 1.0
17import "../../controls-uit" as HifiControls17import controlsUit 1.0 as HifiControls
18 18
19RowLayout {19RowLayout {
20 property var sound: null;20 property var sound: null;
interface/resources/qml/hifi/avatarapp/AdjustWearables.qml+22−7
@@ -1,9 +1,8 @@
1import Hifi 1.0 as Hifi1import Hifi 1.0 as Hifi
2import QtQuick 2.52import QtQuick 2.5
3import QtQuick.Layouts 1.33import QtQuick.Layouts 1.3
4import "../../styles-uit"4import stylesUit 1.0
5import "../../controls-uit" as HifiControlsUit5import controlsUit 1.0 as HifiControlsUit
6import "../../controls" as HifiControls
7 6
8Rectangle {7Rectangle {
9 id: root;8 id: root;
@@ -49,16 +48,32 @@ Rectangle { · 39 unmodified lines
49 refresh(avatar);48 refresh(avatar);
50 }49 }
51 50
51 function extractTitleFromUrl(url) {
52 for (var j = (url.length - 1); j >= 0; --j) {
53 if (url[j] === '/') {
54 return url.substring(j + 1);
55 }
56 }
57 return url;
58 }
59
52 function refresh(avatar) {60 function refresh(avatar) {
53 wearablesCombobox.model.clear();61 wearablesCombobox.model.clear();
54 wearablesCombobox.currentIndex = -1;62 wearablesCombobox.currentIndex = -1;
55 63
56 for (var i = 0; i < avatar.wearables.count; ++i) {64 for (var i = 0; i < avatar.wearables.count; ++i) {
57 var wearable = avatar.wearables.get(i).properties;65 var wearable = avatar.wearables.get(i).properties;
58 for (var j = (wearable.modelURL.length - 1); j >= 0; --j) {66 if (wearable.modelURL) {
59 if (wearable.modelURL[j] === '/') {67 wearable.text = extractTitleFromUrl(wearable.modelURL);
60 wearable.text = wearable.modelURL.substring(j + 1);68 } else if (wearable.materialURL) {
61 break;69 var materialUrlOrJson = '';
70 if (!wearable.materialURL.startsWith('materialData')) {
71 materialUrlOrJson = extractTitleFromUrl(wearable.materialURL);
72 } else if (wearable.materialData) {
73 materialUrlOrJson = JSON.stringify(JSON.parse(wearable.materialData))
74 }
75 if(materialUrlOrJson) {
76 wearable.text = 'Material: ' + materialUrlOrJson;
62 }77 }
63 }78 }
64 wearablesCombobox.model.append(wearable);79 wearablesCombobox.model.append(wearable);
interface/resources/qml/hifi/avatarapp/AvatarAppHeader.qml+1−1
@@ -1,6 +1,6 @@
1import Hifi 1.0 as Hifi1import Hifi 1.0 as Hifi
2import QtQuick 2.52import QtQuick 2.5
3import "../../styles-uit"3import stylesUit 1.0
4 4
5ShadowRectangle {5ShadowRectangle {
6 id: header6 id: header
interface/resources/qml/hifi/avatarapp/AvatarAppStyle.qml+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
10 10
11import QtQuick 2.511import QtQuick 2.5
12import QtQuick.Window 2.212import QtQuick.Window 2.2
13import "../../styles-uit"13import stylesUit 1.0
14 14
15QtObject {15QtObject {
16 readonly property QtObject colors: QtObject {16 readonly property QtObject colors: QtObject {
interface/resources/qml/hifi/avatarapp/AvatarWearablesIndicator.qml+2−2
@@ -1,6 +1,6 @@
1import QtQuick 2.91import QtQuick 2.9
2import "../../controls-uit"2import controlsUit 1.0
3import "../../styles-uit"3import stylesUit 1.0
4 4
5ShadowRectangle {5ShadowRectangle {
6 property int wearablesCount: 06 property int wearablesCount: 0
interface/resources/qml/hifi/avatarapp/BlueButton.qml+2−2
@@ -1,6 +1,6 @@
1import QtQuick 2.51import QtQuick 2.5
2import "../../styles-uit"2import stylesUit 1.0
3import "../../controls-uit" as HifiControlsUit3import controlsUit 1.0 as HifiControlsUit
4 4
5HifiControlsUit.Button {5HifiControlsUit.Button {
6 HifiConstants {6 HifiConstants {
interface/resources/qml/hifi/avatarapp/CreateFavoriteDialog.qml+2−2
@@ -1,7 +1,7 @@
1import Hifi 1.0 as Hifi1import Hifi 1.0 as Hifi
2import QtQuick 2.52import QtQuick 2.5
3import "../../styles-uit"3import stylesUit 1.0
4import "../../controls-uit" as HifiControlsUit4import controlsUit 1.0 as HifiControlsUit
5import "../../controls" as HifiControls5import "../../controls" as HifiControls
6 6
7Rectangle {7Rectangle {
interface/resources/qml/hifi/avatarapp/InputField.qml+2−2
@@ -1,7 +1,7 @@
1import QtQuick 2.51import QtQuick 2.5
2import QtQuick.Controls 2.22import QtQuick.Controls 2.2
3import "../../styles-uit"3import stylesUit 1.0
4import "../../controls-uit" as HifiControlsUit4import controlsUit 1.0 as HifiControlsUit
5 5
6TextField {6TextField {
7 id: textField7 id: textField
interface/resources/qml/hifi/avatarapp/InputTextStyle4.qml+2−2
@@ -1,5 +1,5 @@
1import "../../controls-uit" as HifiControlsUit1import controlsUit 1.0 as HifiControlsUit
2import "../../styles-uit"2import stylesUit 1.0
3 3
4import QtQuick 2.04import QtQuick 2.0
5import QtQuick.Controls 2.25import QtQuick.Controls 2.2
interface/resources/qml/hifi/avatarapp/MessageBox.qml+2−2
@@ -1,7 +1,7 @@
1import Hifi 1.0 as Hifi1import Hifi 1.0 as Hifi
2import QtQuick 2.52import QtQuick 2.5
3import "../../styles-uit"3import stylesUit 1.0
4import "../../controls-uit" as HifiControlsUit4import controlsUit 1.0 as HifiControlsUit
5import "../../controls" as HifiControls5import "../../controls" as HifiControls
6 6
7Rectangle {7Rectangle {
interface/resources/qml/hifi/avatarapp/MessageBoxes.qml+5−5
@@ -63,8 +63,8 @@ MessageBox { · 62 unmodified lines
63 popup.dialogButtons.yesButton.fontCapitalization = Font.MixedCase;63 popup.dialogButtons.yesButton.fontCapitalization = Font.MixedCase;
64 popup.button1text = 'CANCEL'64 popup.button1text = 'CANCEL'
65 popup.titleText = 'Get Wearables'65 popup.titleText = 'Get Wearables'
66 popup.bodyText = 'Buy wearables from <b><a href="app://marketplace">Marketplace.</a></b>' + '<br/>' +66 popup.bodyText = 'Get wearables from <b><a href="app://marketplace">Marketplace.</a></b>' + '<br/>' +
67 'Wear wearable from <b><a href="app://purchases">My Purchases.</a></b>' + '<br/>' + '<br/>' +67 'Wear wearable from <b><a href="app://purchases">Inventory.</a></b>' + '<br/>' + '<br/>' +
68 'Visit “AvatarIsland” to get wearables'68 'Visit “AvatarIsland” to get wearables'
69 69
70 popup.imageSource = getWearablesUrl;70 popup.imageSource = getWearablesUrl;
@@ -89,7 +89,7 @@ MessageBox { · 18 unmodified lines
89 89
90 function showDeleteFavorite(favoriteName, callback) {90 function showDeleteFavorite(favoriteName, callback) {
91 popup.titleText = 'Delete Favorite: {AvatarName}'.replace('{AvatarName}', favoriteName)91 popup.titleText = 'Delete Favorite: {AvatarName}'.replace('{AvatarName}', favoriteName)
92 popup.bodyText = 'This will delete your favorite. You will retain access to the wearables and avatar that made up the favorite from My Purchases.'92 popup.bodyText = 'This will delete your favorite. You will retain access to the wearables and avatar that made up the favorite from Inventory.'
93 popup.imageSource = null;93 popup.imageSource = null;
94 popup.button1text = 'CANCEL'94 popup.button1text = 'CANCEL'
95 popup.button2text = 'DELETE'95 popup.button2text = 'DELETE'
@@ -128,8 +128,8 @@ MessageBox { · 32 unmodified lines
128 popup.button1text = 'CANCEL'128 popup.button1text = 'CANCEL'
129 popup.titleText = 'Get Avatars'129 popup.titleText = 'Get Avatars'
130 130
131 popup.bodyText = 'Buy avatars from <b><a href="app://marketplace">Marketplace.</a></b>' + '<br/>' +131 popup.bodyText = 'Get avatars from <b><a href="app://marketplace">Marketplace.</a></b>' + '<br/>' +
132 'Wear avatars in <b><a href="app://purchases">My Purchases.</a></b>' + '<br/>' + '<br/>' +132 'Wear avatars in <b><a href="app://purchases">Inventory.</a></b>' + '<br/>' + '<br/>' +
133 'Visit “BodyMart” to get free avatars.'133 'Visit “BodyMart” to get free avatars.'
134 134
135 popup.imageSource = getAvatarsUrl;135 popup.imageSource = getAvatarsUrl;
interface/resources/qml/hifi/avatarapp/Settings.qml+26−2
@@ -2,8 +2,8 @@ import Hifi 1.0 as Hifi · 1 unmodified line
2import QtQuick 2.52import QtQuick 2.5
3import QtQuick.Controls 2.23import QtQuick.Controls 2.2
4import QtQuick.Layouts 1.34import QtQuick.Layouts 1.3
5import "../../styles-uit"5import stylesUit 1.0
6import "../../controls-uit" as HifiControlsUit6import controlsUit 1.0 as HifiControlsUit
7import "../../controls" as HifiControls7import "../../controls" as HifiControls
8 8
9Rectangle {9Rectangle {
@@ -14,6 +14,22 @@ Rectangle { · 4 unmodified lines
14 14
15 signal scaleChanged(real scale);15 signal scaleChanged(real scale);
16 16
17 property bool keyboardEnabled: true
18 property bool keyboardRaised: false
19 property bool punctuationMode: false
20
21 HifiControlsUit.Keyboard {
22 id: keyboard
23 z: 1000
24 raised: parent.keyboardEnabled && parent.keyboardRaised
25 numeric: parent.punctuationMode
26 anchors {
27 left: parent.left
28 right: parent.right
29 bottom: parent.bottom
30 }
31 }
32
17 property alias onSaveClicked: dialogButtons.onYesClicked33 property alias onSaveClicked: dialogButtons.onYesClicked
18 property alias onCancelClicked: dialogButtons.onNoClicked34 property alias onCancelClicked: dialogButtons.onNoClicked
19 35
@@ -314,6 +330,10 @@ Rectangle { · 294 unmodified lines
314 anchors.left: parent.left330 anchors.left: parent.left
315 anchors.right: parent.right331 anchors.right: parent.right
316 placeholderText: 'user\\file\\dir'332 placeholderText: 'user\\file\\dir'
333
334 onFocusChanged: {
335 keyboardRaised = (avatarAnimationUrlInputText.focus || avatarCollisionSoundUrlInputText.focus);
336 }
317 }337 }
318 }338 }
319 339
@@ -340,6 +360,10 @@ Rectangle { · 20 unmodified lines
340 anchors.left: parent.left360 anchors.left: parent.left
341 anchors.right: parent.right361 anchors.right: parent.right
342 placeholderText: 'https://hifi-public.s3.amazonaws.com/sounds/Collisions-'362 placeholderText: 'https://hifi-public.s3.amazonaws.com/sounds/Collisions-'
363
364 onFocusChanged: {
365 keyboardRaised = (avatarAnimationUrlInputText.focus || avatarCollisionSoundUrlInputText.focus);
366 }
343 }367 }
344 }368 }
345 369
interface/resources/qml/hifi/avatarapp/ShadowGlyph.qml+1−1
@@ -1,4 +1,4 @@
1import "../../styles-uit"1import stylesUit 1.0
2import QtQuick 2.92import QtQuick 2.9
3import QtGraphicalEffects 1.03import QtGraphicalEffects 1.0
4 4
interface/resources/qml/hifi/avatarapp/ShadowImage.qml+1−1
@@ -1,4 +1,4 @@
1import "../../styles-uit"1import stylesUit 1.0
2import QtQuick 2.92import QtQuick 2.9
3import QtGraphicalEffects 1.03import QtGraphicalEffects 1.0
4 4
interface/resources/qml/hifi/avatarapp/ShadowRectangle.qml+1−1
@@ -1,4 +1,4 @@
1import "../../styles-uit"1import stylesUit 1.0
2import QtQuick 2.92import QtQuick 2.9
3import QtGraphicalEffects 1.03import QtGraphicalEffects 1.0
4 4
interface/resources/qml/hifi/avatarapp/SquareLabel.qml+2−2
@@ -1,5 +1,5 @@
1import "../../styles-uit"1import stylesUit 1.0
2import "../../controls-uit" as HifiControlsUit2import controlsUit 1.0 as HifiControlsUit
3import QtQuick 2.93import QtQuick 2.9
4import QtGraphicalEffects 1.04import QtGraphicalEffects 1.0
5 5
interface/resources/qml/hifi/avatarapp/Vector3.qml+2−2
@@ -1,7 +1,7 @@
1import Hifi 1.0 as Hifi1import Hifi 1.0 as Hifi
2import QtQuick 2.52import QtQuick 2.5
3import "../../styles-uit"3import stylesUit 1.0
4import "../../controls-uit" as HifiControlsUit4import controlsUit 1.0 as HifiControlsUit
5import "../../controls" as HifiControls5import "../../controls" as HifiControls
6 6
7Row {7Row {
interface/resources/qml/hifi/avatarapp/WhiteButton.qml+2−2
@@ -1,6 +1,6 @@
1import QtQuick 2.51import QtQuick 2.5
2import "../../styles-uit"2import stylesUit 1.0
3import "../../controls-uit" as HifiControlsUit3import controlsUit 1.0 as HifiControlsUit
4 4
5HifiControlsUit.Button {5HifiControlsUit.Button {
6 HifiConstants {6 HifiConstants {
interface/resources/qml/hifi/commerce/checkout/Checkout.qml+40−35
@@ -14,8 +14,8 @@ · 13 unmodified lines
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.515import QtQuick 2.5
16import QtQuick.Controls 1.416import QtQuick.Controls 1.4
17import "../../../styles-uit"17import stylesUit 1.0
18import "../../../controls-uit" as HifiControlsUit18import controlsUit 1.0 as HifiControlsUit
19import "../../../controls" as HifiControls19import "../../../controls" as HifiControls
20import "../wallet" as HifiWallet20import "../wallet" as HifiWallet
21import "../common" as HifiCommerceCommon21import "../common" as HifiCommerceCommon
@@ -55,6 +55,7 @@ Rectangle { · 33 unmodified lines
55 property bool isInstalled;55 property bool isInstalled;
56 property bool isUpdating;56 property bool isUpdating;
57 property string baseAppURL;57 property string baseAppURL;
58 property int currentUpdatesPage: 1;
58 // Style59 // Style
59 color: hifi.colors.white;60 color: hifi.colors.white;
60 Connections {61 Connections {
@@ -156,8 +157,14 @@ Rectangle { · 95 unmodified lines
156 break;157 break;
157 }158 }
158 }159 }
159 root.availableUpdatesReceived = true;160
160 refreshBuyUI();161 if (result.data.updates.length === 0 || root.isUpdating) {
162 root.availableUpdatesReceived = true;
163 refreshBuyUI();
164 } else {
165 root.currentUpdatesPage++;
166 Commerce.getAvailableUpdates(root.itemId, currentUpdatesPage)
167 }
161 }168 }
162 }169 }
163 170
@@ -176,6 +183,7 @@ Rectangle { · 12 unmodified lines
176 root.ownershipStatusReceived = false;183 root.ownershipStatusReceived = false;
177 Commerce.alreadyOwned(root.itemId);184 Commerce.alreadyOwned(root.itemId);
178 root.availableUpdatesReceived = false;185 root.availableUpdatesReceived = false;
186 root.currentUpdatesPage = 1;
179 Commerce.getAvailableUpdates(root.itemId);187 Commerce.getAvailableUpdates(root.itemId);
180 itemPreviewImage.source = "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/" + itemId + "/thumbnail/hifi-mp-" + itemId + ".jpg";188 itemPreviewImage.source = "https://hifi-metaverse.s3-us-west-1.amazonaws.com/marketplace/previews/" + itemId + "/thumbnail/hifi-mp-" + itemId + ".jpg";
181 }189 }
@@ -240,11 +248,6 @@ Rectangle { · 58 unmodified lines
240 lightboxPopup.button1method = function() {248 lightboxPopup.button1method = function() {
241 lightboxPopup.visible = false;249 lightboxPopup.visible = false;
242 }250 }
243 lightboxPopup.button2text = "GO TO WALLET";
244 lightboxPopup.button2method = function() {
245 lightboxPopup.visible = false;
246 sendToScript({method: 'checkout_openWallet'});
247 };
248 lightboxPopup.visible = true;251 lightboxPopup.visible = true;
249 } else {252 } else {
250 sendToScript(msg);253 sendToScript(msg);
@@ -383,7 +386,7 @@ Rectangle { · 132 unmodified lines
383 anchors.leftMargin: 16;386 anchors.leftMargin: 16;
384 width: paintedWidth;387 width: paintedWidth;
385 height: paintedHeight;388 height: paintedHeight;
386 text: "Review Purchase:";389 text: "Review:";
387 color: hifi.colors.black;390 color: hifi.colors.black;
388 size: 28;391 size: 28;
389 }392 }
@@ -448,7 +451,7 @@ Rectangle { · 58 unmodified lines
448 // "HFC" balance label451 // "HFC" balance label
449 HiFiGlyphs {452 HiFiGlyphs {
450 id: itemPriceTextLabel;453 id: itemPriceTextLabel;
451 visible: !(root.isUpdating && root.itemEdition > 0);454 visible: !(root.isUpdating && root.itemEdition > 0) && (root.itemPrice > 0);
452 text: hifi.glyphs.hfc;455 text: hifi.glyphs.hfc;
453 // Size456 // Size
454 size: 30;457 size: 30;
@@ -464,7 +467,7 @@ Rectangle { · 9 unmodified lines
464 }467 }
465 FiraSansSemiBold {468 FiraSansSemiBold {
466 id: itemPriceText;469 id: itemPriceText;
467 text: (root.isUpdating && root.itemEdition > 0) ? "FREE\nUPDATE" : ((root.itemPrice === -1) ? "--" : root.itemPrice);470 text: (root.isUpdating && root.itemEdition > 0) ? "FREE\nUPDATE" : ((root.itemPrice === -1) ? "--" : ((root.itemPrice > 0) ? root.itemPrice : "FREE"));
468 // Text size471 // Text size
469 size: (root.isUpdating && root.itemEdition > 0) ? 20 : 26;472 size: (root.isUpdating && root.itemEdition > 0) ? 20 : 26;
470 // Anchors473 // Anchors
@@ -559,7 +562,7 @@ Rectangle { · 88 unmodified lines
559 }562 }
560 }563 }
561 564
562 // "View in My Purchases" button565 // "View in Inventory" button
563 HifiControlsUit.Button {566 HifiControlsUit.Button {
564 id: viewInMyPurchasesButton;567 id: viewInMyPurchasesButton;
565 visible: false;568 visible: false;
@@ -570,7 +573,7 @@ Rectangle { · 4 unmodified lines
570 height: 50;573 height: 50;
571 anchors.left: parent.left;574 anchors.left: parent.left;
572 anchors.right: parent.right;575 anchors.right: parent.right;
573 text: root.isUpdating ? "UPDATE TO THIS ITEM FOR FREE" : "VIEW THIS ITEM IN MY PURCHASES";576 text: root.isUpdating ? "UPDATE TO THIS ITEM FOR FREE" : "VIEW THIS ITEM IN YOUR INVENTORY";
574 onClicked: {577 onClicked: {
575 if (root.isUpdating) {578 if (root.isUpdating) {
576 sendToScript({method: 'checkout_goToPurchases', filterText: root.baseItemName});579 sendToScript({method: 'checkout_goToPurchases', filterText: root.baseItemName});
@@ -594,7 +597,7 @@ Rectangle { · 17 unmodified lines
594 anchors.left: parent.left;597 anchors.left: parent.left;
595 anchors.right: parent.right;598 anchors.right: parent.right;
596 text: (root.isUpdating && root.itemEdition > 0) ? "CONFIRM UPDATE" : (((root.isCertified) ? ((ownershipStatusReceived && balanceReceived && availableUpdatesReceived) ?599 text: (root.isUpdating && root.itemEdition > 0) ? "CONFIRM UPDATE" : (((root.isCertified) ? ((ownershipStatusReceived && balanceReceived && availableUpdatesReceived) ?
597 ((viewInMyPurchasesButton.visible && !root.isUpdating) ? "Buy It Again" : "Confirm Purchase") : "--") : "Get Item"));600 ((viewInMyPurchasesButton.visible && !root.isUpdating) ? "Get It Again" : "Confirm") : "--") : "Get Item"));
598 onClicked: {601 onClicked: {
599 if (root.isUpdating && root.itemEdition > 0) {602 if (root.isUpdating && root.itemEdition > 0) {
600 // If we're updating an app, the existing app needs to be uninstalled.603 // If we're updating an app, the existing app needs to be uninstalled.
@@ -608,9 +611,9 @@ Rectangle { · 7 unmodified lines
608 } else if (root.isCertified) {611 } else if (root.isCertified) {
609 if (!root.shouldBuyWithControlledFailure) {612 if (!root.shouldBuyWithControlledFailure) {
610 if (root.itemType === "contentSet" && !Entities.canReplaceContent()) {613 if (root.itemType === "contentSet" && !Entities.canReplaceContent()) {
611 lightboxPopup.titleText = "Purchase Content Set";614 lightboxPopup.titleText = "Get Content Set";
612 lightboxPopup.bodyText = "You will not be able to replace this domain's content with <b>" + root.itemName +615 lightboxPopup.bodyText = "You will not be able to replace this domain's content with <b>" + root.itemName +
613 " </b>until the server owner gives you 'Replace Content' permissions.<br><br>Are you sure you want to purchase this content set?";616 " </b>until the server owner gives you 'Replace Content' permissions.<br><br>Are you sure you want to get this content set?";
614 lightboxPopup.button1text = "CANCEL";617 lightboxPopup.button1text = "CANCEL";
615 lightboxPopup.button1method = function() {618 lightboxPopup.button1method = function() {
616 lightboxPopup.visible = false;619 lightboxPopup.visible = false;
@@ -694,7 +697,7 @@ Rectangle { · 77 unmodified lines
694 id: completeText2;697 id: completeText2;
695 text: "The " + (root.itemTypesText)[itemTypesArray.indexOf(root.itemType)] +698 text: "The " + (root.itemTypesText)[itemTypesArray.indexOf(root.itemType)] +
696 ' <font color="' + hifi.colors.blueAccent + '"><a href="#">' + root.itemName + '</a></font>' +699 ' <font color="' + hifi.colors.blueAccent + '"><a href="#">' + root.itemName + '</a></font>' +
697 " has been added to your Purchases and a receipt will appear in your Wallet's transaction history.";700 " has been added to your Inventory.";
698 // Text size701 // Text size
699 size: 18;702 size: 18;
700 // Anchors703 // Anchors
@@ -833,7 +836,7 @@ Rectangle { · 132 unmodified lines
833 }836 }
834 lightboxPopup.button2text = "OPEN GOTO";837 lightboxPopup.button2text = "OPEN GOTO";
835 lightboxPopup.button2method = function() {838 lightboxPopup.button2method = function() {
836 sendToScript({method: 'purchases_openGoTo'});839 sendToScript({method: 'checkout_openGoTo'});
837 lightboxPopup.visible = false;840 lightboxPopup.visible = false;
838 };841 };
839 lightboxPopup.visible = true;842 lightboxPopup.visible = true;
@@ -864,7 +867,7 @@ Rectangle { · 24 unmodified lines
864 867
865 RalewaySemiBold {868 RalewaySemiBold {
866 id: myPurchasesLink;869 id: myPurchasesLink;
867 text: '<font color="' + hifi.colors.primaryHighlight + '"><a href="#">View this item in My Purchases</a></font>';870 text: '<font color="' + hifi.colors.primaryHighlight + '"><a href="#">View this item in your Inventory</a></font>';
868 // Text size871 // Text size
869 size: 18;872 size: 18;
870 // Anchors873 // Anchors
@@ -886,7 +889,8 @@ Rectangle { · 15 unmodified lines
886 889
887 RalewaySemiBold {890 RalewaySemiBold {
888 id: walletLink;891 id: walletLink;
889 text: '<font color="' + hifi.colors.primaryHighlight + '"><a href="#">View receipt in Wallet</a></font>';892 visible: !WalletScriptingInterface.limitedCommerce;
893 text: '<font color="' + hifi.colors.primaryHighlight + '"><a href="#">View receipt in Recent Activity</a></font>';
890 // Text size894 // Text size
891 size: 18;895 size: 18;
892 // Anchors896 // Anchors
@@ -902,18 +906,18 @@ Rectangle { · 9 unmodified lines
902 horizontalAlignment: Text.AlignLeft;906 horizontalAlignment: Text.AlignLeft;
903 verticalAlignment: Text.AlignVCenter;907 verticalAlignment: Text.AlignVCenter;
904 onLinkActivated: {908 onLinkActivated: {
905 sendToScript({method: 'purchases_openWallet'});909 sendToScript({method: 'checkout_openRecentActivity'});
906 }910 }
907 }911 }
908 912
909 RalewayRegular {913 RalewayRegular {
910 id: pendingText;914 id: pendingText;
911 text: 'Your item is marked "pending" while your purchase is being confirmed. ' +915 text: 'Your item is marked "pending" while the transfer is being confirmed. ' +
912 '<b><font color="' + hifi.colors.primaryHighlight + '"><a href="#">Learn More</a></font></b>';916 '<b><font color="' + hifi.colors.primaryHighlight + '"><a href="#">Learn More</a></font></b>';
913 // Text size917 // Text size
914 size: 18;918 size: 18;
915 // Anchors919 // Anchors
916 anchors.top: walletLink.bottom;920 anchors.top: walletLink.visible ? walletLink.bottom : myPurchasesLink.bottom;
917 anchors.topMargin: 32;921 anchors.topMargin: 32;
918 height: paintedHeight;922 height: paintedHeight;
919 anchors.left: parent.left;923 anchors.left: parent.left;
@@ -925,8 +929,8 @@ Rectangle { · 5 unmodified lines
925 horizontalAlignment: Text.AlignLeft;929 horizontalAlignment: Text.AlignLeft;
926 verticalAlignment: Text.AlignVCenter;930 verticalAlignment: Text.AlignVCenter;
927 onLinkActivated: {931 onLinkActivated: {
928 lightboxPopup.titleText = "Purchase Confirmations";932 lightboxPopup.titleText = "Confirmations";
929 lightboxPopup.bodyText = 'Your item is marked "pending" while your purchase is being confirmed.<br><br>' +933 lightboxPopup.bodyText = 'Your item is marked "pending" while the transfer is being confirmed.<br><br>' +
930 'Confirmations usually take about 90 seconds.';934 'Confirmations usually take about 90 seconds.';
931 lightboxPopup.button1text = "CLOSE";935 lightboxPopup.button1text = "CLOSE";
932 lightboxPopup.button1method = function() {936 lightboxPopup.button1method = function() {
@@ -936,9 +940,9 @@ Rectangle { · 3 unmodified lines
936 }940 }
937 }941 }
938 942
939 // "Continue Shopping" button943 // "Continue" button
940 HifiControlsUit.Button {944 HifiControlsUit.Button {
941 id: continueShoppingButton;945 id: continueButton;
942 color: hifi.buttons.noneBorderlessGray;946 color: hifi.buttons.noneBorderlessGray;
943 colorScheme: hifi.colorSchemes.light;947 colorScheme: hifi.colorSchemes.light;
944 anchors.bottom: parent.bottom;948 anchors.bottom: parent.bottom;
@@ -946,9 +950,9 @@ Rectangle { · 1 unmodified line
946 anchors.right: parent.right;950 anchors.right: parent.right;
947 width: 193;951 width: 193;
948 height: 44;952 height: 44;
949 text: "Continue Shopping";953 text: "Continue";
950 onClicked: {954 onClicked: {
951 sendToScript({method: 'checkout_continueShopping', itemId: itemId});955 sendToScript({method: 'checkout_continue', itemId: itemId});
952 }956 }
953 }957 }
954 }958 }
@@ -971,7 +975,7 @@ Rectangle { · 16 unmodified lines
971 975
972 RalewayRegular {976 RalewayRegular {
973 id: failureHeaderText;977 id: failureHeaderText;
974 text: "<b>Purchase Failed.</b><br>Your Purchases and HFC balance haven't changed.";978 text: "<b>Purchase Failed.</b><br>Your Inventory and HFC balance haven't changed.";
975 // Text size979 // Text size
976 size: 24;980 size: 24;
977 // Anchors981 // Anchors
@@ -1037,7 +1041,7 @@ Rectangle { · 59 unmodified lines
1037 width: parent.width/2 - anchors.leftMargin*2;1041 width: parent.width/2 - anchors.leftMargin*2;
1038 text: "Back to Marketplace";1042 text: "Back to Marketplace";
1039 onClicked: {1043 onClicked: {
1040 sendToScript({method: 'checkout_continueShopping', itemId: itemId});1044 sendToScript({method: 'checkout_continue', itemId: itemId});
1041 }1045 }
1042 }1046 }
1043 }1047 }
@@ -1122,10 +1126,10 @@ Rectangle { · 78 unmodified lines
1122 if (root.balanceAfterPurchase < 0) {1126 if (root.balanceAfterPurchase < 0) {
1123 // If you already own the item...1127 // If you already own the item...
1124 if (!root.alreadyOwned) {1128 if (!root.alreadyOwned) {
1125 buyText.text = "<b>Your Wallet does not have sufficient funds to purchase this item.</b>";1129 buyText.text = "<b>You do not have sufficient funds to purchase this item.</b>";
1126 // Else if you don't already own the item...1130 // Else if you don't already own the item...
1127 } else if (canBuyAgain()) {1131 } else if (canBuyAgain()) {
1128 buyText.text = "<b>Your Wallet does not have sufficient funds to purchase this item again.</b>";1132 buyText.text = "<b>You do not have sufficient funds to purchase this item again.</b>";
1129 } else {1133 } else {
1130 buyText.text = "<b>While you do not have sufficient funds to buy this, you already have this item.</b>"1134 buyText.text = "<b>While you do not have sufficient funds to buy this, you already have this item.</b>"
1131 }1135 }
@@ -1171,7 +1175,7 @@ Rectangle { · 39 unmodified lines
1171 buyText.text = "";1175 buyText.text = "";
1172 }1176 }
1173 } else {1177 } else {
1174 buyText.text = '<i>This type of item cannot currently be certified, so it will not show up in "My Purchases". You can access it again for free from the Marketplace.</i>';1178 buyText.text = '<i>This type of item cannot currently be certified, so it will not show up in "Inventory". You can access it again for free from the Marketplace.</i>';
1175 buyTextContainer.color = hifi.colors.white;1179 buyTextContainer.color = hifi.colors.white;
1176 buyTextContainer.border.color = hifi.colors.white;1180 buyTextContainer.border.color = hifi.colors.white;
1177 buyGlyph.text = "";1181 buyGlyph.text = "";
@@ -1185,6 +1189,7 @@ Rectangle { · 7 unmodified lines
1185 root.ownershipStatusReceived = false;1189 root.ownershipStatusReceived = false;
1186 Commerce.alreadyOwned(root.itemId);1190 Commerce.alreadyOwned(root.itemId);
1187 root.availableUpdatesReceived = false;1191 root.availableUpdatesReceived = false;
1192 root.currentUpdatesPage = 1;
1188 Commerce.getAvailableUpdates(root.itemId);1193 Commerce.getAvailableUpdates(root.itemId);
1189 root.balanceReceived = false;1194 root.balanceReceived = false;
1190 Commerce.balance();1195 Commerce.balance();
interface/resources/qml/hifi/commerce/common/CommerceLightbox.qml+6−4
@@ -14,9 +14,9 @@ · 13 unmodified lines
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.515import QtQuick 2.5
16import QtGraphicalEffects 1.016import QtGraphicalEffects 1.0
17import "../../../styles-uit"17import stylesUit 1.0
18import "../../../controls-uit" as HifiControlsUit18import controlsUit 1.0 as HifiControlsUit
19import "../../../controls" as HifiControls19import "qrc:////qml//controls" as HifiControls
20 20
21// references XXX from root context21// references XXX from root context
22 22
@@ -33,13 +33,15 @@ Rectangle { · 10 unmodified lines
33 property string buttonLayout: "leftright";33 property string buttonLayout: "leftright";
34 34
35 readonly property string securityPicBodyText: "When you see your Security Pic, your actions and data are securely making use of your " +35 readonly property string securityPicBodyText: "When you see your Security Pic, your actions and data are securely making use of your " +
36 "Wallet's private keys.<br><br>You can change your Security Pic in your Wallet.";36 "private keys.<br><br>You can change your Security Pic via Settings > Security...";
37 37
38 id: root;38 id: root;
39 visible: false;39 visible: false;
40 anchors.fill: parent;40 anchors.fill: parent;
41 color: Qt.rgba(0, 0, 0, 0.5);41 color: Qt.rgba(0, 0, 0, 0.5);
42 z: 999;42 z: 999;
43
44 HifiConstants { id: hifi; }
43 45
44 onVisibleChanged: {46 onVisibleChanged: {
45 if (!visible) {47 if (!visible) {
interface/resources/qml/hifi/commerce/common/EmulatedMarketplaceHeader.qml+4−58
@@ -14,8 +14,8 @@ · 13 unmodified lines
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.715import QtQuick 2.7
16import QtGraphicalEffects 1.016import QtGraphicalEffects 1.0
17import "../../../styles-uit"17import stylesUit 1.0
18import "../../../controls-uit" as HifiControlsUit18import controlsUit 1.0 as HifiControlsUit
19import "../../../controls" as HifiControls19import "../../../controls" as HifiControls
20 20
21// references XXX from root context21// references XXX from root context
@@ -27,7 +27,6 @@ Item { · 5 unmodified lines
27 property string referrerURL: (Account.metaverseServerURL + "/marketplace?");27 property string referrerURL: (Account.metaverseServerURL + "/marketplace?");
28 readonly property int additionalDropdownHeight: usernameDropdown.height - myUsernameButton.anchors.bottomMargin;28 readonly property int additionalDropdownHeight: usernameDropdown.height - myUsernameButton.anchors.bottomMargin;
29 property alias usernameDropdownVisible: usernameDropdown.visible;29 property alias usernameDropdownVisible: usernameDropdown.visible;
30 property bool messagesWaiting: false;
31 30
32 height: mainContainer.height + additionalDropdownHeight;31 height: mainContainer.height + additionalDropdownHeight;
33 32
@@ -38,7 +37,6 @@ Item { · 4 unmodified lines
38 if (walletStatus === 0) {37 if (walletStatus === 0) {
39 sendToParent({method: "needsLogIn"});38 sendToParent({method: "needsLogIn"});
40 } else if (walletStatus === 5) {39 } else if (walletStatus === 5) {
41 Commerce.getAvailableUpdates();
42 Commerce.getSecurityImage();40 Commerce.getSecurityImage();
43 } else if (walletStatus > 5) {41 } else if (walletStatus > 5) {
44 console.log("ERROR in EmulatedMarketplaceHeader.qml: Unknown wallet status: " + walletStatus);42 console.log("ERROR in EmulatedMarketplaceHeader.qml: Unknown wallet status: " + walletStatus);
@@ -59,14 +57,6 @@ Item { · 14 unmodified lines
59 securityImage.source = "image://security/securityImage";57 securityImage.source = "image://security/securityImage";
60 }58 }
61 }59 }
62
63 onAvailableUpdatesResult: {
64 if (result.status !== 'success') {
65 console.log("Failed to get Available Updates", result.data.message);
66 } else {
67 root.messagesWaiting = result.data.updates.length > 0;
68 }
69 }
70 }60 }
71 61
72 Component.onCompleted: {62 Component.onCompleted: {
@@ -118,50 +108,6 @@ Item { · 45 unmodified lines
118 anchors.right: securityImage.left;108 anchors.right: securityImage.left;
119 anchors.rightMargin: 6;109 anchors.rightMargin: 6;
120 110
121 Rectangle {
122 id: myPurchasesLink;
123 anchors.right: myUsernameButton.left;
124 anchors.rightMargin: 8;
125 anchors.verticalCenter: parent.verticalCenter;
126 height: 40;
127 width: myPurchasesText.paintedWidth + 10;
128
129 RalewaySemiBold {
130 id: myPurchasesText;
131 text: "My Purchases";
132 // Text size
133 size: 18;
134 // Style
135 color: hifi.colors.blueAccent;
136 horizontalAlignment: Text.AlignHCenter;
137 verticalAlignment: Text.AlignVCenter;
138 // Anchors
139 anchors.centerIn: parent;
140 }
141
142 MouseArea {
143 anchors.fill: parent;
144 hoverEnabled: enabled;
145 onClicked: {
146 sendToParent({ method: 'header_goToPurchases', hasUpdates: root.messagesWaiting });
147 }
148 onEntered: myPurchasesText.color = hifi.colors.blueHighlight;
149 onExited: myPurchasesText.color = hifi.colors.blueAccent;
150 }
151 }
152
153 Rectangle {
154 id: messagesWaitingLight;
155 visible: root.messagesWaiting;
156 anchors.right: myPurchasesLink.left;
157 anchors.rightMargin: -2;
158 anchors.verticalCenter: parent.verticalCenter;
159 height: 10;
160 width: height;
161 radius: height/2;
162 color: "red";
163 }
164
165 TextMetrics {111 TextMetrics {
166 id: textMetrics;112 id: textMetrics;
167 font.family: "Raleway"113 font.family: "Raleway"
@@ -267,7 +213,7 @@ Item { · 99 unmodified lines
267 anchors.topMargin: -buttonAndUsernameContainer.anchors.bottomMargin;213 anchors.topMargin: -buttonAndUsernameContainer.anchors.bottomMargin;
268 anchors.right: buttonAndUsernameContainer.right;214 anchors.right: buttonAndUsernameContainer.right;
269 height: childrenRect.height;215 height: childrenRect.height;
270 width: 100;216 width: 150;
271 217
272 Rectangle {218 Rectangle {
273 id: myItemsButton;219 id: myItemsButton;
@@ -279,7 +225,7 @@ Item { · 5 unmodified lines
279 225
280 RalewaySemiBold {226 RalewaySemiBold {
281 anchors.fill: parent;227 anchors.fill: parent;
282 text: "My Items"228 text: "My Submissions"
283 color: hifi.colors.baseGray;229 color: hifi.colors.baseGray;
284 horizontalAlignment: Text.AlignHCenter;230 horizontalAlignment: Text.AlignHCenter;
285 verticalAlignment: Text.AlignVCenter;231 verticalAlignment: Text.AlignVCenter;
interface/resources/qml/hifi/commerce/common/FirstUseTutorial.qml+4−4
@@ -14,8 +14,8 @@ · 13 unmodified lines
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.515import QtQuick 2.5
16import QtGraphicalEffects 1.016import QtGraphicalEffects 1.0
17import "../../../styles-uit"17import stylesUit 1.0
18import "../../../controls-uit" as HifiControlsUit18import controlsUit 1.0 as HifiControlsUit
19import "../../../controls" as HifiControls19import "../../../controls" as HifiControls
20 20
21// references XXX from root context21// references XXX from root context
@@ -87,7 +87,7 @@ Rectangle { · 65 unmodified lines
87 }87 }
88 RalewayRegular {88 RalewayRegular {
89 id: introText2;89 id: introText2;
90 text: "My Purchases";90 text: "Inventory";
91 // Text size91 // Text size
92 size: 22;92 size: 22;
93 // Anchors93 // Anchors
@@ -116,7 +116,7 @@ Rectangle { · 22 unmodified lines
116 116
117 RalewayRegular {117 RalewayRegular {
118 id: step1text;118 id: step1text;
119 text: "The <b>'REZ IT'</b> button makes your purchase appear in front of you.";119 text: "The <b>'REZ IT'</b> button makes your item appear in front of you.";
120 // Text size120 // Text size
121 size: 20;121 size: 20;
122 // Anchors122 // Anchors
interface/resources/qml/hifi/commerce/common/sendAsset/ConnectionItem.qml+2−2
@@ -16,8 +16,8 @@ import QtQuick 2.5 · 15 unmodified lines
16import QtGraphicalEffects 1.016import QtGraphicalEffects 1.0
17import QtQuick.Controls 1.417import QtQuick.Controls 1.4
18import QtQuick.Controls.Styles 1.418import QtQuick.Controls.Styles 1.4
19import "../../../../styles-uit"19import stylesUit 1.0
20import "../../../../controls-uit" as HifiControlsUit20import controlsUit 1.0 as HifiControlsUit
21import "../../../../controls" as HifiControls21import "../../../../controls" as HifiControls
22import "../../wallet" as HifiWallet22import "../../wallet" as HifiWallet
23 23
interface/resources/qml/hifi/commerce/common/sendAsset/RecipientDisplay.qml+2−2
@@ -15,8 +15,8 @@ import Hifi 1.0 as Hifi · 14 unmodified lines
15import QtQuick 2.615import QtQuick 2.6
16import QtQuick.Controls 2.216import QtQuick.Controls 2.2
17import QtGraphicalEffects 1.017import QtGraphicalEffects 1.0
18import "../../../../styles-uit"18import stylesUit 1.0
19import "../../../../controls-uit" as HifiControlsUit19import controlsUit 1.0 as HifiControlsUit
20import "../../../../controls" as HifiControls20import "../../../../controls" as HifiControls
21import "../" as HifiCommerceCommon21import "../" as HifiCommerceCommon
22 22
interface/resources/qml/hifi/commerce/common/sendAsset/SendAsset.qml+12−4
@@ -15,8 +15,8 @@ import Hifi 1.0 as Hifi · 14 unmodified lines
15import QtQuick 2.615import QtQuick 2.6
16import QtQuick.Controls 2.216import QtQuick.Controls 2.2
17import QtGraphicalEffects 1.017import QtGraphicalEffects 1.0
18import "../../../../styles-uit"18import stylesUit 1.0
19import "../../../../controls-uit" as HifiControlsUit19import controlsUit 1.0 as HifiControlsUit
20import "../../../../controls" as HifiControls20import "../../../../controls" as HifiControls
21import "../" as HifiCommerceCommon21import "../" as HifiCommerceCommon
22import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.22import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.
@@ -73,6 +73,10 @@ Item { · 50 unmodified lines
73 }73 }
74 74
75 onTransferAssetToNodeResult: {75 onTransferAssetToNodeResult: {
76 if (!root.visible) {
77 return;
78 }
79
76 root.isCurrentlySendingAsset = false;80 root.isCurrentlySendingAsset = false;
77 81
78 if (result.status === 'success') {82 if (result.status === 'success') {
@@ -92,6 +96,10 @@ Item { · 13 unmodified lines
92 }96 }
93 97
94 onTransferAssetToUsernameResult: {98 onTransferAssetToUsernameResult: {
99 if (!root.visible) {
100 return;
101 }
102
95 root.isCurrentlySendingAsset = false;103 root.isCurrentlySendingAsset = false;
96 104
97 if (result.status === 'success') {105 if (result.status === 'success') {
@@ -1309,13 +1317,13 @@ Item { · 1211 unmodified lines
1309 1317
1310 Rectangle {1318 Rectangle {
1311 anchors.top: parent.top;1319 anchors.top: parent.top;
1312 anchors.topMargin: root.assetName === "" ? 15 : 150;1320 anchors.topMargin: root.assetName === "" ? 15 : 125;
1313 anchors.left: parent.left;1321 anchors.left: parent.left;
1314 anchors.leftMargin: root.assetName === "" ? 15 : 50;1322 anchors.leftMargin: root.assetName === "" ? 15 : 50;
1315 anchors.right: parent.right;1323 anchors.right: parent.right;
1316 anchors.rightMargin: root.assetName === "" ? 15 : 50;1324 anchors.rightMargin: root.assetName === "" ? 15 : 50;
1317 anchors.bottom: parent.bottom;1325 anchors.bottom: parent.bottom;
1318 anchors.bottomMargin: root.assetName === "" ? 15 : 240;1326 anchors.bottomMargin: root.assetName === "" ? 15 : 125;
1319 color: "#FFFFFF";1327 color: "#FFFFFF";
1320 1328
1321 RalewaySemiBold {1329 RalewaySemiBold {
interface/resources/qml/hifi/commerce/inspectionCertificate/InspectionCertificate.qml+29−28
@@ -13,8 +13,8 @@ · 12 unmodified lines
13 13
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.515import QtQuick 2.5
16import "../../../styles-uit"16import stylesUit 1.0
17import "../../../controls-uit" as HifiControlsUit17import controlsUit 1.0 as HifiControlsUit
18import "../../../controls" as HifiControls18import "../../../controls" as HifiControls
19import "../wallet" as HifiWallet19import "../wallet" as HifiWallet
20 20
@@ -28,7 +28,7 @@ Rectangle { · 7 unmodified lines
28 property string itemName: "--";28 property string itemName: "--";
29 property string itemOwner: "--";29 property string itemOwner: "--";
30 property string itemEdition: "--";30 property string itemEdition: "--";
31 property string dateOfPurchase: "--";31 property string dateAcquired: "--";
32 property string itemCost: "--";32 property string itemCost: "--";
33 property string certTitleTextColor: hifi.colors.darkGray;33 property string certTitleTextColor: hifi.colors.darkGray;
34 property string certTextColor: hifi.colors.white;34 property string certTextColor: hifi.colors.white;
@@ -64,7 +64,7 @@ Rectangle { · 29 unmodified lines
64 root.itemName = "";64 root.itemName = "";
65 root.itemEdition = "";65 root.itemEdition = "";
66 root.itemOwner = "";66 root.itemOwner = "";
67 root.dateOfPurchase = "";67 root.dateAcquired = "";
68 root.itemCost = "";68 root.itemCost = "";
69 errorText.text = "Information about this certificate is currently unavailable. Please try again later.";69 errorText.text = "Information about this certificate is currently unavailable. Please try again later.";
70 }70 }
@@ -77,8 +77,9 @@ Rectangle { · 6 unmodified lines
77 // "\u2022" is the Unicode character 'BULLET' - it's what's used in password fields on the web, etc77 // "\u2022" is the Unicode character 'BULLET' - it's what's used in password fields on the web, etc
78 root.itemOwner = root.isMyCert ? Account.username :78 root.itemOwner = root.isMyCert ? Account.username :
79 "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";79 "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
80 root.dateOfPurchase = root.isMyCert ? getFormattedDate(result.data.transfer_created_at * 1000) : "Undisclosed";80 root.dateAcquired = root.isMyCert ? getFormattedDate(result.data.transfer_created_at * 1000) : "Undisclosed";
81 root.itemCost = (root.isMyCert && result.data.cost !== undefined) ? result.data.cost : "Undisclosed";81 root.itemCost = (root.isMyCert && result.data.cost !== undefined) ?
82 (parseInt(result.data.cost) > 0 ? result.data.cost : "Free") : "Undisclosed";
82 }83 }
83 if (root.certInfoReplaceMode > 4) {84 if (root.certInfoReplaceMode > 4) {
84 root.itemEdition = result.data.edition_number + "/" + (result.data.limited_run === -1 ? "\u221e" : result.data.limited_run);85 root.itemEdition = result.data.edition_number + "/" + (result.data.limited_run === -1 ? "\u221e" : result.data.limited_run);
@@ -86,7 +87,7 @@ Rectangle { · 1 unmodified line
86 87
87 if (root.certificateStatus === 4) { // CERTIFICATE_STATUS_OWNER_VERIFICATION_FAILED88 if (root.certificateStatus === 4) { // CERTIFICATE_STATUS_OWNER_VERIFICATION_FAILED
88 if (root.isMyCert) {89 if (root.isMyCert) {
89 errorText.text = "This item is an uncertified copy of an item you purchased.";90 errorText.text = "This item is an uncertified copy of an item you acquired.";
90 } else {91 } else {
91 errorText.text = "The person who placed this item doesn't own it.";92 errorText.text = "The person who placed this item doesn't own it.";
92 }93 }
@@ -102,8 +103,8 @@ Rectangle { · 9 unmodified lines
102 showInMarketplaceButton.visible = false;103 showInMarketplaceButton.visible = false;
103 // "Edition" text previously set above in this function104 // "Edition" text previously set above in this function
104 // "Owner" text previously set above in this function105 // "Owner" text previously set above in this function
105 // "Purchase Date" text previously set above in this function106 // "Acquisition Date" text previously set above in this function
106 // "Purchase Price" text previously set above in this function107 // "Acquisition Price" text previously set above in this function
107 if (result.data.invalid_reason) {108 if (result.data.invalid_reason) {
108 errorText.text = result.data.invalid_reason;109 errorText.text = result.data.invalid_reason;
109 }110 }
@@ -117,8 +118,8 @@ Rectangle { · 7 unmodified lines
117 showInMarketplaceButton.visible = true;118 showInMarketplaceButton.visible = true;
118 // "Edition" text previously set above in this function119 // "Edition" text previously set above in this function
119 // "Owner" text previously set above in this function120 // "Owner" text previously set above in this function
120 // "Purchase Date" text previously set above in this function121 // "Acquisition Date" text previously set above in this function
121 // "Purchase Price" text previously set above in this function122 // "Acquisition Price" text previously set above in this function
122 errorText.text = "The status of this item is still pending confirmation. If the purchase is not confirmed, " +123 errorText.text = "The status of this item is still pending confirmation. If the purchase is not confirmed, " +
123 "this entity will be cleaned up by the domain.";124 "this entity will be cleaned up by the domain.";
124 }125 }
@@ -145,8 +146,8 @@ Rectangle { · 20 unmodified lines
145 // "Item Name" text will be set in "onCertificateInfoResult()"146 // "Item Name" text will be set in "onCertificateInfoResult()"
146 // "Edition" text will be set in "onCertificateInfoResult()"147 // "Edition" text will be set in "onCertificateInfoResult()"
147 // "Owner" text will be set in "onCertificateInfoResult()"148 // "Owner" text will be set in "onCertificateInfoResult()"
148 // "Purchase Date" text will be set in "onCertificateInfoResult()"149 // "Acquisition Date" text will be set in "onCertificateInfoResult()"
149 // "Purchase Price" text will be set in "onCertificateInfoResult()"150 // "Acquisition Price" text will be set in "onCertificateInfoResult()"
150 errorText.text = "";151 errorText.text = "";
151 } else if (root.certificateStatus === 2) { // CERTIFICATE_STATUS_VERIFICATION_TIMEOUT152 } else if (root.certificateStatus === 2) { // CERTIFICATE_STATUS_VERIFICATION_TIMEOUT
152 root.useGoldCert = false;153 root.useGoldCert = false;
@@ -160,7 +161,7 @@ Rectangle { · 7 unmodified lines
160 root.itemName = "";161 root.itemName = "";
161 root.itemEdition = "";162 root.itemEdition = "";
162 root.itemOwner = "";163 root.itemOwner = "";
163 root.dateOfPurchase = "";164 root.dateAcquired = "";
164 root.itemCost = "";165 root.itemCost = "";
165 errorText.text = "Your request to inspect this item timed out. Please try again later.";166 errorText.text = "Your request to inspect this item timed out. Please try again later.";
166 } else if (root.certificateStatus === 3) { // CERTIFICATE_STATUS_STATIC_VERIFICATION_FAILED167 } else if (root.certificateStatus === 3) { // CERTIFICATE_STATUS_STATIC_VERIFICATION_FAILED
@@ -175,8 +176,8 @@ Rectangle { · 8 unmodified lines
175 // "Item Name" text will be set in "onCertificateInfoResult()"176 // "Item Name" text will be set in "onCertificateInfoResult()"
176 // "Edition" text will be set in "onCertificateInfoResult()"177 // "Edition" text will be set in "onCertificateInfoResult()"
177 // "Owner" text will be set in "onCertificateInfoResult()"178 // "Owner" text will be set in "onCertificateInfoResult()"
178 // "Purchase Date" text will be set in "onCertificateInfoResult()"179 // "Acquisition Date" text will be set in "onCertificateInfoResult()"
179 // "Purchase Price" text will be set in "onCertificateInfoResult()"180 // "Acquisition Price" text will be set in "onCertificateInfoResult()"
180 errorText.text = "The information associated with this item has been modified and it no longer matches the original certified item.";181 errorText.text = "The information associated with this item has been modified and it no longer matches the original certified item.";
181 } else if (root.certificateStatus === 4) { // CERTIFICATE_STATUS_OWNER_VERIFICATION_FAILED182 } else if (root.certificateStatus === 4) { // CERTIFICATE_STATUS_OWNER_VERIFICATION_FAILED
182 root.useGoldCert = false;183 root.useGoldCert = false;
@@ -190,8 +191,8 @@ Rectangle { · 7 unmodified lines
190 // "Item Name" text will be set in "onCertificateInfoResult()"191 // "Item Name" text will be set in "onCertificateInfoResult()"
191 root.itemEdition = "Uncertified Copy"192 root.itemEdition = "Uncertified Copy"
192 // "Owner" text will be set in "onCertificateInfoResult()"193 // "Owner" text will be set in "onCertificateInfoResult()"
193 // "Purchase Date" text will be set in "onCertificateInfoResult()"194 // "Acquisition Date" text will be set in "onCertificateInfoResult()"
194 // "Purchase Price" text will be set in "onCertificateInfoResult()"195 // "Acquisition Price" text will be set in "onCertificateInfoResult()"
195 // "Error Text" text will be set in "onCertificateInfoResult()"196 // "Error Text" text will be set in "onCertificateInfoResult()"
196 } else {197 } else {
197 console.log("Unknown certificate status received from ledger signal!");198 console.log("Unknown certificate status received from ledger signal!");
@@ -485,8 +486,8 @@ Rectangle { · 287 unmodified lines
485 }486 }
486 487
487 RalewayRegular {488 RalewayRegular {
488 id: dateOfPurchaseHeader;489 id: dateAcquiredHeader;
489 text: "PURCHASE DATE";490 text: "ACQUISITION DATE";
490 // Text size491 // Text size
491 size: 16;492 size: 16;
492 // Anchors493 // Anchors
@@ -500,15 +501,15 @@ Rectangle { · 7 unmodified lines
500 color: hifi.colors.darkGray;501 color: hifi.colors.darkGray;
501 }502 }
502 AnonymousProRegular {503 AnonymousProRegular {
503 id: dateOfPurchase;504 id: dateAcquired;
504 text: root.dateOfPurchase;505 text: root.dateAcquired;
505 // Text size506 // Text size
506 size: 18;507 size: 18;
507 // Anchors508 // Anchors
508 anchors.top: dateOfPurchaseHeader.bottom;509 anchors.top: dateAcquiredHeader.bottom;
509 anchors.topMargin: 8;510 anchors.topMargin: 8;
510 anchors.left: dateOfPurchaseHeader.left;511 anchors.left: dateAcquiredHeader.left;
511 anchors.right: dateOfPurchaseHeader.right;512 anchors.right: dateAcquiredHeader.right;
512 height: paintedHeight;513 height: paintedHeight;
513 // Style514 // Style
514 color: root.infoTextColor;515 color: root.infoTextColor;
@@ -516,7 +517,7 @@ Rectangle { · 1 unmodified line
516 517
517 RalewayRegular {518 RalewayRegular {
518 id: priceHeader;519 id: priceHeader;
519 text: "PURCHASE PRICE";520 text: "ACQUISITION PRICE";
520 // Text size521 // Text size
521 size: 16;522 size: 16;
522 // Anchors523 // Anchors
@@ -530,7 +531,7 @@ Rectangle { · 7 unmodified lines
530 }531 }
531 HiFiGlyphs {532 HiFiGlyphs {
532 id: hfcGlyph;533 id: hfcGlyph;
533 visible: priceText.text !== "Undisclosed" && priceText.text !== "";534 visible: priceText.text !== "Undisclosed" && priceText.text !== "" && priceText.text !== "Free";
534 text: hifi.glyphs.hfc;535 text: hifi.glyphs.hfc;
535 // Size536 // Size
536 size: 24;537 size: 24;
@@ -618,7 +619,7 @@ Rectangle { · 81 unmodified lines
618 root.itemName = "--";619 root.itemName = "--";
619 root.itemOwner = "--";620 root.itemOwner = "--";
620 root.itemEdition = "--";621 root.itemEdition = "--";
621 root.dateOfPurchase = "--";622 root.dateAcquired = "--";
622 root.marketplaceUrl = "";623 root.marketplaceUrl = "";
623 root.itemCost = "--";624 root.itemCost = "--";
624 root.isMyCert = false;625 root.isMyCert = false;
interface/resources/qml/hifi/commerce/marketplaceItemTester/ItemUnderTest.qml+2−2
@@ -14,8 +14,8 @@ · 13 unmodified lines
14import QtQuick 2.1014import QtQuick 2.10
15import QtQuick.Controls 2.315import QtQuick.Controls 2.3
16import Hifi 1.0 as Hifi16import Hifi 1.0 as Hifi
17import "qrc:////qml//styles-uit" as HifiStylesUit17import stylesUit 1.0 as HifiStylesUit
18import "qrc:////qml//controls-uit" as HifiControlsUit18import controlsUit 1.0 as HifiControlsUit
19 19
20Rectangle {20Rectangle {
21 id: root;21 id: root;
interface/resources/qml/hifi/commerce/marketplaceItemTester/MarketplaceItemTester.qml+3−2
@@ -15,8 +15,9 @@ import QtQuick 2.10 · 14 unmodified lines
15import QtQuick.Layouts 1.115import QtQuick.Layouts 1.1
16import QtQuick.Controls 2.316import QtQuick.Controls 2.3
17import Hifi 1.0 as Hifi17import Hifi 1.0 as Hifi
18import "qrc:////qml//styles-uit" as HifiStylesUit18import stylesUit 1.0 as HifiStylesUit
19import "qrc:////qml//controls-uit" as HifiControlsUit19import controlsUit 1.0 as HifiControlsUit
20
20 21
21 22
22 23
interface/resources/qml/hifi/commerce/purchases/PurchasedItem.qml+5−5
@@ -15,8 +15,8 @@ import Hifi 1.0 as Hifi · 14 unmodified lines
15import QtQuick 2.515import QtQuick 2.5
16import QtQuick.Controls 1.416import QtQuick.Controls 1.4
17import QtQuick.Controls.Styles 1.417import QtQuick.Controls.Styles 1.4
18import "../../../styles-uit"18import stylesUit 1.0
19import "../../../controls-uit" as HifiControlsUit19import controlsUit 1.0 as HifiControlsUit
20import "../../../controls" as HifiControls20import "../../../controls" as HifiControls
21import "../wallet" as HifiWallet21import "../wallet" as HifiWallet
22import TabletScriptingInterface 1.022import TabletScriptingInterface 1.0
@@ -47,8 +47,7 @@ Item { · 24 unmodified lines
47 property string wornEntityID;47 property string wornEntityID;
48 property string upgradeUrl;48 property string upgradeUrl;
49 property string upgradeTitle;49 property string upgradeTitle;
50 property bool updateAvailable: root.upgradeUrl !== "" && !root.isShowingMyItems;50 property bool updateAvailable: root.upgradeUrl !== "";
51 property bool isShowingMyItems;
52 property bool valid;51 property bool valid;
53 52
54 property string originalStatusText;53 property string originalStatusText;
@@ -231,7 +230,7 @@ Item { · 176 unmodified lines
231 230
232 Loader {231 Loader {
233 id: giftButton;232 id: giftButton;
234 visible: !root.isShowingMyItems;233 visible: root.itemEdition > 0;
235 sourceComponent: contextCardButton;234 sourceComponent: contextCardButton;
236 anchors.right: parent.right;235 anchors.right: parent.right;
237 anchors.top: parent.top;236 anchors.top: parent.top;
@@ -345,6 +344,7 @@ Item { · 107 unmodified lines
345 344
346 Rectangle {345 Rectangle {
347 id: permissionExplanationCard;346 id: permissionExplanationCard;
347 visible: false;
348 anchors.left: parent.left;348 anchors.left: parent.left;
349 anchors.leftMargin: 30;349 anchors.leftMargin: 30;
350 anchors.top: parent.top;350 anchors.top: parent.top;
interface/resources/qml/hifi/commerce/purchases/Purchases.qml+31−46
@@ -13,13 +13,12 @@ · 12 unmodified lines
13 13
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.515import QtQuick 2.5
16import "../../../styles-uit"16import stylesUit 1.0
17import "../../../controls-uit" as HifiControlsUit17import controlsUit 1.0 as HifiControlsUit
18import "../../../controls" as HifiControls18import "../../../controls" as HifiControls
19import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.19import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.
20import "../wallet" as HifiWallet20import "../wallet" as HifiWallet
21import "../common" as HifiCommerceCommon21import "../common" as HifiCommerceCommon
22import "../inspectionCertificate" as HifiInspectionCertificate
23import "../common/sendAsset" as HifiSendAsset22import "../common/sendAsset" as HifiSendAsset
24import "../.." as HifiCommon23import "../.." as HifiCommon
25 24
@@ -34,7 +33,6 @@ Rectangle { · 8 unmodified lines
34 property bool securityImageResultReceived: false;33 property bool securityImageResultReceived: false;
35 property bool purchasesReceived: false;34 property bool purchasesReceived: false;
36 property bool punctuationMode: false;35 property bool punctuationMode: false;
37 property bool isShowingMyItems: false;
38 property bool isDebuggingFirstUseTutorial: false;36 property bool isDebuggingFirstUseTutorial: false;
39 property string installedApps;37 property string installedApps;
40 property bool keyboardRaised: false;38 property bool keyboardRaised: false;
@@ -92,7 +90,6 @@ Rectangle { · 51 unmodified lines
92 if (result.status !== 'success') {90 if (result.status !== 'success') {
93 console.log("Failed to get Available Updates", result.data.message);91 console.log("Failed to get Available Updates", result.data.message);
94 } else {92 } else {
95 sendToScript({method: 'purchases_availableUpdatesReceived', numUpdates: result.data.updates.length });
96 root.numUpdatesAvailable = result.total_entries;93 root.numUpdatesAvailable = result.total_entries;
97 }94 }
98 }95 }
@@ -106,10 +103,6 @@ Rectangle { · 7 unmodified lines
106 }103 }
107 }104 }
108 105
109 onIsShowingMyItemsChanged: {
110 getPurchases();
111 }
112
113 Timer {106 Timer {
114 id: notSetUpTimer;107 id: notSetUpTimer;
115 interval: 200;108 interval: 200;
@@ -118,19 +111,6 @@ Rectangle { · 2 unmodified lines
118 }111 }
119 }112 }
120 113
121 HifiInspectionCertificate.InspectionCertificate {
122 id: inspectionCertificate;
123 z: 998;
124 visible: false;
125 anchors.fill: parent;
126
127 Connections {
128 onSendToScript: {
129 sendToScript(message);
130 }
131 }
132 }
133
134 HifiCommerceCommon.CommerceLightbox {114 HifiCommerceCommon.CommerceLightbox {
135 id: lightboxPopup;115 id: lightboxPopup;
136 z: 999;116 z: 999;
@@ -180,7 +160,8 @@ Rectangle { · 43 unmodified lines
180 HifiCommerceCommon.EmulatedMarketplaceHeader {160 HifiCommerceCommon.EmulatedMarketplaceHeader {
181 id: titleBarContainer;161 id: titleBarContainer;
182 z: 997;162 z: 997;
183 visible: !needsLogIn.visible;163 visible: false;
164 height: 100;
184 // Size165 // Size
185 width: parent.width;166 width: parent.width;
186 // Anchors167 // Anchors
@@ -199,11 +180,6 @@ Rectangle { · 12 unmodified lines
199 lightboxPopup.button1method = function() {180 lightboxPopup.button1method = function() {
200 lightboxPopup.visible = false;181 lightboxPopup.visible = false;
201 }182 }
202 lightboxPopup.button2text = "GO TO WALLET";
203 lightboxPopup.button2method = function() {
204 sendToScript({method: 'purchases_openWallet'});
205 lightboxPopup.visible = false;
206 };
207 lightboxPopup.visible = true;183 lightboxPopup.visible = true;
208 } else {184 } else {
209 sendToScript(msg);185 sendToScript(msg);
@@ -475,7 +451,7 @@ Rectangle { · 265 unmodified lines
475 anchors.left: parent.left;451 anchors.left: parent.left;
476 anchors.leftMargin: 16;452 anchors.leftMargin: 16;
477 width: paintedWidth;453 width: paintedWidth;
478 text: isShowingMyItems ? "My Items" : "My Purchases";454 text: "Items";
479 color: hifi.colors.black;455 color: hifi.colors.black;
480 size: 22;456 size: 22;
481 }457 }
@@ -517,8 +493,13 @@ Rectangle { · 35 unmodified lines
517 "filterName": "wearable"493 "filterName": "wearable"
518 },494 },
519 {495 {
496 "separator" : true,
520 "displayName": "Updatable",497 "displayName": "Updatable",
521 "filterName": "updated"498 "filterName": "updated"
499 },
500 {
501 "displayName": "My Submissions",
502 "filterName": "proofs"
522 }503 }
523 ]504 ]
524 filterBar.primaryFilterChoices.clear();505 filterBar.primaryFilterChoices.clear();
@@ -533,6 +514,7 @@ Rectangle { · 8 unmodified lines
533 onTextChanged: {514 onTextChanged: {
534 purchasesModel.searchFilter = filterBar.text;515 purchasesModel.searchFilter = filterBar.text;
535 filterBar.previousText = filterBar.text;516 filterBar.previousText = filterBar.text;
517
536 }518 }
537 }519 }
538 }520 }
@@ -556,10 +538,18 @@ Rectangle { · 17 unmodified lines
556 listModelName: 'purchases';538 listModelName: 'purchases';
557 listView: purchasesContentsList;539 listView: purchasesContentsList;
558 getPage: function () {540 getPage: function () {
559 console.debug('getPage', purchasesModel.listModelName, root.isShowingMyItems, filterBar.primaryFilter_filterName, purchasesModel.currentPageToRetrieve, purchasesModel.itemsPerPage);541 console.debug('getPage', purchasesModel.listModelName, filterBar.primaryFilter_filterName, purchasesModel.currentPageToRetrieve, purchasesModel.itemsPerPage);
542 var editionFilter = "";
543 var primaryFilter = "";
544
545 if (filterBar.primaryFilter_filterName === "proofs") {
546 editionFilter = "proofs";
547 } else {
548 primaryFilter = filterBar.primaryFilter_filterName;
549 }
560 Commerce.inventory(550 Commerce.inventory(
561 root.isShowingMyItems ? "proofs" : "purchased",551 editionFilter,
562 filterBar.primaryFilter_filterName,552 primaryFilter,
563 filterBar.text,553 filterBar.text,
564 purchasesModel.currentPageToRetrieve,554 purchasesModel.currentPageToRetrieve,
565 purchasesModel.itemsPerPage555 purchasesModel.itemsPerPage
@@ -609,7 +599,6 @@ Rectangle { · 43 unmodified lines
609 upgradeUrl: model.upgrade_url;599 upgradeUrl: model.upgrade_url;
610 upgradeTitle: model.upgrade_title;600 upgradeTitle: model.upgrade_title;
611 itemType: model.item_type;601 itemType: model.item_type;
612 isShowingMyItems: root.isShowingMyItems;
613 valid: model.valid;602 valid: model.valid;
614 anchors.topMargin: 10;603 anchors.topMargin: 10;
615 anchors.bottomMargin: 10;604 anchors.bottomMargin: 10;
@@ -626,8 +615,6 @@ Rectangle { · 10 unmodified lines
626 sendToScript({ method: 'purchases_updateWearables' });615 sendToScript({ method: 'purchases_updateWearables' });
627 }616 }
628 } else if (msg.method === 'purchases_itemCertificateClicked') {617 } else if (msg.method === 'purchases_itemCertificateClicked') {
629 inspectionCertificate.visible = true;
630 inspectionCertificate.isLightbox = true;
631 sendToScript(msg);618 sendToScript(msg);
632 } else if (msg.method === "showInvalidatedLightbox") {619 } else if (msg.method === "showInvalidatedLightbox") {
633 lightboxPopup.titleText = "Item Invalidated";620 lightboxPopup.titleText = "Item Invalidated";
@@ -640,7 +627,7 @@ Rectangle { · 6 unmodified lines
640 lightboxPopup.visible = true;627 lightboxPopup.visible = true;
641 } else if (msg.method === "showPendingLightbox") {628 } else if (msg.method === "showPendingLightbox") {
642 lightboxPopup.titleText = "Item Pending";629 lightboxPopup.titleText = "Item Pending";
643 lightboxPopup.bodyText = 'Your item is marked "pending" while your purchase is being confirmed. ' +630 lightboxPopup.bodyText = 'Your item is marked "pending" while the transfer is being confirmed. ' +
644 "Usually, purchases take about 90 seconds to confirm.";631 "Usually, purchases take about 90 seconds to confirm.";
645 lightboxPopup.button1text = "CLOSE";632 lightboxPopup.button1text = "CLOSE";
646 lightboxPopup.button1method = function() {633 lightboxPopup.button1method = function() {
@@ -822,7 +809,8 @@ Rectangle { · 175 unmodified lines
822 809
823 Rectangle {810 Rectangle {
824 id: updatesAvailableBanner;811 id: updatesAvailableBanner;
825 visible: root.numUpdatesAvailable > 0 && !root.isShowingMyItems;812 visible: root.numUpdatesAvailable > 0 &&
813 filterBar.primaryFilter_filterName !== "proofs";
826 anchors.bottom: parent.bottom;814 anchors.bottom: parent.bottom;
827 anchors.left: parent.left;815 anchors.left: parent.left;
828 anchors.right: parent.right;816 anchors.right: parent.right;
@@ -883,9 +871,8 @@ Rectangle { · 54 unmodified lines
883 id: noItemsAlertContainer;871 id: noItemsAlertContainer;
884 visible: !purchasesContentsList.visible &&872 visible: !purchasesContentsList.visible &&
885 root.purchasesReceived &&873 root.purchasesReceived &&
886 root.isShowingMyItems &&
887 filterBar.text === "" &&874 filterBar.text === "" &&
888 filterBar.primaryFilter_displayName === "";875 filterBar.primaryFilter_filterName === "proofs";
889 anchors.top: filterBarContainer.bottom;876 anchors.top: filterBarContainer.bottom;
890 anchors.topMargin: 12;877 anchors.topMargin: 12;
891 anchors.left: parent.left;878 anchors.left: parent.left;
@@ -895,7 +882,7 @@ Rectangle { · 3 unmodified lines
895 // Explanitory text882 // Explanitory text
896 RalewayRegular {883 RalewayRegular {
897 id: noItemsYet;884 id: noItemsYet;
898 text: "<b>You haven't submitted anything to the Marketplace yet!</b><br><br>Submit an item to the Marketplace to add it to My Items.";885 text: "<b>You haven't submitted anything to the Marketplace yet!</b><br><br>Submit an item to the Marketplace to add it to My Submissions.";
899 // Text size886 // Text size
900 size: 22;887 size: 22;
901 // Anchors888 // Anchors
@@ -933,7 +920,6 @@ Rectangle { · 31 unmodified lines
933 id: noPurchasesAlertContainer;920 id: noPurchasesAlertContainer;
934 visible: !purchasesContentsList.visible &&921 visible: !purchasesContentsList.visible &&
935 root.purchasesReceived &&922 root.purchasesReceived &&
936 !root.isShowingMyItems &&
937 filterBar.text === "" &&923 filterBar.text === "" &&
938 filterBar.primaryFilter_displayName === "";924 filterBar.primaryFilter_displayName === "";
939 anchors.top: filterBarContainer.bottom;925 anchors.top: filterBarContainer.bottom;
@@ -945,7 +931,7 @@ Rectangle { · 5 unmodified lines
945 // Explanitory text931 // Explanitory text
946 RalewayRegular {932 RalewayRegular {
947 id: haventPurchasedYet;933 id: haventPurchasedYet;
948 text: "<b>You haven't purchased anything yet!</b><br><br>Get an item from <b>Marketplace</b> to add it to My Purchases.";934 text: "<b>You haven't gotten anything yet!</b><br><br>Get an item from <b>Marketplace</b> to add it to your Inventory.";
949 // Text size935 // Text size
950 size: 22;936 size: 22;
951 // Anchors937 // Anchors
@@ -1065,11 +1051,10 @@ Rectangle { · 113 unmodified lines
1065 titleBarContainer.referrerURL = message.referrerURL || "";1051 titleBarContainer.referrerURL = message.referrerURL || "";
1066 filterBar.text = message.filterText ? message.filterText : "";1052 filterBar.text = message.filterText ? message.filterText : "";
1067 break;1053 break;
1068 case 'inspectionCertificate_setCertificateId':
1069 inspectionCertificate.fromScript(message);
1070 break;
1071 case 'purchases_showMyItems':1054 case 'purchases_showMyItems':
1072 root.isShowingMyItems = true;1055 filterBar.primaryFilter_filterName = "proofs";
1056 filterBar.primaryFilter_displayName = "Proofs";
1057 filterBar.primaryFilter_index = 6;
1073 break;1058 break;
1074 case 'updateConnections':1059 case 'updateConnections':
1075 sendAsset.updateConnections(message.connections);1060 sendAsset.updateConnections(message.connections);
interface/resources/qml/hifi/commerce/wallet/Help.qml+5−8
@@ -14,8 +14,8 @@ · 13 unmodified lines
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.715import QtQuick 2.7
16import QtQuick.Controls 2.216import QtQuick.Controls 2.2
17import "../../../styles-uit"17import stylesUit 1.0
18import "../../../controls-uit" as HifiControlsUit18import controlsUit 1.0 as HifiControlsUit
19import "../../../controls" as HifiControls19import "../../../controls" as HifiControls
20 20
21// references XXX from root context21// references XXX from root context
@@ -62,7 +62,7 @@ Item { · 40 unmodified lines
62 isExpanded: false;62 isExpanded: false;
63 question: "How can I get HFC?";63 question: "How can I get HFC?";
64 answer: "High Fidelity commerce is in open beta right now. Want more HFC? \64 answer: "High Fidelity commerce is in open beta right now. Want more HFC? \
65Get it by going to <br><br><b><font color='#0093C5'><a href='#bank'>BankOfHighFidelity.</a></font></b> and meeting with the banker!";65Get it by going to <b><font color='#0093C5'><a href='#bank'>BankOfHighFidelity</a></font></b> and meeting with the banker!";
66 }66 }
67 ListElement {67 ListElement {
68 isExpanded: false;68 isExpanded: false;
@@ -74,8 +74,7 @@ In your Wallet's Send Money tab, choose from your list of connections, or choose · 5 unmodified lines
74 isExpanded: false;74 isExpanded: false;
75 question: "What is a Security Pic?"75 question: "What is a Security Pic?"
76 answer: "Your Security Pic acts as an extra layer of Wallet security. \76 answer: "Your Security Pic acts as an extra layer of Wallet security. \
77When you see your Security Pic, you know that your actions and data are securely making use of your account. \77When you see your Security Pic, you know that your actions and data are securely making use of your account.";
78<br><br><b><font color='#0093C5'><a href='#securitypic'>Tap here to change your Security Pic.</a></font></b>";
79 }78 }
80 ListElement {79 ListElement {
81 isExpanded: false;80 isExpanded: false;
@@ -137,7 +136,7 @@ At the moment, there is currently no way to convert HFC to other currencies. Sta · 55 unmodified lines
137 anchors.left: parent.left;136 anchors.left: parent.left;
138 width: parent.width;137 width: parent.width;
139 height: questionText.paintedHeight + 50;138 height: questionText.paintedHeight + 50;
140 139
141 RalewaySemiBold {140 RalewaySemiBold {
142 id: plusMinusButton;141 id: plusMinusButton;
143 text: model.isExpanded ? "-" : "+";142 text: model.isExpanded ? "-" : "+";
@@ -217,8 +216,6 @@ At the moment, there is currently no way to convert HFC to other currencies. Sta · 73 unmodified lines
217 }216 }
218 } else if (link === "#support") {217 } else if (link === "#support") {
219 Qt.openUrlExternally("mailto:support@highfidelity.com");218 Qt.openUrlExternally("mailto:support@highfidelity.com");
220 } else if (link === "#securitypic") {
221 sendSignalToWallet({method: 'walletSecurity_changeSecurityImage'});
222 }219 }
223 }220 }
224 }221 }
interface/resources/qml/hifi/commerce/wallet/NeedsLogIn.qml+3−3
@@ -13,8 +13,8 @@ · 12 unmodified lines
13 13
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.515import QtQuick 2.5
16import "../../../styles-uit"16import stylesUit 1.0
17import "../../../controls-uit" as HifiControlsUit17import controlsUit 1.0 as HifiControlsUit
18import "../../../controls" as HifiControls18import "../../../controls" as HifiControls
19 19
20// references XXX from root context20// references XXX from root context
@@ -93,7 +93,7 @@ Item { · 72 unmodified lines
93 // Text below helper text93 // Text below helper text
94 RalewayRegular {94 RalewayRegular {
95 id: loginDetailText;95 id: loginDetailText;
96 text: "To buy/sell items on the <b>Marketplace</b>, or to use your <b>Wallet</b>, you must first log in to High Fidelity.";96 text: "To get items on the <b>Marketplace</b>, or to use your <b>Assets</b>, you must first log in to High Fidelity.";
97 // Text size97 // Text size
98 size: 18;98 size: 18;
99 // Anchors99 // Anchors
interface/resources/qml/hifi/commerce/wallet/PassphraseChange.qml+2−2
@@ -13,8 +13,8 @@ · 12 unmodified lines
13 13
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.515import QtQuick 2.5
16import "../../../styles-uit"16import stylesUit 1.0
17import "../../../controls-uit" as HifiControlsUit17import controlsUit 1.0 as HifiControlsUit
18import "../../../controls" as HifiControls18import "../../../controls" as HifiControls
19 19
20// references XXX from root context20// references XXX from root context
interface/resources/qml/hifi/commerce/wallet/PassphraseModal.qml+2−2
@@ -13,8 +13,8 @@ · 12 unmodified lines
13 13
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.515import QtQuick 2.5
16import "../../../styles-uit"16import stylesUit 1.0
17import "../../../controls-uit" as HifiControlsUit17import controlsUit 1.0 as HifiControlsUit
18import "../../../controls" as HifiControls18import "../../../controls" as HifiControls
19import "../common" as HifiCommerceCommon19import "../common" as HifiCommerceCommon
20 20
interface/resources/qml/hifi/commerce/wallet/PassphraseSelection.qml+2−2
@@ -13,8 +13,8 @@ · 12 unmodified lines
13 13
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.515import QtQuick 2.5
16import "../../../styles-uit"16import stylesUit 1.0
17import "../../../controls-uit" as HifiControlsUit17import controlsUit 1.0 as HifiControlsUit
18import "../../../controls" as HifiControls18import "../../../controls" as HifiControls
19 19
20// references XXX from root context20// 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
14import Hifi 1.0 as Hifi
15import QtQuick 2.5
16import QtGraphicalEffects 1.0
17import "../../../styles-uit"
18import "../../../controls-uit" as HifiControlsUit
19import "../../../controls" as HifiControls
20
21// references XXX from root context
22
23Item {
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
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.515import QtQuick 2.5
16import QtGraphicalEffects 1.016import QtGraphicalEffects 1.0
17import "../../../styles-uit"17import stylesUit 1.0
18import "../../../controls-uit" as HifiControlsUit18import controlsUit 1.0 as HifiControlsUit
19import "../../../controls" as HifiControls19import "../../../controls" as HifiControls
20import "../common" as HifiCommerceCommon20import "../common" as HifiCommerceCommon
21import "../common/sendAsset"21import "../common/sendAsset"
22import "../.." as HifiCommon22import "../.." as HifiCommon
23import "../purchases" as HifiPurchases
24import "../inspectionCertificate" as HifiInspectionCertificate
23 25
24Rectangle {26Rectangle {
25 HifiConstants { id: hifi; }27 HifiConstants { id: hifi; }
@@ -27,6 +29,7 @@ Rectangle { · 1 unmodified line
27 id: root;29 id: root;
28 30
29 property string activeView: "initialize";31 property string activeView: "initialize";
32 property string initialActiveViewAfterStatus5: "walletInventory";
30 property bool keyboardRaised: false;33 property bool keyboardRaised: false;
31 property bool isPassword: false;34 property bool isPassword: false;
32 35
@@ -37,6 +40,10 @@ Rectangle { · 4 unmodified lines
37 source: "images/wallet-bg.jpg";40 source: "images/wallet-bg.jpg";
38 }41 }
39 42
43 Component.onDestruction: {
44 KeyboardScriptingInterface.raised = false;
45 }
46
40 Connections {47 Connections {
41 target: Commerce;48 target: Commerce;
42 49
@@ -64,7 +71,8 @@ Rectangle { · 21 unmodified lines
64 }71 }
65 } else if (walletStatus === 5) {72 } else if (walletStatus === 5) {
66 if (root.activeView !== "walletSetup") {73 if (root.activeView !== "walletSetup") {
67 root.activeView = "walletHome";74 root.activeView = root.initialActiveViewAfterStatus5;
75 Commerce.getAvailableUpdates();
68 Commerce.getSecurityImage();76 Commerce.getSecurityImage();
69 }77 }
70 } else {78 } else {
@@ -86,6 +94,21 @@ Rectangle { · 15 unmodified lines
86 titleBarSecurityImage.source = "image://security/securityImage";94 titleBarSecurityImage.source = "image://security/securityImage";
87 }95 }
88 }96 }
97
98 onAvailableUpdatesResult: {
99 if (result.status !== 'success') {
100 console.log("Failed to get Available Updates", result.data.message);
101 } else {
102 exchangeMoneyButtonContainer.messagesWaiting = result.data.updates.length > 0;
103 }
104 }
105 }
106
107 onActiveViewChanged: {
108 if (activeView === "walletHome") {
109 walletHomeButtonContainer.messagesWaiting = false;
110 sendToScript({method: 'clearShouldShowDotHistory'});
111 }
89 }112 }
90 113
91 HifiCommerceCommon.CommerceLightbox {114 HifiCommerceCommon.CommerceLightbox {
@@ -108,29 +131,32 @@ Rectangle { · 16 unmodified lines
108 anchors.top: parent.top;131 anchors.top: parent.top;
109 132
110 // Wallet icon133 // Wallet icon
111 HiFiGlyphs {134 Image {
112 id: walletIcon;135 id: walletIcon;
113 text: hifi.glyphs.wallet;136 source: "../../../../icons/tablet-icons/inventory-a.svg";
114 // Size137 height: parent.height * 0.5;
115 size: parent.height * 0.8;138 width: walletIcon.height;
116 // Anchors
117 anchors.left: parent.left;139 anchors.left: parent.left;
118 anchors.leftMargin: 8;140 anchors.leftMargin: 8;
119 anchors.verticalCenter: parent.verticalCenter;141 anchors.verticalCenter: parent.verticalCenter;
120 // Style142 visible: false; // When we use a white .svg instead of a glyph with color property, we set to invisible and use the following ColorOverlay.
143 }
144 ColorOverlay {
145 anchors.fill: walletIcon;
146 source: walletIcon;
121 color: hifi.colors.blueHighlight;147 color: hifi.colors.blueHighlight;
122 }148 }
123 149
124 // Title Bar text150 // Title Bar text
125 RalewaySemiBold {151 RalewaySemiBold {
126 id: titleBarText;152 id: titleBarText;
127 text: "WALLET";153 text: "INVENTORY";
128 // Text size154 // Text size
129 size: hifi.fontSizes.overlayTitle;155 size: hifi.fontSizes.overlayTitle;
130 // Anchors156 // Anchors
131 anchors.top: parent.top;157 anchors.top: parent.top;
132 anchors.left: walletIcon.right;158 anchors.left: walletIcon.right;
133 anchors.leftMargin: 4;159 anchors.leftMargin: 6;
134 anchors.bottom: parent.bottom;160 anchors.bottom: parent.bottom;
135 width: paintedWidth;161 width: paintedWidth;
136 // Style162 // Style
@@ -142,7 +168,7 @@ Rectangle { · 5 unmodified lines
142 Image {168 Image {
143 id: titleBarSecurityImage;169 id: titleBarSecurityImage;
144 source: "";170 source: "";
145 visible: titleBarSecurityImage.source !== "" && !securityImageChange.visible;171 visible: titleBarSecurityImage.source !== "";
146 anchors.right: parent.right;172 anchors.right: parent.right;
147 anchors.rightMargin: 6;173 anchors.rightMargin: 6;
148 anchors.top: parent.top;174 anchors.top: parent.top;
@@ -232,10 +258,6 @@ Rectangle { · 83 unmodified lines
232 root.isPassword = msg.isPasswordField;258 root.isPassword = msg.isPasswordField;
233 } else if (msg.method === 'walletSetup_lowerKeyboard') {259 } else if (msg.method === 'walletSetup_lowerKeyboard') {
234 root.keyboardRaised = false;260 root.keyboardRaised = false;
235 } else if (msg.method === 'walletSecurity_changePassphraseCancelled') {
236 root.activeView = "security";
237 } else if (msg.method === 'walletSecurity_changePassphraseSuccess') {
238 root.activeView = "security";
239 } else {261 } else {
240 sendToScript(msg);262 sendToScript(msg);
241 }263 }
@@ -245,27 +267,6 @@ Rectangle { · 3 unmodified lines
245 }267 }
246 }268 }
247 }269 }
248 SecurityImageChange {
249 id: securityImageChange;
250 visible: root.activeView === "securityImageChange";
251 z: 997;
252 anchors.top: titleBarContainer.bottom;
253 anchors.left: parent.left;
254 anchors.right: parent.right;
255 anchors.bottom: parent.bottom;
256
257 Connections {
258 onSendSignalToWallet: {
259 if (msg.method === 'walletSecurity_changeSecurityImageCancelled') {
260 root.activeView = "security";
261 } else if (msg.method === 'walletSecurity_changeSecurityImageSuccess') {
262 root.activeView = "security";
263 } else {
264 sendToScript(msg);
265 }
266 }
267 }
268 }
269 270
270 //271 //
271 // TAB CONTENTS START272 // TAB CONTENTS START
@@ -344,6 +345,39 @@ Rectangle { · 72 unmodified lines
344 }345 }
345 }346 }
346 347
348 HifiInspectionCertificate.InspectionCertificate {
349 id: inspectionCertificate;
350 z: 998;
351 visible: false;
352 anchors.fill: parent;
353
354 Connections {
355 onSendToScript: {
356 sendToScript(message);
357 }
358 }
359 }
360
361 HifiPurchases.Purchases {
362 id: walletInventory;
363 visible: root.activeView === "walletInventory";
364 anchors.top: titleBarContainer.bottom;
365 anchors.bottom: !WalletScriptingInterface.limitedCommerce ? tabButtonsContainer.top : parent.bottom;
366 anchors.left: parent.left;
367 anchors.right: parent.right;
368 Connections {
369 onSendToScript: {
370 if (message.method === 'purchases_itemCertificateClicked') {
371 inspectionCertificate.visible = true;
372 inspectionCertificate.isLightbox = true;
373 sendToScript(message);
374 } else {
375 sendToScript(message);
376 }
377 }
378 }
379 }
380
347 HifiCommon.RootHttpRequest {381 HifiCommon.RootHttpRequest {
348 id: http;382 id: http;
349 }383 }
@@ -366,39 +400,6 @@ Rectangle { · 16 unmodified lines
366 }400 }
367 }401 }
368 402
369 Security {
370 id: security;
371 visible: root.activeView === "security";
372 anchors.top: titleBarContainer.bottom;
373 anchors.bottom: tabButtonsContainer.top;
374 anchors.left: parent.left;
375 anchors.right: parent.right;
376
377 Connections {
378 onSendSignalToWallet: {
379 if (msg.method === 'walletSecurity_changePassphrase') {
380 root.activeView = "passphraseChange";
381 passphraseChange.clearPassphraseFields();
382 passphraseChange.resetSubmitButton();
383 } else if (msg.method === 'walletSecurity_changeSecurityImage') {
384 securityImageChange.initModel();
385 root.activeView = "securityImageChange";
386 } else if (msg.method === 'walletSecurity_autoLogoutHelp') {
387 lightboxPopup.titleText = "Automatically Log Out";
388 lightboxPopup.bodyText = "By default, after you log in to High Fidelity, you will stay logged in to your High Fidelity " +
389 "account even after you close and re-open Interface. This means anyone who opens Interface on your computer " +
390 "could make purchases with your Wallet.\n\n" +
391 "If you do not want to stay logged in across Interface sessions, check this box.";
392 lightboxPopup.button1text = "CLOSE";
393 lightboxPopup.button1method = function() {
394 lightboxPopup.visible = false;
395 }
396 lightboxPopup.visible = true;
397 }
398 }
399 }
400 }
401
402 Help {403 Help {
403 id: help;404 id: help;
404 visible: root.activeView === "help";405 visible: root.activeView === "help";
@@ -407,14 +408,6 @@ Rectangle { · 2 unmodified lines
407 anchors.left: parent.left;408 anchors.left: parent.left;
408 anchors.right: parent.right;409 anchors.right: parent.right;
409 410
410 Connections {
411 onSendSignalToWallet: {
412 if (msg.method === 'walletSecurity_changeSecurityImage') {
413 securityImageChange.initModel();
414 root.activeView = "securityImageChange";
415 }
416 }
417 }
418 }411 }
419 412
420 413
@@ -427,8 +420,8 @@ Rectangle { · 6 unmodified lines
427 //420 //
428 Item {421 Item {
429 id: tabButtonsContainer;422 id: tabButtonsContainer;
430 visible: !needsLogIn.visible && root.activeView !== "passphraseChange" && root.activeView !== "securityImageChange" && sendMoney.currentActiveView !== "sendAssetStep";423 visible: !needsLogIn.visible && root.activeView !== "passphraseChange" && sendMoney.currentActiveView !== "sendAssetStep" && !WalletScriptingInterface.limitedCommerce;
431 property int numTabs: 5;424 property int numTabs: 4;
432 // Size425 // Size
433 width: root.width;426 width: root.width;
434 height: 90;427 height: 90;
@@ -446,16 +439,17 @@ Rectangle { · 11 unmodified lines
446 // "WALLET HOME" tab button439 // "WALLET HOME" tab button
447 Rectangle {440 Rectangle {
448 id: walletHomeButtonContainer;441 id: walletHomeButtonContainer;
442 property bool messagesWaiting: false;
449 visible: !walletSetup.visible;443 visible: !walletSetup.visible;
450 color: root.activeView === "walletHome" ? hifi.colors.blueAccent : hifi.colors.black;444 color: root.activeView === "walletHome" ? hifi.colors.blueAccent : hifi.colors.black;
451 anchors.top: parent.top;445 anchors.top: parent.top;
452 anchors.left: parent.left;446 anchors.left: exchangeMoneyButtonContainer.right;
453 anchors.bottom: parent.bottom;447 anchors.bottom: parent.bottom;
454 width: parent.width / tabButtonsContainer.numTabs;448 width: parent.width / tabButtonsContainer.numTabs;
455 449
456 HiFiGlyphs {450 HiFiGlyphs {
457 id: homeTabIcon;451 id: homeTabIcon;
458 text: hifi.glyphs.home2;452 text: hifi.glyphs.leftRightArrows;
459 // Size453 // Size
460 size: 50;454 size: 50;
461 // Anchors455 // Anchors
@@ -463,11 +457,24 @@ Rectangle { · 1 unmodified line
463 anchors.top: parent.top;457 anchors.top: parent.top;
464 anchors.topMargin: -2;458 anchors.topMargin: -2;
465 // Style459 // Style
466 color: root.activeView === "walletHome" || walletHomeTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight;460 color: WalletScriptingInterface.limitedCommerce ? hifi.colors.lightGray50 : ((root.activeView === "walletHome" || walletHomeTabMouseArea.containsMouse) ? hifi.colors.white : hifi.colors.blueHighlight);
461 }
462
463 Rectangle {
464 id: recentActivityMessagesWaitingLight;
465 visible: parent.messagesWaiting;
466 anchors.right: homeTabIcon.left;
467 anchors.rightMargin: -4;
468 anchors.top: homeTabIcon.top;
469 anchors.topMargin: 16;
470 height: 10;
471 width: height;
472 radius: height/2;
473 color: "red";
467 }474 }
468 475
469 RalewaySemiBold {476 RalewaySemiBold {
470 text: "WALLET HOME";477 text: "RECENT ACTIVITY";
471 // Text size478 // Text size
472 size: 16;479 size: 16;
473 // Anchors480 // Anchors
@@ -478,7 +485,7 @@ Rectangle { · 4 unmodified lines
478 anchors.right: parent.right;485 anchors.right: parent.right;
479 anchors.rightMargin: 4;486 anchors.rightMargin: 4;
480 // Style487 // Style
481 color: root.activeView === "walletHome" || walletHomeTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight;488 color: WalletScriptingInterface.limitedCommerce ? hifi.colors.lightGray50 : ((root.activeView === "walletHome" || walletHomeTabMouseArea.containsMouse) ? hifi.colors.white : hifi.colors.blueHighlight);
482 wrapMode: Text.WordWrap;489 wrapMode: Text.WordWrap;
483 // Alignment490 // Alignment
484 horizontalAlignment: Text.AlignHCenter;491 horizontalAlignment: Text.AlignHCenter;
@@ -487,6 +494,7 @@ Rectangle { · 2 unmodified lines
487 MouseArea {494 MouseArea {
488 id: walletHomeTabMouseArea;495 id: walletHomeTabMouseArea;
489 anchors.fill: parent;496 anchors.fill: parent;
497 enabled: !WalletScriptingInterface.limitedCommerce;
490 hoverEnabled: enabled;498 hoverEnabled: enabled;
491 onClicked: {499 onClicked: {
492 root.activeView = "walletHome";500 root.activeView = "walletHome";
@@ -500,28 +508,46 @@ Rectangle { · 7 unmodified lines
500 // "EXCHANGE MONEY" tab button508 // "EXCHANGE MONEY" tab button
501 Rectangle {509 Rectangle {
502 id: exchangeMoneyButtonContainer;510 id: exchangeMoneyButtonContainer;
511 property bool messagesWaiting: false;
512
503 visible: !walletSetup.visible;513 visible: !walletSetup.visible;
504 color: hifi.colors.black;514 color: root.activeView === "walletInventory" ? hifi.colors.blueAccent : hifi.colors.black;
505 anchors.top: parent.top;515 anchors.top: parent.top;
506 anchors.left: walletHomeButtonContainer.right;516 anchors.left: parent.left;
507 anchors.bottom: parent.bottom;517 anchors.bottom: parent.bottom;
508 width: parent.width / tabButtonsContainer.numTabs;518 width: parent.width / tabButtonsContainer.numTabs;
509 519
510 HiFiGlyphs {520 Image {
511 id: exchangeMoneyTabIcon;521 id: exchangeMoneyTabIcon;
512 text: hifi.glyphs.leftRightArrows;522 source: "images/items-tab-a.svg";
513 // Size523 height: 25;
514 size: 50;524 width: exchangeMoneyTabIcon.height;
515 // Anchors
516 anchors.horizontalCenter: parent.horizontalCenter;525 anchors.horizontalCenter: parent.horizontalCenter;
517 anchors.top: parent.top;526 anchors.top: parent.top;
518 anchors.topMargin: -2;527 anchors.topMargin: 10;
519 // Style528 visible: false; // When we use a white .svg instead of a glyph with color property, we set to invisible and use the following ColorOverlay.
520 color: hifi.colors.lightGray50;529 }
530 ColorOverlay {
531 anchors.fill: exchangeMoneyTabIcon;
532 source: exchangeMoneyTabIcon;
533 color: root.activeView === "walletInventory" || inventoryTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight;
534 }
535
536 Rectangle {
537 id: exchangeMoneyMessagesWaitingLight;
538 visible: parent.messagesWaiting;
539 anchors.right: exchangeMoneyTabIcon.left;
540 anchors.rightMargin: 9;
541 anchors.top: exchangeMoneyTabIcon.top;
542 anchors.topMargin: 4;
543 height: 10;
544 width: height;
545 radius: height/2;
546 color: "red";
521 }547 }
522 548
523 RalewaySemiBold {549 RalewaySemiBold {
524 text: "EXCHANGE MONEY";550 text: "ITEMS";
525 // Text size551 // Text size
526 size: 16;552 size: 16;
527 // Anchors553 // Anchors
@@ -532,12 +558,24 @@ Rectangle { · 4 unmodified lines
532 anchors.right: parent.right;558 anchors.right: parent.right;
533 anchors.rightMargin: 4;559 anchors.rightMargin: 4;
534 // Style560 // Style
535 color: hifi.colors.lightGray50;561 color: root.activeView === "walletInventory" || inventoryTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight;
536 wrapMode: Text.WordWrap;562 wrapMode: Text.WordWrap;
537 // Alignment563 // Alignment
538 horizontalAlignment: Text.AlignHCenter;564 horizontalAlignment: Text.AlignHCenter;
539 verticalAlignment: Text.AlignTop;565 verticalAlignment: Text.AlignTop;
540 }566 }
567
568 MouseArea {
569 id: inventoryTabMouseArea;
570 anchors.fill: parent;
571 hoverEnabled: enabled;
572 onClicked: {
573 root.activeView = "walletInventory";
574 tabButtonsContainer.resetTabButtonColors();
575 }
576 onEntered: parent.color = hifi.colors.blueHighlight;
577 onExited: parent.color = root.activeView === "walletInventory" ? hifi.colors.blueAccent : hifi.colors.black;
578 }
541 }579 }
542 580
543 581
@@ -547,7 +585,7 @@ Rectangle { · 3 unmodified lines
547 visible: !walletSetup.visible;585 visible: !walletSetup.visible;
548 color: root.activeView === "sendMoney" ? hifi.colors.blueAccent : hifi.colors.black;586 color: root.activeView === "sendMoney" ? hifi.colors.blueAccent : hifi.colors.black;
549 anchors.top: parent.top;587 anchors.top: parent.top;
550 anchors.left: exchangeMoneyButtonContainer.right;588 anchors.left: walletHomeButtonContainer.right;
551 anchors.bottom: parent.bottom;589 anchors.bottom: parent.bottom;
552 width: parent.width / tabButtonsContainer.numTabs;590 width: parent.width / tabButtonsContainer.numTabs;
553 591
@@ -561,7 +599,7 @@ Rectangle { · 7 unmodified lines
561 anchors.top: parent.top;599 anchors.top: parent.top;
562 anchors.topMargin: -2;600 anchors.topMargin: -2;
563 // Style601 // Style
564 color: root.activeView === "sendMoney" || sendMoneyTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight;602 color: WalletScriptingInterface.limitedCommerce ? hifi.colors.lightGray50 : ((root.activeView === "sendMoney" || sendMoneyTabMouseArea.containsMouse) ? hifi.colors.white : hifi.colors.blueHighlight);
565 }603 }
566 604
567 RalewaySemiBold {605 RalewaySemiBold {
@@ -576,7 +614,7 @@ Rectangle { · 8 unmodified lines
576 anchors.right: parent.right;614 anchors.right: parent.right;
577 anchors.rightMargin: 4;615 anchors.rightMargin: 4;
578 // Style616 // Style
579 color: root.activeView === "sendMoney" || sendMoneyTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight;617 color: WalletScriptingInterface.limitedCommerce ? hifi.colors.lightGray50 : ((root.activeView === "sendMoney" || sendMoneyTabMouseArea.containsMouse) ? hifi.colors.white : hifi.colors.blueHighlight);
580 wrapMode: Text.WordWrap;618 wrapMode: Text.WordWrap;
581 // Alignment619 // Alignment
582 horizontalAlignment: Text.AlignHCenter;620 horizontalAlignment: Text.AlignHCenter;
@@ -586,6 +624,7 @@ Rectangle { · 3 unmodified lines
586 MouseArea {624 MouseArea {
587 id: sendMoneyTabMouseArea;625 id: sendMoneyTabMouseArea;
588 anchors.fill: parent;626 anchors.fill: parent;
627 enabled: !WalletScriptingInterface.limitedCommerce;
589 hoverEnabled: enabled;628 hoverEnabled: enabled;
590 onClicked: {629 onClicked: {
591 root.activeView = "sendMoney";630 root.activeView = "sendMoney";
@@ -596,67 +635,13 @@ Rectangle { · 4 unmodified lines
596 }635 }
597 }636 }
598 637
599 // "SECURITY" tab button
600 Rectangle {
601 id: securityButtonContainer;
602 visible: !walletSetup.visible;
603 color: root.activeView === "security" ? hifi.colors.blueAccent : hifi.colors.black;
604 anchors.top: parent.top;
605 anchors.left: sendMoneyButtonContainer.right;
606 anchors.bottom: parent.bottom;
607 width: parent.width / tabButtonsContainer.numTabs;
608
609 HiFiGlyphs {
610 id: securityTabIcon;
611 text: hifi.glyphs.lock;
612 // Size
613 size: 38;
614 // Anchors
615 anchors.horizontalCenter: parent.horizontalCenter;
616 anchors.top: parent.top;
617 anchors.topMargin: 2;
618 // Style
619 color: root.activeView === "security" || securityTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight;
620 }
621
622 RalewaySemiBold {
623 text: "SECURITY";
624 // Text size
625 size: 16;
626 // Anchors
627 anchors.bottom: parent.bottom;
628 height: parent.height/2;
629 anchors.left: parent.left;
630 anchors.leftMargin: 4;
631 anchors.right: parent.right;
632 anchors.rightMargin: 4;
633 // Style
634 color: root.activeView === "security" || securityTabMouseArea.containsMouse ? hifi.colors.white : hifi.colors.blueHighlight;
635 wrapMode: Text.WordWrap;
636 // Alignment
637 horizontalAlignment: Text.AlignHCenter;
638 verticalAlignment: Text.AlignTop;
639 }
640 MouseArea {
641 id: securityTabMouseArea;
642 anchors.fill: parent;
643 hoverEnabled: enabled;
644 onClicked: {
645 root.activeView = "security";
646 tabButtonsContainer.resetTabButtonColors();
647 }
648 onEntered: parent.color = hifi.colors.blueHighlight;
649 onExited: parent.color = root.activeView === "security" ? hifi.colors.blueAccent : hifi.colors.black;
650 }
651 }
652
653 // "HELP" tab button638 // "HELP" tab button
654 Rectangle {639 Rectangle {
655 id: helpButtonContainer;640 id: helpButtonContainer;
656 visible: !walletSetup.visible;641 visible: !walletSetup.visible;
657 color: root.activeView === "help" ? hifi.colors.blueAccent : hifi.colors.black;642 color: root.activeView === "help" ? hifi.colors.blueAccent : hifi.colors.black;
658 anchors.top: parent.top;643 anchors.top: parent.top;
659 anchors.left: securityButtonContainer.right;644 anchors.left: sendMoneyButtonContainer.right;
660 anchors.bottom: parent.bottom;645 anchors.bottom: parent.bottom;
661 width: parent.width / tabButtonsContainer.numTabs;646 width: parent.width / tabButtonsContainer.numTabs;
662 647
@@ -708,16 +693,16 @@ Rectangle { · 45 unmodified lines
708 function resetTabButtonColors() {693 function resetTabButtonColors() {
709 walletHomeButtonContainer.color = hifi.colors.black;694 walletHomeButtonContainer.color = hifi.colors.black;
710 sendMoneyButtonContainer.color = hifi.colors.black;695 sendMoneyButtonContainer.color = hifi.colors.black;
711 securityButtonContainer.color = hifi.colors.black;
712 helpButtonContainer.color = hifi.colors.black;696 helpButtonContainer.color = hifi.colors.black;
697 exchangeMoneyButtonContainer.color = hifi.colors.black;
713 if (root.activeView === "walletHome") {698 if (root.activeView === "walletHome") {
714 walletHomeButtonContainer.color = hifi.colors.blueAccent;699 walletHomeButtonContainer.color = hifi.colors.blueAccent;
715 } else if (root.activeView === "sendMoney") {700 } else if (root.activeView === "sendMoney") {
716 sendMoneyButtonContainer.color = hifi.colors.blueAccent;701 sendMoneyButtonContainer.color = hifi.colors.blueAccent;
717 } else if (root.activeView === "security") {
718 securityButtonContainer.color = hifi.colors.blueAccent;
719 } else if (root.activeView === "help") {702 } else if (root.activeView === "help") {
720 helpButtonContainer.color = hifi.colors.blueAccent;703 helpButtonContainer.color = hifi.colors.blueAccent;
704 } else if (root.activeView == "walletInventory") {
705 exchangeMoneyButtonContainer.color = hifi.colors.blueAccent;
721 }706 }
722 }707 }
723 }708 }
@@ -783,18 +768,40 @@ Rectangle { · 59 unmodified lines
783 break;768 break;
784 case 'updateConnections':769 case 'updateConnections':
785 sendMoney.updateConnections(message.connections);770 sendMoney.updateConnections(message.connections);
771 walletInventory.fromScript(message);
786 break;772 break;
787 case 'selectRecipient':773 case 'selectRecipient':
788 case 'updateSelectedRecipientUsername':774 case 'updateSelectedRecipientUsername':
789 sendMoney.fromScript(message);775 sendMoney.fromScript(message);
776 walletInventory.fromScript(message);
790 break;777 break;
791 case 'http.response':778 case 'http.response':
792 http.handleHttpResponse(message);779 http.handleHttpResponse(message);
780 // Duplicate handler is required because we don't track referrer for `http`
781 walletInventory.fromScript(message);
793 break;782 break;
794 case 'palIsStale':783 case 'palIsStale':
795 case 'avatarDisconnected':784 case 'avatarDisconnected':
796 // Because we don't have "channels" for sending messages to a specific QML object, the messages are broadcast to all QML Items. If an Item of yours happens to be visible when some script sends a message with a method you don't expect, you'll get "Unrecognized message..." logs.785 // Because we don't have "channels" for sending messages to a specific QML object, the messages are broadcast to all QML Items. If an Item of yours happens to be visible when some script sends a message with a method you don't expect, you'll get "Unrecognized message..." logs.
797 break;786 break;
787 case 'inspectionCertificate_setCertificateId':
788 inspectionCertificate.fromScript(message);
789 break;
790 case 'updatePurchases':
791 case 'purchases_showMyItems':
792 case 'updateWearables':
793 walletInventory.fromScript(message);
794 break;
795 case 'updateRecentActivityMessageLight':
796 walletHomeButtonContainer.messagesWaiting = message.messagesWaiting;
797 break;
798 case 'checkout_openRecentActivity':
799 if (root.activeView === "initialize") {
800 root.initialActiveViewAfterStatus5 = "walletHome";
801 } else {
802 root.activeView = "walletHome";
803 }
804 break;
798 default:805 default:
799 console.log('Unrecognized message from wallet.js:', JSON.stringify(message));806 console.log('Unrecognized message from wallet.js:', JSON.stringify(message));
800 }807 }
@@ -842,7 +849,8 @@ Rectangle { · 41 unmodified lines
842 root.activeView = "initialize";849 root.activeView = "initialize";
843 Commerce.getWalletStatus();850 Commerce.getWalletStatus();
844 } else if (msg.referrer === 'purchases') {851 } else if (msg.referrer === 'purchases') {
845 sendToScript({method: 'goToPurchases'});852 root.activeView = "walletInventory";
853 tabButtonsContainer.resetTabButtonColors();
846 } else if (msg.referrer === 'marketplace cta' || msg.referrer === 'mainPage') {854 } else if (msg.referrer === 'marketplace cta' || msg.referrer === 'mainPage') {
847 sendToScript({method: 'goToMarketplaceMainPage', itemId: msg.referrer});855 sendToScript({method: 'goToMarketplaceMainPage', itemId: msg.referrer});
848 } else {856 } else {
interface/resources/qml/hifi/commerce/wallet/WalletChoice.qml+2−2
@@ -14,8 +14,8 @@ · 13 unmodified lines
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.515import QtQuick 2.5
16import "../common" as HifiCommerceCommon16import "../common" as HifiCommerceCommon
17import "../../../styles-uit"17import stylesUit 1.0
18import "../../../controls-uit" as HifiControlsUit18import controlsUit 1.0 as HifiControlsUit
19 19
20 20
21Item {21Item {
interface/resources/qml/hifi/commerce/wallet/WalletHome.qml+2−25
@@ -15,8 +15,8 @@ import Hifi 1.0 as Hifi · 14 unmodified lines
15import QtQuick 2.515import QtQuick 2.5
16import QtGraphicalEffects 1.016import QtGraphicalEffects 1.0
17import QtQuick.Controls 2.217import QtQuick.Controls 2.2
18import "../../../styles-uit"18import stylesUit 1.0
19import "../../../controls-uit" as HifiControlsUit19import controlsUit 1.0 as HifiControlsUit
20import "../../../controls" as HifiControls20import "../../../controls" as HifiControls
21import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.21import "qrc:////qml//hifi//models" as HifiModels // Absolute path so the same code works everywhere.
22 22
@@ -29,7 +29,6 @@ Item { · 6 unmodified lines
29 if (visible) {29 if (visible) {
30 Commerce.balance();30 Commerce.balance();
31 transactionHistoryModel.getFirstPage();31 transactionHistoryModel.getFirstPage();
32 Commerce.getAvailableUpdates();
33 } else {32 } else {
34 refreshTimer.stop();33 refreshTimer.stop();
35 }34 }
@@ -179,28 +178,6 @@ Item { · 143 unmodified lines
179 color: hifi.colors.baseGrayHighlight;178 color: hifi.colors.baseGrayHighlight;
180 }179 }
181 180
182 RalewaySemiBold {
183 id: myPurchasesLink;
184 text: '<font color="#0093C5"><a href="#myPurchases">My Purchases</a></font>';
185 // Anchors
186 anchors.top: parent.top;
187 anchors.topMargin: 26;
188 anchors.right: parent.right;
189 anchors.rightMargin: 20;
190 width: paintedWidth;
191 height: 30;
192 y: 4;
193 // Text size
194 size: 18;
195 // Style
196 color: hifi.colors.baseGrayHighlight;
197 horizontalAlignment: Text.AlignRight;
198
199 onLinkActivated: {
200 sendSignalToWallet({method: 'goToPurchases_fromWalletHome'});
201 }
202 }
203
204 HifiModels.PSFListModel {181 HifiModels.PSFListModel {
205 id: transactionHistoryModel;182 id: transactionHistoryModel;
206 property int lastPendingCount: 0;183 property int lastPendingCount: 0;
interface/resources/qml/hifi/commerce/wallet/WalletSetup.qml+2−122
@@ -14,8 +14,8 @@ · 13 unmodified lines
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.515import QtQuick 2.5
16import QtGraphicalEffects 1.016import QtGraphicalEffects 1.0
17import "../../../styles-uit"17import stylesUit 1.0
18import "../../../controls-uit" as HifiControlsUit18import controlsUit 1.0 as HifiControlsUit
19import "../../../controls" as HifiControls19import "../../../controls" as HifiControls
20import "../common" as HifiCommerceCommon20import "../common" as HifiCommerceCommon
21 21
@@ -243,7 +243,6 @@ Item { · 221 unmodified lines
243 height: 50;243 height: 50;
244 text: "Set Up Wallet";244 text: "Set Up Wallet";
245 onClicked: {245 onClicked: {
246 securityImageSelection.initModel();
247 root.activeView = "step_2";246 root.activeView = "step_2";
248 }247 }
249 }248 }
@@ -267,124 +266,6 @@ Item { · 17 unmodified lines
267 // FIRST PAGE END266 // FIRST PAGE END
268 //267 //
269 268
270 //
271 // SECURITY IMAGE SELECTION START
272 //
273 Item {
274 id: securityImageContainer;
275 visible: root.activeView === "step_2";
276 // Anchors
277 anchors.top: titleBarContainer.bottom;
278 anchors.topMargin: 30;
279 anchors.bottom: parent.bottom;
280 anchors.left: parent.left;
281 anchors.leftMargin: 16;
282 anchors.right: parent.right;
283 anchors.rightMargin: 16;
284
285 // Text below title bar
286 RalewayRegular {
287 id: securityImageTitleHelper;
288 text: "Choose a Security Pic:";
289 // Text size
290 size: 24;
291 // Anchors
292 anchors.top: parent.top;
293 anchors.left: parent.left;
294 height: 50;
295 width: paintedWidth;
296 // Style
297 color: hifi.colors.white;
298 // Alignment
299 horizontalAlignment: Text.AlignHLeft;
300 verticalAlignment: Text.AlignVCenter;
301 }
302
303 SecurityImageSelection {
304 id: securityImageSelection;
305 // Anchors
306 anchors.top: securityImageTitleHelper.bottom;
307 anchors.left: parent.left;
308 anchors.right: parent.right;
309 height: 300;
310
311 Connections {
312 onSendSignalToWallet: {
313 sendSignalToWallet(msg);
314 }
315 }
316 }
317
318 // Text below security images
319 RalewayRegular {
320 text: "<b>Your security picture shows you that the service asking for your passphrase is authorized.</b> You can change your secure picture at any time.";
321 // Text size
322 size: 18;
323 // Anchors
324 anchors.top: securityImageSelection.bottom;
325 anchors.topMargin: 40;
326 anchors.left: parent.left;
327 anchors.right: parent.right;
328 height: paintedHeight;
329 // Style
330 color: hifi.colors.white;
331 wrapMode: Text.WordWrap;
332 // Alignment
333 horizontalAlignment: Text.AlignHLeft;
334 verticalAlignment: Text.AlignVCenter;
335 }
336
337 // Navigation Bar
338 Item {
339 // Size
340 width: parent.width;
341 height: 50;
342 // Anchors:
343 anchors.left: parent.left;
344 anchors.bottom: parent.bottom;
345 anchors.bottomMargin: 50;
346
347 // "Back" button
348 HifiControlsUit.Button {
349 color: hifi.buttons.noneBorderlessWhite;
350 colorScheme: hifi.colorSchemes.dark;
351 anchors.top: parent.top;
352 anchors.bottom: parent.bottom;
353 anchors.left: parent.left;
354 anchors.leftMargin: 20;
355 width: 200;
356 text: "Back"
357 onClicked: {
358 securityImageSelection.resetSelection();
359 root.activeView = "step_1";
360 }
361 }
362
363 // "Next" button
364 HifiControlsUit.Button {
365 enabled: securityImageSelection.currentIndex !== -1;
366 color: hifi.buttons.blue;
367 colorScheme: hifi.colorSchemes.dark;
368 anchors.top: parent.top;
369 anchors.bottom: parent.bottom;
370 anchors.right: parent.right;
371 anchors.rightMargin: 20;
372 width: 200;
373 text: "Next";
374 onClicked: {
375 root.lastPage = "step_2";
376 var securityImagePath = securityImageSelection.getImagePathFromImageID(securityImageSelection.getSelectedImageIndex())
377 Commerce.chooseSecurityImage(securityImagePath);
378 root.activeView = "step_3";
379 passphraseSelection.clearPassphraseFields();
380 }
381 }
382 }
383 }
384 //
385 // SECURITY IMAGE SELECTION END
386 //
387
388 //269 //
389 // SECURE PASSPHRASE SELECTION START270 // SECURE PASSPHRASE SELECTION START
390 //271 //
@@ -525,7 +406,6 @@ Item { · 134 unmodified lines
525 width: 200;406 width: 200;
526 text: "Back"407 text: "Back"
527 onClicked: {408 onClicked: {
528 securityImageSelection.resetSelection();
529 root.lastPage = "step_3";409 root.lastPage = "step_3";
530 root.activeView = "step_2";410 root.activeView = "step_2";
531 }411 }
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
10 10
11import QtQuick 2.811import QtQuick 2.8
12 12
13import "../../styles-uit"13import stylesUit 1.0
14import "../../windows"14import "../../windows"
15 15
16ScrollingWindow {16ScrollingWindow {
interface/resources/qml/hifi/dialogs/RunningScripts.qml+2−2
@@ -13,8 +13,8 @@ import QtQuick.Controls 1.4 · 12 unmodified lines
13import QtQuick.Dialogs 1.2 as OriginalDialogs13import QtQuick.Dialogs 1.2 as OriginalDialogs
14import Qt.labs.settings 1.014import Qt.labs.settings 1.0
15 15
16import "../../styles-uit"16import stylesUit 1.0
17import "../../controls-uit" as HifiControls17import controlsUit 1.0 as HifiControls
18import "../../windows"18import "../../windows"
19import "../"19import "../"
20 20
interface/resources/qml/hifi/dialogs/TabletAboutDialog.qml+1−1
@@ -9,7 +9,7 @@ · 8 unmodified lines
9//9//
10 10
11import QtQuick 2.511import QtQuick 2.5
12import "../../styles-uit"12import stylesUit 1.0
13 13
14Rectangle {14Rectangle {
15 width: 48015 width: 480
interface/resources/qml/hifi/dialogs/TabletAssetServer.qml+2−2
@@ -14,8 +14,8 @@ import QtQuick.Controls.Styles 1.4 · 13 unmodified lines
14import QtQuick.Dialogs 1.2 as OriginalDialogs14import QtQuick.Dialogs 1.2 as OriginalDialogs
15import Qt.labs.settings 1.015import Qt.labs.settings 1.0
16 16
17import "../../styles-uit"17import stylesUit 1.0
18import "../../controls-uit" as HifiControls18import controlsUit 1.0 as HifiControls
19import "../../windows"19import "../../windows"
20import ".."20import ".."
21 21
interface/resources/qml/hifi/dialogs/TabletDCDialog.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12import Qt.labs.settings 1.012import Qt.labs.settings 1.0
13 13
14import "../../styles-uit"14import stylesUit 1.0
15import "../../controls-uit" as HifiControls15import controlsUit 1.0 as HifiControls
16import "../../windows"16import "../../windows"
17 17
18Rectangle {18Rectangle {
interface/resources/qml/hifi/dialogs/TabletDebugWindow.qml+2−2
@@ -12,8 +12,8 @@ import QtQuick 2.7 · 11 unmodified lines
12import QtQuick.Controls 2.212import QtQuick.Controls 2.2
13import Hifi 1.0 as Hifi13import Hifi 1.0 as Hifi
14 14
15import "../../styles-uit"15import stylesUit 1.0
16import "../../controls-uit" as HifiControls16import controlsUit 1.0 as HifiControls
17 17
18Rectangle {18Rectangle {
19 id: root19 id: root
interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12import Qt.labs.settings 1.012import Qt.labs.settings 1.0
13 13
14import "../../styles-uit"14import stylesUit 1.0
15import "../../controls-uit" as HifiControls15import controlsUit 1.0 as HifiControls
16import "../../windows"16import "../../windows"
17 17
18Rectangle {18Rectangle {
interface/resources/qml/hifi/dialogs/TabletEntityStatisticsItem.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
10 10
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../../styles-uit"13import stylesUit 1.0
14import "../../controls-uit" as HifiControls14import controlsUit 1.0 as HifiControls
15 15
16Column {16Column {
17 id: root17 id: root
interface/resources/qml/hifi/dialogs/TabletLODTools.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
10 10
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../../styles-uit"13import stylesUit 1.0
14import "../../controls-uit" as HifiControls14import controlsUit 1.0 as HifiControls
15import "../../windows"15import "../../windows"
16 16
17Rectangle {17Rectangle {
interface/resources/qml/hifi/dialogs/TabletRunningScripts.qml+6−2
@@ -13,8 +13,8 @@ import QtQuick.Controls 1.4 · 12 unmodified lines
13import QtQuick.Dialogs 1.2 as OriginalDialogs13import QtQuick.Dialogs 1.2 as OriginalDialogs
14import Qt.labs.settings 1.014import Qt.labs.settings 1.0
15 15
16import "../../styles-uit"16import stylesUit 1.0
17import "../../controls-uit" as HifiControls17import controlsUit 1.0 as HifiControls
18import "../../windows"18import "../../windows"
19import "../"19import "../"
20 20
@@ -88,6 +88,10 @@ Rectangle { · 67 unmodified lines
88 checkMenu.restart();88 checkMenu.restart();
89 }89 }
90 90
91 Component.onDestruction: {
92 keyboard.raised = false;
93 }
94
91 function updateRunningScripts() {95 function updateRunningScripts() {
92 function simplify(path) {96 function simplify(path) {
93 // trim URI querystring/fragment97 // trim URI querystring/fragment
interface/resources/qml/hifi/dialogs/content/ModelBrowserContent.qml+1−1
@@ -1,7 +1,7 @@
1import QtQuick 2.71import QtQuick 2.7
2import QtQuick.Controls 2.32import QtQuick.Controls 2.3
3 3
4import "../../../controls-uit" as HifiControls4import controlsUit 1.0 as HifiControls
5 5
6Column {6Column {
7 width: pane.contentWidth7 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
14import Hifi 1.0 as Hifi
15import QtQuick 2.5
16import QtGraphicalEffects 1.0
17import stylesUit 1.0 as HifiStylesUit
18import controlsUit 1.0 as HifiControlsUit
19import "qrc:////qml//controls" as HifiControls
20import "qrc:////qml//hifi//commerce//common" as HifiCommerceCommon
21
22Rectangle {
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 @@
1//1//
2// SecurityImageChange.qml2// SecurityImageChange.qml
3// qml/hifi/commerce/wallet3// qml\hifi\dialogs\security
4//4//
5// SecurityImageChange5// Security
6//6//
7// Created by Zach Fox on 2017-08-187// Created by Zach Fox on 2018-10-31
8// Copyright 2017 High Fidelity, Inc.8// Copyright 2018 High Fidelity, Inc.
9//9//
10// Distributed under the Apache License, Version 2.0.10// Distributed under the Apache License, Version 2.0.
11// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html11// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@@ -13,16 +13,17 @@ · 1 unmodified line
13 13
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.515import QtQuick 2.5
16import "../../../styles-uit"16import stylesUit 1.0 as HifiStylesUit
17import "../../../controls-uit" as HifiControlsUit17import controlsUit 1.0 as HifiControlsUit
18import "../../../controls" as HifiControls18import "qrc:////qml//controls" as HifiControls
19 19
20// references XXX from root context20// references XXX from root context
21 21
22Item {22Rectangle {
23 HifiConstants { id: hifi; }23 HifiStylesUit.HifiConstants { id: hifi; }
24 24
25 id: root;25 id: root;
26 color: hifi.colors.baseGray;
26 property bool justSubmitted: false;27 property bool justSubmitted: false;
27 28
28 Connections {29 Connections {
@@ -33,7 +34,7 @@ Item { · 4 unmodified lines
33 securityImageChangePageSecurityImage.source = "image://security/securityImage";34 securityImageChangePageSecurityImage.source = "image://security/securityImage";
34 if (exists) { // Success submitting new security image35 if (exists) { // Success submitting new security image
35 if (root.justSubmitted) {36 if (root.justSubmitted) {
36 sendSignalToWallet({method: "walletSecurity_changeSecurityImageSuccess"});37 sendSignalToParent({method: "walletSecurity_changeSecurityImageSuccess"});
37 root.justSubmitted = false;38 root.justSubmitted = false;
38 }39 }
39 } else if (root.justSubmitted) {40 } else if (root.justSubmitted) {
@@ -72,7 +73,7 @@ Item { · 32 unmodified lines
72 anchors.bottom: parent.bottom;73 anchors.bottom: parent.bottom;
73 height: 22;74 height: 22;
74 // Lock icon75 // Lock icon
75 HiFiGlyphs {76 HifiStylesUit.HiFiGlyphs {
76 id: lockIcon;77 id: lockIcon;
77 text: hifi.glyphs.lock;78 text: hifi.glyphs.lock;
78 anchors.bottom: parent.bottom;79 anchors.bottom: parent.bottom;
@@ -83,8 +84,8 @@ Item { · 4 unmodified lines
83 verticalAlignment: Text.AlignBottom;84 verticalAlignment: Text.AlignBottom;
84 color: hifi.colors.white;85 color: hifi.colors.white;
85 }86 }
86 // "Security image" text below pic87 // "Security image" text below image
87 RalewayRegular {88 HifiStylesUit.RalewayRegular {
88 id: securityImageText;89 id: securityImageText;
89 text: "SECURITY PIC";90 text: "SECURITY PIC";
90 // Text size91 // Text size
@@ -116,9 +117,9 @@ Item { · 25 unmodified lines
116 anchors.bottom: parent.bottom;117 anchors.bottom: parent.bottom;
117 118
118 // "Change Security Image" text119 // "Change Security Image" text
119 RalewaySemiBold {120 HifiStylesUit.RalewaySemiBold {
120 id: securityImageTitle;121 id: securityImageTitle;
121 text: "Change Security Pic:";122 text: "Change Security Image:";
122 // Text size123 // Text size
123 size: 18;124 size: 18;
124 anchors.top: parent.top;125 anchors.top: parent.top;
@@ -139,12 +140,6 @@ Item { · 14 unmodified lines
139 anchors.right: parent.right;140 anchors.right: parent.right;
140 anchors.rightMargin: 16;141 anchors.rightMargin: 16;
141 height: 300;142 height: 300;
142
143 Connections {
144 onSendSignalToWallet: {
145 sendSignalToWallet(msg);
146 }
147 }
148 }143 }
149 144
150 // Navigation Bar145 // Navigation Bar
@@ -169,7 +164,7 @@ Item { · 18 unmodified lines
169 width: 150;164 width: 150;
170 text: "Cancel"165 text: "Cancel"
171 onClicked: {166 onClicked: {
172 sendSignalToWallet({method: "walletSecurity_changeSecurityImageCancelled"});167 sendSignalToParent({method: "walletSecurity_changeSecurityImageCancelled"});
173 }168 }
174 }169 }
175 170
@@ -197,7 +192,7 @@ Item { · 21 unmodified lines
197 // SECURITY IMAGE SELECTION END192 // SECURITY IMAGE SELECTION END
198 //193 //
199 194
200 signal sendSignalToWallet(var msg);195 signal sendSignalToParent(var msg);
201 196
202 function initModel() {197 function initModel() {
203 securityImageSelection.initModel();198 securityImageSelection.initModel();
interface/resources/qml/hifi/dialogs/security/SecurityImageModel.qmlrenamed from interface/resources/qml/hifi/commerce/wallet/SecurityImageModel.qml+4−4
@@ -1,11 +1,11 @@
1//1//
2// SecurityImageModel.qml2// SecurityImageModel.qml
3// qml/hifi/commerce3// qml\hifi\dialogs\security
4//4//
5// SecurityImageModel5// Security
6//6//
7// Created by Zach Fox on 2017-08-177// Created by Zach Fox on 2018-10-31
8// Copyright 2017 High Fidelity, Inc.8// Copyright 2018 High Fidelity, Inc.
9//9//
10// Distributed under the Apache License, Version 2.0.10// Distributed under the Apache License, Version 2.0.
11// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html11// 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 @@
1//1//
2// SecurityImageSelection.qml2// SecurityImageSelection.qml
3// qml/hifi/commerce/wallet3// qml\hifi\dialogs\security
4//4//
5// SecurityImageSelection5// Security
6//6//
7// Created by Zach Fox on 2017-08-177// Created by Zach Fox on 2018-10-31
8// Copyright 2017 High Fidelity, Inc.8// Copyright 2018 High Fidelity, Inc.
9//9//
10// Distributed under the Apache License, Version 2.0.10// Distributed under the Apache License, Version 2.0.
11// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html11// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@@ -13,14 +13,14 @@ · 1 unmodified line
13 13
14import Hifi 1.0 as Hifi14import Hifi 1.0 as Hifi
15import QtQuick 2.515import QtQuick 2.5
16import "../../../styles-uit"16import stylesUit 1.0 as HifiStylesUit
17import "../../../controls-uit" as HifiControlsUit17import controlsUit 1.0 as HifiControlsUit
18import "../../../controls" as HifiControls18import "qrc:////qml//controls" as HifiControls
19 19
20// references XXX from root context20// references XXX from root context
21 21
22Item {22Item {
23 HifiConstants { id: hifi; }23 HifiStylesUit.HifiConstants { id: hifi; }
24 24
25 id: root;25 id: root;
26 property alias currentIndex: securityImageGrid.currentIndex;26 property alias currentIndex: securityImageGrid.currentIndex;
@@ -64,17 +64,15 @@ Item { · 37 unmodified lines
64 }64 }
65 }65 }
66 highlight: Rectangle {66 highlight: Rectangle {
67 width: securityImageGrid.cellWidth;67 width: securityImageGrid.cellWidth;
68 height: securityImageGrid.cellHeight;68 height: securityImageGrid.cellHeight;
69 color: hifi.colors.blueHighlight;69 color: hifi.colors.blueHighlight;
70 }70 }
71 }71 }
72 72
73 //73 //
74 // FUNCTION DEFINITIONS START74 // FUNCTION DEFINITIONS START
75 //75 //
76 signal sendSignalToWallet(var msg);
77
78 function getImagePathFromImageID(imageID) {76 function getImagePathFromImageID(imageID) {
79 return (imageID ? gridModel.getImagePathFromImageID(imageID) : "");77 return (imageID ? gridModel.getImagePathFromImageID(imageID) : "");
80 }78 }
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
10import QtQuick 2.510import QtQuick 2.5
11import QtGraphicalEffects 1.011import QtGraphicalEffects 1.0
12 12
13import "../../styles-uit"13import stylesUit 1.0
14import "../../controls"14import "../../controls"
15import "../../controls-uit" as HifiControls15import controlsUit 1.0 as HifiControls
16 16
17 17
18Rectangle {18Rectangle {
interface/resources/qml/hifi/tablet/ControllerSettings.qml+2−2
@@ -11,9 +11,9 @@ import QtQuick.Controls 2.2 · 10 unmodified lines
11import QtQuick.Layouts 1.311import QtQuick.Layouts 1.3
12import QtGraphicalEffects 1.012import QtGraphicalEffects 1.0
13import Qt.labs.settings 1.013import Qt.labs.settings 1.0
14import "../../styles-uit"14import stylesUit 1.0
15import "../../controls"15import "../../controls"
16import "../../controls-uit" as HifiControls16import controlsUit 1.0 as HifiControls
17import "../../dialogs"17import "../../dialogs"
18import "../../dialogs/preferences"18import "../../dialogs/preferences"
19import "tabletWindows"19import "tabletWindows"
interface/resources/qml/hifi/tablet/Edit.qml+6−0
@@ -49,5 +49,11 @@ StackView { · 48 unmodified lines
49 if (currentItem && currentItem.fromScript)49 if (currentItem && currentItem.fromScript)
50 currentItem.fromScript(message);50 currentItem.fromScript(message);
51 }51 }
52
53 Component.onDestruction: {
54 if (KeyboardScriptingInterface.raised) {
55 KeyboardScriptingInterface.raised = false;
56 }
57 }
52}58}
53 59
interface/resources/qml/hifi/tablet/EditEntityList.qml+2−2
@@ -4,8 +4,8 @@ import QtWebChannel 1.0 · 3 unmodified lines
4import "../../controls"4import "../../controls"
5import "../toolbars"5import "../toolbars"
6import QtGraphicalEffects 1.06import QtGraphicalEffects 1.0
7import "../../controls-uit" as HifiControls7import controlsUit 1.0 as HifiControls
8import "../../styles-uit"8import stylesUit 1.0
9 9
10 10
11WebView {11WebView {
interface/resources/qml/hifi/tablet/EditTabButton.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
11 11
12import QtQuick 2.712import QtQuick 2.7
13import QtQuick.Controls 2.213import QtQuick.Controls 2.2
14import "../../controls-uit" as HifiControls14import controlsUit 1.0 as HifiControls
15import "../../styles-uit"15import stylesUit 1.0
16 16
17TabButton {17TabButton {
18 id: control18 id: control
interface/resources/qml/hifi/tablet/EditTabView.qml+3−21
@@ -4,8 +4,8 @@ import QtWebChannel 1.0 · 3 unmodified lines
4import "../../controls"4import "../../controls"
5import "../toolbars"5import "../toolbars"
6import QtGraphicalEffects 1.06import QtGraphicalEffects 1.0
7import "../../controls-uit" as HifiControls7import controlsUit 1.0 as HifiControls
8import "../../styles-uit"8import stylesUit 1.0
9 9
10TabBar {10TabBar {
11 id: editTabView11 id: editTabView
@@ -175,7 +175,7 @@ TabBar { · 163 unmodified lines
175 method: "newEntityButtonClicked",175 method: "newEntityButtonClicked",
176 params: { buttonName: "newParticleButton" }176 params: { buttonName: "newParticleButton" }
177 });177 });
178 editTabView.currentIndex = 4178 editTabView.currentIndex = 2
179 }179 }
180 }180 }
181 181
@@ -279,21 +279,6 @@ TabBar { · 97 unmodified lines
279 }279 }
280 }280 }
281 281
282 EditTabButton {
283 title: "P"
284 active: true
285 enabled: true
286 property string originalUrl: ""
287
288 property Component visualItem: Component {
289 WebView {
290 id: particleExplorerWebView
291 url: Paths.defaultScripts + "/system/particle_explorer/particleExplorer.html"
292 enabled: true
293 }
294 }
295 }
296
297 function fromScript(message) {282 function fromScript(message) {
298 switch (message.method) {283 switch (message.method) {
299 case 'selectTab':284 case 'selectTab':
@@ -326,9 +311,6 @@ TabBar { · 26 unmodified lines
326 case 'grid':311 case 'grid':
327 editTabView.currentIndex = 3;312 editTabView.currentIndex = 3;
328 break;313 break;
329 case 'particle':
330 editTabView.currentIndex = 4;
331 break;
332 default:314 default:
333 console.warn('Attempt to switch to invalid tab:', id);315 console.warn('Attempt to switch to invalid tab:', id);
334 }316 }
interface/resources/qml/hifi/tablet/EditToolsTabView.qml+4−23
@@ -4,8 +4,8 @@ import QtWebChannel 1.0 · 3 unmodified lines
4import "../../controls"4import "../../controls"
5import "../toolbars"5import "../toolbars"
6import QtGraphicalEffects 1.06import QtGraphicalEffects 1.0
7import "../../controls-uit" as HifiControls7import controlsUit 1.0 as HifiControls
8import "../../styles-uit"8import stylesUit 1.0
9 9
10TabBar {10TabBar {
11 id: editTabView11 id: editTabView
@@ -18,7 +18,6 @@ TabBar { · 6 unmodified lines
18 readonly property int create: 018 readonly property int create: 0
19 readonly property int properties: 119 readonly property int properties: 1
20 readonly property int grid: 220 readonly property int grid: 2
21 readonly property int particle: 3
22 }21 }
23 22
24 readonly property HifiConstants hifi: HifiConstants {}23 readonly property HifiConstants hifi: HifiConstants {}
@@ -182,7 +181,7 @@ TabBar { · 157 unmodified lines
182 method: "newEntityButtonClicked",181 method: "newEntityButtonClicked",
183 params: { buttonName: "newParticleButton" }182 params: { buttonName: "newParticleButton" }
184 });183 });
185 editTabView.currentIndex = tabIndex.particle184 editTabView.currentIndex = tabIndex.properties
186 }185 }
187 }186 }
188 187
@@ -271,21 +270,6 @@ TabBar { · 82 unmodified lines
271 }270 }
272 }271 }
273 272
274 EditTabButton {
275 title: "P"
276 active: true
277 enabled: true
278 property string originalUrl: ""
279
280 property Component visualItem: Component {
281 WebView {
282 id: particleExplorerWebView
283 url: Paths.defaultScripts + "/system/particle_explorer/particleExplorer.html"
284 enabled: true
285 }
286 }
287 }
288
289 function fromScript(message) {273 function fromScript(message) {
290 switch (message.method) {274 switch (message.method) {
291 case 'selectTab':275 case 'selectTab':
@@ -299,7 +283,7 @@ TabBar { · 7 unmodified lines
299 // Changes the current tab based on tab index or title as input283 // Changes the current tab based on tab index or title as input
300 function selectTab(id) {284 function selectTab(id) {
301 if (typeof id === 'number') {285 if (typeof id === 'number') {
302 if (id >= tabIndex.create && id <= tabIndex.particle) {286 if (id >= tabIndex.create && id <= tabIndex.grid) {
303 editTabView.currentIndex = id;287 editTabView.currentIndex = id;
304 } else {288 } else {
305 console.warn('Attempt to switch to invalid tab:', id);289 console.warn('Attempt to switch to invalid tab:', id);
@@ -315,9 +299,6 @@ TabBar { · 9 unmodified lines
315 case 'grid':299 case 'grid':
316 editTabView.currentIndex = tabIndex.grid;300 editTabView.currentIndex = tabIndex.grid;
317 break;301 break;
318 case 'particle':
319 editTabView.currentIndex = tabIndex.particle;
320 break;
321 default:302 default:
322 console.warn('Attempt to switch to invalid tab:', id);303 console.warn('Attempt to switch to invalid tab:', id);
323 }304 }
interface/resources/qml/hifi/tablet/InputRecorder.qml+2−2
@@ -9,8 +9,8 @@ · 8 unmodified lines
9import QtQuick 2.59import QtQuick 2.5
10import Hifi 1.010import Hifi 1.0
11 11
12import "../../styles-uit"12import stylesUit 1.0
13import "../../controls-uit" as HifiControls13import controlsUit 1.0 as HifiControls
14import "../../windows"14import "../../windows"
15import "../../dialogs"15import "../../dialogs"
16 16
interface/resources/qml/hifi/tablet/NewMaterialDialog.qml+2−2
@@ -13,8 +13,8 @@ import QtQuick 2.7 · 12 unmodified lines
13import QtQuick.Controls 2.213import QtQuick.Controls 2.2
14import QtQuick.Dialogs 1.2 as OriginalDialogs14import QtQuick.Dialogs 1.2 as OriginalDialogs
15 15
16import "../../styles-uit"16import stylesUit 1.0
17import "../../controls-uit"17import controlsUit 1.0
18import "../dialogs"18import "../dialogs"
19 19
20Rectangle {20Rectangle {
interface/resources/qml/hifi/tablet/NewModelDialog.qml+2−2
@@ -12,8 +12,8 @@ · 11 unmodified lines
12import QtQuick 2.512import QtQuick 2.5
13import QtQuick.Dialogs 1.2 as OriginalDialogs13import QtQuick.Dialogs 1.2 as OriginalDialogs
14 14
15import "../../styles-uit"15import stylesUit 1.0
16import "../../controls-uit"16import controlsUit 1.0
17import "../dialogs"17import "../dialogs"
18 18
19Rectangle {19Rectangle {
interface/resources/qml/hifi/tablet/OpenVrConfiguration.qml+40−5
@@ -9,9 +9,9 @@ · 8 unmodified lines
9import QtQuick 2.59import QtQuick 2.5
10import QtGraphicalEffects 1.010import QtGraphicalEffects 1.0
11 11
12import "../../styles-uit"12import stylesUit 1.0
13import "../../controls"13import "../../controls"
14import "../../controls-uit" as HifiControls14import controlsUit 1.0 as HifiControls
15import "."15import "."
16 16
17 17
@@ -822,11 +822,44 @@ Flickable { · 804 unmodified lines
822 }822 }
823 }823 }
824 824
825 Row {
826 id: outOfRangeDataStrategyRow
827 anchors.top: viveInDesktop.bottom
828 anchors.topMargin: 5
829 anchors.left: openVrConfiguration.left
830 anchors.leftMargin: leftMargin + 10
831 spacing: 15
832
833 RalewayRegular {
834 id: outOfRangeDataStrategyLabel
835 size: 12
836 text: "Out Of Range Data Strategy:"
837 color: hifi.colors.lightGrayText
838 topPadding: 5
839 }
840
841 HifiControls.ComboBox {
842 id: outOfRangeDataStrategyComboBox
843
844 height: 25
845 width: 100
846
847 editable: true
848 colorScheme: hifi.colorSchemes.dark
849 model: ["None", "Freeze", "Drop"]
850 label: ""
851
852 onCurrentIndexChanged: {
853 sendConfigurationSettings();
854 }
855 }
856 }
857
825 RalewayBold {858 RalewayBold {
826 id: viveDesktopText859 id: viveDesktopText
827 size: 10860 size: 12
828 text: "Use " + stack.selectedPlugin + " devices in desktop mode"861 text: "Use " + stack.selectedPlugin + " devices in desktop mode"
829 color: hifi.colors.white862 color: hifi.colors.lightGrayText
830 863
831 anchors {864 anchors {
832 left: viveInDesktop.right865 left: viveInDesktop.right
@@ -946,6 +979,7 @@ Flickable { · 113 unmodified lines
946 979
947 viveInDesktop.checked = desktopMode;980 viveInDesktop.checked = desktopMode;
948 hmdInDesktop.checked = hmdDesktopPosition;981 hmdInDesktop.checked = hmdDesktopPosition;
982 outOfRangeDataStrategyComboBox.currentIndex = outOfRangeDataStrategyComboBox.model.indexOf(settings.outOfRangeDataStrategy);
949 983
950 initializeButtonState();984 initializeButtonState();
951 updateCalibrationText();985 updateCalibrationText();
@@ -1107,7 +1141,8 @@ Flickable { · 155 unmodified lines
1107 "armCircumference": armCircumference.realValue,1141 "armCircumference": armCircumference.realValue,
1108 "shoulderWidth": shoulderWidth.realValue,1142 "shoulderWidth": shoulderWidth.realValue,
1109 "desktopMode": viveInDesktop.checked,1143 "desktopMode": viveInDesktop.checked,
1110 "hmdDesktopTracking": hmdInDesktop.checked1144 "hmdDesktopTracking": hmdInDesktop.checked,
1145 "outOfRangeDataStrategy": outOfRangeDataStrategyComboBox.model[outOfRangeDataStrategyComboBox.currentIndex]
1111 }1146 }
1112 1147
1113 return settingsObject;1148 return settingsObject;
interface/resources/qml/hifi/tablet/TabletAddressDialog.qml+10−2
@@ -18,8 +18,8 @@ import "../../styles" · 17 unmodified lines
18import "../../windows"18import "../../windows"
19import "../"19import "../"
20import "../toolbars"20import "../toolbars"
21import "../../styles-uit" as HifiStyles21import stylesUit 1.0 as HifiStyles
22import "../../controls-uit" as HifiControls22import controlsUit 1.0 as HifiControls
23import QtQuick.Controls 2.2 as QQC223import QtQuick.Controls 2.2 as QQC2
24import QtQuick.Templates 2.2 as T24import QtQuick.Templates 2.2 as T
25 25
@@ -56,10 +56,13 @@ StackView { · 30 unmodified lines
56 Qt.callLater(function() {56 Qt.callLater(function() {
57 addressBarDialog.keyboardEnabled = HMD.active;57 addressBarDialog.keyboardEnabled = HMD.active;
58 addressLine.forceActiveFocus();58 addressLine.forceActiveFocus();
59 addressBarDialog.raised = true;
59 })60 })
60 }61 }
62
61 Component.onDestruction: {63 Component.onDestruction: {
62 root.parentChanged.disconnect(center);64 root.parentChanged.disconnect(center);
65 keyboard.raised = false;
63 }66 }
64 67
65 function center() {68 function center() {
@@ -218,6 +221,11 @@ StackView { · 152 unmodified lines
218 leftMargin: 8;221 leftMargin: 8;
219 verticalCenter: addressLineContainer.verticalCenter;222 verticalCenter: addressLineContainer.verticalCenter;
220 }223 }
224
225 onFocusChanged: {
226 addressBarDialog.raised = focus;
227 }
228
221 onTextChanged: {229 onTextChanged: {
222 updateLocationText(text.length > 0);230 updateLocationText(text.length > 0);
223 }231 }
interface/resources/qml/hifi/tablet/TabletHome.qml+1−1
@@ -6,7 +6,7 @@ import QtQuick.Layouts 1.3 · 5 unmodified lines
6import TabletScriptingInterface 1.06import TabletScriptingInterface 1.0
7 7
8import "."8import "."
9import "../../styles-uit"9import stylesUit 1.0
10import "../audio" as HifiAudio10import "../audio" as HifiAudio
11 11
12Item {12Item {
interface/resources/qml/hifi/tablet/TabletMenu.qml+1−1
@@ -7,7 +7,7 @@ import QtWebEngine 1.1 · 6 unmodified lines
7 7
8 8
9import "."9import "."
10import "../../styles-uit"10import stylesUit 1.0
11import "../../controls"11import "../../controls"
12 12
13FocusScope {13FocusScope {
interface/resources/qml/hifi/tablet/TabletMenuItem.qml+2−2
@@ -11,8 +11,8 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12import QtQuick.Controls 1.412import QtQuick.Controls 1.4
13 13
14import "../../controls-uit"14import controlsUit 1.0
15import "../../styles-uit"15import stylesUit 1.0
16 16
17Item {17Item {
18 id: root18 id: root
interface/resources/qml/hifi/tablet/TabletMenuView.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12import TabletScriptingInterface 1.012import TabletScriptingInterface 1.0
13 13
14import "../../styles-uit"14import stylesUit 1.0
15import "."15import "."
16 16
17FocusScope {17FocusScope {
interface/resources/qml/hifi/tablet/TabletModelBrowserDialog.qml+2−2
@@ -10,8 +10,8 @@ · 9 unmodified lines
10 10
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../../controls-uit" as HifiControls13import controlsUit 1.0 as HifiControls
14import "../../styles-uit"14import stylesUit 1.0
15import "../dialogs/content"15import "../dialogs/content"
16 16
17Item {17Item {
interface/resources/qml/hifi/tablet/WindowRoot.qml+15−2
@@ -129,8 +129,21 @@ Windows.ScrollingWindow { · 128 unmodified lines
129 129
130 height: pane.scrollHeight130 height: pane.scrollHeight
131 width: pane.contentWidth131 width: pane.contentWidth
132 anchors.left: parent.left132
133 anchors.top: parent.top133 // this might be looking not clear from the first look
134 // but loader.parent is not tabletRoot and it can be null!
135 // unfortunately we can't use conditional bindings here due to https://bugreports.qt.io/browse/QTBUG-22005
136
137 onParentChanged: {
138 if (parent) {
139 anchors.left = Qt.binding(function() { return parent.left })
140 anchors.top = Qt.binding(function() { return parent.top })
141 } else {
142 anchors.left = undefined
143 anchors.top = undefined
144 }
145 }
146
134 signal loaded;147 signal loaded;
135 148
136 onWidthChanged: {149 onWidthChanged: {
interface/resources/qml/hifi/tablet/tabletWindows/TabletFileDialog.qml+2−2
@@ -16,8 +16,8 @@ import QtQuick.Controls 1.4 as QQC1 · 15 unmodified lines
16import QtQuick.Controls 2.316import QtQuick.Controls 2.3
17 17
18import ".."18import ".."
19import "../../../controls-uit"19import controlsUit 1.0
20import "../../../styles-uit"20import stylesUit 1.0
21import "../../../windows"21import "../../../windows"
22 22
23import "../../../dialogs/fileDialog"23import "../../../dialogs/fileDialog"
interface/resources/qml/hifi/tablet/tabletWindows/TabletPreferencesDialog.qml+6−2
@@ -12,8 +12,8 @@ import QtQuick 2.5 · 11 unmodified lines
12 12
13import "."13import "."
14import "./preferences"14import "./preferences"
15import "../../../styles-uit"15import stylesUit 1.0
16import "../../../controls-uit" as HifiControls16import controlsUit 1.0 as HifiControls
17 17
18Item {18Item {
19 id: dialog19 id: dialog
@@ -242,6 +242,10 @@ Item { · 222 unmodified lines
242 keyboardEnabled = HMD.active;242 keyboardEnabled = HMD.active;
243 }243 }
244 244
245 Component.onDestruction: {
246 keyboard.raised = false;
247 }
248
245 onKeyboardRaisedChanged: {249 onKeyboardRaisedChanged: {
246 if (keyboardEnabled && keyboardRaised) {250 if (keyboardEnabled && keyboardRaised) {
247 var delta = mouseArea.mouseY - (dialog.height - footer.height - keyboard.raisedHeight -hifi.dimensions.controlLineHeight);251 var delta = mouseArea.mouseY - (dialog.height - footer.height - keyboard.raisedHeight -hifi.dimensions.controlLineHeight);
interface/resources/qml/hifi/tablet/tabletWindows/preferences/Section.qml+2−2
@@ -12,8 +12,8 @@ import QtQuick 2.5 · 11 unmodified lines
12import Hifi 1.012import Hifi 1.0
13 13
14import "../../../../dialogs/preferences"14import "../../../../dialogs/preferences"
15import "../../../../controls-uit" as HiFiControls15import controlsUit 1.0 as HiFiControls
16import "../../../../styles-uit"16import stylesUit 1.0
17import "."17import "."
18 18
19Preference {19Preference {
interface/resources/qml/hifi/tablet/tabletWindows/preferences/TabletBrowsablePreference.qml+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
11import QtQuick 2.511import QtQuick 2.5
12 12
13import "../../../../dialogs"13import "../../../../dialogs"
14import "../../../../controls-uit"14import controlsUit 1.0
15import "../"15import "../"
16 16
17Preference {17Preference {
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
13import Hifi 1.0 as Hifi
14import QtQuick 2.10
15import QtQuick.Controls 2.3
16import "qrc:////qml//styles-uit" as HifiStylesUit
17import "qrc:////qml//controls-uit" as HifiControlsUit
18import "qrc:////qml//controls" as HifiControls
19
20Rectangle {
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.