vispy 0.14.0__cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of vispy might be problematic. Click here for more details.

Files changed (519) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +513 -0
  9. vispy/app/backends/_jupyter_rfb.py +278 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +451 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +968 -0
  20. vispy/app/backends/_sdl2.py +444 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +800 -0
  24. vispy/app/backends/_wx.py +476 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +294 -0
  29. vispy/app/canvas.py +828 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1134 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +352 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1542 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +134 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +698 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +506 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +566 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1816 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +543 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1045 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +106 -0
  274. vispy/scene/cameras/base_camera.py +538 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +308 -0
  278. vispy/scene/cameras/perspective.py +333 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +173 -0
  284. vispy/scene/canvas.py +639 -0
  285. vispy/scene/events.py +85 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +509 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +478 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +446 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +473 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +17 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +20 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +45 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +4 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +485 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/cube.py +41 -0
  403. vispy/visuals/ellipse.py +163 -0
  404. vispy/visuals/filters/__init__.py +10 -0
  405. vispy/visuals/filters/base_filter.py +242 -0
  406. vispy/visuals/filters/clipper.py +60 -0
  407. vispy/visuals/filters/clipping_planes.py +122 -0
  408. vispy/visuals/filters/color.py +181 -0
  409. vispy/visuals/filters/markers.py +28 -0
  410. vispy/visuals/filters/mesh.py +796 -0
  411. vispy/visuals/filters/picking.py +60 -0
  412. vispy/visuals/filters/tests/__init__.py +3 -0
  413. vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
  414. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  415. vispy/visuals/glsl/__init__.py +1 -0
  416. vispy/visuals/glsl/antialiasing.py +133 -0
  417. vispy/visuals/glsl/color.py +63 -0
  418. vispy/visuals/graphs/__init__.py +1 -0
  419. vispy/visuals/graphs/graph.py +240 -0
  420. vispy/visuals/graphs/layouts/__init__.py +55 -0
  421. vispy/visuals/graphs/layouts/circular.py +49 -0
  422. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  423. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  424. vispy/visuals/graphs/layouts/random.py +52 -0
  425. vispy/visuals/graphs/tests/__init__.py +1 -0
  426. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  427. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  428. vispy/visuals/graphs/util.py +120 -0
  429. vispy/visuals/gridlines.py +105 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +688 -0
  433. vispy/visuals/image_complex.py +130 -0
  434. vispy/visuals/infinite_line.py +199 -0
  435. vispy/visuals/instanced_mesh.py +152 -0
  436. vispy/visuals/isocurve.py +213 -0
  437. vispy/visuals/isoline.py +241 -0
  438. vispy/visuals/isosurface.py +113 -0
  439. vispy/visuals/line/__init__.py +6 -0
  440. vispy/visuals/line/arrow.py +289 -0
  441. vispy/visuals/line/dash_atlas.py +90 -0
  442. vispy/visuals/line/line.py +545 -0
  443. vispy/visuals/line_plot.py +135 -0
  444. vispy/visuals/linear_region.py +199 -0
  445. vispy/visuals/markers.py +810 -0
  446. vispy/visuals/mesh.py +373 -0
  447. vispy/visuals/mesh_normals.py +159 -0
  448. vispy/visuals/plane.py +54 -0
  449. vispy/visuals/polygon.py +145 -0
  450. vispy/visuals/rectangle.py +196 -0
  451. vispy/visuals/regular_polygon.py +56 -0
  452. vispy/visuals/scrolling_lines.py +197 -0
  453. vispy/visuals/shaders/__init__.py +17 -0
  454. vispy/visuals/shaders/compiler.py +206 -0
  455. vispy/visuals/shaders/expression.py +99 -0
  456. vispy/visuals/shaders/function.py +788 -0
  457. vispy/visuals/shaders/multiprogram.py +145 -0
  458. vispy/visuals/shaders/parsing.py +140 -0
  459. vispy/visuals/shaders/program.py +161 -0
  460. vispy/visuals/shaders/shader_object.py +162 -0
  461. vispy/visuals/shaders/tests/__init__.py +0 -0
  462. vispy/visuals/shaders/tests/test_function.py +486 -0
  463. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  464. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  465. vispy/visuals/shaders/variable.py +272 -0
  466. vispy/visuals/spectrogram.py +169 -0
  467. vispy/visuals/sphere.py +80 -0
  468. vispy/visuals/surface_plot.py +192 -0
  469. vispy/visuals/tests/__init__.py +0 -0
  470. vispy/visuals/tests/test_arrows.py +109 -0
  471. vispy/visuals/tests/test_axis.py +120 -0
  472. vispy/visuals/tests/test_collections.py +15 -0
  473. vispy/visuals/tests/test_colorbar.py +179 -0
  474. vispy/visuals/tests/test_colormap.py +97 -0
  475. vispy/visuals/tests/test_ellipse.py +122 -0
  476. vispy/visuals/tests/test_histogram.py +24 -0
  477. vispy/visuals/tests/test_image.py +390 -0
  478. vispy/visuals/tests/test_image_complex.py +36 -0
  479. vispy/visuals/tests/test_infinite_line.py +53 -0
  480. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  481. vispy/visuals/tests/test_isosurface.py +22 -0
  482. vispy/visuals/tests/test_linear_region.py +152 -0
  483. vispy/visuals/tests/test_markers.py +54 -0
  484. vispy/visuals/tests/test_mesh.py +261 -0
  485. vispy/visuals/tests/test_mesh_normals.py +218 -0
  486. vispy/visuals/tests/test_polygon.py +112 -0
  487. vispy/visuals/tests/test_rectangle.py +163 -0
  488. vispy/visuals/tests/test_regular_polygon.py +111 -0
  489. vispy/visuals/tests/test_scalable_textures.py +180 -0
  490. vispy/visuals/tests/test_sdf.py +73 -0
  491. vispy/visuals/tests/test_spectrogram.py +42 -0
  492. vispy/visuals/tests/test_text.py +95 -0
  493. vispy/visuals/tests/test_volume.py +542 -0
  494. vispy/visuals/tests/test_windbarb.py +33 -0
  495. vispy/visuals/text/__init__.py +7 -0
  496. vispy/visuals/text/_sdf_cpu.cpython-312-aarch64-linux-gnu.so +0 -0
  497. vispy/visuals/text/_sdf_cpu.pyx +110 -0
  498. vispy/visuals/text/_sdf_gpu.py +316 -0
  499. vispy/visuals/text/text.py +675 -0
  500. vispy/visuals/transforms/__init__.py +34 -0
  501. vispy/visuals/transforms/_util.py +191 -0
  502. vispy/visuals/transforms/base_transform.py +233 -0
  503. vispy/visuals/transforms/chain.py +300 -0
  504. vispy/visuals/transforms/interactive.py +98 -0
  505. vispy/visuals/transforms/linear.py +564 -0
  506. vispy/visuals/transforms/nonlinear.py +398 -0
  507. vispy/visuals/transforms/tests/__init__.py +0 -0
  508. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  509. vispy/visuals/transforms/transform_system.py +339 -0
  510. vispy/visuals/tube.py +173 -0
  511. vispy/visuals/visual.py +923 -0
  512. vispy/visuals/volume.py +1335 -0
  513. vispy/visuals/windbarb.py +291 -0
  514. vispy/visuals/xyz_axis.py +34 -0
  515. vispy-0.14.0.dist-info/LICENSE.txt +36 -0
  516. vispy-0.14.0.dist-info/METADATA +218 -0
  517. vispy-0.14.0.dist-info/RECORD +519 -0
  518. vispy-0.14.0.dist-info/WHEEL +6 -0
  519. vispy-0.14.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,199 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+
5
+ from __future__ import division
6
+ from typing import Union
7
+
8
+ import numpy as np
9
+
10
+ from .widget import Widget
11
+ from ..subscene import SubScene
12
+ from ..cameras import make_camera, BaseCamera
13
+ from ...visuals.filters import Clipper
14
+
15
+
16
+ class ViewBox(Widget):
17
+ """Provides a rectangular widget to which its subscene is rendered.
18
+
19
+ Three classes work together when using a ViewBox:
20
+ * The :class:`SubScene` class describes a "world" coordinate system and the
21
+ entities that live inside it.
22
+ * ViewBox is a "window" through which we view the
23
+ subscene. Multiple ViewBoxes may view the same subscene.
24
+ * :class:`Camera` describes both the perspective from which the
25
+ subscene is rendered, and the way user interaction affects that
26
+ perspective.
27
+
28
+ In general it is only necessary to create the ViewBox; a SubScene and
29
+ Camera will be generated automatically.
30
+
31
+ Parameters
32
+ ----------
33
+ camera : instance of Camera | str | None
34
+ The camera through which to view the SubScene. If None, then a
35
+ PanZoomCamera (2D interaction) is used. If str, then the string is
36
+ used as the argument to :func:`make_camera`.
37
+ **kwargs : dict
38
+ Extra keyword arguments to pass to `Widget`.
39
+ """
40
+
41
+ def __init__(self, camera=None, **kwargs):
42
+ self._camera = None
43
+ self._scene = None
44
+ Widget.__init__(self, **kwargs)
45
+ self.interactive = True
46
+
47
+ # Each viewbox has an internal scene node, which has a transform that
48
+ # represents the transformation imposed by camera.
49
+ if self.name is not None:
50
+ name = str(self.name) + "_Scene"
51
+ else:
52
+ name = None
53
+
54
+ self._scene = SubScene(name=name, parent=self)
55
+ self._scene._clipper = Clipper()
56
+ self._scene.clip_children = True
57
+ self.transforms.changed.connect(self._update_scene_clipper)
58
+
59
+ # Camera is a helper object that handles scene transformation
60
+ # and user interaction.
61
+ if camera is None:
62
+ camera = 'base'
63
+ if isinstance(camera, str):
64
+ self.camera = make_camera(camera, parent=self.scene)
65
+ elif isinstance(camera, BaseCamera):
66
+ self.camera = camera
67
+ else:
68
+ raise TypeError('Argument "camera" must be None, str, or Camera.')
69
+
70
+ @property
71
+ def camera(self) -> BaseCamera:
72
+ """Get/set the Camera in use by this ViewBox
73
+
74
+ If a string is given (e.g. 'panzoom', 'turntable', 'fly'). A
75
+ corresponding camera is selected if it already exists in the
76
+ scene, otherwise a new camera is created.
77
+
78
+ The camera object is made a child of the scene (if it is not
79
+ already in the scene).
80
+
81
+ Multiple cameras can exist in one scene, although only one can
82
+ be active at a time. A single camera can be used by multiple
83
+ viewboxes at the same time.
84
+ """
85
+ return self._camera
86
+
87
+ @camera.setter
88
+ def camera(self, cam: Union[str, BaseCamera]):
89
+ if isinstance(cam, str):
90
+ # Try to select an existing camera
91
+ for child in self.scene.children:
92
+ if isinstance(child, BaseCamera):
93
+ this_cam_type = child.__class__.__name__.lower()[:-6]
94
+ if this_cam_type == cam:
95
+ self.camera = child
96
+ return
97
+ else:
98
+ # No such camera yet, create it then
99
+ self.camera = make_camera(cam)
100
+
101
+ elif isinstance(cam, BaseCamera):
102
+ # Ensure that the camera is in the scene
103
+ if not self.is_in_scene(cam):
104
+ cam.parent = self.scene
105
+ # Disconnect / connect
106
+ if self._camera is not None:
107
+ self._camera._viewbox_unset(self)
108
+ self._camera = cam
109
+ if self._camera is not None:
110
+ self._camera._viewbox_set(self)
111
+ # Update view
112
+ cam.view_changed()
113
+
114
+ else:
115
+ raise ValueError('Not a camera object.')
116
+
117
+ def is_in_scene(self, node):
118
+ """Get whether the given node is inside the scene of this viewbox.
119
+
120
+ Parameters
121
+ ----------
122
+ node : instance of Node
123
+ The node.
124
+ """
125
+ return self.scene.is_child(node)
126
+
127
+ def get_scene_bounds(self, dim=None):
128
+ """Get the total bounds based on the visuals present in the scene
129
+
130
+ Parameters
131
+ ----------
132
+ dim : int | None
133
+ Dimension to return.
134
+
135
+ Returns
136
+ -------
137
+ bounds : list | tuple
138
+ If ``dim is None``, Returns a list of 3 tuples, otherwise
139
+ the bounds for the requested dimension.
140
+ """
141
+ # todo: handle sub-children
142
+ # todo: handle transformations
143
+ # Init
144
+ bounds = [(np.inf, -np.inf), (np.inf, -np.inf), (np.inf, -np.inf)]
145
+ # Get bounds of all children
146
+ for ob in self.scene.children:
147
+ if hasattr(ob, 'bounds'):
148
+ for axis in (0, 1, 2):
149
+ if (dim is not None) and dim != axis:
150
+ continue
151
+ b = ob.bounds(axis)
152
+ if b is not None:
153
+ b = min(b), max(b) # Ensure correct order
154
+ bounds[axis] = (min(bounds[axis][0], b[0]),
155
+ max(bounds[axis][1], b[1]))
156
+ # Set defaults
157
+ for axis in (0, 1, 2):
158
+ if any(np.isinf(bounds[axis])):
159
+ bounds[axis] = -1, 1
160
+
161
+ if dim is not None:
162
+ return bounds[dim]
163
+ else:
164
+ return bounds
165
+
166
+ @property
167
+ def scene(self):
168
+ """The root node of the scene viewed by this ViewBox."""
169
+ return self._scene
170
+
171
+ def add(self, node):
172
+ """Add an Node to the scene for this ViewBox.
173
+
174
+ This is a convenience method equivalent to
175
+ `node.parent = viewbox.scene`
176
+
177
+ Parameters
178
+ ----------
179
+ node : instance of Node
180
+ The node to add.
181
+ """
182
+ node.parent = self.scene
183
+
184
+ def on_resize(self, event):
185
+ """Resize event handler
186
+
187
+ Parameters
188
+ ----------
189
+ event : instance of Event
190
+ The event.
191
+ """
192
+ if self._scene is None:
193
+ # happens during init
194
+ return
195
+ self._update_scene_clipper()
196
+
197
+ def _update_scene_clipper(self, event=None):
198
+ tr = self.get_transform('visual', 'framebuffer')
199
+ self._scene._clipper.bounds = tr.map(self.inner_rect)
@@ -0,0 +1,478 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+
5
+ from __future__ import division
6
+
7
+ import numpy as np
8
+
9
+ from ..visuals import Compound
10
+ from ...visuals.mesh import MeshVisual
11
+ from ...visuals.transforms import STTransform
12
+ from ...visuals.filters import Clipper
13
+ from ...util.event import Event
14
+ from ...geometry import Rect
15
+ from ...color import Color
16
+
17
+
18
+ class Widget(Compound):
19
+ """A widget takes up a rectangular space, intended for use in
20
+ a 2D pixel coordinate frame.
21
+
22
+ The widget is positioned using the transform attribute (as any
23
+ node), and its extent (size) is kept as a separate property.
24
+
25
+ Parameters
26
+ ----------
27
+ pos : (x, y)
28
+ A 2-element tuple to specify the top left corner of the widget.
29
+ size : (w, h)
30
+ A 2-element tuple to spicify the size of the widget.
31
+ border_color : color
32
+ The color of the border.
33
+ border_width : float
34
+ The width of the border line in pixels.
35
+ bgcolor : color
36
+ The background color.
37
+ padding : int
38
+ The amount of padding in the widget (i.e. the space reserved between
39
+ the contents and the border).
40
+ margin : int
41
+ The margin to keep outside the widget's border.
42
+ """
43
+
44
+ def __init__(self, pos=(0, 0), size=(10, 10), border_color=None,
45
+ border_width=1, bgcolor=None, padding=0, margin=0, **kwargs):
46
+ # For drawing border.
47
+ # A mesh is required because GL lines cannot be drawn with predictable
48
+ # shape across all platforms.
49
+ self._mesh = MeshVisual(color=border_color, mode='triangles')
50
+ self._mesh.set_gl_state('translucent', depth_test=False,
51
+ cull_face=False)
52
+ self._picking_mesh = MeshVisual(mode='triangle_fan')
53
+ self._picking_mesh.set_gl_state(cull_face=False, depth_test=False)
54
+ self._picking_mesh.visible = False
55
+
56
+ # reserved space inside border
57
+ self._padding = padding
58
+
59
+ self._border_width = border_width
60
+
61
+ # reserved space outside border
62
+ self._margin = margin
63
+ self._size = 100, 100
64
+
65
+ # layout interaction
66
+ self._width_limits = [0, None]
67
+ self._height_limits = [0, None]
68
+ self._stretch = [None, None]
69
+
70
+ # used by the constraint solver
71
+ # in Grid - these are Cassowary variables
72
+ self._var_w = self._var_h = None
73
+ self._var_x = self._var_y = None
74
+
75
+ self._widgets = []
76
+ self._border_color = Color(border_color)
77
+ self._bgcolor = Color(bgcolor)
78
+ self._face_colors = None
79
+
80
+ # Flag to allow rect setter to know if pos or size changed.
81
+ self._pos_or_size_changed = False
82
+
83
+ Compound.__init__(self, [self._mesh, self._picking_mesh], **kwargs)
84
+
85
+ self.transform = STTransform()
86
+ self.events.add(resize=Event)
87
+ self.pos = pos
88
+ self._update_colors()
89
+ self.size = size
90
+
91
+ @property
92
+ def pos(self):
93
+ return tuple(self.transform.translate[:2])
94
+
95
+ @pos.setter
96
+ def pos(self, p):
97
+ assert isinstance(p, tuple)
98
+ assert len(p) == 2
99
+ # Handle floating point discrepancies
100
+ if abs(p[0] - self.pos[0]) < 1e-4 and \
101
+ abs(p[1] - self.pos[1]) < 1e-4:
102
+ return
103
+ self._pos_or_size_changed = True
104
+ self.transform.translate = p[0], p[1], 0, 0
105
+ self._update_line()
106
+
107
+ @property
108
+ def size(self):
109
+ """The size (w, h) of this widget.
110
+
111
+ If the widget is a child of another widget, then its size is assigned
112
+ automatically by its parent.
113
+ """
114
+ return self._size
115
+
116
+ @size.setter
117
+ def size(self, s):
118
+ assert isinstance(s, tuple)
119
+ assert len(s) == 2
120
+ # Handle floating point discrepancies
121
+ if abs(s[0] - self._size[0]) < 1e-4 and \
122
+ abs(s[1] - self._size[1]) < 1e-4:
123
+ return
124
+ self._pos_or_size_changed = True
125
+ self._size = s
126
+ self._update_line()
127
+ self._update_child_widgets()
128
+ self._update_clipper()
129
+ self.events.resize()
130
+
131
+ @property
132
+ def width(self):
133
+ """The actual width of this widget"""
134
+ return self._size[0]
135
+
136
+ @property
137
+ def width_min(self):
138
+ """The minimum width the widget can have"""
139
+ return self._width_limits[0]
140
+
141
+ @width_min.setter
142
+ def width_min(self, width_min):
143
+ """Set the minimum height of the widget
144
+
145
+ Parameters
146
+ ----------
147
+ height_min: float
148
+ the minimum height of the widget
149
+ """
150
+ if width_min is None:
151
+ self._width_limits[0] = 0
152
+ return
153
+
154
+ width_min = float(width_min)
155
+ assert(0 <= width_min)
156
+
157
+ self._width_limits[0] = width_min
158
+ self._update_layout()
159
+
160
+ @property
161
+ def width_max(self):
162
+ """The maximum width the widget can have"""
163
+ return self._width_limits[1]
164
+
165
+ @width_max.setter
166
+ def width_max(self, width_max):
167
+ """Set the maximum width of the widget.
168
+
169
+ Parameters
170
+ ----------
171
+ width_max: None | float
172
+ the maximum width of the widget. if None, maximum width
173
+ is unbounded
174
+ """
175
+ if width_max is None:
176
+ self._width_limits[1] = None
177
+ return
178
+
179
+ width_max = float(width_max)
180
+ assert(self.width_min <= width_max)
181
+
182
+ self._width_limits[1] = width_max
183
+ self._update_layout()
184
+
185
+ @property
186
+ def height(self):
187
+ """The actual height of the widget"""
188
+ return self._size[1]
189
+
190
+ @property
191
+ def height_min(self):
192
+ """The minimum height of the widget"""
193
+ return self._height_limits[0]
194
+
195
+ @height_min.setter
196
+ def height_min(self, height_min):
197
+ """Set the minimum height of the widget
198
+
199
+ Parameters
200
+ ----------
201
+ height_min: float
202
+ the minimum height of the widget
203
+ """
204
+ if height_min is None:
205
+ self._height_limits[0] = 0
206
+ return
207
+
208
+ height_min = float(height_min)
209
+ assert(height_min >= 0)
210
+
211
+ self._height_limits[0] = height_min
212
+ self._update_layout()
213
+
214
+ @property
215
+ def height_max(self):
216
+ """The maximum height of the widget"""
217
+ return self._height_limits[1]
218
+
219
+ @height_max.setter
220
+ def height_max(self, height_max):
221
+ """Set the maximum height of the widget.
222
+
223
+ Parameters
224
+ ----------
225
+ height_max: None | float
226
+ the maximum height of the widget. if None, maximum height
227
+ is unbounded
228
+ """
229
+ if height_max is None:
230
+ self._height_limits[1] = None
231
+ return
232
+
233
+ height_max = float(height_max)
234
+ assert(0 <= self.height_min <= height_max)
235
+ self._height_limits[1] = height_max
236
+ self._update_layout()
237
+
238
+ @property
239
+ def rect(self):
240
+ return Rect((0, 0), self.size)
241
+
242
+ @rect.setter
243
+ def rect(self, r):
244
+ self._pos_or_size_changed = False
245
+ with self.events.resize.blocker():
246
+ self.pos = r.pos
247
+ self.size = r.size
248
+ if self._pos_or_size_changed:
249
+ self.update()
250
+ self.events.resize()
251
+
252
+ @property
253
+ def inner_rect(self):
254
+ """The rectangular area inside the margin, border, and padding.
255
+
256
+ Generally widgets should avoid drawing or placing sub-widgets outside
257
+ this rectangle.
258
+ """
259
+ m = self.margin + self._border_width + self.padding
260
+ if not self.border_color.is_blank:
261
+ m += 1
262
+ return Rect((m, m), (self.size[0]-2*m, self.size[1]-2*m))
263
+
264
+ @property
265
+ def stretch(self):
266
+ """Stretch factors (w, h) used when determining how much space to
267
+ allocate to this widget in a layout.
268
+
269
+ If either stretch factor is None, then it will be assigned when the
270
+ widget is added to a layout based on the number of columns or rows it
271
+ occupies.
272
+ """
273
+ return self._stretch
274
+
275
+ @stretch.setter
276
+ def stretch(self, s):
277
+ self._stretch = [float(s[0]), float(s[1])]
278
+
279
+ if self._stretch[0] == 0:
280
+ raise RuntimeError("received 0 as stretch parameter: %s", s)
281
+
282
+ if self._stretch[1] == 0:
283
+ raise RuntimeError("received 0 as stretch parameter: %s", s)
284
+
285
+ self._update_layout()
286
+
287
+ def _update_layout(self):
288
+ if isinstance(self.parent, Widget):
289
+ self.parent._update_child_widgets()
290
+
291
+ def _update_clipper(self):
292
+ """Called whenever the clipper for this widget may need to be updated."""
293
+ if self.clip_children and self._clipper is None:
294
+ self._clipper = Clipper()
295
+ elif not self.clip_children:
296
+ self._clipper = None
297
+
298
+ if self._clipper is None:
299
+ return
300
+ self._clipper.rect = self.inner_rect
301
+ self._clipper.transform = self.get_transform('framebuffer', 'visual')
302
+
303
+ @property
304
+ def border_color(self):
305
+ """The color of the border."""
306
+ return self._border_color
307
+
308
+ @border_color.setter
309
+ def border_color(self, b):
310
+ self._border_color = Color(b)
311
+ self._update_colors()
312
+ self._update_line()
313
+ self.update()
314
+
315
+ @property
316
+ def bgcolor(self):
317
+ """The background color of the Widget."""
318
+ return self._bgcolor
319
+
320
+ @bgcolor.setter
321
+ def bgcolor(self, value):
322
+ self._bgcolor = Color(value)
323
+ self._update_colors()
324
+ self._update_line()
325
+ self.update()
326
+
327
+ @property
328
+ def margin(self):
329
+ return self._margin
330
+
331
+ @margin.setter
332
+ def margin(self, m):
333
+ self._margin = m
334
+ self._update_child_widgets()
335
+ self._update_line()
336
+ self.update()
337
+ self.events.resize()
338
+
339
+ @property
340
+ def padding(self):
341
+ return self._padding
342
+
343
+ @padding.setter
344
+ def padding(self, p):
345
+ self._padding = p
346
+ self._update_child_widgets()
347
+ self.update()
348
+
349
+ def _update_line(self):
350
+ """Update border line to match new shape"""
351
+ w = self._border_width
352
+ m = self.margin
353
+ # border is drawn within the boundaries of the widget:
354
+ #
355
+ # size = (8, 7) margin=2
356
+ # internal rect = (3, 3, 2, 1)
357
+ # ........
358
+ # ........
359
+ # ..BBBB..
360
+ # ..B B..
361
+ # ..BBBB..
362
+ # ........
363
+ # ........
364
+ #
365
+ left = bot = m
366
+ right = self.size[0] - m
367
+ top = self.size[1] - m
368
+ pos = np.array([
369
+ [left, bot], [left+w, bot+w],
370
+ [right, bot], [right-w, bot+w],
371
+ [right, top], [right-w, top-w],
372
+ [left, top], [left+w, top-w],
373
+ ], dtype=np.float32)
374
+ faces = np.array([
375
+ [0, 2, 1],
376
+ [1, 2, 3],
377
+ [2, 4, 3],
378
+ [3, 5, 4],
379
+ [4, 5, 6],
380
+ [5, 7, 6],
381
+ [6, 0, 7],
382
+ [7, 0, 1],
383
+ [5, 3, 1],
384
+ [1, 5, 7],
385
+ ], dtype=np.int32)
386
+ start = 8 if self._border_color.is_blank else 0
387
+ stop = 8 if self._bgcolor.is_blank else 10
388
+ face_colors = None
389
+ if self._face_colors is not None:
390
+ face_colors = self._face_colors[start:stop]
391
+ self._mesh.set_data(vertices=pos, faces=faces[start:stop],
392
+ face_colors=face_colors)
393
+
394
+ # picking mesh covers the entire area
395
+ self._picking_mesh.set_data(vertices=pos[::2])
396
+
397
+ def _update_colors(self):
398
+ self._face_colors = np.concatenate(
399
+ (np.tile(self.border_color.rgba, (8, 1)),
400
+ np.tile(self.bgcolor.rgba, (2, 1)))).astype(np.float32)
401
+ self._update_visibility()
402
+
403
+ @property
404
+ def picking(self):
405
+ return self._picking
406
+
407
+ @picking.setter
408
+ def picking(self, p):
409
+ Compound.picking.fset(self, p)
410
+ self._update_visibility()
411
+
412
+ def _update_visibility(self):
413
+ blank = self.border_color.is_blank and self.bgcolor.is_blank
414
+ picking = self.picking
415
+ self._picking_mesh.visible = picking and self.interactive
416
+ self._mesh.visible = not picking and not blank
417
+
418
+ def _update_child_widgets(self):
419
+ # Set the position and size of child boxes (only those added
420
+ # using add_widget)
421
+ for ch in self._widgets:
422
+ ch.rect = self.rect.padded(self.padding + self.margin)
423
+
424
+ def add_widget(self, widget):
425
+ """
426
+ Add a Widget as a managed child of this Widget.
427
+
428
+ The child will be
429
+ automatically positioned and sized to fill the entire space inside
430
+ this Widget (unless _update_child_widgets is redefined).
431
+
432
+ Parameters
433
+ ----------
434
+ widget : instance of Widget
435
+ The widget to add.
436
+
437
+ Returns
438
+ -------
439
+ widget : instance of Widget
440
+ The widget.
441
+ """
442
+ self._widgets.append(widget)
443
+ widget.parent = self
444
+ self._update_child_widgets()
445
+ return widget
446
+
447
+ def add_grid(self, *args, **kwargs):
448
+ """
449
+ Create a new Grid and add it as a child widget.
450
+
451
+ All arguments are given to Grid().
452
+ """
453
+ from .grid import Grid
454
+ grid = Grid(*args, **kwargs)
455
+ return self.add_widget(grid)
456
+
457
+ def add_view(self, *args, **kwargs):
458
+ """
459
+ Create a new ViewBox and add it as a child widget.
460
+
461
+ All arguments are given to ViewBox().
462
+ """
463
+ from .viewbox import ViewBox
464
+ view = ViewBox(*args, **kwargs)
465
+ return self.add_widget(view)
466
+
467
+ def remove_widget(self, widget):
468
+ """
469
+ Remove a Widget as a managed child of this Widget.
470
+
471
+ Parameters
472
+ ----------
473
+ widget : instance of Widget
474
+ The widget to remove.
475
+ """
476
+ self._widgets.remove(widget)
477
+ widget.parent = None
478
+ self._update_child_widgets()