vispy 0.15.0__cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.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.
- vispy/__init__.py +33 -0
- vispy/app/__init__.py +15 -0
- vispy/app/_default_app.py +76 -0
- vispy/app/_detect_eventloop.py +148 -0
- vispy/app/application.py +263 -0
- vispy/app/backends/__init__.py +52 -0
- vispy/app/backends/_egl.py +264 -0
- vispy/app/backends/_glfw.py +513 -0
- vispy/app/backends/_jupyter_rfb.py +278 -0
- vispy/app/backends/_offscreen_util.py +121 -0
- vispy/app/backends/_osmesa.py +235 -0
- vispy/app/backends/_pyglet.py +451 -0
- vispy/app/backends/_pyqt4.py +36 -0
- vispy/app/backends/_pyqt5.py +36 -0
- vispy/app/backends/_pyqt6.py +40 -0
- vispy/app/backends/_pyside.py +37 -0
- vispy/app/backends/_pyside2.py +52 -0
- vispy/app/backends/_pyside6.py +53 -0
- vispy/app/backends/_qt.py +1003 -0
- vispy/app/backends/_sdl2.py +444 -0
- vispy/app/backends/_template.py +244 -0
- vispy/app/backends/_test.py +8 -0
- vispy/app/backends/_tk.py +800 -0
- vispy/app/backends/_wx.py +476 -0
- vispy/app/backends/tests/__init__.py +0 -0
- vispy/app/backends/tests/test_offscreen_util.py +52 -0
- vispy/app/backends/tests/test_rfb.py +77 -0
- vispy/app/base.py +294 -0
- vispy/app/canvas.py +828 -0
- vispy/app/qt.py +92 -0
- vispy/app/tests/__init__.py +0 -0
- vispy/app/tests/qt-designer.ui +58 -0
- vispy/app/tests/test_app.py +442 -0
- vispy/app/tests/test_backends.py +164 -0
- vispy/app/tests/test_canvas.py +122 -0
- vispy/app/tests/test_context.py +92 -0
- vispy/app/tests/test_qt.py +47 -0
- vispy/app/tests/test_simultaneous.py +134 -0
- vispy/app/timer.py +174 -0
- vispy/color/__init__.py +17 -0
- vispy/color/_color_dict.py +193 -0
- vispy/color/color_array.py +447 -0
- vispy/color/color_space.py +181 -0
- vispy/color/colormap.py +1213 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +378 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1522 -0
- vispy/ext/cubehelix.py +138 -0
- vispy/ext/egl.py +375 -0
- vispy/ext/fontconfig.py +118 -0
- vispy/ext/gdi32plus.py +206 -0
- vispy/ext/osmesa.py +105 -0
- vispy/geometry/__init__.py +23 -0
- vispy/geometry/_triangulation_debugger.py +171 -0
- vispy/geometry/calculations.py +162 -0
- vispy/geometry/curves.py +399 -0
- vispy/geometry/generation.py +643 -0
- vispy/geometry/isocurve.py +175 -0
- vispy/geometry/isosurface.py +465 -0
- vispy/geometry/meshdata.py +700 -0
- vispy/geometry/normals.py +78 -0
- vispy/geometry/parametric.py +56 -0
- vispy/geometry/polygon.py +137 -0
- vispy/geometry/rect.py +210 -0
- vispy/geometry/tests/__init__.py +0 -0
- vispy/geometry/tests/test_calculations.py +23 -0
- vispy/geometry/tests/test_generation.py +56 -0
- vispy/geometry/tests/test_meshdata.py +106 -0
- vispy/geometry/tests/test_triangulation.py +594 -0
- vispy/geometry/torusknot.py +142 -0
- vispy/geometry/triangulation.py +876 -0
- vispy/gloo/__init__.py +56 -0
- vispy/gloo/buffer.py +505 -0
- vispy/gloo/context.py +272 -0
- vispy/gloo/framebuffer.py +257 -0
- vispy/gloo/gl/__init__.py +234 -0
- vispy/gloo/gl/_constants.py +332 -0
- vispy/gloo/gl/_es2.py +986 -0
- vispy/gloo/gl/_gl2.py +1365 -0
- vispy/gloo/gl/_proxy.py +499 -0
- vispy/gloo/gl/_pyopengl2.py +362 -0
- vispy/gloo/gl/dummy.py +24 -0
- vispy/gloo/gl/es2.py +62 -0
- vispy/gloo/gl/gl2.py +98 -0
- vispy/gloo/gl/glplus.py +168 -0
- vispy/gloo/gl/pyopengl2.py +97 -0
- vispy/gloo/gl/tests/__init__.py +0 -0
- vispy/gloo/gl/tests/test_basics.py +282 -0
- vispy/gloo/gl/tests/test_functionality.py +568 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1824 -0
- vispy/gloo/globject.py +101 -0
- vispy/gloo/preprocessor.py +67 -0
- vispy/gloo/program.py +543 -0
- vispy/gloo/tests/__init__.py +0 -0
- vispy/gloo/tests/test_buffer.py +558 -0
- vispy/gloo/tests/test_context.py +119 -0
- vispy/gloo/tests/test_framebuffer.py +195 -0
- vispy/gloo/tests/test_glir.py +307 -0
- vispy/gloo/tests/test_globject.py +35 -0
- vispy/gloo/tests/test_program.py +302 -0
- vispy/gloo/tests/test_texture.py +732 -0
- vispy/gloo/tests/test_use_gloo.py +187 -0
- vispy/gloo/tests/test_util.py +60 -0
- vispy/gloo/tests/test_wrappers.py +261 -0
- vispy/gloo/texture.py +1046 -0
- vispy/gloo/util.py +129 -0
- vispy/gloo/wrappers.py +762 -0
- vispy/glsl/__init__.py +42 -0
- vispy/glsl/antialias/antialias.glsl +7 -0
- vispy/glsl/antialias/cap-butt.glsl +31 -0
- vispy/glsl/antialias/cap-round.glsl +29 -0
- vispy/glsl/antialias/cap-square.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
- vispy/glsl/antialias/cap.glsl +67 -0
- vispy/glsl/antialias/caps.glsl +67 -0
- vispy/glsl/antialias/filled.glsl +50 -0
- vispy/glsl/antialias/outline.glsl +40 -0
- vispy/glsl/antialias/stroke.glsl +43 -0
- vispy/glsl/arrowheads/angle.glsl +99 -0
- vispy/glsl/arrowheads/arrowheads.frag +60 -0
- vispy/glsl/arrowheads/arrowheads.glsl +12 -0
- vispy/glsl/arrowheads/arrowheads.vert +83 -0
- vispy/glsl/arrowheads/curved.glsl +48 -0
- vispy/glsl/arrowheads/inhibitor.glsl +26 -0
- vispy/glsl/arrowheads/stealth.glsl +46 -0
- vispy/glsl/arrowheads/triangle.glsl +97 -0
- vispy/glsl/arrowheads/util.glsl +13 -0
- vispy/glsl/arrows/angle-30.glsl +12 -0
- vispy/glsl/arrows/angle-60.glsl +12 -0
- vispy/glsl/arrows/angle-90.glsl +12 -0
- vispy/glsl/arrows/arrow.frag +39 -0
- vispy/glsl/arrows/arrow.vert +49 -0
- vispy/glsl/arrows/arrows.glsl +17 -0
- vispy/glsl/arrows/common.glsl +187 -0
- vispy/glsl/arrows/curved.glsl +63 -0
- vispy/glsl/arrows/stealth.glsl +50 -0
- vispy/glsl/arrows/triangle-30.glsl +12 -0
- vispy/glsl/arrows/triangle-60.glsl +12 -0
- vispy/glsl/arrows/triangle-90.glsl +12 -0
- vispy/glsl/arrows/util.glsl +98 -0
- vispy/glsl/build_spatial_filters.py +660 -0
- vispy/glsl/collections/agg-fast-path.frag +20 -0
- vispy/glsl/collections/agg-fast-path.vert +78 -0
- vispy/glsl/collections/agg-glyph.frag +60 -0
- vispy/glsl/collections/agg-glyph.vert +33 -0
- vispy/glsl/collections/agg-marker.frag +35 -0
- vispy/glsl/collections/agg-marker.vert +48 -0
- vispy/glsl/collections/agg-path.frag +55 -0
- vispy/glsl/collections/agg-path.vert +166 -0
- vispy/glsl/collections/agg-point.frag +21 -0
- vispy/glsl/collections/agg-point.vert +35 -0
- vispy/glsl/collections/agg-segment.frag +32 -0
- vispy/glsl/collections/agg-segment.vert +75 -0
- vispy/glsl/collections/marker.frag +38 -0
- vispy/glsl/collections/marker.vert +48 -0
- vispy/glsl/collections/raw-path.frag +15 -0
- vispy/glsl/collections/raw-path.vert +24 -0
- vispy/glsl/collections/raw-point.frag +14 -0
- vispy/glsl/collections/raw-point.vert +31 -0
- vispy/glsl/collections/raw-segment.frag +18 -0
- vispy/glsl/collections/raw-segment.vert +26 -0
- vispy/glsl/collections/raw-triangle.frag +13 -0
- vispy/glsl/collections/raw-triangle.vert +26 -0
- vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
- vispy/glsl/collections/sdf-glyph.frag +80 -0
- vispy/glsl/collections/sdf-glyph.vert +59 -0
- vispy/glsl/collections/tick-labels.vert +71 -0
- vispy/glsl/colormaps/autumn.glsl +20 -0
- vispy/glsl/colormaps/blues.glsl +20 -0
- vispy/glsl/colormaps/color-space.glsl +17 -0
- vispy/glsl/colormaps/colormaps.glsl +24 -0
- vispy/glsl/colormaps/cool.glsl +20 -0
- vispy/glsl/colormaps/fire.glsl +21 -0
- vispy/glsl/colormaps/gray.glsl +20 -0
- vispy/glsl/colormaps/greens.glsl +20 -0
- vispy/glsl/colormaps/hot.glsl +22 -0
- vispy/glsl/colormaps/ice.glsl +20 -0
- vispy/glsl/colormaps/icefire.glsl +23 -0
- vispy/glsl/colormaps/parse.py +40 -0
- vispy/glsl/colormaps/reds.glsl +20 -0
- vispy/glsl/colormaps/spring.glsl +20 -0
- vispy/glsl/colormaps/summer.glsl +20 -0
- vispy/glsl/colormaps/user.glsl +22 -0
- vispy/glsl/colormaps/util.glsl +41 -0
- vispy/glsl/colormaps/wheel.glsl +21 -0
- vispy/glsl/colormaps/winter.glsl +20 -0
- vispy/glsl/lines/agg.frag +320 -0
- vispy/glsl/lines/agg.vert +241 -0
- vispy/glsl/markers/arrow.glsl +12 -0
- vispy/glsl/markers/asterisk.glsl +16 -0
- vispy/glsl/markers/chevron.glsl +14 -0
- vispy/glsl/markers/clover.glsl +20 -0
- vispy/glsl/markers/club.glsl +31 -0
- vispy/glsl/markers/cross.glsl +17 -0
- vispy/glsl/markers/diamond.glsl +12 -0
- vispy/glsl/markers/disc.glsl +9 -0
- vispy/glsl/markers/ellipse.glsl +67 -0
- vispy/glsl/markers/hbar.glsl +9 -0
- vispy/glsl/markers/heart.glsl +15 -0
- vispy/glsl/markers/infinity.glsl +15 -0
- vispy/glsl/markers/marker-sdf.frag +74 -0
- vispy/glsl/markers/marker-sdf.vert +41 -0
- vispy/glsl/markers/marker.frag +36 -0
- vispy/glsl/markers/marker.vert +46 -0
- vispy/glsl/markers/markers.glsl +24 -0
- vispy/glsl/markers/pin.glsl +18 -0
- vispy/glsl/markers/ring.glsl +11 -0
- vispy/glsl/markers/spade.glsl +28 -0
- vispy/glsl/markers/square.glsl +10 -0
- vispy/glsl/markers/tag.glsl +11 -0
- vispy/glsl/markers/triangle.glsl +14 -0
- vispy/glsl/markers/vbar.glsl +9 -0
- vispy/glsl/math/circle-through-2-points.glsl +30 -0
- vispy/glsl/math/constants.glsl +48 -0
- vispy/glsl/math/double.glsl +114 -0
- vispy/glsl/math/functions.glsl +20 -0
- vispy/glsl/math/point-to-line-distance.glsl +31 -0
- vispy/glsl/math/point-to-line-projection.glsl +29 -0
- vispy/glsl/math/signed-line-distance.glsl +27 -0
- vispy/glsl/math/signed-segment-distance.glsl +30 -0
- vispy/glsl/misc/regular-grid.frag +244 -0
- vispy/glsl/misc/spatial-filters.frag +1407 -0
- vispy/glsl/misc/viewport-NDC.glsl +20 -0
- vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
- vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
- vispy/glsl/transforms/hammer.glsl +44 -0
- vispy/glsl/transforms/identity.glsl +6 -0
- vispy/glsl/transforms/identity_forward.glsl +23 -0
- vispy/glsl/transforms/identity_inverse.glsl +23 -0
- vispy/glsl/transforms/linear-scale.glsl +127 -0
- vispy/glsl/transforms/log-scale.glsl +126 -0
- vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
- vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
- vispy/glsl/transforms/panzoom.glsl +10 -0
- vispy/glsl/transforms/polar.glsl +41 -0
- vispy/glsl/transforms/position.glsl +44 -0
- vispy/glsl/transforms/power-scale.glsl +139 -0
- vispy/glsl/transforms/projection.glsl +7 -0
- vispy/glsl/transforms/pvm.glsl +13 -0
- vispy/glsl/transforms/rotate.glsl +45 -0
- vispy/glsl/transforms/trackball.glsl +15 -0
- vispy/glsl/transforms/translate.glsl +35 -0
- vispy/glsl/transforms/transverse_mercator.glsl +38 -0
- vispy/glsl/transforms/viewport-clipping.glsl +14 -0
- vispy/glsl/transforms/viewport-transform.glsl +16 -0
- vispy/glsl/transforms/viewport.glsl +50 -0
- vispy/glsl/transforms/x.glsl +24 -0
- vispy/glsl/transforms/y.glsl +19 -0
- vispy/glsl/transforms/z.glsl +14 -0
- vispy/io/__init__.py +20 -0
- vispy/io/_data/spatial-filters.npy +0 -0
- vispy/io/datasets.py +94 -0
- vispy/io/image.py +231 -0
- vispy/io/mesh.py +122 -0
- vispy/io/stl.py +167 -0
- vispy/io/tests/__init__.py +0 -0
- vispy/io/tests/test_image.py +47 -0
- vispy/io/tests/test_io.py +121 -0
- vispy/io/wavefront.py +350 -0
- vispy/plot/__init__.py +36 -0
- vispy/plot/fig.py +58 -0
- vispy/plot/plotwidget.py +522 -0
- vispy/plot/tests/__init__.py +0 -0
- vispy/plot/tests/test_plot.py +46 -0
- vispy/scene/__init__.py +43 -0
- vispy/scene/cameras/__init__.py +27 -0
- vispy/scene/cameras/_base.py +38 -0
- vispy/scene/cameras/arcball.py +105 -0
- vispy/scene/cameras/base_camera.py +551 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +311 -0
- vispy/scene/cameras/perspective.py +338 -0
- vispy/scene/cameras/tests/__init__.py +0 -0
- vispy/scene/cameras/tests/test_cameras.py +27 -0
- vispy/scene/cameras/tests/test_link.py +53 -0
- vispy/scene/cameras/tests/test_perspective.py +122 -0
- vispy/scene/cameras/turntable.py +183 -0
- vispy/scene/canvas.py +639 -0
- vispy/scene/events.py +85 -0
- vispy/scene/node.py +644 -0
- vispy/scene/subscene.py +20 -0
- vispy/scene/tests/__init__.py +0 -0
- vispy/scene/tests/test_canvas.py +119 -0
- vispy/scene/tests/test_node.py +142 -0
- vispy/scene/tests/test_visuals.py +141 -0
- vispy/scene/visuals.py +276 -0
- vispy/scene/widgets/__init__.py +18 -0
- vispy/scene/widgets/anchor.py +25 -0
- vispy/scene/widgets/axis.py +88 -0
- vispy/scene/widgets/colorbar.py +176 -0
- vispy/scene/widgets/console.py +351 -0
- vispy/scene/widgets/grid.py +509 -0
- vispy/scene/widgets/label.py +50 -0
- vispy/scene/widgets/tests/__init__.py +0 -0
- vispy/scene/widgets/tests/test_colorbar.py +47 -0
- vispy/scene/widgets/viewbox.py +199 -0
- vispy/scene/widgets/widget.py +478 -0
- vispy/testing/__init__.py +51 -0
- vispy/testing/_runners.py +448 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +494 -0
- vispy/testing/rendered_array_tester.py +85 -0
- vispy/testing/tests/__init__.py +0 -0
- vispy/testing/tests/test_testing.py +20 -0
- vispy/util/__init__.py +32 -0
- vispy/util/bunch.py +15 -0
- vispy/util/check_environment.py +57 -0
- vispy/util/config.py +490 -0
- vispy/util/dpi/__init__.py +19 -0
- vispy/util/dpi/_linux.py +69 -0
- vispy/util/dpi/_quartz.py +26 -0
- vispy/util/dpi/_win32.py +34 -0
- vispy/util/dpi/tests/__init__.py +0 -0
- vispy/util/dpi/tests/test_dpi.py +16 -0
- vispy/util/eq.py +41 -0
- vispy/util/event.py +774 -0
- vispy/util/fetching.py +276 -0
- vispy/util/filter.py +44 -0
- vispy/util/fonts/__init__.py +14 -0
- vispy/util/fonts/_freetype.py +73 -0
- vispy/util/fonts/_quartz.py +192 -0
- vispy/util/fonts/_triage.py +36 -0
- vispy/util/fonts/_vispy_fonts.py +20 -0
- vispy/util/fonts/_win32.py +105 -0
- vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
- vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
- vispy/util/fonts/tests/__init__.py +0 -0
- vispy/util/fonts/tests/test_font.py +45 -0
- vispy/util/fourier.py +69 -0
- vispy/util/frozen.py +25 -0
- vispy/util/gallery_scraper.py +268 -0
- vispy/util/keys.py +91 -0
- vispy/util/logs.py +358 -0
- vispy/util/osmesa_gl.py +17 -0
- vispy/util/profiler.py +135 -0
- vispy/util/ptime.py +16 -0
- vispy/util/quaternion.py +229 -0
- vispy/util/svg/__init__.py +18 -0
- vispy/util/svg/base.py +20 -0
- vispy/util/svg/color.py +219 -0
- vispy/util/svg/element.py +51 -0
- vispy/util/svg/geometry.py +478 -0
- vispy/util/svg/group.py +66 -0
- vispy/util/svg/length.py +81 -0
- vispy/util/svg/number.py +25 -0
- vispy/util/svg/path.py +332 -0
- vispy/util/svg/shapes.py +57 -0
- vispy/util/svg/style.py +59 -0
- vispy/util/svg/svg.py +40 -0
- vispy/util/svg/transform.py +223 -0
- vispy/util/svg/transformable.py +28 -0
- vispy/util/svg/viewport.py +73 -0
- vispy/util/tests/__init__.py +0 -0
- vispy/util/tests/test_config.py +58 -0
- vispy/util/tests/test_docstring_parameters.py +123 -0
- vispy/util/tests/test_emitter_group.py +262 -0
- vispy/util/tests/test_event_emitter.py +743 -0
- vispy/util/tests/test_fourier.py +35 -0
- vispy/util/tests/test_gallery_scraper.py +112 -0
- vispy/util/tests/test_import.py +127 -0
- vispy/util/tests/test_key.py +22 -0
- vispy/util/tests/test_logging.py +45 -0
- vispy/util/tests/test_run.py +14 -0
- vispy/util/tests/test_transforms.py +42 -0
- vispy/util/tests/test_vispy.py +48 -0
- vispy/util/transforms.py +201 -0
- vispy/util/wrappers.py +155 -0
- vispy/version.py +21 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +487 -0
- vispy/visuals/axis.py +678 -0
- vispy/visuals/border.py +208 -0
- vispy/visuals/box.py +79 -0
- vispy/visuals/collections/__init__.py +30 -0
- vispy/visuals/collections/agg_fast_path_collection.py +219 -0
- vispy/visuals/collections/agg_path_collection.py +197 -0
- vispy/visuals/collections/agg_point_collection.py +52 -0
- vispy/visuals/collections/agg_segment_collection.py +142 -0
- vispy/visuals/collections/array_list.py +401 -0
- vispy/visuals/collections/base_collection.py +482 -0
- vispy/visuals/collections/collection.py +253 -0
- vispy/visuals/collections/path_collection.py +23 -0
- vispy/visuals/collections/point_collection.py +19 -0
- vispy/visuals/collections/polygon_collection.py +25 -0
- vispy/visuals/collections/raw_path_collection.py +119 -0
- vispy/visuals/collections/raw_point_collection.py +113 -0
- vispy/visuals/collections/raw_polygon_collection.py +77 -0
- vispy/visuals/collections/raw_segment_collection.py +112 -0
- vispy/visuals/collections/raw_triangle_collection.py +78 -0
- vispy/visuals/collections/segment_collection.py +19 -0
- vispy/visuals/collections/triangle_collection.py +16 -0
- vispy/visuals/collections/util.py +168 -0
- vispy/visuals/colorbar.py +699 -0
- vispy/visuals/cube.py +41 -0
- vispy/visuals/ellipse.py +162 -0
- vispy/visuals/filters/__init__.py +10 -0
- vispy/visuals/filters/base_filter.py +242 -0
- vispy/visuals/filters/clipper.py +60 -0
- vispy/visuals/filters/clipping_planes.py +122 -0
- vispy/visuals/filters/color.py +181 -0
- vispy/visuals/filters/markers.py +28 -0
- vispy/visuals/filters/mesh.py +801 -0
- vispy/visuals/filters/picking.py +60 -0
- vispy/visuals/filters/tests/__init__.py +3 -0
- vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
- vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
- vispy/visuals/glsl/__init__.py +1 -0
- vispy/visuals/glsl/antialiasing.py +133 -0
- vispy/visuals/glsl/color.py +63 -0
- vispy/visuals/graphs/__init__.py +1 -0
- vispy/visuals/graphs/graph.py +240 -0
- vispy/visuals/graphs/layouts/__init__.py +55 -0
- vispy/visuals/graphs/layouts/circular.py +49 -0
- vispy/visuals/graphs/layouts/force_directed.py +211 -0
- vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
- vispy/visuals/graphs/layouts/random.py +52 -0
- vispy/visuals/graphs/tests/__init__.py +1 -0
- vispy/visuals/graphs/tests/test_layouts.py +139 -0
- vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
- vispy/visuals/graphs/util.py +120 -0
- vispy/visuals/gridlines.py +161 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +701 -0
- vispy/visuals/image_complex.py +130 -0
- vispy/visuals/infinite_line.py +199 -0
- vispy/visuals/instanced_mesh.py +152 -0
- vispy/visuals/isocurve.py +213 -0
- vispy/visuals/isoline.py +241 -0
- vispy/visuals/isosurface.py +113 -0
- vispy/visuals/line/__init__.py +6 -0
- vispy/visuals/line/arrow.py +289 -0
- vispy/visuals/line/dash_atlas.py +90 -0
- vispy/visuals/line/line.py +545 -0
- vispy/visuals/line_plot.py +135 -0
- vispy/visuals/linear_region.py +199 -0
- vispy/visuals/markers.py +819 -0
- vispy/visuals/mesh.py +373 -0
- vispy/visuals/mesh_normals.py +159 -0
- vispy/visuals/plane.py +54 -0
- vispy/visuals/polygon.py +145 -0
- vispy/visuals/rectangle.py +196 -0
- vispy/visuals/regular_polygon.py +56 -0
- vispy/visuals/scrolling_lines.py +197 -0
- vispy/visuals/shaders/__init__.py +17 -0
- vispy/visuals/shaders/compiler.py +206 -0
- vispy/visuals/shaders/expression.py +99 -0
- vispy/visuals/shaders/function.py +788 -0
- vispy/visuals/shaders/multiprogram.py +145 -0
- vispy/visuals/shaders/parsing.py +140 -0
- vispy/visuals/shaders/program.py +161 -0
- vispy/visuals/shaders/shader_object.py +162 -0
- vispy/visuals/shaders/tests/__init__.py +0 -0
- vispy/visuals/shaders/tests/test_function.py +486 -0
- vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
- vispy/visuals/shaders/tests/test_parsing.py +57 -0
- vispy/visuals/shaders/variable.py +272 -0
- vispy/visuals/spectrogram.py +169 -0
- vispy/visuals/sphere.py +80 -0
- vispy/visuals/surface_plot.py +192 -0
- vispy/visuals/tests/__init__.py +0 -0
- vispy/visuals/tests/test_arrows.py +109 -0
- vispy/visuals/tests/test_axis.py +120 -0
- vispy/visuals/tests/test_collections.py +15 -0
- vispy/visuals/tests/test_colorbar.py +179 -0
- vispy/visuals/tests/test_colormap.py +97 -0
- vispy/visuals/tests/test_ellipse.py +122 -0
- vispy/visuals/tests/test_gridlines.py +30 -0
- vispy/visuals/tests/test_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +392 -0
- vispy/visuals/tests/test_image_complex.py +36 -0
- vispy/visuals/tests/test_infinite_line.py +53 -0
- vispy/visuals/tests/test_instanced_mesh.py +50 -0
- vispy/visuals/tests/test_isosurface.py +22 -0
- vispy/visuals/tests/test_linear_region.py +152 -0
- vispy/visuals/tests/test_markers.py +54 -0
- vispy/visuals/tests/test_mesh.py +261 -0
- vispy/visuals/tests/test_mesh_normals.py +218 -0
- vispy/visuals/tests/test_polygon.py +112 -0
- vispy/visuals/tests/test_rectangle.py +163 -0
- vispy/visuals/tests/test_regular_polygon.py +111 -0
- vispy/visuals/tests/test_scalable_textures.py +196 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -0
- vispy/visuals/tests/test_surface_plot.py +57 -0
- vispy/visuals/tests/test_text.py +95 -0
- vispy/visuals/tests/test_volume.py +542 -0
- vispy/visuals/tests/test_windbarb.py +33 -0
- vispy/visuals/text/__init__.py +7 -0
- vispy/visuals/text/_sdf_cpu.cpython-313-x86_64-linux-gnu.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +112 -0
- vispy/visuals/text/_sdf_gpu.py +316 -0
- vispy/visuals/text/text.py +675 -0
- vispy/visuals/transforms/__init__.py +34 -0
- vispy/visuals/transforms/_util.py +191 -0
- vispy/visuals/transforms/base_transform.py +233 -0
- vispy/visuals/transforms/chain.py +300 -0
- vispy/visuals/transforms/interactive.py +98 -0
- vispy/visuals/transforms/linear.py +564 -0
- vispy/visuals/transforms/nonlinear.py +398 -0
- vispy/visuals/transforms/tests/__init__.py +0 -0
- vispy/visuals/transforms/tests/test_transforms.py +243 -0
- vispy/visuals/transforms/transform_system.py +339 -0
- vispy/visuals/tube.py +173 -0
- vispy/visuals/visual.py +923 -0
- vispy/visuals/volume.py +1366 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.15.0.dist-info/METADATA +243 -0
- vispy-0.15.0.dist-info/RECORD +521 -0
- vispy-0.15.0.dist-info/WHEEL +6 -0
- vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
- vispy-0.15.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,451 @@
|
|
|
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
|
+
"""vispy backend for pyglet."""
|
|
6
|
+
|
|
7
|
+
from __future__ import division
|
|
8
|
+
|
|
9
|
+
from packaging.version import Version
|
|
10
|
+
from time import sleep
|
|
11
|
+
|
|
12
|
+
from ..base import (BaseApplicationBackend, BaseCanvasBackend,
|
|
13
|
+
BaseTimerBackend)
|
|
14
|
+
from ...util import keys
|
|
15
|
+
from ...util.ptime import time
|
|
16
|
+
from ... import config
|
|
17
|
+
|
|
18
|
+
USE_EGL = config['gl_backend'].lower().startswith('es')
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# -------------------------------------------------------------------- init ---
|
|
22
|
+
|
|
23
|
+
try:
|
|
24
|
+
import pyglet
|
|
25
|
+
version = pyglet.version
|
|
26
|
+
if Version(version) < Version('1.2'):
|
|
27
|
+
help_ = ('You can install the latest pyglet using:\n '
|
|
28
|
+
'pip install http://pyglet.googlecode.com/archive/tip.zip')
|
|
29
|
+
raise ImportError('Pyglet version too old (%s), need >= 1.2\n%s'
|
|
30
|
+
% (version, help_))
|
|
31
|
+
|
|
32
|
+
# Map native keys to vispy keys
|
|
33
|
+
KEYMAP = {
|
|
34
|
+
pyglet.window.key.LSHIFT: keys.SHIFT,
|
|
35
|
+
pyglet.window.key.RSHIFT: keys.SHIFT,
|
|
36
|
+
pyglet.window.key.LCTRL: keys.CONTROL,
|
|
37
|
+
pyglet.window.key.RCTRL: keys.CONTROL,
|
|
38
|
+
pyglet.window.key.LALT: keys.ALT,
|
|
39
|
+
pyglet.window.key.RALT: keys.ALT,
|
|
40
|
+
pyglet.window.key.LMETA: keys.META,
|
|
41
|
+
pyglet.window.key.RMETA: keys.META,
|
|
42
|
+
|
|
43
|
+
pyglet.window.key.LEFT: keys.LEFT,
|
|
44
|
+
pyglet.window.key.UP: keys.UP,
|
|
45
|
+
pyglet.window.key.RIGHT: keys.RIGHT,
|
|
46
|
+
pyglet.window.key.DOWN: keys.DOWN,
|
|
47
|
+
pyglet.window.key.PAGEUP: keys.PAGEUP,
|
|
48
|
+
pyglet.window.key.PAGEDOWN: keys.PAGEDOWN,
|
|
49
|
+
|
|
50
|
+
pyglet.window.key.INSERT: keys.INSERT,
|
|
51
|
+
pyglet.window.key.DELETE: keys.DELETE,
|
|
52
|
+
pyglet.window.key.HOME: keys.HOME,
|
|
53
|
+
pyglet.window.key.END: keys.END,
|
|
54
|
+
|
|
55
|
+
pyglet.window.key.ESCAPE: keys.ESCAPE,
|
|
56
|
+
pyglet.window.key.BACKSPACE: keys.BACKSPACE,
|
|
57
|
+
|
|
58
|
+
pyglet.window.key.F1: keys.F1,
|
|
59
|
+
pyglet.window.key.F2: keys.F2,
|
|
60
|
+
pyglet.window.key.F3: keys.F3,
|
|
61
|
+
pyglet.window.key.F4: keys.F4,
|
|
62
|
+
pyglet.window.key.F5: keys.F5,
|
|
63
|
+
pyglet.window.key.F6: keys.F6,
|
|
64
|
+
pyglet.window.key.F7: keys.F7,
|
|
65
|
+
pyglet.window.key.F8: keys.F8,
|
|
66
|
+
pyglet.window.key.F9: keys.F9,
|
|
67
|
+
pyglet.window.key.F10: keys.F10,
|
|
68
|
+
pyglet.window.key.F11: keys.F11,
|
|
69
|
+
pyglet.window.key.F12: keys.F12,
|
|
70
|
+
|
|
71
|
+
pyglet.window.key.SPACE: keys.SPACE,
|
|
72
|
+
pyglet.window.key.ENTER: keys.ENTER, # == pyglet.window.key.RETURN
|
|
73
|
+
pyglet.window.key.NUM_ENTER: keys.ENTER,
|
|
74
|
+
pyglet.window.key.TAB: keys.TAB,
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
BUTTONMAP = {pyglet.window.mouse.LEFT: 1,
|
|
78
|
+
pyglet.window.mouse.RIGHT: 2,
|
|
79
|
+
pyglet.window.mouse.MIDDLE: 3
|
|
80
|
+
}
|
|
81
|
+
except Exception as exp:
|
|
82
|
+
available, testable, why_not, which = False, False, str(exp), None
|
|
83
|
+
|
|
84
|
+
class _Window(object):
|
|
85
|
+
pass
|
|
86
|
+
else:
|
|
87
|
+
if USE_EGL:
|
|
88
|
+
available, testable, why_not = False, False, 'EGL not supported'
|
|
89
|
+
else:
|
|
90
|
+
available, testable, why_not = True, True, None
|
|
91
|
+
which = 'pyglet ' + str(pyglet.version)
|
|
92
|
+
_Window = pyglet.window.Window
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
# -------------------------------------------------------------- capability ---
|
|
96
|
+
|
|
97
|
+
capability = dict( # things that can be set by the backend
|
|
98
|
+
title=True,
|
|
99
|
+
size=True,
|
|
100
|
+
position=True,
|
|
101
|
+
show=True,
|
|
102
|
+
vsync=True,
|
|
103
|
+
resizable=True,
|
|
104
|
+
decorate=True,
|
|
105
|
+
fullscreen=True,
|
|
106
|
+
context=True,
|
|
107
|
+
multi_window=True,
|
|
108
|
+
scroll=True,
|
|
109
|
+
parent=False,
|
|
110
|
+
always_on_top=False,
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
# ------------------------------------------------------- set_configuration ---
|
|
115
|
+
|
|
116
|
+
def _set_config(config):
|
|
117
|
+
"""Set gl configuration"""
|
|
118
|
+
pyglet_config = pyglet.gl.Config()
|
|
119
|
+
|
|
120
|
+
pyglet_config.red_size = config['red_size']
|
|
121
|
+
pyglet_config.green_size = config['green_size']
|
|
122
|
+
pyglet_config.blue_size = config['blue_size']
|
|
123
|
+
pyglet_config.alpha_size = config['alpha_size']
|
|
124
|
+
|
|
125
|
+
pyglet_config.accum_red_size = 0
|
|
126
|
+
pyglet_config.accum_green_size = 0
|
|
127
|
+
pyglet_config.accum_blue_size = 0
|
|
128
|
+
pyglet_config.accum_alpha_size = 0
|
|
129
|
+
|
|
130
|
+
pyglet_config.depth_size = config['depth_size']
|
|
131
|
+
pyglet_config.stencil_size = config['stencil_size']
|
|
132
|
+
pyglet_config.double_buffer = config['double_buffer']
|
|
133
|
+
pyglet_config.stereo = config['stereo']
|
|
134
|
+
pyglet_config.samples = config['samples']
|
|
135
|
+
return pyglet_config
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
# ------------------------------------------------------------- application ---
|
|
139
|
+
|
|
140
|
+
class ApplicationBackend(BaseApplicationBackend):
|
|
141
|
+
|
|
142
|
+
def __init__(self):
|
|
143
|
+
BaseApplicationBackend.__init__(self)
|
|
144
|
+
|
|
145
|
+
def _vispy_get_backend_name(self):
|
|
146
|
+
return 'Pyglet'
|
|
147
|
+
|
|
148
|
+
def _vispy_process_events(self):
|
|
149
|
+
# pyglet.app.platform_event_loop.step(0.0)
|
|
150
|
+
pyglet.clock.tick()
|
|
151
|
+
for window in pyglet.app.windows:
|
|
152
|
+
window.switch_to()
|
|
153
|
+
window.dispatch_events()
|
|
154
|
+
window.dispatch_event('on_draw')
|
|
155
|
+
|
|
156
|
+
def _vispy_run(self):
|
|
157
|
+
return pyglet.app.run()
|
|
158
|
+
|
|
159
|
+
def _vispy_quit(self):
|
|
160
|
+
return pyglet.app.exit()
|
|
161
|
+
|
|
162
|
+
def _vispy_get_native_app(self):
|
|
163
|
+
return pyglet.app
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
# ------------------------------------------------------------------ canvas ---
|
|
167
|
+
|
|
168
|
+
class CanvasBackend(BaseCanvasBackend, _Window):
|
|
169
|
+
"""Pyglet backend for Canvas abstract class."""
|
|
170
|
+
|
|
171
|
+
def __init__(self, vispy_canvas, **kwargs):
|
|
172
|
+
BaseCanvasBackend.__init__(self, vispy_canvas)
|
|
173
|
+
p = self._process_backend_kwargs(kwargs)
|
|
174
|
+
|
|
175
|
+
# Deal with config
|
|
176
|
+
config = _set_config(p.context.config) # Also used further below
|
|
177
|
+
# Deal with context
|
|
178
|
+
p.context.shared.add_ref('pyglet', self)
|
|
179
|
+
# contexts are shared by default in Pyglet
|
|
180
|
+
|
|
181
|
+
style = (pyglet.window.Window.WINDOW_STYLE_DEFAULT if p.decorate else
|
|
182
|
+
pyglet.window.Window.WINDOW_STYLE_BORDERLESS)
|
|
183
|
+
# We keep track of modifier keys so we can pass them to mouse_motion
|
|
184
|
+
self._current_modifiers = set()
|
|
185
|
+
# self._buttons_accepted = 0
|
|
186
|
+
self._draw_ok = False # whether it is ok to draw yet
|
|
187
|
+
self._pending_position = None
|
|
188
|
+
if p.fullscreen is not False:
|
|
189
|
+
screen = pyglet.window.get_platform().get_default_display()
|
|
190
|
+
self._vispy_fullscreen = True
|
|
191
|
+
if p.fullscreen is True:
|
|
192
|
+
self._vispy_screen = screen.get_default_screen()
|
|
193
|
+
else:
|
|
194
|
+
screen = screen.get_screens()
|
|
195
|
+
if p.fullscreen >= len(screen):
|
|
196
|
+
raise RuntimeError('fullscreen must be < %s'
|
|
197
|
+
% len(screen))
|
|
198
|
+
self._vispy_screen = screen[p.fullscreen]
|
|
199
|
+
else:
|
|
200
|
+
self._vispy_fullscreen = False
|
|
201
|
+
self._vispy_screen = None
|
|
202
|
+
self._initialize_sent = False
|
|
203
|
+
pyglet.window.Window.__init__(self, width=p.size[0], height=p.size[1],
|
|
204
|
+
caption=p.title, visible=p.show,
|
|
205
|
+
config=config, vsync=p.vsync,
|
|
206
|
+
resizable=p.resizable, style=style,
|
|
207
|
+
screen=self._vispy_screen)
|
|
208
|
+
if p.position is not None:
|
|
209
|
+
self._vispy_set_position(*p.position)
|
|
210
|
+
|
|
211
|
+
def _vispy_warmup(self):
|
|
212
|
+
etime = time() + 0.1
|
|
213
|
+
while time() < etime:
|
|
214
|
+
sleep(0.01)
|
|
215
|
+
self._vispy_canvas.set_current()
|
|
216
|
+
self._vispy_canvas.app.process_events()
|
|
217
|
+
|
|
218
|
+
# Override these ...
|
|
219
|
+
def flip(self):
|
|
220
|
+
# Is called by event loop after each draw
|
|
221
|
+
pass
|
|
222
|
+
|
|
223
|
+
def on_draw(self):
|
|
224
|
+
# Is called by event loop after each event, whatever event ... really
|
|
225
|
+
if not self._draw_ok:
|
|
226
|
+
self._draw_ok = True
|
|
227
|
+
self.our_draw_func()
|
|
228
|
+
|
|
229
|
+
def draw_mouse_cursor(self):
|
|
230
|
+
# Prevent legacy OpenGL
|
|
231
|
+
pass
|
|
232
|
+
|
|
233
|
+
def _vispy_set_current(self):
|
|
234
|
+
# Make this the current context
|
|
235
|
+
self.switch_to()
|
|
236
|
+
|
|
237
|
+
def _vispy_swap_buffers(self):
|
|
238
|
+
# Swap front and back buffer
|
|
239
|
+
pyglet.window.Window.flip(self)
|
|
240
|
+
|
|
241
|
+
def _vispy_set_title(self, title):
|
|
242
|
+
# Set the window title. Has no effect for widgets
|
|
243
|
+
self.set_caption(title)
|
|
244
|
+
|
|
245
|
+
def _vispy_set_size(self, w, h):
|
|
246
|
+
# Set size of the widget or window
|
|
247
|
+
self.set_size(w, h)
|
|
248
|
+
|
|
249
|
+
def _vispy_set_position(self, x, y):
|
|
250
|
+
# Set positionof the widget or window. May have no effect for widgets
|
|
251
|
+
if self._draw_ok:
|
|
252
|
+
self.set_location(x, y)
|
|
253
|
+
else:
|
|
254
|
+
self._pending_position = x, y
|
|
255
|
+
|
|
256
|
+
def _vispy_set_visible(self, visible):
|
|
257
|
+
# Show or hide the window or widget
|
|
258
|
+
self.set_visible(visible)
|
|
259
|
+
|
|
260
|
+
def _vispy_update(self):
|
|
261
|
+
# Invoke a redraw
|
|
262
|
+
pyglet.clock.schedule_once(self.our_draw_func, 0.0)
|
|
263
|
+
|
|
264
|
+
def _vispy_close(self):
|
|
265
|
+
# Force the window or widget to shut down
|
|
266
|
+
# In Pyglet close is equivalent to destroy (window becomes invalid)
|
|
267
|
+
self._vispy_canvas = None
|
|
268
|
+
self.close()
|
|
269
|
+
|
|
270
|
+
def _vispy_get_size(self):
|
|
271
|
+
w, h = self.get_size()
|
|
272
|
+
return w, h
|
|
273
|
+
|
|
274
|
+
def _vispy_get_physical_size(self):
|
|
275
|
+
if self._vispy_canvas is None:
|
|
276
|
+
return
|
|
277
|
+
w, h = self.get_framebuffer_size()
|
|
278
|
+
return w, h
|
|
279
|
+
|
|
280
|
+
def _vispy_get_position(self):
|
|
281
|
+
x, y = self.get_location()
|
|
282
|
+
return x, y
|
|
283
|
+
|
|
284
|
+
def _vispy_get_fullscreen(self):
|
|
285
|
+
return self._vispy_fullscreen
|
|
286
|
+
|
|
287
|
+
def _vispy_set_fullscreen(self, fullscreen):
|
|
288
|
+
self._vispy_fullscreen = bool(fullscreen)
|
|
289
|
+
self.set_fullscreen(self._vispy_fullscreen, self._vispy_screen)
|
|
290
|
+
|
|
291
|
+
def on_show(self):
|
|
292
|
+
if self._vispy_canvas is None:
|
|
293
|
+
return
|
|
294
|
+
if not self._initialize_sent:
|
|
295
|
+
self._initialize_sent = True
|
|
296
|
+
self._vispy_canvas.set_current()
|
|
297
|
+
self._vispy_canvas.events.initialize()
|
|
298
|
+
# Set location now if we must. For some reason we get weird
|
|
299
|
+
# offsets in viewport if set_location is called before the
|
|
300
|
+
# widget is shown.
|
|
301
|
+
if self._pending_position:
|
|
302
|
+
x, y = self._pending_position
|
|
303
|
+
self._pending_position = None
|
|
304
|
+
self.set_location(x, y)
|
|
305
|
+
# Redraw
|
|
306
|
+
self._vispy_update()
|
|
307
|
+
|
|
308
|
+
def on_close(self):
|
|
309
|
+
if self._vispy_canvas is None:
|
|
310
|
+
return
|
|
311
|
+
self._vispy_canvas.close()
|
|
312
|
+
|
|
313
|
+
def on_resize(self, w, h):
|
|
314
|
+
if self._vispy_canvas is None:
|
|
315
|
+
return
|
|
316
|
+
self._vispy_canvas.events.resize(size=(w, h))
|
|
317
|
+
# self._vispy_update()
|
|
318
|
+
|
|
319
|
+
def our_draw_func(self, dummy=None):
|
|
320
|
+
if not self._draw_ok or self._vispy_canvas is None:
|
|
321
|
+
return
|
|
322
|
+
# (0, 0, self.width, self.height))
|
|
323
|
+
self._vispy_canvas.set_current()
|
|
324
|
+
self._vispy_canvas.events.draw(region=None)
|
|
325
|
+
|
|
326
|
+
def on_mouse_press(self, x, y, button, modifiers=None):
|
|
327
|
+
if self._vispy_canvas is None:
|
|
328
|
+
return
|
|
329
|
+
self._vispy_mouse_press(
|
|
330
|
+
pos=(x, self.get_size()[1] - y),
|
|
331
|
+
button=BUTTONMAP.get(button, 0),
|
|
332
|
+
modifiers=self._modifiers(),
|
|
333
|
+
)
|
|
334
|
+
# if ev2.handled:
|
|
335
|
+
# self._buttons_accepted |= button
|
|
336
|
+
|
|
337
|
+
def on_mouse_release(self, x, y, button, modifiers=None):
|
|
338
|
+
if self._vispy_canvas is None:
|
|
339
|
+
return
|
|
340
|
+
if True: # (button & self._buttons_accepted) > 0:
|
|
341
|
+
self._vispy_mouse_release(
|
|
342
|
+
pos=(x, self.get_size()[1] - y),
|
|
343
|
+
button=BUTTONMAP.get(button, 0),
|
|
344
|
+
modifiers=self._modifiers(),
|
|
345
|
+
)
|
|
346
|
+
# self._buttons_accepted &= ~button
|
|
347
|
+
|
|
348
|
+
def on_mouse_motion(self, x, y, dx, dy):
|
|
349
|
+
if self._vispy_canvas is None:
|
|
350
|
+
return
|
|
351
|
+
self._vispy_mouse_move(
|
|
352
|
+
pos=(x, self.get_size()[1] - y),
|
|
353
|
+
modifiers=self._modifiers(),
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
def on_mouse_drag(self, x, y, dx, dy, button, modifiers):
|
|
357
|
+
self.on_mouse_motion(x, y, dx, dy)
|
|
358
|
+
|
|
359
|
+
def on_mouse_scroll(self, x, y, scroll_x, scroll_y):
|
|
360
|
+
if self._vispy_canvas is None:
|
|
361
|
+
return
|
|
362
|
+
self._vispy_canvas.events.mouse_wheel(
|
|
363
|
+
delta=(float(scroll_x), float(scroll_y)),
|
|
364
|
+
pos=(x, self.get_size()[1] - y),
|
|
365
|
+
modifiers=self._modifiers(),
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
def on_key_press(self, key, modifiers):
|
|
369
|
+
# Process modifiers
|
|
370
|
+
if key in (pyglet.window.key.LCTRL, pyglet.window.key.RCTRL,
|
|
371
|
+
pyglet.window.key.LALT, pyglet.window.key.RALT,
|
|
372
|
+
pyglet.window.key.LSHIFT, pyglet.window.key.RSHIFT):
|
|
373
|
+
self._current_modifiers.add(key)
|
|
374
|
+
# Emit
|
|
375
|
+
self._vispy_canvas.events.key_press(
|
|
376
|
+
key=self._processKey(key),
|
|
377
|
+
text='', # Handlers that trigger on text wont see this event
|
|
378
|
+
modifiers=self._modifiers(modifiers))
|
|
379
|
+
|
|
380
|
+
def on_text(self, text):
|
|
381
|
+
# Typically this is called after on_key_press and before
|
|
382
|
+
# on_key_release
|
|
383
|
+
self._vispy_canvas.events.key_press(
|
|
384
|
+
key=None, # Handlers that trigger on key wont see this event
|
|
385
|
+
text=text,
|
|
386
|
+
modifiers=self._modifiers())
|
|
387
|
+
|
|
388
|
+
def on_key_release(self, key, modifiers):
|
|
389
|
+
# Process modifiers
|
|
390
|
+
if key in (pyglet.window.key.LCTRL, pyglet.window.key.RCTRL,
|
|
391
|
+
pyglet.window.key.LALT, pyglet.window.key.RALT,
|
|
392
|
+
pyglet.window.key.LSHIFT, pyglet.window.key.RSHIFT):
|
|
393
|
+
self._current_modifiers.discard(key)
|
|
394
|
+
# Get txt
|
|
395
|
+
try:
|
|
396
|
+
text = chr(key)
|
|
397
|
+
except Exception:
|
|
398
|
+
text = ''
|
|
399
|
+
# Emit
|
|
400
|
+
self._vispy_canvas.events.key_release(
|
|
401
|
+
key=self._processKey(key), text=text,
|
|
402
|
+
modifiers=self._modifiers(modifiers))
|
|
403
|
+
|
|
404
|
+
def _processKey(self, key):
|
|
405
|
+
if 97 <= key <= 122:
|
|
406
|
+
key -= 32
|
|
407
|
+
if key in KEYMAP:
|
|
408
|
+
return KEYMAP[key]
|
|
409
|
+
elif key >= 32 and key <= 127:
|
|
410
|
+
return keys.Key(chr(key))
|
|
411
|
+
else:
|
|
412
|
+
return None
|
|
413
|
+
|
|
414
|
+
def _modifiers(self, pygletmod=None):
|
|
415
|
+
mod = ()
|
|
416
|
+
if pygletmod is None:
|
|
417
|
+
pygletmod = self._current_modifiers
|
|
418
|
+
if isinstance(pygletmod, set):
|
|
419
|
+
for key in pygletmod:
|
|
420
|
+
mod += KEYMAP[key],
|
|
421
|
+
else:
|
|
422
|
+
if pygletmod & pyglet.window.key.MOD_SHIFT:
|
|
423
|
+
mod += keys.SHIFT,
|
|
424
|
+
if pygletmod & pyglet.window.key.MOD_CTRL:
|
|
425
|
+
mod += keys.CONTROL,
|
|
426
|
+
if pygletmod & pyglet.window.key.MOD_ALT:
|
|
427
|
+
mod += keys.ALT,
|
|
428
|
+
return mod
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
# ------------------------------------------------------------------- timer ---
|
|
432
|
+
|
|
433
|
+
class TimerBackend(BaseTimerBackend):
|
|
434
|
+
|
|
435
|
+
def _vispy_start(self, interval):
|
|
436
|
+
interval = self._vispy_timer._interval
|
|
437
|
+
if self._vispy_timer.max_iterations == 1:
|
|
438
|
+
pyglet.clock.schedule_once(self._vispy_timer._timeout, interval)
|
|
439
|
+
else:
|
|
440
|
+
# seems pyglet does not give the expected behavior when interval==0
|
|
441
|
+
if interval == 0:
|
|
442
|
+
interval = 1e-9
|
|
443
|
+
pyglet.clock.schedule_interval(
|
|
444
|
+
self._vispy_timer._timeout,
|
|
445
|
+
interval)
|
|
446
|
+
|
|
447
|
+
def _vispy_stop(self):
|
|
448
|
+
pyglet.clock.unschedule(self._vispy_timer._timeout)
|
|
449
|
+
|
|
450
|
+
def _vispy_get_native_timer(self):
|
|
451
|
+
return pyglet.clock
|
|
@@ -0,0 +1,36 @@
|
|
|
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
|
+
"""PyQt4 proxy backend for the qt backend."""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
from .. import backends
|
|
9
|
+
from ...util import logger
|
|
10
|
+
from ... import config
|
|
11
|
+
|
|
12
|
+
USE_EGL = config['gl_backend'].lower().startswith('es')
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
# Try importing (QtOpenGL first to fail without import QtCore)
|
|
16
|
+
if not USE_EGL:
|
|
17
|
+
from PyQt4 import QtOpenGL # noqa
|
|
18
|
+
from PyQt4 import QtGui, QtCore # noqa
|
|
19
|
+
except Exception as exp:
|
|
20
|
+
# Fail: this backend cannot be used
|
|
21
|
+
available, testable, why_not, which = False, False, str(exp), None
|
|
22
|
+
else:
|
|
23
|
+
# Success
|
|
24
|
+
available, testable, why_not = True, True, None
|
|
25
|
+
has_uic = True
|
|
26
|
+
which = ('PyQt4', QtCore.PYQT_VERSION_STR, QtCore.QT_VERSION_STR)
|
|
27
|
+
# Remove _qt module to force an import even if it was already imported
|
|
28
|
+
sys.modules.pop(__name__.replace('_pyqt4', '_qt'), None)
|
|
29
|
+
# Import _qt. Keep a ref to the module object!
|
|
30
|
+
if backends.qt_lib is None:
|
|
31
|
+
backends.qt_lib = 'pyqt4' # Signal to _qt what it should import
|
|
32
|
+
from . import _qt # noqa
|
|
33
|
+
from ._qt import * # noqa
|
|
34
|
+
else:
|
|
35
|
+
logger.warning('%s already imported, cannot switch to %s'
|
|
36
|
+
% (backends.qt_lib, 'pyqt4'))
|
|
@@ -0,0 +1,36 @@
|
|
|
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
|
+
"""PyQt5 proxy backend for the qt backend."""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
from .. import backends
|
|
9
|
+
from ...util import logger
|
|
10
|
+
from ... import config
|
|
11
|
+
|
|
12
|
+
USE_EGL = config['gl_backend'].lower().startswith('es')
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
# Try importing (QtOpenGL first to fail without import QtCore)
|
|
16
|
+
if not USE_EGL:
|
|
17
|
+
from PyQt5 import QtOpenGL # noqa
|
|
18
|
+
from PyQt5 import QtGui, QtCore # noqa
|
|
19
|
+
except Exception as exp:
|
|
20
|
+
# Fail: this backend cannot be used
|
|
21
|
+
available, testable, why_not, which = False, False, str(exp), None
|
|
22
|
+
else:
|
|
23
|
+
# Success
|
|
24
|
+
available, testable, why_not = True, True, None
|
|
25
|
+
has_uic = True
|
|
26
|
+
which = ('PyQt5', QtCore.PYQT_VERSION_STR, QtCore.QT_VERSION_STR)
|
|
27
|
+
# Remove _qt module to force an import even if it was already imported
|
|
28
|
+
sys.modules.pop(__name__.replace('_pyqt5', '_qt'), None)
|
|
29
|
+
# Import _qt. Keep a ref to the module object!
|
|
30
|
+
if backends.qt_lib is None:
|
|
31
|
+
backends.qt_lib = 'pyqt5' # Signal to _qt what it should import
|
|
32
|
+
from . import _qt # noqa
|
|
33
|
+
from ._qt import * # noqa
|
|
34
|
+
else:
|
|
35
|
+
logger.warning('%s already imported, cannot switch to %s'
|
|
36
|
+
% (backends.qt_lib, 'pyqt5'))
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
"""PyQt6 proxy backend for the qt backend.
|
|
6
|
+
Based on PySIde6 backend.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import sys
|
|
10
|
+
from .. import backends
|
|
11
|
+
from ...util import logger
|
|
12
|
+
from ... import config
|
|
13
|
+
|
|
14
|
+
USE_EGL = config['gl_backend'].lower().startswith('es')
|
|
15
|
+
|
|
16
|
+
try:
|
|
17
|
+
# Try importing (QtOpenGL first to fail without import QtCore)
|
|
18
|
+
if not USE_EGL:
|
|
19
|
+
from PyQt6 import QtOpenGL # noqa
|
|
20
|
+
from PyQt6 import QtGui, QtCore # noqa
|
|
21
|
+
except Exception as exp:
|
|
22
|
+
# Fail: this backend cannot be used
|
|
23
|
+
available, testable, why_not, which = False, False, str(exp), None
|
|
24
|
+
else:
|
|
25
|
+
# Success
|
|
26
|
+
available, testable, why_not = True, True, None
|
|
27
|
+
# What is this for? PyQt5 sets this to true, PySide sets this to false
|
|
28
|
+
has_uic = False
|
|
29
|
+
|
|
30
|
+
which = ('PyQt6', QtCore.PYQT_VERSION_STR, QtCore.PYQT_VERSION_STR)
|
|
31
|
+
# Remove _qt module to force an import even if it was already imported
|
|
32
|
+
sys.modules.pop(__name__.replace('_pyqt6', '_qt'), None)
|
|
33
|
+
# Import _qt. Keep a ref to the module object!
|
|
34
|
+
if backends.qt_lib is None:
|
|
35
|
+
backends.qt_lib = 'pyqt6' # Signal to _qt what it should import
|
|
36
|
+
from . import _qt # noqa
|
|
37
|
+
from ._qt import * # noqa
|
|
38
|
+
else:
|
|
39
|
+
logger.warning('%s already imported, cannot switch to %s'
|
|
40
|
+
% (backends.qt_lib, 'pyqt6'))
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
"""PySide proxy backend for the qt backend."""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
from .. import backends
|
|
9
|
+
from ...util import logger
|
|
10
|
+
from ... import config
|
|
11
|
+
|
|
12
|
+
USE_EGL = config['gl_backend'].lower().startswith('es')
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
# Try importing (QtOpenGL first to fail without import QtCore)
|
|
16
|
+
if not USE_EGL:
|
|
17
|
+
from PySide import QtOpenGL # noqa
|
|
18
|
+
from PySide import QtGui, QtCore # noqa
|
|
19
|
+
except Exception as exp:
|
|
20
|
+
# Fail: this backend cannot be used
|
|
21
|
+
available, testable, why_not, which = False, False, str(exp), None
|
|
22
|
+
else:
|
|
23
|
+
# Success
|
|
24
|
+
available, testable, why_not = True, True, None
|
|
25
|
+
has_uic = False
|
|
26
|
+
import PySide
|
|
27
|
+
which = ('PySide', PySide.__version__, QtCore.__version__)
|
|
28
|
+
# Remove _qt module to force an import even if it was already imported
|
|
29
|
+
sys.modules.pop(__name__.replace('_pyside', '_qt'), None)
|
|
30
|
+
# Import _qt. Keep a ref to the module object!
|
|
31
|
+
if backends.qt_lib is None:
|
|
32
|
+
backends.qt_lib = 'pyside' # Signal to _qt what it should import
|
|
33
|
+
from . import _qt # noqa
|
|
34
|
+
from ._qt import * # noqa
|
|
35
|
+
else:
|
|
36
|
+
logger.warning('%s already imported, cannot switch to %s'
|
|
37
|
+
% (backends.qt_lib, 'PySide'))
|
|
@@ -0,0 +1,52 @@
|
|
|
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
|
+
"""PySide2 proxy backend for the qt backend."""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
from .. import backends
|
|
9
|
+
from ...util import logger
|
|
10
|
+
from ... import config
|
|
11
|
+
|
|
12
|
+
USE_EGL = config['gl_backend'].lower().startswith('es')
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
# Try importing (QtOpenGL first to fail without import QtCore)
|
|
16
|
+
if not USE_EGL:
|
|
17
|
+
from PySide2 import QtOpenGL # noqa
|
|
18
|
+
from PySide2 import QtGui, QtCore # noqa
|
|
19
|
+
except Exception as exp:
|
|
20
|
+
# Fail: this backend cannot be used
|
|
21
|
+
available, testable, why_not, which = False, False, str(exp), None
|
|
22
|
+
else:
|
|
23
|
+
# Success
|
|
24
|
+
available, testable, why_not = True, True, None
|
|
25
|
+
# What is this for? PyQt5 sets this to true, PySide sets this to false
|
|
26
|
+
has_uic = False
|
|
27
|
+
import PySide2
|
|
28
|
+
|
|
29
|
+
# PySide2 doesn't have qWait for some reason see:
|
|
30
|
+
# https://github.com/pyqtgraph/pyqtgraph/pull/376/commits/8bdc19be75a7552cc0043bf8b5f5e0ee796edda0
|
|
31
|
+
from PySide2 import QtTest
|
|
32
|
+
if not hasattr(QtTest.QTest, 'qWait'):
|
|
33
|
+
@staticmethod
|
|
34
|
+
def qWait(msec):
|
|
35
|
+
import time
|
|
36
|
+
start = time.time()
|
|
37
|
+
PySide2.QtWidgets.QApplication.processEvents()
|
|
38
|
+
while time.time() < start + msec * 0.001:
|
|
39
|
+
PySide2.QtWidgets.QApplication.processEvents()
|
|
40
|
+
QtTest.QTest.qWait = qWait
|
|
41
|
+
|
|
42
|
+
which = ('PySide2', PySide2.__version__, QtCore.__version__)
|
|
43
|
+
# Remove _qt module to force an import even if it was already imported
|
|
44
|
+
sys.modules.pop(__name__.replace('_pyside2', '_qt'), None)
|
|
45
|
+
# Import _qt. Keep a ref to the module object!
|
|
46
|
+
if backends.qt_lib is None:
|
|
47
|
+
backends.qt_lib = 'pyside2' # Signal to _qt what it should import
|
|
48
|
+
from . import _qt # noqa
|
|
49
|
+
from ._qt import * # noqa
|
|
50
|
+
else:
|
|
51
|
+
logger.warning('%s already imported, cannot switch to %s'
|
|
52
|
+
% (backends.qt_lib, 'pyside2'))
|