vispy 0.15.0__cp313-cp313-win_amd64.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 (521) 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 +1003 -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 +1213 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +378 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1522 -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 +162 -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 +700 -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 +594 -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 +568 -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 +1824 -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 +1046 -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 +105 -0
  274. vispy/scene/cameras/base_camera.py +551 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +311 -0
  278. vispy/scene/cameras/perspective.py +338 -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 +183 -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 +448 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +494 -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 +32 -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 +21 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +487 -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 +162 -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 +801 -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 +161 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +701 -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 +819 -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_gridlines.py +30 -0
  477. vispy/visuals/tests/test_histogram.py +24 -0
  478. vispy/visuals/tests/test_image.py +392 -0
  479. vispy/visuals/tests/test_image_complex.py +36 -0
  480. vispy/visuals/tests/test_infinite_line.py +53 -0
  481. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  482. vispy/visuals/tests/test_isosurface.py +22 -0
  483. vispy/visuals/tests/test_linear_region.py +152 -0
  484. vispy/visuals/tests/test_markers.py +54 -0
  485. vispy/visuals/tests/test_mesh.py +261 -0
  486. vispy/visuals/tests/test_mesh_normals.py +218 -0
  487. vispy/visuals/tests/test_polygon.py +112 -0
  488. vispy/visuals/tests/test_rectangle.py +163 -0
  489. vispy/visuals/tests/test_regular_polygon.py +111 -0
  490. vispy/visuals/tests/test_scalable_textures.py +196 -0
  491. vispy/visuals/tests/test_sdf.py +73 -0
  492. vispy/visuals/tests/test_spectrogram.py +42 -0
  493. vispy/visuals/tests/test_surface_plot.py +57 -0
  494. vispy/visuals/tests/test_text.py +95 -0
  495. vispy/visuals/tests/test_volume.py +542 -0
  496. vispy/visuals/tests/test_windbarb.py +33 -0
  497. vispy/visuals/text/__init__.py +7 -0
  498. vispy/visuals/text/_sdf_cpu.cp313-win_amd64.pyd +0 -0
  499. vispy/visuals/text/_sdf_cpu.pyx +112 -0
  500. vispy/visuals/text/_sdf_gpu.py +316 -0
  501. vispy/visuals/text/text.py +675 -0
  502. vispy/visuals/transforms/__init__.py +34 -0
  503. vispy/visuals/transforms/_util.py +191 -0
  504. vispy/visuals/transforms/base_transform.py +233 -0
  505. vispy/visuals/transforms/chain.py +300 -0
  506. vispy/visuals/transforms/interactive.py +98 -0
  507. vispy/visuals/transforms/linear.py +564 -0
  508. vispy/visuals/transforms/nonlinear.py +398 -0
  509. vispy/visuals/transforms/tests/__init__.py +0 -0
  510. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  511. vispy/visuals/transforms/transform_system.py +339 -0
  512. vispy/visuals/tube.py +173 -0
  513. vispy/visuals/visual.py +923 -0
  514. vispy/visuals/volume.py +1366 -0
  515. vispy/visuals/windbarb.py +291 -0
  516. vispy/visuals/xyz_axis.py +34 -0
  517. vispy-0.15.0.dist-info/METADATA +243 -0
  518. vispy-0.15.0.dist-info/RECORD +521 -0
  519. vispy-0.15.0.dist-info/WHEEL +5 -0
  520. vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
  521. vispy-0.15.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,509 @@
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
+ """Grid widget for providing a gridded layout to child widgets."""
5
+
6
+ from __future__ import division
7
+ import numpy as np
8
+
9
+ from vispy.geometry import Rect
10
+ from .widget import Widget
11
+ from .viewbox import ViewBox
12
+
13
+ from kiwisolver import Solver, Variable, UnsatisfiableConstraint
14
+
15
+
16
+ class Grid(Widget):
17
+ """Widget for proportionally dividing its internal area into a grid.
18
+
19
+ This widget will automatically set the position and size of child widgets
20
+ according to provided constraints.
21
+
22
+ Parameters
23
+ ----------
24
+ spacing : int
25
+ Spacing between widgets.
26
+ **kwargs : dict
27
+ Keyword arguments to pass to `Widget`.
28
+ """
29
+
30
+ def __init__(self, spacing=6, **kwargs):
31
+ """Create solver and basic grid parameters."""
32
+ self._next_cell = [0, 0] # row, col
33
+ self._cells = {}
34
+ self._grid_widgets = {}
35
+ self.spacing = spacing
36
+ self._n_added = 0
37
+ self._default_class = ViewBox # what to add when __getitem__ is used
38
+ self._solver = Solver()
39
+ self._need_solver_recreate = True
40
+
41
+ # width and height of the Rect used to place child widgets
42
+ self._var_w = Variable("w_rect")
43
+ self._var_h = Variable("h_rect")
44
+
45
+ self._width_grid = None
46
+ self._height_grid = None
47
+
48
+ # self._height_stay = None
49
+ # self._width_stay = None
50
+
51
+ Widget.__init__(self, **kwargs)
52
+
53
+ def __getitem__(self, idxs):
54
+ """Return an item or create it if the location is available."""
55
+ if not isinstance(idxs, tuple):
56
+ idxs = (idxs,)
57
+ if len(idxs) == 1:
58
+ idxs = idxs + (slice(0, 1, None),)
59
+ elif len(idxs) != 2:
60
+ raise ValueError('Incorrect index: %s' % (idxs,))
61
+ lims = np.empty((2, 2), int)
62
+ for ii, idx in enumerate(idxs):
63
+ if isinstance(idx, int):
64
+ idx = slice(idx, idx + 1, None)
65
+ if not isinstance(idx, slice):
66
+ raise ValueError('indices must be slices or integers, not %s'
67
+ % (type(idx),))
68
+ if idx.step is not None and idx.step != 1:
69
+ raise ValueError('step must be one or None, not %s' % idx.step)
70
+ start = 0 if idx.start is None else idx.start
71
+ end = self.grid_size[ii] if idx.stop is None else idx.stop
72
+ lims[ii] = [start, end]
73
+ layout = self.layout_array
74
+ existing = layout[lims[0, 0]:lims[0, 1], lims[1, 0]:lims[1, 1]] + 1
75
+ if existing.any():
76
+ existing = set(list(existing.ravel()))
77
+ ii = list(existing)[0] - 1
78
+ if len(existing) != 1 or ((layout == ii).sum() !=
79
+ np.prod(np.diff(lims))):
80
+ raise ValueError('Cannot add widget (collision)')
81
+ return self._grid_widgets[ii][-1]
82
+ spans = np.diff(lims)[:, 0]
83
+ item = self.add_widget(self._default_class(),
84
+ row=lims[0, 0], col=lims[1, 0],
85
+ row_span=spans[0], col_span=spans[1])
86
+ return item
87
+
88
+ def add_widget(self, widget=None, row=None, col=None, row_span=1,
89
+ col_span=1, **kwargs):
90
+ """Add a new widget to this grid.
91
+
92
+ This will cause other widgets in the grid to be resized to make room
93
+ for the new widget. Can be used to replace a widget as well.
94
+
95
+ Parameters
96
+ ----------
97
+ widget : Widget | None
98
+ The Widget to add. New widget is constructed if widget is None.
99
+ row : int
100
+ The row in which to add the widget (0 is the topmost row)
101
+ col : int
102
+ The column in which to add the widget (0 is the leftmost column)
103
+ row_span : int
104
+ The number of rows to be occupied by this widget. Default is 1.
105
+ col_span : int
106
+ The number of columns to be occupied by this widget. Default is 1.
107
+ **kwargs : dict
108
+ parameters sent to the new Widget that is constructed if
109
+ widget is None
110
+
111
+ Notes
112
+ -----
113
+ The widget's parent is automatically set to this grid, and all other
114
+ parent(s) are removed.
115
+ """
116
+ if row is None:
117
+ row = self._next_cell[0]
118
+ if col is None:
119
+ col = self._next_cell[1]
120
+
121
+ if widget is None:
122
+ widget = Widget(**kwargs)
123
+ else:
124
+ if kwargs:
125
+ raise ValueError("cannot send kwargs if widget is given")
126
+
127
+ _row = self._cells.setdefault(row, {})
128
+ _row[col] = widget
129
+ self._grid_widgets[self._n_added] = (row, col, row_span, col_span,
130
+ widget)
131
+ self._n_added += 1
132
+ widget.parent = self
133
+
134
+ self._next_cell = [row, col+col_span]
135
+
136
+ widget._var_w = Variable("w-(row: %s | col: %s)" % (row, col))
137
+ widget._var_h = Variable("h-(row: %s | col: %s)" % (row, col))
138
+
139
+ # update stretch based on colspan/rowspan
140
+ # usually, if you make something consume more grids or columns,
141
+ # you also want it to actually *take it up*, ratio wise.
142
+ # otherwise, it will never *use* the extra rows and columns,
143
+ # thereby collapsing the extras to 0.
144
+ stretch = list(widget.stretch)
145
+ stretch[0] = col_span if stretch[0] is None else stretch[0]
146
+ stretch[1] = row_span if stretch[1] is None else stretch[1]
147
+ widget.stretch = stretch
148
+
149
+ self._need_solver_recreate = True
150
+
151
+ return widget
152
+
153
+ def remove_widget(self, widget):
154
+ """Remove a widget from this grid.
155
+
156
+ Parameters
157
+ ----------
158
+ widget : Widget
159
+ The Widget to remove
160
+ """
161
+ self._grid_widgets = dict((key, val)
162
+ for (key, val) in self._grid_widgets.items()
163
+ if val[-1] != widget)
164
+
165
+ self._need_solver_recreate = True
166
+
167
+ def resize_widget(self, widget, row_span, col_span):
168
+ """Resize a widget in the grid to new dimensions.
169
+
170
+ Parameters
171
+ ----------
172
+ widget : Widget
173
+ The widget to resize
174
+ row_span : int
175
+ The number of rows to be occupied by this widget.
176
+ col_span : int
177
+ The number of columns to be occupied by this widget.
178
+ """
179
+ row = None
180
+ col = None
181
+
182
+ for (r, c, _rspan, _cspan, w) in self._grid_widgets.values():
183
+ if w == widget:
184
+ row = r
185
+ col = c
186
+
187
+ break
188
+
189
+ if row is None or col is None:
190
+ raise ValueError("%s not found in grid" % widget)
191
+
192
+ self.remove_widget(widget)
193
+ self.add_widget(widget, row, col, row_span, col_span)
194
+ self._need_solver_recreate = True
195
+
196
+ def _prepare_draw(self, view):
197
+ self._update_child_widget_dim()
198
+
199
+ def add_grid(self, row=None, col=None, row_span=1, col_span=1,
200
+ **kwargs):
201
+ """
202
+ Create a new Grid and add it as a child widget.
203
+
204
+ Parameters
205
+ ----------
206
+ row : int
207
+ The row in which to add the widget (0 is the topmost row)
208
+ col : int
209
+ The column in which to add the widget (0 is the leftmost column)
210
+ row_span : int
211
+ The number of rows to be occupied by this widget. Default is 1.
212
+ col_span : int
213
+ The number of columns to be occupied by this widget. Default is 1.
214
+ **kwargs : dict
215
+ Keyword arguments to pass to the new `Grid`.
216
+ """
217
+ from .grid import Grid
218
+ grid = Grid(**kwargs)
219
+ return self.add_widget(grid, row, col, row_span, col_span)
220
+
221
+ def add_view(self, row=None, col=None, row_span=1, col_span=1,
222
+ **kwargs):
223
+ """
224
+ Create a new ViewBox and add it as a child widget.
225
+
226
+ Parameters
227
+ ----------
228
+ row : int
229
+ The row in which to add the widget (0 is the topmost row)
230
+ col : int
231
+ The column in which to add the widget (0 is the leftmost column)
232
+ row_span : int
233
+ The number of rows to be occupied by this widget. Default is 1.
234
+ col_span : int
235
+ The number of columns to be occupied by this widget. Default is 1.
236
+ **kwargs : dict
237
+ Keyword arguments to pass to `ViewBox`.
238
+ """
239
+ view = ViewBox(**kwargs)
240
+ return self.add_widget(view, row, col, row_span, col_span)
241
+
242
+ def next_row(self):
243
+ self._next_cell = [self._next_cell[0] + 1, 0]
244
+
245
+ @property
246
+ def grid_size(self):
247
+ rvals = [widget[0]+widget[2] for widget in self._grid_widgets.values()]
248
+ cvals = [widget[1]+widget[3] for widget in self._grid_widgets.values()]
249
+ return max(rvals + [0]), max(cvals + [0])
250
+
251
+ @property
252
+ def layout_array(self):
253
+ locs = -1 * np.ones(self.grid_size, int)
254
+ for key in self._grid_widgets.keys():
255
+ r, c, rs, cs = self._grid_widgets[key][:4]
256
+ locs[r:r + rs, c:c + cs] = key
257
+ return locs
258
+
259
+ def __repr__(self):
260
+ return (('<Grid at %s:\n' % hex(id(self))) +
261
+ str(self.layout_array + 1) + '>')
262
+
263
+ @staticmethod
264
+ def _add_total_width_constraints(solver, width_grid, _var_w):
265
+ for ws in width_grid:
266
+ width_expr = ws[0]
267
+ for w in ws[1:]:
268
+ width_expr += w
269
+ solver.addConstraint(width_expr == _var_w)
270
+
271
+ @staticmethod
272
+ def _add_total_height_constraints(solver, height_grid, _var_h):
273
+ for hs in height_grid:
274
+ height_expr = hs[0]
275
+ for h in hs[1:]:
276
+ height_expr += h
277
+ solver.addConstraint(height_expr == _var_h)
278
+
279
+ @staticmethod
280
+ def _add_gridding_width_constraints(solver, width_grid):
281
+ # access widths of one "y", different x
282
+ for ws in width_grid.T:
283
+ for w in ws[1:]:
284
+ solver.addConstraint(ws[0] == w)
285
+
286
+ @staticmethod
287
+ def _add_gridding_height_constraints(solver, height_grid):
288
+ # access heights of one "y"
289
+ for hs in height_grid.T:
290
+ for h in hs[1:]:
291
+ solver.addConstraint(hs[0] == h)
292
+
293
+ @staticmethod
294
+ def _add_stretch_constraints(solver, width_grid, height_grid,
295
+ grid_widgets, widget_grid):
296
+ xmax = len(height_grid)
297
+ ymax = len(width_grid)
298
+
299
+ stretch_widths = [[] for _ in range(0, ymax)]
300
+ stretch_heights = [[] for _ in range(0, xmax)]
301
+
302
+ for (y, x, ys, xs, widget) in grid_widgets.values():
303
+ for ws in width_grid[y:y+ys]:
304
+ total_w = np.sum(ws[x:x+xs])
305
+
306
+ for sw in stretch_widths[y:y+ys]:
307
+ sw.append((total_w, widget.stretch[0]))
308
+
309
+ for hs in height_grid[x:x+xs]:
310
+ total_h = np.sum(hs[y:y+ys])
311
+
312
+ for sh in stretch_heights[x:x+xs]:
313
+ sh.append((total_h, widget.stretch[1]))
314
+
315
+ for (x, xs) in enumerate(widget_grid):
316
+ for(y, widget) in enumerate(xs):
317
+ if widget is None:
318
+ stretch_widths[y].append((width_grid[y][x], 1))
319
+ stretch_heights[x].append((height_grid[x][y], 1))
320
+
321
+ for sws in stretch_widths:
322
+ if len(sws) <= 1:
323
+ continue
324
+
325
+ comparator = sws[0][0] / sws[0][1]
326
+
327
+ for (stretch_term, stretch_val) in sws[1:]:
328
+ solver.addConstraint((comparator == stretch_term/stretch_val) |
329
+ 'weak')
330
+
331
+ for sws in stretch_heights:
332
+ if len(sws) <= 1:
333
+ continue
334
+
335
+ comparator = sws[0][0] / sws[0][1]
336
+
337
+ for (stretch_term, stretch_val) in sws[1:]:
338
+ solver.addConstraint((comparator == stretch_term/stretch_val) |
339
+ 'weak')
340
+
341
+ @staticmethod
342
+ def _add_widget_dim_constraints(solver, width_grid, height_grid,
343
+ total_var_w, total_var_h, grid_widgets):
344
+ assert(total_var_w is not None)
345
+ assert(total_var_h is not None)
346
+
347
+ for ws in width_grid:
348
+ for w in ws:
349
+ solver.addConstraint(w >= 0,)
350
+
351
+ for hs in height_grid:
352
+ for h in hs:
353
+ solver.addConstraint(h >= 0)
354
+
355
+ for (_, val) in grid_widgets.items():
356
+ (y, x, ys, xs, widget) = val
357
+
358
+ for ws in width_grid[y:y+ys]:
359
+ total_w = np.sum(ws[x:x+xs])
360
+ # assert(total_w is not None)
361
+ solver.addConstraint(total_w >= widget.width_min)
362
+
363
+ if widget.width_max is not None:
364
+ solver.addConstraint(total_w <= widget.width_max)
365
+ else:
366
+ solver.addConstraint(total_w <= total_var_w)
367
+
368
+ for hs in height_grid[x:x+xs]:
369
+ total_h = np.sum(hs[y:y+ys])
370
+ solver.addConstraint(total_h >= widget.height_min)
371
+
372
+ if widget.height_max is not None:
373
+ solver.addConstraint(total_h <= widget.height_max)
374
+ else:
375
+ solver.addConstraint(total_h <= total_var_h)
376
+
377
+ def _recreate_solver(self):
378
+ self._solver.reset()
379
+ self._var_w = Variable("w_rect")
380
+ self._var_h = Variable("h_rect")
381
+ self._solver.addEditVariable(self._var_w, 'strong')
382
+ self._solver.addEditVariable(self._var_h, 'strong')
383
+
384
+ rect = self.rect.padded(self.padding + self.margin)
385
+ ymax, xmax = self.grid_size
386
+
387
+ self._solver.suggestValue(self._var_w, rect.width)
388
+ self._solver.suggestValue(self._var_h, rect.height)
389
+
390
+ self._solver.addConstraint(self._var_w >= 0)
391
+ self._solver.addConstraint(self._var_h >= 0)
392
+
393
+ # self._height_stay = None
394
+ # self._width_stay = None
395
+
396
+ # add widths
397
+ self._width_grid = np.array([[Variable("width(x: %s, y: %s)" % (x, y))
398
+ for x in range(0, xmax)]
399
+ for y in range(0, ymax)])
400
+
401
+ # add heights
402
+ self._height_grid = np.array([[Variable("height(x: %s, y: %s" % (x, y))
403
+ for y in range(0, ymax)]
404
+ for x in range(0, xmax)])
405
+
406
+ # setup stretch
407
+ stretch_grid = np.zeros(shape=(xmax, ymax, 2), dtype=float)
408
+ stretch_grid.fill(1)
409
+
410
+ for (_, val) in self._grid_widgets.items():
411
+ (y, x, ys, xs, widget) = val
412
+ stretch_grid[x:x+xs, y:y+ys] = widget.stretch
413
+
414
+ # even though these are REQUIRED, these should never fail
415
+ # since they're added first, and thus the slack will "simply work".
416
+ Grid._add_total_width_constraints(self._solver,
417
+ self._width_grid, self._var_w)
418
+ Grid._add_total_height_constraints(self._solver,
419
+ self._height_grid, self._var_h)
420
+
421
+ try:
422
+ # these are REQUIRED constraints for width and height.
423
+ # These are the constraints which can fail if
424
+ # the corresponding dimension of the widget cannot be fit in the
425
+ # grid.
426
+ Grid._add_gridding_width_constraints(self._solver,
427
+ self._width_grid)
428
+ Grid._add_gridding_height_constraints(self._solver,
429
+ self._height_grid)
430
+ except UnsatisfiableConstraint:
431
+ self._need_solver_recreate = True
432
+
433
+ # these are WEAK constraints, so these constraints will never fail
434
+ # with a RequiredFailure.
435
+ Grid._add_stretch_constraints(self._solver,
436
+ self._width_grid,
437
+ self._height_grid,
438
+ self._grid_widgets,
439
+ self._widget_grid)
440
+
441
+ Grid._add_widget_dim_constraints(self._solver,
442
+ self._width_grid,
443
+ self._height_grid,
444
+ self._var_w,
445
+ self._var_h,
446
+ self._grid_widgets)
447
+
448
+ self._solver.updateVariables()
449
+
450
+ def _update_child_widget_dim(self):
451
+ # think in terms of (x, y). (row, col) makes code harder to read
452
+ ymax, xmax = self.grid_size
453
+ if ymax <= 0 or xmax <= 0:
454
+ return
455
+
456
+ rect = self.rect # .padded(self.padding + self.margin)
457
+ if rect.width <= 0 or rect.height <= 0:
458
+ return
459
+ if self._need_solver_recreate:
460
+ self._need_solver_recreate = False
461
+ self._recreate_solver()
462
+
463
+ # we only need to remove and add the height and width constraints of
464
+ # the solver if they are not the same as the current value
465
+ h_changed = abs(rect.height - self._var_h.value()) > 1e-4
466
+ w_changed = abs(rect.width - self._var_w.value()) > 1e-4
467
+ if h_changed:
468
+ self._solver.suggestValue(self._var_h, rect.height)
469
+
470
+ if w_changed:
471
+ self._solver.suggestValue(self._var_w, rect.width)
472
+ if h_changed or w_changed:
473
+ self._solver.updateVariables()
474
+
475
+ value_vectorized = np.vectorize(lambda x: x.value())
476
+
477
+ for (_, val) in self._grid_widgets.items():
478
+ (row, col, rspan, cspan, widget) = val
479
+
480
+ width = np.sum(value_vectorized(
481
+ self._width_grid[row][col:col+cspan]))
482
+ height = np.sum(value_vectorized(
483
+ self._height_grid[col][row:row+rspan]))
484
+ if col == 0:
485
+ x = 0
486
+ else:
487
+ x = np.sum(value_vectorized(self._width_grid[row][0:col]))
488
+
489
+ if row == 0:
490
+ y = 0
491
+ else:
492
+ y = np.sum(value_vectorized(self._height_grid[col][0:row]))
493
+
494
+ if isinstance(widget, ViewBox):
495
+ widget.rect = Rect(x, y, width, height)
496
+ else:
497
+ widget.size = (width, height)
498
+ widget.pos = (x, y)
499
+
500
+ @property
501
+ def _widget_grid(self):
502
+ ymax, xmax = self.grid_size
503
+ widget_grid = np.array([[None for _ in range(0, ymax)]
504
+ for _ in range(0, xmax)])
505
+ for (_, val) in self._grid_widgets.items():
506
+ (y, x, ys, xs, widget) = val
507
+ widget_grid[x:x+xs, y:y+ys] = widget
508
+
509
+ return widget_grid
@@ -0,0 +1,50 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ # -----------------------------------------------------------------------------
6
+
7
+ from .widget import Widget
8
+ from ...visuals import TextVisual
9
+
10
+
11
+ class Label(Widget):
12
+ """Label widget
13
+
14
+ Parameters
15
+ ----------
16
+ text : str
17
+ The label.
18
+ rotation : float
19
+ The rotation of the label.
20
+ **kwargs : dict
21
+ Keyword arguments to pass to TextVisual.
22
+ """
23
+
24
+ def __init__(self, text, rotation=0., **kwargs):
25
+ self._text_visual = TextVisual(text=text, rotation=rotation, **kwargs)
26
+ self.rotation = rotation
27
+ Widget.__init__(self)
28
+ self.add_subvisual(self._text_visual)
29
+ self._set_pos()
30
+
31
+ def on_resize(self, event):
32
+ """Resize event handler
33
+
34
+ Parameters
35
+ ----------
36
+ event : instance of Event
37
+ The event.
38
+ """
39
+ self._set_pos()
40
+
41
+ def _set_pos(self):
42
+ self._text_visual.pos = self.rect.center
43
+
44
+ @property
45
+ def text(self):
46
+ return self._text_visual.text
47
+
48
+ @text.setter
49
+ def text(self, t):
50
+ self._text_visual.text = t
File without changes
@@ -0,0 +1,47 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ """Tests for ColorbarVWidget.
4
+
5
+ All images are of size (100,100) to keep a small file size
6
+
7
+ """
8
+
9
+ from vispy.scene.widgets import ColorBarWidget
10
+ from vispy.testing import (requires_application, TestingCanvas,
11
+ run_tests_if_main)
12
+ from vispy.testing.image_tester import assert_image_approved
13
+
14
+
15
+ def create_colorbar(pos, orientation, label='label string here'):
16
+ colorbar = ColorBarWidget(pos=pos,
17
+ orientation=orientation,
18
+ label=label,
19
+ cmap='autumn',
20
+ border_color='white',
21
+ border_width=2)
22
+
23
+ colorbar.label.color = 'white'
24
+ colorbar.label.font_size = 5
25
+
26
+ colorbar.ticks[0].color = 'white'
27
+ colorbar.ticks[0].font_size = 5
28
+
29
+ colorbar.ticks[1].color = 'white'
30
+ colorbar.ticks[1].font_size = 5
31
+
32
+ return colorbar
33
+
34
+
35
+ @requires_application()
36
+ def test_colorbar_widget():
37
+ with TestingCanvas() as c:
38
+ colorbar_top = create_colorbar(pos=(50, 50),
39
+ label="my label",
40
+ orientation='top')
41
+
42
+ c.draw_visual(colorbar_top)
43
+ assert_image_approved(c.render(), 'visuals/colorbar/top.png')
44
+ assert colorbar_top.label.text == "my label"
45
+
46
+
47
+ run_tests_if_main()