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
kivy/uix/tabbedpanel.py
ADDED
|
@@ -0,0 +1,880 @@
|
|
|
1
|
+
'''
|
|
2
|
+
TabbedPanel
|
|
3
|
+
===========
|
|
4
|
+
|
|
5
|
+
.. image:: images/tabbed_panel.jpg
|
|
6
|
+
:align: right
|
|
7
|
+
|
|
8
|
+
.. versionadded:: 1.3.0
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
The `TabbedPanel` widget manages different widgets in tabs, with a header area
|
|
12
|
+
for the actual tab buttons and a content area for showing the current tab
|
|
13
|
+
content.
|
|
14
|
+
|
|
15
|
+
The :class:`TabbedPanel` provides one default tab.
|
|
16
|
+
|
|
17
|
+
Simple example
|
|
18
|
+
--------------
|
|
19
|
+
|
|
20
|
+
.. include:: ../../examples/widgets/tabbedpanel.py
|
|
21
|
+
:literal:
|
|
22
|
+
|
|
23
|
+
.. note::
|
|
24
|
+
|
|
25
|
+
A new class :class:`TabbedPanelItem` has been introduced in 1.5.0 for
|
|
26
|
+
convenience. So now one can simply add a :class:`TabbedPanelItem` to a
|
|
27
|
+
:class:`TabbedPanel` and `content` to the :class:`TabbedPanelItem`
|
|
28
|
+
as in the example provided above.
|
|
29
|
+
|
|
30
|
+
Customize the Tabbed Panel
|
|
31
|
+
--------------------------
|
|
32
|
+
|
|
33
|
+
You can choose the position in which the tabs are displayed::
|
|
34
|
+
|
|
35
|
+
tab_pos = 'top_mid'
|
|
36
|
+
|
|
37
|
+
An individual tab is called a TabbedPanelHeader. It is a special button
|
|
38
|
+
containing a `content` property. You add the TabbedPanelHeader first, and set
|
|
39
|
+
its `content` property separately::
|
|
40
|
+
|
|
41
|
+
tp = TabbedPanel()
|
|
42
|
+
th = TabbedPanelHeader(text='Tab2')
|
|
43
|
+
tp.add_widget(th)
|
|
44
|
+
|
|
45
|
+
An individual tab, represented by a TabbedPanelHeader, needs its content set.
|
|
46
|
+
This content can be any widget. It could be a layout with a deep
|
|
47
|
+
hierarchy of widgets, or it could be an individual widget, such as a label or a
|
|
48
|
+
button::
|
|
49
|
+
|
|
50
|
+
th.content = your_content_instance
|
|
51
|
+
|
|
52
|
+
There is one "shared" main content area active at any given time, for all
|
|
53
|
+
the tabs. Your app is responsible for adding the content of individual tabs
|
|
54
|
+
and for managing them, but it's not responsible for content switching. The
|
|
55
|
+
tabbed panel handles switching of the main content object as per user action.
|
|
56
|
+
|
|
57
|
+
There is a default tab added when the tabbed panel is instantiated.
|
|
58
|
+
Tabs that you add individually as above, are added in addition to the default
|
|
59
|
+
tab. Thus, depending on your needs and design, you will want to customize the
|
|
60
|
+
default tab::
|
|
61
|
+
|
|
62
|
+
tp.default_tab_text = 'Something Specific To Your Use'
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
The default tab machinery requires special consideration and management.
|
|
66
|
+
Accordingly, an `on_default_tab` event is provided for associating a callback::
|
|
67
|
+
|
|
68
|
+
tp.bind(default_tab = my_default_tab_callback)
|
|
69
|
+
|
|
70
|
+
It's important to note that by default, :attr:`default_tab_cls` is of type
|
|
71
|
+
:class:`TabbedPanelHeader` and thus has the same properties as other tabs.
|
|
72
|
+
|
|
73
|
+
Since 1.5.0, it is now possible to disable the creation of the
|
|
74
|
+
:attr:`default_tab` by setting :attr:`do_default_tab` to False.
|
|
75
|
+
|
|
76
|
+
Tabs and content can be removed in several ways::
|
|
77
|
+
|
|
78
|
+
tp.remove_widget(widget/tabbed_panel_header)
|
|
79
|
+
or
|
|
80
|
+
tp.clear_widgets() # to clear all the widgets in the content area
|
|
81
|
+
or
|
|
82
|
+
tp.clear_tabs() # to remove the TabbedPanelHeaders
|
|
83
|
+
|
|
84
|
+
To access the children of the tabbed panel, use content.children::
|
|
85
|
+
|
|
86
|
+
tp.content.children
|
|
87
|
+
|
|
88
|
+
To access the list of tabs::
|
|
89
|
+
|
|
90
|
+
tp.tab_list
|
|
91
|
+
|
|
92
|
+
To change the appearance of the main tabbed panel content::
|
|
93
|
+
|
|
94
|
+
background_color = (1, 0, 0, .5) #50% translucent red
|
|
95
|
+
border = [0, 0, 0, 0]
|
|
96
|
+
background_image = 'path/to/background/image'
|
|
97
|
+
|
|
98
|
+
To change the background of a individual tab, use these two properties::
|
|
99
|
+
|
|
100
|
+
tab_header_instance.background_normal = 'path/to/tab_head/img'
|
|
101
|
+
tab_header_instance.background_down = 'path/to/tab_head/img_pressed'
|
|
102
|
+
|
|
103
|
+
A TabbedPanelStrip contains the individual tab headers. To change the
|
|
104
|
+
appearance of this tab strip, override the canvas of TabbedPanelStrip.
|
|
105
|
+
For example, in the kv language:
|
|
106
|
+
|
|
107
|
+
.. code-block:: kv
|
|
108
|
+
|
|
109
|
+
<TabbedPanelStrip>
|
|
110
|
+
canvas:
|
|
111
|
+
Color:
|
|
112
|
+
rgba: (0, 1, 0, 1) # green
|
|
113
|
+
Rectangle:
|
|
114
|
+
size: self.size
|
|
115
|
+
pos: self.pos
|
|
116
|
+
|
|
117
|
+
By default the tabbed panel strip takes its background image and color from the
|
|
118
|
+
tabbed panel's background_image and background_color.
|
|
119
|
+
|
|
120
|
+
'''
|
|
121
|
+
|
|
122
|
+
__all__ = ('StripLayout', 'TabbedPanel', 'TabbedPanelContent',
|
|
123
|
+
'TabbedPanelHeader', 'TabbedPanelItem', 'TabbedPanelStrip',
|
|
124
|
+
'TabbedPanelException')
|
|
125
|
+
|
|
126
|
+
from functools import partial
|
|
127
|
+
from kivy.clock import Clock
|
|
128
|
+
from kivy.compat import string_types
|
|
129
|
+
from kivy.factory import Factory
|
|
130
|
+
from kivy.uix.togglebutton import ToggleButton
|
|
131
|
+
from kivy.uix.widget import Widget
|
|
132
|
+
from kivy.uix.scatter import Scatter
|
|
133
|
+
from kivy.uix.scrollview import ScrollView
|
|
134
|
+
from kivy.uix.gridlayout import GridLayout
|
|
135
|
+
from kivy.uix.floatlayout import FloatLayout
|
|
136
|
+
from kivy.logger import Logger
|
|
137
|
+
from kivy.metrics import dp
|
|
138
|
+
from kivy.properties import ObjectProperty, StringProperty, OptionProperty, \
|
|
139
|
+
ListProperty, NumericProperty, AliasProperty, BooleanProperty, \
|
|
140
|
+
ColorProperty
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class TabbedPanelException(Exception):
|
|
144
|
+
'''The TabbedPanelException class.
|
|
145
|
+
'''
|
|
146
|
+
pass
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class TabbedPanelHeader(ToggleButton):
|
|
150
|
+
'''A Base for implementing a Tabbed Panel Head. A button intended to be
|
|
151
|
+
used as a Heading/Tab for a TabbedPanel widget.
|
|
152
|
+
|
|
153
|
+
You can use this TabbedPanelHeader widget to add a new tab to a
|
|
154
|
+
TabbedPanel.
|
|
155
|
+
'''
|
|
156
|
+
|
|
157
|
+
content = ObjectProperty(None, allownone=True)
|
|
158
|
+
'''Content to be loaded when this tab header is selected.
|
|
159
|
+
|
|
160
|
+
:attr:`content` is an :class:`~kivy.properties.ObjectProperty` and defaults
|
|
161
|
+
to None.
|
|
162
|
+
'''
|
|
163
|
+
|
|
164
|
+
# only allow selecting the tab if not already selected
|
|
165
|
+
def on_touch_down(self, touch):
|
|
166
|
+
if self.state == 'down':
|
|
167
|
+
# dispatch to children, not to self
|
|
168
|
+
for child in self.children:
|
|
169
|
+
child.dispatch('on_touch_down', touch)
|
|
170
|
+
return
|
|
171
|
+
else:
|
|
172
|
+
super(TabbedPanelHeader, self).on_touch_down(touch)
|
|
173
|
+
|
|
174
|
+
def on_release(self, *largs):
|
|
175
|
+
# Tabbed panel header is a child of tab_strib which has a
|
|
176
|
+
# `tabbed_panel` property
|
|
177
|
+
if self.parent:
|
|
178
|
+
self.parent.tabbed_panel.switch_to(self)
|
|
179
|
+
else:
|
|
180
|
+
# tab removed before we could switch to it. Switch back to
|
|
181
|
+
# previous tab
|
|
182
|
+
self.panel.switch_to(self.panel.current_tab)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class TabbedPanelItem(TabbedPanelHeader):
|
|
186
|
+
'''This is a convenience class that provides a header of type
|
|
187
|
+
TabbedPanelHeader and links it with the content automatically. Thus
|
|
188
|
+
facilitating you to simply do the following in kv language:
|
|
189
|
+
|
|
190
|
+
.. code-block:: kv
|
|
191
|
+
|
|
192
|
+
<TabbedPanel>:
|
|
193
|
+
# ...other settings
|
|
194
|
+
TabbedPanelItem:
|
|
195
|
+
BoxLayout:
|
|
196
|
+
Label:
|
|
197
|
+
text: 'Second tab content area'
|
|
198
|
+
Button:
|
|
199
|
+
text: 'Button that does nothing'
|
|
200
|
+
|
|
201
|
+
.. versionadded:: 1.5.0
|
|
202
|
+
'''
|
|
203
|
+
|
|
204
|
+
def add_widget(self, widget, *args, **kwargs):
|
|
205
|
+
self.content = widget
|
|
206
|
+
if not self.parent:
|
|
207
|
+
return
|
|
208
|
+
panel = self.parent.tabbed_panel
|
|
209
|
+
if panel.current_tab == self:
|
|
210
|
+
panel.switch_to(self)
|
|
211
|
+
|
|
212
|
+
def remove_widget(self, *args, **kwargs):
|
|
213
|
+
self.content = None
|
|
214
|
+
if not self.parent:
|
|
215
|
+
return
|
|
216
|
+
panel = self.parent.tabbed_panel
|
|
217
|
+
if panel.current_tab == self:
|
|
218
|
+
panel.remove_widget(*args, **kwargs)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
class TabbedPanelStrip(GridLayout):
|
|
222
|
+
'''A strip intended to be used as background for Heading/Tab.
|
|
223
|
+
This does not cover the blank areas in case the tabs don't cover
|
|
224
|
+
the entire width/height of the TabbedPanel(use :class:`StripLayout`
|
|
225
|
+
for that).
|
|
226
|
+
'''
|
|
227
|
+
tabbed_panel = ObjectProperty(None)
|
|
228
|
+
'''Link to the panel that the tab strip is a part of.
|
|
229
|
+
|
|
230
|
+
:attr:`tabbed_panel` is an :class:`~kivy.properties.ObjectProperty` and
|
|
231
|
+
defaults to None .
|
|
232
|
+
'''
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
class StripLayout(GridLayout):
|
|
236
|
+
''' The main layout that is used to house the entire tabbedpanel strip
|
|
237
|
+
including the blank areas in case the tabs don't cover the entire
|
|
238
|
+
width/height.
|
|
239
|
+
|
|
240
|
+
.. versionadded:: 1.8.0
|
|
241
|
+
|
|
242
|
+
'''
|
|
243
|
+
|
|
244
|
+
border = ListProperty([4, 4, 4, 4])
|
|
245
|
+
'''Border property for the :attr:`background_image`.
|
|
246
|
+
|
|
247
|
+
:attr:`border` is a :class:`~kivy.properties.ListProperty` and defaults
|
|
248
|
+
to [4, 4, 4, 4]
|
|
249
|
+
'''
|
|
250
|
+
|
|
251
|
+
background_image = StringProperty(
|
|
252
|
+
'atlas://data/images/defaulttheme/action_view')
|
|
253
|
+
'''Background image to be used for the Strip layout of the TabbedPanel.
|
|
254
|
+
|
|
255
|
+
:attr:`background_image` is a :class:`~kivy.properties.StringProperty` and
|
|
256
|
+
defaults to a transparent image.
|
|
257
|
+
'''
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
class TabbedPanelContent(FloatLayout):
|
|
261
|
+
'''The TabbedPanelContent class.
|
|
262
|
+
'''
|
|
263
|
+
pass
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
class TabbedPanel(GridLayout):
|
|
267
|
+
'''The TabbedPanel class. See module documentation for more information.
|
|
268
|
+
'''
|
|
269
|
+
|
|
270
|
+
background_color = ColorProperty([1, 1, 1, 1])
|
|
271
|
+
'''Background color, in the format (r, g, b, a).
|
|
272
|
+
|
|
273
|
+
:attr:`background_color` is a :class:`~kivy.properties.ColorProperty` and
|
|
274
|
+
defaults to [1, 1, 1, 1].
|
|
275
|
+
|
|
276
|
+
.. versionchanged:: 2.0.0
|
|
277
|
+
Changed from :class:`~kivy.properties.ListProperty` to
|
|
278
|
+
:class:`~kivy.properties.ColorProperty`.
|
|
279
|
+
'''
|
|
280
|
+
|
|
281
|
+
border = ListProperty([16, 16, 16, 16])
|
|
282
|
+
'''Border used for :class:`~kivy.graphics.vertex_instructions.BorderImage`
|
|
283
|
+
graphics instruction, used itself for :attr:`background_image`.
|
|
284
|
+
Can be changed for a custom background.
|
|
285
|
+
|
|
286
|
+
It must be a list of four values: (bottom, right, top, left). Read the
|
|
287
|
+
BorderImage instructions for more information.
|
|
288
|
+
|
|
289
|
+
:attr:`border` is a :class:`~kivy.properties.ListProperty` and
|
|
290
|
+
defaults to (16, 16, 16, 16)
|
|
291
|
+
'''
|
|
292
|
+
|
|
293
|
+
background_image = StringProperty('atlas://data/images/defaulttheme/tab')
|
|
294
|
+
'''Background image of the main shared content object.
|
|
295
|
+
|
|
296
|
+
:attr:`background_image` is a :class:`~kivy.properties.StringProperty` and
|
|
297
|
+
defaults to 'atlas://data/images/defaulttheme/tab'.
|
|
298
|
+
'''
|
|
299
|
+
|
|
300
|
+
background_disabled_image = StringProperty(
|
|
301
|
+
'atlas://data/images/defaulttheme/tab_disabled')
|
|
302
|
+
'''Background image of the main shared content object when disabled.
|
|
303
|
+
|
|
304
|
+
.. versionadded:: 1.8.0
|
|
305
|
+
|
|
306
|
+
:attr:`background_disabled_image` is a
|
|
307
|
+
:class:`~kivy.properties.StringProperty` and defaults to
|
|
308
|
+
'atlas://data/images/defaulttheme/tab'.
|
|
309
|
+
'''
|
|
310
|
+
|
|
311
|
+
strip_image = StringProperty(
|
|
312
|
+
'atlas://data/images/defaulttheme/action_view')
|
|
313
|
+
'''Background image of the tabbed strip.
|
|
314
|
+
|
|
315
|
+
.. versionadded:: 1.8.0
|
|
316
|
+
|
|
317
|
+
:attr:`strip_image` is a :class:`~kivy.properties.StringProperty`
|
|
318
|
+
and defaults to a empty image.
|
|
319
|
+
'''
|
|
320
|
+
|
|
321
|
+
strip_border = ListProperty([4, 4, 4, 4])
|
|
322
|
+
'''Border to be used on :attr:`strip_image`.
|
|
323
|
+
|
|
324
|
+
.. versionadded:: 1.8.0
|
|
325
|
+
|
|
326
|
+
:attr:`strip_border` is a :class:`~kivy.properties.ListProperty` and
|
|
327
|
+
defaults to [4, 4, 4, 4].
|
|
328
|
+
'''
|
|
329
|
+
|
|
330
|
+
_current_tab = ObjectProperty(None)
|
|
331
|
+
|
|
332
|
+
def get_current_tab(self):
|
|
333
|
+
return self._current_tab
|
|
334
|
+
|
|
335
|
+
current_tab = AliasProperty(get_current_tab, None, bind=('_current_tab', ))
|
|
336
|
+
'''Links to the currently selected or active tab.
|
|
337
|
+
|
|
338
|
+
.. versionadded:: 1.4.0
|
|
339
|
+
|
|
340
|
+
:attr:`current_tab` is an :class:`~kivy.AliasProperty`, read-only.
|
|
341
|
+
'''
|
|
342
|
+
|
|
343
|
+
tab_pos = OptionProperty(
|
|
344
|
+
'top_left',
|
|
345
|
+
options=('left_top', 'left_mid', 'left_bottom', 'top_left',
|
|
346
|
+
'top_mid', 'top_right', 'right_top', 'right_mid',
|
|
347
|
+
'right_bottom', 'bottom_left', 'bottom_mid', 'bottom_right'))
|
|
348
|
+
'''Specifies the position of the tabs relative to the content.
|
|
349
|
+
Can be one of: `left_top`, `left_mid`, `left_bottom`, `top_left`,
|
|
350
|
+
`top_mid`, `top_right`, `right_top`, `right_mid`, `right_bottom`,
|
|
351
|
+
`bottom_left`, `bottom_mid`, `bottom_right`.
|
|
352
|
+
|
|
353
|
+
:attr:`tab_pos` is an :class:`~kivy.properties.OptionProperty` and
|
|
354
|
+
defaults to 'top_left'.
|
|
355
|
+
'''
|
|
356
|
+
|
|
357
|
+
tab_height = NumericProperty('40dp')
|
|
358
|
+
'''Specifies the height of the tab header.
|
|
359
|
+
|
|
360
|
+
:attr:`tab_height` is a :class:`~kivy.properties.NumericProperty` and
|
|
361
|
+
defaults to 40.
|
|
362
|
+
'''
|
|
363
|
+
|
|
364
|
+
tab_width = NumericProperty('100dp', allownone=True)
|
|
365
|
+
'''Specifies the width of the tab header.
|
|
366
|
+
|
|
367
|
+
:attr:`tab_width` is a :class:`~kivy.properties.NumericProperty` and
|
|
368
|
+
defaults to 100.
|
|
369
|
+
'''
|
|
370
|
+
|
|
371
|
+
bar_width = NumericProperty('2dp')
|
|
372
|
+
'''Width of the horizontal scroll bar. The width is interpreted
|
|
373
|
+
as a height for the horizontal bar.
|
|
374
|
+
|
|
375
|
+
.. versionadded:: 2.2.0
|
|
376
|
+
|
|
377
|
+
:attr:`bar_width` is a :class:`~kivy.properties.NumericProperty` and
|
|
378
|
+
defaults to 2.
|
|
379
|
+
'''
|
|
380
|
+
|
|
381
|
+
scroll_type = OptionProperty(['content'], options=(['content'], ['bars'],
|
|
382
|
+
['bars', 'content'], ['content', 'bars']))
|
|
383
|
+
|
|
384
|
+
'''Sets the type of scrolling to use for the content of the scrollview.
|
|
385
|
+
Available options are: ['content'], ['bars'], ['bars', 'content'].
|
|
386
|
+
|
|
387
|
+
.. versionadded:: 2.2.0
|
|
388
|
+
|
|
389
|
+
:attr:`scroll_type` is an :class:`~kivy.properties.OptionProperty` and
|
|
390
|
+
defaults to ['content'].
|
|
391
|
+
'''
|
|
392
|
+
|
|
393
|
+
do_default_tab = BooleanProperty(True)
|
|
394
|
+
'''Specifies whether a default_tab head is provided.
|
|
395
|
+
|
|
396
|
+
.. versionadded:: 1.5.0
|
|
397
|
+
|
|
398
|
+
:attr:`do_default_tab` is a :class:`~kivy.properties.BooleanProperty` and
|
|
399
|
+
defaults to 'True'.
|
|
400
|
+
'''
|
|
401
|
+
|
|
402
|
+
default_tab_text = StringProperty('Default tab')
|
|
403
|
+
'''Specifies the text displayed on the default tab header.
|
|
404
|
+
|
|
405
|
+
:attr:`default_tab_text` is a :class:`~kivy.properties.StringProperty` and
|
|
406
|
+
defaults to 'default tab'.
|
|
407
|
+
'''
|
|
408
|
+
|
|
409
|
+
default_tab_cls = ObjectProperty(TabbedPanelHeader)
|
|
410
|
+
'''Specifies the class to use for the styling of the default tab.
|
|
411
|
+
|
|
412
|
+
.. versionadded:: 1.4.0
|
|
413
|
+
|
|
414
|
+
.. warning::
|
|
415
|
+
`default_tab_cls` should be subclassed from `TabbedPanelHeader`
|
|
416
|
+
|
|
417
|
+
:attr:`default_tab_cls` is an :class:`~kivy.properties.ObjectProperty`
|
|
418
|
+
and defaults to `TabbedPanelHeader`. If you set a string, the
|
|
419
|
+
:class:`~kivy.factory.Factory` will be used to resolve the class.
|
|
420
|
+
|
|
421
|
+
.. versionchanged:: 1.8.0
|
|
422
|
+
The :class:`~kivy.factory.Factory` will resolve the class if a string
|
|
423
|
+
is set.
|
|
424
|
+
'''
|
|
425
|
+
|
|
426
|
+
def get_tab_list(self):
|
|
427
|
+
if self._tab_strip:
|
|
428
|
+
return self._tab_strip.children
|
|
429
|
+
return 1.
|
|
430
|
+
|
|
431
|
+
tab_list = AliasProperty(get_tab_list, None)
|
|
432
|
+
'''List of all the tab headers.
|
|
433
|
+
|
|
434
|
+
:attr:`tab_list` is an :class:`~kivy.properties.AliasProperty` and is
|
|
435
|
+
read-only.
|
|
436
|
+
'''
|
|
437
|
+
|
|
438
|
+
content = ObjectProperty(None)
|
|
439
|
+
'''This is the object holding (current_tab's content is added to this)
|
|
440
|
+
the content of the current tab. To Listen to the changes in the content
|
|
441
|
+
of the current tab, you should bind to current_tabs `content` property.
|
|
442
|
+
|
|
443
|
+
:attr:`content` is an :class:`~kivy.properties.ObjectProperty` and
|
|
444
|
+
defaults to 'None'.
|
|
445
|
+
'''
|
|
446
|
+
|
|
447
|
+
_default_tab = ObjectProperty(None, allow_none=True)
|
|
448
|
+
|
|
449
|
+
def get_def_tab(self):
|
|
450
|
+
return self._default_tab
|
|
451
|
+
|
|
452
|
+
def set_def_tab(self, new_tab):
|
|
453
|
+
if not issubclass(new_tab.__class__, TabbedPanelHeader):
|
|
454
|
+
raise TabbedPanelException('`default_tab_class` should be\
|
|
455
|
+
subclassed from `TabbedPanelHeader`')
|
|
456
|
+
if self._default_tab == new_tab:
|
|
457
|
+
return
|
|
458
|
+
oltab = self._default_tab
|
|
459
|
+
self._default_tab = new_tab
|
|
460
|
+
self.remove_widget(oltab)
|
|
461
|
+
self._original_tab = None
|
|
462
|
+
self.switch_to(new_tab)
|
|
463
|
+
new_tab.state = 'down'
|
|
464
|
+
|
|
465
|
+
default_tab = AliasProperty(get_def_tab, set_def_tab,
|
|
466
|
+
bind=('_default_tab', ))
|
|
467
|
+
'''Holds the default tab.
|
|
468
|
+
|
|
469
|
+
.. Note:: For convenience, the automatically provided default tab is
|
|
470
|
+
deleted when you change default_tab to something else.
|
|
471
|
+
As of 1.5.0, this behavior has been extended to every
|
|
472
|
+
`default_tab` for consistency and not just the automatically
|
|
473
|
+
provided one.
|
|
474
|
+
|
|
475
|
+
:attr:`default_tab` is an :class:`~kivy.properties.AliasProperty`.
|
|
476
|
+
'''
|
|
477
|
+
|
|
478
|
+
def get_def_tab_content(self):
|
|
479
|
+
return self.default_tab.content
|
|
480
|
+
|
|
481
|
+
def set_def_tab_content(self, *l):
|
|
482
|
+
self.default_tab.content = l[0]
|
|
483
|
+
|
|
484
|
+
default_tab_content = AliasProperty(get_def_tab_content,
|
|
485
|
+
set_def_tab_content)
|
|
486
|
+
'''Holds the default tab content.
|
|
487
|
+
|
|
488
|
+
:attr:`default_tab_content` is an :class:`~kivy.properties.AliasProperty`.
|
|
489
|
+
'''
|
|
490
|
+
|
|
491
|
+
_update_top_ev = _update_tab_ev = _update_tabs_ev = None
|
|
492
|
+
|
|
493
|
+
def __init__(self, **kwargs):
|
|
494
|
+
# these variables need to be initialized before the kv lang is
|
|
495
|
+
# processed setup the base layout for the tabbed panel
|
|
496
|
+
self._childrens = []
|
|
497
|
+
self._tab_layout = StripLayout(rows=1)
|
|
498
|
+
self.rows = 1
|
|
499
|
+
self._tab_strip = TabbedPanelStrip(
|
|
500
|
+
tabbed_panel=self,
|
|
501
|
+
rows=1, size_hint=(None, None),
|
|
502
|
+
height=self.tab_height, width=self.tab_width)
|
|
503
|
+
|
|
504
|
+
self._partial_update_scrollview = None
|
|
505
|
+
self.content = TabbedPanelContent()
|
|
506
|
+
self._current_tab = self._original_tab \
|
|
507
|
+
= self._default_tab = TabbedPanelHeader()
|
|
508
|
+
|
|
509
|
+
super(TabbedPanel, self).__init__(**kwargs)
|
|
510
|
+
|
|
511
|
+
self.fbind('size', self._reposition_tabs)
|
|
512
|
+
if not self.do_default_tab:
|
|
513
|
+
Clock.schedule_once(self._switch_to_first_tab)
|
|
514
|
+
return
|
|
515
|
+
self._setup_default_tab()
|
|
516
|
+
self.switch_to(self.default_tab)
|
|
517
|
+
|
|
518
|
+
def switch_to(self, header, do_scroll=False):
|
|
519
|
+
'''Switch to a specific panel header.
|
|
520
|
+
|
|
521
|
+
.. versionchanged:: 1.10.0
|
|
522
|
+
|
|
523
|
+
If used with `do_scroll=True`, it scrolls
|
|
524
|
+
to the header's tab too.
|
|
525
|
+
|
|
526
|
+
:meth:`switch_to` cannot be called from within the
|
|
527
|
+
:class:`TabbedPanel` or its subclass' ``__init__`` method.
|
|
528
|
+
If that is required, use the ``Clock`` to schedule it. See `discussion
|
|
529
|
+
<https://github.com/kivy/kivy/issues/3493#issuecomment-121567969>`_
|
|
530
|
+
for full example.
|
|
531
|
+
'''
|
|
532
|
+
header_content = header.content
|
|
533
|
+
self._current_tab.state = 'normal'
|
|
534
|
+
header.state = 'down'
|
|
535
|
+
self._current_tab = header
|
|
536
|
+
self.clear_widgets()
|
|
537
|
+
if header_content is None:
|
|
538
|
+
return
|
|
539
|
+
# if content has a previous parent remove it from that parent
|
|
540
|
+
parent = header_content.parent
|
|
541
|
+
if parent:
|
|
542
|
+
parent.remove_widget(header_content)
|
|
543
|
+
self.add_widget(header_content)
|
|
544
|
+
|
|
545
|
+
if do_scroll:
|
|
546
|
+
tabs = self._tab_strip
|
|
547
|
+
tabs.parent.scroll_to(header)
|
|
548
|
+
|
|
549
|
+
def clear_tabs(self, *l):
|
|
550
|
+
self_tabs = self._tab_strip
|
|
551
|
+
self_tabs.clear_widgets()
|
|
552
|
+
if self.do_default_tab:
|
|
553
|
+
self_default_tab = self._default_tab
|
|
554
|
+
self_tabs.add_widget(self_default_tab)
|
|
555
|
+
self_tabs.width = self_default_tab.width
|
|
556
|
+
self._reposition_tabs()
|
|
557
|
+
|
|
558
|
+
def add_widget(self, widget, *args, **kwargs):
|
|
559
|
+
content = self.content
|
|
560
|
+
if content is None:
|
|
561
|
+
return
|
|
562
|
+
parent = widget.parent
|
|
563
|
+
if parent:
|
|
564
|
+
parent.remove_widget(widget)
|
|
565
|
+
if widget in (content, self._tab_layout):
|
|
566
|
+
super(TabbedPanel, self).add_widget(widget, *args, **kwargs)
|
|
567
|
+
elif isinstance(widget, TabbedPanelHeader):
|
|
568
|
+
self_tabs = self._tab_strip
|
|
569
|
+
self_tabs.add_widget(widget, *args, **kwargs)
|
|
570
|
+
widget.group = '__tab%r__' % self_tabs.uid
|
|
571
|
+
self.on_tab_width()
|
|
572
|
+
else:
|
|
573
|
+
widget.pos_hint = {'x': 0, 'top': 1}
|
|
574
|
+
self._childrens.append(widget)
|
|
575
|
+
content.disabled = self.current_tab.disabled
|
|
576
|
+
content.add_widget(widget, *args, **kwargs)
|
|
577
|
+
|
|
578
|
+
def remove_widget(self, widget, *args, **kwargs):
|
|
579
|
+
content = self.content
|
|
580
|
+
if content is None:
|
|
581
|
+
return
|
|
582
|
+
if widget in (content, self._tab_layout):
|
|
583
|
+
super(TabbedPanel, self).remove_widget(widget, *args, **kwargs)
|
|
584
|
+
elif isinstance(widget, TabbedPanelHeader):
|
|
585
|
+
if not (self.do_default_tab and widget is self._default_tab):
|
|
586
|
+
self_tabs = self._tab_strip
|
|
587
|
+
self_tabs.width -= widget.width
|
|
588
|
+
self_tabs.remove_widget(widget)
|
|
589
|
+
if widget.state == 'down' and self.do_default_tab:
|
|
590
|
+
self._default_tab.on_release()
|
|
591
|
+
self._reposition_tabs()
|
|
592
|
+
else:
|
|
593
|
+
Logger.info('TabbedPanel: default tab! can\'t be removed.\n' +
|
|
594
|
+
'Change `default_tab` to a different tab.')
|
|
595
|
+
else:
|
|
596
|
+
if widget in self._childrens:
|
|
597
|
+
self._childrens.remove(widget)
|
|
598
|
+
if widget in content.children:
|
|
599
|
+
content.remove_widget(widget, *args, **kwargs)
|
|
600
|
+
|
|
601
|
+
def clear_widgets(self, *args, **kwargs):
|
|
602
|
+
if self.content:
|
|
603
|
+
self.content.clear_widgets(*args, **kwargs)
|
|
604
|
+
|
|
605
|
+
def on_strip_image(self, instance, value):
|
|
606
|
+
if not self._tab_layout:
|
|
607
|
+
return
|
|
608
|
+
self._tab_layout.background_image = value
|
|
609
|
+
|
|
610
|
+
def on_strip_border(self, instance, value):
|
|
611
|
+
if not self._tab_layout:
|
|
612
|
+
return
|
|
613
|
+
self._tab_layout.border = value
|
|
614
|
+
|
|
615
|
+
def on_do_default_tab(self, instance, value):
|
|
616
|
+
if not value:
|
|
617
|
+
dft = self.default_tab
|
|
618
|
+
if dft in self.tab_list:
|
|
619
|
+
self.remove_widget(dft)
|
|
620
|
+
self._switch_to_first_tab()
|
|
621
|
+
self._default_tab = self._current_tab
|
|
622
|
+
else:
|
|
623
|
+
self._current_tab.state = 'normal'
|
|
624
|
+
self._setup_default_tab()
|
|
625
|
+
|
|
626
|
+
def on_default_tab_text(self, *args):
|
|
627
|
+
self._default_tab.text = self.default_tab_text
|
|
628
|
+
|
|
629
|
+
def on_tab_width(self, *l):
|
|
630
|
+
ev = self._update_tab_ev
|
|
631
|
+
if ev is None:
|
|
632
|
+
ev = self._update_tab_ev = Clock.create_trigger(
|
|
633
|
+
self._update_tab_width, 0)
|
|
634
|
+
ev()
|
|
635
|
+
|
|
636
|
+
def on_tab_height(self, *l):
|
|
637
|
+
self._tab_layout.height = self._tab_strip.height = self.tab_height
|
|
638
|
+
self._reposition_tabs()
|
|
639
|
+
|
|
640
|
+
def on_tab_pos(self, *l):
|
|
641
|
+
# ensure canvas
|
|
642
|
+
self._reposition_tabs()
|
|
643
|
+
|
|
644
|
+
def _setup_default_tab(self):
|
|
645
|
+
if self._default_tab in self.tab_list:
|
|
646
|
+
return
|
|
647
|
+
content = self._default_tab.content
|
|
648
|
+
_tabs = self._tab_strip
|
|
649
|
+
cls = self.default_tab_cls
|
|
650
|
+
|
|
651
|
+
if isinstance(cls, string_types):
|
|
652
|
+
cls = Factory.get(cls)
|
|
653
|
+
|
|
654
|
+
if not issubclass(cls, TabbedPanelHeader):
|
|
655
|
+
raise TabbedPanelException('`default_tab_class` should be\
|
|
656
|
+
subclassed from `TabbedPanelHeader`')
|
|
657
|
+
|
|
658
|
+
# no need to instantiate if class is TabbedPanelHeader
|
|
659
|
+
if cls != TabbedPanelHeader:
|
|
660
|
+
self._current_tab = self._original_tab = self._default_tab = cls()
|
|
661
|
+
|
|
662
|
+
default_tab = self.default_tab
|
|
663
|
+
if self._original_tab == self.default_tab:
|
|
664
|
+
default_tab.text = self.default_tab_text
|
|
665
|
+
|
|
666
|
+
default_tab.height = self.tab_height
|
|
667
|
+
default_tab.group = '__tab%r__' % _tabs.uid
|
|
668
|
+
default_tab.state = 'down'
|
|
669
|
+
default_tab.width = self.tab_width if self.tab_width else 100
|
|
670
|
+
default_tab.content = content
|
|
671
|
+
|
|
672
|
+
tl = self.tab_list
|
|
673
|
+
if default_tab not in tl:
|
|
674
|
+
_tabs.add_widget(default_tab, len(tl))
|
|
675
|
+
|
|
676
|
+
if default_tab.content:
|
|
677
|
+
self.clear_widgets()
|
|
678
|
+
self.add_widget(self.default_tab.content)
|
|
679
|
+
else:
|
|
680
|
+
Clock.schedule_once(self._load_default_tab_content)
|
|
681
|
+
self._current_tab = default_tab
|
|
682
|
+
|
|
683
|
+
def _switch_to_first_tab(self, *l):
|
|
684
|
+
ltl = len(self.tab_list) - 1
|
|
685
|
+
if ltl > -1:
|
|
686
|
+
self._current_tab = dt = self._original_tab \
|
|
687
|
+
= self.tab_list[ltl]
|
|
688
|
+
self.switch_to(dt)
|
|
689
|
+
|
|
690
|
+
def _load_default_tab_content(self, dt):
|
|
691
|
+
if self.default_tab:
|
|
692
|
+
self.switch_to(self.default_tab)
|
|
693
|
+
|
|
694
|
+
def _reposition_tabs(self, *l):
|
|
695
|
+
ev = self._update_tabs_ev
|
|
696
|
+
if ev is None:
|
|
697
|
+
ev = self._update_tabs_ev = Clock.create_trigger(
|
|
698
|
+
self._update_tabs, 0)
|
|
699
|
+
ev()
|
|
700
|
+
|
|
701
|
+
def _update_tabs(self, *l):
|
|
702
|
+
self_content = self.content
|
|
703
|
+
if not self_content:
|
|
704
|
+
return
|
|
705
|
+
# cache variables for faster access
|
|
706
|
+
tab_pos = self.tab_pos
|
|
707
|
+
tab_layout = self._tab_layout
|
|
708
|
+
tab_layout.clear_widgets()
|
|
709
|
+
scrl_v = ScrollView(size_hint=(None, 1), always_overscroll=False,
|
|
710
|
+
bar_width=self.bar_width,
|
|
711
|
+
scroll_type=self.scroll_type)
|
|
712
|
+
tabs = self._tab_strip
|
|
713
|
+
parent = tabs.parent
|
|
714
|
+
if parent:
|
|
715
|
+
parent.remove_widget(tabs)
|
|
716
|
+
scrl_v.add_widget(tabs)
|
|
717
|
+
scrl_v.pos = (0, 0)
|
|
718
|
+
self_update_scrollview = self._update_scrollview
|
|
719
|
+
|
|
720
|
+
# update scrlv width when tab width changes depends on tab_pos
|
|
721
|
+
if self._partial_update_scrollview is not None:
|
|
722
|
+
tabs.unbind(width=self._partial_update_scrollview)
|
|
723
|
+
self._partial_update_scrollview = partial(
|
|
724
|
+
self_update_scrollview, scrl_v)
|
|
725
|
+
tabs.bind(width=self._partial_update_scrollview)
|
|
726
|
+
|
|
727
|
+
# remove all widgets from the tab_strip
|
|
728
|
+
super(TabbedPanel, self).clear_widgets()
|
|
729
|
+
tab_height = self.tab_height
|
|
730
|
+
|
|
731
|
+
widget_list = []
|
|
732
|
+
tab_list = []
|
|
733
|
+
pos_letter = tab_pos[0]
|
|
734
|
+
if pos_letter == 'b' or pos_letter == 't':
|
|
735
|
+
# bottom or top positions
|
|
736
|
+
# one col containing the tab_strip and the content
|
|
737
|
+
self.cols = 1
|
|
738
|
+
self.rows = 2
|
|
739
|
+
# tab_layout contains the scrollview containing tabs and two blank
|
|
740
|
+
# dummy widgets for spacing
|
|
741
|
+
tab_layout.rows = 1
|
|
742
|
+
tab_layout.cols = 3
|
|
743
|
+
tab_layout.size_hint = (1, None)
|
|
744
|
+
tab_layout.height = (tab_height + tab_layout.padding[1] +
|
|
745
|
+
tab_layout.padding[3] + dp(2))
|
|
746
|
+
self_update_scrollview(scrl_v)
|
|
747
|
+
|
|
748
|
+
if pos_letter == 'b':
|
|
749
|
+
# bottom
|
|
750
|
+
if tab_pos == 'bottom_mid':
|
|
751
|
+
tab_list = (Widget(), scrl_v, Widget())
|
|
752
|
+
widget_list = (self_content, tab_layout)
|
|
753
|
+
else:
|
|
754
|
+
if tab_pos == 'bottom_left':
|
|
755
|
+
tab_list = (scrl_v, Widget(), Widget())
|
|
756
|
+
elif tab_pos == 'bottom_right':
|
|
757
|
+
# add two dummy widgets
|
|
758
|
+
tab_list = (Widget(), Widget(), scrl_v)
|
|
759
|
+
widget_list = (self_content, tab_layout)
|
|
760
|
+
else:
|
|
761
|
+
# top
|
|
762
|
+
if tab_pos == 'top_mid':
|
|
763
|
+
tab_list = (Widget(), scrl_v, Widget())
|
|
764
|
+
elif tab_pos == 'top_left':
|
|
765
|
+
tab_list = (scrl_v, Widget(), Widget())
|
|
766
|
+
elif tab_pos == 'top_right':
|
|
767
|
+
tab_list = (Widget(), Widget(), scrl_v)
|
|
768
|
+
widget_list = (tab_layout, self_content)
|
|
769
|
+
elif pos_letter == 'l' or pos_letter == 'r':
|
|
770
|
+
# left or right positions
|
|
771
|
+
# one row containing the tab_strip and the content
|
|
772
|
+
self.cols = 2
|
|
773
|
+
self.rows = 1
|
|
774
|
+
# tab_layout contains two blank dummy widgets for spacing
|
|
775
|
+
# "vertically" and the scatter containing scrollview
|
|
776
|
+
# containing tabs
|
|
777
|
+
tab_layout.rows = 3
|
|
778
|
+
tab_layout.cols = 1
|
|
779
|
+
tab_layout.size_hint = (None, 1)
|
|
780
|
+
tab_layout.width = tab_height
|
|
781
|
+
scrl_v.height = tab_height
|
|
782
|
+
self_update_scrollview(scrl_v)
|
|
783
|
+
|
|
784
|
+
# rotate the scatter for vertical positions
|
|
785
|
+
rotation = 90 if tab_pos[0] == 'l' else -90
|
|
786
|
+
sctr = Scatter(do_translation=False,
|
|
787
|
+
rotation=rotation,
|
|
788
|
+
do_rotation=False,
|
|
789
|
+
do_scale=False,
|
|
790
|
+
size_hint=(None, None),
|
|
791
|
+
auto_bring_to_front=False,
|
|
792
|
+
size=scrl_v.size)
|
|
793
|
+
sctr.add_widget(scrl_v)
|
|
794
|
+
|
|
795
|
+
lentab_pos = len(tab_pos)
|
|
796
|
+
|
|
797
|
+
# Update scatter's top when its pos changes.
|
|
798
|
+
# Needed for repositioning scatter to the correct place after its
|
|
799
|
+
# added to the parent. Use clock_schedule_once to ensure top is
|
|
800
|
+
# calculated after the parent's pos on canvas has been calculated.
|
|
801
|
+
# This is needed for when tab_pos changes to correctly position
|
|
802
|
+
# scatter. Without clock.schedule_once the positions would look
|
|
803
|
+
# fine but touch won't translate to the correct position
|
|
804
|
+
|
|
805
|
+
if tab_pos[lentab_pos - 4:] == '_top':
|
|
806
|
+
# on positions 'left_top' and 'right_top'
|
|
807
|
+
sctr.bind(pos=partial(self._update_top, sctr, 'top', None))
|
|
808
|
+
tab_list = (sctr, )
|
|
809
|
+
elif tab_pos[lentab_pos - 4:] == '_mid':
|
|
810
|
+
# calculate top of scatter
|
|
811
|
+
sctr.bind(pos=partial(self._update_top, sctr, 'mid',
|
|
812
|
+
scrl_v.width))
|
|
813
|
+
tab_list = (Widget(), sctr, Widget())
|
|
814
|
+
elif tab_pos[lentab_pos - 7:] == '_bottom':
|
|
815
|
+
tab_list = (Widget(), Widget(), sctr)
|
|
816
|
+
|
|
817
|
+
if pos_letter == 'l':
|
|
818
|
+
widget_list = (tab_layout, self_content)
|
|
819
|
+
else:
|
|
820
|
+
widget_list = (self_content, tab_layout)
|
|
821
|
+
|
|
822
|
+
# add widgets to tab_layout
|
|
823
|
+
add = tab_layout.add_widget
|
|
824
|
+
for widg in tab_list:
|
|
825
|
+
add(widg)
|
|
826
|
+
|
|
827
|
+
# add widgets to self
|
|
828
|
+
add = self.add_widget
|
|
829
|
+
for widg in widget_list:
|
|
830
|
+
add(widg)
|
|
831
|
+
|
|
832
|
+
def _update_tab_width(self, *l):
|
|
833
|
+
if self.tab_width:
|
|
834
|
+
for tab in self.tab_list:
|
|
835
|
+
tab.size_hint_x = 1
|
|
836
|
+
tsw = self.tab_width * len(self._tab_strip.children)
|
|
837
|
+
else:
|
|
838
|
+
# tab_width = None
|
|
839
|
+
tsw = 0
|
|
840
|
+
for tab in self.tab_list:
|
|
841
|
+
if tab.size_hint_x:
|
|
842
|
+
# size_hint_x: x/.xyz
|
|
843
|
+
tab.size_hint_x = 1
|
|
844
|
+
# drop to default tab_width
|
|
845
|
+
tsw += 100
|
|
846
|
+
else:
|
|
847
|
+
# size_hint_x: None
|
|
848
|
+
tsw += tab.width
|
|
849
|
+
self._tab_strip.width = tsw
|
|
850
|
+
self._reposition_tabs()
|
|
851
|
+
|
|
852
|
+
def _update_top(self, *args):
|
|
853
|
+
sctr, top, scrl_v_width, x, y = args
|
|
854
|
+
ev = self._update_top_ev
|
|
855
|
+
if ev is not None:
|
|
856
|
+
ev.cancel()
|
|
857
|
+
|
|
858
|
+
ev = self._update_top_ev = Clock.schedule_once(
|
|
859
|
+
partial(self._updt_top, sctr, top, scrl_v_width), 0)
|
|
860
|
+
|
|
861
|
+
def _updt_top(self, sctr, top, scrl_v_width, *args):
|
|
862
|
+
if top[0] == 't':
|
|
863
|
+
sctr.top = self.top
|
|
864
|
+
else:
|
|
865
|
+
sctr.top = self.top - (self.height - scrl_v_width) / 2
|
|
866
|
+
|
|
867
|
+
def _update_scrollview(self, scrl_v, *l):
|
|
868
|
+
self_tab_pos = self.tab_pos
|
|
869
|
+
self_tabs = self._tab_strip
|
|
870
|
+
if self_tab_pos[0] == 'b' or self_tab_pos[0] == 't':
|
|
871
|
+
# bottom or top
|
|
872
|
+
scrl_v.width = min(self.width, self_tabs.width)
|
|
873
|
+
# required for situations when scrl_v's pos is calculated
|
|
874
|
+
# when it has no parent
|
|
875
|
+
scrl_v.top += 1
|
|
876
|
+
scrl_v.top -= 1
|
|
877
|
+
else:
|
|
878
|
+
# left or right
|
|
879
|
+
scrl_v.width = min(self.height, self_tabs.width)
|
|
880
|
+
self_tabs.pos = (0, 0)
|