Kivy-examples 2.3.1.dev0__py3-none-any.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.
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/main.py +77 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/monkey.obj +7966 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/objloader.py +147 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/simple.glsl +47 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/RST_Editor/editor.kv +72 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/RST_Editor/main.py +64 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/compass.kv +25 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/main.py +77 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/needle.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/rose.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/main.py +80 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/shadow32.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/takepicture.kv +40 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/animation/animate.py +42 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_suite.py +152 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_suite_data/testkvdir.kv +4 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_build.py +24 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_config.py +49 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_kv.py +25 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_kv_in_template1.py +27 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/template1/test.kv +4 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/test.kv +4 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/testkvfile.kv +4 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/asyncio_advanced.py +90 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/asyncio_basic.py +59 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/trio_advanced.py +93 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/trio_basic.py +58 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12908_sweet_trip_mm_clap_hi.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12909_sweet_trip_mm_clap_lo.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12910_sweet_trip_mm_clap_mid.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12911_sweet_trip_mm_hat_cl.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12913_sweet_trip_mm_kick_hi.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12914_sweet_trip_mm_kick_lo.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12915_sweet_trip_mm_kick_mid.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12916_sweet_trip_mm_kwik_mod_01.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12917_sweet_trip_mm_kwik_mod_02.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12918_sweet_trip_mm_kwik_mod_03.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12919_sweet_trip_mm_kwik_mod_04.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12920_sweet_trip_mm_kwik_mod_05.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12921_sweet_trip_mm_kwik_mod_06.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12922_sweet_trip_mm_kwik_mod_07.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12923_sweet_trip_mm_metal_clave.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12925_sweet_trip_mm_sweep_x.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12926_sweet_trip_mm_sweep_y.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12927_sweet_trip_mm_sweep_z.wav +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/audio.kv +59 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/main.py +81 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/pitch.py +42 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/camera/main.py +59 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/bezier.py +105 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/canvas_stress.py +72 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/circle.py +84 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/fbo_canvas.py +91 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/kiwi.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/lines.py +296 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/lines_extended.py +183 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mesh.py +57 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mesh_manipulation.py +101 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mtexture1.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mtexture2.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/multitexture.py +110 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/repeat_texture.py +65 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/rotation.py +35 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/rounded_rectangle.py +153 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/scale.py +37 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/stencil_canvas.py +85 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/tesselate.py +146 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/texture.py +143 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/texture_example_image.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/1.kv +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/2.kv +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/3.kv +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/root.kv +32 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/main.py +63 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/cover/cover_image.py +25 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/cover/cover_video.py +31 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/camera_puzzle.py +98 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/AnchorLayoutContainer.kv +15 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/BoxLayoutContainer.kv +14 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ButtonContainer.kv +27 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/CheckBoxContainer.kv +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/FileChooserContainer.kv +19 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/FloatLayoutContainer.kv +16 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/GridLayoutContainer.kv +20 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/LabelContainer.kv +62 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/MediaContainer.kv +9 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/PlaygroundContainer.kv +4 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/PopupContainer.kv +39 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ProgressBarContainer.kv +17 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/RestContainer.kv +5 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ScatterContainer.kv +16 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/SelectorsContainer.kv +10 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/StackLayoutContainer.kv +25 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/TextContainer.kv +20 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/kivycatalog.kv +144 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/main.py +192 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/gesturedatabase.kv +117 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/gesturedatabase.py +180 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/helpers.py +30 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/historymanager.kv +164 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/historymanager.py +276 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/main.py +144 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/multistroke.kv +101 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/settings.kv +110 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/settings.py +97 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Bubbles.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Ill1.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Wall.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/faust_github.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/main.py +73 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/pictures.kv +57 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/shadow32.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/shadereditor/main.py +147 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/shadereditor/shadereditor.kv +39 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/README.txt +11 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/background.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/faust_github.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/README +4 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/bug.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/chevron-left.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/chevron-right.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/accordions.kv +39 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/bubbles.kv +33 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/buttons.kv +26 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/carousel.kv +51 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/checkboxes.kv +33 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/codeinput.kv +9 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/dropdown.kv +40 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/filechoosers.kv +24 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/popups.kv +17 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/progressbar.kv +15 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/rstdocument.kv +24 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/scatter.kv +14 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/screenmanager.kv +46 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/sliders.kv +55 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/spinner.kv +11 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/splitter.kv +13 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/switches.kv +39 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/tabbedpanel + layouts.kv +69 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/textinputs.kv +48 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/togglebutton.kv +39 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/main.py +243 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/showcase.kv +100 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/README.txt +12 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/icon.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/main.py +170 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/particle.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/touchtracer.kv +29 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/echo_client_app.py +82 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/echo_server_app.py +49 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/twistd_app.py +66 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/gestures/gesture_board.py +95 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/gestures/my_gestures.py +90 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/designwithkv/controller.kv +16 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/designwithkv/main.py +29 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/1_skeleton.py +15 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/2_print_touch.py +16 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/3_draw_ellipse.py +22 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/4_draw_line.py +26 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/5_random_colors.py +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/6_button.py +38 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/quickstart/main.py +15 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/button.kv +9 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/layout.kv +6 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/main.py +19 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/test.kv +5 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/main.py +226 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/numeric.json +38 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kinect/README.txt +13 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kinect/kinectviewer.py +283 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_button.kv +9 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_camera.kv +25 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_fbo.kv +11 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_layout.kv +23 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_logo.kv +36 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_scatter.kv +6 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_stencil.kv +27 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_video.kv +42 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/builder_template.py +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/id_in_kv/id_in_kv.py +20 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/id_in_kv/test.kv +11 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/kv_and_py/kv_and_py.py +34 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/kv_and_py/test.kv +11 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/kivy.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/kvrun.py +38 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/clipboard.py +63 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/custom_titlebar.py +56 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/imagesave.py +14 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/joystick.py +83 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/multiple_dropfile.py +51 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/on_textedit_event.py +104 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/opacitywindow.py +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/shapecollisions.py +397 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/shapedwindow.py +98 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/two_panes.py +47 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/urlrequest.py +128 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/settings/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/settings/main.py +122 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/plasma.kv +9 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/plasma.py +86 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/rotated.kv +91 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/rotated.py +102 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/shadertree.kv +29 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/shadertree.py +193 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/tex3.jpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/benchmark.py +19 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/cloud.svg +25 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/main-smaa.py +155 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/main.py +50 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/music.svg +68 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/rotated.svg +23 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/ship.svg +181 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/sun.svg +35 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/tiger.svg +813 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/text/pango_demo.py +296 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/data/icon.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/main.py +163 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/note.kv +154 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/main.py +82 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/pong.kv +53 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step1/main.py +15 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step1/pong.kv +2 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step2/main.py +15 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step2/pong.kv +21 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step3/main.py +26 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step3/pong.kv +31 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step4/main.py +48 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step4/pong.kv +34 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step5/main.py +75 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step5/pong.kv +53 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/accordion_1.py +17 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/actionbar.py +32 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/asyncimage.py +35 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/boxlayout_poshint.py +54 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/bubble_test.py +63 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/camera.py +33 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/carousel_buttons.py +50 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/cityCC0.mpg +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/cityCC0.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/codeinput.py +225 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/codeinputtest.kv +53 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/colorpicker.py +234 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/colorusage.py +62 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/compound_selection.py +83 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/customcollide.py +82 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget.py +193 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget2.py +47 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget3_advanced.py +62 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/fbowidget.py +111 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/focus_behavior.py +98 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/image_mipmap.py +31 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/keyboardlistener.py +42 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_mipmap.py +28 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_sizing.py +193 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_text_size.py +49 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_with_markup.py +21 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/lang_dynamic_classes.py +18 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/pagelayout.py +64 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/popup_with_kv.py +35 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/basic_data.py +124 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/infinite_scrolling.py +143 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/key_viewclass.py +149 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/messenger.py +196 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/pull_to_refresh.py +95 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/rv_animate_items.py +109 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/rstexample.py +128 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scatter.kv +53 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scatter.py +16 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/screenmanager.py +106 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scrollview.kv +16 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scrollview.py +40 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/android.txt +3 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/bird.zip +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/button_white.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/button_white_animated.zip +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/cube.zip +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/info.png +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/info.zip +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/simple_cv_joint_animated.gif +0 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/main.kv +63 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/main.py +150 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/uix/__init__.py +7 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/uix/custom_button.py +98 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/settings.py +93 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/shorten_text.py +80 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/spinner.py +17 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/splitter.py +74 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/tabbed_panel_showcase.py +316 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/tabbedpanel.py +50 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textalign.kv +49 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textalign.py +48 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textinput.py +59 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/unicode_textinput.py +244 -0
- Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/videoplayer.py +26 -0
- Kivy_examples-2.3.1.dev0.dist-info/AUTHORS +66 -0
- Kivy_examples-2.3.1.dev0.dist-info/LICENSE +21 -0
- Kivy_examples-2.3.1.dev0.dist-info/METADATA +382 -0
- Kivy_examples-2.3.1.dev0.dist-info/RECORD +624 -0
- Kivy_examples-2.3.1.dev0.dist-info/WHEEL +5 -0
- Kivy_examples-2.3.1.dev0.dist-info/dependency_links.txt +1 -0
- Kivy_examples-2.3.1.dev0.dist-info/top_level.txt +1 -0
- kivy/__init__.py +519 -0
- kivy/_version.py +18 -0
- kivy/animation.py +831 -0
- kivy/app.py +1213 -0
- kivy/atlas.py +456 -0
- kivy/base.py +617 -0
- kivy/cache.py +262 -0
- kivy/clock.py +1172 -0
- kivy/compat.py +82 -0
- kivy/config.py +1004 -0
- kivy/context.py +102 -0
- kivy/core/__init__.py +247 -0
- kivy/core/audio/__init__.py +223 -0
- kivy/core/audio/audio_android.py +104 -0
- kivy/core/audio/audio_avplayer.py +82 -0
- kivy/core/audio/audio_ffpyplayer.py +185 -0
- kivy/core/audio/audio_gstplayer.py +101 -0
- kivy/core/audio/audio_pygame.py +127 -0
- kivy/core/camera/__init__.py +151 -0
- kivy/core/camera/camera_android.py +206 -0
- kivy/core/camera/camera_gi.py +170 -0
- kivy/core/camera/camera_opencv.py +163 -0
- kivy/core/camera/camera_picamera.py +96 -0
- kivy/core/clipboard/__init__.py +157 -0
- kivy/core/clipboard/_clipboard_ext.py +36 -0
- kivy/core/clipboard/clipboard_android.py +91 -0
- kivy/core/clipboard/clipboard_dbusklipper.py +41 -0
- kivy/core/clipboard/clipboard_dummy.py +26 -0
- kivy/core/clipboard/clipboard_gtk3.py +47 -0
- kivy/core/clipboard/clipboard_nspaste.py +44 -0
- kivy/core/clipboard/clipboard_pygame.py +67 -0
- kivy/core/clipboard/clipboard_sdl2.py +36 -0
- kivy/core/clipboard/clipboard_winctypes.py +107 -0
- kivy/core/clipboard/clipboard_xclip.py +29 -0
- kivy/core/clipboard/clipboard_xsel.py +26 -0
- kivy/core/gl/__init__.py +90 -0
- kivy/core/image/__init__.py +996 -0
- kivy/core/image/img_dds.py +40 -0
- kivy/core/image/img_ffpyplayer.py +87 -0
- kivy/core/image/img_pil.py +123 -0
- kivy/core/image/img_pygame.py +119 -0
- kivy/core/image/img_sdl2.py +66 -0
- kivy/core/image/img_tex.py +58 -0
- kivy/core/spelling/__init__.py +135 -0
- kivy/core/spelling/spelling_enchant.py +50 -0
- kivy/core/spelling/spelling_osxappkit.py +64 -0
- kivy/core/text/__init__.py +1090 -0
- kivy/core/text/markup.py +893 -0
- kivy/core/text/text_pango.py +145 -0
- kivy/core/text/text_pil.py +84 -0
- kivy/core/text/text_pygame.py +117 -0
- kivy/core/text/text_sdl2.py +50 -0
- kivy/core/video/__init__.py +219 -0
- kivy/core/video/video_ffmpeg.py +106 -0
- kivy/core/video/video_ffpyplayer.py +449 -0
- kivy/core/video/video_gstplayer.py +140 -0
- kivy/core/video/video_null.py +12 -0
- kivy/core/window/__init__.py +2515 -0
- kivy/core/window/window_egl_rpi.py +86 -0
- kivy/core/window/window_pygame.py +441 -0
- kivy/core/window/window_sdl2.py +999 -0
- kivy/deps/__init__.py +6 -0
- kivy/effects/__init__.py +23 -0
- kivy/effects/dampedscroll.py +114 -0
- kivy/effects/kinetic.py +193 -0
- kivy/effects/opacityscroll.py +27 -0
- kivy/effects/scroll.py +126 -0
- kivy/event.py +12 -0
- kivy/eventmanager/__init__.py +185 -0
- kivy/extras/__init__.py +0 -0
- kivy/extras/highlight.py +52 -0
- kivy/factory.py +190 -0
- kivy/factory_registers.py +201 -0
- kivy/garden/__init__.py +186 -0
- kivy/geometry.py +121 -0
- kivy/gesture.py +424 -0
- kivy/graphics/__init__.py +126 -0
- kivy/graphics/cgl_backend/__init__.py +0 -0
- kivy/input/__init__.py +39 -0
- kivy/input/factory.py +35 -0
- kivy/input/motionevent.py +587 -0
- kivy/input/postproc/__init__.py +27 -0
- kivy/input/postproc/calibration.py +200 -0
- kivy/input/postproc/dejitter.py +74 -0
- kivy/input/postproc/doubletap.py +101 -0
- kivy/input/postproc/ignorelist.py +47 -0
- kivy/input/postproc/retaintouch.py +93 -0
- kivy/input/postproc/tripletap.py +106 -0
- kivy/input/provider.py +40 -0
- kivy/input/providers/__init__.py +68 -0
- kivy/input/providers/androidjoystick.py +117 -0
- kivy/input/providers/hidinput.py +778 -0
- kivy/input/providers/leapfinger.py +113 -0
- kivy/input/providers/linuxwacom.py +396 -0
- kivy/input/providers/mactouch.py +220 -0
- kivy/input/providers/mouse.py +424 -0
- kivy/input/providers/mtdev.py +380 -0
- kivy/input/providers/probesysfs.py +254 -0
- kivy/input/providers/tuio.py +326 -0
- kivy/input/providers/wm_common.py +162 -0
- kivy/input/providers/wm_pen.py +121 -0
- kivy/input/providers/wm_touch.py +157 -0
- kivy/input/recorder.py +335 -0
- kivy/input/shape.py +27 -0
- kivy/interactive.py +335 -0
- kivy/lang/__init__.py +883 -0
- kivy/lang/builder.py +1004 -0
- kivy/lang/parser.py +822 -0
- kivy/lib/__init__.py +21 -0
- kivy/lib/ddsfile.py +419 -0
- kivy/lib/gstplayer/__init__.py +27 -0
- kivy/lib/mtdev.py +254 -0
- kivy/lib/vidcore_lite/__init__.py +0 -0
- kivy/loader.py +579 -0
- kivy/logger.py +646 -0
- kivy/metrics.py +421 -0
- kivy/modules/__init__.py +300 -0
- kivy/modules/_webdebugger.py +200 -0
- kivy/modules/console.py +1059 -0
- kivy/modules/cursor.py +75 -0
- kivy/modules/inspector.py +755 -0
- kivy/modules/joycursor.py +299 -0
- kivy/modules/keybinding.py +64 -0
- kivy/modules/monitor.py +90 -0
- kivy/modules/recorder.py +94 -0
- kivy/modules/screen.py +183 -0
- kivy/modules/showborder.py +33 -0
- kivy/modules/touchring.py +97 -0
- kivy/modules/webdebugger.py +30 -0
- kivy/multistroke.py +1477 -0
- kivy/network/__init__.py +7 -0
- kivy/network/urlrequest.py +794 -0
- kivy/parser.py +154 -0
- kivy/resources.py +102 -0
- kivy/storage/__init__.py +405 -0
- kivy/storage/dictstore.py +98 -0
- kivy/storage/jsonstore.py +92 -0
- kivy/storage/redisstore.py +103 -0
- kivy/support.py +267 -0
- kivy/tests/__init__.py +11 -0
- kivy/tests/async_common.py +568 -0
- kivy/tests/common.py +524 -0
- kivy/tests/conftest.py +33 -0
- kivy/tests/fixtures.py +169 -0
- kivy/tests/perf_test_textinput.py +195 -0
- kivy/tests/pyinstaller/simple_widget/main.py +12 -0
- kivy/tests/pyinstaller/simple_widget/project/__init__.py +0 -0
- kivy/tests/pyinstaller/simple_widget/project/widget.py +12 -0
- kivy/tests/pyinstaller/test_pyinstaller.py +115 -0
- kivy/tests/pyinstaller/video_widget/main.py +6 -0
- kivy/tests/pyinstaller/video_widget/project/__init__.py +38 -0
- kivy/tests/test_animations.py +415 -0
- kivy/tests/test_app.py +216 -0
- kivy/tests/test_audio.py +69 -0
- kivy/tests/test_benchmark.py +292 -0
- kivy/tests/test_clipboard.py +48 -0
- kivy/tests/test_clock.py +292 -0
- kivy/tests/test_compat.py +6 -0
- kivy/tests/test_config.py +35 -0
- kivy/tests/test_coverage.py +83 -0
- kivy/tests/test_doc_gallery.py +38 -0
- kivy/tests/test_environ_cli.py +50 -0
- kivy/tests/test_fbo_py2py3.py +74 -0
- kivy/tests/test_filechooser.py +11 -0
- kivy/tests/test_filechooser_unicode.py +82 -0
- kivy/tests/test_fonts.py +42 -0
- kivy/tests/test_garden.py +23 -0
- kivy/tests/test_graphics.py +1149 -0
- kivy/tests/test_graphics_svg.py +84 -0
- kivy/tests/test_image.py +74 -0
- kivy/tests/test_imageloader.py +485 -0
- kivy/tests/test_invalid_lang.py +42 -0
- kivy/tests/test_issues/test_6315.py +55 -0
- kivy/tests/test_issues/test_issue_1084.py +47 -0
- kivy/tests/test_issues/test_issue_1091.py +19 -0
- kivy/tests/test_issues/test_issue_599.py +21 -0
- kivy/tests/test_issues/test_issue_609.py +19 -0
- kivy/tests/test_issues/test_issue_6909.py +28 -0
- kivy/tests/test_issues/test_issue_883.py +12 -0
- kivy/tests/test_kivy_init.py +30 -0
- kivy/tests/test_knspace.py +247 -0
- kivy/tests/test_lang.py +431 -0
- kivy/tests/test_lang_complex.py +87 -0
- kivy/tests/test_lang_pre_process_and_post_process.py +394 -0
- kivy/tests/test_logger.py +516 -0
- kivy/tests/test_metrics.py +30 -0
- kivy/tests/test_module_inspector.py +382 -0
- kivy/tests/test_motion_event.py +44 -0
- kivy/tests/test_mouse_hover_event.py +249 -0
- kivy/tests/test_mouse_multitouchsim.py +554 -0
- kivy/tests/test_multistroke.py +389 -0
- kivy/tests/test_properties.py +1332 -0
- kivy/tests/test_resources.py +79 -0
- kivy/tests/test_rst_replace.py +63 -0
- kivy/tests/test_screen.py +38 -0
- kivy/tests/test_storage.py +135 -0
- kivy/tests/test_uix_actionbar.py +363 -0
- kivy/tests/test_uix_anchorlayout.py +79 -0
- kivy/tests/test_uix_asyncimage.py +133 -0
- kivy/tests/test_uix_boxlayout.py +94 -0
- kivy/tests/test_uix_bubble.py +425 -0
- kivy/tests/test_uix_carousel.py +93 -0
- kivy/tests/test_uix_colorpicker.py +77 -0
- kivy/tests/test_uix_dropdown.py +91 -0
- kivy/tests/test_uix_gridlayout.py +244 -0
- kivy/tests/test_uix_layout.py +16 -0
- kivy/tests/test_uix_modal.py +101 -0
- kivy/tests/test_uix_recyclegridlayout.py +383 -0
- kivy/tests/test_uix_relativelayout.py +30 -0
- kivy/tests/test_uix_scrollview.py +358 -0
- kivy/tests/test_uix_settings.py +33 -0
- kivy/tests/test_uix_slider.py +156 -0
- kivy/tests/test_uix_stacklayout.py +120 -0
- kivy/tests/test_uix_textinput.py +577 -0
- kivy/tests/test_uix_translate_coordinates.py +72 -0
- kivy/tests/test_uix_videoplayer.py +112 -0
- kivy/tests/test_uix_widget.py +137 -0
- kivy/tests/test_urlrequest/test_urlrequest_requests.py +378 -0
- kivy/tests/test_urlrequest/test_urlrequest_urllib.py +155 -0
- kivy/tests/test_utils.py +237 -0
- kivy/tests/test_vector.py +256 -0
- kivy/tests/test_video.py +25 -0
- kivy/tests/test_weakmethod.py +44 -0
- kivy/tests/test_widget.py +127 -0
- kivy/tests/test_widget_walk.py +70 -0
- kivy/tests/test_window_base.py +60 -0
- kivy/tests/test_window_info.py +29 -0
- kivy/tests/visual_test_label.py +291 -0
- kivy/tools/__init__.py +44 -0
- kivy/tools/benchmark.py +286 -0
- kivy/tools/changelog_parser.py +120 -0
- kivy/tools/coverage.py +135 -0
- kivy/tools/gallery.py +323 -0
- kivy/tools/generate-icons.py +117 -0
- kivy/tools/gles_compat/subset_gles.py +125 -0
- kivy/tools/highlight/__init__.py +9 -0
- kivy/tools/kviewer.py +80 -0
- kivy/tools/packaging/__init__.py +12 -0
- kivy/tools/packaging/cython_cfg.py +82 -0
- kivy/tools/packaging/factory.py +105 -0
- kivy/tools/packaging/pyinstaller_hooks/__init__.py +381 -0
- kivy/tools/packaging/pyinstaller_hooks/__main__.py +29 -0
- kivy/tools/packaging/pyinstaller_hooks/hook-kivy.py +9 -0
- kivy/tools/packaging/pyinstaller_hooks/pyi_rth_kivy.py +17 -0
- kivy/tools/pep8checker/pep8.py +2316 -0
- kivy/tools/pep8checker/pep8kivy.py +109 -0
- kivy/tools/report.py +223 -0
- kivy/tools/stub-gl-debug.py +201 -0
- kivy/tools/texturecompress.py +233 -0
- kivy/uix/__init__.py +56 -0
- kivy/uix/accordion.py +484 -0
- kivy/uix/actionbar.py +934 -0
- kivy/uix/anchorlayout.py +122 -0
- kivy/uix/behaviors/__init__.py +95 -0
- kivy/uix/behaviors/button.py +212 -0
- kivy/uix/behaviors/codenavigation.py +167 -0
- kivy/uix/behaviors/compoundselection.py +688 -0
- kivy/uix/behaviors/cover.py +160 -0
- kivy/uix/behaviors/drag.py +234 -0
- kivy/uix/behaviors/emacs.py +140 -0
- kivy/uix/behaviors/focus.py +595 -0
- kivy/uix/behaviors/knspace.py +590 -0
- kivy/uix/behaviors/togglebutton.py +156 -0
- kivy/uix/behaviors/touchripple.py +318 -0
- kivy/uix/boxlayout.py +331 -0
- kivy/uix/bubble.py +576 -0
- kivy/uix/button.py +137 -0
- kivy/uix/camera.py +118 -0
- kivy/uix/carousel.py +695 -0
- kivy/uix/checkbox.py +197 -0
- kivy/uix/codeinput.py +238 -0
- kivy/uix/colorpicker.py +486 -0
- kivy/uix/dropdown.py +391 -0
- kivy/uix/effectwidget.py +772 -0
- kivy/uix/filechooser.py +1134 -0
- kivy/uix/floatlayout.py +148 -0
- kivy/uix/gesturesurface.py +625 -0
- kivy/uix/gridlayout.py +629 -0
- kivy/uix/image.py +528 -0
- kivy/uix/label.py +1200 -0
- kivy/uix/layout.py +322 -0
- kivy/uix/modalview.py +339 -0
- kivy/uix/pagelayout.py +233 -0
- kivy/uix/popup.py +266 -0
- kivy/uix/progressbar.py +95 -0
- kivy/uix/recycleboxlayout.py +183 -0
- kivy/uix/recyclegridlayout.py +255 -0
- kivy/uix/recyclelayout.py +446 -0
- kivy/uix/recycleview/__init__.py +624 -0
- kivy/uix/recycleview/datamodel.py +194 -0
- kivy/uix/recycleview/layout.py +253 -0
- kivy/uix/recycleview/views.py +423 -0
- kivy/uix/relativelayout.py +324 -0
- kivy/uix/rst.py +1492 -0
- kivy/uix/sandbox.py +198 -0
- kivy/uix/scatter.py +645 -0
- kivy/uix/scatterlayout.py +93 -0
- kivy/uix/screenmanager.py +1275 -0
- kivy/uix/scrollview.py +1288 -0
- kivy/uix/settings.py +1343 -0
- kivy/uix/slider.py +421 -0
- kivy/uix/spinner.py +221 -0
- kivy/uix/splitter.py +430 -0
- kivy/uix/stacklayout.py +331 -0
- kivy/uix/stencilview.py +40 -0
- kivy/uix/switch.py +122 -0
- kivy/uix/tabbedpanel.py +880 -0
- kivy/uix/textinput.py +4049 -0
- kivy/uix/togglebutton.py +37 -0
- kivy/uix/treeview.py +665 -0
- kivy/uix/video.py +302 -0
- kivy/uix/videoplayer.py +697 -0
- kivy/uix/vkeyboard.py +879 -0
- kivy/uix/widget.py +1629 -0
- kivy/utils.py +550 -0
- kivy/vector.py +412 -0
- kivy/weakmethod.py +72 -0
|
@@ -0,0 +1,625 @@
|
|
|
1
|
+
'''
|
|
2
|
+
Gesture Surface
|
|
3
|
+
===============
|
|
4
|
+
|
|
5
|
+
.. versionadded::
|
|
6
|
+
1.9.0
|
|
7
|
+
|
|
8
|
+
.. warning::
|
|
9
|
+
|
|
10
|
+
This is experimental and subject to change as long as this warning notice
|
|
11
|
+
is present.
|
|
12
|
+
|
|
13
|
+
See :file:`kivy/examples/demo/multistroke/main.py` for a complete application
|
|
14
|
+
example.
|
|
15
|
+
'''
|
|
16
|
+
__all__ = ('GestureSurface', 'GestureContainer')
|
|
17
|
+
|
|
18
|
+
from random import random
|
|
19
|
+
from kivy.event import EventDispatcher
|
|
20
|
+
from kivy.clock import Clock
|
|
21
|
+
from kivy.vector import Vector
|
|
22
|
+
from kivy.uix.floatlayout import FloatLayout
|
|
23
|
+
from kivy.graphics import Color, Line, Rectangle
|
|
24
|
+
from kivy.properties import (NumericProperty, BooleanProperty,
|
|
25
|
+
DictProperty, ColorProperty)
|
|
26
|
+
from colorsys import hsv_to_rgb
|
|
27
|
+
|
|
28
|
+
# Clock undershoot margin, FIXME: this is probably too high?
|
|
29
|
+
UNDERSHOOT_MARGIN = 0.1
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class GestureContainer(EventDispatcher):
|
|
33
|
+
'''Container object that stores information about a gesture. It has
|
|
34
|
+
various properties that are updated by `GestureSurface` as drawing
|
|
35
|
+
progresses.
|
|
36
|
+
|
|
37
|
+
:Arguments:
|
|
38
|
+
`touch`
|
|
39
|
+
Touch object (as received by on_touch_down) used to initialize
|
|
40
|
+
the gesture container. Required.
|
|
41
|
+
|
|
42
|
+
:Properties:
|
|
43
|
+
`active`
|
|
44
|
+
Set to False once the gesture is complete (meets
|
|
45
|
+
`max_stroke` setting or `GestureSurface.temporal_window`)
|
|
46
|
+
|
|
47
|
+
:attr:`active` is a
|
|
48
|
+
:class:`~kivy.properties.BooleanProperty`
|
|
49
|
+
|
|
50
|
+
`active_strokes`
|
|
51
|
+
Number of strokes currently active in the gesture, ie
|
|
52
|
+
concurrent touches associated with this gesture.
|
|
53
|
+
|
|
54
|
+
:attr:`active_strokes` is a
|
|
55
|
+
:class:`~kivy.properties.NumericProperty`
|
|
56
|
+
|
|
57
|
+
`max_strokes`
|
|
58
|
+
Max number of strokes allowed in the gesture. This
|
|
59
|
+
is set by `GestureSurface.max_strokes` but can
|
|
60
|
+
be overridden for example from `on_gesture_start`.
|
|
61
|
+
|
|
62
|
+
:attr:`max_strokes` is a
|
|
63
|
+
:class:`~kivy.properties.NumericProperty`
|
|
64
|
+
|
|
65
|
+
`was_merged`
|
|
66
|
+
Indicates that this gesture has been merged with another
|
|
67
|
+
gesture and should be considered discarded.
|
|
68
|
+
|
|
69
|
+
:attr:`was_merged` is a
|
|
70
|
+
:class:`~kivy.properties.BooleanProperty`
|
|
71
|
+
|
|
72
|
+
`bbox`
|
|
73
|
+
Dictionary with keys minx, miny, maxx, maxy. Represents the size
|
|
74
|
+
of the gesture bounding box.
|
|
75
|
+
|
|
76
|
+
:attr:`bbox` is a
|
|
77
|
+
:class:`~kivy.properties.DictProperty`
|
|
78
|
+
|
|
79
|
+
`width`
|
|
80
|
+
Represents the width of the gesture.
|
|
81
|
+
|
|
82
|
+
:attr:`width` is a
|
|
83
|
+
:class:`~kivy.properties.NumericProperty`
|
|
84
|
+
|
|
85
|
+
`height`
|
|
86
|
+
Represents the height of the gesture.
|
|
87
|
+
|
|
88
|
+
:attr:`height` is a
|
|
89
|
+
:class:`~kivy.properties.NumericProperty`
|
|
90
|
+
'''
|
|
91
|
+
active = BooleanProperty(True)
|
|
92
|
+
active_strokes = NumericProperty(0)
|
|
93
|
+
max_strokes = NumericProperty(0)
|
|
94
|
+
was_merged = BooleanProperty(False)
|
|
95
|
+
bbox = DictProperty({'minx': float('inf'), 'miny': float('inf'),
|
|
96
|
+
'maxx': float('-inf'), 'maxy': float('-inf')})
|
|
97
|
+
width = NumericProperty(0)
|
|
98
|
+
height = NumericProperty(0)
|
|
99
|
+
|
|
100
|
+
def __init__(self, touch, **kwargs):
|
|
101
|
+
# The color is applied to all canvas items of this gesture
|
|
102
|
+
self.color = kwargs.pop('color', [1., 1., 1.])
|
|
103
|
+
|
|
104
|
+
super(GestureContainer, self).__init__(**kwargs)
|
|
105
|
+
|
|
106
|
+
# This is the touch.uid of the oldest touch represented
|
|
107
|
+
self.id = str(touch.uid)
|
|
108
|
+
|
|
109
|
+
# Store various timestamps for decision making
|
|
110
|
+
self._create_time = Clock.get_time()
|
|
111
|
+
self._update_time = None
|
|
112
|
+
self._cleanup_time = None
|
|
113
|
+
self._cache_time = 0
|
|
114
|
+
|
|
115
|
+
# We can cache the candidate here to save zip()/Vector instantiation
|
|
116
|
+
self._vectors = None
|
|
117
|
+
|
|
118
|
+
# Key is touch.uid; value is a kivy.graphics.Line(); it's used even
|
|
119
|
+
# if line_width is 0 (i.e. not actually drawn anywhere)
|
|
120
|
+
self._strokes = {}
|
|
121
|
+
|
|
122
|
+
# Make sure the bbox is up to date with the first touch position
|
|
123
|
+
self.update_bbox(touch)
|
|
124
|
+
|
|
125
|
+
def get_vectors(self, **kwargs):
|
|
126
|
+
'''Return strokes in a format that is acceptable for
|
|
127
|
+
`kivy.multistroke.Recognizer` as a gesture candidate or template. The
|
|
128
|
+
result is cached automatically; the cache is invalidated at the start
|
|
129
|
+
and end of a stroke and if `update_bbox` is called. If you are going
|
|
130
|
+
to analyze a gesture mid-stroke, you may need to set the `no_cache`
|
|
131
|
+
argument to True.'''
|
|
132
|
+
if self._cache_time == self._update_time and \
|
|
133
|
+
not kwargs.get('no_cache'):
|
|
134
|
+
return self._vectors
|
|
135
|
+
|
|
136
|
+
vecs = []
|
|
137
|
+
append = vecs.append
|
|
138
|
+
for tuid, l in self._strokes.items():
|
|
139
|
+
lpts = l.points
|
|
140
|
+
append([Vector(*pts) for pts in zip(lpts[::2], lpts[1::2])])
|
|
141
|
+
|
|
142
|
+
self._vectors = vecs
|
|
143
|
+
self._cache_time = self._update_time
|
|
144
|
+
return vecs
|
|
145
|
+
|
|
146
|
+
def handles(self, touch):
|
|
147
|
+
'''Returns True if this container handles the given touch'''
|
|
148
|
+
if not self.active:
|
|
149
|
+
return False
|
|
150
|
+
return str(touch.uid) in self._strokes
|
|
151
|
+
|
|
152
|
+
def accept_stroke(self, count=1):
|
|
153
|
+
'''Returns True if this container can accept `count` new strokes'''
|
|
154
|
+
if not self.max_strokes:
|
|
155
|
+
return True
|
|
156
|
+
return len(self._strokes) + count <= self.max_strokes
|
|
157
|
+
|
|
158
|
+
def update_bbox(self, touch):
|
|
159
|
+
'''Update gesture bbox from a touch coordinate'''
|
|
160
|
+
x, y = touch.x, touch.y
|
|
161
|
+
bb = self.bbox
|
|
162
|
+
if x < bb['minx']:
|
|
163
|
+
bb['minx'] = x
|
|
164
|
+
if y < bb['miny']:
|
|
165
|
+
bb['miny'] = y
|
|
166
|
+
if x > bb['maxx']:
|
|
167
|
+
bb['maxx'] = x
|
|
168
|
+
if y > bb['maxy']:
|
|
169
|
+
bb['maxy'] = y
|
|
170
|
+
self.width = bb['maxx'] - bb['minx']
|
|
171
|
+
self.height = bb['maxy'] - bb['miny']
|
|
172
|
+
self._update_time = Clock.get_time()
|
|
173
|
+
|
|
174
|
+
def add_stroke(self, touch, line):
|
|
175
|
+
'''Associate a list of points with a touch.uid; the line itself is
|
|
176
|
+
created by the caller, but subsequent move/up events look it
|
|
177
|
+
up via us. This is done to avoid problems during merge.'''
|
|
178
|
+
self._update_time = Clock.get_time()
|
|
179
|
+
self._strokes[str(touch.uid)] = line
|
|
180
|
+
self.active_strokes += 1
|
|
181
|
+
|
|
182
|
+
def complete_stroke(self):
|
|
183
|
+
'''Called on touch up events to keep track of how many strokes
|
|
184
|
+
are active in the gesture (we only want to dispatch event when
|
|
185
|
+
the *last* stroke in the gesture is released)'''
|
|
186
|
+
self._update_time = Clock.get_time()
|
|
187
|
+
self.active_strokes -= 1
|
|
188
|
+
|
|
189
|
+
def single_points_test(self):
|
|
190
|
+
'''Returns True if the gesture consists only of single-point strokes,
|
|
191
|
+
we must discard it in this case, or an exception will be raised'''
|
|
192
|
+
for tuid, l in self._strokes.items():
|
|
193
|
+
if len(l.points) > 2:
|
|
194
|
+
return False
|
|
195
|
+
return True
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
class GestureSurface(FloatLayout):
|
|
199
|
+
'''Simple gesture surface to track/draw touch movements. Typically used
|
|
200
|
+
to gather user input suitable for :class:`kivy.multistroke.Recognizer`.
|
|
201
|
+
|
|
202
|
+
:Properties:
|
|
203
|
+
`temporal_window`
|
|
204
|
+
Time to wait from the last touch_up event before attempting
|
|
205
|
+
to recognize the gesture. If you set this to 0, the
|
|
206
|
+
`on_gesture_complete` event is not fired unless the
|
|
207
|
+
:attr:`max_strokes` condition is met.
|
|
208
|
+
|
|
209
|
+
:attr:`temporal_window` is a
|
|
210
|
+
:class:`~kivy.properties.NumericProperty` and defaults to 2.0
|
|
211
|
+
|
|
212
|
+
`max_strokes`
|
|
213
|
+
Max number of strokes in a single gesture; if this is reached,
|
|
214
|
+
recognition will start immediately on the final touch_up event.
|
|
215
|
+
If this is set to 0, the `on_gesture_complete` event is not
|
|
216
|
+
fired unless the :attr:`temporal_window` expires.
|
|
217
|
+
|
|
218
|
+
:attr:`max_strokes` is a
|
|
219
|
+
:class:`~kivy.properties.NumericProperty` and defaults to 2.0
|
|
220
|
+
|
|
221
|
+
`bbox_margin`
|
|
222
|
+
Bounding box margin for detecting gesture collisions, in
|
|
223
|
+
pixels.
|
|
224
|
+
|
|
225
|
+
:attr:`bbox_margin` is a
|
|
226
|
+
:class:`~kivy.properties.NumericProperty` and defaults to 30
|
|
227
|
+
|
|
228
|
+
`draw_timeout`
|
|
229
|
+
Number of seconds to keep lines/bbox on canvas after the
|
|
230
|
+
`on_gesture_complete` event is fired. If this is set to 0,
|
|
231
|
+
gestures are immediately removed from the surface when
|
|
232
|
+
complete.
|
|
233
|
+
|
|
234
|
+
:attr:`draw_timeout` is a
|
|
235
|
+
:class:`~kivy.properties.NumericProperty` and defaults to 3.0
|
|
236
|
+
|
|
237
|
+
`color`
|
|
238
|
+
Color used to draw the gesture, in RGB. This option does not
|
|
239
|
+
have an effect if :attr:`use_random_color` is True.
|
|
240
|
+
|
|
241
|
+
:attr:`color` is a
|
|
242
|
+
:class:`~kivy.properties.ColorProperty` and defaults to
|
|
243
|
+
[1, 1, 1, 1] (white)
|
|
244
|
+
|
|
245
|
+
.. versionchanged:: 2.0.0
|
|
246
|
+
Changed from :class:`~kivy.properties.ListProperty` to
|
|
247
|
+
:class:`~kivy.properties.ColorProperty`.
|
|
248
|
+
|
|
249
|
+
`use_random_color`
|
|
250
|
+
Set to True to pick a random color for each gesture, if you do
|
|
251
|
+
this then `color` is ignored. Defaults to False.
|
|
252
|
+
|
|
253
|
+
:attr:`use_random_color` is a
|
|
254
|
+
:class:`~kivy.properties.BooleanProperty` and defaults to False
|
|
255
|
+
|
|
256
|
+
`line_width`
|
|
257
|
+
Line width used for tracing touches on the surface. Set to 0
|
|
258
|
+
if you only want to detect gestures without drawing anything.
|
|
259
|
+
If you use 1.0, OpenGL GL_LINE is used for drawing; values > 1
|
|
260
|
+
will use an internal drawing method based on triangles (less
|
|
261
|
+
efficient), see :mod:`kivy.graphics`.
|
|
262
|
+
|
|
263
|
+
:attr:`line_width` is a
|
|
264
|
+
:class:`~kivy.properties.NumericProperty` and defaults to 2
|
|
265
|
+
|
|
266
|
+
`draw_bbox`
|
|
267
|
+
Set to True if you want to draw bounding box behind gestures.
|
|
268
|
+
This only works if `line_width` >= 1. Default is False.
|
|
269
|
+
|
|
270
|
+
:attr:`draw_bbox` is a
|
|
271
|
+
:class:`~kivy.properties.BooleanProperty` and defaults to True
|
|
272
|
+
|
|
273
|
+
`bbox_alpha`
|
|
274
|
+
Opacity for bounding box if `draw_bbox` is True. Default 0.1
|
|
275
|
+
|
|
276
|
+
:attr:`bbox_alpha` is a
|
|
277
|
+
:class:`~kivy.properties.NumericProperty` and defaults to 0.1
|
|
278
|
+
|
|
279
|
+
:Events:
|
|
280
|
+
`on_gesture_start` :class:`GestureContainer`
|
|
281
|
+
Fired when a new gesture is initiated on the surface, i.e. the
|
|
282
|
+
first on_touch_down that does not collide with an existing
|
|
283
|
+
gesture on the surface.
|
|
284
|
+
|
|
285
|
+
`on_gesture_extend` :class:`GestureContainer`
|
|
286
|
+
Fired when a touch_down event occurs within an existing gesture.
|
|
287
|
+
|
|
288
|
+
`on_gesture_merge` :class:`GestureContainer`, :class:`GestureContainer`
|
|
289
|
+
Fired when two gestures collide and get merged to one gesture.
|
|
290
|
+
The first argument is the gesture that has been merged (no longer
|
|
291
|
+
valid); the second is the combined (resulting) gesture.
|
|
292
|
+
|
|
293
|
+
`on_gesture_complete` :class:`GestureContainer`
|
|
294
|
+
Fired when a set of strokes is considered a complete gesture,
|
|
295
|
+
this happens when `temporal_window` expires or `max_strokes`
|
|
296
|
+
is reached. Typically you will bind to this event and use
|
|
297
|
+
the provided `GestureContainer` get_vectors() method to
|
|
298
|
+
match against your gesture database.
|
|
299
|
+
|
|
300
|
+
`on_gesture_cleanup` :class:`GestureContainer`
|
|
301
|
+
Fired `draw_timeout` seconds after `on_gesture_complete`,
|
|
302
|
+
The gesture will be removed from the canvas (if line_width > 0 or
|
|
303
|
+
draw_bbox is True) and the internal gesture list before this.
|
|
304
|
+
|
|
305
|
+
`on_gesture_discard` :class:`GestureContainer`
|
|
306
|
+
Fired when a gesture does not meet the minimum size requirements
|
|
307
|
+
for recognition (width/height < 5, or consists only of single-
|
|
308
|
+
point strokes).
|
|
309
|
+
'''
|
|
310
|
+
|
|
311
|
+
temporal_window = NumericProperty(2.0)
|
|
312
|
+
draw_timeout = NumericProperty(3.0)
|
|
313
|
+
max_strokes = NumericProperty(4)
|
|
314
|
+
bbox_margin = NumericProperty(30)
|
|
315
|
+
|
|
316
|
+
line_width = NumericProperty(2)
|
|
317
|
+
color = ColorProperty([1., 1., 1., 1.])
|
|
318
|
+
use_random_color = BooleanProperty(False)
|
|
319
|
+
draw_bbox = BooleanProperty(False)
|
|
320
|
+
bbox_alpha = NumericProperty(0.1)
|
|
321
|
+
|
|
322
|
+
def __init__(self, **kwargs):
|
|
323
|
+
super(GestureSurface, self).__init__(**kwargs)
|
|
324
|
+
# A list of GestureContainer objects (all gestures on the surface)
|
|
325
|
+
self._gestures = []
|
|
326
|
+
self.register_event_type('on_gesture_start')
|
|
327
|
+
self.register_event_type('on_gesture_extend')
|
|
328
|
+
self.register_event_type('on_gesture_merge')
|
|
329
|
+
self.register_event_type('on_gesture_complete')
|
|
330
|
+
self.register_event_type('on_gesture_cleanup')
|
|
331
|
+
self.register_event_type('on_gesture_discard')
|
|
332
|
+
|
|
333
|
+
# -----------------------------------------------------------------------------
|
|
334
|
+
# Touch Events
|
|
335
|
+
# -----------------------------------------------------------------------------
|
|
336
|
+
def on_touch_down(self, touch):
|
|
337
|
+
'''When a new touch is registered, the first thing we do is to test if
|
|
338
|
+
it collides with the bounding box of another known gesture. If so, it
|
|
339
|
+
is assumed to be part of that gesture.
|
|
340
|
+
'''
|
|
341
|
+
# If the touch originates outside the surface, ignore it.
|
|
342
|
+
if not self.collide_point(touch.x, touch.y):
|
|
343
|
+
return
|
|
344
|
+
|
|
345
|
+
touch.grab(self)
|
|
346
|
+
|
|
347
|
+
# Add the stroke to existing gesture, or make a new one
|
|
348
|
+
g = self.find_colliding_gesture(touch)
|
|
349
|
+
new = False
|
|
350
|
+
if g is None:
|
|
351
|
+
g = self.init_gesture(touch)
|
|
352
|
+
new = True
|
|
353
|
+
|
|
354
|
+
# We now belong to a gesture (new or old); start a new stroke.
|
|
355
|
+
self.init_stroke(g, touch)
|
|
356
|
+
|
|
357
|
+
if new:
|
|
358
|
+
self.dispatch('on_gesture_start', g, touch)
|
|
359
|
+
else:
|
|
360
|
+
self.dispatch('on_gesture_extend', g, touch)
|
|
361
|
+
|
|
362
|
+
return True
|
|
363
|
+
|
|
364
|
+
def on_touch_move(self, touch):
|
|
365
|
+
'''When a touch moves, we add a point to the line on the canvas so the
|
|
366
|
+
path is updated. We must also check if the new point collides with the
|
|
367
|
+
bounding box of another gesture - if so, they should be merged.'''
|
|
368
|
+
if touch.grab_current is not self:
|
|
369
|
+
return
|
|
370
|
+
if not self.collide_point(touch.x, touch.y):
|
|
371
|
+
return
|
|
372
|
+
|
|
373
|
+
# Retrieve the GestureContainer object that handles this touch, and
|
|
374
|
+
# test for colliding gestures. If found, merge them to one.
|
|
375
|
+
g = self.get_gesture(touch)
|
|
376
|
+
collision = self.find_colliding_gesture(touch)
|
|
377
|
+
if collision is not None and g.accept_stroke(len(collision._strokes)):
|
|
378
|
+
merge = self.merge_gestures(g, collision)
|
|
379
|
+
if g.was_merged:
|
|
380
|
+
self.dispatch('on_gesture_merge', g, collision)
|
|
381
|
+
else:
|
|
382
|
+
self.dispatch('on_gesture_merge', collision, g)
|
|
383
|
+
g = merge
|
|
384
|
+
else:
|
|
385
|
+
g.update_bbox(touch)
|
|
386
|
+
|
|
387
|
+
# Add the new point to gesture stroke list and update the canvas line
|
|
388
|
+
g._strokes[str(touch.uid)].points += (touch.x, touch.y)
|
|
389
|
+
|
|
390
|
+
# Draw the gesture bounding box; if it is a single press that
|
|
391
|
+
# does not trigger a move event, we would miss it otherwise.
|
|
392
|
+
if self.draw_bbox:
|
|
393
|
+
self._update_canvas_bbox(g)
|
|
394
|
+
return True
|
|
395
|
+
|
|
396
|
+
def on_touch_up(self, touch):
|
|
397
|
+
if touch.grab_current is not self:
|
|
398
|
+
return
|
|
399
|
+
touch.ungrab(self)
|
|
400
|
+
|
|
401
|
+
g = self.get_gesture(touch)
|
|
402
|
+
g.complete_stroke()
|
|
403
|
+
|
|
404
|
+
# If this stroke hit the maximum limit, dispatch immediately
|
|
405
|
+
if not g.accept_stroke():
|
|
406
|
+
self._complete_dispatcher(0)
|
|
407
|
+
|
|
408
|
+
# dispatch later only if we have a window
|
|
409
|
+
elif self.temporal_window > 0:
|
|
410
|
+
Clock.schedule_once(self._complete_dispatcher,
|
|
411
|
+
self.temporal_window)
|
|
412
|
+
|
|
413
|
+
# -----------------------------------------------------------------------------
|
|
414
|
+
# Gesture related methods
|
|
415
|
+
# -----------------------------------------------------------------------------
|
|
416
|
+
def init_gesture(self, touch):
|
|
417
|
+
'''Create a new gesture from touch, i.e. it's the first on
|
|
418
|
+
surface, or was not close enough to any existing gesture (yet)'''
|
|
419
|
+
col = self.color
|
|
420
|
+
if self.use_random_color:
|
|
421
|
+
col = hsv_to_rgb(random(), 1., 1.)
|
|
422
|
+
|
|
423
|
+
g = GestureContainer(touch, max_strokes=self.max_strokes, color=col)
|
|
424
|
+
|
|
425
|
+
# Create the bounding box Rectangle for the gesture
|
|
426
|
+
if self.draw_bbox:
|
|
427
|
+
bb = g.bbox
|
|
428
|
+
with self.canvas:
|
|
429
|
+
Color(col[0], col[1], col[2], self.bbox_alpha, mode='rgba',
|
|
430
|
+
group=g.id)
|
|
431
|
+
|
|
432
|
+
g._bbrect = Rectangle(
|
|
433
|
+
group=g.id,
|
|
434
|
+
pos=(bb['minx'], bb['miny']),
|
|
435
|
+
size=(bb['maxx'] - bb['minx'],
|
|
436
|
+
bb['maxy'] - bb['miny']))
|
|
437
|
+
|
|
438
|
+
self._gestures.append(g)
|
|
439
|
+
return g
|
|
440
|
+
|
|
441
|
+
def init_stroke(self, g, touch):
|
|
442
|
+
points = [touch.x, touch.y]
|
|
443
|
+
col = g.color
|
|
444
|
+
|
|
445
|
+
new_line = Line(
|
|
446
|
+
points=points,
|
|
447
|
+
width=self.line_width,
|
|
448
|
+
group=g.id)
|
|
449
|
+
g._strokes[str(touch.uid)] = new_line
|
|
450
|
+
|
|
451
|
+
if self.line_width:
|
|
452
|
+
canvas_add = self.canvas.add
|
|
453
|
+
canvas_add(Color(col[0], col[1], col[2], mode='rgb', group=g.id))
|
|
454
|
+
canvas_add(new_line)
|
|
455
|
+
|
|
456
|
+
# Update the bbox in case; this will normally be done in on_touch_move,
|
|
457
|
+
# but we want to update it also for a single press, force that here:
|
|
458
|
+
g.update_bbox(touch)
|
|
459
|
+
if self.draw_bbox:
|
|
460
|
+
self._update_canvas_bbox(g)
|
|
461
|
+
|
|
462
|
+
# Register the stroke in GestureContainer so we can look it up later
|
|
463
|
+
g.add_stroke(touch, new_line)
|
|
464
|
+
|
|
465
|
+
def get_gesture(self, touch):
|
|
466
|
+
'''Returns GestureContainer associated with given touch'''
|
|
467
|
+
for g in self._gestures:
|
|
468
|
+
if g.active and g.handles(touch):
|
|
469
|
+
return g
|
|
470
|
+
raise Exception('get_gesture() failed to identify ' + str(touch.uid))
|
|
471
|
+
|
|
472
|
+
def find_colliding_gesture(self, touch):
|
|
473
|
+
'''Checks if a touch x/y collides with the bounding box of an existing
|
|
474
|
+
gesture. If so, return it (otherwise returns None)
|
|
475
|
+
'''
|
|
476
|
+
touch_x, touch_y = touch.pos
|
|
477
|
+
for g in self._gestures:
|
|
478
|
+
if g.active and not g.handles(touch) and g.accept_stroke():
|
|
479
|
+
bb = g.bbox
|
|
480
|
+
margin = self.bbox_margin
|
|
481
|
+
minx = bb['minx'] - margin
|
|
482
|
+
miny = bb['miny'] - margin
|
|
483
|
+
maxx = bb['maxx'] + margin
|
|
484
|
+
maxy = bb['maxy'] + margin
|
|
485
|
+
if minx <= touch_x <= maxx and miny <= touch_y <= maxy:
|
|
486
|
+
return g
|
|
487
|
+
return None
|
|
488
|
+
|
|
489
|
+
def merge_gestures(self, g, other):
|
|
490
|
+
'''Merges two gestures together, the oldest one is retained and the
|
|
491
|
+
newer one gets the `GestureContainer.was_merged` flag raised.'''
|
|
492
|
+
# Swap order depending on gesture age (the merged gesture gets
|
|
493
|
+
# the color from the oldest one of the two).
|
|
494
|
+
swap = other._create_time < g._create_time
|
|
495
|
+
a = swap and other or g
|
|
496
|
+
b = swap and g or other
|
|
497
|
+
|
|
498
|
+
# Apply the outer limits of bbox to the merged gesture
|
|
499
|
+
abbox = a.bbox
|
|
500
|
+
bbbox = b.bbox
|
|
501
|
+
if bbbox['minx'] < abbox['minx']:
|
|
502
|
+
abbox['minx'] = bbbox['minx']
|
|
503
|
+
if bbbox['miny'] < abbox['miny']:
|
|
504
|
+
abbox['miny'] = bbbox['miny']
|
|
505
|
+
if bbbox['maxx'] > abbox['maxx']:
|
|
506
|
+
abbox['maxx'] = bbbox['maxx']
|
|
507
|
+
if bbbox['maxy'] > abbox['maxy']:
|
|
508
|
+
abbox['maxy'] = bbbox['maxy']
|
|
509
|
+
|
|
510
|
+
# Now transfer the coordinates from old to new gesture;
|
|
511
|
+
# FIXME: This can probably be copied more efficiently?
|
|
512
|
+
astrokes = a._strokes
|
|
513
|
+
lw = self.line_width
|
|
514
|
+
a_id = a.id
|
|
515
|
+
col = a.color
|
|
516
|
+
|
|
517
|
+
self.canvas.remove_group(b.id)
|
|
518
|
+
canv_add = self.canvas.add
|
|
519
|
+
for uid, old in b._strokes.items():
|
|
520
|
+
# FIXME: Can't figure out how to change group= for existing Line()
|
|
521
|
+
new_line = Line(
|
|
522
|
+
points=old.points,
|
|
523
|
+
width=old.width,
|
|
524
|
+
group=a_id)
|
|
525
|
+
astrokes[uid] = new_line
|
|
526
|
+
if lw:
|
|
527
|
+
canv_add(Color(col[0], col[1], col[2], mode='rgb', group=a_id))
|
|
528
|
+
canv_add(new_line)
|
|
529
|
+
|
|
530
|
+
b.active = False
|
|
531
|
+
b.was_merged = True
|
|
532
|
+
a.active_strokes += b.active_strokes
|
|
533
|
+
a._update_time = Clock.get_time()
|
|
534
|
+
return a
|
|
535
|
+
|
|
536
|
+
def _update_canvas_bbox(self, g):
|
|
537
|
+
# If draw_bbox is changed while two gestures are active,
|
|
538
|
+
# we might not have a bbrect member
|
|
539
|
+
if not hasattr(g, '_bbrect'):
|
|
540
|
+
return
|
|
541
|
+
|
|
542
|
+
bb = g.bbox
|
|
543
|
+
g._bbrect.pos = (bb['minx'], bb['miny'])
|
|
544
|
+
g._bbrect.size = (bb['maxx'] - bb['minx'],
|
|
545
|
+
bb['maxy'] - bb['miny'])
|
|
546
|
+
|
|
547
|
+
# -----------------------------------------------------------------------------
|
|
548
|
+
# Timeout callbacks
|
|
549
|
+
# -----------------------------------------------------------------------------
|
|
550
|
+
def _complete_dispatcher(self, dt):
|
|
551
|
+
'''This method is scheduled on all touch up events. It will dispatch
|
|
552
|
+
the `on_gesture_complete` event for all completed gestures, and remove
|
|
553
|
+
merged gestures from the internal gesture list.'''
|
|
554
|
+
need_cleanup = False
|
|
555
|
+
gest = self._gestures
|
|
556
|
+
timeout = self.draw_timeout
|
|
557
|
+
twin = self.temporal_window
|
|
558
|
+
get_time = Clock.get_time
|
|
559
|
+
|
|
560
|
+
for idx, g in enumerate(gest):
|
|
561
|
+
# Gesture is part of another gesture, just delete it
|
|
562
|
+
if g.was_merged:
|
|
563
|
+
del gest[idx]
|
|
564
|
+
continue
|
|
565
|
+
|
|
566
|
+
# Not active == already handled, or has active strokes (it cannot
|
|
567
|
+
# possibly be complete). Proceed to next gesture on surface.
|
|
568
|
+
if not g.active or g.active_strokes != 0:
|
|
569
|
+
continue
|
|
570
|
+
|
|
571
|
+
t1 = g._update_time + twin
|
|
572
|
+
t2 = get_time() + UNDERSHOOT_MARGIN
|
|
573
|
+
|
|
574
|
+
# max_strokes reached, or temporal window has expired. The gesture
|
|
575
|
+
# is complete; need to dispatch _complete or _discard event.
|
|
576
|
+
if not g.accept_stroke() or t1 <= t2:
|
|
577
|
+
discard = False
|
|
578
|
+
if g.width < 5 and g.height < 5:
|
|
579
|
+
discard = True
|
|
580
|
+
elif g.single_points_test():
|
|
581
|
+
discard = True
|
|
582
|
+
|
|
583
|
+
need_cleanup = True
|
|
584
|
+
g.active = False
|
|
585
|
+
g._cleanup_time = get_time() + timeout
|
|
586
|
+
|
|
587
|
+
if discard:
|
|
588
|
+
self.dispatch('on_gesture_discard', g)
|
|
589
|
+
else:
|
|
590
|
+
self.dispatch('on_gesture_complete', g)
|
|
591
|
+
|
|
592
|
+
if need_cleanup:
|
|
593
|
+
Clock.schedule_once(self._cleanup, timeout)
|
|
594
|
+
|
|
595
|
+
def _cleanup(self, dt):
|
|
596
|
+
'''This method is scheduled from _complete_dispatcher to clean up the
|
|
597
|
+
canvas and internal gesture list after a gesture is completed.'''
|
|
598
|
+
m = UNDERSHOOT_MARGIN
|
|
599
|
+
rg = self.canvas.remove_group
|
|
600
|
+
gestures = self._gestures
|
|
601
|
+
for idx, g in enumerate(gestures):
|
|
602
|
+
if g._cleanup_time is None:
|
|
603
|
+
continue
|
|
604
|
+
if g._cleanup_time <= Clock.get_time() + m:
|
|
605
|
+
rg(g.id)
|
|
606
|
+
del gestures[idx]
|
|
607
|
+
self.dispatch('on_gesture_cleanup', g)
|
|
608
|
+
|
|
609
|
+
def on_gesture_start(self, *l):
|
|
610
|
+
pass
|
|
611
|
+
|
|
612
|
+
def on_gesture_extend(self, *l):
|
|
613
|
+
pass
|
|
614
|
+
|
|
615
|
+
def on_gesture_merge(self, *l):
|
|
616
|
+
pass
|
|
617
|
+
|
|
618
|
+
def on_gesture_complete(self, *l):
|
|
619
|
+
pass
|
|
620
|
+
|
|
621
|
+
def on_gesture_discard(self, *l):
|
|
622
|
+
pass
|
|
623
|
+
|
|
624
|
+
def on_gesture_cleanup(self, *l):
|
|
625
|
+
pass
|