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,624 @@
|
|
|
1
|
+
"""
|
|
2
|
+
RecycleView
|
|
3
|
+
===========
|
|
4
|
+
|
|
5
|
+
.. versionadded:: 1.10.0
|
|
6
|
+
|
|
7
|
+
The RecycleView provides a flexible model for viewing selected sections of
|
|
8
|
+
large data sets. It aims to prevent the performance degradation that can occur
|
|
9
|
+
when generating large numbers of widgets in order to display many data items.
|
|
10
|
+
|
|
11
|
+
.. warning::
|
|
12
|
+
|
|
13
|
+
Because :class:`RecycleView` reuses widgets, any state change to a single
|
|
14
|
+
widget will stay with that widget as it's reused, even if the
|
|
15
|
+
:attr:`~RecycleView.data` assigned to it by the :class:`RecycleView`
|
|
16
|
+
changes, unless the complete state is tracked in :attr:`~RecycleView.data`
|
|
17
|
+
(see below).
|
|
18
|
+
|
|
19
|
+
The view is generated by processing the :attr:`~RecycleView.data`, essentially
|
|
20
|
+
a list of dicts, and uses these dicts to generate instances of the
|
|
21
|
+
:attr:`~RecycleView.viewclass` as required. Its design is based on the
|
|
22
|
+
MVC (`Model-View-Controller
|
|
23
|
+
<https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller>`_)
|
|
24
|
+
pattern.
|
|
25
|
+
|
|
26
|
+
* Model: The model is formed by :attr:`~RecycleView.data` you pass in via a
|
|
27
|
+
list of dicts.
|
|
28
|
+
* View: The View is split across layout and views and implemented using
|
|
29
|
+
adapters.
|
|
30
|
+
* Controller: The controller determines the logical interaction and is
|
|
31
|
+
implemented by :class:`RecycleViewBehavior`.
|
|
32
|
+
|
|
33
|
+
These are abstract classes and cannot be used directly. The default concrete
|
|
34
|
+
implementations are the
|
|
35
|
+
:class:`~kivy.uix.recycleview.datamodel.RecycleDataModel` for the model, the
|
|
36
|
+
:class:`~kivy.uix.recyclelayout.RecycleLayout` for the view, and the
|
|
37
|
+
:class:`RecycleView` for the controller.
|
|
38
|
+
|
|
39
|
+
When a RecycleView is instantiated, it automatically creates the views and data
|
|
40
|
+
classes. However, one must manually create the layout classes and add them to
|
|
41
|
+
the RecycleView.
|
|
42
|
+
|
|
43
|
+
A layout manager is automatically created as a
|
|
44
|
+
:attr:`~RecycleViewBehavior.layout_manager` when added as the child of the
|
|
45
|
+
RecycleView. Similarly when removed. A requirement is that the layout manager
|
|
46
|
+
must be contained as a child somewhere within the RecycleView's widget tree so
|
|
47
|
+
the view port can be found.
|
|
48
|
+
|
|
49
|
+
A minimal example might look something like this::
|
|
50
|
+
|
|
51
|
+
from kivy.app import App
|
|
52
|
+
from kivy.lang import Builder
|
|
53
|
+
from kivy.uix.recycleview import RecycleView
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
Builder.load_string('''
|
|
57
|
+
<RV>:
|
|
58
|
+
viewclass: 'Label'
|
|
59
|
+
RecycleBoxLayout:
|
|
60
|
+
default_size: None, dp(56)
|
|
61
|
+
default_size_hint: 1, None
|
|
62
|
+
size_hint_y: None
|
|
63
|
+
height: self.minimum_height
|
|
64
|
+
orientation: 'vertical'
|
|
65
|
+
''')
|
|
66
|
+
|
|
67
|
+
class RV(RecycleView):
|
|
68
|
+
def __init__(self, **kwargs):
|
|
69
|
+
super(RV, self).__init__(**kwargs)
|
|
70
|
+
self.data = [{'text': str(x)} for x in range(100)]
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class TestApp(App):
|
|
74
|
+
def build(self):
|
|
75
|
+
return RV()
|
|
76
|
+
|
|
77
|
+
if __name__ == '__main__':
|
|
78
|
+
TestApp().run()
|
|
79
|
+
|
|
80
|
+
In order to support selection in the view, you can add the required behaviors
|
|
81
|
+
as follows::
|
|
82
|
+
|
|
83
|
+
from kivy.app import App
|
|
84
|
+
from kivy.lang import Builder
|
|
85
|
+
from kivy.uix.recycleview import RecycleView
|
|
86
|
+
from kivy.uix.recycleview.views import RecycleDataViewBehavior
|
|
87
|
+
from kivy.uix.label import Label
|
|
88
|
+
from kivy.properties import BooleanProperty
|
|
89
|
+
from kivy.uix.recycleboxlayout import RecycleBoxLayout
|
|
90
|
+
from kivy.uix.behaviors import FocusBehavior
|
|
91
|
+
from kivy.uix.recycleview.layout import LayoutSelectionBehavior
|
|
92
|
+
|
|
93
|
+
Builder.load_string('''
|
|
94
|
+
<SelectableLabel>:
|
|
95
|
+
# Draw a background to indicate selection
|
|
96
|
+
canvas.before:
|
|
97
|
+
Color:
|
|
98
|
+
rgba: (.0, 0.9, .1, .3) if self.selected else (0, 0, 0, 1)
|
|
99
|
+
Rectangle:
|
|
100
|
+
pos: self.pos
|
|
101
|
+
size: self.size
|
|
102
|
+
<RV>:
|
|
103
|
+
viewclass: 'SelectableLabel'
|
|
104
|
+
SelectableRecycleBoxLayout:
|
|
105
|
+
default_size: None, dp(56)
|
|
106
|
+
default_size_hint: 1, None
|
|
107
|
+
size_hint_y: None
|
|
108
|
+
height: self.minimum_height
|
|
109
|
+
orientation: 'vertical'
|
|
110
|
+
multiselect: True
|
|
111
|
+
touch_multiselect: True
|
|
112
|
+
''')
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior,
|
|
116
|
+
RecycleBoxLayout):
|
|
117
|
+
''' Adds selection and focus behavior to the view. '''
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class SelectableLabel(RecycleDataViewBehavior, Label):
|
|
121
|
+
''' Add selection support to the Label '''
|
|
122
|
+
index = None
|
|
123
|
+
selected = BooleanProperty(False)
|
|
124
|
+
selectable = BooleanProperty(True)
|
|
125
|
+
|
|
126
|
+
def refresh_view_attrs(self, rv, index, data):
|
|
127
|
+
''' Catch and handle the view changes '''
|
|
128
|
+
self.index = index
|
|
129
|
+
return super(SelectableLabel, self).refresh_view_attrs(
|
|
130
|
+
rv, index, data)
|
|
131
|
+
|
|
132
|
+
def on_touch_down(self, touch):
|
|
133
|
+
''' Add selection on touch down '''
|
|
134
|
+
if super(SelectableLabel, self).on_touch_down(touch):
|
|
135
|
+
return True
|
|
136
|
+
if self.collide_point(*touch.pos) and self.selectable:
|
|
137
|
+
return self.parent.select_with_touch(self.index, touch)
|
|
138
|
+
|
|
139
|
+
def apply_selection(self, rv, index, is_selected):
|
|
140
|
+
''' Respond to the selection of items in the view. '''
|
|
141
|
+
self.selected = is_selected
|
|
142
|
+
if is_selected:
|
|
143
|
+
print("selection changed to {0}".format(rv.data[index]))
|
|
144
|
+
else:
|
|
145
|
+
print("selection removed for {0}".format(rv.data[index]))
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
class RV(RecycleView):
|
|
149
|
+
def __init__(self, **kwargs):
|
|
150
|
+
super(RV, self).__init__(**kwargs)
|
|
151
|
+
self.data = [{'text': str(x)} for x in range(100)]
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
class TestApp(App):
|
|
155
|
+
def build(self):
|
|
156
|
+
return RV()
|
|
157
|
+
|
|
158
|
+
if __name__ == '__main__':
|
|
159
|
+
TestApp().run()
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
Please see the `examples/widgets/recycleview/basic_data.py` file for a more
|
|
164
|
+
complete example.
|
|
165
|
+
|
|
166
|
+
Viewclass State
|
|
167
|
+
^^^^^^^^^^^^^^^
|
|
168
|
+
|
|
169
|
+
Because the viewclass widgets are reused or instantiated as needed by the
|
|
170
|
+
:class:`RecycleView`, the order and content of the widgets are mutable. So any
|
|
171
|
+
state change to a single widget will stay with that widget, even when the data
|
|
172
|
+
assigned to it from the :attr:`~RecycleView.data` dict changes, unless
|
|
173
|
+
:attr:`~RecycleView.data` tracks those changes or they are manually refreshed
|
|
174
|
+
when re-used.
|
|
175
|
+
|
|
176
|
+
There are two methods for managing state changes in viewclass widgets:
|
|
177
|
+
|
|
178
|
+
1. Store state in the RecycleView.data Model
|
|
179
|
+
2. Generate state changes on-the-fly by catching :attr:`~RecycleView.data`
|
|
180
|
+
updates and manually refreshing.
|
|
181
|
+
|
|
182
|
+
An example::
|
|
183
|
+
|
|
184
|
+
from kivy.app import App
|
|
185
|
+
from kivy.lang import Builder
|
|
186
|
+
from kivy.uix.boxlayout import BoxLayout
|
|
187
|
+
from kivy.uix.recycleview import RecycleView
|
|
188
|
+
from kivy.uix.recycleview.views import RecycleDataViewBehavior
|
|
189
|
+
from kivy.properties import BooleanProperty, StringProperty
|
|
190
|
+
|
|
191
|
+
Builder.load_string('''
|
|
192
|
+
<StatefulLabel>:
|
|
193
|
+
active: stored_state.active
|
|
194
|
+
CheckBox:
|
|
195
|
+
id: stored_state
|
|
196
|
+
active: root.active
|
|
197
|
+
on_release: root.store_checkbox_state()
|
|
198
|
+
Label:
|
|
199
|
+
text: root.text
|
|
200
|
+
Label:
|
|
201
|
+
id: generate_state
|
|
202
|
+
text: root.generated_state_text
|
|
203
|
+
|
|
204
|
+
<RV>:
|
|
205
|
+
viewclass: 'StatefulLabel'
|
|
206
|
+
RecycleBoxLayout:
|
|
207
|
+
size_hint_y: None
|
|
208
|
+
height: self.minimum_height
|
|
209
|
+
orientation: 'vertical'
|
|
210
|
+
''')
|
|
211
|
+
|
|
212
|
+
class StatefulLabel(RecycleDataViewBehavior, BoxLayout):
|
|
213
|
+
text = StringProperty()
|
|
214
|
+
generated_state_text = StringProperty()
|
|
215
|
+
active = BooleanProperty()
|
|
216
|
+
index = 0
|
|
217
|
+
|
|
218
|
+
'''
|
|
219
|
+
To change a viewclass' state as the data assigned to it changes,
|
|
220
|
+
overload the refresh_view_attrs function (inherited from
|
|
221
|
+
RecycleDataViewBehavior)
|
|
222
|
+
'''
|
|
223
|
+
def refresh_view_attrs(self, rv, index, data):
|
|
224
|
+
self.index = index
|
|
225
|
+
if data['text'] == '0':
|
|
226
|
+
self.generated_state_text = "is zero"
|
|
227
|
+
elif int(data['text']) % 2 == 1:
|
|
228
|
+
self.generated_state_text = "is odd"
|
|
229
|
+
else:
|
|
230
|
+
self.generated_state_text = "is even"
|
|
231
|
+
super(StatefulLabel, self).refresh_view_attrs(rv, index, data)
|
|
232
|
+
|
|
233
|
+
'''
|
|
234
|
+
To keep state changes in the viewclass with associated data,
|
|
235
|
+
they can be explicitly stored in the RecycleView's data object
|
|
236
|
+
'''
|
|
237
|
+
def store_checkbox_state(self):
|
|
238
|
+
rv = App.get_running_app().rv
|
|
239
|
+
rv.data[self.index]['active'] = self.active
|
|
240
|
+
|
|
241
|
+
class RV(RecycleView, App):
|
|
242
|
+
def __init__(self, **kwargs):
|
|
243
|
+
super(RV, self).__init__(**kwargs)
|
|
244
|
+
self.data = [{'text': str(x), 'active': False} for x in range(10)]
|
|
245
|
+
App.get_running_app().rv = self
|
|
246
|
+
|
|
247
|
+
def build(self):
|
|
248
|
+
return self
|
|
249
|
+
|
|
250
|
+
if __name__ == '__main__':
|
|
251
|
+
RV().run()
|
|
252
|
+
|
|
253
|
+
TODO:
|
|
254
|
+
- Method to clear cached class instances.
|
|
255
|
+
- Test when views cannot be found (e.g. viewclass is None).
|
|
256
|
+
- Fix selection goto.
|
|
257
|
+
|
|
258
|
+
.. warning::
|
|
259
|
+
When views are re-used they may not trigger if the data remains the same.
|
|
260
|
+
"""
|
|
261
|
+
|
|
262
|
+
__all__ = ('RecycleViewBehavior', 'RecycleView')
|
|
263
|
+
|
|
264
|
+
from copy import deepcopy
|
|
265
|
+
|
|
266
|
+
from kivy.uix.scrollview import ScrollView
|
|
267
|
+
from kivy.properties import AliasProperty
|
|
268
|
+
from kivy.clock import Clock
|
|
269
|
+
|
|
270
|
+
from kivy.uix.recycleview.layout import RecycleLayoutManagerBehavior, \
|
|
271
|
+
LayoutChangeException
|
|
272
|
+
from kivy.uix.recycleview.views import RecycleDataAdapter
|
|
273
|
+
from kivy.uix.recycleview.datamodel import RecycleDataModelBehavior, \
|
|
274
|
+
RecycleDataModel
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
class RecycleViewBehavior(object):
|
|
278
|
+
"""RecycleViewBehavior provides a behavioral model upon which the
|
|
279
|
+
:class:`RecycleView` is built. Together, they offer an extensible and
|
|
280
|
+
flexible way to produce views with limited windows over large data sets.
|
|
281
|
+
|
|
282
|
+
See the module documentation for more information.
|
|
283
|
+
"""
|
|
284
|
+
|
|
285
|
+
# internals
|
|
286
|
+
_view_adapter = None
|
|
287
|
+
_data_model = None
|
|
288
|
+
_layout_manager = None
|
|
289
|
+
|
|
290
|
+
_refresh_flags = {'data': [], 'layout': [], 'viewport': False}
|
|
291
|
+
_refresh_trigger = None
|
|
292
|
+
|
|
293
|
+
def __init__(self, **kwargs):
|
|
294
|
+
self._refresh_trigger = Clock.create_trigger(self.refresh_views, -1)
|
|
295
|
+
self._refresh_flags = deepcopy(self._refresh_flags)
|
|
296
|
+
super(RecycleViewBehavior, self).__init__(**kwargs)
|
|
297
|
+
|
|
298
|
+
def get_viewport(self):
|
|
299
|
+
pass
|
|
300
|
+
|
|
301
|
+
def save_viewport(self):
|
|
302
|
+
pass
|
|
303
|
+
|
|
304
|
+
def restore_viewport(self):
|
|
305
|
+
pass
|
|
306
|
+
|
|
307
|
+
def refresh_views(self, *largs):
|
|
308
|
+
lm = self.layout_manager
|
|
309
|
+
flags = self._refresh_flags
|
|
310
|
+
if lm is None or self.view_adapter is None or self.data_model is None:
|
|
311
|
+
return
|
|
312
|
+
|
|
313
|
+
data = self.data
|
|
314
|
+
f = flags['data']
|
|
315
|
+
if f:
|
|
316
|
+
self.save_viewport()
|
|
317
|
+
# lm.clear_layout()
|
|
318
|
+
flags['data'] = []
|
|
319
|
+
flags['layout'] = [{}]
|
|
320
|
+
lm.compute_sizes_from_data(data, f)
|
|
321
|
+
|
|
322
|
+
while flags['layout']:
|
|
323
|
+
# if `data` we were re-triggered so finish in the next call.
|
|
324
|
+
# Otherwise go until fully laid out.
|
|
325
|
+
self.save_viewport()
|
|
326
|
+
if flags['data']:
|
|
327
|
+
return
|
|
328
|
+
flags['viewport'] = True
|
|
329
|
+
f = flags['layout']
|
|
330
|
+
flags['layout'] = []
|
|
331
|
+
|
|
332
|
+
try:
|
|
333
|
+
lm.compute_layout(data, f)
|
|
334
|
+
except LayoutChangeException:
|
|
335
|
+
flags['layout'].append({})
|
|
336
|
+
continue
|
|
337
|
+
|
|
338
|
+
if flags['data']: # in case that happened meanwhile
|
|
339
|
+
return
|
|
340
|
+
|
|
341
|
+
# make sure if we were re-triggered in the loop that we won't be
|
|
342
|
+
# called needlessly later.
|
|
343
|
+
self._refresh_trigger.cancel()
|
|
344
|
+
|
|
345
|
+
self.restore_viewport()
|
|
346
|
+
|
|
347
|
+
if flags['viewport']:
|
|
348
|
+
# TODO: make this also listen to LayoutChangeException
|
|
349
|
+
flags['viewport'] = False
|
|
350
|
+
viewport = self.get_viewport()
|
|
351
|
+
indices = lm.compute_visible_views(data, viewport)
|
|
352
|
+
lm.set_visible_views(indices, data, viewport)
|
|
353
|
+
|
|
354
|
+
def refresh_from_data(self, *largs, **kwargs):
|
|
355
|
+
"""
|
|
356
|
+
This should be called when data changes. Data changes typically
|
|
357
|
+
indicate that everything should be recomputed since the source data
|
|
358
|
+
changed.
|
|
359
|
+
|
|
360
|
+
This method is automatically bound to the
|
|
361
|
+
:attr:`~RecycleDataModelBehavior.on_data_changed` method of the
|
|
362
|
+
:class:`~RecycleDataModelBehavior` class and
|
|
363
|
+
therefore responds to and accepts the keyword arguments of that event.
|
|
364
|
+
|
|
365
|
+
It can be called manually to trigger an update.
|
|
366
|
+
"""
|
|
367
|
+
self._refresh_flags['data'].append(kwargs)
|
|
368
|
+
self._refresh_trigger()
|
|
369
|
+
|
|
370
|
+
def refresh_from_layout(self, *largs, **kwargs):
|
|
371
|
+
"""
|
|
372
|
+
This should be called when the layout changes or needs to change. It is
|
|
373
|
+
typically called when a layout parameter has changed and therefore the
|
|
374
|
+
layout needs to be recomputed.
|
|
375
|
+
"""
|
|
376
|
+
self._refresh_flags['layout'].append(kwargs)
|
|
377
|
+
self._refresh_trigger()
|
|
378
|
+
|
|
379
|
+
def refresh_from_viewport(self, *largs):
|
|
380
|
+
"""
|
|
381
|
+
This should be called when the viewport changes and the displayed data
|
|
382
|
+
must be updated. Neither the data nor the layout will be recomputed.
|
|
383
|
+
"""
|
|
384
|
+
self._refresh_flags['viewport'] = True
|
|
385
|
+
self._refresh_trigger()
|
|
386
|
+
|
|
387
|
+
def _dispatch_prop_on_source(self, prop_name, *largs):
|
|
388
|
+
# Dispatches the prop of this class when the
|
|
389
|
+
# view_adapter/layout_manager property changes.
|
|
390
|
+
getattr(self.__class__, prop_name).dispatch(self)
|
|
391
|
+
|
|
392
|
+
def _get_data_model(self):
|
|
393
|
+
return self._data_model
|
|
394
|
+
|
|
395
|
+
def _set_data_model(self, value):
|
|
396
|
+
data_model = self._data_model
|
|
397
|
+
if value is data_model:
|
|
398
|
+
return
|
|
399
|
+
if data_model is not None:
|
|
400
|
+
self._data_model = None
|
|
401
|
+
data_model.detach_recycleview()
|
|
402
|
+
|
|
403
|
+
if value is None:
|
|
404
|
+
return True
|
|
405
|
+
|
|
406
|
+
if not isinstance(value, RecycleDataModelBehavior):
|
|
407
|
+
raise ValueError(
|
|
408
|
+
'Expected object based on RecycleDataModelBehavior, got {}'.
|
|
409
|
+
format(value.__class__))
|
|
410
|
+
|
|
411
|
+
self._data_model = value
|
|
412
|
+
value.attach_recycleview(self)
|
|
413
|
+
self.refresh_from_data()
|
|
414
|
+
return True
|
|
415
|
+
|
|
416
|
+
data_model = AliasProperty(_get_data_model, _set_data_model)
|
|
417
|
+
"""
|
|
418
|
+
The Data model responsible for maintaining the data set.
|
|
419
|
+
|
|
420
|
+
data_model is an :class:`~kivy.properties.AliasProperty` that gets and sets
|
|
421
|
+
the current data model.
|
|
422
|
+
"""
|
|
423
|
+
|
|
424
|
+
def _get_view_adapter(self):
|
|
425
|
+
return self._view_adapter
|
|
426
|
+
|
|
427
|
+
def _set_view_adapter(self, value):
|
|
428
|
+
view_adapter = self._view_adapter
|
|
429
|
+
if value is view_adapter:
|
|
430
|
+
return
|
|
431
|
+
if view_adapter is not None:
|
|
432
|
+
self._view_adapter = None
|
|
433
|
+
view_adapter.detach_recycleview()
|
|
434
|
+
|
|
435
|
+
if value is None:
|
|
436
|
+
return True
|
|
437
|
+
|
|
438
|
+
if not isinstance(value, RecycleDataAdapter):
|
|
439
|
+
raise ValueError(
|
|
440
|
+
'Expected object based on RecycleAdapter, got {}'.
|
|
441
|
+
format(value.__class__))
|
|
442
|
+
|
|
443
|
+
self._view_adapter = value
|
|
444
|
+
value.attach_recycleview(self)
|
|
445
|
+
self.refresh_from_layout()
|
|
446
|
+
return True
|
|
447
|
+
|
|
448
|
+
view_adapter = AliasProperty(_get_view_adapter, _set_view_adapter)
|
|
449
|
+
"""
|
|
450
|
+
The adapter responsible for providing views that represent items in a data
|
|
451
|
+
set.
|
|
452
|
+
|
|
453
|
+
view_adapter is an :class:`~kivy.properties.AliasProperty` that gets and
|
|
454
|
+
sets the current view adapter.
|
|
455
|
+
"""
|
|
456
|
+
|
|
457
|
+
def _get_layout_manager(self):
|
|
458
|
+
return self._layout_manager
|
|
459
|
+
|
|
460
|
+
def _set_layout_manager(self, value):
|
|
461
|
+
lm = self._layout_manager
|
|
462
|
+
if value is lm:
|
|
463
|
+
return
|
|
464
|
+
|
|
465
|
+
if lm is not None:
|
|
466
|
+
self._layout_manager = None
|
|
467
|
+
lm.detach_recycleview()
|
|
468
|
+
|
|
469
|
+
if value is None:
|
|
470
|
+
return True
|
|
471
|
+
|
|
472
|
+
if not isinstance(value, RecycleLayoutManagerBehavior):
|
|
473
|
+
raise ValueError(
|
|
474
|
+
'Expected object based on RecycleLayoutManagerBehavior, '
|
|
475
|
+
'got {}'.format(value.__class__))
|
|
476
|
+
|
|
477
|
+
self._layout_manager = value
|
|
478
|
+
value.attach_recycleview(self)
|
|
479
|
+
self.refresh_from_layout()
|
|
480
|
+
return True
|
|
481
|
+
|
|
482
|
+
layout_manager = AliasProperty(_get_layout_manager, _set_layout_manager)
|
|
483
|
+
"""
|
|
484
|
+
The Layout manager responsible for positioning views within the
|
|
485
|
+
:class:`RecycleView`.
|
|
486
|
+
|
|
487
|
+
layout_manager is an :class:`~kivy.properties.AliasProperty` that gets
|
|
488
|
+
and sets the layout_manger.
|
|
489
|
+
"""
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
class RecycleView(RecycleViewBehavior, ScrollView):
|
|
493
|
+
"""
|
|
494
|
+
RecycleView is a flexible view for providing a limited window
|
|
495
|
+
into a large data set.
|
|
496
|
+
|
|
497
|
+
See the module documentation for more information.
|
|
498
|
+
"""
|
|
499
|
+
def __init__(self, **kwargs):
|
|
500
|
+
if self.data_model is None:
|
|
501
|
+
kwargs.setdefault('data_model', RecycleDataModel())
|
|
502
|
+
if self.view_adapter is None:
|
|
503
|
+
kwargs.setdefault('view_adapter', RecycleDataAdapter())
|
|
504
|
+
super(RecycleView, self).__init__(**kwargs)
|
|
505
|
+
|
|
506
|
+
fbind = self.fbind
|
|
507
|
+
fbind('scroll_x', self.refresh_from_viewport)
|
|
508
|
+
fbind('scroll_y', self.refresh_from_viewport)
|
|
509
|
+
fbind('size', self.refresh_from_viewport)
|
|
510
|
+
self.refresh_from_data()
|
|
511
|
+
|
|
512
|
+
def _convert_sv_to_lm(self, x, y):
|
|
513
|
+
lm = self.layout_manager
|
|
514
|
+
tree = [lm]
|
|
515
|
+
parent = lm.parent
|
|
516
|
+
while parent is not None and parent is not self:
|
|
517
|
+
tree.append(parent)
|
|
518
|
+
parent = parent.parent
|
|
519
|
+
|
|
520
|
+
if parent is not self:
|
|
521
|
+
raise Exception(
|
|
522
|
+
'The layout manager must be a sub child of the recycleview. '
|
|
523
|
+
'Could not find {} in the parent tree of {}'.format(self, lm))
|
|
524
|
+
|
|
525
|
+
for widget in reversed(tree):
|
|
526
|
+
x, y = widget.to_local(x, y)
|
|
527
|
+
|
|
528
|
+
return x, y
|
|
529
|
+
|
|
530
|
+
def get_viewport(self):
|
|
531
|
+
lm = self.layout_manager
|
|
532
|
+
lm_w, lm_h = lm.size
|
|
533
|
+
w, h = self.size
|
|
534
|
+
scroll_y = min(1, max(self.scroll_y, 0))
|
|
535
|
+
scroll_x = min(1, max(self.scroll_x, 0))
|
|
536
|
+
|
|
537
|
+
if lm_h <= h:
|
|
538
|
+
bottom = 0
|
|
539
|
+
else:
|
|
540
|
+
above = (lm_h - h) * scroll_y
|
|
541
|
+
bottom = max(0, lm_h - above - h)
|
|
542
|
+
|
|
543
|
+
bottom = max(0, (lm_h - h) * scroll_y)
|
|
544
|
+
left = max(0, (lm_w - w) * scroll_x)
|
|
545
|
+
width = min(w, lm_w)
|
|
546
|
+
height = min(h, lm_h)
|
|
547
|
+
|
|
548
|
+
# now convert the sv coordinates into the coordinates of the lm. In
|
|
549
|
+
# case there's a relative layout type widget in the parent tree
|
|
550
|
+
# between the sv and the lm.
|
|
551
|
+
left, bottom = self._convert_sv_to_lm(left, bottom)
|
|
552
|
+
return left, bottom, width, height
|
|
553
|
+
|
|
554
|
+
def save_viewport(self):
|
|
555
|
+
pass
|
|
556
|
+
|
|
557
|
+
def restore_viewport(self):
|
|
558
|
+
pass
|
|
559
|
+
|
|
560
|
+
def add_widget(self, widget, *args, **kwargs):
|
|
561
|
+
super(RecycleView, self).add_widget(widget, *args, **kwargs)
|
|
562
|
+
if (isinstance(widget, RecycleLayoutManagerBehavior) and
|
|
563
|
+
not self.layout_manager):
|
|
564
|
+
self.layout_manager = widget
|
|
565
|
+
|
|
566
|
+
def remove_widget(self, widget, *args, **kwargs):
|
|
567
|
+
super(RecycleView, self).remove_widget(widget, *args, **kwargs)
|
|
568
|
+
if self.layout_manager == widget:
|
|
569
|
+
self.layout_manager = None
|
|
570
|
+
|
|
571
|
+
# or easier way to use
|
|
572
|
+
def _get_data(self):
|
|
573
|
+
d = self.data_model
|
|
574
|
+
return d and d.data
|
|
575
|
+
|
|
576
|
+
def _set_data(self, value):
|
|
577
|
+
d = self.data_model
|
|
578
|
+
if d is not None:
|
|
579
|
+
d.data = value
|
|
580
|
+
|
|
581
|
+
data = AliasProperty(_get_data, _set_data, bind=["data_model"])
|
|
582
|
+
"""
|
|
583
|
+
The data used by the current view adapter. This is a list of dicts whose
|
|
584
|
+
keys map to the corresponding property names of the
|
|
585
|
+
:attr:`~RecycleView.viewclass`.
|
|
586
|
+
|
|
587
|
+
data is an :class:`~kivy.properties.AliasProperty` that gets and sets the
|
|
588
|
+
data used to generate the views.
|
|
589
|
+
"""
|
|
590
|
+
|
|
591
|
+
def _get_viewclass(self):
|
|
592
|
+
a = self.layout_manager
|
|
593
|
+
return a and a.viewclass
|
|
594
|
+
|
|
595
|
+
def _set_viewclass(self, value):
|
|
596
|
+
a = self.layout_manager
|
|
597
|
+
if a:
|
|
598
|
+
a.viewclass = value
|
|
599
|
+
|
|
600
|
+
viewclass = AliasProperty(_get_viewclass, _set_viewclass,
|
|
601
|
+
bind=["layout_manager"])
|
|
602
|
+
"""
|
|
603
|
+
The viewclass used by the current layout_manager.
|
|
604
|
+
|
|
605
|
+
viewclass is an :class:`~kivy.properties.AliasProperty` that gets and sets
|
|
606
|
+
the class used to generate the individual items presented in the view.
|
|
607
|
+
"""
|
|
608
|
+
|
|
609
|
+
def _get_key_viewclass(self):
|
|
610
|
+
a = self.layout_manager
|
|
611
|
+
return a and a.key_viewclass
|
|
612
|
+
|
|
613
|
+
def _set_key_viewclass(self, value):
|
|
614
|
+
a = self.layout_manager
|
|
615
|
+
if a:
|
|
616
|
+
a.key_viewclass = value
|
|
617
|
+
|
|
618
|
+
key_viewclass = AliasProperty(_get_key_viewclass, _set_key_viewclass,
|
|
619
|
+
bind=["layout_manager"])
|
|
620
|
+
"""
|
|
621
|
+
key_viewclass is an :class:`~kivy.properties.AliasProperty` that gets and
|
|
622
|
+
sets the key viewclass for the current
|
|
623
|
+
:attr:`~kivy.uix.recycleview.layout_manager`.
|
|
624
|
+
"""
|