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/modules/console.py
ADDED
|
@@ -0,0 +1,1059 @@
|
|
|
1
|
+
# coding=utf-8
|
|
2
|
+
"""
|
|
3
|
+
Console
|
|
4
|
+
=======
|
|
5
|
+
|
|
6
|
+
.. versionadded:: 1.9.1
|
|
7
|
+
|
|
8
|
+
Reboot of the old inspector, designed to be modular and keep concerns
|
|
9
|
+
separated. It also has an addons architecture that allow you to add a button,
|
|
10
|
+
panel, or more in the Console itself.
|
|
11
|
+
|
|
12
|
+
.. warning::
|
|
13
|
+
|
|
14
|
+
This module works, but might fail in some cases. Please contribute!
|
|
15
|
+
|
|
16
|
+
Usage
|
|
17
|
+
-----
|
|
18
|
+
|
|
19
|
+
For normal module usage, please see the :mod:`~kivy.modules` documentation::
|
|
20
|
+
|
|
21
|
+
python main.py -m console
|
|
22
|
+
|
|
23
|
+
Mouse navigation
|
|
24
|
+
----------------
|
|
25
|
+
|
|
26
|
+
When the "Select" button is activated, you can:
|
|
27
|
+
|
|
28
|
+
- tap once on a widget to select it without leaving inspect mode
|
|
29
|
+
- double tap on a widget to select and leave inspect mode (then you can
|
|
30
|
+
manipulate the widget again)
|
|
31
|
+
|
|
32
|
+
Keyboard navigation
|
|
33
|
+
-------------------
|
|
34
|
+
|
|
35
|
+
- "Ctrl + e": toggle console
|
|
36
|
+
- "Escape": cancel widget lookup, then hide inspector view
|
|
37
|
+
- "Up": select the parent widget
|
|
38
|
+
- "Down": select the first child of the currently selected widget
|
|
39
|
+
- "Left": select the previous sibling
|
|
40
|
+
- "Right": select the next sibling
|
|
41
|
+
|
|
42
|
+
Additional information
|
|
43
|
+
----------------------
|
|
44
|
+
|
|
45
|
+
Some properties can be edited live. However, due to the delayed usage of
|
|
46
|
+
some properties, it might crash if you don't handle the required cases.
|
|
47
|
+
|
|
48
|
+
Addons
|
|
49
|
+
------
|
|
50
|
+
|
|
51
|
+
Addons must be added to `Console.addons` before the first Clock tick of the
|
|
52
|
+
application, or before :attr:`create_console` is called. You currently cannot
|
|
53
|
+
add addons on the fly. Addons are quite cheap until the Console is activated.
|
|
54
|
+
Panels are even cheaper as nothing is done until the user selects them.
|
|
55
|
+
|
|
56
|
+
We provide multiple addons activated by default:
|
|
57
|
+
|
|
58
|
+
- ConsoleAddonFps: display the FPS at the top-right
|
|
59
|
+
- ConsoleAddonSelect: activate the selection mode
|
|
60
|
+
- ConsoleAddonBreadcrumb: display the hierarchy of the current widget at the
|
|
61
|
+
bottom
|
|
62
|
+
- ConsoleAddonWidgetTree: panel to display the widget tree of the application
|
|
63
|
+
- ConsoleAddonWidgetPanel: panel to display the properties of the selected
|
|
64
|
+
widget
|
|
65
|
+
|
|
66
|
+
If you need to add custom widgets in the Console, please use either
|
|
67
|
+
:class:`ConsoleButton`, :class:`ConsoleToggleButton` or :class:`ConsoleLabel`.
|
|
68
|
+
|
|
69
|
+
An addon must inherit from the :class:`ConsoleAddon` class.
|
|
70
|
+
|
|
71
|
+
For example, here is a simple addon for displaying the FPS at the top/right
|
|
72
|
+
of the Console::
|
|
73
|
+
|
|
74
|
+
from kivy.modules.console import Console, ConsoleAddon
|
|
75
|
+
|
|
76
|
+
class ConsoleAddonFps(ConsoleAddon):
|
|
77
|
+
def init(self):
|
|
78
|
+
self.lbl = ConsoleLabel(text="0 Fps")
|
|
79
|
+
self.console.add_toolbar_widget(self.lbl, right=True)
|
|
80
|
+
|
|
81
|
+
def activate(self):
|
|
82
|
+
self.event = Clock.schedule_interval(self.update_fps, 1 / 2.)
|
|
83
|
+
|
|
84
|
+
def deactivated(self):
|
|
85
|
+
self.event.cancel()
|
|
86
|
+
|
|
87
|
+
def update_fps(self, *args):
|
|
88
|
+
fps = Clock.get_fps()
|
|
89
|
+
self.lbl.text = "{} Fps".format(int(fps))
|
|
90
|
+
|
|
91
|
+
Console.register_addon(ConsoleAddonFps)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
You can create addons that add panels. Panel activation/deactivation is not
|
|
95
|
+
tied to the addon activation/deactivation, but in some cases, you can use the
|
|
96
|
+
same callback for deactivating the addon and the panel. Here is a simple
|
|
97
|
+
"About" panel addon::
|
|
98
|
+
|
|
99
|
+
from kivy.modules.console import Console, ConsoleAddon, ConsoleLabel
|
|
100
|
+
|
|
101
|
+
class ConsoleAddonAbout(ConsoleAddon):
|
|
102
|
+
def init(self):
|
|
103
|
+
self.console.add_panel("About", self.panel_activate,
|
|
104
|
+
self.panel_deactivate)
|
|
105
|
+
|
|
106
|
+
def panel_activate(self):
|
|
107
|
+
self.console.bind(widget=self.update_content)
|
|
108
|
+
self.update_content()
|
|
109
|
+
|
|
110
|
+
def panel_deactivate(self):
|
|
111
|
+
self.console.unbind(widget=self.update_content)
|
|
112
|
+
|
|
113
|
+
def deactivate(self):
|
|
114
|
+
self.panel_deactivate()
|
|
115
|
+
|
|
116
|
+
def update_content(self, *args):
|
|
117
|
+
widget = self.console.widget
|
|
118
|
+
if not widget:
|
|
119
|
+
return
|
|
120
|
+
text = "Selected widget is: {!r}".format(widget)
|
|
121
|
+
lbl = ConsoleLabel(text=text)
|
|
122
|
+
self.console.set_content(lbl)
|
|
123
|
+
|
|
124
|
+
Console.register_addon(ConsoleAddonAbout)
|
|
125
|
+
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
__all__ = ("start", "stop", "create_console", "Console", "ConsoleAddon",
|
|
129
|
+
"ConsoleButton", "ConsoleToggleButton", "ConsoleLabel")
|
|
130
|
+
|
|
131
|
+
import kivy
|
|
132
|
+
kivy.require('1.9.0')
|
|
133
|
+
|
|
134
|
+
import weakref
|
|
135
|
+
from functools import partial
|
|
136
|
+
from itertools import chain
|
|
137
|
+
from kivy.logger import Logger
|
|
138
|
+
from kivy.uix.widget import Widget
|
|
139
|
+
from kivy.uix.button import Button
|
|
140
|
+
from kivy.uix.togglebutton import ToggleButton
|
|
141
|
+
from kivy.uix.label import Label
|
|
142
|
+
from kivy.uix.textinput import TextInput
|
|
143
|
+
from kivy.uix.image import Image
|
|
144
|
+
from kivy.uix.treeview import TreeViewNode, TreeView
|
|
145
|
+
from kivy.uix.gridlayout import GridLayout
|
|
146
|
+
from kivy.uix.relativelayout import RelativeLayout
|
|
147
|
+
from kivy.uix.boxlayout import BoxLayout
|
|
148
|
+
from kivy.uix.modalview import ModalView
|
|
149
|
+
from kivy.graphics import Color, Rectangle, PushMatrix, PopMatrix
|
|
150
|
+
from kivy.graphics.context_instructions import Transform
|
|
151
|
+
from kivy.graphics.transformation import Matrix
|
|
152
|
+
from kivy.properties import (ObjectProperty, BooleanProperty, ListProperty,
|
|
153
|
+
NumericProperty, StringProperty, OptionProperty,
|
|
154
|
+
ReferenceListProperty, AliasProperty,
|
|
155
|
+
VariableListProperty)
|
|
156
|
+
from kivy.graphics.texture import Texture
|
|
157
|
+
from kivy.clock import Clock
|
|
158
|
+
from kivy.lang import Builder
|
|
159
|
+
|
|
160
|
+
Builder.load_string("""
|
|
161
|
+
<Console>:
|
|
162
|
+
size_hint: (1, None) if self.mode == "docked" else (None, None)
|
|
163
|
+
height: dp(250)
|
|
164
|
+
|
|
165
|
+
canvas:
|
|
166
|
+
Color:
|
|
167
|
+
rgb: .185, .18, .18
|
|
168
|
+
Rectangle:
|
|
169
|
+
size: self.size
|
|
170
|
+
Color:
|
|
171
|
+
rgb: .3, .3, .3
|
|
172
|
+
Rectangle:
|
|
173
|
+
pos: 0, self.height - dp(48)
|
|
174
|
+
size: self.width, dp(48)
|
|
175
|
+
|
|
176
|
+
GridLayout:
|
|
177
|
+
cols: 1
|
|
178
|
+
id: layout
|
|
179
|
+
|
|
180
|
+
GridLayout:
|
|
181
|
+
id: toolbar
|
|
182
|
+
rows: 1
|
|
183
|
+
height: "48dp"
|
|
184
|
+
size_hint_y: None
|
|
185
|
+
padding: "4dp"
|
|
186
|
+
spacing: "4dp"
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
RelativeLayout:
|
|
190
|
+
id: content
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
<ConsoleAddonSeparator>:
|
|
194
|
+
size_hint_x: None
|
|
195
|
+
width: "10dp"
|
|
196
|
+
|
|
197
|
+
<ConsoleButton,ConsoleToggleButton,ConsoleLabel>:
|
|
198
|
+
size_hint_x: None
|
|
199
|
+
width: self.texture_size[0] + dp(20)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
<ConsoleAddonBreadcrumbView>:
|
|
203
|
+
size_hint_y: None
|
|
204
|
+
height: "48dp"
|
|
205
|
+
canvas:
|
|
206
|
+
Color:
|
|
207
|
+
rgb: .3, .3, .3
|
|
208
|
+
Rectangle:
|
|
209
|
+
size: self.size
|
|
210
|
+
ScrollView:
|
|
211
|
+
id: sv
|
|
212
|
+
do_scroll_y: False
|
|
213
|
+
GridLayout:
|
|
214
|
+
id: stack
|
|
215
|
+
rows: 1
|
|
216
|
+
size_hint_x: None
|
|
217
|
+
width: self.minimum_width
|
|
218
|
+
padding: "4dp"
|
|
219
|
+
spacing: "4dp"
|
|
220
|
+
|
|
221
|
+
<TreeViewProperty>:
|
|
222
|
+
height: max(dp(48), max(lkey.texture_size[1], ltext.texture_size[1]))
|
|
223
|
+
Label:
|
|
224
|
+
id: lkey
|
|
225
|
+
text: root.key
|
|
226
|
+
text_size: (self.width, None)
|
|
227
|
+
width: 150
|
|
228
|
+
size_hint_x: None
|
|
229
|
+
Label:
|
|
230
|
+
id: ltext
|
|
231
|
+
text: [repr(getattr(root.widget, root.key, '')), root.refresh][0]\
|
|
232
|
+
if root.widget else ''
|
|
233
|
+
text_size: (self.width, None)
|
|
234
|
+
|
|
235
|
+
<ConsoleAddonWidgetTreeView>:
|
|
236
|
+
ScrollView:
|
|
237
|
+
scroll_type: ['bars', 'content']
|
|
238
|
+
bar_width: '10dp'
|
|
239
|
+
|
|
240
|
+
ConsoleAddonWidgetTreeImpl:
|
|
241
|
+
id: widgettree
|
|
242
|
+
hide_root: True
|
|
243
|
+
size_hint: None, None
|
|
244
|
+
height: self.minimum_height
|
|
245
|
+
width: max(self.parent.width, self.minimum_width)
|
|
246
|
+
selected_widget: root.widget
|
|
247
|
+
on_select_widget: root.console.highlight_widget(args[1])
|
|
248
|
+
|
|
249
|
+
<-TreeViewWidget>:
|
|
250
|
+
height: self.texture_size[1] + sp(4)
|
|
251
|
+
size_hint_x: None
|
|
252
|
+
width: self.texture_size[0] + sp(4)
|
|
253
|
+
|
|
254
|
+
canvas.before:
|
|
255
|
+
Color:
|
|
256
|
+
rgba: self.color_selected if self.is_selected else (0, 0, 0, 0)
|
|
257
|
+
Rectangle:
|
|
258
|
+
pos: self.pos
|
|
259
|
+
size: self.size
|
|
260
|
+
Color:
|
|
261
|
+
rgba: 1, 1, 1, int(not self.is_leaf)
|
|
262
|
+
Rectangle:
|
|
263
|
+
source:
|
|
264
|
+
('atlas://data/images/defaulttheme/tree_%s' %
|
|
265
|
+
('opened' if self.is_open else 'closed'))
|
|
266
|
+
size: 16, 16
|
|
267
|
+
pos: self.x - 20, self.center_y - 8
|
|
268
|
+
|
|
269
|
+
canvas:
|
|
270
|
+
Color:
|
|
271
|
+
rgba:
|
|
272
|
+
(self.disabled_color if self.disabled else
|
|
273
|
+
(self.color if not self.markup else (1, 1, 1, 1)))
|
|
274
|
+
Rectangle:
|
|
275
|
+
texture: self.texture
|
|
276
|
+
size: self.texture_size
|
|
277
|
+
pos:
|
|
278
|
+
(int(self.center_x - self.texture_size[0] / 2.),
|
|
279
|
+
int(self.center_y - self.texture_size[1] / 2.))
|
|
280
|
+
|
|
281
|
+
""")
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def ignore_exception(f):
|
|
285
|
+
def f2(*args, **kwargs):
|
|
286
|
+
try:
|
|
287
|
+
return f(*args, **kwargs)
|
|
288
|
+
except:
|
|
289
|
+
pass
|
|
290
|
+
|
|
291
|
+
return f2
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
class TreeViewProperty(BoxLayout, TreeViewNode):
|
|
295
|
+
key = ObjectProperty(None, allownone=True)
|
|
296
|
+
refresh = BooleanProperty(False)
|
|
297
|
+
widget_ref = ObjectProperty(None, allownone=True)
|
|
298
|
+
|
|
299
|
+
def _get_widget(self):
|
|
300
|
+
wr = self.widget_ref
|
|
301
|
+
if wr is None:
|
|
302
|
+
return None
|
|
303
|
+
wr = wr()
|
|
304
|
+
if wr is None:
|
|
305
|
+
self.widget_ref = None
|
|
306
|
+
return None
|
|
307
|
+
return wr
|
|
308
|
+
|
|
309
|
+
widget = AliasProperty(_get_widget, None, bind=('widget_ref', ))
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
class ConsoleButton(Button):
|
|
313
|
+
"""Button specialized for the Console"""
|
|
314
|
+
pass
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
class ConsoleToggleButton(ToggleButton):
|
|
318
|
+
"""ToggleButton specialized for the Console"""
|
|
319
|
+
pass
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
class ConsoleLabel(Label):
|
|
323
|
+
"""LabelButton specialized for the Console"""
|
|
324
|
+
pass
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
class ConsoleAddonSeparator(Widget):
|
|
328
|
+
pass
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
class ConsoleAddon(object):
|
|
332
|
+
"""Base class for implementing addons"""
|
|
333
|
+
|
|
334
|
+
#: Console instance
|
|
335
|
+
console = None
|
|
336
|
+
|
|
337
|
+
def __init__(self, console):
|
|
338
|
+
super(ConsoleAddon, self).__init__()
|
|
339
|
+
self.console = console
|
|
340
|
+
self.init()
|
|
341
|
+
|
|
342
|
+
def init(self):
|
|
343
|
+
"""Method called when the addon is instantiated by the Console
|
|
344
|
+
"""
|
|
345
|
+
pass
|
|
346
|
+
|
|
347
|
+
def activate(self):
|
|
348
|
+
"""Method called when the addon is activated by the console
|
|
349
|
+
(when the console is displayed)"""
|
|
350
|
+
pass
|
|
351
|
+
|
|
352
|
+
def deactivate(self):
|
|
353
|
+
"""Method called when the addon is deactivated by the console
|
|
354
|
+
(when the console is hidden)
|
|
355
|
+
"""
|
|
356
|
+
pass
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
class ConsoleAddonMode(ConsoleAddon):
|
|
360
|
+
def init(self):
|
|
361
|
+
btn = ConsoleToggleButton(text=u"Docked")
|
|
362
|
+
self.console.add_toolbar_widget(btn)
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
class ConsoleAddonSelect(ConsoleAddon):
|
|
366
|
+
def init(self):
|
|
367
|
+
self.btn = ConsoleToggleButton(text=u"Select")
|
|
368
|
+
self.btn.bind(state=self.on_button_state)
|
|
369
|
+
self.console.add_toolbar_widget(self.btn)
|
|
370
|
+
self.console.bind(inspect_enabled=self.on_inspect_enabled)
|
|
371
|
+
|
|
372
|
+
def on_inspect_enabled(self, instance, value):
|
|
373
|
+
self.btn.state = "down" if value else "normal"
|
|
374
|
+
|
|
375
|
+
def on_button_state(self, instance, value):
|
|
376
|
+
self.console.inspect_enabled = (value == "down")
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
class ConsoleAddonFps(ConsoleAddon):
|
|
380
|
+
|
|
381
|
+
_update_ev = None
|
|
382
|
+
|
|
383
|
+
def init(self):
|
|
384
|
+
self.lbl = ConsoleLabel(text="0 Fps")
|
|
385
|
+
self.console.add_toolbar_widget(self.lbl, right=True)
|
|
386
|
+
|
|
387
|
+
def activate(self):
|
|
388
|
+
ev = self._update_ev
|
|
389
|
+
if ev is None:
|
|
390
|
+
self._update_ev = Clock.schedule_interval(self.update_fps, 1 / 2.)
|
|
391
|
+
else:
|
|
392
|
+
ev()
|
|
393
|
+
|
|
394
|
+
def deactivated(self):
|
|
395
|
+
if self._update_ev is not None:
|
|
396
|
+
self._update_ev.cancel()
|
|
397
|
+
|
|
398
|
+
def update_fps(self, *args):
|
|
399
|
+
fps = Clock.get_fps()
|
|
400
|
+
self.lbl.text = "{} Fps".format(int(fps))
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
class ConsoleAddonBreadcrumbView(RelativeLayout):
|
|
404
|
+
widget = ObjectProperty(None, allownone=True)
|
|
405
|
+
parents = []
|
|
406
|
+
|
|
407
|
+
def on_widget(self, instance, value):
|
|
408
|
+
stack = self.ids.stack
|
|
409
|
+
|
|
410
|
+
# determine if we can just highlight the current one
|
|
411
|
+
# or if we need to rebuild the breadcrumb
|
|
412
|
+
prefs = [btn.widget_ref() for btn in self.parents]
|
|
413
|
+
if value in prefs:
|
|
414
|
+
# ok, so just toggle this one instead.
|
|
415
|
+
index = prefs.index(value)
|
|
416
|
+
for btn in self.parents:
|
|
417
|
+
btn.state = "normal"
|
|
418
|
+
self.parents[index].state = "down"
|
|
419
|
+
return
|
|
420
|
+
|
|
421
|
+
# we need to rebuild the breadcrumb.
|
|
422
|
+
stack.clear_widgets()
|
|
423
|
+
if not value:
|
|
424
|
+
return
|
|
425
|
+
widget = value
|
|
426
|
+
parents = []
|
|
427
|
+
while True:
|
|
428
|
+
btn = ConsoleButton(text=widget.__class__.__name__)
|
|
429
|
+
btn.widget_ref = weakref.ref(widget)
|
|
430
|
+
btn.bind(on_release=self.highlight_widget)
|
|
431
|
+
parents.append(btn)
|
|
432
|
+
if widget == widget.parent:
|
|
433
|
+
break
|
|
434
|
+
widget = widget.parent
|
|
435
|
+
for btn in reversed(parents):
|
|
436
|
+
stack.add_widget(btn)
|
|
437
|
+
self.ids.sv.scroll_x = 1
|
|
438
|
+
self.parents = parents
|
|
439
|
+
btn.state = "down"
|
|
440
|
+
|
|
441
|
+
def highlight_widget(self, instance):
|
|
442
|
+
self.console.widget = instance.widget_ref()
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
class ConsoleAddonBreadcrumb(ConsoleAddon):
|
|
446
|
+
def init(self):
|
|
447
|
+
self.view = ConsoleAddonBreadcrumbView()
|
|
448
|
+
self.view.console = self.console
|
|
449
|
+
self.console.ids.layout.add_widget(self.view)
|
|
450
|
+
|
|
451
|
+
def activate(self):
|
|
452
|
+
self.console.bind(widget=self.update_content)
|
|
453
|
+
self.update_content()
|
|
454
|
+
|
|
455
|
+
def deactivate(self):
|
|
456
|
+
self.console.unbind(widget=self.update_content)
|
|
457
|
+
|
|
458
|
+
def update_content(self, *args):
|
|
459
|
+
self.view.widget = self.console.widget
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
class ConsoleAddonWidgetPanel(ConsoleAddon):
|
|
463
|
+
def init(self):
|
|
464
|
+
self.console.add_panel("Properties", self.panel_activate,
|
|
465
|
+
self.deactivate)
|
|
466
|
+
|
|
467
|
+
def panel_activate(self):
|
|
468
|
+
self.console.bind(widget=self.update_content)
|
|
469
|
+
self.update_content()
|
|
470
|
+
|
|
471
|
+
def deactivate(self):
|
|
472
|
+
self.console.unbind(widget=self.update_content)
|
|
473
|
+
|
|
474
|
+
def update_content(self, *args):
|
|
475
|
+
widget = self.console.widget
|
|
476
|
+
if not widget:
|
|
477
|
+
return
|
|
478
|
+
|
|
479
|
+
from kivy.uix.scrollview import ScrollView
|
|
480
|
+
self.root = root = BoxLayout()
|
|
481
|
+
self.sv = sv = ScrollView(scroll_type=["bars", "content"],
|
|
482
|
+
bar_width='10dp')
|
|
483
|
+
treeview = TreeView(hide_root=True, size_hint_y=None)
|
|
484
|
+
treeview.bind(minimum_height=treeview.setter("height"))
|
|
485
|
+
keys = list(widget.properties().keys())
|
|
486
|
+
keys.sort()
|
|
487
|
+
node = None
|
|
488
|
+
wk_widget = weakref.ref(widget)
|
|
489
|
+
for key in keys:
|
|
490
|
+
node = TreeViewProperty(key=key, widget_ref=wk_widget)
|
|
491
|
+
node.bind(is_selected=self.show_property)
|
|
492
|
+
try:
|
|
493
|
+
widget.bind(**{
|
|
494
|
+
key: partial(self.update_node_content, weakref.ref(node))
|
|
495
|
+
})
|
|
496
|
+
except:
|
|
497
|
+
pass
|
|
498
|
+
treeview.add_node(node)
|
|
499
|
+
|
|
500
|
+
root.add_widget(sv)
|
|
501
|
+
sv.add_widget(treeview)
|
|
502
|
+
self.console.set_content(root)
|
|
503
|
+
|
|
504
|
+
def show_property(self, instance, value, key=None, index=-1, *l):
|
|
505
|
+
# normal call: (tree node, focus, )
|
|
506
|
+
# nested call: (widget, prop value, prop key, index in dict/list)
|
|
507
|
+
if value is False:
|
|
508
|
+
return
|
|
509
|
+
|
|
510
|
+
console = self.console
|
|
511
|
+
content = None
|
|
512
|
+
if key is None:
|
|
513
|
+
# normal call
|
|
514
|
+
nested = False
|
|
515
|
+
widget = instance.widget
|
|
516
|
+
key = instance.key
|
|
517
|
+
prop = widget.property(key)
|
|
518
|
+
value = getattr(widget, key)
|
|
519
|
+
else:
|
|
520
|
+
# nested call, we might edit subvalue
|
|
521
|
+
nested = True
|
|
522
|
+
widget = instance
|
|
523
|
+
prop = None
|
|
524
|
+
|
|
525
|
+
dtype = None
|
|
526
|
+
|
|
527
|
+
if isinstance(prop, AliasProperty) or nested:
|
|
528
|
+
# trying to resolve type dynamically
|
|
529
|
+
if type(value) in (str, str):
|
|
530
|
+
dtype = 'string'
|
|
531
|
+
elif type(value) in (int, float):
|
|
532
|
+
dtype = 'numeric'
|
|
533
|
+
elif type(value) in (tuple, list):
|
|
534
|
+
dtype = 'list'
|
|
535
|
+
|
|
536
|
+
if isinstance(prop, NumericProperty) or dtype == 'numeric':
|
|
537
|
+
content = TextInput(text=str(value) or '', multiline=False)
|
|
538
|
+
content.bind(
|
|
539
|
+
text=partial(self.save_property_numeric, widget, key, index))
|
|
540
|
+
|
|
541
|
+
elif isinstance(prop, StringProperty) or dtype == 'string':
|
|
542
|
+
content = TextInput(text=value or '', multiline=True)
|
|
543
|
+
content.bind(
|
|
544
|
+
text=partial(self.save_property_text, widget, key, index))
|
|
545
|
+
|
|
546
|
+
elif (isinstance(prop, ListProperty) or
|
|
547
|
+
isinstance(prop, ReferenceListProperty) or
|
|
548
|
+
isinstance(prop, VariableListProperty) or dtype == 'list'):
|
|
549
|
+
content = GridLayout(cols=1, size_hint_y=None)
|
|
550
|
+
content.bind(minimum_height=content.setter('height'))
|
|
551
|
+
for i, item in enumerate(value):
|
|
552
|
+
button = Button(text=repr(item), size_hint_y=None, height=44)
|
|
553
|
+
if isinstance(item, Widget):
|
|
554
|
+
button.bind(on_release=partial(console.highlight_widget,
|
|
555
|
+
item, False))
|
|
556
|
+
else:
|
|
557
|
+
button.bind(on_release=partial(self.show_property, widget,
|
|
558
|
+
item, key, i))
|
|
559
|
+
content.add_widget(button)
|
|
560
|
+
|
|
561
|
+
elif isinstance(prop, OptionProperty):
|
|
562
|
+
content = GridLayout(cols=1, size_hint_y=None)
|
|
563
|
+
content.bind(minimum_height=content.setter('height'))
|
|
564
|
+
for option in prop.options:
|
|
565
|
+
button = ToggleButton(
|
|
566
|
+
text=option,
|
|
567
|
+
state='down' if option == value else 'normal',
|
|
568
|
+
group=repr(content.uid),
|
|
569
|
+
size_hint_y=None,
|
|
570
|
+
height=44)
|
|
571
|
+
button.bind(
|
|
572
|
+
on_press=partial(self.save_property_option, widget, key))
|
|
573
|
+
content.add_widget(button)
|
|
574
|
+
|
|
575
|
+
elif isinstance(prop, ObjectProperty):
|
|
576
|
+
if isinstance(value, Widget):
|
|
577
|
+
content = Button(text=repr(value))
|
|
578
|
+
content.bind(
|
|
579
|
+
on_release=partial(console.highlight_widget, value))
|
|
580
|
+
elif isinstance(value, Texture):
|
|
581
|
+
content = Image(texture=value)
|
|
582
|
+
else:
|
|
583
|
+
content = Label(text=repr(value))
|
|
584
|
+
|
|
585
|
+
elif isinstance(prop, BooleanProperty):
|
|
586
|
+
state = 'down' if value else 'normal'
|
|
587
|
+
content = ToggleButton(text=key, state=state)
|
|
588
|
+
content.bind(on_release=partial(self.save_property_boolean, widget,
|
|
589
|
+
key, index))
|
|
590
|
+
|
|
591
|
+
self.root.clear_widgets()
|
|
592
|
+
self.root.add_widget(self.sv)
|
|
593
|
+
if content:
|
|
594
|
+
self.root.add_widget(content)
|
|
595
|
+
|
|
596
|
+
@ignore_exception
|
|
597
|
+
def save_property_numeric(self, widget, key, index, instance, value):
|
|
598
|
+
if index >= 0:
|
|
599
|
+
getattr(widget, key)[index] = float(instance.text)
|
|
600
|
+
else:
|
|
601
|
+
setattr(widget, key, float(instance.text))
|
|
602
|
+
|
|
603
|
+
@ignore_exception
|
|
604
|
+
def save_property_text(self, widget, key, index, instance, value):
|
|
605
|
+
if index >= 0:
|
|
606
|
+
getattr(widget, key)[index] = instance.text
|
|
607
|
+
else:
|
|
608
|
+
setattr(widget, key, instance.text)
|
|
609
|
+
|
|
610
|
+
@ignore_exception
|
|
611
|
+
def save_property_boolean(self, widget, key, index, instance, ):
|
|
612
|
+
value = instance.state == 'down'
|
|
613
|
+
if index >= 0:
|
|
614
|
+
getattr(widget, key)[index] = value
|
|
615
|
+
else:
|
|
616
|
+
setattr(widget, key, value)
|
|
617
|
+
|
|
618
|
+
@ignore_exception
|
|
619
|
+
def save_property_option(self, widget, key, instance, *l):
|
|
620
|
+
setattr(widget, key, instance.text)
|
|
621
|
+
|
|
622
|
+
|
|
623
|
+
class TreeViewWidget(Label, TreeViewNode):
|
|
624
|
+
widget = ObjectProperty(None)
|
|
625
|
+
|
|
626
|
+
|
|
627
|
+
class ConsoleAddonWidgetTreeImpl(TreeView):
|
|
628
|
+
selected_widget = ObjectProperty(None, allownone=True)
|
|
629
|
+
|
|
630
|
+
__events__ = ('on_select_widget', )
|
|
631
|
+
|
|
632
|
+
def __init__(self, **kwargs):
|
|
633
|
+
super(ConsoleAddonWidgetTreeImpl, self).__init__(**kwargs)
|
|
634
|
+
self.update_scroll = Clock.create_trigger(self._update_scroll)
|
|
635
|
+
|
|
636
|
+
def find_node_by_widget(self, widget):
|
|
637
|
+
for node in self.iterate_all_nodes():
|
|
638
|
+
if not node.parent_node:
|
|
639
|
+
continue
|
|
640
|
+
try:
|
|
641
|
+
if node.widget == widget:
|
|
642
|
+
return node
|
|
643
|
+
except ReferenceError:
|
|
644
|
+
pass
|
|
645
|
+
return None
|
|
646
|
+
|
|
647
|
+
def update_selected_widget(self, widget):
|
|
648
|
+
if widget:
|
|
649
|
+
node = self.find_node_by_widget(widget)
|
|
650
|
+
if node:
|
|
651
|
+
self.select_node(node, False)
|
|
652
|
+
while node and isinstance(node, TreeViewWidget):
|
|
653
|
+
if not node.is_open:
|
|
654
|
+
self.toggle_node(node)
|
|
655
|
+
node = node.parent_node
|
|
656
|
+
|
|
657
|
+
def on_selected_widget(self, inst, widget):
|
|
658
|
+
if widget:
|
|
659
|
+
self.update_selected_widget(widget)
|
|
660
|
+
self.update_scroll()
|
|
661
|
+
|
|
662
|
+
def select_node(self, node, select_widget=True):
|
|
663
|
+
super(ConsoleAddonWidgetTreeImpl, self).select_node(node)
|
|
664
|
+
if select_widget:
|
|
665
|
+
try:
|
|
666
|
+
self.dispatch("on_select_widget", node.widget.__self__)
|
|
667
|
+
except ReferenceError:
|
|
668
|
+
pass
|
|
669
|
+
|
|
670
|
+
def on_select_widget(self, widget):
|
|
671
|
+
pass
|
|
672
|
+
|
|
673
|
+
def _update_scroll(self, *args):
|
|
674
|
+
node = self._selected_node
|
|
675
|
+
if not node:
|
|
676
|
+
return
|
|
677
|
+
|
|
678
|
+
self.parent.scroll_to(node)
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
class ConsoleAddonWidgetTreeView(RelativeLayout):
|
|
682
|
+
widget = ObjectProperty(None, allownone=True)
|
|
683
|
+
_window_node = None
|
|
684
|
+
|
|
685
|
+
def _update_widget_tree_node(self, node, widget, is_open=False):
|
|
686
|
+
tree = self.ids.widgettree
|
|
687
|
+
update_nodes = []
|
|
688
|
+
nodes = {}
|
|
689
|
+
for cnode in node.nodes[:]:
|
|
690
|
+
try:
|
|
691
|
+
nodes[cnode.widget] = cnode
|
|
692
|
+
except ReferenceError:
|
|
693
|
+
# widget no longer exists, just remove it
|
|
694
|
+
pass
|
|
695
|
+
tree.remove_node(cnode)
|
|
696
|
+
for child in widget.children:
|
|
697
|
+
if isinstance(child, Console):
|
|
698
|
+
continue
|
|
699
|
+
if child in nodes:
|
|
700
|
+
cnode = tree.add_node(nodes[child], node)
|
|
701
|
+
else:
|
|
702
|
+
cnode = tree.add_node(
|
|
703
|
+
TreeViewWidget(text=child.__class__.__name__,
|
|
704
|
+
widget=child.proxy_ref,
|
|
705
|
+
is_open=is_open), node)
|
|
706
|
+
update_nodes.append((cnode, child))
|
|
707
|
+
return update_nodes
|
|
708
|
+
|
|
709
|
+
def update_widget_tree(self, *args):
|
|
710
|
+
win = self.console.win
|
|
711
|
+
if not self._window_node:
|
|
712
|
+
self._window_node = self.ids.widgettree.add_node(
|
|
713
|
+
TreeViewWidget(text="Window",
|
|
714
|
+
widget=win,
|
|
715
|
+
is_open=True))
|
|
716
|
+
|
|
717
|
+
nodes = self._update_widget_tree_node(self._window_node, win,
|
|
718
|
+
is_open=True)
|
|
719
|
+
while nodes:
|
|
720
|
+
ntmp = nodes[:]
|
|
721
|
+
nodes = []
|
|
722
|
+
for node in ntmp:
|
|
723
|
+
nodes += self._update_widget_tree_node(*node)
|
|
724
|
+
|
|
725
|
+
self.ids.widgettree.update_selected_widget(self.widget)
|
|
726
|
+
|
|
727
|
+
|
|
728
|
+
class ConsoleAddonWidgetTree(ConsoleAddon):
|
|
729
|
+
def init(self):
|
|
730
|
+
self.content = None
|
|
731
|
+
self.console.add_panel("Tree", self.panel_activate, self.deactivate,
|
|
732
|
+
self.panel_refresh)
|
|
733
|
+
|
|
734
|
+
def panel_activate(self):
|
|
735
|
+
self.console.bind(widget=self.update_content)
|
|
736
|
+
self.update_content()
|
|
737
|
+
|
|
738
|
+
def deactivate(self):
|
|
739
|
+
if self.content:
|
|
740
|
+
self.content.widget = None
|
|
741
|
+
self.content.console = None
|
|
742
|
+
self.console.unbind(widget=self.update_content)
|
|
743
|
+
|
|
744
|
+
def update_content(self, *args):
|
|
745
|
+
widget = self.console.widget
|
|
746
|
+
if not self.content:
|
|
747
|
+
self.content = ConsoleAddonWidgetTreeView()
|
|
748
|
+
self.content.console = self.console
|
|
749
|
+
self.content.widget = widget
|
|
750
|
+
self.content.update_widget_tree()
|
|
751
|
+
self.console.set_content(self.content)
|
|
752
|
+
|
|
753
|
+
def panel_refresh(self):
|
|
754
|
+
if self.content:
|
|
755
|
+
self.content.update_widget_tree()
|
|
756
|
+
|
|
757
|
+
|
|
758
|
+
class Console(RelativeLayout):
|
|
759
|
+
"""Console interface
|
|
760
|
+
|
|
761
|
+
This widget is created by create_console(), when the module is loaded.
|
|
762
|
+
During that time, you can add addons on the console to extend the
|
|
763
|
+
functionalities, or add your own application stats / debugging module.
|
|
764
|
+
"""
|
|
765
|
+
|
|
766
|
+
#: Array of addons that will be created at Console creation
|
|
767
|
+
addons = [ # ConsoleAddonMode,
|
|
768
|
+
ConsoleAddonSelect, ConsoleAddonFps, ConsoleAddonWidgetPanel,
|
|
769
|
+
ConsoleAddonWidgetTree, ConsoleAddonBreadcrumb]
|
|
770
|
+
|
|
771
|
+
#: Display mode of the Console, either docked at the bottom, or as a
|
|
772
|
+
#: floating window.
|
|
773
|
+
mode = OptionProperty("docked", options=["docked", "floated"])
|
|
774
|
+
|
|
775
|
+
#: Current widget being selected
|
|
776
|
+
widget = ObjectProperty(None, allownone=True)
|
|
777
|
+
|
|
778
|
+
#: Indicate if the inspector inspection is enabled. If yes, the next
|
|
779
|
+
#: touch down will select a the widget under the touch
|
|
780
|
+
inspect_enabled = BooleanProperty(False)
|
|
781
|
+
|
|
782
|
+
#: True if the Console is activated (showed)
|
|
783
|
+
activated = BooleanProperty(False)
|
|
784
|
+
|
|
785
|
+
def __init__(self, **kwargs):
|
|
786
|
+
self.win = kwargs.pop('win', None)
|
|
787
|
+
super(Console, self).__init__(**kwargs)
|
|
788
|
+
self.avoid_bring_to_top = False
|
|
789
|
+
with self.canvas.before:
|
|
790
|
+
self.gcolor = Color(1, 0, 0, .25)
|
|
791
|
+
PushMatrix()
|
|
792
|
+
self.gtransform = Transform(Matrix())
|
|
793
|
+
self.grect = Rectangle(size=(0, 0))
|
|
794
|
+
PopMatrix()
|
|
795
|
+
Clock.schedule_interval(self.update_widget_graphics, 0)
|
|
796
|
+
|
|
797
|
+
# instantiate all addons
|
|
798
|
+
self._toolbar = {"left": [], "panels": [], "right": []}
|
|
799
|
+
self._addons = []
|
|
800
|
+
self._panel = None
|
|
801
|
+
for addon in self.addons:
|
|
802
|
+
instance = addon(self)
|
|
803
|
+
self._addons.append(instance)
|
|
804
|
+
self._init_toolbar()
|
|
805
|
+
# select the first panel
|
|
806
|
+
self._panel = self._toolbar["panels"][0]
|
|
807
|
+
self._panel.state = "down"
|
|
808
|
+
self._panel.cb_activate()
|
|
809
|
+
|
|
810
|
+
def _init_toolbar(self):
|
|
811
|
+
toolbar = self.ids.toolbar
|
|
812
|
+
for key in ("left", "panels", "right"):
|
|
813
|
+
if key == "right":
|
|
814
|
+
toolbar.add_widget(Widget())
|
|
815
|
+
for el in self._toolbar[key]:
|
|
816
|
+
toolbar.add_widget(el)
|
|
817
|
+
if key != "right":
|
|
818
|
+
toolbar.add_widget(ConsoleAddonSeparator())
|
|
819
|
+
|
|
820
|
+
@classmethod
|
|
821
|
+
def register_addon(cls, addon):
|
|
822
|
+
cls.addons.append(addon)
|
|
823
|
+
|
|
824
|
+
def add_toolbar_widget(self, widget, right=False):
|
|
825
|
+
"""Add a widget in the top left toolbar of the Console.
|
|
826
|
+
Use `right=True` if you wanna add the widget at the right instead.
|
|
827
|
+
"""
|
|
828
|
+
key = "right" if right else "left"
|
|
829
|
+
self._toolbar[key].append(widget)
|
|
830
|
+
|
|
831
|
+
def remove_toolbar_widget(self, widget):
|
|
832
|
+
"""Remove a widget from the toolbar
|
|
833
|
+
"""
|
|
834
|
+
self.ids.toolbar.remove_widget(widget)
|
|
835
|
+
|
|
836
|
+
def add_panel(self, name, cb_activate, cb_deactivate, cb_refresh=None):
|
|
837
|
+
"""Add a new panel in the Console.
|
|
838
|
+
|
|
839
|
+
- `cb_activate` is a callable that will be called when the panel is
|
|
840
|
+
activated by the user.
|
|
841
|
+
|
|
842
|
+
- `cb_deactivate` is a callable that will be called when the panel is
|
|
843
|
+
deactivated or when the console will hide.
|
|
844
|
+
|
|
845
|
+
- `cb_refresh` is an optional callable that is called if the user
|
|
846
|
+
click again on the button for display the panel
|
|
847
|
+
|
|
848
|
+
When activated, it's up to the panel to display a content in the
|
|
849
|
+
Console by using :meth:`set_content`.
|
|
850
|
+
"""
|
|
851
|
+
btn = ConsoleToggleButton(text=name)
|
|
852
|
+
btn.cb_activate = cb_activate
|
|
853
|
+
btn.cb_deactivate = cb_deactivate
|
|
854
|
+
btn.cb_refresh = cb_refresh
|
|
855
|
+
btn.bind(on_press=self._activate_panel)
|
|
856
|
+
self._toolbar["panels"].append(btn)
|
|
857
|
+
|
|
858
|
+
def _activate_panel(self, instance):
|
|
859
|
+
if self._panel != instance:
|
|
860
|
+
self._panel.cb_deactivate()
|
|
861
|
+
self._panel.state = "normal"
|
|
862
|
+
self.ids.content.clear_widgets()
|
|
863
|
+
self._panel = instance
|
|
864
|
+
self._panel.cb_activate()
|
|
865
|
+
self._panel.state = "down"
|
|
866
|
+
else:
|
|
867
|
+
self._panel.state = "down"
|
|
868
|
+
if self._panel.cb_refresh:
|
|
869
|
+
self._panel.cb_refresh()
|
|
870
|
+
|
|
871
|
+
def set_content(self, content):
|
|
872
|
+
"""Replace the Console content with a new one.
|
|
873
|
+
"""
|
|
874
|
+
self.ids.content.clear_widgets()
|
|
875
|
+
self.ids.content.add_widget(content)
|
|
876
|
+
|
|
877
|
+
def on_touch_down(self, touch):
|
|
878
|
+
ret = super(Console, self).on_touch_down(touch)
|
|
879
|
+
if (('button' not in touch.profile or touch.button == 'left') and
|
|
880
|
+
not ret and self.inspect_enabled):
|
|
881
|
+
self.highlight_at(*touch.pos)
|
|
882
|
+
if touch.is_double_tap:
|
|
883
|
+
self.inspect_enabled = False
|
|
884
|
+
ret = True
|
|
885
|
+
else:
|
|
886
|
+
ret = self.collide_point(*touch.pos)
|
|
887
|
+
return ret
|
|
888
|
+
|
|
889
|
+
def on_touch_move(self, touch):
|
|
890
|
+
ret = super(Console, self).on_touch_move(touch)
|
|
891
|
+
if not ret and self.inspect_enabled:
|
|
892
|
+
self.highlight_at(*touch.pos)
|
|
893
|
+
ret = True
|
|
894
|
+
return ret
|
|
895
|
+
|
|
896
|
+
def on_touch_up(self, touch):
|
|
897
|
+
ret = super(Console, self).on_touch_up(touch)
|
|
898
|
+
if not ret and self.inspect_enabled:
|
|
899
|
+
ret = True
|
|
900
|
+
return ret
|
|
901
|
+
|
|
902
|
+
def on_window_children(self, win, children):
|
|
903
|
+
if self.avoid_bring_to_top or not self.activated:
|
|
904
|
+
return
|
|
905
|
+
self.avoid_bring_to_top = True
|
|
906
|
+
win.remove_widget(self)
|
|
907
|
+
win.add_widget(self)
|
|
908
|
+
self.avoid_bring_to_top = False
|
|
909
|
+
|
|
910
|
+
def highlight_at(self, x, y):
|
|
911
|
+
"""Select a widget from a x/y window coordinate.
|
|
912
|
+
This is mostly used internally when Select mode is activated
|
|
913
|
+
"""
|
|
914
|
+
widget = None
|
|
915
|
+
# reverse the loop - look at children on top first and
|
|
916
|
+
# modalviews before others
|
|
917
|
+
win_children = self.win.children
|
|
918
|
+
children = chain((c for c in reversed(win_children)
|
|
919
|
+
if isinstance(c, ModalView)),
|
|
920
|
+
(c for c in reversed(win_children)
|
|
921
|
+
if not isinstance(c, ModalView)))
|
|
922
|
+
for child in children:
|
|
923
|
+
if child is self:
|
|
924
|
+
continue
|
|
925
|
+
widget = self.pick(child, x, y)
|
|
926
|
+
if widget:
|
|
927
|
+
break
|
|
928
|
+
self.highlight_widget(widget)
|
|
929
|
+
|
|
930
|
+
def highlight_widget(self, widget, *largs):
|
|
931
|
+
# no widget to highlight, reduce rectangle to 0, 0
|
|
932
|
+
self.widget = widget
|
|
933
|
+
if not widget:
|
|
934
|
+
self.grect.size = 0, 0
|
|
935
|
+
|
|
936
|
+
def update_widget_graphics(self, *l):
|
|
937
|
+
if not self.activated:
|
|
938
|
+
return
|
|
939
|
+
if self.widget is None:
|
|
940
|
+
self.grect.size = 0, 0
|
|
941
|
+
return
|
|
942
|
+
self.grect.size = self.widget.size
|
|
943
|
+
matrix = self.widget.get_window_matrix()
|
|
944
|
+
if self.gtransform.matrix.get() != matrix.get():
|
|
945
|
+
self.gtransform.matrix = matrix
|
|
946
|
+
|
|
947
|
+
def pick(self, widget, x, y):
|
|
948
|
+
"""Pick a widget at x/y, given a root `widget`
|
|
949
|
+
"""
|
|
950
|
+
ret = None
|
|
951
|
+
# try to filter widgets that are not visible (invalid inspect target)
|
|
952
|
+
if (hasattr(widget, 'visible') and not widget.visible):
|
|
953
|
+
return ret
|
|
954
|
+
if widget.collide_point(x, y):
|
|
955
|
+
ret = widget
|
|
956
|
+
x2, y2 = widget.to_local(x, y)
|
|
957
|
+
# reverse the loop - look at children on top first
|
|
958
|
+
for child in reversed(widget.children):
|
|
959
|
+
ret = self.pick(child, x2, y2) or ret
|
|
960
|
+
return ret
|
|
961
|
+
|
|
962
|
+
def on_activated(self, instance, activated):
|
|
963
|
+
if activated:
|
|
964
|
+
self._activate_console()
|
|
965
|
+
else:
|
|
966
|
+
self._deactivate_console()
|
|
967
|
+
|
|
968
|
+
def _activate_console(self):
|
|
969
|
+
if self not in self.win.children:
|
|
970
|
+
self.win.add_widget(self)
|
|
971
|
+
self.y = 0
|
|
972
|
+
for addon in self._addons:
|
|
973
|
+
addon.activate()
|
|
974
|
+
Logger.info('Console: console activated')
|
|
975
|
+
|
|
976
|
+
def _deactivate_console(self):
|
|
977
|
+
for addon in self._addons:
|
|
978
|
+
addon.deactivate()
|
|
979
|
+
self.grect.size = 0, 0
|
|
980
|
+
self.y = -self.height
|
|
981
|
+
self.widget = None
|
|
982
|
+
self.inspect_enabled = False
|
|
983
|
+
# self.win.remove_widget(self)
|
|
984
|
+
self._window_node = None
|
|
985
|
+
Logger.info('Console: console deactivated')
|
|
986
|
+
|
|
987
|
+
def keyboard_shortcut(self, win, scancode, *largs):
|
|
988
|
+
modifiers = largs[-1]
|
|
989
|
+
if scancode == 101 and modifiers == ['ctrl']:
|
|
990
|
+
self.activated = not self.activated
|
|
991
|
+
if self.activated:
|
|
992
|
+
self.inspect_enabled = True
|
|
993
|
+
return True
|
|
994
|
+
|
|
995
|
+
elif scancode == 27:
|
|
996
|
+
if self.inspect_enabled:
|
|
997
|
+
self.inspect_enabled = False
|
|
998
|
+
return True
|
|
999
|
+
if self.activated:
|
|
1000
|
+
self.activated = False
|
|
1001
|
+
return True
|
|
1002
|
+
|
|
1003
|
+
if not self.activated or not self.widget:
|
|
1004
|
+
return
|
|
1005
|
+
|
|
1006
|
+
if scancode == 273: # top
|
|
1007
|
+
self.widget = self.widget.parent
|
|
1008
|
+
|
|
1009
|
+
elif scancode == 274: # down
|
|
1010
|
+
filtered_children = [c for c in self.widget.children
|
|
1011
|
+
if not isinstance(c, Console)]
|
|
1012
|
+
if filtered_children:
|
|
1013
|
+
self.widget = filtered_children[0]
|
|
1014
|
+
|
|
1015
|
+
elif scancode == 276: # left
|
|
1016
|
+
parent = self.widget.parent
|
|
1017
|
+
filtered_children = [c for c in parent.children
|
|
1018
|
+
if not isinstance(c, Console)]
|
|
1019
|
+
index = filtered_children.index(self.widget)
|
|
1020
|
+
index = max(0, index - 1)
|
|
1021
|
+
self.widget = filtered_children[index]
|
|
1022
|
+
|
|
1023
|
+
elif scancode == 275: # right
|
|
1024
|
+
parent = self.widget.parent
|
|
1025
|
+
filtered_children = [c for c in parent.children
|
|
1026
|
+
if not isinstance(c, Console)]
|
|
1027
|
+
index = filtered_children.index(self.widget)
|
|
1028
|
+
index = min(len(filtered_children) - 1, index + 1)
|
|
1029
|
+
self.widget = filtered_children[index]
|
|
1030
|
+
|
|
1031
|
+
|
|
1032
|
+
def create_console(win, ctx, *l):
|
|
1033
|
+
ctx.console = Console(win=win)
|
|
1034
|
+
win.bind(children=ctx.console.on_window_children,
|
|
1035
|
+
on_keyboard=ctx.console.keyboard_shortcut)
|
|
1036
|
+
|
|
1037
|
+
|
|
1038
|
+
def start(win, ctx):
|
|
1039
|
+
"""Create an Console instance attached to the *ctx* and bound to the
|
|
1040
|
+
Window's :meth:`~kivy.core.window.WindowBase.on_keyboard` event for
|
|
1041
|
+
capturing the keyboard shortcut.
|
|
1042
|
+
|
|
1043
|
+
:Parameters:
|
|
1044
|
+
`win`: A :class:`Window <kivy.core.window.WindowBase>`
|
|
1045
|
+
The application Window to bind to.
|
|
1046
|
+
`ctx`: A :class:`~kivy.uix.widget.Widget` or subclass
|
|
1047
|
+
The Widget to be inspected.
|
|
1048
|
+
|
|
1049
|
+
"""
|
|
1050
|
+
Clock.schedule_once(partial(create_console, win, ctx))
|
|
1051
|
+
|
|
1052
|
+
|
|
1053
|
+
def stop(win, ctx):
|
|
1054
|
+
"""Stop and unload any active Inspectors for the given *ctx*."""
|
|
1055
|
+
if hasattr(ctx, "console"):
|
|
1056
|
+
win.unbind(children=ctx.console.on_window_children,
|
|
1057
|
+
on_keyboard=ctx.console.keyboard_shortcut)
|
|
1058
|
+
win.remove_widget(ctx.console)
|
|
1059
|
+
del ctx.console
|