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,688 @@
|
|
|
1
|
+
'''
|
|
2
|
+
Compound Selection Behavior
|
|
3
|
+
===========================
|
|
4
|
+
|
|
5
|
+
The :class:`~kivy.uix.behaviors.compoundselection.CompoundSelectionBehavior`
|
|
6
|
+
`mixin <https://en.wikipedia.org/wiki/Mixin>`_ class implements the logic
|
|
7
|
+
behind keyboard and touch selection of selectable widgets managed by the
|
|
8
|
+
derived widget. For example, it can be combined with a
|
|
9
|
+
:class:`~kivy.uix.gridlayout.GridLayout` to add selection to the layout.
|
|
10
|
+
|
|
11
|
+
Compound selection concepts
|
|
12
|
+
---------------------------
|
|
13
|
+
|
|
14
|
+
At its core, it keeps a dynamic list of widgets that can be selected.
|
|
15
|
+
Then, as the touches and keyboard input are passed in, it selects one or
|
|
16
|
+
more of the widgets based on these inputs. For example, it uses the mouse
|
|
17
|
+
scroll and keyboard up/down buttons to scroll through the list of widgets.
|
|
18
|
+
Multiselection can also be achieved using the keyboard shift and ctrl keys.
|
|
19
|
+
|
|
20
|
+
Finally, in addition to the up/down type keyboard inputs, compound selection
|
|
21
|
+
can also accept letters from the keyboard to be used to select nodes with
|
|
22
|
+
associated strings that start with those letters, similar to how files
|
|
23
|
+
are selected by a file browser.
|
|
24
|
+
|
|
25
|
+
Selection mechanics
|
|
26
|
+
-------------------
|
|
27
|
+
|
|
28
|
+
When the controller needs to select a node, it calls :meth:`select_node` and
|
|
29
|
+
:meth:`deselect_node`. Therefore, they must be overwritten in order alter
|
|
30
|
+
node selection. By default, the class doesn't listen for keyboard or
|
|
31
|
+
touch events, so the derived widget must call
|
|
32
|
+
:meth:`select_with_touch`, :meth:`select_with_key_down`, and
|
|
33
|
+
:meth:`select_with_key_up` on events that it wants to pass on for selection
|
|
34
|
+
purposes.
|
|
35
|
+
|
|
36
|
+
Example
|
|
37
|
+
-------
|
|
38
|
+
|
|
39
|
+
To add selection to a grid layout which will contain
|
|
40
|
+
:class:`~kivy.uix.Button` widgets. For each button added to the layout, you
|
|
41
|
+
need to bind the :attr:`~kivy.uix.widget.Widget.on_touch_down` of the button
|
|
42
|
+
to :meth:`select_with_touch` to pass on the touch events::
|
|
43
|
+
|
|
44
|
+
from kivy.uix.behaviors.compoundselection import CompoundSelectionBehavior
|
|
45
|
+
from kivy.uix.button import Button
|
|
46
|
+
from kivy.uix.gridlayout import GridLayout
|
|
47
|
+
from kivy.uix.behaviors import FocusBehavior
|
|
48
|
+
from kivy.core.window import Window
|
|
49
|
+
from kivy.app import App
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class SelectableGrid(FocusBehavior, CompoundSelectionBehavior, GridLayout):
|
|
53
|
+
|
|
54
|
+
def keyboard_on_key_down(self, window, keycode, text, modifiers):
|
|
55
|
+
"""Based on FocusBehavior that provides automatic keyboard
|
|
56
|
+
access, key presses will be used to select children.
|
|
57
|
+
"""
|
|
58
|
+
if super(SelectableGrid, self).keyboard_on_key_down(
|
|
59
|
+
window, keycode, text, modifiers):
|
|
60
|
+
return True
|
|
61
|
+
if self.select_with_key_down(window, keycode, text, modifiers):
|
|
62
|
+
return True
|
|
63
|
+
return False
|
|
64
|
+
|
|
65
|
+
def keyboard_on_key_up(self, window, keycode):
|
|
66
|
+
"""Based on FocusBehavior that provides automatic keyboard
|
|
67
|
+
access, key release will be used to select children.
|
|
68
|
+
"""
|
|
69
|
+
if super(SelectableGrid, self).keyboard_on_key_up(window, keycode):
|
|
70
|
+
return True
|
|
71
|
+
if self.select_with_key_up(window, keycode):
|
|
72
|
+
return True
|
|
73
|
+
return False
|
|
74
|
+
|
|
75
|
+
def add_widget(self, widget, *args, **kwargs):
|
|
76
|
+
""" Override the adding of widgets so we can bind and catch their
|
|
77
|
+
*on_touch_down* events. """
|
|
78
|
+
widget.bind(on_touch_down=self.button_touch_down,
|
|
79
|
+
on_touch_up=self.button_touch_up)
|
|
80
|
+
return super(SelectableGrid, self)\
|
|
81
|
+
.add_widget(widget, *args, **kwargs)
|
|
82
|
+
|
|
83
|
+
def button_touch_down(self, button, touch):
|
|
84
|
+
""" Use collision detection to select buttons when the touch occurs
|
|
85
|
+
within their area. """
|
|
86
|
+
if button.collide_point(*touch.pos):
|
|
87
|
+
self.select_with_touch(button, touch)
|
|
88
|
+
|
|
89
|
+
def button_touch_up(self, button, touch):
|
|
90
|
+
""" Use collision detection to de-select buttons when the touch
|
|
91
|
+
occurs outside their area and *touch_multiselect* is not True. """
|
|
92
|
+
if not (button.collide_point(*touch.pos) or
|
|
93
|
+
self.touch_multiselect):
|
|
94
|
+
self.deselect_node(button)
|
|
95
|
+
|
|
96
|
+
def select_node(self, node):
|
|
97
|
+
node.background_color = (1, 0, 0, 1)
|
|
98
|
+
return super(SelectableGrid, self).select_node(node)
|
|
99
|
+
|
|
100
|
+
def deselect_node(self, node):
|
|
101
|
+
node.background_color = (1, 1, 1, 1)
|
|
102
|
+
super(SelectableGrid, self).deselect_node(node)
|
|
103
|
+
|
|
104
|
+
def on_selected_nodes(self, grid, nodes):
|
|
105
|
+
print("Selected nodes = {0}".format(nodes))
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class TestApp(App):
|
|
109
|
+
def build(self):
|
|
110
|
+
grid = SelectableGrid(cols=3, rows=2, touch_multiselect=True,
|
|
111
|
+
multiselect=True)
|
|
112
|
+
for i in range(0, 6):
|
|
113
|
+
grid.add_widget(Button(text="Button {0}".format(i)))
|
|
114
|
+
return grid
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
TestApp().run()
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
.. warning::
|
|
121
|
+
|
|
122
|
+
This code is still experimental, and its API is subject to change in a
|
|
123
|
+
future version.
|
|
124
|
+
|
|
125
|
+
'''
|
|
126
|
+
|
|
127
|
+
__all__ = ('CompoundSelectionBehavior', )
|
|
128
|
+
|
|
129
|
+
from time import time
|
|
130
|
+
from os import environ
|
|
131
|
+
|
|
132
|
+
from kivy.properties import NumericProperty, BooleanProperty, ListProperty
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
if 'KIVY_DOC' not in environ:
|
|
136
|
+
from kivy.config import Config
|
|
137
|
+
_is_desktop = Config.getboolean('kivy', 'desktop')
|
|
138
|
+
else:
|
|
139
|
+
_is_desktop = False
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class CompoundSelectionBehavior(object):
|
|
143
|
+
'''The Selection behavior `mixin <https://en.wikipedia.org/wiki/Mixin>`_
|
|
144
|
+
implements the logic behind keyboard and touch
|
|
145
|
+
selection of selectable widgets managed by the derived widget. Please see
|
|
146
|
+
the :mod:`compound selection behaviors module
|
|
147
|
+
<kivy.uix.behaviors.compoundselection>` documentation
|
|
148
|
+
for more information.
|
|
149
|
+
|
|
150
|
+
.. versionadded:: 1.9.0
|
|
151
|
+
'''
|
|
152
|
+
|
|
153
|
+
selected_nodes = ListProperty([])
|
|
154
|
+
'''The list of selected nodes.
|
|
155
|
+
|
|
156
|
+
.. note::
|
|
157
|
+
|
|
158
|
+
Multiple nodes can be selected right after one another e.g. using the
|
|
159
|
+
keyboard. When listening to :attr:`selected_nodes`, one should be
|
|
160
|
+
aware of this.
|
|
161
|
+
|
|
162
|
+
:attr:`selected_nodes` is a :class:`~kivy.properties.ListProperty` and
|
|
163
|
+
defaults to the empty list, []. It is read-only and should not be modified.
|
|
164
|
+
'''
|
|
165
|
+
|
|
166
|
+
touch_multiselect = BooleanProperty(False)
|
|
167
|
+
'''A special touch mode which determines whether touch events, as
|
|
168
|
+
processed by :meth:`select_with_touch`, will add the currently touched
|
|
169
|
+
node to the selection, or if it will clear the selection before adding the
|
|
170
|
+
node. This allows the selection of multiple nodes by simply touching them.
|
|
171
|
+
|
|
172
|
+
This is different from :attr:`multiselect` because when it is True,
|
|
173
|
+
simply touching an unselected node will select it, even if ctrl is not
|
|
174
|
+
pressed. If it is False, however, ctrl must be pressed in order to
|
|
175
|
+
add to the selection when :attr:`multiselect` is True.
|
|
176
|
+
|
|
177
|
+
.. note::
|
|
178
|
+
|
|
179
|
+
:attr:`multiselect`, when False, will disable
|
|
180
|
+
:attr:`touch_multiselect`.
|
|
181
|
+
|
|
182
|
+
:attr:`touch_multiselect` is a :class:`~kivy.properties.BooleanProperty`
|
|
183
|
+
and defaults to False.
|
|
184
|
+
'''
|
|
185
|
+
|
|
186
|
+
multiselect = BooleanProperty(False)
|
|
187
|
+
'''Determines whether multiple nodes can be selected. If enabled, keyboard
|
|
188
|
+
shift and ctrl selection, optionally combined with touch, for example, will
|
|
189
|
+
be able to select multiple widgets in the normally expected manner.
|
|
190
|
+
This dominates :attr:`touch_multiselect` when False.
|
|
191
|
+
|
|
192
|
+
:attr:`multiselect` is a :class:`~kivy.properties.BooleanProperty` and
|
|
193
|
+
defaults to False.
|
|
194
|
+
'''
|
|
195
|
+
|
|
196
|
+
touch_deselect_last = BooleanProperty(not _is_desktop)
|
|
197
|
+
'''Determines whether the last selected node can be deselected when
|
|
198
|
+
:attr:`multiselect` or :attr:`touch_multiselect` is False.
|
|
199
|
+
|
|
200
|
+
.. versionadded:: 1.10.0
|
|
201
|
+
|
|
202
|
+
:attr:`touch_deselect_last` is a :class:`~kivy.properties.BooleanProperty`
|
|
203
|
+
and defaults to True on mobile, False on desktop platforms.
|
|
204
|
+
'''
|
|
205
|
+
|
|
206
|
+
keyboard_select = BooleanProperty(True)
|
|
207
|
+
'''Determines whether the keyboard can be used for selection. If False,
|
|
208
|
+
keyboard inputs will be ignored.
|
|
209
|
+
|
|
210
|
+
:attr:`keyboard_select` is a :class:`~kivy.properties.BooleanProperty`
|
|
211
|
+
and defaults to True.
|
|
212
|
+
'''
|
|
213
|
+
|
|
214
|
+
page_count = NumericProperty(10)
|
|
215
|
+
'''Determines by how much the selected node is moved up or down, relative
|
|
216
|
+
to the position of the last selected node, when pageup (or pagedown) is
|
|
217
|
+
pressed.
|
|
218
|
+
|
|
219
|
+
:attr:`page_count` is a :class:`~kivy.properties.NumericProperty` and
|
|
220
|
+
defaults to 10.
|
|
221
|
+
'''
|
|
222
|
+
|
|
223
|
+
up_count = NumericProperty(1)
|
|
224
|
+
'''Determines by how much the selected node is moved up or down, relative
|
|
225
|
+
to the position of the last selected node, when the up (or down) arrow on
|
|
226
|
+
the keyboard is pressed.
|
|
227
|
+
|
|
228
|
+
:attr:`up_count` is a :class:`~kivy.properties.NumericProperty` and
|
|
229
|
+
defaults to 1.
|
|
230
|
+
'''
|
|
231
|
+
|
|
232
|
+
right_count = NumericProperty(1)
|
|
233
|
+
'''Determines by how much the selected node is moved up or down, relative
|
|
234
|
+
to the position of the last selected node, when the right (or left) arrow
|
|
235
|
+
on the keyboard is pressed.
|
|
236
|
+
|
|
237
|
+
:attr:`right_count` is a :class:`~kivy.properties.NumericProperty` and
|
|
238
|
+
defaults to 1.
|
|
239
|
+
'''
|
|
240
|
+
|
|
241
|
+
scroll_count = NumericProperty(0)
|
|
242
|
+
'''Determines by how much the selected node is moved up or down, relative
|
|
243
|
+
to the position of the last selected node, when the mouse scroll wheel is
|
|
244
|
+
scrolled.
|
|
245
|
+
|
|
246
|
+
:attr:`right_count` is a :class:`~kivy.properties.NumericProperty` and
|
|
247
|
+
defaults to 0.
|
|
248
|
+
'''
|
|
249
|
+
|
|
250
|
+
nodes_order_reversed = BooleanProperty(True)
|
|
251
|
+
''' (Internal) Indicates whether the order of the nodes as displayed top-
|
|
252
|
+
down is reversed compared to their order in :meth:`get_selectable_nodes`
|
|
253
|
+
(e.g. how the children property is reversed compared to how
|
|
254
|
+
it's displayed).
|
|
255
|
+
'''
|
|
256
|
+
|
|
257
|
+
text_entry_timeout = NumericProperty(1.)
|
|
258
|
+
'''When typing characters in rapid succession (i.e. the time difference
|
|
259
|
+
since the last character is less than :attr:`text_entry_timeout`), the
|
|
260
|
+
keys get concatenated and the combined text is passed as the key argument
|
|
261
|
+
of :meth:`goto_node`.
|
|
262
|
+
|
|
263
|
+
.. versionadded:: 1.10.0
|
|
264
|
+
'''
|
|
265
|
+
|
|
266
|
+
_anchor = None # the last anchor node selected (e.g. shift relative node)
|
|
267
|
+
# the idx may be out of sync
|
|
268
|
+
_anchor_idx = 0 # cache indexes in case list hasn't changed
|
|
269
|
+
_last_selected_node = None # the absolute last node selected
|
|
270
|
+
_last_node_idx = 0
|
|
271
|
+
_ctrl_down = False # if it's pressed - for e.g. shift selection
|
|
272
|
+
_shift_down = False
|
|
273
|
+
# holds str used to find node, e.g. if word is typed. passed to goto_node
|
|
274
|
+
_word_filter = ''
|
|
275
|
+
_last_key_time = 0 # time since last press, for finding whole strs in node
|
|
276
|
+
_key_list = [] # keys that are already pressed, to not press continuously
|
|
277
|
+
_offset_counts = {} # cache of counts for faster access
|
|
278
|
+
|
|
279
|
+
def __init__(self, **kwargs):
|
|
280
|
+
super(CompoundSelectionBehavior, self).__init__(**kwargs)
|
|
281
|
+
self._key_list = []
|
|
282
|
+
|
|
283
|
+
def ensure_single_select(*l):
|
|
284
|
+
if (not self.multiselect) and len(self.selected_nodes) > 1:
|
|
285
|
+
self.clear_selection()
|
|
286
|
+
update_counts = self._update_counts
|
|
287
|
+
update_counts()
|
|
288
|
+
fbind = self.fbind
|
|
289
|
+
fbind('multiselect', ensure_single_select)
|
|
290
|
+
fbind('page_count', update_counts)
|
|
291
|
+
fbind('up_count', update_counts)
|
|
292
|
+
fbind('right_count', update_counts)
|
|
293
|
+
fbind('scroll_count', update_counts)
|
|
294
|
+
|
|
295
|
+
def select_with_touch(self, node, touch=None):
|
|
296
|
+
'''(internal) Processes a touch on the node. This should be called by
|
|
297
|
+
the derived widget when a node is touched and is to be used for
|
|
298
|
+
selection. Depending on the keyboard keys pressed and the
|
|
299
|
+
configuration, it could select or deslect this and other nodes in the
|
|
300
|
+
selectable nodes list, :meth:`get_selectable_nodes`.
|
|
301
|
+
|
|
302
|
+
:Parameters:
|
|
303
|
+
`node`
|
|
304
|
+
The node that received the touch. Can be None for a scroll
|
|
305
|
+
type touch.
|
|
306
|
+
`touch`
|
|
307
|
+
Optionally, the touch. Defaults to None.
|
|
308
|
+
|
|
309
|
+
:Returns:
|
|
310
|
+
bool, True if the touch was used, False otherwise.
|
|
311
|
+
'''
|
|
312
|
+
multi = self.multiselect
|
|
313
|
+
multiselect = multi and (self._ctrl_down or self.touch_multiselect)
|
|
314
|
+
range_select = multi and self._shift_down
|
|
315
|
+
|
|
316
|
+
if touch and 'button' in touch.profile and touch.button in\
|
|
317
|
+
('scrollup', 'scrolldown', 'scrollleft', 'scrollright'):
|
|
318
|
+
node_src, idx_src = self._resolve_last_node()
|
|
319
|
+
node, idx = self.goto_node(touch.button, node_src, idx_src)
|
|
320
|
+
if node == node_src:
|
|
321
|
+
return False
|
|
322
|
+
if range_select:
|
|
323
|
+
self._select_range(multiselect, True, node, idx)
|
|
324
|
+
else:
|
|
325
|
+
if not multiselect:
|
|
326
|
+
self.clear_selection()
|
|
327
|
+
self.select_node(node)
|
|
328
|
+
return True
|
|
329
|
+
if node is None:
|
|
330
|
+
return False
|
|
331
|
+
|
|
332
|
+
if (node in self.selected_nodes and (not range_select)): # selected
|
|
333
|
+
if multiselect:
|
|
334
|
+
self.deselect_node(node)
|
|
335
|
+
else:
|
|
336
|
+
selected_node_count = len(self.selected_nodes)
|
|
337
|
+
self.clear_selection()
|
|
338
|
+
if not self.touch_deselect_last or selected_node_count > 1:
|
|
339
|
+
self.select_node(node)
|
|
340
|
+
elif range_select:
|
|
341
|
+
# keep anchor only if not multiselect (ctrl-type selection)
|
|
342
|
+
self._select_range(multiselect, not multiselect, node, 0)
|
|
343
|
+
else: # it's not selected at this point
|
|
344
|
+
if not multiselect:
|
|
345
|
+
self.clear_selection()
|
|
346
|
+
self.select_node(node)
|
|
347
|
+
return True
|
|
348
|
+
|
|
349
|
+
def select_with_key_down(self, keyboard, scancode, codepoint, modifiers,
|
|
350
|
+
**kwargs):
|
|
351
|
+
'''Processes a key press. This is called when a key press is to be used
|
|
352
|
+
for selection. Depending on the keyboard keys pressed and the
|
|
353
|
+
configuration, it could select or deselect nodes or node ranges
|
|
354
|
+
from the selectable nodes list, :meth:`get_selectable_nodes`.
|
|
355
|
+
|
|
356
|
+
The parameters are such that it could be bound directly to the
|
|
357
|
+
on_key_down event of a keyboard. Therefore, it is safe to be called
|
|
358
|
+
repeatedly when the key is held down as is done by the keyboard.
|
|
359
|
+
|
|
360
|
+
:Returns:
|
|
361
|
+
bool, True if the keypress was used, False otherwise.
|
|
362
|
+
'''
|
|
363
|
+
if not self.keyboard_select:
|
|
364
|
+
return False
|
|
365
|
+
keys = self._key_list
|
|
366
|
+
multi = self.multiselect
|
|
367
|
+
node_src, idx_src = self._resolve_last_node()
|
|
368
|
+
text = scancode[1]
|
|
369
|
+
|
|
370
|
+
if text == 'shift':
|
|
371
|
+
self._shift_down = True
|
|
372
|
+
elif text in ('ctrl', 'lctrl', 'rctrl'):
|
|
373
|
+
self._ctrl_down = True
|
|
374
|
+
elif (multi and 'ctrl' in modifiers and text in ('a', 'A') and
|
|
375
|
+
text not in keys):
|
|
376
|
+
sister_nodes = self.get_selectable_nodes()
|
|
377
|
+
select = self.select_node
|
|
378
|
+
for node in sister_nodes:
|
|
379
|
+
select(node)
|
|
380
|
+
keys.append(text)
|
|
381
|
+
else:
|
|
382
|
+
s = text
|
|
383
|
+
if len(text) > 1:
|
|
384
|
+
d = {'divide': '/', 'mul': '*', 'substract': '-', 'add': '+',
|
|
385
|
+
'decimal': '.'}
|
|
386
|
+
if text.startswith('numpad'):
|
|
387
|
+
s = text[6:]
|
|
388
|
+
if len(s) > 1:
|
|
389
|
+
if s in d:
|
|
390
|
+
s = d[s]
|
|
391
|
+
else:
|
|
392
|
+
s = None
|
|
393
|
+
else:
|
|
394
|
+
s = None
|
|
395
|
+
|
|
396
|
+
if s is not None:
|
|
397
|
+
if s not in keys: # don't keep adding while holding down
|
|
398
|
+
if time() - self._last_key_time <= self.text_entry_timeout:
|
|
399
|
+
self._word_filter += s
|
|
400
|
+
else:
|
|
401
|
+
self._word_filter = s
|
|
402
|
+
keys.append(s)
|
|
403
|
+
|
|
404
|
+
self._last_key_time = time()
|
|
405
|
+
node, idx = self.goto_node(self._word_filter, node_src,
|
|
406
|
+
idx_src)
|
|
407
|
+
else:
|
|
408
|
+
self._word_filter = ''
|
|
409
|
+
node, idx = self.goto_node(text, node_src, idx_src)
|
|
410
|
+
|
|
411
|
+
if node == node_src:
|
|
412
|
+
return False
|
|
413
|
+
|
|
414
|
+
multiselect = multi and 'ctrl' in modifiers
|
|
415
|
+
if multi and 'shift' in modifiers:
|
|
416
|
+
self._select_range(multiselect, True, node, idx)
|
|
417
|
+
else:
|
|
418
|
+
if not multiselect:
|
|
419
|
+
self.clear_selection()
|
|
420
|
+
self.select_node(node)
|
|
421
|
+
return True
|
|
422
|
+
self._word_filter = ''
|
|
423
|
+
return False
|
|
424
|
+
|
|
425
|
+
def select_with_key_up(self, keyboard, scancode, **kwargs):
|
|
426
|
+
'''(internal) Processes a key release. This must be called by the
|
|
427
|
+
derived widget when a key that :meth:`select_with_key_down` returned
|
|
428
|
+
True is released.
|
|
429
|
+
|
|
430
|
+
The parameters are such that it could be bound directly to the
|
|
431
|
+
on_key_up event of a keyboard.
|
|
432
|
+
|
|
433
|
+
:Returns:
|
|
434
|
+
bool, True if the key release was used, False otherwise.
|
|
435
|
+
'''
|
|
436
|
+
if scancode[1] == 'shift':
|
|
437
|
+
self._shift_down = False
|
|
438
|
+
elif scancode[1] in ('ctrl', 'lctrl', 'rctrl'):
|
|
439
|
+
self._ctrl_down = False
|
|
440
|
+
else:
|
|
441
|
+
try:
|
|
442
|
+
self._key_list.remove(scancode[1])
|
|
443
|
+
return True
|
|
444
|
+
except ValueError:
|
|
445
|
+
return False
|
|
446
|
+
return True
|
|
447
|
+
|
|
448
|
+
def _update_counts(self, *largs):
|
|
449
|
+
# doesn't invert indices here
|
|
450
|
+
pc = self.page_count
|
|
451
|
+
uc = self.up_count
|
|
452
|
+
rc = self.right_count
|
|
453
|
+
sc = self.scroll_count
|
|
454
|
+
self._offset_counts = {'pageup': -pc, 'pagedown': pc, 'up': -uc,
|
|
455
|
+
'down': uc, 'right': rc, 'left': -rc, 'scrollup': sc,
|
|
456
|
+
'scrolldown': -sc, 'scrollright': -sc, 'scrollleft': sc}
|
|
457
|
+
|
|
458
|
+
def _resolve_last_node(self):
|
|
459
|
+
# for offset selection, we have a anchor, and we select everything
|
|
460
|
+
# between anchor and added offset relative to last node
|
|
461
|
+
sister_nodes = self.get_selectable_nodes()
|
|
462
|
+
if not len(sister_nodes):
|
|
463
|
+
return None, 0
|
|
464
|
+
last_node = self._last_selected_node
|
|
465
|
+
last_idx = self._last_node_idx
|
|
466
|
+
end = len(sister_nodes) - 1
|
|
467
|
+
|
|
468
|
+
if last_node is None:
|
|
469
|
+
last_node = self._anchor
|
|
470
|
+
last_idx = self._anchor_idx
|
|
471
|
+
if last_node is None:
|
|
472
|
+
return sister_nodes[end], end
|
|
473
|
+
if last_idx > end or sister_nodes[last_idx] != last_node:
|
|
474
|
+
try:
|
|
475
|
+
return last_node, self.get_index_of_node(last_node,
|
|
476
|
+
sister_nodes)
|
|
477
|
+
except ValueError:
|
|
478
|
+
return sister_nodes[end], end
|
|
479
|
+
return last_node, last_idx
|
|
480
|
+
|
|
481
|
+
def _select_range(self, multiselect, keep_anchor, node, idx):
|
|
482
|
+
'''Selects a range between self._anchor and node or idx.
|
|
483
|
+
If multiselect is True, it will be added to the selection, otherwise
|
|
484
|
+
it will unselect everything before selecting the range. This is only
|
|
485
|
+
called if self.multiselect is True.
|
|
486
|
+
If keep anchor is False, the anchor is moved to node. This should
|
|
487
|
+
always be True for keyboard selection.
|
|
488
|
+
'''
|
|
489
|
+
select = self.select_node
|
|
490
|
+
sister_nodes = self.get_selectable_nodes()
|
|
491
|
+
end = len(sister_nodes) - 1
|
|
492
|
+
last_node = self._anchor
|
|
493
|
+
last_idx = self._anchor_idx
|
|
494
|
+
|
|
495
|
+
if last_node is None:
|
|
496
|
+
last_idx = end
|
|
497
|
+
last_node = sister_nodes[end]
|
|
498
|
+
else:
|
|
499
|
+
if last_idx > end or sister_nodes[last_idx] != last_node:
|
|
500
|
+
try:
|
|
501
|
+
last_idx = self.get_index_of_node(last_node, sister_nodes)
|
|
502
|
+
except ValueError:
|
|
503
|
+
# list changed - cannot do select across them
|
|
504
|
+
return
|
|
505
|
+
if idx > end or sister_nodes[idx] != node:
|
|
506
|
+
try: # just in case
|
|
507
|
+
idx = self.get_index_of_node(node, sister_nodes)
|
|
508
|
+
except ValueError:
|
|
509
|
+
return
|
|
510
|
+
|
|
511
|
+
if last_idx > idx:
|
|
512
|
+
last_idx, idx = idx, last_idx
|
|
513
|
+
if not multiselect:
|
|
514
|
+
self.clear_selection()
|
|
515
|
+
for item in sister_nodes[last_idx:idx + 1]:
|
|
516
|
+
select(item)
|
|
517
|
+
|
|
518
|
+
if keep_anchor:
|
|
519
|
+
self._anchor = last_node
|
|
520
|
+
self._anchor_idx = last_idx
|
|
521
|
+
else:
|
|
522
|
+
self._anchor = node # in case idx was reversed, reset
|
|
523
|
+
self._anchor_idx = idx
|
|
524
|
+
self._last_selected_node = node
|
|
525
|
+
self._last_node_idx = idx
|
|
526
|
+
|
|
527
|
+
def clear_selection(self):
|
|
528
|
+
''' Deselects all the currently selected nodes.
|
|
529
|
+
'''
|
|
530
|
+
# keep the anchor and last selected node
|
|
531
|
+
deselect = self.deselect_node
|
|
532
|
+
nodes = self.selected_nodes
|
|
533
|
+
# empty beforehand so lookup in deselect will be fast
|
|
534
|
+
for node in nodes[:]:
|
|
535
|
+
deselect(node)
|
|
536
|
+
|
|
537
|
+
def get_selectable_nodes(self):
|
|
538
|
+
'''(internal) Returns a list of the nodes that can be selected. It can
|
|
539
|
+
be overwritten by the derived widget to return the correct list.
|
|
540
|
+
|
|
541
|
+
This list is used to determine which nodes to select with group
|
|
542
|
+
selection. E.g. the last element in the list will be selected when
|
|
543
|
+
home is pressed, pagedown will move (or add to, if shift is held) the
|
|
544
|
+
selection from the current position by negative :attr:`page_count`
|
|
545
|
+
nodes starting from the position of the currently selected node in
|
|
546
|
+
this list and so on. Still, nodes can be selected even if they are not
|
|
547
|
+
in this list.
|
|
548
|
+
|
|
549
|
+
.. note::
|
|
550
|
+
|
|
551
|
+
It is safe to dynamically change this list including removing,
|
|
552
|
+
adding, or re-arranging its elements. Nodes can be selected even
|
|
553
|
+
if they are not on this list. And selected nodes removed from the
|
|
554
|
+
list will remain selected until :meth:`deselect_node` is called.
|
|
555
|
+
|
|
556
|
+
.. warning::
|
|
557
|
+
|
|
558
|
+
Layouts display their children in the reverse order. That is, the
|
|
559
|
+
contents of :attr:`~kivy.uix.widget.Widget.children` is displayed
|
|
560
|
+
form right to left, bottom to top. Therefore, internally, the
|
|
561
|
+
indices of the elements returned by this function are reversed to
|
|
562
|
+
make it work by default for most layouts so that the final result
|
|
563
|
+
is consistent e.g. home, although it will select the last element
|
|
564
|
+
in this list visually, will select the first element when
|
|
565
|
+
counting from top to bottom and left to right. If this behavior is
|
|
566
|
+
not desired, a reversed list should be returned instead.
|
|
567
|
+
|
|
568
|
+
Defaults to returning :attr:`~kivy.uix.widget.Widget.children`.
|
|
569
|
+
'''
|
|
570
|
+
return self.children
|
|
571
|
+
|
|
572
|
+
def get_index_of_node(self, node, selectable_nodes):
|
|
573
|
+
'''(internal) Returns the index of the `node` within the
|
|
574
|
+
`selectable_nodes` returned by :meth:`get_selectable_nodes`.
|
|
575
|
+
'''
|
|
576
|
+
return selectable_nodes.index(node)
|
|
577
|
+
|
|
578
|
+
def goto_node(self, key, last_node, last_node_idx):
|
|
579
|
+
'''(internal) Used by the controller to get the node at the position
|
|
580
|
+
indicated by key. The key can be keyboard inputs, e.g. pageup,
|
|
581
|
+
or scroll inputs from the mouse scroll wheel, e.g. scrollup.
|
|
582
|
+
'last_node' is the last node selected and is used to find the resulting
|
|
583
|
+
node. For example, if the key is up, the returned node is one node
|
|
584
|
+
up from the last node.
|
|
585
|
+
|
|
586
|
+
It can be overwritten by the derived widget.
|
|
587
|
+
|
|
588
|
+
:Parameters:
|
|
589
|
+
`key`
|
|
590
|
+
str, the string used to find the desired node. It can be any
|
|
591
|
+
of the keyboard keys, as well as the mouse scrollup,
|
|
592
|
+
scrolldown, scrollright, and scrollleft strings. If letters
|
|
593
|
+
are typed in quick succession, the letters will be combined
|
|
594
|
+
before it's passed in as key and can be used to find nodes that
|
|
595
|
+
have an associated string that starts with those letters.
|
|
596
|
+
`last_node`
|
|
597
|
+
The last node that was selected.
|
|
598
|
+
`last_node_idx`
|
|
599
|
+
The cached index of the last node selected in the
|
|
600
|
+
:meth:`get_selectable_nodes` list. If the list hasn't changed
|
|
601
|
+
it saves having to look up the index of `last_node` in that
|
|
602
|
+
list.
|
|
603
|
+
|
|
604
|
+
:Returns:
|
|
605
|
+
tuple, the node targeted by key and its index in the
|
|
606
|
+
:meth:`get_selectable_nodes` list. Returning
|
|
607
|
+
`(last_node, last_node_idx)` indicates a node wasn't found.
|
|
608
|
+
'''
|
|
609
|
+
sister_nodes = self.get_selectable_nodes()
|
|
610
|
+
end = len(sister_nodes) - 1
|
|
611
|
+
counts = self._offset_counts
|
|
612
|
+
if end == -1:
|
|
613
|
+
return last_node, last_node_idx
|
|
614
|
+
if last_node_idx > end or sister_nodes[last_node_idx] != last_node:
|
|
615
|
+
try: # just in case
|
|
616
|
+
last_node_idx = self.get_index_of_node(last_node, sister_nodes)
|
|
617
|
+
except ValueError:
|
|
618
|
+
return last_node, last_node_idx
|
|
619
|
+
|
|
620
|
+
is_reversed = self.nodes_order_reversed
|
|
621
|
+
if key in counts:
|
|
622
|
+
count = -counts[key] if is_reversed else counts[key]
|
|
623
|
+
idx = max(min(count + last_node_idx, end), 0)
|
|
624
|
+
return sister_nodes[idx], idx
|
|
625
|
+
elif key == 'home':
|
|
626
|
+
if is_reversed:
|
|
627
|
+
return sister_nodes[end], end
|
|
628
|
+
return sister_nodes[0], 0
|
|
629
|
+
elif key == 'end':
|
|
630
|
+
if is_reversed:
|
|
631
|
+
return sister_nodes[0], 0
|
|
632
|
+
return sister_nodes[end], end
|
|
633
|
+
else:
|
|
634
|
+
return last_node, last_node_idx
|
|
635
|
+
|
|
636
|
+
def select_node(self, node):
|
|
637
|
+
''' Selects a node.
|
|
638
|
+
|
|
639
|
+
It is called by the controller when it selects a node and can be
|
|
640
|
+
called from the outside to select a node directly. The derived widget
|
|
641
|
+
should overwrite this method and change the node state to selected
|
|
642
|
+
when called.
|
|
643
|
+
|
|
644
|
+
:Parameters:
|
|
645
|
+
`node`
|
|
646
|
+
The node to be selected.
|
|
647
|
+
|
|
648
|
+
:Returns:
|
|
649
|
+
bool, True if the node was selected, False otherwise.
|
|
650
|
+
|
|
651
|
+
.. warning::
|
|
652
|
+
|
|
653
|
+
This method must be called by the derived widget using super if it
|
|
654
|
+
is overwritten.
|
|
655
|
+
'''
|
|
656
|
+
nodes = self.selected_nodes
|
|
657
|
+
if node in nodes:
|
|
658
|
+
return False
|
|
659
|
+
|
|
660
|
+
if (not self.multiselect) and len(nodes):
|
|
661
|
+
self.clear_selection()
|
|
662
|
+
if node not in nodes:
|
|
663
|
+
nodes.append(node)
|
|
664
|
+
self._anchor = node
|
|
665
|
+
self._last_selected_node = node
|
|
666
|
+
return True
|
|
667
|
+
|
|
668
|
+
def deselect_node(self, node):
|
|
669
|
+
''' Deselects a possibly selected node.
|
|
670
|
+
|
|
671
|
+
It is called by the controller when it deselects a node and can also
|
|
672
|
+
be called from the outside to deselect a node directly. The derived
|
|
673
|
+
widget should overwrite this method and change the node to its
|
|
674
|
+
unselected state when this is called
|
|
675
|
+
|
|
676
|
+
:Parameters:
|
|
677
|
+
`node`
|
|
678
|
+
The node to be deselected.
|
|
679
|
+
|
|
680
|
+
.. warning::
|
|
681
|
+
|
|
682
|
+
This method must be called by the derived widget using super if it
|
|
683
|
+
is overwritten.
|
|
684
|
+
'''
|
|
685
|
+
if node in self.selected_nodes:
|
|
686
|
+
self.selected_nodes.remove(node)
|
|
687
|
+
return True
|
|
688
|
+
return False
|