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.
Files changed (624) hide show
  1. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/main.py +77 -0
  2. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/monkey.obj +7966 -0
  3. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/objloader.py +147 -0
  4. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/simple.glsl +47 -0
  5. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/RST_Editor/editor.kv +72 -0
  6. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/RST_Editor/main.py +64 -0
  7. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/android.txt +3 -0
  8. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/compass.kv +25 -0
  9. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/main.py +77 -0
  10. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/needle.png +0 -0
  11. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/rose.png +0 -0
  12. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/android.txt +3 -0
  13. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/main.py +80 -0
  14. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/shadow32.png +0 -0
  15. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/takepicture.kv +40 -0
  16. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/animation/animate.py +42 -0
  17. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_suite.py +152 -0
  18. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_suite_data/testkvdir.kv +4 -0
  19. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_build.py +24 -0
  20. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_config.py +49 -0
  21. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_kv.py +25 -0
  22. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_kv_in_template1.py +27 -0
  23. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/template1/test.kv +4 -0
  24. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/test.kv +4 -0
  25. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/testkvfile.kv +4 -0
  26. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/asyncio_advanced.py +90 -0
  27. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/asyncio_basic.py +59 -0
  28. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/trio_advanced.py +93 -0
  29. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/trio_basic.py +58 -0
  30. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12908_sweet_trip_mm_clap_hi.wav +0 -0
  31. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12909_sweet_trip_mm_clap_lo.wav +0 -0
  32. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12910_sweet_trip_mm_clap_mid.wav +0 -0
  33. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12911_sweet_trip_mm_hat_cl.wav +0 -0
  34. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12913_sweet_trip_mm_kick_hi.wav +0 -0
  35. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12914_sweet_trip_mm_kick_lo.wav +0 -0
  36. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12915_sweet_trip_mm_kick_mid.wav +0 -0
  37. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12916_sweet_trip_mm_kwik_mod_01.wav +0 -0
  38. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12917_sweet_trip_mm_kwik_mod_02.wav +0 -0
  39. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12918_sweet_trip_mm_kwik_mod_03.wav +0 -0
  40. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12919_sweet_trip_mm_kwik_mod_04.wav +0 -0
  41. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12920_sweet_trip_mm_kwik_mod_05.wav +0 -0
  42. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12921_sweet_trip_mm_kwik_mod_06.wav +0 -0
  43. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12922_sweet_trip_mm_kwik_mod_07.wav +0 -0
  44. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12923_sweet_trip_mm_metal_clave.wav +0 -0
  45. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12925_sweet_trip_mm_sweep_x.wav +0 -0
  46. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12926_sweet_trip_mm_sweep_y.wav +0 -0
  47. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12927_sweet_trip_mm_sweep_z.wav +0 -0
  48. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/audio.kv +59 -0
  49. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/main.py +81 -0
  50. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/pitch.py +42 -0
  51. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/camera/main.py +59 -0
  52. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/bezier.py +105 -0
  53. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/canvas_stress.py +72 -0
  54. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/circle.py +84 -0
  55. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/fbo_canvas.py +91 -0
  56. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/kiwi.jpg +0 -0
  57. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/lines.py +296 -0
  58. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/lines_extended.py +183 -0
  59. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mesh.py +57 -0
  60. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mesh_manipulation.py +101 -0
  61. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mtexture1.png +0 -0
  62. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mtexture2.png +0 -0
  63. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/multitexture.py +110 -0
  64. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/repeat_texture.py +65 -0
  65. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/rotation.py +35 -0
  66. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/rounded_rectangle.py +153 -0
  67. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/scale.py +37 -0
  68. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/stencil_canvas.py +85 -0
  69. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/tesselate.py +146 -0
  70. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/texture.py +143 -0
  71. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/texture_example_image.png +0 -0
  72. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/1.kv +28 -0
  73. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/2.kv +28 -0
  74. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/3.kv +28 -0
  75. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/root.kv +32 -0
  76. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/main.py +63 -0
  77. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/cover/cover_image.py +25 -0
  78. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/cover/cover_video.py +31 -0
  79. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/camera_puzzle.py +98 -0
  80. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/AnchorLayoutContainer.kv +15 -0
  81. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/BoxLayoutContainer.kv +14 -0
  82. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ButtonContainer.kv +27 -0
  83. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/CheckBoxContainer.kv +28 -0
  84. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/FileChooserContainer.kv +19 -0
  85. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/FloatLayoutContainer.kv +16 -0
  86. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/GridLayoutContainer.kv +20 -0
  87. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/LabelContainer.kv +62 -0
  88. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/MediaContainer.kv +9 -0
  89. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/PlaygroundContainer.kv +4 -0
  90. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/PopupContainer.kv +39 -0
  91. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ProgressBarContainer.kv +17 -0
  92. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/RestContainer.kv +5 -0
  93. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ScatterContainer.kv +16 -0
  94. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/SelectorsContainer.kv +10 -0
  95. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/StackLayoutContainer.kv +25 -0
  96. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/TextContainer.kv +20 -0
  97. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/kivycatalog.kv +144 -0
  98. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/main.py +192 -0
  99. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/gesturedatabase.kv +117 -0
  100. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/gesturedatabase.py +180 -0
  101. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/helpers.py +30 -0
  102. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/historymanager.kv +164 -0
  103. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/historymanager.py +276 -0
  104. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/main.py +144 -0
  105. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/multistroke.kv +101 -0
  106. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/settings.kv +110 -0
  107. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/settings.py +97 -0
  108. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/android.txt +3 -0
  109. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Bubbles.jpg +0 -0
  110. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Ill1.jpg +0 -0
  111. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Wall.jpg +0 -0
  112. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/faust_github.jpg +0 -0
  113. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/main.py +73 -0
  114. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/pictures.kv +57 -0
  115. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/shadow32.png +0 -0
  116. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/shadereditor/main.py +147 -0
  117. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/shadereditor/shadereditor.kv +39 -0
  118. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/README.txt +11 -0
  119. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/android.txt +3 -0
  120. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/background.png +0 -0
  121. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/faust_github.jpg +0 -0
  122. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/README +4 -0
  123. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/bug.png +0 -0
  124. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/chevron-left.png +0 -0
  125. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/chevron-right.png +0 -0
  126. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/accordions.kv +39 -0
  127. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/bubbles.kv +33 -0
  128. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/buttons.kv +26 -0
  129. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/carousel.kv +51 -0
  130. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/checkboxes.kv +33 -0
  131. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/codeinput.kv +9 -0
  132. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/dropdown.kv +40 -0
  133. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/filechoosers.kv +24 -0
  134. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/popups.kv +17 -0
  135. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/progressbar.kv +15 -0
  136. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/rstdocument.kv +24 -0
  137. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/scatter.kv +14 -0
  138. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/screenmanager.kv +46 -0
  139. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/sliders.kv +55 -0
  140. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/spinner.kv +11 -0
  141. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/splitter.kv +13 -0
  142. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/switches.kv +39 -0
  143. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/tabbedpanel + layouts.kv +69 -0
  144. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/textinputs.kv +48 -0
  145. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/togglebutton.kv +39 -0
  146. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/main.py +243 -0
  147. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/showcase.kv +100 -0
  148. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/README.txt +12 -0
  149. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/android.txt +3 -0
  150. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/icon.png +0 -0
  151. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/main.py +170 -0
  152. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/particle.png +0 -0
  153. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/touchtracer.kv +29 -0
  154. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/echo_client_app.py +82 -0
  155. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/echo_server_app.py +49 -0
  156. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/twistd_app.py +66 -0
  157. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/gestures/gesture_board.py +95 -0
  158. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/gestures/my_gestures.py +90 -0
  159. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/designwithkv/controller.kv +16 -0
  160. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/designwithkv/main.py +29 -0
  161. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/1_skeleton.py +15 -0
  162. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/2_print_touch.py +16 -0
  163. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/3_draw_ellipse.py +22 -0
  164. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/4_draw_line.py +26 -0
  165. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/5_random_colors.py +28 -0
  166. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/6_button.py +38 -0
  167. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/quickstart/main.py +15 -0
  168. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/button.kv +9 -0
  169. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/layout.kv +6 -0
  170. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/main.py +19 -0
  171. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/test.kv +5 -0
  172. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/android.txt +3 -0
  173. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/main.py +226 -0
  174. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/numeric.json +38 -0
  175. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kinect/README.txt +13 -0
  176. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kinect/kinectviewer.py +283 -0
  177. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_button.kv +9 -0
  178. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_camera.kv +25 -0
  179. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_fbo.kv +11 -0
  180. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_layout.kv +23 -0
  181. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_logo.kv +36 -0
  182. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_scatter.kv +6 -0
  183. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_stencil.kv +27 -0
  184. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_video.kv +42 -0
  185. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/builder_template.py +28 -0
  186. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/id_in_kv/id_in_kv.py +20 -0
  187. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/id_in_kv/test.kv +11 -0
  188. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/kv_and_py/kv_and_py.py +34 -0
  189. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/kv_and_py/test.kv +11 -0
  190. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/kivy.jpg +0 -0
  191. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/kvrun.py +38 -0
  192. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/clipboard.py +63 -0
  193. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/custom_titlebar.py +56 -0
  194. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/imagesave.py +14 -0
  195. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/joystick.py +83 -0
  196. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/multiple_dropfile.py +51 -0
  197. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/on_textedit_event.py +104 -0
  198. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/opacitywindow.py +28 -0
  199. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/shapecollisions.py +397 -0
  200. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/shapedwindow.py +98 -0
  201. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/two_panes.py +47 -0
  202. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/urlrequest.py +128 -0
  203. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/settings/android.txt +3 -0
  204. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/settings/main.py +122 -0
  205. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/plasma.kv +9 -0
  206. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/plasma.py +86 -0
  207. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/rotated.kv +91 -0
  208. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/rotated.py +102 -0
  209. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/shadertree.kv +29 -0
  210. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/shadertree.py +193 -0
  211. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/tex3.jpg +0 -0
  212. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/benchmark.py +19 -0
  213. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/cloud.svg +25 -0
  214. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/main-smaa.py +155 -0
  215. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/main.py +50 -0
  216. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/music.svg +68 -0
  217. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/rotated.svg +23 -0
  218. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/ship.svg +181 -0
  219. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/sun.svg +35 -0
  220. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/tiger.svg +813 -0
  221. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/text/pango_demo.py +296 -0
  222. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/data/icon.png +0 -0
  223. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/main.py +163 -0
  224. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/note.kv +154 -0
  225. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/main.py +82 -0
  226. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/pong.kv +53 -0
  227. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step1/main.py +15 -0
  228. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step1/pong.kv +2 -0
  229. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step2/main.py +15 -0
  230. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step2/pong.kv +21 -0
  231. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step3/main.py +26 -0
  232. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step3/pong.kv +31 -0
  233. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step4/main.py +48 -0
  234. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step4/pong.kv +34 -0
  235. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step5/main.py +75 -0
  236. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step5/pong.kv +53 -0
  237. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/accordion_1.py +17 -0
  238. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/actionbar.py +32 -0
  239. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/asyncimage.py +35 -0
  240. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/boxlayout_poshint.py +54 -0
  241. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/bubble_test.py +63 -0
  242. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/camera.py +33 -0
  243. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/carousel_buttons.py +50 -0
  244. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/cityCC0.mpg +0 -0
  245. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/cityCC0.png +0 -0
  246. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/codeinput.py +225 -0
  247. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/codeinputtest.kv +53 -0
  248. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/colorpicker.py +234 -0
  249. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/colorusage.py +62 -0
  250. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/compound_selection.py +83 -0
  251. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/customcollide.py +82 -0
  252. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget.py +193 -0
  253. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget2.py +47 -0
  254. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget3_advanced.py +62 -0
  255. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/fbowidget.py +111 -0
  256. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/focus_behavior.py +98 -0
  257. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/image_mipmap.py +31 -0
  258. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/keyboardlistener.py +42 -0
  259. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_mipmap.py +28 -0
  260. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_sizing.py +193 -0
  261. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_text_size.py +49 -0
  262. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_with_markup.py +21 -0
  263. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/lang_dynamic_classes.py +18 -0
  264. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/pagelayout.py +64 -0
  265. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/popup_with_kv.py +35 -0
  266. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/basic_data.py +124 -0
  267. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/infinite_scrolling.py +143 -0
  268. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/key_viewclass.py +149 -0
  269. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/messenger.py +196 -0
  270. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/pull_to_refresh.py +95 -0
  271. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/rv_animate_items.py +109 -0
  272. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/rstexample.py +128 -0
  273. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scatter.kv +53 -0
  274. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scatter.py +16 -0
  275. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/screenmanager.py +106 -0
  276. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scrollview.kv +16 -0
  277. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scrollview.py +40 -0
  278. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/android.txt +3 -0
  279. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/bird.zip +0 -0
  280. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/button_white.png +0 -0
  281. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/button_white_animated.zip +0 -0
  282. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/cube.zip +0 -0
  283. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/info.png +0 -0
  284. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/info.zip +0 -0
  285. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/simple_cv_joint_animated.gif +0 -0
  286. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/main.kv +63 -0
  287. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/main.py +150 -0
  288. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/uix/__init__.py +7 -0
  289. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/uix/custom_button.py +98 -0
  290. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/settings.py +93 -0
  291. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/shorten_text.py +80 -0
  292. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/spinner.py +17 -0
  293. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/splitter.py +74 -0
  294. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/tabbed_panel_showcase.py +316 -0
  295. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/tabbedpanel.py +50 -0
  296. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textalign.kv +49 -0
  297. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textalign.py +48 -0
  298. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textinput.py +59 -0
  299. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/unicode_textinput.py +244 -0
  300. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/videoplayer.py +26 -0
  301. Kivy_examples-2.3.1.dev0.dist-info/AUTHORS +66 -0
  302. Kivy_examples-2.3.1.dev0.dist-info/LICENSE +21 -0
  303. Kivy_examples-2.3.1.dev0.dist-info/METADATA +382 -0
  304. Kivy_examples-2.3.1.dev0.dist-info/RECORD +624 -0
  305. Kivy_examples-2.3.1.dev0.dist-info/WHEEL +5 -0
  306. Kivy_examples-2.3.1.dev0.dist-info/dependency_links.txt +1 -0
  307. Kivy_examples-2.3.1.dev0.dist-info/top_level.txt +1 -0
  308. kivy/__init__.py +519 -0
  309. kivy/_version.py +18 -0
  310. kivy/animation.py +831 -0
  311. kivy/app.py +1213 -0
  312. kivy/atlas.py +456 -0
  313. kivy/base.py +617 -0
  314. kivy/cache.py +262 -0
  315. kivy/clock.py +1172 -0
  316. kivy/compat.py +82 -0
  317. kivy/config.py +1004 -0
  318. kivy/context.py +102 -0
  319. kivy/core/__init__.py +247 -0
  320. kivy/core/audio/__init__.py +223 -0
  321. kivy/core/audio/audio_android.py +104 -0
  322. kivy/core/audio/audio_avplayer.py +82 -0
  323. kivy/core/audio/audio_ffpyplayer.py +185 -0
  324. kivy/core/audio/audio_gstplayer.py +101 -0
  325. kivy/core/audio/audio_pygame.py +127 -0
  326. kivy/core/camera/__init__.py +151 -0
  327. kivy/core/camera/camera_android.py +206 -0
  328. kivy/core/camera/camera_gi.py +170 -0
  329. kivy/core/camera/camera_opencv.py +163 -0
  330. kivy/core/camera/camera_picamera.py +96 -0
  331. kivy/core/clipboard/__init__.py +157 -0
  332. kivy/core/clipboard/_clipboard_ext.py +36 -0
  333. kivy/core/clipboard/clipboard_android.py +91 -0
  334. kivy/core/clipboard/clipboard_dbusklipper.py +41 -0
  335. kivy/core/clipboard/clipboard_dummy.py +26 -0
  336. kivy/core/clipboard/clipboard_gtk3.py +47 -0
  337. kivy/core/clipboard/clipboard_nspaste.py +44 -0
  338. kivy/core/clipboard/clipboard_pygame.py +67 -0
  339. kivy/core/clipboard/clipboard_sdl2.py +36 -0
  340. kivy/core/clipboard/clipboard_winctypes.py +107 -0
  341. kivy/core/clipboard/clipboard_xclip.py +29 -0
  342. kivy/core/clipboard/clipboard_xsel.py +26 -0
  343. kivy/core/gl/__init__.py +90 -0
  344. kivy/core/image/__init__.py +996 -0
  345. kivy/core/image/img_dds.py +40 -0
  346. kivy/core/image/img_ffpyplayer.py +87 -0
  347. kivy/core/image/img_pil.py +123 -0
  348. kivy/core/image/img_pygame.py +119 -0
  349. kivy/core/image/img_sdl2.py +66 -0
  350. kivy/core/image/img_tex.py +58 -0
  351. kivy/core/spelling/__init__.py +135 -0
  352. kivy/core/spelling/spelling_enchant.py +50 -0
  353. kivy/core/spelling/spelling_osxappkit.py +64 -0
  354. kivy/core/text/__init__.py +1090 -0
  355. kivy/core/text/markup.py +893 -0
  356. kivy/core/text/text_pango.py +145 -0
  357. kivy/core/text/text_pil.py +84 -0
  358. kivy/core/text/text_pygame.py +117 -0
  359. kivy/core/text/text_sdl2.py +50 -0
  360. kivy/core/video/__init__.py +219 -0
  361. kivy/core/video/video_ffmpeg.py +106 -0
  362. kivy/core/video/video_ffpyplayer.py +449 -0
  363. kivy/core/video/video_gstplayer.py +140 -0
  364. kivy/core/video/video_null.py +12 -0
  365. kivy/core/window/__init__.py +2515 -0
  366. kivy/core/window/window_egl_rpi.py +86 -0
  367. kivy/core/window/window_pygame.py +441 -0
  368. kivy/core/window/window_sdl2.py +999 -0
  369. kivy/deps/__init__.py +6 -0
  370. kivy/effects/__init__.py +23 -0
  371. kivy/effects/dampedscroll.py +114 -0
  372. kivy/effects/kinetic.py +193 -0
  373. kivy/effects/opacityscroll.py +27 -0
  374. kivy/effects/scroll.py +126 -0
  375. kivy/event.py +12 -0
  376. kivy/eventmanager/__init__.py +185 -0
  377. kivy/extras/__init__.py +0 -0
  378. kivy/extras/highlight.py +52 -0
  379. kivy/factory.py +190 -0
  380. kivy/factory_registers.py +201 -0
  381. kivy/garden/__init__.py +186 -0
  382. kivy/geometry.py +121 -0
  383. kivy/gesture.py +424 -0
  384. kivy/graphics/__init__.py +126 -0
  385. kivy/graphics/cgl_backend/__init__.py +0 -0
  386. kivy/input/__init__.py +39 -0
  387. kivy/input/factory.py +35 -0
  388. kivy/input/motionevent.py +587 -0
  389. kivy/input/postproc/__init__.py +27 -0
  390. kivy/input/postproc/calibration.py +200 -0
  391. kivy/input/postproc/dejitter.py +74 -0
  392. kivy/input/postproc/doubletap.py +101 -0
  393. kivy/input/postproc/ignorelist.py +47 -0
  394. kivy/input/postproc/retaintouch.py +93 -0
  395. kivy/input/postproc/tripletap.py +106 -0
  396. kivy/input/provider.py +40 -0
  397. kivy/input/providers/__init__.py +68 -0
  398. kivy/input/providers/androidjoystick.py +117 -0
  399. kivy/input/providers/hidinput.py +778 -0
  400. kivy/input/providers/leapfinger.py +113 -0
  401. kivy/input/providers/linuxwacom.py +396 -0
  402. kivy/input/providers/mactouch.py +220 -0
  403. kivy/input/providers/mouse.py +424 -0
  404. kivy/input/providers/mtdev.py +380 -0
  405. kivy/input/providers/probesysfs.py +254 -0
  406. kivy/input/providers/tuio.py +326 -0
  407. kivy/input/providers/wm_common.py +162 -0
  408. kivy/input/providers/wm_pen.py +121 -0
  409. kivy/input/providers/wm_touch.py +157 -0
  410. kivy/input/recorder.py +335 -0
  411. kivy/input/shape.py +27 -0
  412. kivy/interactive.py +335 -0
  413. kivy/lang/__init__.py +883 -0
  414. kivy/lang/builder.py +1004 -0
  415. kivy/lang/parser.py +822 -0
  416. kivy/lib/__init__.py +21 -0
  417. kivy/lib/ddsfile.py +419 -0
  418. kivy/lib/gstplayer/__init__.py +27 -0
  419. kivy/lib/mtdev.py +254 -0
  420. kivy/lib/vidcore_lite/__init__.py +0 -0
  421. kivy/loader.py +579 -0
  422. kivy/logger.py +646 -0
  423. kivy/metrics.py +421 -0
  424. kivy/modules/__init__.py +300 -0
  425. kivy/modules/_webdebugger.py +200 -0
  426. kivy/modules/console.py +1059 -0
  427. kivy/modules/cursor.py +75 -0
  428. kivy/modules/inspector.py +755 -0
  429. kivy/modules/joycursor.py +299 -0
  430. kivy/modules/keybinding.py +64 -0
  431. kivy/modules/monitor.py +90 -0
  432. kivy/modules/recorder.py +94 -0
  433. kivy/modules/screen.py +183 -0
  434. kivy/modules/showborder.py +33 -0
  435. kivy/modules/touchring.py +97 -0
  436. kivy/modules/webdebugger.py +30 -0
  437. kivy/multistroke.py +1477 -0
  438. kivy/network/__init__.py +7 -0
  439. kivy/network/urlrequest.py +794 -0
  440. kivy/parser.py +154 -0
  441. kivy/resources.py +102 -0
  442. kivy/storage/__init__.py +405 -0
  443. kivy/storage/dictstore.py +98 -0
  444. kivy/storage/jsonstore.py +92 -0
  445. kivy/storage/redisstore.py +103 -0
  446. kivy/support.py +267 -0
  447. kivy/tests/__init__.py +11 -0
  448. kivy/tests/async_common.py +568 -0
  449. kivy/tests/common.py +524 -0
  450. kivy/tests/conftest.py +33 -0
  451. kivy/tests/fixtures.py +169 -0
  452. kivy/tests/perf_test_textinput.py +195 -0
  453. kivy/tests/pyinstaller/simple_widget/main.py +12 -0
  454. kivy/tests/pyinstaller/simple_widget/project/__init__.py +0 -0
  455. kivy/tests/pyinstaller/simple_widget/project/widget.py +12 -0
  456. kivy/tests/pyinstaller/test_pyinstaller.py +115 -0
  457. kivy/tests/pyinstaller/video_widget/main.py +6 -0
  458. kivy/tests/pyinstaller/video_widget/project/__init__.py +38 -0
  459. kivy/tests/test_animations.py +415 -0
  460. kivy/tests/test_app.py +216 -0
  461. kivy/tests/test_audio.py +69 -0
  462. kivy/tests/test_benchmark.py +292 -0
  463. kivy/tests/test_clipboard.py +48 -0
  464. kivy/tests/test_clock.py +292 -0
  465. kivy/tests/test_compat.py +6 -0
  466. kivy/tests/test_config.py +35 -0
  467. kivy/tests/test_coverage.py +83 -0
  468. kivy/tests/test_doc_gallery.py +38 -0
  469. kivy/tests/test_environ_cli.py +50 -0
  470. kivy/tests/test_fbo_py2py3.py +74 -0
  471. kivy/tests/test_filechooser.py +11 -0
  472. kivy/tests/test_filechooser_unicode.py +82 -0
  473. kivy/tests/test_fonts.py +42 -0
  474. kivy/tests/test_garden.py +23 -0
  475. kivy/tests/test_graphics.py +1149 -0
  476. kivy/tests/test_graphics_svg.py +84 -0
  477. kivy/tests/test_image.py +74 -0
  478. kivy/tests/test_imageloader.py +485 -0
  479. kivy/tests/test_invalid_lang.py +42 -0
  480. kivy/tests/test_issues/test_6315.py +55 -0
  481. kivy/tests/test_issues/test_issue_1084.py +47 -0
  482. kivy/tests/test_issues/test_issue_1091.py +19 -0
  483. kivy/tests/test_issues/test_issue_599.py +21 -0
  484. kivy/tests/test_issues/test_issue_609.py +19 -0
  485. kivy/tests/test_issues/test_issue_6909.py +28 -0
  486. kivy/tests/test_issues/test_issue_883.py +12 -0
  487. kivy/tests/test_kivy_init.py +30 -0
  488. kivy/tests/test_knspace.py +247 -0
  489. kivy/tests/test_lang.py +431 -0
  490. kivy/tests/test_lang_complex.py +87 -0
  491. kivy/tests/test_lang_pre_process_and_post_process.py +394 -0
  492. kivy/tests/test_logger.py +516 -0
  493. kivy/tests/test_metrics.py +30 -0
  494. kivy/tests/test_module_inspector.py +382 -0
  495. kivy/tests/test_motion_event.py +44 -0
  496. kivy/tests/test_mouse_hover_event.py +249 -0
  497. kivy/tests/test_mouse_multitouchsim.py +554 -0
  498. kivy/tests/test_multistroke.py +389 -0
  499. kivy/tests/test_properties.py +1332 -0
  500. kivy/tests/test_resources.py +79 -0
  501. kivy/tests/test_rst_replace.py +63 -0
  502. kivy/tests/test_screen.py +38 -0
  503. kivy/tests/test_storage.py +135 -0
  504. kivy/tests/test_uix_actionbar.py +363 -0
  505. kivy/tests/test_uix_anchorlayout.py +79 -0
  506. kivy/tests/test_uix_asyncimage.py +133 -0
  507. kivy/tests/test_uix_boxlayout.py +94 -0
  508. kivy/tests/test_uix_bubble.py +425 -0
  509. kivy/tests/test_uix_carousel.py +93 -0
  510. kivy/tests/test_uix_colorpicker.py +77 -0
  511. kivy/tests/test_uix_dropdown.py +91 -0
  512. kivy/tests/test_uix_gridlayout.py +244 -0
  513. kivy/tests/test_uix_layout.py +16 -0
  514. kivy/tests/test_uix_modal.py +101 -0
  515. kivy/tests/test_uix_recyclegridlayout.py +383 -0
  516. kivy/tests/test_uix_relativelayout.py +30 -0
  517. kivy/tests/test_uix_scrollview.py +358 -0
  518. kivy/tests/test_uix_settings.py +33 -0
  519. kivy/tests/test_uix_slider.py +156 -0
  520. kivy/tests/test_uix_stacklayout.py +120 -0
  521. kivy/tests/test_uix_textinput.py +577 -0
  522. kivy/tests/test_uix_translate_coordinates.py +72 -0
  523. kivy/tests/test_uix_videoplayer.py +112 -0
  524. kivy/tests/test_uix_widget.py +137 -0
  525. kivy/tests/test_urlrequest/test_urlrequest_requests.py +378 -0
  526. kivy/tests/test_urlrequest/test_urlrequest_urllib.py +155 -0
  527. kivy/tests/test_utils.py +237 -0
  528. kivy/tests/test_vector.py +256 -0
  529. kivy/tests/test_video.py +25 -0
  530. kivy/tests/test_weakmethod.py +44 -0
  531. kivy/tests/test_widget.py +127 -0
  532. kivy/tests/test_widget_walk.py +70 -0
  533. kivy/tests/test_window_base.py +60 -0
  534. kivy/tests/test_window_info.py +29 -0
  535. kivy/tests/visual_test_label.py +291 -0
  536. kivy/tools/__init__.py +44 -0
  537. kivy/tools/benchmark.py +286 -0
  538. kivy/tools/changelog_parser.py +120 -0
  539. kivy/tools/coverage.py +135 -0
  540. kivy/tools/gallery.py +323 -0
  541. kivy/tools/generate-icons.py +117 -0
  542. kivy/tools/gles_compat/subset_gles.py +125 -0
  543. kivy/tools/highlight/__init__.py +9 -0
  544. kivy/tools/kviewer.py +80 -0
  545. kivy/tools/packaging/__init__.py +12 -0
  546. kivy/tools/packaging/cython_cfg.py +82 -0
  547. kivy/tools/packaging/factory.py +105 -0
  548. kivy/tools/packaging/pyinstaller_hooks/__init__.py +381 -0
  549. kivy/tools/packaging/pyinstaller_hooks/__main__.py +29 -0
  550. kivy/tools/packaging/pyinstaller_hooks/hook-kivy.py +9 -0
  551. kivy/tools/packaging/pyinstaller_hooks/pyi_rth_kivy.py +17 -0
  552. kivy/tools/pep8checker/pep8.py +2316 -0
  553. kivy/tools/pep8checker/pep8kivy.py +109 -0
  554. kivy/tools/report.py +223 -0
  555. kivy/tools/stub-gl-debug.py +201 -0
  556. kivy/tools/texturecompress.py +233 -0
  557. kivy/uix/__init__.py +56 -0
  558. kivy/uix/accordion.py +484 -0
  559. kivy/uix/actionbar.py +934 -0
  560. kivy/uix/anchorlayout.py +122 -0
  561. kivy/uix/behaviors/__init__.py +95 -0
  562. kivy/uix/behaviors/button.py +212 -0
  563. kivy/uix/behaviors/codenavigation.py +167 -0
  564. kivy/uix/behaviors/compoundselection.py +688 -0
  565. kivy/uix/behaviors/cover.py +160 -0
  566. kivy/uix/behaviors/drag.py +234 -0
  567. kivy/uix/behaviors/emacs.py +140 -0
  568. kivy/uix/behaviors/focus.py +595 -0
  569. kivy/uix/behaviors/knspace.py +590 -0
  570. kivy/uix/behaviors/togglebutton.py +156 -0
  571. kivy/uix/behaviors/touchripple.py +318 -0
  572. kivy/uix/boxlayout.py +331 -0
  573. kivy/uix/bubble.py +576 -0
  574. kivy/uix/button.py +137 -0
  575. kivy/uix/camera.py +118 -0
  576. kivy/uix/carousel.py +695 -0
  577. kivy/uix/checkbox.py +197 -0
  578. kivy/uix/codeinput.py +238 -0
  579. kivy/uix/colorpicker.py +486 -0
  580. kivy/uix/dropdown.py +391 -0
  581. kivy/uix/effectwidget.py +772 -0
  582. kivy/uix/filechooser.py +1134 -0
  583. kivy/uix/floatlayout.py +148 -0
  584. kivy/uix/gesturesurface.py +625 -0
  585. kivy/uix/gridlayout.py +629 -0
  586. kivy/uix/image.py +528 -0
  587. kivy/uix/label.py +1200 -0
  588. kivy/uix/layout.py +322 -0
  589. kivy/uix/modalview.py +339 -0
  590. kivy/uix/pagelayout.py +233 -0
  591. kivy/uix/popup.py +266 -0
  592. kivy/uix/progressbar.py +95 -0
  593. kivy/uix/recycleboxlayout.py +183 -0
  594. kivy/uix/recyclegridlayout.py +255 -0
  595. kivy/uix/recyclelayout.py +446 -0
  596. kivy/uix/recycleview/__init__.py +624 -0
  597. kivy/uix/recycleview/datamodel.py +194 -0
  598. kivy/uix/recycleview/layout.py +253 -0
  599. kivy/uix/recycleview/views.py +423 -0
  600. kivy/uix/relativelayout.py +324 -0
  601. kivy/uix/rst.py +1492 -0
  602. kivy/uix/sandbox.py +198 -0
  603. kivy/uix/scatter.py +645 -0
  604. kivy/uix/scatterlayout.py +93 -0
  605. kivy/uix/screenmanager.py +1275 -0
  606. kivy/uix/scrollview.py +1288 -0
  607. kivy/uix/settings.py +1343 -0
  608. kivy/uix/slider.py +421 -0
  609. kivy/uix/spinner.py +221 -0
  610. kivy/uix/splitter.py +430 -0
  611. kivy/uix/stacklayout.py +331 -0
  612. kivy/uix/stencilview.py +40 -0
  613. kivy/uix/switch.py +122 -0
  614. kivy/uix/tabbedpanel.py +880 -0
  615. kivy/uix/textinput.py +4049 -0
  616. kivy/uix/togglebutton.py +37 -0
  617. kivy/uix/treeview.py +665 -0
  618. kivy/uix/video.py +302 -0
  619. kivy/uix/videoplayer.py +697 -0
  620. kivy/uix/vkeyboard.py +879 -0
  621. kivy/uix/widget.py +1629 -0
  622. kivy/utils.py +550 -0
  623. kivy/vector.py +412 -0
  624. kivy/weakmethod.py +72 -0
kivy/uix/scrollview.py ADDED
@@ -0,0 +1,1288 @@
1
+ '''
2
+ ScrollView
3
+ ==========
4
+
5
+ .. versionadded:: 1.0.4
6
+
7
+ The :class:`ScrollView` widget provides a scrollable/pannable viewport that is
8
+ clipped at the scrollview's bounding box.
9
+
10
+ .. note::
11
+ Use :class:`~kivy.uix.recycleview.RecycleView` for generating large
12
+ numbers of widgets in order to display many data items.
13
+
14
+
15
+ Scrolling Behavior
16
+ ------------------
17
+
18
+ The ScrollView accepts only one child and applies a viewport/window to
19
+ it according to the :attr:`~ScrollView.scroll_x` and
20
+ :attr:`~ScrollView.scroll_y` properties. Touches are analyzed to
21
+ determine if the user wants to scroll or control the child in some
22
+ other manner: you cannot do both at the same time. To determine if
23
+ interaction is a scrolling gesture, these properties are used:
24
+
25
+ - :attr:`~ScrollView.scroll_distance`: the minimum distance to travel,
26
+ defaults to 20 pixels.
27
+ - :attr:`~ScrollView.scroll_timeout`: the maximum time period, defaults
28
+ to 55 milliseconds.
29
+
30
+ If a touch travels :attr:`~ScrollView.scroll_distance` pixels within the
31
+ :attr:`~ScrollView.scroll_timeout` period, it is recognized as a scrolling
32
+ gesture and translation (scroll/pan) will begin. If the timeout occurs, the
33
+ touch down event is dispatched to the child instead (no translation).
34
+
35
+ The default value for those settings can be changed in the configuration file::
36
+
37
+ [widgets]
38
+ scroll_timeout = 250
39
+ scroll_distance = 20
40
+
41
+ .. versionadded:: 1.1.1
42
+
43
+ ScrollView now animates scrolling in Y when a mousewheel is used.
44
+
45
+
46
+ Limiting to the X or Y Axis
47
+ ---------------------------
48
+
49
+ By default, the ScrollView allows scrolling along both the X and Y axes. You
50
+ can explicitly disable scrolling on an axis by setting the
51
+ :attr:`~ScrollView.do_scroll_x` or :attr:`~ScrollView.do_scroll_y` properties
52
+ to False.
53
+
54
+
55
+ Managing the Content Size and Position
56
+ --------------------------------------
57
+
58
+ The ScrollView manages the position of its children similarly to a
59
+ :class:`~kivy.uix.relativelayout.RelativeLayout` but does not use the
60
+ :attr:`~kivy.uix.widget.Widget.size_hint`. You must
61
+ carefully specify the :attr:`~kivy.uix.widget.Widget.size` of your content to
62
+ get the desired scroll/pan effect.
63
+
64
+ By default, the :attr:`~kivy.uix.widget.Widget.size_hint` is (1, 1), so the
65
+ content size will fit your ScrollView
66
+ exactly (you will have nothing to scroll). You must deactivate at least one of
67
+ the size_hint instructions (x or y) of the child to enable scrolling.
68
+ Setting :attr:`~kivy.uix.widget.Widget.size_hint_min` to not be None will
69
+ also enable scrolling for that dimension when the :class:`ScrollView` is
70
+ smaller than the minimum size.
71
+
72
+ To scroll a :class:`~kivy.uix.gridlayout.GridLayout` on it's Y-axis/vertically,
73
+ set the child's width to that of the ScrollView (size_hint_x=1), and set
74
+ the size_hint_y property to None::
75
+
76
+ from kivy.uix.gridlayout import GridLayout
77
+ from kivy.uix.button import Button
78
+ from kivy.uix.scrollview import ScrollView
79
+ from kivy.core.window import Window
80
+ from kivy.app import runTouchApp
81
+
82
+ layout = GridLayout(cols=1, spacing=10, size_hint_y=None)
83
+ # Make sure the height is such that there is something to scroll.
84
+ layout.bind(minimum_height=layout.setter('height'))
85
+ for i in range(100):
86
+ btn = Button(text=str(i), size_hint_y=None, height=40)
87
+ layout.add_widget(btn)
88
+ root = ScrollView(size_hint=(1, None), size=(Window.width, Window.height))
89
+ root.add_widget(layout)
90
+
91
+ runTouchApp(root)
92
+
93
+
94
+ Kv Example::
95
+
96
+ ScrollView:
97
+ do_scroll_x: False
98
+ do_scroll_y: True
99
+
100
+ Label:
101
+ size_hint_y: None
102
+ height: self.texture_size[1]
103
+ text_size: self.width, None
104
+ padding: 10, 10
105
+ text:
106
+ 'really some amazing text\\n' * 100
107
+
108
+ Overscroll Effects
109
+ ------------------
110
+
111
+ .. versionadded:: 1.7.0
112
+
113
+ When scrolling would exceed the bounds of the :class:`ScrollView`, it
114
+ uses a :class:`~kivy.effects.scroll.ScrollEffect` to handle the
115
+ overscroll. These effects can perform actions like bouncing back,
116
+ changing opacity, or simply preventing scrolling beyond the normal
117
+ boundaries. Note that complex effects may perform many computations,
118
+ which can be slow on weaker hardware.
119
+
120
+ You can change what effect is being used by setting
121
+ :attr:`~ScrollView.effect_cls` to any effect class. Current options
122
+ include:
123
+
124
+ - :class:`~kivy.effects.scroll.ScrollEffect`: Does not allow
125
+ scrolling beyond the :class:`ScrollView` boundaries.
126
+ - :class:`~kivy.effects.dampedscroll.DampedScrollEffect`: The
127
+ current default. Allows the user to scroll beyond the normal
128
+ boundaries, but has the content spring back once the
129
+ touch/click is released.
130
+ - :class:`~kivy.effects.opacityscroll.OpacityScrollEffect`: Similar
131
+ to the :class:`~kivy.effect.dampedscroll.DampedScrollEffect`, but
132
+ also reduces opacity during overscroll.
133
+
134
+ You can also create your own scroll effect by subclassing one of these,
135
+ then pass it as the :attr:`~ScrollView.effect_cls` in the same way.
136
+
137
+ Alternatively, you can set :attr:`~ScrollView.effect_x` and/or
138
+ :attr:`~ScrollView.effect_y` to an *instance* of the effect you want to
139
+ use. This will override the default effect set in
140
+ :attr:`~ScrollView.effect_cls`.
141
+
142
+ All the effects are located in the :mod:`kivy.effects`.
143
+
144
+ '''
145
+
146
+ __all__ = ('ScrollView', )
147
+
148
+ from functools import partial
149
+ from kivy.animation import Animation
150
+ from kivy.compat import string_types
151
+ from kivy.config import Config
152
+ from kivy.clock import Clock
153
+ from kivy.factory import Factory
154
+ from kivy.uix.stencilview import StencilView
155
+ from kivy.metrics import dp
156
+ from kivy.effects.dampedscroll import DampedScrollEffect
157
+ from kivy.properties import NumericProperty, BooleanProperty, AliasProperty, \
158
+ ObjectProperty, ListProperty, ReferenceListProperty, OptionProperty, \
159
+ ColorProperty
160
+ from kivy.uix.behaviors import FocusBehavior
161
+
162
+
163
+ # When we are generating documentation, Config doesn't exist
164
+ _scroll_timeout = _scroll_distance = 0
165
+ if Config:
166
+ _scroll_timeout = Config.getint('widgets', 'scroll_timeout')
167
+ _scroll_distance = '{}sp'.format(Config.getint('widgets',
168
+ 'scroll_distance'))
169
+
170
+
171
+ class ScrollView(StencilView):
172
+ '''ScrollView class. See module documentation for more information.
173
+
174
+ :Events:
175
+ `on_scroll_start`
176
+ Generic event fired when scrolling starts from touch.
177
+ `on_scroll_move`
178
+ Generic event fired when scrolling move from touch.
179
+ `on_scroll_stop`
180
+ Generic event fired when scrolling stops from touch.
181
+
182
+ .. versionchanged:: 1.9.0
183
+ `on_scroll_start`, `on_scroll_move` and `on_scroll_stop` events are
184
+ now dispatched when scrolling to handle nested ScrollViews.
185
+
186
+ .. versionchanged:: 1.7.0
187
+ `auto_scroll`, `scroll_friction`, `scroll_moves`, `scroll_stoptime' has
188
+ been deprecated, use :attr:`effect_cls` instead.
189
+ '''
190
+
191
+ scroll_distance = NumericProperty(_scroll_distance)
192
+ '''Distance to move before scrolling the :class:`ScrollView`, in pixels. As
193
+ soon as the distance has been traveled, the :class:`ScrollView` will start
194
+ to scroll, and no touch event will go to children.
195
+ It is advisable that you base this value on the dpi of your target device's
196
+ screen.
197
+
198
+ :attr:`scroll_distance` is a :class:`~kivy.properties.NumericProperty` and
199
+ defaults to 20 (pixels), according to the default value in user
200
+ configuration.
201
+ '''
202
+
203
+ scroll_wheel_distance = NumericProperty('20sp')
204
+ '''Distance to move when scrolling with a mouse wheel.
205
+ It is advisable that you base this value on the dpi of your target device's
206
+ screen.
207
+
208
+ .. versionadded:: 1.8.0
209
+
210
+ :attr:`scroll_wheel_distance` is a
211
+ :class:`~kivy.properties.NumericProperty` , defaults to 20 pixels.
212
+ '''
213
+
214
+ scroll_timeout = NumericProperty(_scroll_timeout)
215
+ '''Timeout allowed to trigger the :attr:`scroll_distance`, in milliseconds.
216
+ If the user has not moved :attr:`scroll_distance` within the timeout,
217
+ the scrolling will be disabled, and the touch event will go to the
218
+ children.
219
+
220
+ :attr:`scroll_timeout` is a :class:`~kivy.properties.NumericProperty` and
221
+ defaults to 55 (milliseconds) according to the default value in user
222
+ configuration.
223
+
224
+ .. versionchanged:: 1.5.0
225
+ Default value changed from 250 to 55.
226
+ '''
227
+
228
+ scroll_x = NumericProperty(0.)
229
+ '''X scrolling value, between 0 and 1. If 0, the content's left side will
230
+ touch the left side of the ScrollView. If 1, the content's right side will
231
+ touch the right side.
232
+
233
+ This property is controlled by :class:`ScrollView` only if
234
+ :attr:`do_scroll_x` is True.
235
+
236
+ :attr:`scroll_x` is a :class:`~kivy.properties.NumericProperty` and
237
+ defaults to 0.
238
+ '''
239
+
240
+ scroll_y = NumericProperty(1.)
241
+ '''Y scrolling value, between 0 and 1. If 0, the content's bottom side will
242
+ touch the bottom side of the ScrollView. If 1, the content's top side will
243
+ touch the top side.
244
+
245
+ This property is controlled by :class:`ScrollView` only if
246
+ :attr:`do_scroll_y` is True.
247
+
248
+ :attr:`scroll_y` is a :class:`~kivy.properties.NumericProperty` and
249
+ defaults to 1.
250
+ '''
251
+
252
+ do_scroll_x = BooleanProperty(True)
253
+ '''Allow scroll on X axis.
254
+
255
+ :attr:`do_scroll_x` is a :class:`~kivy.properties.BooleanProperty` and
256
+ defaults to True.
257
+ '''
258
+
259
+ do_scroll_y = BooleanProperty(True)
260
+ '''Allow scroll on Y axis.
261
+
262
+ :attr:`do_scroll_y` is a :class:`~kivy.properties.BooleanProperty` and
263
+ defaults to True.
264
+ '''
265
+
266
+ def _get_do_scroll(self):
267
+ return (self.do_scroll_x, self.do_scroll_y)
268
+
269
+ def _set_do_scroll(self, value):
270
+ if isinstance(value, (list, tuple)):
271
+ self.do_scroll_x, self.do_scroll_y = value
272
+ else:
273
+ self.do_scroll_x = self.do_scroll_y = bool(value)
274
+
275
+ do_scroll = AliasProperty(_get_do_scroll, _set_do_scroll,
276
+ bind=('do_scroll_x', 'do_scroll_y'),
277
+ cache=True)
278
+ '''Allow scroll on X or Y axis.
279
+
280
+ :attr:`do_scroll` is a :class:`~kivy.properties.AliasProperty` of
281
+ (:attr:`do_scroll_x` + :attr:`do_scroll_y`)
282
+ '''
283
+
284
+ always_overscroll = BooleanProperty(True)
285
+ '''Make sure user can overscroll even if there is not enough content
286
+ to require scrolling.
287
+
288
+ This is useful if you want to trigger some action on overscroll, but
289
+ there is not always enough content to trigger it.
290
+
291
+ :attr:`always_overscroll` is a
292
+ :class:`~kivy.properties.BooleanProperty` and defaults to `True`.
293
+
294
+ .. versionadded:: 2.0.0
295
+
296
+ The option was added and enabled by default, set to False to get the
297
+ previous behavior of only allowing to overscroll when there is
298
+ enough content to allow scrolling.
299
+ '''
300
+
301
+ def _get_vbar(self):
302
+ # must return (y, height) in %
303
+ # calculate the viewport size / scrollview size %
304
+ if self._viewport is None:
305
+ return 0, 1.
306
+ vh = self._viewport.height
307
+ h = self.height
308
+ if vh < h or vh == 0:
309
+ return 0, 1.
310
+ ph = max(0.01, h / float(vh))
311
+ sy = min(1.0, max(0.0, self.scroll_y))
312
+ py = (1. - ph) * sy
313
+ return (py, ph)
314
+
315
+ vbar = AliasProperty(_get_vbar,
316
+ bind=('scroll_y', '_viewport', 'viewport_size',
317
+ 'height'),
318
+ cache=True)
319
+ '''Return a tuple of (position, size) of the vertical scrolling bar.
320
+
321
+ .. versionadded:: 1.2.0
322
+
323
+ The position and size are normalized between 0-1, and represent a
324
+ proportion of the current scrollview height. This property is used
325
+ internally for drawing the little vertical bar when you're scrolling.
326
+
327
+ :attr:`vbar` is a :class:`~kivy.properties.AliasProperty`, readonly.
328
+ '''
329
+
330
+ def _get_hbar(self):
331
+ # must return (x, width) in %
332
+ # calculate the viewport size / scrollview size %
333
+ if self._viewport is None:
334
+ return 0, 1.
335
+ vw = self._viewport.width
336
+ w = self.width
337
+ if vw < w or vw == 0:
338
+ return 0, 1.
339
+ pw = max(0.01, w / float(vw))
340
+ sx = min(1.0, max(0.0, self.scroll_x))
341
+ px = (1. - pw) * sx
342
+ return (px, pw)
343
+
344
+ hbar = AliasProperty(_get_hbar,
345
+ bind=('scroll_x', '_viewport', 'viewport_size',
346
+ 'width'),
347
+ cache=True)
348
+ '''Return a tuple of (position, size) of the horizontal scrolling bar.
349
+
350
+ .. versionadded:: 1.2.0
351
+
352
+ The position and size are normalized between 0-1, and represent a
353
+ proportion of the current scrollview height. This property is used
354
+ internally for drawing the little horizontal bar when you're scrolling.
355
+
356
+ :attr:`hbar` is a :class:`~kivy.properties.AliasProperty`, readonly.
357
+ '''
358
+
359
+ bar_color = ColorProperty([.7, .7, .7, .9])
360
+ '''Color of horizontal / vertical scroll bar, in RGBA format.
361
+
362
+ .. versionadded:: 1.2.0
363
+
364
+ :attr:`bar_color` is a :class:`~kivy.properties.ColorProperty` and defaults
365
+ to [.7, .7, .7, .9].
366
+
367
+ .. versionchanged:: 2.0.0
368
+ Changed from :class:`~kivy.properties.ListProperty` to
369
+ :class:`~kivy.properties.ColorProperty`.
370
+ '''
371
+
372
+ bar_inactive_color = ColorProperty([.7, .7, .7, .2])
373
+ '''Color of horizontal / vertical scroll bar (in RGBA format), when no
374
+ scroll is happening.
375
+
376
+ .. versionadded:: 1.9.0
377
+
378
+ :attr:`bar_inactive_color` is a
379
+ :class:`~kivy.properties.ColorProperty` and defaults to [.7, .7, .7, .2].
380
+
381
+ .. versionchanged:: 2.0.0
382
+ Changed from :class:`~kivy.properties.ListProperty` to
383
+ :class:`~kivy.properties.ColorProperty`.
384
+ '''
385
+
386
+ bar_width = NumericProperty('2dp')
387
+ '''Width of the horizontal / vertical scroll bar. The width is interpreted
388
+ as a height for the horizontal bar.
389
+
390
+ .. versionadded:: 1.2.0
391
+
392
+ :attr:`bar_width` is a :class:`~kivy.properties.NumericProperty` and
393
+ defaults to 2.
394
+ '''
395
+
396
+ bar_pos_x = OptionProperty('bottom', options=('top', 'bottom'))
397
+ '''Which side of the ScrollView the horizontal scroll bar should go
398
+ on. Possible values are 'top' and 'bottom'.
399
+
400
+ .. versionadded:: 1.8.0
401
+
402
+ :attr:`bar_pos_x` is an :class:`~kivy.properties.OptionProperty`,
403
+ defaults to 'bottom'.
404
+
405
+ '''
406
+
407
+ bar_pos_y = OptionProperty('right', options=('left', 'right'))
408
+ '''Which side of the ScrollView the vertical scroll bar should go
409
+ on. Possible values are 'left' and 'right'.
410
+
411
+ .. versionadded:: 1.8.0
412
+
413
+ :attr:`bar_pos_y` is an :class:`~kivy.properties.OptionProperty` and
414
+ defaults to 'right'.
415
+
416
+ '''
417
+
418
+ bar_pos = ReferenceListProperty(bar_pos_x, bar_pos_y)
419
+ '''Which side of the scroll view to place each of the bars on.
420
+
421
+ :attr:`bar_pos` is a :class:`~kivy.properties.ReferenceListProperty` of
422
+ (:attr:`bar_pos_x`, :attr:`bar_pos_y`)
423
+ '''
424
+
425
+ bar_margin = NumericProperty(0)
426
+ '''Margin between the bottom / right side of the scrollview when drawing
427
+ the horizontal / vertical scroll bar.
428
+
429
+ .. versionadded:: 1.2.0
430
+
431
+ :attr:`bar_margin` is a :class:`~kivy.properties.NumericProperty`, default
432
+ to 0
433
+ '''
434
+
435
+ effect_cls = ObjectProperty(DampedScrollEffect, allownone=True)
436
+ '''Class effect to instantiate for X and Y axis.
437
+
438
+ .. versionadded:: 1.7.0
439
+
440
+ :attr:`effect_cls` is an :class:`~kivy.properties.ObjectProperty` and
441
+ defaults to :class:`DampedScrollEffect`.
442
+
443
+ .. versionchanged:: 1.8.0
444
+ If you set a string, the :class:`~kivy.factory.Factory` will be used to
445
+ resolve the class.
446
+
447
+ '''
448
+
449
+ effect_x = ObjectProperty(None, allownone=True)
450
+ '''Effect to apply for the X axis. If None is set, an instance of
451
+ :attr:`effect_cls` will be created.
452
+
453
+ .. versionadded:: 1.7.0
454
+
455
+ :attr:`effect_x` is an :class:`~kivy.properties.ObjectProperty` and
456
+ defaults to None.
457
+ '''
458
+
459
+ effect_y = ObjectProperty(None, allownone=True)
460
+ '''Effect to apply for the Y axis. If None is set, an instance of
461
+ :attr:`effect_cls` will be created.
462
+
463
+ .. versionadded:: 1.7.0
464
+
465
+ :attr:`effect_y` is an :class:`~kivy.properties.ObjectProperty` and
466
+ defaults to None, read-only.
467
+ '''
468
+
469
+ viewport_size = ListProperty([0, 0])
470
+ '''(internal) Size of the internal viewport. This is the size of your only
471
+ child in the scrollview.
472
+ '''
473
+
474
+ scroll_type = OptionProperty(['content'], options=(['content'], ['bars'],
475
+ ['bars', 'content'], ['content', 'bars']))
476
+ '''Sets the type of scrolling to use for the content of the scrollview.
477
+ Available options are: ['content'], ['bars'], ['bars', 'content'].
478
+
479
+ +---------------------+------------------------------------------------+
480
+ | ['content'] | Content is scrolled by dragging or swiping the |
481
+ | | content directly. |
482
+ +---------------------+------------------------------------------------+
483
+ | ['bars'] | Content is scrolled by dragging or swiping the |
484
+ | | scroll bars. |
485
+ +---------------------+------------------------------------------------+
486
+ | ['bars', 'content'] | Content is scrolled by either of the above |
487
+ | | methods. |
488
+ +---------------------+------------------------------------------------+
489
+
490
+ .. versionadded:: 1.8.0
491
+
492
+ :attr:`scroll_type` is an :class:`~kivy.properties.OptionProperty` and
493
+ defaults to ['content'].
494
+ '''
495
+
496
+ smooth_scroll_end = NumericProperty(None, allownone=True)
497
+ '''Whether smooth scroll end should be used when scrolling with the
498
+ mouse-wheel and the factor of transforming the scroll distance to
499
+ velocity. This option also enables velocity addition meaning if you
500
+ scroll more, you will scroll faster and further. The recommended value
501
+ is `10`. The velocity is calculated as :attr:`scroll_wheel_distance` *
502
+ :attr:`smooth_scroll_end`.
503
+
504
+ .. versionadded:: 1.11.0
505
+
506
+ :attr:`smooth_scroll_end` is a :class:`~kivy.properties.NumericProperty`
507
+ and defaults to None.
508
+ '''
509
+
510
+ # private, for internal use only
511
+
512
+ _viewport = ObjectProperty(None, allownone=True)
513
+ _bar_color = ListProperty([0, 0, 0, 0])
514
+ _effect_x_start_width = None
515
+ _effect_y_start_height = None
516
+ _update_effect_bounds_ev = None
517
+ _bind_inactive_bar_color_ev = None
518
+
519
+ def _set_viewport_size(self, instance, value):
520
+ self.viewport_size = value
521
+
522
+ def on__viewport(self, instance, value):
523
+ if value:
524
+ value.bind(size=self._set_viewport_size)
525
+ self.viewport_size = value.size
526
+
527
+ __events__ = ('on_scroll_start', 'on_scroll_move', 'on_scroll_stop')
528
+
529
+ def __init__(self, **kwargs):
530
+ self._touch = None
531
+ self._trigger_update_from_scroll = Clock.create_trigger(
532
+ self.update_from_scroll, -1)
533
+ # create a specific canvas for the viewport
534
+ from kivy.graphics import PushMatrix, Translate, PopMatrix, Canvas
535
+ self.canvas_viewport = Canvas()
536
+ self.canvas = Canvas()
537
+ with self.canvas_viewport.before:
538
+ PushMatrix()
539
+ self.g_translate = Translate(0, 0)
540
+ with self.canvas_viewport.after:
541
+ PopMatrix()
542
+
543
+ super(ScrollView, self).__init__(**kwargs)
544
+
545
+ self.register_event_type('on_scroll_start')
546
+ self.register_event_type('on_scroll_move')
547
+ self.register_event_type('on_scroll_stop')
548
+
549
+ # now add the viewport canvas to our canvas
550
+ self.canvas.add(self.canvas_viewport)
551
+
552
+ effect_cls = self.effect_cls
553
+ if isinstance(effect_cls, string_types):
554
+ effect_cls = Factory.get(effect_cls)
555
+ if self.effect_x is None and effect_cls is not None:
556
+ self.effect_x = effect_cls(target_widget=self._viewport)
557
+ if self.effect_y is None and effect_cls is not None:
558
+ self.effect_y = effect_cls(target_widget=self._viewport)
559
+
560
+ trigger_update_from_scroll = self._trigger_update_from_scroll
561
+ update_effect_widget = self._update_effect_widget
562
+ update_effect_x_bounds = self._update_effect_x_bounds
563
+ update_effect_y_bounds = self._update_effect_y_bounds
564
+ fbind = self.fbind
565
+ fbind('width', update_effect_x_bounds)
566
+ fbind('height', update_effect_y_bounds)
567
+ fbind('viewport_size', self._update_effect_bounds)
568
+ fbind('_viewport', update_effect_widget)
569
+ fbind('scroll_x', trigger_update_from_scroll)
570
+ fbind('scroll_y', trigger_update_from_scroll)
571
+ fbind('pos', trigger_update_from_scroll)
572
+ fbind('size', trigger_update_from_scroll)
573
+
574
+ trigger_update_from_scroll()
575
+ update_effect_widget()
576
+ update_effect_x_bounds()
577
+ update_effect_y_bounds()
578
+
579
+ def on_effect_x(self, instance, value):
580
+ if value:
581
+ value.bind(scroll=self._update_effect_x)
582
+ value.target_widget = self._viewport
583
+
584
+ def on_effect_y(self, instance, value):
585
+ if value:
586
+ value.bind(scroll=self._update_effect_y)
587
+ value.target_widget = self._viewport
588
+
589
+ def on_effect_cls(self, instance, cls):
590
+ if isinstance(cls, string_types):
591
+ cls = Factory.get(cls)
592
+ self.effect_x = cls(target_widget=self._viewport)
593
+ self.effect_x.bind(scroll=self._update_effect_x)
594
+ self.effect_y = cls(target_widget=self._viewport)
595
+ self.effect_y.bind(scroll=self._update_effect_y)
596
+
597
+ def _update_effect_widget(self, *args):
598
+ if self.effect_x:
599
+ self.effect_x.target_widget = self._viewport
600
+ if self.effect_y:
601
+ self.effect_y.target_widget = self._viewport
602
+
603
+ def _update_effect_x_bounds(self, *args):
604
+ if not self._viewport or not self.effect_x:
605
+ return
606
+ scrollable_width = self.width - self.viewport_size[0]
607
+ self.effect_x.min = 0
608
+ self.effect_x.max = min(0, scrollable_width)
609
+ self.effect_x.value = scrollable_width * self.scroll_x
610
+
611
+ def _update_effect_y_bounds(self, *args):
612
+ if not self._viewport or not self.effect_y:
613
+ return
614
+ scrollable_height = self.height - self.viewport_size[1]
615
+ self.effect_y.min = 0 if scrollable_height < 0 else scrollable_height
616
+ self.effect_y.max = scrollable_height
617
+ self.effect_y.value = self.effect_y.max * self.scroll_y
618
+
619
+ def _update_effect_bounds(self, *args):
620
+ self._update_effect_x_bounds()
621
+ self._update_effect_y_bounds()
622
+
623
+ def _update_effect_x(self, *args):
624
+ vp = self._viewport
625
+ if not vp or not self.effect_x:
626
+ return
627
+
628
+ if self.effect_x.is_manual:
629
+ sw = vp.width - self._effect_x_start_width
630
+ else:
631
+ sw = vp.width - self.width
632
+ if sw < 1 and not (self.always_overscroll and self.do_scroll_x):
633
+ return
634
+ if sw != 0:
635
+ sx = self.effect_x.scroll / sw
636
+ self.scroll_x = -sx
637
+ self._trigger_update_from_scroll()
638
+
639
+ def _update_effect_y(self, *args):
640
+ vp = self._viewport
641
+ if not vp or not self.effect_y:
642
+ return
643
+ if self.effect_y.is_manual:
644
+ sh = vp.height - self._effect_y_start_height
645
+ else:
646
+ sh = vp.height - self.height
647
+
648
+ if sh < 1 and not (self.always_overscroll and self.do_scroll_y):
649
+ return
650
+ if sh != 0:
651
+ sy = self.effect_y.scroll / sh
652
+ self.scroll_y = -sy
653
+ self._trigger_update_from_scroll()
654
+
655
+ def to_local(self, x, y, **k):
656
+ tx, ty = self.g_translate.xy
657
+ return x - tx, y - ty
658
+
659
+ def to_parent(self, x, y, **k):
660
+ tx, ty = self.g_translate.xy
661
+ return x + tx, y + ty
662
+
663
+ def _apply_transform(self, m, pos=None):
664
+ tx, ty = self.g_translate.xy
665
+ m.translate(tx, ty, 0)
666
+ return super(ScrollView, self)._apply_transform(m, (0, 0))
667
+
668
+ def simulate_touch_down(self, touch):
669
+ # at this point the touch is in parent coords
670
+ touch.push()
671
+ touch.apply_transform_2d(self.to_local)
672
+ ret = super(ScrollView, self).on_touch_down(touch)
673
+ touch.pop()
674
+ return ret
675
+
676
+ def on_motion(self, etype, me):
677
+ if me.type_id in self.motion_filter and 'pos' in me.profile:
678
+ me.push()
679
+ me.apply_transform_2d(self.to_local)
680
+ ret = super().on_motion(etype, me)
681
+ me.pop()
682
+ return ret
683
+ return super().on_motion(etype, me)
684
+
685
+ def on_touch_down(self, touch):
686
+ if self.dispatch('on_scroll_start', touch):
687
+ self._touch = touch
688
+ touch.grab(self)
689
+ return True
690
+
691
+ def _touch_in_handle(self, pos, size, touch):
692
+ x, y = pos
693
+ width, height = size
694
+ return x <= touch.x <= x + width and y <= touch.y <= y + height
695
+
696
+ def on_scroll_start(self, touch, check_children=True):
697
+ if check_children:
698
+ touch.push()
699
+ touch.apply_transform_2d(self.to_local)
700
+ if self.dispatch_children('on_scroll_start', touch):
701
+ touch.pop()
702
+ return True
703
+ touch.pop()
704
+
705
+ if not self.collide_point(*touch.pos):
706
+ touch.ud[self._get_uid('svavoid')] = True
707
+ return
708
+ if self.disabled:
709
+ return True
710
+ if self._touch or (not (self.do_scroll_x or self.do_scroll_y)):
711
+ return self.simulate_touch_down(touch)
712
+
713
+ # handle mouse scrolling, only if the viewport size is bigger than the
714
+ # scrollview size, and if the user allowed to do it
715
+ vp = self._viewport
716
+ if not vp:
717
+ return True
718
+ scroll_type = self.scroll_type
719
+ ud = touch.ud
720
+ scroll_bar = 'bars' in scroll_type
721
+
722
+ # check if touch is in bar_x(horizontal) or bar_y(vertical)
723
+ # width_enable_overscroll or vp.width > self.width
724
+ width_scrollable = (
725
+ (self.always_overscroll and self.do_scroll_x)
726
+ or vp.width > self.width
727
+ )
728
+ height_scrollable = (
729
+ (self.always_overscroll and self.do_scroll_y)
730
+ or vp.height > self.height
731
+ )
732
+
733
+ d = {'bottom': touch.y - self.y - self.bar_margin,
734
+ 'top': self.top - touch.y - self.bar_margin,
735
+ 'left': touch.x - self.x - self.bar_margin,
736
+ 'right': self.right - touch.x - self.bar_margin}
737
+
738
+ ud['in_bar_x'] = (scroll_bar and width_scrollable and
739
+ (0 <= d[self.bar_pos_x] <= self.bar_width))
740
+ ud['in_bar_y'] = (scroll_bar and height_scrollable and
741
+ (0 <= d[self.bar_pos_y] <= self.bar_width))
742
+
743
+ if 'button' in touch.profile and touch.button.startswith('scroll'):
744
+ btn = touch.button
745
+ m = self.scroll_wheel_distance
746
+ e = None
747
+
748
+ if (
749
+ (btn == 'scrolldown' and self.scroll_y >= 1)
750
+ or (btn == 'scrollup' and self.scroll_y <= 0)
751
+ or (btn == 'scrollleft' and self.scroll_x >= 1)
752
+ or (btn == 'scrollright' and self.scroll_x <= 0)
753
+ ):
754
+ return False
755
+
756
+ if (
757
+ self.effect_x
758
+ and self.do_scroll_y
759
+ and height_scrollable
760
+ and btn in ('scrolldown', 'scrollup')
761
+ ):
762
+ e = self.effect_x if ud['in_bar_x'] else self.effect_y
763
+
764
+ elif (
765
+ self.effect_y
766
+ and self.do_scroll_x
767
+ and width_scrollable
768
+ and btn in ('scrollleft', 'scrollright')
769
+ ):
770
+ e = self.effect_y if ud['in_bar_y'] else self.effect_x
771
+
772
+ if e:
773
+ # make sure the effect's value is synced to scroll value
774
+ self._update_effect_bounds()
775
+ if btn in ('scrolldown', 'scrollleft'):
776
+ if self.smooth_scroll_end:
777
+ e.velocity -= m * self.smooth_scroll_end
778
+ else:
779
+ if self.always_overscroll:
780
+ e.value = e.value - m
781
+ else:
782
+ e.value = max(e.value - m, e.max)
783
+ e.velocity = 0
784
+ elif btn in ('scrollup', 'scrollright'):
785
+ if self.smooth_scroll_end:
786
+ e.velocity += m * self.smooth_scroll_end
787
+ else:
788
+ if self.always_overscroll:
789
+ e.value = e.value + m
790
+ else:
791
+ e.value = min(e.value + m, e.min)
792
+ e.velocity = 0
793
+ touch.ud[self._get_uid('svavoid')] = True
794
+ e.trigger_velocity_update()
795
+ return True
796
+
797
+ in_bar = ud['in_bar_x'] or ud['in_bar_y']
798
+ if scroll_type == ['bars'] and not in_bar:
799
+ return self.simulate_touch_down(touch)
800
+
801
+ if in_bar:
802
+ if (ud['in_bar_y'] and not
803
+ self._touch_in_handle(
804
+ self._handle_y_pos, self._handle_y_size, touch)):
805
+ self.scroll_y = (touch.y - self.y) / self.height
806
+ elif (ud['in_bar_x'] and not
807
+ self._touch_in_handle(
808
+ self._handle_x_pos, self._handle_x_size, touch)):
809
+ self.scroll_x = (touch.x - self.x) / self.width
810
+
811
+ # no mouse scrolling, so the user is going to drag the scrollview with
812
+ # this touch.
813
+ self._touch = touch
814
+ uid = self._get_uid()
815
+
816
+ ud[uid] = {
817
+ 'mode': 'unknown',
818
+ 'dx': 0,
819
+ 'dy': 0,
820
+ 'user_stopped': in_bar,
821
+ 'frames': Clock.frames,
822
+ 'time': touch.time_start,
823
+ }
824
+
825
+ if (self.do_scroll_x and self.effect_x and not ud['in_bar_x']
826
+ and not ud['in_bar_y']):
827
+ # make sure the effect's value is synced to scroll value
828
+ self._update_effect_bounds()
829
+
830
+ self._effect_x_start_width = self.width
831
+ self.effect_x.start(touch.x)
832
+ self._scroll_x_mouse = self.scroll_x
833
+
834
+ if (self.do_scroll_y and self.effect_y and not ud['in_bar_x']
835
+ and not ud['in_bar_y']):
836
+ # make sure the effect's value is synced to scroll value
837
+ self._update_effect_bounds()
838
+
839
+ self._effect_y_start_height = self.height
840
+ self.effect_y.start(touch.y)
841
+ self._scroll_y_mouse = self.scroll_y
842
+
843
+ if not in_bar:
844
+ Clock.schedule_once(self._change_touch_mode,
845
+ self.scroll_timeout / 1000.)
846
+ return True
847
+
848
+ def on_touch_move(self, touch):
849
+ if self._touch is not touch:
850
+ # don't pass on touch to children if outside the sv
851
+ if self.collide_point(*touch.pos):
852
+ # touch is in parent
853
+ touch.push()
854
+ touch.apply_transform_2d(self.to_local)
855
+ super(ScrollView, self).on_touch_move(touch)
856
+ touch.pop()
857
+ return self._get_uid() in touch.ud
858
+ if touch.grab_current is not self:
859
+ return True
860
+
861
+ if not any(isinstance(key, str) and key.startswith('sv.')
862
+ for key in touch.ud):
863
+ # don't pass on touch to children if outside the sv
864
+ if self.collide_point(*touch.pos):
865
+ # touch is in window coordinates
866
+ touch.push()
867
+ touch.apply_transform_2d(self.to_local)
868
+ res = super(ScrollView, self).on_touch_move(touch)
869
+ touch.pop()
870
+ return res
871
+ return False
872
+
873
+ touch.ud['sv.handled'] = {'x': False, 'y': False}
874
+ if self.dispatch('on_scroll_move', touch):
875
+ return True
876
+
877
+ def on_scroll_move(self, touch):
878
+ if self._get_uid('svavoid') in touch.ud:
879
+ return False
880
+
881
+ touch.push()
882
+ touch.apply_transform_2d(self.to_local)
883
+ if self.dispatch_children('on_scroll_move', touch):
884
+ touch.pop()
885
+ return True
886
+ touch.pop()
887
+
888
+ rv = True
889
+
890
+ # By default this touch can be used to defocus currently focused
891
+ # widget, like any touch outside of ScrollView.
892
+ touch.ud['sv.can_defocus'] = True
893
+
894
+ uid = self._get_uid()
895
+ if uid not in touch.ud:
896
+ self._touch = False
897
+ return self.on_scroll_start(touch, False)
898
+ ud = touch.ud[uid]
899
+
900
+ # check if the minimum distance has been travelled
901
+ if ud['mode'] == 'unknown':
902
+ if not (self.do_scroll_x or self.do_scroll_y):
903
+ # touch is in parent, but _change expects window coords
904
+ touch.push()
905
+ touch.apply_transform_2d(self.to_local)
906
+ touch.apply_transform_2d(self.to_window)
907
+ self._change_touch_mode()
908
+ touch.pop()
909
+ return
910
+ ud['dx'] += abs(touch.dx)
911
+ ud['dy'] += abs(touch.dy)
912
+ if ((ud['dx'] > self.scroll_distance and self.do_scroll_x) or
913
+ (ud['dy'] > self.scroll_distance and self.do_scroll_y)):
914
+ ud['mode'] = 'scroll'
915
+
916
+ if ud['mode'] == 'scroll':
917
+ not_in_bar = not touch.ud.get('in_bar_x', False) and \
918
+ not touch.ud.get('in_bar_y', False)
919
+
920
+ if not touch.ud['sv.handled']['x'] and self.do_scroll_x \
921
+ and self.effect_x:
922
+ width = self.width
923
+ if touch.ud.get('in_bar_x', False):
924
+ if self.hbar[1] != 1:
925
+ dx = touch.dx / float(width - width * self.hbar[1])
926
+ self.scroll_x = min(max(self.scroll_x + dx, 0.), 1.)
927
+ self._trigger_update_from_scroll()
928
+ elif not_in_bar:
929
+ self.effect_x.update(touch.x)
930
+
931
+ if self.scroll_x < 0 or self.scroll_x > 1:
932
+ rv = False
933
+ else:
934
+ touch.ud['sv.handled']['x'] = True
935
+ # Touch resulted in scroll should not defocus focused widget
936
+ touch.ud['sv.can_defocus'] = False
937
+ if not touch.ud['sv.handled']['y'] and self.do_scroll_y \
938
+ and self.effect_y:
939
+ height = self.height
940
+ if touch.ud.get('in_bar_y', False) and self.vbar[1] != 1.0:
941
+ dy = touch.dy / float(height - height * self.vbar[1])
942
+ self.scroll_y = min(max(self.scroll_y + dy, 0.), 1.)
943
+ self._trigger_update_from_scroll()
944
+ elif not_in_bar:
945
+ self.effect_y.update(touch.y)
946
+
947
+ if self.scroll_y < 0 or self.scroll_y > 1:
948
+ rv = False
949
+ else:
950
+ touch.ud['sv.handled']['y'] = True
951
+ # Touch resulted in scroll should not defocus focused widget
952
+ touch.ud['sv.can_defocus'] = False
953
+ ud['dt'] = touch.time_update - ud['time']
954
+ ud['time'] = touch.time_update
955
+ ud['user_stopped'] = True
956
+ return rv
957
+
958
+ def on_touch_up(self, touch):
959
+ uid = self._get_uid('svavoid')
960
+ if self._touch is not touch and uid not in touch.ud:
961
+ # don't pass on touch to children if outside the sv
962
+ if self.collide_point(*touch.pos):
963
+ # touch is in parents
964
+ touch.push()
965
+ touch.apply_transform_2d(self.to_local)
966
+ if super(ScrollView, self).on_touch_up(touch):
967
+ touch.pop()
968
+ return True
969
+ touch.pop()
970
+ return False
971
+
972
+ if self.dispatch('on_scroll_stop', touch):
973
+ touch.ungrab(self)
974
+ if not touch.ud.get('sv.can_defocus', True):
975
+ # Focused widget should stay focused
976
+ FocusBehavior.ignored_touch.append(touch)
977
+ return True
978
+
979
+ def on_scroll_stop(self, touch, check_children=True):
980
+ self._touch = None
981
+
982
+ if check_children:
983
+ touch.push()
984
+ touch.apply_transform_2d(self.to_local)
985
+ if self.dispatch_children('on_scroll_stop', touch):
986
+ touch.pop()
987
+ return True
988
+ touch.pop()
989
+
990
+ if self._get_uid('svavoid') in touch.ud:
991
+ return
992
+ if self._get_uid() not in touch.ud:
993
+ return False
994
+
995
+ self._touch = None
996
+ uid = self._get_uid()
997
+ ud = touch.ud[uid]
998
+ not_in_bar = not touch.ud.get('in_bar_x', False) and \
999
+ not touch.ud.get('in_bar_y', False)
1000
+ if self.do_scroll_x and self.effect_x and not_in_bar:
1001
+ self.effect_x.stop(touch.x)
1002
+ if self.do_scroll_y and self.effect_y and not_in_bar:
1003
+ self.effect_y.stop(touch.y)
1004
+ if ud['mode'] == 'unknown':
1005
+ # we must do the click at least..
1006
+ # only send the click if it was not a click to stop
1007
+ # autoscrolling
1008
+ if not ud['user_stopped']:
1009
+ self.simulate_touch_down(touch)
1010
+ Clock.schedule_once(partial(self._do_touch_up, touch), .2)
1011
+
1012
+ ev = self._update_effect_bounds_ev
1013
+ if ev is None:
1014
+ ev = self._update_effect_bounds_ev = Clock.create_trigger(
1015
+ self._update_effect_bounds)
1016
+ ev()
1017
+
1018
+ # if we do mouse scrolling, always accept it
1019
+ if 'button' in touch.profile and touch.button.startswith('scroll'):
1020
+ return True
1021
+
1022
+ return self._get_uid() in touch.ud
1023
+
1024
+ def scroll_to(self, widget, padding=10, animate=True):
1025
+ '''Scrolls the viewport to ensure that the given widget is visible,
1026
+ optionally with padding and animation. If animate is True (the
1027
+ default), then the default animation parameters will be used.
1028
+ Otherwise, it should be a dict containing arguments to pass to
1029
+ :class:`~kivy.animation.Animation` constructor.
1030
+
1031
+ .. versionadded:: 1.9.1
1032
+ '''
1033
+ if not self.parent:
1034
+ return
1035
+
1036
+ # if _viewport is layout and has pending operation, reschedule
1037
+ if hasattr(self._viewport, 'do_layout'):
1038
+ if self._viewport._trigger_layout.is_triggered:
1039
+ Clock.schedule_once(
1040
+ lambda *dt: self.scroll_to(widget, padding, animate))
1041
+ return
1042
+
1043
+ if isinstance(padding, (int, float)):
1044
+ padding = (padding, padding)
1045
+
1046
+ pos = self.parent.to_widget(*widget.to_window(*widget.pos))
1047
+ cor = self.parent.to_widget(*widget.to_window(widget.right,
1048
+ widget.top))
1049
+
1050
+ dx = dy = 0
1051
+
1052
+ if pos[1] < self.y:
1053
+ dy = self.y - pos[1] + dp(padding[1])
1054
+ elif cor[1] > self.top:
1055
+ dy = self.top - cor[1] - dp(padding[1])
1056
+
1057
+ if pos[0] < self.x:
1058
+ dx = self.x - pos[0] + dp(padding[0])
1059
+ elif cor[0] > self.right:
1060
+ dx = self.right - cor[0] - dp(padding[0])
1061
+
1062
+ dsx, dsy = self.convert_distance_to_scroll(dx, dy)
1063
+ sxp = min(1, max(0, self.scroll_x - dsx))
1064
+ syp = min(1, max(0, self.scroll_y - dsy))
1065
+
1066
+ if animate:
1067
+ if animate is True:
1068
+ animate = {'d': 0.2, 't': 'out_quad'}
1069
+ Animation.stop_all(self, 'scroll_x', 'scroll_y')
1070
+ Animation(scroll_x=sxp, scroll_y=syp, **animate).start(self)
1071
+ else:
1072
+ self.scroll_x = sxp
1073
+ self.scroll_y = syp
1074
+
1075
+ def convert_distance_to_scroll(self, dx, dy):
1076
+ '''Convert a distance in pixels to a scroll distance, depending on the
1077
+ content size and the scrollview size.
1078
+
1079
+ The result will be a tuple of scroll distance that can be added to
1080
+ :data:`scroll_x` and :data:`scroll_y`
1081
+ '''
1082
+ if not self._viewport:
1083
+ return 0, 0
1084
+ vp = self._viewport
1085
+ if vp.width > self.width:
1086
+ sw = vp.width - self.width
1087
+ sx = dx / float(sw)
1088
+ else:
1089
+ sx = 0
1090
+ if vp.height > self.height:
1091
+ sh = vp.height - self.height
1092
+ sy = dy / float(sh)
1093
+ else:
1094
+ sy = 1
1095
+ return sx, sy
1096
+
1097
+ def update_from_scroll(self, *largs):
1098
+ '''Force the reposition of the content, according to current value of
1099
+ :attr:`scroll_x` and :attr:`scroll_y`.
1100
+
1101
+ This method is automatically called when one of the :attr:`scroll_x`,
1102
+ :attr:`scroll_y`, :attr:`pos` or :attr:`size` properties change, or
1103
+ if the size of the content changes.
1104
+ '''
1105
+ if not self._viewport:
1106
+ self.g_translate.xy = self.pos
1107
+ return
1108
+ vp = self._viewport
1109
+
1110
+ # update from size_hint
1111
+ if vp.size_hint_x is not None:
1112
+ w = vp.size_hint_x * self.width
1113
+ if vp.size_hint_min_x is not None:
1114
+ w = max(w, vp.size_hint_min_x)
1115
+ if vp.size_hint_max_x is not None:
1116
+ w = min(w, vp.size_hint_max_x)
1117
+ vp.width = w
1118
+
1119
+ if vp.size_hint_y is not None:
1120
+ h = vp.size_hint_y * self.height
1121
+ if vp.size_hint_min_y is not None:
1122
+ h = max(h, vp.size_hint_min_y)
1123
+ if vp.size_hint_max_y is not None:
1124
+ h = min(h, vp.size_hint_max_y)
1125
+ vp.height = h
1126
+
1127
+ if vp.width > self.width or self.always_overscroll:
1128
+ sw = vp.width - self.width
1129
+ x = self.x - self.scroll_x * sw
1130
+ else:
1131
+ x = self.x
1132
+
1133
+ if vp.height > self.height or self.always_overscroll:
1134
+ sh = vp.height - self.height
1135
+ y = self.y - self.scroll_y * sh
1136
+ else:
1137
+ y = self.top - vp.height
1138
+
1139
+ # from 1.8.0, we now use a matrix by default, instead of moving the
1140
+ # widget position behind. We set it here, but it will be a no-op most
1141
+ # of the time.
1142
+ vp.pos = 0, 0
1143
+ self.g_translate.xy = x, y
1144
+
1145
+ # New in 1.2.0, show bar when scrolling happens and (changed in 1.9.0)
1146
+ # fade to bar_inactive_color when no scroll is happening.
1147
+ ev = self._bind_inactive_bar_color_ev
1148
+ if ev is None:
1149
+ ev = self._bind_inactive_bar_color_ev = Clock.create_trigger(
1150
+ self._bind_inactive_bar_color, .5)
1151
+ self.funbind('bar_inactive_color', self._change_bar_color)
1152
+ Animation.stop_all(self, '_bar_color')
1153
+ self.fbind('bar_color', self._change_bar_color)
1154
+ self._bar_color = self.bar_color
1155
+ ev()
1156
+
1157
+ def _bind_inactive_bar_color(self, *l):
1158
+ self.funbind('bar_color', self._change_bar_color)
1159
+ self.fbind('bar_inactive_color', self._change_bar_color)
1160
+ Animation(
1161
+ _bar_color=self.bar_inactive_color,
1162
+ d=.5, t='out_quart').start(self)
1163
+
1164
+ def _change_bar_color(self, inst, value):
1165
+ self._bar_color = value
1166
+
1167
+ def add_widget(self, widget, *args, **kwargs):
1168
+ if self._viewport:
1169
+ raise Exception('ScrollView accept only one widget')
1170
+ canvas = self.canvas
1171
+ self.canvas = self.canvas_viewport
1172
+ super(ScrollView, self).add_widget(widget, *args, **kwargs)
1173
+ self.canvas = canvas
1174
+ self._viewport = widget
1175
+ widget.bind(size=self._trigger_update_from_scroll,
1176
+ size_hint_min=self._trigger_update_from_scroll)
1177
+ self._trigger_update_from_scroll()
1178
+
1179
+ def remove_widget(self, widget, *args, **kwargs):
1180
+ canvas = self.canvas
1181
+ self.canvas = self.canvas_viewport
1182
+ super(ScrollView, self).remove_widget(widget, *args, **kwargs)
1183
+ self.canvas = canvas
1184
+ if widget is self._viewport:
1185
+ self._viewport = None
1186
+
1187
+ def _get_uid(self, prefix='sv'):
1188
+ return '{0}.{1}'.format(prefix, self.uid)
1189
+
1190
+ def _change_touch_mode(self, *largs):
1191
+ if not self._touch:
1192
+ return
1193
+ uid = self._get_uid()
1194
+ touch = self._touch
1195
+ if uid not in touch.ud:
1196
+ self._touch = False
1197
+ return
1198
+ ud = touch.ud[uid]
1199
+ if ud['mode'] != 'unknown' or ud['user_stopped']:
1200
+ return
1201
+ diff_frames = Clock.frames - ud['frames']
1202
+
1203
+ # in order to be able to scroll on very slow devices, let at least 3
1204
+ # frames displayed to accumulate some velocity. And then, change the
1205
+ # touch mode. Otherwise, we might never be able to compute velocity,
1206
+ # and no way to scroll it. See #1464 and #1499
1207
+ if diff_frames < 3:
1208
+ Clock.schedule_once(self._change_touch_mode, 0)
1209
+ return
1210
+
1211
+ if self.do_scroll_x and self.effect_x:
1212
+ self.effect_x.cancel()
1213
+ if self.do_scroll_y and self.effect_y:
1214
+ self.effect_y.cancel()
1215
+ # XXX the next line was in the condition. But this stop
1216
+ # the possibility to "drag" an object out of the scrollview in the
1217
+ # non-used direction: if you have an horizontal scrollview, a
1218
+ # vertical gesture will not "stop" the scroll view to look for an
1219
+ # horizontal gesture, until the timeout is done.
1220
+ # and touch.dx + touch.dy == 0:
1221
+ touch.ungrab(self)
1222
+ self._touch = None
1223
+ # touch is in window coords
1224
+ touch.push()
1225
+ touch.apply_transform_2d(self.to_widget)
1226
+ touch.apply_transform_2d(self.to_parent)
1227
+ self.simulate_touch_down(touch)
1228
+ touch.pop()
1229
+ return
1230
+
1231
+ def _do_touch_up(self, touch, *largs):
1232
+ # touch is in window coords
1233
+ touch.push()
1234
+ touch.apply_transform_2d(self.to_widget)
1235
+ super(ScrollView, self).on_touch_up(touch)
1236
+ touch.pop()
1237
+ # don't forget about grab event!
1238
+ for x in touch.grab_list[:]:
1239
+ touch.grab_list.remove(x)
1240
+ x = x()
1241
+ if not x:
1242
+ continue
1243
+ touch.grab_current = x
1244
+ # touch is in window coords
1245
+ touch.push()
1246
+ touch.apply_transform_2d(self.to_widget)
1247
+ super(ScrollView, self).on_touch_up(touch)
1248
+ touch.pop()
1249
+ touch.grab_current = None
1250
+
1251
+
1252
+ if __name__ == '__main__':
1253
+ from kivy.app import App
1254
+
1255
+ from kivy.uix.gridlayout import GridLayout
1256
+ from kivy.uix.button import Button
1257
+
1258
+ class ScrollViewApp(App):
1259
+
1260
+ def build(self):
1261
+ layout1 = GridLayout(cols=4, spacing=10, size_hint=(None, None))
1262
+ layout1.bind(minimum_height=layout1.setter('height'),
1263
+ minimum_width=layout1.setter('width'))
1264
+ for i in range(40):
1265
+ btn = Button(text=str(i), size_hint=(None, None),
1266
+ size=(200, 100))
1267
+ layout1.add_widget(btn)
1268
+ scrollview1 = ScrollView(bar_width='2dp', smooth_scroll_end=10)
1269
+ scrollview1.add_widget(layout1)
1270
+
1271
+ layout2 = GridLayout(cols=4, spacing=10, size_hint=(None, None))
1272
+ layout2.bind(minimum_height=layout2.setter('height'),
1273
+ minimum_width=layout2.setter('width'))
1274
+ for i in range(40):
1275
+ btn = Button(text=str(i), size_hint=(None, None),
1276
+ size=(200, 100))
1277
+ layout2.add_widget(btn)
1278
+ scrollview2 = ScrollView(scroll_type=['bars'],
1279
+ bar_width='9dp',
1280
+ scroll_wheel_distance=100)
1281
+ scrollview2.add_widget(layout2)
1282
+
1283
+ root = GridLayout(cols=2)
1284
+ root.add_widget(scrollview1)
1285
+ root.add_widget(scrollview2)
1286
+ return root
1287
+
1288
+ ScrollViewApp().run()