PlotPy 2.6.2__tar.gz → 2.6.3__tar.gz

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 (522) hide show
  1. {plotpy-2.6.2 → plotpy-2.6.3}/CHANGELOG.md +23 -0
  2. {plotpy-2.6.2/PlotPy.egg-info → plotpy-2.6.3}/PKG-INFO +1 -1
  3. {plotpy-2.6.2 → plotpy-2.6.3/PlotPy.egg-info}/PKG-INFO +1 -1
  4. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/__init__.py +1 -1
  5. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/events.py +34 -29
  6. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/external/sliders/_generic_range_slider.py +18 -9
  7. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/external/sliders/_generic_slider.py +21 -6
  8. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/image/base.py +2 -1
  9. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/shape/polygon.py +4 -2
  10. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/shape/range.py +18 -19
  11. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/styles/image.py +4 -16
  12. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_image_data_update.py +23 -12
  13. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_transform.py +5 -7
  14. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_rect_zoom.py +1 -1
  15. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/utils.py +1 -0
  16. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/widgets/test_theme.py +11 -3
  17. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tools/image.py +7 -9
  18. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/colormap/editor.py +1 -1
  19. {plotpy-2.6.2 → plotpy-2.6.3}/setup.py +1 -1
  20. {plotpy-2.6.2 → plotpy-2.6.3}/src/histogram2d.c +127 -127
  21. {plotpy-2.6.2 → plotpy-2.6.3}/src/mandelbrot.c +127 -127
  22. {plotpy-2.6.2 → plotpy-2.6.3}/src/pcolor.cpp +0 -1
  23. {plotpy-2.6.2 → plotpy-2.6.3}/src/scaler.cpp +0 -1
  24. {plotpy-2.6.2 → plotpy-2.6.3}/LICENSE +0 -0
  25. {plotpy-2.6.2 → plotpy-2.6.3}/MANIFEST.in +0 -0
  26. {plotpy-2.6.2 → plotpy-2.6.3}/PlotPy.egg-info/SOURCES.txt +0 -0
  27. {plotpy-2.6.2 → plotpy-2.6.3}/PlotPy.egg-info/dependency_links.txt +0 -0
  28. {plotpy-2.6.2 → plotpy-2.6.3}/PlotPy.egg-info/entry_points.txt +0 -0
  29. {plotpy-2.6.2 → plotpy-2.6.3}/PlotPy.egg-info/requires.txt +0 -0
  30. {plotpy-2.6.2 → plotpy-2.6.3}/PlotPy.egg-info/top_level.txt +0 -0
  31. {plotpy-2.6.2 → plotpy-2.6.3}/README.md +0 -0
  32. {plotpy-2.6.2 → plotpy-2.6.3}/colormaps/README.md +0 -0
  33. {plotpy-2.6.2 → plotpy-2.6.3}/colormaps/_cm.py +0 -0
  34. {plotpy-2.6.2 → plotpy-2.6.3}/colormaps/colormap.py +0 -0
  35. {plotpy-2.6.2 → plotpy-2.6.3}/colormaps/matplotlib_cmaps.py +0 -0
  36. {plotpy-2.6.2 → plotpy-2.6.3}/doc/_static/favicon.ico +0 -0
  37. {plotpy-2.6.2 → plotpy-2.6.3}/doc/changelog.rst +0 -0
  38. {plotpy-2.6.2 → plotpy-2.6.3}/doc/conf.py +0 -0
  39. {plotpy-2.6.2 → plotpy-2.6.3}/doc/dev/build.rst +0 -0
  40. {plotpy-2.6.2 → plotpy-2.6.3}/doc/dev/contribute.rst +0 -0
  41. {plotpy-2.6.2 → plotpy-2.6.3}/doc/dev/guiqwt_to_plotpy.csv +0 -0
  42. {plotpy-2.6.2 → plotpy-2.6.3}/doc/dev/guiqwt_to_plotpy.rst +0 -0
  43. {plotpy-2.6.2 → plotpy-2.6.3}/doc/dev/index.rst +0 -0
  44. {plotpy-2.6.2 → plotpy-2.6.3}/doc/dev/platforms.rst +0 -0
  45. {plotpy-2.6.2 → plotpy-2.6.3}/doc/dev/v1_to_guidata_v3.csv +0 -0
  46. {plotpy-2.6.2 → plotpy-2.6.3}/doc/dev/v1_to_v2.csv +0 -0
  47. {plotpy-2.6.2 → plotpy-2.6.3}/doc/dev/v1_to_v2.rst +0 -0
  48. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/colormapmanager.rst +0 -0
  49. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/events.rst +0 -0
  50. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/fit.rst +0 -0
  51. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/fliprotate.rst +0 -0
  52. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/imagefile.rst +0 -0
  53. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/index.rst +0 -0
  54. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/io.rst +0 -0
  55. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/items/builder.rst +0 -0
  56. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/items/examples.rst +0 -0
  57. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/items/index.rst +0 -0
  58. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/items/overview.rst +0 -0
  59. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/items/reference.rst +0 -0
  60. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/mathutils/colormaps.rst +0 -0
  61. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/mathutils/geometry.rst +0 -0
  62. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/mathutils/index.rst +0 -0
  63. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/mathutils/scaler.rst +0 -0
  64. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/panels/index.rst +0 -0
  65. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/panels/overview.rst +0 -0
  66. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/panels/reference.rst +0 -0
  67. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/plot/examples.rst +0 -0
  68. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/plot/index.rst +0 -0
  69. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/plot/overview.rst +0 -0
  70. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/plot/reference.rst +0 -0
  71. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/pyplot.rst +0 -0
  72. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/resizedialog.rst +0 -0
  73. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/rotatecrop.rst +0 -0
  74. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/selectdialog.rst +0 -0
  75. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/signals.rst +0 -0
  76. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/styles/index.rst +0 -0
  77. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/styles/overview.rst +0 -0
  78. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/styles/reference.rst +0 -0
  79. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/tools/examples.rst +0 -0
  80. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/tools/index.rst +0 -0
  81. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/tools/overview.rst +0 -0
  82. {plotpy-2.6.2 → plotpy-2.6.3}/doc/features/tools/reference.rst +0 -0
  83. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/my_plot_manager.png +0 -0
  84. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/my_plot_manager.svg +0 -0
  85. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/panorama-vertical.png +0 -0
  86. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/panorama-vertical.svg +0 -0
  87. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/panorama.png +0 -0
  88. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/panorama.svg +0 -0
  89. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/plot_widgets.png +0 -0
  90. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/plot_widgets.svg +0 -0
  91. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/plotpy-banner.png +0 -0
  92. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/plotpy-vertical.png +0 -0
  93. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/__init__.png +0 -0
  94. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/computations.png +0 -0
  95. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/contrast.png +0 -0
  96. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/cross_section.png +0 -0
  97. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/cross_section2.png +0 -0
  98. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/dotarraydemo.png +0 -0
  99. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/filtertest1.png +0 -0
  100. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/filtertest2.png +0 -0
  101. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/fit.png +0 -0
  102. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/get_point.png +0 -0
  103. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/hist2d.png +0 -0
  104. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/image_plot_tools.png +0 -0
  105. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/imagefilter.png +0 -0
  106. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/imagesuperp.png +0 -0
  107. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/imagexy.png +0 -0
  108. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/manager.png +0 -0
  109. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/mandelbrot.png +0 -0
  110. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/pcolor.png +0 -0
  111. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/plot.png +0 -0
  112. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/simple_dialog.png +0 -0
  113. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/simple_window.png +0 -0
  114. {plotpy-2.6.2 → plotpy-2.6.3}/doc/images/screenshots/transform.png +0 -0
  115. {plotpy-2.6.2 → plotpy-2.6.3}/doc/index.rst +0 -0
  116. {plotpy-2.6.2 → plotpy-2.6.3}/doc/intro/examples.rst +0 -0
  117. {plotpy-2.6.2 → plotpy-2.6.3}/doc/intro/index.rst +0 -0
  118. {plotpy-2.6.2 → plotpy-2.6.3}/doc/intro/installation.rst +0 -0
  119. {plotpy-2.6.2 → plotpy-2.6.3}/doc/intro/licenses.rst +0 -0
  120. {plotpy-2.6.2 → plotpy-2.6.3}/doc/intro/motivation.rst +0 -0
  121. {plotpy-2.6.2 → plotpy-2.6.3}/doc/intro/overview.rst +0 -0
  122. {plotpy-2.6.2 → plotpy-2.6.3}/doc/requirements.rst +0 -0
  123. {plotpy-2.6.2 → plotpy-2.6.3}/doc/update_requirements.py +0 -0
  124. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/builder/__init__.py +0 -0
  125. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/builder/annotation.py +0 -0
  126. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/builder/curvemarker.py +0 -0
  127. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/builder/image.py +0 -0
  128. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/builder/label.py +0 -0
  129. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/builder/plot.py +0 -0
  130. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/builder/shape.py +0 -0
  131. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/config.py +0 -0
  132. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/constants.py +0 -0
  133. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/coords.py +0 -0
  134. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/colormaps_default.json +0 -0
  135. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/apply.png +0 -0
  136. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/arredit.png +0 -0
  137. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/arrow_down.png +0 -0
  138. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/arrow_up.png +0 -0
  139. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/autorefresh.png +0 -0
  140. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/autoscale.png +0 -0
  141. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/axes.png +0 -0
  142. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/busy.png +0 -0
  143. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/cell_edit.png +0 -0
  144. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/center.png +0 -0
  145. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/cmap_edit.png +0 -0
  146. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/contrast.png +0 -0
  147. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/copy.png +0 -0
  148. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/copytoclipboard.png +0 -0
  149. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/csapplylut.png +0 -0
  150. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/csautoscale.png +0 -0
  151. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/csection.png +0 -0
  152. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/csection_a.png +0 -0
  153. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/csection_line.png +0 -0
  154. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/csection_oblique.png +0 -0
  155. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/csperimage.png +0 -0
  156. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/curve_downsample.png +0 -0
  157. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/curvestyles/dots.png +0 -0
  158. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/curvestyles/lines.png +0 -0
  159. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/curvestyles/steps.png +0 -0
  160. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/curvestyles/sticks.png +0 -0
  161. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/curvetypes/xfy.png +0 -0
  162. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/curvetypes/yfx.png +0 -0
  163. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/delete.png +0 -0
  164. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/edit.png +0 -0
  165. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/edit_point_selection.png +0 -0
  166. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/editors/edit.png +0 -0
  167. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/editors/edit_add.png +0 -0
  168. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/editors/editcopy.png +0 -0
  169. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/editors/editdelete.png +0 -0
  170. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/editors/editpaste.png +0 -0
  171. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/editors/fileimport.png +0 -0
  172. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/editors/filesave.png +0 -0
  173. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/editors/imshow.png +0 -0
  174. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/editors/insert.png +0 -0
  175. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/editors/plot.png +0 -0
  176. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/editors/rename.png +0 -0
  177. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/eliminate_outliers.png +0 -0
  178. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/eraser.png +0 -0
  179. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/exit.png +0 -0
  180. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/expander_down.png +0 -0
  181. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/expander_right.png +0 -0
  182. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/export.png +0 -0
  183. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/file.png +0 -0
  184. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/fileclose.png +0 -0
  185. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/fileimport.png +0 -0
  186. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filenew.png +0 -0
  187. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/fileopen.png +0 -0
  188. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filesave.png +0 -0
  189. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filesaveas.png +0 -0
  190. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filetypes/doc.png +0 -0
  191. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filetypes/gif.png +0 -0
  192. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filetypes/html.png +0 -0
  193. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filetypes/jpg.png +0 -0
  194. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filetypes/pdf.png +0 -0
  195. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filetypes/png.png +0 -0
  196. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filetypes/pps.png +0 -0
  197. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filetypes/ps.png +0 -0
  198. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filetypes/tar.png +0 -0
  199. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filetypes/tgz.png +0 -0
  200. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filetypes/tif.png +0 -0
  201. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filetypes/txt.png +0 -0
  202. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filetypes/xls.png +0 -0
  203. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/filetypes/zip.png +0 -0
  204. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/font.png +0 -0
  205. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/full_range.png +0 -0
  206. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/funct.png +0 -0
  207. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/hcursor.png +0 -0
  208. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/hflip.png +0 -0
  209. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/imagestats.png +0 -0
  210. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/item_list.png +0 -0
  211. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/items/annotation.png +0 -0
  212. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/items/curve.png +0 -0
  213. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/items/errorbar.png +0 -0
  214. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/items/grid.png +0 -0
  215. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/items/histogram.png +0 -0
  216. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/items/histogram2d.png +0 -0
  217. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/items/image.png +0 -0
  218. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/items/label.png +0 -0
  219. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/items/legend.png +0 -0
  220. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/items/polygonmap.png +0 -0
  221. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/magnifier.png +0 -0
  222. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markers/cross.png +0 -0
  223. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markers/diamond.png +0 -0
  224. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markers/ellipse.png +0 -0
  225. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markers/hexagon.png +0 -0
  226. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markers/point.png +0 -0
  227. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markers/square.png +0 -0
  228. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markers/star.png +0 -0
  229. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markers/triangle_d.png +0 -0
  230. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markers/triangle_l.png +0 -0
  231. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markers/triangle_r.png +0 -0
  232. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markers/triangle_u.png +0 -0
  233. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markers/xcross.png +0 -0
  234. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markerstyles/cross_marker.png +0 -0
  235. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markerstyles/horiz_marker.png +0 -0
  236. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/markerstyles/vert_marker.png +0 -0
  237. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/mask/mask_circle.png +0 -0
  238. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/mask/mask_circle_outside.png +0 -0
  239. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/mask/mask_rectangle.png +0 -0
  240. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/mask/mask_rectangle_outside.png +0 -0
  241. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/mask/mask_tool.png +0 -0
  242. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/max.png +0 -0
  243. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/min.png +0 -0
  244. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/move.png +0 -0
  245. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/multipoint_selection.png +0 -0
  246. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/none.png +0 -0
  247. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/not_found.png +0 -0
  248. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/on_curve.png +0 -0
  249. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/bdiagpattern.png +0 -0
  250. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/crosspattern.png +0 -0
  251. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/dense1pattern.png +0 -0
  252. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/dense2pattern.png +0 -0
  253. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/dense3pattern.png +0 -0
  254. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/dense4pattern.png +0 -0
  255. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/dense5pattern.png +0 -0
  256. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/dense6pattern.png +0 -0
  257. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/dense7pattern.png +0 -0
  258. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/diagcrosspattern.png +0 -0
  259. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/fdiagpattern.png +0 -0
  260. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/horpattern.png +0 -0
  261. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/nobrush.png +0 -0
  262. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/solidpattern.png +0 -0
  263. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/patterns/verpattern.png +0 -0
  264. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/plotpy-banner.svg +0 -0
  265. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/plotpy-vertical.svg +0 -0
  266. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/plotpy.svg +0 -0
  267. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/point_selection.png +0 -0
  268. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/print.png +0 -0
  269. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/python.png +0 -0
  270. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/quickview.png +0 -0
  271. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/rectangular_select.png +0 -0
  272. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/refresh.png +0 -0
  273. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/save_all.png +0 -0
  274. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/scales/lin_lin.png +0 -0
  275. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/scales/lin_log.png +0 -0
  276. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/scales/log_lin.png +0 -0
  277. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/scales/log_log.png +0 -0
  278. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/selection.png +0 -0
  279. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/settings.png +0 -0
  280. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/shape.png +0 -0
  281. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/shapes/circle.png +0 -0
  282. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/shapes/contour.png +0 -0
  283. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/shapes/ellipse_shape.png +0 -0
  284. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/shapes/freeform.png +0 -0
  285. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/shapes/gtaxes.png +0 -0
  286. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/shapes/marker.png +0 -0
  287. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/shapes/oblique_rectangle.png +0 -0
  288. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/shapes/point_shape.png +0 -0
  289. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/shapes/polyline.png +0 -0
  290. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/shapes/rectangle.png +0 -0
  291. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/shapes/segment.png +0 -0
  292. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/snapshot.png +0 -0
  293. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/styles/dash.png +0 -0
  294. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/styles/dashdot.png +0 -0
  295. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/styles/dashdotdot.png +0 -0
  296. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/styles/dot.png +0 -0
  297. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/styles/solid.png +0 -0
  298. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/trash.png +0 -0
  299. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/trimage_lock.png +0 -0
  300. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/trimage_unlock.png +0 -0
  301. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/vcursor.png +0 -0
  302. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/vflip.png +0 -0
  303. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/xcursor.png +0 -0
  304. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/xmax.png +0 -0
  305. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/xmin.png +0 -0
  306. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/xrange.png +0 -0
  307. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/data/icons/zlog.svg +0 -0
  308. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/external/__init__.py +0 -0
  309. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/external/sliders/__init__.py +0 -0
  310. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/external/sliders/_labeled.py +0 -0
  311. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/external/sliders/_misc.py +0 -0
  312. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/external/sliders/_range_style.py +0 -0
  313. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/external/sliders/_sliders.py +0 -0
  314. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/interfaces/__init__.py +0 -0
  315. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/interfaces/items.py +0 -0
  316. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/interfaces/panel.py +0 -0
  317. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/interfaces/plotmanager.py +0 -0
  318. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/io.py +0 -0
  319. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/__init__.py +0 -0
  320. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/annotation.py +0 -0
  321. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/contour.py +0 -0
  322. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/curve/__init__.py +0 -0
  323. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/curve/base.py +0 -0
  324. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/curve/errorbar.py +0 -0
  325. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/grid.py +0 -0
  326. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/histogram.py +0 -0
  327. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/image/__init__.py +0 -0
  328. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/image/filter.py +0 -0
  329. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/image/image_items.py +0 -0
  330. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/image/masked.py +0 -0
  331. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/image/misc.py +0 -0
  332. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/image/transform.py +0 -0
  333. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/label.py +0 -0
  334. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/polygonmap.py +0 -0
  335. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/shape/__init__.py +0 -0
  336. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/shape/axis.py +0 -0
  337. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/shape/base.py +0 -0
  338. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/shape/ellipse.py +0 -0
  339. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/shape/marker.py +0 -0
  340. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/shape/point.py +0 -0
  341. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/shape/rectangle.py +0 -0
  342. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/shape/segment.py +0 -0
  343. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/items/shape/svg.py +0 -0
  344. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/locale/fr/LC_MESSAGES/plotpy.mo +0 -0
  345. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/lutrange.py +0 -0
  346. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/mathutils/__init__.py +0 -0
  347. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/mathutils/arrayfuncs.py +0 -0
  348. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/mathutils/colormap.py +0 -0
  349. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/mathutils/geometry.py +0 -0
  350. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/mathutils/scaler.py +0 -0
  351. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/panels/__init__.py +0 -0
  352. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/panels/base.py +0 -0
  353. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/panels/contrastadjustment.py +0 -0
  354. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/panels/csection/__init__.py +0 -0
  355. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/panels/csection/csitem.py +0 -0
  356. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/panels/csection/csplot.py +0 -0
  357. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/panels/csection/cswidget.py +0 -0
  358. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/panels/itemlist.py +0 -0
  359. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/plot/__init__.py +0 -0
  360. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/plot/base.py +0 -0
  361. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/plot/interactive.py +0 -0
  362. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/plot/manager.py +0 -0
  363. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/plot/plotwidget.py +0 -0
  364. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/pyplot.py +0 -0
  365. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/styles/__init__.py +0 -0
  366. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/styles/axes.py +0 -0
  367. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/styles/base.py +0 -0
  368. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/styles/curve.py +0 -0
  369. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/styles/errorbar.py +0 -0
  370. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/styles/histogram.py +0 -0
  371. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/styles/label.py +0 -0
  372. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/styles/polygonmap.py +0 -0
  373. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/styles/shape.py +0 -0
  374. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/__init__.py +0 -0
  375. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/benchmarks/__init__.py +0 -0
  376. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/benchmarks/test_benchmarks.py +0 -0
  377. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/benchmarks/test_bigimages.py +0 -0
  378. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/benchmarks/test_loadtest.py +0 -0
  379. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/conftest.py +0 -0
  380. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/data/brain.png +0 -0
  381. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/data/brain_cylinder.png +0 -0
  382. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/data/mr-brain.dcm +0 -0
  383. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/data/svg_target.svg +0 -0
  384. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/data/svg_tool.svg +0 -0
  385. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/data.py +0 -0
  386. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/__init__.py +0 -0
  387. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_auto_curve_image.py +0 -0
  388. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_autoscale_shapes.py +0 -0
  389. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_builder.py +0 -0
  390. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_colormap_editor.py +0 -0
  391. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_colormap_manager.py +0 -0
  392. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_computations.py +0 -0
  393. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_contrast.py +0 -0
  394. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_cursors.py +0 -0
  395. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_dicom_image.py +0 -0
  396. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_fit.py +0 -0
  397. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_image_coords.py +0 -0
  398. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_imagefilter.py +0 -0
  399. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_imagesuperp.py +0 -0
  400. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_loadsaveitems_hdf5.py +0 -0
  401. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_loadsaveitems_json.py +0 -0
  402. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_loadsaveitems_pickle.py +0 -0
  403. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_manager.py +0 -0
  404. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_no_auto_tools.py +0 -0
  405. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_plot_log.py +0 -0
  406. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_plot_types.py +0 -0
  407. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_plot_yreverse.py +0 -0
  408. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_pyplot.py +0 -0
  409. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/features/test_resize.py +0 -0
  410. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/__init__.py +0 -0
  411. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_annotations.py +0 -0
  412. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_curves.py +0 -0
  413. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_curves_highdpi.py +0 -0
  414. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_hist2d.py +0 -0
  415. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_histogram.py +0 -0
  416. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_image.py +0 -0
  417. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_image_contour.py +0 -0
  418. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_image_masked.py +0 -0
  419. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_image_masked_xy.py +0 -0
  420. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_image_rgb.py +0 -0
  421. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_image_xy.py +0 -0
  422. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_mandelbrot.py +0 -0
  423. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_pcolor.py +0 -0
  424. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_polygons.py +0 -0
  425. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/items/test_svgshapes.py +0 -0
  426. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/__init__.py +0 -0
  427. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_actiontool.py +0 -0
  428. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_cross_section.py +0 -0
  429. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_cross_section_line.py +0 -0
  430. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_cross_section_oblique.py +0 -0
  431. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_customize_shape_tool.py +0 -0
  432. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_cyclic_import.py +0 -0
  433. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_downsample_curve.py +0 -0
  434. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_edit_point.py +0 -0
  435. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_get_point.py +0 -0
  436. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_get_points.py +0 -0
  437. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_get_rectangle.py +0 -0
  438. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_get_rectangle_with_svg.py +0 -0
  439. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_get_segment.py +0 -0
  440. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_image_plot_tools.py +0 -0
  441. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_stats_tools.py +0 -0
  442. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/tools/test_zaxislog.py +0 -0
  443. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/__init__.py +0 -0
  444. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_annotation_tools.py +0 -0
  445. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_aspect_ratio_tool.py +0 -0
  446. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_baseplot.py +0 -0
  447. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_builder_annotation.py +0 -0
  448. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_builder_curve.py +0 -0
  449. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_builder_image.py +0 -0
  450. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_builder_shape.py +0 -0
  451. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_contour.py +0 -0
  452. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_cursor_tools.py +0 -0
  453. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_curve_tools.py +0 -0
  454. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_display_coords_tool.py +0 -0
  455. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_events.py +0 -0
  456. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_fontparam.py +0 -0
  457. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_geometry.py +0 -0
  458. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_io.py +0 -0
  459. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_line.py +0 -0
  460. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_line_cross_section_tool.py +0 -0
  461. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_manipulate_selection.py +0 -0
  462. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_mask_tool.py +0 -0
  463. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_multiline_tools.py +0 -0
  464. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_oblique_cross_section_tool.py +0 -0
  465. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_plot_curve.py +0 -0
  466. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_plot_image.py +0 -0
  467. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_seg_dist.py +0 -0
  468. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_styles.py +0 -0
  469. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/unit/test_tools_export.py +0 -0
  470. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/vistools.py +0 -0
  471. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/widgets/__init__.py +0 -0
  472. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/widgets/test_dotarraydemo.py +0 -0
  473. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/widgets/test_filtertest1.py +0 -0
  474. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/widgets/test_filtertest2.py +0 -0
  475. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/widgets/test_fliprotate.py +0 -0
  476. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/widgets/test_plot_timecurve.py +0 -0
  477. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/widgets/test_qtdesigner.py +0 -0
  478. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/widgets/test_qtdesigner.ui +0 -0
  479. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/widgets/test_resize_dialog.py +0 -0
  480. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/widgets/test_rotatecrop.py +0 -0
  481. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/widgets/test_simple_dialog.py +0 -0
  482. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/widgets/test_simple_window.py +0 -0
  483. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tests/widgets/test_syncplot.py +0 -0
  484. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tools/__init__.py +0 -0
  485. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tools/annotation.py +0 -0
  486. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tools/axes.py +0 -0
  487. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tools/base.py +0 -0
  488. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tools/cross_section.py +0 -0
  489. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tools/cursor.py +0 -0
  490. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tools/curve.py +0 -0
  491. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tools/item.py +0 -0
  492. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tools/label.py +0 -0
  493. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tools/misc.py +0 -0
  494. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tools/plot.py +0 -0
  495. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tools/selection.py +0 -0
  496. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/tools/shape.py +0 -0
  497. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/__init__.py +0 -0
  498. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/about.py +0 -0
  499. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/basetransform.py +0 -0
  500. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/colormap/__init__.py +0 -0
  501. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/colormap/_slider.py +0 -0
  502. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/colormap/manager.py +0 -0
  503. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/colormap/widget.py +0 -0
  504. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/fit.py +0 -0
  505. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/fliprotate.py +0 -0
  506. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/imagefile.py +0 -0
  507. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/qtdesigner.py +0 -0
  508. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/resizedialog.py +0 -0
  509. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/rotatecrop.py +0 -0
  510. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy/widgets/selectdialog.py +0 -0
  511. {plotpy-2.6.2 → plotpy-2.6.3}/plotpy-tests.desktop +0 -0
  512. {plotpy-2.6.2 → plotpy-2.6.3}/pyproject.toml +0 -0
  513. {plotpy-2.6.2 → plotpy-2.6.3}/qtdesigner/plotplugin.py +0 -0
  514. {plotpy-2.6.2 → plotpy-2.6.3}/requirements.txt +0 -0
  515. {plotpy-2.6.2 → plotpy-2.6.3}/setup.cfg +0 -0
  516. {plotpy-2.6.2 → plotpy-2.6.3}/src/arrays.hpp +0 -0
  517. {plotpy-2.6.2 → plotpy-2.6.3}/src/debug.hpp +0 -0
  518. {plotpy-2.6.2 → plotpy-2.6.3}/src/histogram2d.pyx +0 -0
  519. {plotpy-2.6.2 → plotpy-2.6.3}/src/mandelbrot.pyx +0 -0
  520. {plotpy-2.6.2 → plotpy-2.6.3}/src/points.hpp +0 -0
  521. {plotpy-2.6.2 → plotpy-2.6.3}/src/scaler.hpp +0 -0
  522. {plotpy-2.6.2 → plotpy-2.6.3}/src/traits.hpp +0 -0
@@ -1,5 +1,28 @@
1
1
  # Changelog #
2
2
 
3
+ ## Version 2.6.3 ##
4
+
5
+ 🧯 In this release, test coverage is 79%.
6
+
7
+ 🛠️ Bug fixes:
8
+
9
+ * [Issue #25](https://github.com/PlotPyStack/PlotPy/issues/25) - `OverflowError` with Contrast Adjustment panel for constant images
10
+ * When updating image parameters (`ImageParam`) from the associated item object:
11
+ * If `xmin`, `xmax`, `ymin`, `ymax` attributes are not yet set (i.e. `None`), do not update them with the image data bounds
12
+ * Previous behavior was to update them with the image data bounds, which was leading to breaking the automatic bounds update when the image data is updated
13
+ * [Issue #24](https://github.com/PlotPyStack/PlotPy/issues/24) - Colormap: side effect on image axes when changing the colormap
14
+ * [Issue #23](https://github.com/PlotPyStack/PlotPy/issues/23) - Windows: Image `_scaler` engine performance regression
15
+ * PySide6 compatibility issues:
16
+ * Fixed deprecated call to `QMouseEvent` in `tests/unit/utils.py`
17
+ * Added workaround for `QPolygonF` shape point slicing
18
+ * [Issue #21](https://github.com/PlotPyStack/PlotPy/issues/21) - PySide6 on Linux: segfault in test_colormap_editor.py
19
+ * Fixed `sliderMoved` signal connection in `ColorMapEditor`
20
+ * Fixed `AssertionError` in test_rect_zoom.py (Linux, Python 3.12, PyQt6)
21
+ * Fixed typing issues in `plotpy.events` module:
22
+ * Event objects were not properly typed (`QtCore.QEvent` instead of `QtGui.QMouseEvent`)
23
+ * Event position arguments were not properly typed (`QtCore.QPoint` instead of `QtCore.QPointF`)
24
+ * Fix NumPy `FutureWarning: Format strings passed to MaskedConstant are ignored [...]` when displaying masked pixel coordinates
25
+
3
26
  ## Version 2.6.2 ##
4
27
 
5
28
  💥 New features / Enhancements:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PlotPy
3
- Version: 2.6.2
3
+ Version: 2.6.3
4
4
  Summary: Curve and image plotting tools for Python/Qt applications
5
5
  Author-email: Codra <p.raybaut@codra.fr>
6
6
  License: BSD 3-Clause License
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PlotPy
3
- Version: 2.6.2
3
+ Version: 2.6.3
4
4
  Summary: Curve and image plotting tools for Python/Qt applications
5
5
  Author-email: Codra <p.raybaut@codra.fr>
6
6
  License: BSD 3-Clause License
@@ -20,7 +20,7 @@ External resources:
20
20
  .. _GitHub: https://github.com/PierreRaybaut/plotpy
21
21
  """
22
22
 
23
- __version__ = "2.6.2"
23
+ __version__ = "2.6.3"
24
24
  __VERSION__ = tuple([int(number) for number in __version__.split(".")])
25
25
 
26
26
  # --- Important note: DATAPATH and LOCALEPATH are used by guidata.configtools
@@ -98,6 +98,7 @@ from plotpy.items.shape.marker import Marker
98
98
 
99
99
  if TYPE_CHECKING:
100
100
  from qtpy.QtCore import QPoint
101
+ from qtpy.QtGui import QMouseEvent
101
102
 
102
103
  from plotpy.plot.base import BasePlot
103
104
 
@@ -259,7 +260,7 @@ class MouseEventMatch(EventMatch):
259
260
  """Return the set of event types handled by this event match"""
260
261
  return frozenset((self.evt_type,))
261
262
 
262
- def __call__(self, event: QG.QMouseEvent) -> bool:
263
+ def __call__(self, event: QMouseEvent) -> bool:
263
264
  """Returns True if the event matches the event match
264
265
 
265
266
  Args:
@@ -282,7 +283,7 @@ class MouseEventMatch(EventMatch):
282
283
 
283
284
 
284
285
  class MouseMoveMatch(MouseEventMatch):
285
- def __call__(self, event: QG.QMouseEvent) -> bool:
286
+ def __call__(self, event: QMouseEvent) -> bool:
286
287
  """Returns True if the event matches the event match
287
288
 
288
289
  Args:
@@ -655,7 +656,7 @@ class DragHandler(QC.QObject):
655
656
  self.last = QC.QPointF(pos)
656
657
  return dx, dy
657
658
 
658
- def start_tracking(self, _filter: StatefulEventFilter, event: QC.QEvent) -> None:
659
+ def start_tracking(self, _filter: StatefulEventFilter, event: QMouseEvent) -> None:
659
660
  """Start tracking the mouse movement
660
661
 
661
662
  Args:
@@ -664,7 +665,7 @@ class DragHandler(QC.QObject):
664
665
  """
665
666
  self.start = self.last = QC.QPointF(event.pos())
666
667
 
667
- def start_moving(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
668
+ def start_moving(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
668
669
  """Start moving the mouse
669
670
 
670
671
  Args:
@@ -673,7 +674,7 @@ class DragHandler(QC.QObject):
673
674
  """
674
675
  return self.move(filter, event)
675
676
 
676
- def stop_tracking(self, _filter: StatefulEventFilter, _event: QC.QEvent) -> None:
677
+ def stop_tracking(self, _filter: StatefulEventFilter, _event: QMouseEvent) -> None:
677
678
  """Stop tracking the mouse movement
678
679
 
679
680
  Args:
@@ -683,7 +684,7 @@ class DragHandler(QC.QObject):
683
684
  pass
684
685
  # filter.plot.canvas().setMouseTracking(self.parent_tracking)
685
686
 
686
- def stop_notmoving(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
687
+ def stop_notmoving(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
687
688
  """Stop tracking the mouse movement when the mouse is not moving.
688
689
 
689
690
  Args:
@@ -692,7 +693,7 @@ class DragHandler(QC.QObject):
692
693
  """
693
694
  self.stop_tracking(filter, event)
694
695
 
695
- def stop_moving(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
696
+ def stop_moving(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
696
697
  """Stop moving the mouse
697
698
 
698
699
  Args:
@@ -701,7 +702,7 @@ class DragHandler(QC.QObject):
701
702
  """
702
703
  self.stop_tracking(filter, event)
703
704
 
704
- def move(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
705
+ def move(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
705
706
  """Move the mouse
706
707
 
707
708
  Args:
@@ -755,28 +756,28 @@ class ClickHandler(QC.QObject):
755
756
  class PanHandler(DragHandler):
756
757
  cursor = QC.Qt.ClosedHandCursor
757
758
 
758
- def move(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
759
+ def move(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
759
760
  """Move the mouse.
760
761
 
761
762
  Args:
762
763
  filter: The StatefulEventFilter instance.
763
764
  event: The mouse event.
764
765
  """
765
- x_state, y_state = self.get_move_state(filter, event.pos())
766
+ x_state, y_state = self.get_move_state(filter, QC.QPointF(event.pos()))
766
767
  filter.plot.do_pan_view(x_state, y_state)
767
768
 
768
769
 
769
770
  class ZoomHandler(DragHandler):
770
771
  cursor = QC.Qt.SizeAllCursor
771
772
 
772
- def move(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
773
+ def move(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
773
774
  """Move the mouse.
774
775
 
775
776
  Args:
776
777
  filter: The StatefulEventFilter instance.
777
778
  event: The mouse event.
778
779
  """
779
- x_state, y_state = self.get_move_state(filter, event.pos())
780
+ x_state, y_state = self.get_move_state(filter, QC.QPointF(event.pos()))
780
781
  filter.plot.do_zoom_view(x_state, y_state)
781
782
 
782
783
 
@@ -1144,7 +1145,7 @@ class QtDragHandler(DragHandler):
1144
1145
  #: Signal emitted by QtDragHandler when moving
1145
1146
  SIG_MOVE = QC.Signal(object, "QEvent")
1146
1147
 
1147
- def start_tracking(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
1148
+ def start_tracking(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
1148
1149
  """Starts tracking the drag event.
1149
1150
 
1150
1151
  Args:
@@ -1154,7 +1155,7 @@ class QtDragHandler(DragHandler):
1154
1155
  DragHandler.start_tracking(self, filter, event)
1155
1156
  self.SIG_START_TRACKING.emit(filter, event)
1156
1157
 
1157
- def stop_notmoving(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
1158
+ def stop_notmoving(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
1158
1159
  """Stops tracking when the drag event is not moving.
1159
1160
 
1160
1161
  Args:
@@ -1163,7 +1164,7 @@ class QtDragHandler(DragHandler):
1163
1164
  """
1164
1165
  self.SIG_STOP_NOT_MOVING.emit(filter, event)
1165
1166
 
1166
- def stop_moving(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
1167
+ def stop_moving(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
1167
1168
  """
1168
1169
  Stops the movement of the drag event.
1169
1170
 
@@ -1173,7 +1174,7 @@ class QtDragHandler(DragHandler):
1173
1174
  """
1174
1175
  self.SIG_STOP_MOVING.emit(filter, event)
1175
1176
 
1176
- def move(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
1177
+ def move(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
1177
1178
  """Handles the move event.
1178
1179
 
1179
1180
  Args:
@@ -1655,7 +1656,7 @@ class RectangularSelectionHandler(DragHandler):
1655
1656
  self.setup_shape_cb = setup_shape_cb
1656
1657
  self.avoid_null_shape = avoid_null_shape
1657
1658
 
1658
- def start_tracking(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
1659
+ def start_tracking(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
1659
1660
  """Start tracking the mouse movement for selection and interaction.
1660
1661
 
1661
1662
  Args:
@@ -1664,7 +1665,7 @@ class RectangularSelectionHandler(DragHandler):
1664
1665
  """
1665
1666
  self.start = self.last = QC.QPointF(event.pos())
1666
1667
 
1667
- def start_moving(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
1668
+ def start_moving(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
1668
1669
  """Start moving the object.
1669
1670
 
1670
1671
  Args:
@@ -1676,7 +1677,7 @@ class RectangularSelectionHandler(DragHandler):
1676
1677
  if self.avoid_null_shape:
1677
1678
  self.start -= QC.QPointF(1, 1)
1678
1679
  self.shape.move_local_point_to(self.shape_h0, self.start)
1679
- self.shape.move_local_point_to(self.shape_h1, event.pos())
1680
+ self.shape.move_local_point_to(self.shape_h1, QC.QPointF(event.pos()))
1680
1681
  self.start_moving_action(filter, event)
1681
1682
  if self.setup_shape_cb is not None:
1682
1683
  self.setup_shape_cb(self.shape)
@@ -1684,7 +1685,7 @@ class RectangularSelectionHandler(DragHandler):
1684
1685
  filter.plot.replot()
1685
1686
 
1686
1687
  def start_moving_action(
1687
- self, filter: StatefulEventFilter, event: QC.QEvent
1688
+ self, filter: StatefulEventFilter, event: QMouseEvent
1688
1689
  ) -> None:
1689
1690
  """Start moving the object.
1690
1691
 
@@ -1694,18 +1695,18 @@ class RectangularSelectionHandler(DragHandler):
1694
1695
  """
1695
1696
  pass
1696
1697
 
1697
- def move(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
1698
+ def move(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
1698
1699
  """Move the object.
1699
1700
 
1700
1701
  Args:
1701
1702
  filter: The StatefulEventFilter instance.
1702
1703
  event: The mouse event.
1703
1704
  """
1704
- self.shape.move_local_point_to(self.shape_h1, event.pos())
1705
+ self.shape.move_local_point_to(self.shape_h1, QC.QPointF(event.pos()))
1705
1706
  self.move_action(filter, event)
1706
1707
  filter.plot.replot()
1707
1708
 
1708
- def move_action(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
1709
+ def move_action(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
1709
1710
  """Move the object.
1710
1711
 
1711
1712
  Args:
@@ -1714,7 +1715,7 @@ class RectangularSelectionHandler(DragHandler):
1714
1715
  """
1715
1716
  pass
1716
1717
 
1717
- def stop_moving(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
1718
+ def stop_moving(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
1718
1719
  """Stop moving the object.
1719
1720
 
1720
1721
  Args:
@@ -1725,20 +1726,22 @@ class RectangularSelectionHandler(DragHandler):
1725
1726
  self.stop_moving_action(filter, event)
1726
1727
  filter.plot.replot()
1727
1728
 
1728
- def stop_moving_action(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
1729
+ def stop_moving_action(
1730
+ self, filter: StatefulEventFilter, event: QMouseEvent
1731
+ ) -> None:
1729
1732
  """Stop moving the object.
1730
1733
 
1731
1734
  Args:
1732
1735
  filter: The StatefulEventFilter instance.
1733
1736
  event: The mouse event.
1734
1737
  """
1735
- self.SIG_END_RECT.emit(filter, self.start, event.pos())
1738
+ self.SIG_END_RECT.emit(filter, self.start, QC.QPointF(event.pos()))
1736
1739
 
1737
1740
 
1738
1741
  class PointSelectionHandler(RectangularSelectionHandler):
1739
1742
  """Class to handle point selections."""
1740
1743
 
1741
- def stop_notmoving(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
1744
+ def stop_notmoving(self, filter: StatefulEventFilter, event: QMouseEvent) -> None:
1742
1745
  """Stop the point selection when the point is not moving.
1743
1746
 
1744
1747
  Args:
@@ -1751,14 +1754,16 @@ class PointSelectionHandler(RectangularSelectionHandler):
1751
1754
  class ZoomRectHandler(RectangularSelectionHandler):
1752
1755
  """Class to handle zoom rectangles."""
1753
1756
 
1754
- def stop_moving_action(self, filter: StatefulEventFilter, event: QC.QEvent) -> None:
1757
+ def stop_moving_action(
1758
+ self, filter: StatefulEventFilter, event: QMouseEvent
1759
+ ) -> None:
1755
1760
  """Stop moving the object.
1756
1761
 
1757
1762
  Args:
1758
1763
  filter: The StatefulEventFilter instance.
1759
1764
  event: The mouse event.
1760
1765
  """
1761
- filter.plot.do_zoom_rect_view(self.start, event.pos())
1766
+ filter.plot.do_zoom_rect_view(self.start, QC.QPointF(event.pos()))
1762
1767
 
1763
1768
 
1764
1769
  def setup_standard_tool_filter(filter: StatefulEventFilter, start_state: int) -> int:
@@ -27,20 +27,29 @@ class _GenericRangeSlider(_GenericSlider):
27
27
  integers.
28
28
  """
29
29
 
30
- # Emitted when the slider value has changed, with the new slider values
31
- _valuesChanged = Signal(tuple)
32
-
33
- # Emitted when sliderDown is true and the slider moves
34
- # This usually happens when the user is dragging the slider
35
- # The value is the positions of *all* handles.
36
- _slidersMoved = Signal(tuple)
30
+ # -- BEGIN -- Original implementation, causing segfault on Linux with PySide6
31
+ # https://github.com/PlotPyStack/PlotPy/issues/21
32
+ # _valuesChanged = Signal(tuple)
33
+ # _slidersMoved = Signal(tuple)
34
+ # -- END --
35
+
36
+ # -- BEGIN -- New implementation: avoid segfault by overriding the class attributes
37
+ # instead of overriding them through instance attributes in `__init__`
38
+ valueChanged = Signal(tuple)
39
+ sliderMoved = Signal(tuple)
40
+ # -- END --
37
41
 
38
42
  def __init__(self, *args, **kwargs):
39
43
  self._style = RangeSliderStyle()
40
44
 
41
45
  super().__init__(*args, **kwargs)
42
- self.valueChanged = self._valuesChanged
43
- self.sliderMoved = self._slidersMoved
46
+
47
+ # -- BEGIN -- Original implementation, causing segfault on Linux with PySide6
48
+ # https://github.com/PlotPyStack/PlotPy/issues/21
49
+ # self.valueChanged = self._valuesChanged
50
+ # self.sliderMoved = self._slidersMoved
51
+ # -- END --
52
+
44
53
  # list of values
45
54
  self._value: List[_T] = [20, 80]
46
55
 
@@ -19,6 +19,7 @@ So that's what `_GenericSlider` is below.
19
19
  scalar (with one handle per item), and it forms the basis of
20
20
  QRangeSlider.
21
21
  """
22
+
22
23
  import os
23
24
  import platform
24
25
  from typing import TypeVar
@@ -59,9 +60,19 @@ USE_MAC_SLIDER_PATCH = (
59
60
 
60
61
 
61
62
  class _GenericSlider(QSlider):
62
- _fvalueChanged = Signal(int)
63
- _fsliderMoved = Signal(int)
64
- _frangeChanged = Signal(int, int)
63
+ # -- BEGIN -- Original implementation, causing segfault on Linux with PySide6
64
+ # https://github.com/PlotPyStack/PlotPy/issues/21
65
+ # _fvalueChanged = Signal(int)
66
+ # _fsliderMoved = Signal(int)
67
+ # _frangeChanged = Signal(int, int)
68
+ # -- END --
69
+
70
+ # -- BEGIN -- New implementation: avoid segfault by overriding the class attributes
71
+ # instead of overriding them through instance attributes in `__init__`
72
+ valueChanged = Signal(int)
73
+ sliderMoved = Signal(int)
74
+ rangeChanged = Signal(int, int)
75
+ # -- END --
65
76
 
66
77
  MAX_DISPLAY = 5000
67
78
 
@@ -88,9 +99,13 @@ class _GenericSlider(QSlider):
88
99
  self._control_fraction = 0.04
89
100
 
90
101
  super().__init__(*args, **kwargs)
91
- self.valueChanged = self._fvalueChanged
92
- self.sliderMoved = self._fsliderMoved
93
- self.rangeChanged = self._frangeChanged
102
+
103
+ # -- BEGIN -- Original implementation, causing segfault on Linux with PySide6
104
+ # https://github.com/PlotPyStack/PlotPy/issues/21
105
+ # self.valueChanged = self._fvalueChanged
106
+ # self.sliderMoved = self._fsliderMoved
107
+ # self.rangeChanged = self._frangeChanged
108
+ # -- END --
94
109
 
95
110
  self.setAttribute(Qt.WidgetAttribute.WA_Hover)
96
111
  self.setStyleSheet("")
@@ -398,7 +398,8 @@ class BaseImageItem(QwtPlotItem):
398
398
  """
399
399
  title = self.title().text()
400
400
  z = self.get_data(x, y)
401
- return f"{title}:<br>x = {int(x):d}<br>y = {int(y):d}<br>z = {z:g}"
401
+ zstr = "--" if z is np.ma.masked else f"{z:g}"
402
+ return f"{title}:<br>x = {int(x):d}<br>y = {int(y):d}<br>z = {zstr}"
402
403
 
403
404
  def set_background_color(self, qcolor: QColor | str) -> None:
404
405
  """Set background color
@@ -276,8 +276,10 @@ class PolygonShape(AbstractShape):
276
276
  painter.setBrush(brush)
277
277
  points = self.transform_points(xMap, yMap)
278
278
  if self.ADDITIONNAL_POINTS:
279
- shape_points = points[: -self.ADDITIONNAL_POINTS]
280
- other_points = points[-self.ADDITIONNAL_POINTS :]
279
+ # Slice indexing is not supported by PySide6, so we convert the `QPolygonF`
280
+ # object to a list before converting it back to a `QPolygonF` object:
281
+ shape_points = QG.QPolygonF(list(points)[: -self.ADDITIONNAL_POINTS])
282
+ other_points = QG.QPolygonF(list(points)[-self.ADDITIONNAL_POINTS :])
281
283
  else:
282
284
  shape_points = points
283
285
  other_points = []
@@ -22,7 +22,9 @@ if TYPE_CHECKING:
22
22
  import qwt.scale_map
23
23
  from qtpy.QtCore import QPointF, QRectF
24
24
  from qtpy.QtGui import QPainter
25
+ from qwt import QwtSymbol
25
26
 
27
+ from plotpy.plot import BasePlot
26
28
  from plotpy.styles.base import ItemParameters
27
29
 
28
30
 
@@ -48,7 +50,7 @@ class XRangeSelection(AbstractShape):
48
50
  self.shapeparam = RangeShapeParam(_("Range"), icon="xrange.png")
49
51
  self.shapeparam.read_config(CONF, "histogram", "range")
50
52
  else:
51
- self.shapeparam = shapeparam
53
+ self.shapeparam: RangeShapeParam = shapeparam
52
54
  self.pen = None
53
55
  self.sel_pen = None
54
56
  self.brush = None
@@ -78,7 +80,7 @@ class XRangeSelection(AbstractShape):
78
80
  def __setstate__(self, state: tuple) -> None:
79
81
  """Restore state information from pickling"""
80
82
  self.shapeparam, self._min, self._max = state
81
- self.shapeparam.update_range(self)
83
+ self.shapeparam.update_item(self)
82
84
 
83
85
  def serialize(
84
86
  self,
@@ -137,34 +139,31 @@ class XRangeSelection(AbstractShape):
137
139
  yMap: Y axis scale map
138
140
  canvasRect: Canvas rectangle
139
141
  """
140
- plot = self.plot()
142
+ plot: BasePlot = self.plot()
141
143
  if not plot:
142
144
  return
143
145
  if self.selected:
144
- pen = self.sel_pen
145
- sym = self.sel_symbol
146
+ pen: QG.QPen = self.sel_pen
147
+ sym: QwtSymbol = self.sel_symbol
146
148
  else:
147
- pen = self.pen
148
- sym = self.symbol
149
+ pen: QG.QPen = self.pen
150
+ sym: QwtSymbol = self.symbol
149
151
 
150
- rct = plot.canvas().contentsRect()
151
- rct2 = QC.QRectF(rct)
152
- rct2.setLeft(xMap.transform(self._min))
153
- rct2.setRight(xMap.transform(self._max))
152
+ rct = QC.QRectF(plot.canvas().contentsRect())
153
+ rct.setLeft(xMap.transform(self._min))
154
+ rct.setRight(xMap.transform(self._max))
154
155
 
155
- painter.fillRect(rct2, self.brush)
156
+ painter.fillRect(rct, self.brush)
156
157
  painter.setPen(pen)
157
- painter.drawLine(rct2.topLeft(), rct2.bottomLeft())
158
- painter.drawLine(rct2.topRight(), rct2.bottomRight())
158
+ painter.drawLine(rct.topLeft(), rct.bottomLeft())
159
+ painter.drawLine(rct.topRight(), rct.bottomRight())
160
+
159
161
  dash = QG.QPen(pen)
160
162
  dash.setStyle(QC.Qt.DashLine)
161
163
  dash.setWidth(1)
162
164
  painter.setPen(dash)
163
-
164
- center_x = int(rct2.center().x())
165
- top = int(rct2.top())
166
- bottom = int(rct2.bottom())
167
- painter.drawLine(center_x, top, center_x, bottom)
165
+ cx = rct.center().x()
166
+ painter.drawLine(QC.QPointF(cx, rct.top()), QC.QPointF(cx, rct.bottom()))
168
167
 
169
168
  painter.setPen(pen)
170
169
  x0, x1, y = self.get_handles_pos()
@@ -350,12 +350,12 @@ class ImageParam(RawImageParam):
350
350
  help=_("Locked images are not movable with the mouse"),
351
351
  )
352
352
  _xdata = BeginGroup(_("Image placement along X-axis"))
353
- xmin = FloatItem(_("x|min"), default=None)
354
- xmax = FloatItem(_("x|max"), default=None)
353
+ xmin = FloatItem(_("x|min"), default=None, check=False)
354
+ xmax = FloatItem(_("x|max"), default=None, check=False)
355
355
  _end_xdata = EndGroup(_("Image placement along X-axis"))
356
356
  _ydata = BeginGroup(_("Image placement along Y-axis"))
357
- ymin = FloatItem(_("y|min"), default=None)
358
- ymax = FloatItem(_("y|max"), default=None)
357
+ ymin = FloatItem(_("y|min"), default=None, check=False)
358
+ ymax = FloatItem(_("y|max"), default=None, check=False)
359
359
  _end_ydata = EndGroup(_("Image placement along Y-axis"))
360
360
 
361
361
  def update_param(self, item: ImageItem) -> None:
@@ -366,21 +366,9 @@ class ImageParam(RawImageParam):
366
366
  """
367
367
  super().update_param(item)
368
368
  self.xmin = item.xmin
369
- if self.xmin is None:
370
- self.xmin = 0.0
371
369
  self.ymin = item.ymin
372
- if self.ymin is None:
373
- self.ymin = 0.0
374
- if item.is_empty():
375
- shape = (0, 0)
376
- else:
377
- shape = item.data.shape
378
370
  self.xmax = item.xmax
379
- if self.xmax is None:
380
- self.xmax = float(shape[1])
381
371
  self.ymax = item.ymax
382
- if self.ymax is None:
383
- self.ymax = float(shape[0])
384
372
 
385
373
  def update_item(self, item: ImageItem) -> None:
386
374
  """Update the given image item from the parameters.
@@ -23,6 +23,7 @@ import numpy as np
23
23
  import pytest
24
24
  from guidata.qthelpers import exec_dialog, qt_app_context
25
25
  from qtpy import QtCore as QC
26
+ from qtpy import QtGui as QG
26
27
  from qtpy import QtWidgets as QW
27
28
 
28
29
  from plotpy.builder import make
@@ -31,31 +32,33 @@ from plotpy.tests import data as ptd
31
32
  from plotpy.tools import LockLUTRangeTool
32
33
 
33
34
 
34
- def get_data() -> np.ndarray:
35
+ def get_data(variable_size: bool) -> np.ndarray:
35
36
  """Compute 2D Gaussian data and add a narrower Gaussian on top with a random
36
37
  position and amplitude."""
38
+ size = np.random.randint(50, 200) if variable_size else 100
37
39
  dtype = np.uint16
38
40
  amp = np.iinfo(dtype).max * 0.3
39
- data = ptd.gen_2d_gaussian(100, dtype, sigma=10.0, x0=0.0, y0=0.0, amp=amp)
41
+ data = ptd.gen_2d_gaussian(size, dtype, sigma=10.0, x0=0.0, y0=0.0, amp=amp)
40
42
  # Choose a random position: x0, y0 have to be in the range [-10.0, 10.0]
41
43
  x0 = np.random.uniform(-10.0, 10.0)
42
44
  y0 = np.random.uniform(-10.0, 10.0)
43
45
  # Choose a random amplitude: a has to be in the range [0.1, 0.5]
44
46
  a = np.random.uniform(0.1, 0.7) * np.iinfo(dtype).max
45
47
  # Add the narrower Gaussian on top
46
- data += ptd.gen_2d_gaussian(100, dtype, sigma=4.0, x0=x0, y0=y0, amp=a)
48
+ data += ptd.gen_2d_gaussian(size, dtype, sigma=4.0, x0=x0, y0=y0, amp=a)
47
49
  return data
48
50
 
49
51
 
50
52
  class ImageUpdateDialog(PlotDialog):
51
53
  """Dialog box for image update"""
52
54
 
53
- def __init__(self, title):
55
+ def __init__(self, title: str, variable_size: bool = False) -> None:
56
+ self.variable_size = variable_size
54
57
  options = PlotOptions(title="-", show_contrast=True, type="image")
55
58
  super().__init__(title=title, toolbar=True, edit=False, options=options)
56
59
  self.resize(600, 600)
57
60
  self.timer = QC.QTimer()
58
- self.item = make.image(get_data(), interpolation="nearest")
61
+ self.item = make.image(get_data(self.variable_size), interpolation="nearest")
59
62
  self.item.set_lut_range((15000, 28000))
60
63
  plot = self.get_plot()
61
64
  plot.add_item(self.item)
@@ -63,7 +66,7 @@ class ImageUpdateDialog(PlotDialog):
63
66
  self.counter = 0
64
67
  self.keep_lut_cb: QW.QCheckBox | None = None
65
68
 
66
- def populate_plot_layout(self):
69
+ def populate_plot_layout(self) -> None:
67
70
  """Populate the plot layout"""
68
71
  start_btn = QW.QPushButton("Start image update")
69
72
  start_btn.clicked.connect(self.start_image_update)
@@ -74,9 +77,17 @@ class ImageUpdateDialog(PlotDialog):
74
77
  self.keep_lut_cb = QW.QCheckBox()
75
78
  self.keep_lut_cb.setChecked(False)
76
79
  self.add_widget(self.keep_lut_cb, 0, 2)
80
+ variable_size_cb = QW.QCheckBox("Variable size")
81
+ variable_size_cb.setChecked(self.variable_size)
82
+ variable_size_cb.stateChanged.connect(self.toggle_variable_size)
83
+ self.add_widget(variable_size_cb, 0, 3)
77
84
  self.add_widget(self.plot_widget, 1, 0, 1, 0)
78
85
 
79
- def register_tools(self):
86
+ def toggle_variable_size(self, state: int) -> None:
87
+ """Toggle the variable size of the image"""
88
+ self.variable_size = state == QC.Qt.Checked
89
+
90
+ def register_tools(self) -> None:
80
91
  """Reimplement to connect the Keep LUT range checkbox to the item"""
81
92
  mgr = self.get_manager()
82
93
  keep_lut_tool = mgr.add_tool(LockLUTRangeTool)
@@ -87,18 +98,18 @@ class ImageUpdateDialog(PlotDialog):
87
98
  self.keep_lut_cb.setToolTip(keep_lut_tool.action.toolTip())
88
99
  self.keep_lut_cb.stateChanged.connect(keep_lut_tool.activate)
89
100
 
90
- def start_image_update(self):
101
+ def start_image_update(self) -> None:
91
102
  """Start updating the image"""
92
103
  self.timer.timeout.connect(self.update_image)
93
104
  self.timer.start(500)
94
105
 
95
- def stop_image_update(self):
106
+ def stop_image_update(self) -> None:
96
107
  """Stop updating the image"""
97
108
  self.timer.stop()
98
109
 
99
- def update_image(self):
110
+ def update_image(self) -> None:
100
111
  """Update the image"""
101
- data = get_data()
112
+ data = get_data(self.variable_size)
102
113
  self.counter += 1
103
114
  plot = self.get_plot()
104
115
 
@@ -111,7 +122,7 @@ class ImageUpdateDialog(PlotDialog):
111
122
  plot.set_title(f"Image update {self.counter:03d}")
112
123
  plot.replot()
113
124
 
114
- def closeEvent(self, event):
125
+ def closeEvent(self, event: QG.QCloseEvent) -> None:
115
126
  """Reimplement closeEvent to stop the timer before closing the dialog"""
116
127
  self.timer.stop()
117
128
  super().closeEvent(event)